1
0
Fork 0
libreoffice/sc/source/ui/drawfunc/drawsh5.cxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

739 lines
29 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include <editeng/eeitem.hxx>
#include <sfx2/viewfrm.hxx>
#include <sfx2/request.hxx>
#include <sfx2/bindings.hxx>
#include <tools/urlobj.hxx>
#include <cliputil.hxx>
#include <svx/svxdlg.hxx>
#include <svx/hlnkitem.hxx>
#include <svx/svdoole2.hxx>
#include <svx/svdouno.hxx>
#include <svx/extrusionbar.hxx>
#include <svx/fontworkbar.hxx>
#include <svx/svdogrp.hxx>
#include <sfx2/docfile.hxx>
#include <osl/diagnose.h>
#include <svx/diagram/IDiagramHelper.hxx>
#include <com/sun/star/form/FormButtonType.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/beans/XPropertySetInfo.hpp>
#include <drawsh.hxx>
#include <drawview.hxx>
#include <viewdata.hxx>
#include <tabvwsh.hxx>
#include <docsh.hxx>
#include <undotab.hxx>
#include <drwlayer.hxx>
#include <drtxtob.hxx>
#include <memory>
#include <sc.hrc>
using namespace com::sun::star;
void ScDrawShell::GetHLinkState( SfxItemSet& rSet ) // Hyperlink
{
ScDrawView* pView = rViewData.GetScDrawView();
const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
// Hyperlink
SvxHyperlinkItem aHLinkItem;
if ( rMarkList.GetMarkCount() == 1 ) // URL-Button marked ?
{
SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
if ( pObj && !pObj->getHyperlink().isEmpty() )
{
aHLinkItem.SetURL( pObj->getHyperlink() );
aHLinkItem.SetInsertMode(HLINK_FIELD);
}
SdrUnoObj* pUnoCtrl = dynamic_cast<SdrUnoObj*>( pObj );
if (pUnoCtrl && SdrInventor::FmForm == pUnoCtrl->GetObjInventor())
{
const uno::Reference<awt::XControlModel>& xControlModel = pUnoCtrl->GetUnoControlModel();
OSL_ENSURE( xControlModel.is(), "UNO-Control without model" );
if( !xControlModel.is() )
return;
uno::Reference< beans::XPropertySet > xPropSet( xControlModel, uno::UNO_QUERY );
uno::Reference< beans::XPropertySetInfo > xInfo = xPropSet->getPropertySetInfo();
OUString sPropButtonType( u"ButtonType"_ustr );
if(xInfo->hasPropertyByName( sPropButtonType ))
{
uno::Any aAny = xPropSet->getPropertyValue( sPropButtonType );
form::FormButtonType eTmp;
if ( (aAny >>= eTmp) && eTmp == form::FormButtonType_URL )
{
OUString sTmp;
// Label
OUString sPropLabel( u"Label"_ustr );
if(xInfo->hasPropertyByName( sPropLabel ))
{
aAny = xPropSet->getPropertyValue( sPropLabel );
if ( (aAny >>= sTmp) && !sTmp.isEmpty() )
{
aHLinkItem.SetName(sTmp);
}
}
// URL
OUString sPropTargetURL( u"TargetURL"_ustr );
if(xInfo->hasPropertyByName( sPropTargetURL ))
{
aAny = xPropSet->getPropertyValue( sPropTargetURL );
if ( (aAny >>= sTmp) && !sTmp.isEmpty() )
{
aHLinkItem.SetURL(sTmp);
}
}
// Target
OUString sPropTargetFrame( u"TargetFrame"_ustr );
if(xInfo->hasPropertyByName( sPropTargetFrame ))
{
aAny = xPropSet->getPropertyValue( sPropTargetFrame );
if ( (aAny >>= sTmp) && !sTmp.isEmpty() )
{
aHLinkItem.SetTargetFrame(sTmp);
}
}
aHLinkItem.SetInsertMode(HLINK_BUTTON);
}
}
}
}
rSet.Put(aHLinkItem);
}
void ScDrawShell::ExecuteHLink( const SfxRequest& rReq )
{
const SfxItemSet* pReqArgs = rReq.GetArgs();
sal_uInt16 nSlot = rReq.GetSlot();
switch ( nSlot )
{
case SID_HYPERLINK_SETLINK:
if( pReqArgs )
{
const SfxPoolItem* pItem;
if ( pReqArgs->GetItemState( SID_HYPERLINK_SETLINK, true, &pItem ) == SfxItemState::SET )
{
const SvxHyperlinkItem* pHyper = static_cast<const SvxHyperlinkItem*>(pItem);
const OUString& rName = pHyper->GetName();
const OUString& rURL = pHyper->GetURL();
const OUString& rTarget = pHyper->GetTargetFrame();
SvxLinkInsertMode eMode = pHyper->GetInsertMode();
bool bDone = false;
if ( eMode == HLINK_FIELD || eMode == HLINK_BUTTON )
{
ScDrawView* pView = rViewData.GetScDrawView();
const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
if ( rMarkList.GetMarkCount() == 1 )
{
SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
SdrUnoObj* pUnoCtrl = dynamic_cast<SdrUnoObj*>( pObj );
if (pUnoCtrl && SdrInventor::FmForm == pUnoCtrl->GetObjInventor())
{
const uno::Reference<awt::XControlModel>& xControlModel =
pUnoCtrl->GetUnoControlModel();
OSL_ENSURE( xControlModel.is(), "UNO-Control without model" );
if( !xControlModel.is() )
return;
uno::Reference< beans::XPropertySet > xPropSet( xControlModel, uno::UNO_QUERY );
uno::Reference< beans::XPropertySetInfo > xInfo = xPropSet->getPropertySetInfo();
OUString sPropTargetURL( u"TargetURL"_ustr );
// Is it possible to set a URL in the object?
if (xInfo->hasPropertyByName( sPropTargetURL ))
{
OUString sPropButtonType( u"ButtonType"_ustr);
OUString sPropTargetFrame( u"TargetFrame"_ustr );
OUString sPropLabel( u"Label"_ustr );
if ( xInfo->hasPropertyByName( sPropLabel ) )
{
xPropSet->setPropertyValue( sPropLabel, uno::Any(rName) );
}
OUString aTmp = INetURLObject::GetAbsURL( rViewData.GetDocShell()->GetMedium()->GetBaseURL(), rURL );
xPropSet->setPropertyValue( sPropTargetURL, uno::Any(aTmp) );
if( !rTarget.isEmpty() && xInfo->hasPropertyByName( sPropTargetFrame ) )
{
xPropSet->setPropertyValue( sPropTargetFrame, uno::Any(rTarget) );
}
if ( xInfo->hasPropertyByName( sPropButtonType ) )
{
xPropSet->setPropertyValue( sPropButtonType, uno::Any(form::FormButtonType_URL) );
}
//! Undo ???
rViewData.GetDocShell()->SetDocumentModified();
bDone = true;
}
}
else
{
pObj->setHyperlink(rURL);
setModified();
bDone = true;
}
}
}
if (!bDone)
rViewData.GetViewShell()->
InsertURL( rName, rURL, rTarget, static_cast<sal_uInt16>(eMode) );
// If "text" is received by InsertURL of ViewShell, then the DrawShell is turned off !!!
}
}
break;
default:
OSL_FAIL("wrong slot");
}
}
// Functions on Drawing-Objects
void ScDrawShell::ExecDrawFunc( SfxRequest& rReq )
{
SfxBindings& rBindings = rViewData.GetBindings();
ScTabView* pTabView = rViewData.GetView();
ScDrawView* pView = pTabView->GetScDrawView();
sal_uInt16 nSlotId = rReq.GetSlot();
switch (nSlotId)
{
case SID_OBJECT_HEAVEN:
pView->SetMarkedToLayer( SC_LAYER_FRONT );
rBindings.Invalidate(SID_OBJECT_HEAVEN);
rBindings.Invalidate(SID_OBJECT_HELL);
break;
case SID_OBJECT_HELL:
pView->SetMarkedToLayer( SC_LAYER_BACK );
rBindings.Invalidate(SID_OBJECT_HEAVEN);
rBindings.Invalidate(SID_OBJECT_HELL);
// leave draw shell if nothing selected (layer may be locked)
rViewData.GetViewShell()->UpdateDrawShell();
break;
case SID_FRAME_TO_TOP:
pView->PutMarkedToTop();
break;
case SID_FRAME_TO_BOTTOM:
pView->PutMarkedToBtm();
break;
case SID_FRAME_UP:
pView->MovMarkedToTop();
break;
case SID_FRAME_DOWN:
pView->MovMarkedToBtm();
break;
case SID_GROUP:
pView->GroupMarked();
break;
case SID_UNGROUP:
pView->UnGroupMarked();
break;
case SID_ENTER_GROUP:
pView->EnterMarkedGroup();
break;
case SID_LEAVE_GROUP:
pView->LeaveOneGroup();
break;
case SID_REGENERATE_DIAGRAM:
case SID_EDIT_DIAGRAM:
{
const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
if (1 == rMarkList.GetMarkCount())
{
SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
// Support advanced DiagramHelper
if(nullptr != pObj && pObj->isDiagram())
{
if(SID_REGENERATE_DIAGRAM == nSlotId)
{
pView->UnmarkAll();
pObj->getDiagramHelper()->reLayout(*static_cast<SdrObjGroup*>(pObj));
pView->MarkObj(pObj, pView->GetSdrPageView());
}
else // SID_EDIT_DIAGRAM
{
VclAbstractDialogFactory* pFact = VclAbstractDialogFactory::Create();
vcl::Window* pWin = rViewData.GetActiveWin();
VclPtr<VclAbstractDialog> pDlg = pFact->CreateDiagramDialog(
pWin ? pWin->GetFrameWeld() : nullptr,
*static_cast<SdrObjGroup*>(pObj));
pDlg->StartExecuteAsync(
[pDlg] (sal_Int32 /*nResult*/)->void
{
pDlg->disposeOnce();
}
);
}
}
}
rReq.Done();
}
break;
case SID_MIRROR_HORIZONTAL:
case SID_FLIP_HORIZONTAL:
pView->MirrorAllMarkedHorizontal();
rBindings.Invalidate( SID_ATTR_TRANSFORM_ANGLE );
break;
case SID_MIRROR_VERTICAL:
case SID_FLIP_VERTICAL:
pView->MirrorAllMarkedVertical();
rBindings.Invalidate( SID_ATTR_TRANSFORM_ANGLE );
break;
case SID_OBJECT_ALIGN_LEFT:
case SID_ALIGN_ANY_LEFT:
if (pView->IsAlignPossible())
pView->AlignMarkedObjects(SdrHorAlign::Left, SdrVertAlign::NONE);
break;
case SID_OBJECT_ALIGN_CENTER:
case SID_ALIGN_ANY_HCENTER:
if (pView->IsAlignPossible())
pView->AlignMarkedObjects(SdrHorAlign::Center, SdrVertAlign::NONE);
break;
case SID_OBJECT_ALIGN_RIGHT:
case SID_ALIGN_ANY_RIGHT:
if (pView->IsAlignPossible())
pView->AlignMarkedObjects(SdrHorAlign::Right, SdrVertAlign::NONE);
break;
case SID_OBJECT_ALIGN_UP:
case SID_ALIGN_ANY_TOP:
if (pView->IsAlignPossible())
pView->AlignMarkedObjects(SdrHorAlign::NONE, SdrVertAlign::Top);
break;
case SID_OBJECT_ALIGN_MIDDLE:
case SID_ALIGN_ANY_VCENTER:
if (pView->IsAlignPossible())
pView->AlignMarkedObjects(SdrHorAlign::NONE, SdrVertAlign::Center);
break;
case SID_OBJECT_ALIGN_DOWN:
case SID_ALIGN_ANY_BOTTOM:
if (pView->IsAlignPossible())
pView->AlignMarkedObjects(SdrHorAlign::NONE, SdrVertAlign::Bottom);
break;
case SID_DELETE:
case SID_DELETE_CONTENTS:
pView->DeleteMarked();
rViewData.GetViewShell()->UpdateDrawShell();
break;
case SID_CUT:
pView->DoCut();
rViewData.GetViewShell()->UpdateDrawShell();
break;
case SID_COPY:
pView->DoCopy();
break;
case SID_PASTE:
ScClipUtil::PasteFromClipboard(GetViewData(), GetViewData().GetViewShell(), true);
break;
case SID_SELECTALL:
pView->MarkAll();
break;
case SID_ANCHOR_PAGE:
pView->SetPageAnchored();
rBindings.Invalidate( SID_ANCHOR_PAGE );
rBindings.Invalidate( SID_ANCHOR_CELL );
rBindings.Invalidate( SID_ANCHOR_CELL_RESIZE );
break;
case SID_ANCHOR_CELL:
pView->SetCellAnchored(false);
rBindings.Invalidate( SID_ANCHOR_PAGE );
rBindings.Invalidate( SID_ANCHOR_CELL );
rBindings.Invalidate( SID_ANCHOR_CELL_RESIZE );
break;
case SID_ANCHOR_CELL_RESIZE:
pView->SetCellAnchored(true);
rBindings.Invalidate( SID_ANCHOR_PAGE );
rBindings.Invalidate( SID_ANCHOR_CELL );
rBindings.Invalidate( SID_ANCHOR_CELL_RESIZE );
break;
case SID_ANCHOR_TOGGLE:
{
switch( pView->GetAnchorType() )
{
case SCA_CELL:
case SCA_CELL_RESIZE:
pView->SetPageAnchored();
break;
default:
pView->SetCellAnchored(false);
break;
}
}
rBindings.Invalidate( SID_ANCHOR_PAGE );
rBindings.Invalidate( SID_ANCHOR_CELL );
rBindings.Invalidate( SID_ANCHOR_CELL_RESIZE );
break;
case SID_OBJECT_ROTATE:
{
SdrDragMode eMode;
if (pView->GetDragMode() == SdrDragMode::Rotate)
eMode = SdrDragMode::Move;
else
eMode = SdrDragMode::Rotate;
pView->SetDragMode( eMode );
rBindings.Invalidate( SID_OBJECT_ROTATE );
rBindings.Invalidate( SID_OBJECT_MIRROR );
if (eMode == SdrDragMode::Rotate && !pView->IsFrameDragSingles())
{
pView->SetFrameDragSingles();
rBindings.Invalidate( SID_BEZIER_EDIT );
}
}
break;
case SID_OBJECT_MIRROR:
{
SdrDragMode eMode;
if (pView->GetDragMode() == SdrDragMode::Mirror)
eMode = SdrDragMode::Move;
else
eMode = SdrDragMode::Mirror;
pView->SetDragMode( eMode );
rBindings.Invalidate( SID_OBJECT_ROTATE );
rBindings.Invalidate( SID_OBJECT_MIRROR );
if (eMode == SdrDragMode::Mirror && !pView->IsFrameDragSingles())
{
pView->SetFrameDragSingles();
rBindings.Invalidate( SID_BEZIER_EDIT );
}
}
break;
case SID_BEZIER_EDIT:
{
bool bOld = pView->IsFrameDragSingles();
pView->SetFrameDragSingles( !bOld );
rBindings.Invalidate( SID_BEZIER_EDIT );
if (bOld && pView->GetDragMode() != SdrDragMode::Move)
{
pView->SetDragMode( SdrDragMode::Move );
rBindings.Invalidate( SID_OBJECT_ROTATE );
rBindings.Invalidate( SID_OBJECT_MIRROR );
}
}
break;
case SID_FONTWORK:
{
sal_uInt16 nId = ScGetFontWorkId();
SfxViewFrame& rViewFrm = rViewData.GetViewShell()->GetViewFrame();
if ( rReq.GetArgs() )
rViewFrm.SetChildWindow( nId,
static_cast<const SfxBoolItem&>(
(rReq.GetArgs()->Get(SID_FONTWORK))).
GetValue() );
else
rViewFrm.ToggleChildWindow( nId );
rBindings.Invalidate( SID_FONTWORK );
rReq.Done();
}
break;
case SID_ORIGINALSIZE:
pView->SetMarkedOriginalSize();
break;
case SID_FITCELLSIZE:
pView->FitToCellSize();
break;
case SID_ENABLE_HYPHENATION:
{
const SfxBoolItem* pItem = rReq.GetArg<SfxBoolItem>(SID_ENABLE_HYPHENATION);
if( pItem )
{
SfxItemSetFixed<EE_PARA_HYPHENATE, EE_PARA_HYPHENATE> aSet( GetPool() );
bool bValue = pItem->GetValue();
aSet.Put( SfxBoolItem( EE_PARA_HYPHENATE, bValue ) );
pView->SetAttributes( aSet );
}
rReq.Done();
}
break;
case SID_RENAME_OBJECT:
{
const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
if(1 == rMarkList.GetMarkCount())
{
// #i68101#
SdrObject* pSelected = rMarkList.GetMark(0)->GetMarkedSdrObj();
assert(pSelected && "ScDrawShell::ExecDrawFunc: nMarkCount, but no object (!)");
if(SC_LAYER_INTERN != pSelected->GetLayer())
{
OUString aOldName = pSelected->GetName();
SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
vcl::Window* pWin = rViewData.GetActiveWin();
VclPtr<AbstractSvxObjectNameDialog> pDlg(pFact->CreateSvxObjectNameDialog(pWin ? pWin->GetFrameWeld() : nullptr, aOldName));
pDlg->SetCheckNameHdl(LINK(this, ScDrawShell, NameObjectHdl));
pDlg->StartExecuteAsync(
[this, pDlg, pSelected] (sal_Int32 nResult)->void
{
if (nResult == RET_OK)
{
ScDocShell* pDocSh = rViewData.GetDocShell();
OUString aNewName = pDlg->GetName();
if (aNewName != pSelected->GetName())
{
// handle name change
const SdrObjKind nObjType(pSelected->GetObjIdentifier());
if (SdrObjKind::Graphic == nObjType && aNewName.isEmpty())
{
// graphics objects must have names
// (all graphics are supposed to be in the navigator)
ScDrawLayer* pModel = rViewData.GetDocument().GetDrawLayer();
if(pModel)
{
aNewName = pModel->GetNewGraphicName();
}
}
// An undo action for renaming is missing in svdraw (99363).
// For OLE objects (which can be identified using the persist name),
// ScUndoRenameObject can be used until there is a common action for all objects.
if(SdrObjKind::OLE2 == nObjType)
{
const OUString aPersistName = static_cast<SdrOle2Obj*>(pSelected)->GetPersistName();
if(!aPersistName.isEmpty())
{
pDocSh->GetUndoManager()->AddUndoAction(
std::make_unique<ScUndoRenameObject>(pDocSh, aPersistName, pSelected->GetName(), aNewName));
}
}
// set new name
pSelected->SetName(aNewName);
}
// ChartListenerCollectionNeedsUpdate is needed for Navigator update
pDocSh->GetDocument().SetChartListenerCollectionNeedsUpdate( true );
pDocSh->SetDrawModified();
}
pDlg->disposeOnce();
}
);
}
}
break;
}
// #i68101#
case SID_TITLE_DESCRIPTION_OBJECT:
{
const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
if(1 == rMarkList.GetMarkCount())
{
SdrObject* pSelected = rMarkList.GetMark(0)->GetMarkedSdrObj();
assert(pSelected && "ScDrawShell::ExecDrawFunc: nMarkCount, but no object (!)");
if(SC_LAYER_INTERN != pSelected->GetLayer())
{
OUString aTitle(pSelected->GetTitle());
OUString aDescription(pSelected->GetDescription());
bool isDecorative(pSelected->IsDecorative());
SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
vcl::Window* pWin = rViewData.GetActiveWin();
VclPtr<AbstractSvxObjectTitleDescDialog> pDlg(pFact->CreateSvxObjectTitleDescDialog(
pWin ? pWin->GetFrameWeld() : nullptr, aTitle, aDescription, isDecorative));
pDlg->StartExecuteAsync(
[this, pDlg, pSelected] (sal_Int32 nResult)->void
{
if (nResult == RET_OK)
{
ScDocShell* pDocSh = rViewData.GetDocShell();
// handle Title and Description
pSelected->SetTitle(pDlg->GetTitle());
pSelected->SetDescription(pDlg->GetDescription());
pSelected->SetDecorative(pDlg->IsDecorative());
// ChartListenerCollectionNeedsUpdate is needed for Navigator update
pDocSh->GetDocument().SetChartListenerCollectionNeedsUpdate( true );
pDocSh->SetDrawModified();
}
pDlg->disposeOnce();
}
);
}
}
break;
}
case SID_EXTRUSION_TOGGLE:
case SID_EXTRUSION_TILT_DOWN:
case SID_EXTRUSION_TILT_UP:
case SID_EXTRUSION_TILT_LEFT:
case SID_EXTRUSION_TILT_RIGHT:
case SID_EXTRUSION_3D_COLOR:
case SID_EXTRUSION_DEPTH:
case SID_EXTRUSION_DIRECTION:
case SID_EXTRUSION_PROJECTION:
case SID_EXTRUSION_LIGHTING_DIRECTION:
case SID_EXTRUSION_LIGHTING_INTENSITY:
case SID_EXTRUSION_SURFACE:
case SID_EXTRUSION_DEPTH_FLOATER:
case SID_EXTRUSION_DIRECTION_FLOATER:
case SID_EXTRUSION_LIGHTING_FLOATER:
case SID_EXTRUSION_SURFACE_FLOATER:
case SID_EXTRUSION_DEPTH_DIALOG:
svx::ExtrusionBar::execute( pView, rReq, rBindings );
rReq.Ignore ();
break;
case SID_FONTWORK_SHAPE:
case SID_FONTWORK_SHAPE_TYPE:
case SID_FONTWORK_ALIGNMENT:
case SID_FONTWORK_SAME_LETTER_HEIGHTS:
case SID_FONTWORK_CHARACTER_SPACING:
case SID_FONTWORK_KERN_CHARACTER_PAIRS:
case SID_FONTWORK_CHARACTER_SPACING_FLOATER:
case SID_FONTWORK_ALIGNMENT_FLOATER:
case SID_FONTWORK_CHARACTER_SPACING_DIALOG:
svx::FontworkBar::execute( *pView, rReq, rBindings );
rReq.Ignore ();
break;
default:
break;
}
}
IMPL_LINK( ScDrawShell, NameObjectHdl, AbstractSvxObjectNameDialog&, rDialog, bool )
{
OUString aName = rDialog.GetName();
ScDrawLayer* pModel = rViewData.GetDocument().GetDrawLayer();
if ( !aName.isEmpty() && pModel )
{
SCTAB nDummyTab;
if ( pModel->GetNamedObject( aName, SdrObjKind::NONE, nDummyTab ) )
{
// existing object found -> name invalid
return false;
}
}
return true; // name is valid
}
void ScDrawShell::ExecFormText(const SfxRequest& rReq)
{
ScDrawView* pDrView = rViewData.GetScDrawView();
const SdrMarkList& rMarkList = pDrView->GetMarkedObjectList();
if ( rMarkList.GetMarkCount() == 1 && rReq.GetArgs() )
{
const SfxItemSet& rSet = *rReq.GetArgs();
if ( pDrView->IsTextEdit() )
pDrView->ScEndTextEdit();
pDrView->SetAttributes(rSet);
}
}
void ScDrawShell::ExecFormatPaintbrush( const SfxRequest& rReq )
{
ScViewFunc* pView = rViewData.GetView();
if ( pView->HasPaintBrush() )
{
// cancel paintbrush mode
pView->ResetBrushDocument();
}
else
{
bool bLock = false;
const SfxItemSet *pArgs = rReq.GetArgs();
if( pArgs && pArgs->Count() >= 1 )
bLock = pArgs->Get(SID_FORMATPAINTBRUSH).GetValue();
ScDrawView* pDrawView = rViewData.GetScDrawView();
if ( pDrawView && pDrawView->GetMarkedObjectList().GetMarkCount() != 0 )
{
std::unique_ptr<SfxItemSet> pItemSet(new SfxItemSet( pDrawView->GetAttrFromMarked(true/*bOnlyHardAttr*/) ));
pView->SetDrawBrushSet( std::move(pItemSet), bLock );
}
}
}
void ScDrawShell::StateFormatPaintbrush( SfxItemSet& rSet )
{
ScDrawView* pDrawView = rViewData.GetScDrawView();
bool bSelection = pDrawView && pDrawView->GetMarkedObjectList().GetMarkCount() != 0;
bool bHasPaintBrush = rViewData.GetView()->HasPaintBrush();
if ( !bHasPaintBrush && !bSelection )
rSet.DisableItem( SID_FORMATPAINTBRUSH );
else
rSet.Put( SfxBoolItem( SID_FORMATPAINTBRUSH, bHasPaintBrush ) );
}
ScDrawView* ScDrawShell::GetDrawView()
{
return rViewData.GetView()->GetScDrawView();
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */