diff options
Diffstat (limited to 'sw/source/ui/shells/drwbassh.cxx')
-rw-r--r-- | sw/source/ui/shells/drwbassh.cxx | 1000 |
1 files changed, 1000 insertions, 0 deletions
diff --git a/sw/source/ui/shells/drwbassh.cxx b/sw/source/ui/shells/drwbassh.cxx new file mode 100644 index 000000000000..70aba0ae2a8f --- /dev/null +++ b/sw/source/ui/shells/drwbassh.cxx @@ -0,0 +1,1000 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sw.hxx" + + +#include <tools/shl.hxx> +#include <hintids.hxx> +#include <helpid.h> +#include <swtypes.hxx> +#include <sfx2/objface.hxx> +#include <sfx2/request.hxx> +#include <sfx2/bindings.hxx> +#include <svl/aeitem.hxx> +#include <svx/svdview.hxx> +#include <vcl/msgbox.hxx> +#include <svl/srchitem.hxx> +#include <svl/whiter.hxx> +#include <svx/swframevalidation.hxx> +#include <svx/anchorid.hxx> +#include <svx/htmlmode.hxx> +#include <uitool.hxx> +#include <fmtornt.hxx> +#include <cmdid.h> +#include <swmodule.hxx> +#include <wrtsh.hxx> +#include <wview.hxx> +#include <edtwin.hxx> +#include <viewopt.hxx> +#include <dcontact.hxx> +#include <frmfmt.hxx> +#include <wrap.hxx> +#include <drawbase.hxx> +#include <drwbassh.hxx> +#include <swdtflvr.hxx> +#include <svx/svdogrp.hxx> +#include <svx/svdpage.hxx> +#include <svx/svditer.hxx> + +#include <shells.hrc> +#define SwDrawBaseShell +#include <sfx2/msg.hxx> +#include <swslots.hxx> +#include <svx/svxdlg.hxx> +#include <svx/dialogs.hrc> +#include "swabstdlg.hxx" +#include "dialog.hrc" +#include <swundo.hxx> +#include <com/sun/star/text/HoriOrientation.hpp> +#include <com/sun/star/text/VertOrientation.hpp> +#include <com/sun/star/text/RelOrientation.hpp> + +#include <IDocumentDrawModelAccess.hxx> + +using namespace ::com::sun::star; + +SFX_IMPL_INTERFACE(SwDrawBaseShell, SwBaseShell, SW_RES(0)) +{ +} + +TYPEINIT1(SwDrawBaseShell,SwBaseShell) + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +SwDrawBaseShell::SwDrawBaseShell(SwView &_rView): + SwBaseShell( _rView ) +{ + GetShell().NoEdit(sal_True); + + SwEditWin& rWin = GetView().GetEditWin(); + + rWin.SetBezierMode(SID_BEZIER_MOVE); + + if ( !_rView.GetDrawFuncPtr() ) + _rView.GetEditWin().StdDrawMode( OBJ_NONE, sal_True ); + + SwTransferable::CreateSelection( GetShell() ); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +SwDrawBaseShell::~SwDrawBaseShell() +{ + GetView().ExitDraw(); + GetShell().Edit(); + SwTransferable::ClearSelection( GetShell() ); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +void SwDrawBaseShell::Execute(SfxRequest &rReq) +{ + SwWrtShell *pSh = &GetShell(); + SdrView* pSdrView = pSh->GetDrawView(); + const SfxItemSet *pArgs = rReq.GetArgs(); + sal_uInt16 nSlotId = rReq.GetSlot(); + sal_Bool bChanged = pSdrView->GetModel()->IsChanged(); + pSdrView->GetModel()->SetChanged(sal_False); + const SfxPoolItem* pItem = 0; + if(pArgs) + pArgs->GetItemState(nSlotId, sal_False, &pItem); + + //Sonderfall Align per Menue + if(pItem && nSlotId == SID_OBJECT_ALIGN) + { + DBG_ASSERT(PTR_CAST(SfxEnumItem, pItem),"SfxEnumItem erwartet"); + nSlotId = nSlotId + ((const SfxEnumItem*)pItem)->GetValue(); + nSlotId++; + } + + sal_Bool bAlignPossible = pSh->IsAlignPossible(); + + sal_Bool bTopParam = sal_True, bBottomParam = sal_True; + sal_Bool bNotify = sal_False; + sal_Bool bDone = sal_False; + SfxBindings& rBind = GetView().GetViewFrame()->GetBindings(); + + switch (nSlotId) + { + case FN_DRAW_WRAP_DLG: + { + if(pSdrView->AreObjectsMarked()) + { + if(!pArgs) + { + const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); + if( rMarkList.GetMark(0) != 0 ) + { + SfxItemSet aSet(GetPool(), RES_SURROUND, RES_SURROUND, + RES_ANCHOR, RES_ANCHOR, + RES_LR_SPACE, RES_UL_SPACE, + SID_HTML_MODE, SID_HTML_MODE, + FN_DRAW_WRAP_DLG, FN_DRAW_WRAP_DLG, + 0); + + aSet.Put(SfxBoolItem(SID_HTML_MODE, + 0 != ::GetHtmlMode(pSh->GetView().GetDocShell()))); + + aSet.Put(SfxInt16Item(FN_DRAW_WRAP_DLG, pSh->GetLayerId())); + + pSh->GetObjAttr(aSet); + SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); + DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!"); + + SfxAbstractDialog* pDlg = pFact->CreateSwWrapDlg( GetView().GetWindow(), aSet, pSh, sal_True, RC_DLG_SWWRAPDLG ); + DBG_ASSERT(pDlg, "Dialogdiet fail!"); + + if (pDlg->Execute() == RET_OK) + { + const SfxPoolItem* pWrapItem; + const SfxItemSet* pOutSet = pDlg->GetOutputItemSet(); + if(SFX_ITEM_SET == pOutSet->GetItemState(FN_DRAW_WRAP_DLG, sal_False, &pWrapItem)) + { + short nLayer = ((const SfxInt16Item*)pWrapItem)->GetValue(); + if (nLayer == 1) + pSh->SelectionToHeaven(); + else + pSh->SelectionToHell(); + } + + pSh->SetObjAttr(*pOutSet); + } + delete pDlg; + } + } + } + } + break; + + case SID_ATTR_TRANSFORM: + { + if(pSdrView->AreObjectsMarked()) + { + if(!pArgs) + { + const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); + if( rMarkList.GetMark(0) != 0 ) + { + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + SfxAbstractTabDialog *pDlg=NULL; + sal_Bool bCaption = sal_False; + + // Erlaubte Verankerungen: + short nAnchor = pSh->GetAnchorId(); + sal_uInt16 nAllowedAnchors = SVX_OBJ_AT_CNTNT|SVX_OBJ_IN_CNTNT; + sal_uInt16 nHtmlMode = ::GetHtmlMode(pSh->GetView().GetDocShell()); + + if( !((HTMLMODE_ON & nHtmlMode) && (0 == (nHtmlMode & HTMLMODE_SOME_ABS_POS))) ) + nAllowedAnchors |= SVX_OBJ_PAGE; + if ( pSh->IsFlyInFly() ) + nAllowedAnchors |= SVX_OBJ_AT_FLY; + + if (pObj->GetObjIdentifier() == OBJ_CAPTION ) + bCaption = sal_True; + + if (bCaption) + { + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + if ( pFact ) + { + AbstractSvxCaptionDialog* pCaptionDlg = + pFact->CreateCaptionDialog( NULL, pSdrView, nAllowedAnchors ); + pCaptionDlg->SetValidateFramePosLink( LINK(this, SwDrawBaseShell, ValidatePosition) ); + pDlg = pCaptionDlg; + DBG_ASSERT(pDlg, "Dialogdiet fail!"); + } + } + else + { + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + if ( pFact ) + { + + AbstractSvxTransformTabDialog* pTransform = + pFact->CreateSvxTransformTabDialog( NULL, NULL, pSdrView, nAllowedAnchors ); + pTransform->SetValidateFramePosLink( LINK(this, SwDrawBaseShell, ValidatePosition) ); + pDlg = pTransform; + DBG_ASSERT(pDlg, "Dialogdiet fail!"); + } + } + SfxItemSet aNewAttr(pSdrView->GetGeoAttrFromMarked()); + + const sal_uInt16* pRange = pDlg->GetInputRanges( *aNewAttr.GetPool() ); + SfxItemSet aSet( *aNewAttr.GetPool(), pRange ); + FieldUnit eMetric = ::GetDfltMetric(0 != dynamic_cast<SwWebView*>(&GetView())); + SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, static_cast< sal_uInt16 >(eMetric)) ); + + aSet.Put( aNewAttr, sal_False ); + + if (bCaption) + pSdrView->GetAttributes( aSet ); + + aSet.Put(SfxInt16Item(SID_ATTR_TRANSFORM_ANCHOR, nAnchor)); + sal_Bool bRTL; + sal_Bool bVertL2R; + aSet.Put(SfxBoolItem(SID_ATTR_TRANSFORM_IN_VERTICAL_TEXT, pSh->IsFrmVertical(sal_True, bRTL, bVertL2R))); + aSet.Put(SfxBoolItem(SID_ATTR_TRANSFORM_IN_RTL_TEXT, bRTL)); + + SwFrmFmt* pFrmFmt = FindFrmFmt( pObj ); + + aSet.Put( pFrmFmt->GetFmtAttr(RES_FOLLOW_TEXT_FLOW) ); + + SwFmtVertOrient aVOrient((const SwFmtVertOrient&)pFrmFmt->GetFmtAttr(RES_VERT_ORIENT)); + aSet.Put(SfxInt16Item(SID_ATTR_TRANSFORM_VERT_ORIENT, aVOrient.GetVertOrient())); + aSet.Put(SfxInt16Item(SID_ATTR_TRANSFORM_VERT_RELATION, aVOrient.GetRelationOrient() )); + aSet.Put(SfxInt32Item(SID_ATTR_TRANSFORM_VERT_POSITION, aVOrient.GetPos())); + + SwFmtHoriOrient aHOrient((const SwFmtHoriOrient&)pFrmFmt->GetFmtAttr(RES_HORI_ORIENT)); + aSet.Put(SfxInt16Item(SID_ATTR_TRANSFORM_HORI_ORIENT, aHOrient.GetHoriOrient())); + aSet.Put(SfxInt16Item(SID_ATTR_TRANSFORM_HORI_RELATION, aHOrient.GetRelationOrient() )); + aSet.Put(SfxBoolItem(SID_ATTR_TRANSFORM_HORI_MIRROR, aHOrient.IsPosToggle())); + aSet.Put(SfxInt32Item(SID_ATTR_TRANSFORM_HORI_POSITION, aHOrient.GetPos())); + + aSet.Put(SfxUInt16Item(SID_HTML_MODE, nHtmlMode)); + + pDlg->SetInputSet( &aSet ); + + if (pDlg->Execute() == RET_OK) + { + const SfxItemSet* pOutSet = pDlg->GetOutputItemSet(); + pSh->StartAllAction(); + + // --> OD 2004-07-14 #i30451# + pSh->StartUndo(UNDO_INSFMTATTR); + + pSdrView->SetGeoAttrToMarked(*pOutSet); + + if (bCaption) + pSdrView->SetAttributes(*pOutSet); + + sal_Bool bPosCorr = + SFX_ITEM_SET != pOutSet->GetItemState( + SID_ATTR_TRANSFORM_POS_X, sal_False ) && + SFX_ITEM_SET != pOutSet->GetItemState( + SID_ATTR_TRANSFORM_POS_Y, sal_False ); + + SfxItemSet aFrmAttrSet(GetPool(), RES_FRMATR_BEGIN, RES_FRMATR_END - 1); + + bool bSingleSelection = rMarkList.GetMarkCount() == 1; + + const SfxPoolItem* pAnchorItem; + if(SFX_ITEM_SET == pOutSet->GetItemState( + SID_ATTR_TRANSFORM_ANCHOR, sal_False, &pAnchorItem)) + { + if(!bSingleSelection) + pSh->ChgAnchor(((const SfxInt16Item*)pAnchorItem) + ->GetValue(), sal_False, bPosCorr ); + else + { + SwFmtAnchor aAnchor(pFrmFmt->GetAnchor()); + aAnchor.SetType((RndStdIds)((const SfxInt16Item*)pAnchorItem)->GetValue()); + aFrmAttrSet.Put( aAnchor ); + } + } + const SfxPoolItem* pHoriOrient = 0; + const SfxPoolItem* pHoriRelation = 0; + const SfxPoolItem* pHoriPosition = 0; + const SfxPoolItem* pHoriMirror = 0; + pOutSet->GetItemState(SID_ATTR_TRANSFORM_HORI_ORIENT, sal_False, &pHoriOrient); + pOutSet->GetItemState(SID_ATTR_TRANSFORM_HORI_RELATION, sal_False, &pHoriRelation); + pOutSet->GetItemState(SID_ATTR_TRANSFORM_HORI_POSITION, sal_False, &pHoriPosition); + pOutSet->GetItemState(SID_ATTR_TRANSFORM_HORI_MIRROR, sal_False, &pHoriMirror); + if(pHoriOrient || pHoriRelation || pHoriPosition || pHoriMirror) + { + if(pHoriOrient) + aHOrient.SetHoriOrient( + static_cast<const SfxInt16Item*>(pHoriOrient)->GetValue()); + if(pHoriRelation) + aHOrient.SetRelationOrient( + static_cast<const SfxInt16Item*>(pHoriRelation)->GetValue()); + if(pHoriPosition) + aHOrient.SetPos( static_cast<const SfxInt32Item*>(pHoriPosition)->GetValue()); + if(pHoriMirror) + aHOrient.SetPosToggle( static_cast<const SfxBoolItem*>(pHoriMirror)->GetValue()); + aFrmAttrSet.Put(aHOrient); + } + + const SfxPoolItem* pVertOrient = 0; + const SfxPoolItem* pVertRelation = 0; + const SfxPoolItem* pVertPosition = 0; + pOutSet->GetItemState(SID_ATTR_TRANSFORM_VERT_ORIENT, sal_False, &pVertOrient); + pOutSet->GetItemState(SID_ATTR_TRANSFORM_VERT_RELATION, sal_False, &pVertRelation); + pOutSet->GetItemState(SID_ATTR_TRANSFORM_VERT_POSITION, sal_False, &pVertPosition); + if(pVertOrient || pVertRelation || pVertPosition ) + { + if(pVertOrient) + aVOrient.SetVertOrient( + static_cast<const SfxInt16Item*>(pVertOrient)->GetValue()); + if(pVertRelation) + aVOrient.SetRelationOrient( + static_cast<const SfxInt16Item*>(pVertRelation)->GetValue()); + if(pVertPosition) + aVOrient.SetPos( static_cast<const SfxInt32Item*>(pVertPosition)->GetValue()); + aFrmAttrSet.Put( aVOrient ); + } + const SfxPoolItem* pFollowItem = 0; + pOutSet->GetItemState(RES_FOLLOW_TEXT_FLOW, sal_False, &pFollowItem); + if(pFollowItem) + aFrmAttrSet.Put(*pFollowItem); + + if(aFrmAttrSet.Count()) + pSh->SetDrawingAttr(aFrmAttrSet); + + rBind.InvalidateAll(sal_False); + + // --> OD 2004-07-14 #i30451# + pSh->EndUndo( UNDO_INSFMTATTR ); + + pSh->EndAllAction(); + } + delete pDlg; + + } + } + } + } + break; + + case SID_DELETE: + case FN_BACKSPACE: + if (pSh->IsObjSelected() && !pSdrView->IsTextEdit()) + { + bDone = sal_True; + + if( GetView().IsDrawRotate() ) + { + pSh->SetDragMode( SDRDRAG_MOVE ); + GetView().FlipDrawRotate(); + } + + pSh->SetModified(); + pSh->DelSelectedObj(); + + if (rReq.IsAPI() || + GetView().GetEditWin().IsObjectSelect() ) + { + // Wenn Basic-Aufruf, dann zurueck in die Textshell, da das + // Basic sonst keine Rueckkehrmoeglichkeit hat. + if (GetView().GetDrawFuncPtr()) + { + GetView().GetDrawFuncPtr()->Deactivate(); + GetView().SetDrawFuncPtr(NULL); + } + GetView().LeaveDrawCreate(); // In Selektionsmode wechseln + } + + if (pSh->IsSelFrmMode()) + { + pSh->LeaveSelFrmMode(); + // #105852# FME +// pSh->NoEdit(); + } + bNotify = sal_True; + } + break; + + case SID_GROUP: + if (pSh->IsObjSelected() > 1 && pSh->IsGroupAllowed()) + { + pSh->GroupSelection(); // Objekt gruppieren + rBind.Invalidate(SID_UNGROUP); + } + break; + + case SID_UNGROUP: + if (pSh->IsGroupSelected()) + { + pSh->UnGroupSelection(); // Objektgruppierung aufheben + rBind.Invalidate(SID_GROUP); + } + break; + + case SID_ENTER_GROUP: + if (pSh->IsGroupSelected()) + { + pSdrView->EnterMarkedGroup(); + rBind.InvalidateAll(sal_False); + } + break; + + case SID_LEAVE_GROUP: + if (pSdrView->IsGroupEntered()) + { + pSdrView->LeaveOneGroup(); + rBind.Invalidate(SID_ENTER_GROUP); + rBind.Invalidate(SID_UNGROUP); + } + break; + + case SID_OBJECT_ALIGN_LEFT: + case SID_OBJECT_ALIGN_CENTER: + case SID_OBJECT_ALIGN_RIGHT: + case SID_OBJECT_ALIGN_UP: + case SID_OBJECT_ALIGN_MIDDLE: + case SID_OBJECT_ALIGN_DOWN: + { + if ( bAlignPossible ) + { + const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); + if( rMarkList.GetMarkCount() == 1 && bAlignPossible ) + { // Objekte nicht aneinander ausrichten + + sal_uInt16 nAnchor = pSh->GetAnchorId(); + if (nAnchor == FLY_AS_CHAR) + { + sal_Int16 nVertOrient = -1; + + switch (nSlotId) + { + case SID_OBJECT_ALIGN_UP: + nVertOrient = text::VertOrientation::TOP; + break; + case SID_OBJECT_ALIGN_MIDDLE: + nVertOrient = text::VertOrientation::CENTER; + break; + case SID_OBJECT_ALIGN_DOWN: + nVertOrient = text::VertOrientation::BOTTOM; + break; + default: + break; + } + if (nVertOrient != -1) + { + pSh->StartAction(); + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + SwFrmFmt* pFrmFmt = FindFrmFmt( pObj ); + SwFmtVertOrient aVOrient((SwFmtVertOrient&)pFrmFmt->GetFmtAttr(RES_VERT_ORIENT)); + aVOrient.SetVertOrient( nVertOrient ); + pFrmFmt->SetFmtAttr(aVOrient); + pSh->EndAction(); + } + break; + } + if (nAnchor == FLY_AT_PARA) + break; // Absatzverankerte Rahmen nicht ausrichten + } + + pSh->StartAction(); + switch (nSlotId) + { + case SID_OBJECT_ALIGN_LEFT: + pSdrView->AlignMarkedObjects(SDRHALIGN_LEFT, SDRVALIGN_NONE); + break; + case SID_OBJECT_ALIGN_CENTER: + pSdrView->AlignMarkedObjects(SDRHALIGN_CENTER, SDRVALIGN_NONE); + break; + case SID_OBJECT_ALIGN_RIGHT: + pSdrView->AlignMarkedObjects(SDRHALIGN_RIGHT, SDRVALIGN_NONE); + break; + case SID_OBJECT_ALIGN_UP: + pSdrView->AlignMarkedObjects(SDRHALIGN_NONE, SDRVALIGN_TOP); + break; + case SID_OBJECT_ALIGN_MIDDLE: + pSdrView->AlignMarkedObjects(SDRHALIGN_NONE, SDRVALIGN_CENTER); + break; + case SID_OBJECT_ALIGN_DOWN: + pSdrView->AlignMarkedObjects(SDRHALIGN_NONE, SDRVALIGN_BOTTOM); + break; + } + pSh->EndAction(); + } + } + break; + + case FN_FRAME_UP: + bTopParam = sal_False; + /* no break */ + case SID_FRAME_TO_TOP: + pSh->SelectionToTop( bTopParam ); + break; + + case FN_FRAME_DOWN: + bBottomParam = sal_False; + /* no break */ + case SID_FRAME_TO_BOTTOM: + pSh->SelectionToBottom( bBottomParam ); + break; + + case FN_NAME_SHAPE: + { + bDone = sal_True; + + if(1L == pSdrView->GetMarkedObjectCount()) + { + // #i68101# + SdrObject* pSelected = pSdrView->GetMarkedObjectByIndex(0L); + OSL_ENSURE(pSelected, "DrawViewShell::FuTemp03: nMarkCount, but no object (!)"); + String aName(pSelected->GetName()); + + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + OSL_ENSURE(pFact, "Dialogdiet fail!"); + AbstractSvxObjectNameDialog* pDlg = pFact->CreateSvxObjectNameDialog(NULL, aName); + OSL_ENSURE(pDlg, "Dialogdiet fail!"); + + pDlg->SetCheckNameHdl(LINK(this, SwDrawBaseShell, CheckGroupShapeNameHdl)); + + if(RET_OK == pDlg->Execute()) + { + pDlg->GetName(aName); + pSelected->SetName(aName); + pSh->SetModified(); + } + + delete pDlg; + } + + break; + } + + // #i68101# + case FN_TITLE_DESCRIPTION_SHAPE: + { + bDone = sal_True; + + if(1L == pSdrView->GetMarkedObjectCount()) + { + SdrObject* pSelected = pSdrView->GetMarkedObjectByIndex(0L); + OSL_ENSURE(pSelected, "DrawViewShell::FuTemp03: nMarkCount, but no object (!)"); + String aTitle(pSelected->GetTitle()); + String aDescription(pSelected->GetDescription()); + + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + OSL_ENSURE(pFact, "Dialogdiet fail!"); + AbstractSvxObjectTitleDescDialog* pDlg = pFact->CreateSvxObjectTitleDescDialog(NULL, aTitle, aDescription); + OSL_ENSURE(pDlg, "Dialogdiet fail!"); + + if(RET_OK == pDlg->Execute()) + { + pDlg->GetTitle(aTitle); + pDlg->GetDescription(aDescription); + + pSelected->SetTitle(aTitle); + pSelected->SetDescription(aDescription); + + pSh->SetModified(); + } + + delete pDlg; + } + + break; + } + + default: + DBG_ASSERT(!this, "falscher Dispatcher"); + return; + } + if(!bDone) + { + if(nSlotId >= SID_OBJECT_ALIGN_LEFT && nSlotId <= SID_OBJECT_ALIGN_DOWN) + rBind.Invalidate(SID_ATTR_LONG_LRSPACE); + if (pSdrView->GetModel()->IsChanged()) + pSh->SetModified(); + else if (bChanged) + pSdrView->GetModel()->SetChanged(sal_True); + // 40220: Nach dem Loeschen von DrawObjekten ueber die API GPF durch Selbstzerstoerung + if(bNotify) + GetView().AttrChangedNotify(pSh); // ggf Shellwechsel... + } +} +/* -----------------------------27.02.2002 15:27------------------------------ + Checks whether a given name is allowed for a group shape + ---------------------------------------------------------------------------*/ +IMPL_LINK( SwDrawBaseShell, CheckGroupShapeNameHdl, AbstractSvxNameDialog*, pNameDialog ) +{ + SwWrtShell &rSh = GetShell(); + SdrView *pSdrView = rSh.GetDrawView(); + const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); + DBG_ASSERT(rMarkList.GetMarkCount() == 1, "wrong draw selection"); + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + const String sCurrentName = pObj->GetName(); + String sNewName; + pNameDialog->GetName(sNewName); + long nRet = 0; + if(!sNewName.Len() || sCurrentName == sNewName) + nRet = 1; + else + { + nRet = 1; + SdrModel* pModel = rSh.getIDocumentDrawModelAccess()->GetDrawModel(); + // --> OD 2006-03-09 #i51726# - all drawing objects can be named now. + // consider also drawing objects inside group objects +// SdrPage* pPage = pModel->GetPage(0); +// sal_uInt32 nCount = pPage->GetObjCount(); +// for( sal_uInt32 i=0; i< nCount; i++ ) +// { +// SdrObject* pTemp = pPage->GetObj(i); +// if(pObj != pTemp && pTemp->ISA(SdrObjGroup) && pTemp->GetName() == sNewName) +// { +// nRet = 0; +// break; +// } +// } + SdrObjListIter aIter( *(pModel->GetPage(0)), IM_DEEPWITHGROUPS ); + while( aIter.IsMore() ) + { + SdrObject* pTempObj = aIter.Next(); + if ( pObj != pTempObj && pTempObj->GetName() == sNewName ) + { + nRet = 0; + break; + } + } + // <-- + } + return nRet; +} +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ +void SwDrawBaseShell::GetState(SfxItemSet& rSet) +{ + SwWrtShell &rSh = GetShell(); + SdrView* pSdrView = rSh.GetDrawViewWithValidMarkList(); + SfxWhichIter aIter( rSet ); + sal_uInt16 nWhich = aIter.FirstWhich(); + sal_Bool bProtected = rSh.IsSelObjProtected(FLYPROTECT_CONTENT); + + if (!bProtected) // Im Parent nachsehen + bProtected |= rSh.IsSelObjProtected( FLYPROTECT_CONTENT|FLYPROTECT_PARENT ) != 0; + + while( nWhich ) + { + switch( nWhich ) + { + case FN_DRAW_WRAP_DLG: + case SID_ATTR_TRANSFORM: + case SID_FRAME_TO_TOP: + case SID_FRAME_TO_BOTTOM: + case FN_FRAME_UP: + case FN_FRAME_DOWN: + case SID_DELETE: + case FN_BACKSPACE: + if( bProtected || !rSh.IsObjSelected() ) + rSet.DisableItem( nWhich ); + break; + case SID_GROUP: + if ( rSh.IsObjSelected() < 2 || bProtected || !rSh.IsGroupAllowed() ) + rSet.DisableItem( nWhich ); + break; + case SID_UNGROUP: + if ( !rSh.IsGroupSelected() || bProtected ) + rSet.DisableItem( nWhich ); + break; + case SID_ENTER_GROUP: + if ( !rSh.IsGroupSelected() ) + rSet.DisableItem( nWhich ); + break; + case SID_LEAVE_GROUP: + if ( !pSdrView->IsGroupEntered() ) + rSet.DisableItem( nWhich ); + break; + case SID_OBJECT_ALIGN_LEFT: + case SID_OBJECT_ALIGN_CENTER: + case SID_OBJECT_ALIGN_RIGHT: + case SID_OBJECT_ALIGN_UP: + case SID_OBJECT_ALIGN_MIDDLE: + case SID_OBJECT_ALIGN_DOWN: + case SID_OBJECT_ALIGN: + if ( !rSh.IsAlignPossible() || bProtected ) + rSet.DisableItem( nWhich ); + else + { + SfxAllEnumItem aEnumItem(nWhich, USHRT_MAX); + const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); + //if only one object is selected it can only be vertically + // aligned because it is character bound + if( rMarkList.GetMarkCount() == 1 ) + { + aEnumItem.DisableValue(SID_OBJECT_ALIGN_LEFT); + aEnumItem.DisableValue(SID_OBJECT_ALIGN_CENTER); + aEnumItem.DisableValue(SID_OBJECT_ALIGN_RIGHT); + } + rSet.Put(aEnumItem); + } + break; + + case FN_NAME_SHAPE : + { + if(1L != pSdrView->GetMarkedObjectCount()) + { + rSet.DisableItem( nWhich ); + } + } + break; + + // #i68101# + case FN_TITLE_DESCRIPTION_SHAPE: + { + const bool bIsWebView(NULL != dynamic_cast<SwWebView*>(&GetView())); + + if(!bIsWebView && 1L != pSdrView->GetMarkedObjectCount()) + { + rSet.DisableItem( nWhich ); + } + } + break; + } + nWhich = aIter.NextWhich(); + } +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +sal_Bool SwDrawBaseShell::Disable(SfxItemSet& rSet, sal_uInt16 nWhich) +{ + sal_Bool bDisable = GetShell().IsSelObjProtected(FLYPROTECT_CONTENT); + + if (bDisable) + { + if (nWhich) + rSet.DisableItem( nWhich ); + else + { + SfxWhichIter aIter( rSet ); + nWhich = aIter.FirstWhich(); + while (nWhich) + { + rSet.DisableItem( nWhich ); + nWhich = aIter.NextWhich(); + } + } + } + + return bDisable; +} + +/*-- 09.03.2004 13:15:03--------------------------------------------------- + Validate of drawing positions + -----------------------------------------------------------------------*/ +IMPL_LINK(SwDrawBaseShell, ValidatePosition, SvxSwFrameValidation*, pValidation ) +{ + SwWrtShell *pSh = &GetShell(); + pValidation->nMinHeight = MINFLY; + pValidation->nMinWidth = MINFLY; + + SwRect aBoundRect; + + // OD 18.09.2003 #i18732# - adjustment for allowing vertical position + // aligned to page for fly frame anchored to paragraph or to character. + const RndStdIds eAnchorType = static_cast<RndStdIds >(pValidation->nAnchorType); + const SwPosition* pCntntPos = 0; + SdrView* pSdrView = pSh->GetDrawView(); + const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); + if( rMarkList.GetMarkCount() == 1 ) + { + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + SwFrmFmt* pFrmFmt = FindFrmFmt( pObj ); + pCntntPos = pFrmFmt->GetAnchor().GetCntntAnchor(); + } + + pSh->CalcBoundRect( aBoundRect, eAnchorType, + pValidation->nHRelOrient, + pValidation->nVRelOrient, + pCntntPos, + pValidation->bFollowTextFlow, + pValidation->bMirror, NULL, &pValidation->aPercentSize); + + sal_Bool bIsInVertical( sal_False ); + { + sal_Bool bRTL; + sal_Bool bVertL2R; + bIsInVertical = pSh->IsFrmVertical(sal_True, bRTL, bVertL2R); + } + if(bIsInVertical) + { + Point aPos(aBoundRect.Pos()); + long nTmp = aPos.X(); + aPos.X() = aPos.Y(); + aPos.Y() = nTmp; + Size aSize(aBoundRect.SSize()); + nTmp = aSize.Width(); + aSize.Width() = aSize.Height(); + aSize.Height() = nTmp; + aBoundRect.Chg( aPos, aSize ); + //exchange width/height to enable correct values + nTmp = pValidation->nWidth; + pValidation->nWidth = pValidation->nHeight; + pValidation->nHeight = nTmp; + } + if ((eAnchorType == FLY_AT_PAGE) || (eAnchorType == FLY_AT_FLY)) + { + // MinimalPosition + pValidation->nMinHPos = aBoundRect.Left(); + pValidation->nMinVPos = aBoundRect.Top(); + SwTwips nH = pValidation->nHPos; + SwTwips nV = pValidation->nVPos; + + if (pValidation->nHPos + pValidation->nWidth > aBoundRect.Right()) + { + if (pValidation->nHoriOrient == text::HoriOrientation::NONE) + { + pValidation->nHPos -= ((pValidation->nHPos + pValidation->nWidth) - aBoundRect.Right()); + nH = pValidation->nHPos; + } + else + pValidation->nWidth = aBoundRect.Right() - pValidation->nHPos; + } + + if (pValidation->nHPos + pValidation->nWidth > aBoundRect.Right()) + pValidation->nWidth = aBoundRect.Right() - pValidation->nHPos; + + if (pValidation->nVPos + pValidation->nHeight > aBoundRect.Bottom()) + { + if (pValidation->nVertOrient == text::VertOrientation::NONE) + { + pValidation->nVPos -= ((pValidation->nVPos + pValidation->nHeight) - aBoundRect.Bottom()); + nV = pValidation->nVPos; + } + else + pValidation->nHeight = aBoundRect.Bottom() - pValidation->nVPos; + } + + if (pValidation->nVPos + pValidation->nHeight > aBoundRect.Bottom()) + pValidation->nHeight = aBoundRect.Bottom() - pValidation->nVPos; + + if ( pValidation->nVertOrient != text::VertOrientation::NONE ) + nV = aBoundRect.Top(); + + if ( pValidation->nHoriOrient != text::HoriOrientation::NONE ) + nH = aBoundRect.Left(); + + pValidation->nMaxHPos = aBoundRect.Right() - pValidation->nWidth; + pValidation->nMaxHeight = aBoundRect.Bottom() - nV; + + pValidation->nMaxVPos = aBoundRect.Bottom() - pValidation->nHeight; + pValidation->nMaxWidth = aBoundRect.Right() - nH; + } + else if ((eAnchorType == FLY_AT_PARA) || (eAnchorType == FLY_AT_CHAR)) + { + if (pValidation->nHPos + pValidation->nWidth > aBoundRect.Right()) + { + if (pValidation->nHoriOrient == text::HoriOrientation::NONE) + { + pValidation->nHPos -= ((pValidation->nHPos + pValidation->nWidth) - aBoundRect.Right()); + } + else + pValidation->nWidth = aBoundRect.Right() - pValidation->nHPos; + } + + // OD 29.09.2003 #i17567#, #i18732# - consider following the text flow + // and alignment at page areas. + const bool bMaxVPosAtBottom = !pValidation->bFollowTextFlow || + pValidation->nVRelOrient == text::RelOrientation::PAGE_FRAME || + pValidation->nVRelOrient == text::RelOrientation::PAGE_PRINT_AREA; + { + SwTwips nTmpMaxVPos = ( bMaxVPosAtBottom + ? aBoundRect.Bottom() + : aBoundRect.Height() ) - + pValidation->nHeight; + if ( pValidation->nVPos > nTmpMaxVPos ) + { + if (pValidation->nVertOrient == text::VertOrientation::NONE) + { + pValidation->nVPos = nTmpMaxVPos; + } + else + { + pValidation->nHeight = ( bMaxVPosAtBottom + ? aBoundRect.Bottom() + : aBoundRect.Height() ) - pValidation->nVPos; + } + } + } + + pValidation->nMinHPos = aBoundRect.Left(); + pValidation->nMaxHPos = aBoundRect.Right() - pValidation->nWidth; + + pValidation->nMinVPos = aBoundRect.Top(); + // OD 26.09.2003 #i17567#, #i18732# - determine maximum vertical position + if ( bMaxVPosAtBottom ) + { + pValidation->nMaxVPos = aBoundRect.Bottom() - pValidation->nHeight; + } + else + { + pValidation->nMaxVPos = aBoundRect.Height() - pValidation->nHeight; + } + + // Maximale Breite Hoehe + const SwTwips nH = ( pValidation->nHoriOrient != text::HoriOrientation::NONE ) + ? aBoundRect.Left() + : pValidation->nHPos; + const SwTwips nV = ( pValidation->nVertOrient != text::VertOrientation::NONE ) + ? aBoundRect.Top() + : pValidation->nVPos; + pValidation->nMaxHeight = pValidation->nMaxVPos + pValidation->nHeight - nV; + pValidation->nMaxWidth = pValidation->nMaxHPos + pValidation->nWidth - nH; + } + else if (eAnchorType == FLY_AS_CHAR) + { + pValidation->nMinHPos = 0; + pValidation->nMaxHPos = 0; + + pValidation->nMaxHeight = aBoundRect.Height(); + pValidation->nMaxWidth = aBoundRect.Width(); + + pValidation->nMaxVPos = aBoundRect.Height(); + pValidation->nMinVPos = -aBoundRect.Height() + pValidation->nHeight; + if (pValidation->nMaxVPos < pValidation->nMinVPos) + { + pValidation->nMinVPos = pValidation->nMaxVPos; + pValidation->nMaxVPos = -aBoundRect.Height(); + } + } + if(bIsInVertical) + { + //restore width/height exchange + long nTmp = pValidation->nWidth; + pValidation->nWidth = pValidation->nHeight; + pValidation->nHeight = nTmp; + } + + if (pValidation->nMaxWidth < pValidation->nWidth) + pValidation->nWidth = pValidation->nMaxWidth; + if (pValidation->nMaxHeight < pValidation->nHeight) + pValidation->nHeight = pValidation->nMaxHeight; + return 0; +} + + + + |