1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 // MARKER(update_precomp.py): autogen include statement, do not remove 23 #include "precompiled_sw.hxx" 24 25 #include <tools/shl.hxx> 26 #include <hintids.hxx> 27 #include <helpid.h> 28 #include <swtypes.hxx> 29 #include <sfx2/objface.hxx> 30 #include <sfx2/request.hxx> 31 #include <sfx2/bindings.hxx> 32 #include <svl/aeitem.hxx> 33 #include <svx/svdview.hxx> 34 #include <vcl/msgbox.hxx> 35 #include <svl/srchitem.hxx> 36 #include <svl/whiter.hxx> 37 #include <svx/swframevalidation.hxx> 38 #include <svx/anchorid.hxx> 39 #include <svx/htmlmode.hxx> 40 #include <uitool.hxx> 41 #include <fmtornt.hxx> 42 #include <cmdid.h> 43 #include <swmodule.hxx> 44 #include <wrtsh.hxx> 45 #include <wview.hxx> 46 #include <edtwin.hxx> 47 #include <viewopt.hxx> 48 #include <dcontact.hxx> 49 #include <frmfmt.hxx> 50 #include <wrap.hxx> 51 #include <drawbase.hxx> 52 #include <drwbassh.hxx> 53 #include <swdtflvr.hxx> 54 #include <svx/svdogrp.hxx> 55 #include <svx/svdpage.hxx> 56 #include <svx/svditer.hxx> 57 #include <shells.hrc> 58 #define SwDrawBaseShell 59 #include <sfx2/msg.hxx> 60 #include <swslots.hxx> 61 #include <svx/svxdlg.hxx> 62 #include <svx/dialogs.hrc> 63 #include "swabstdlg.hxx" 64 #include "dialog.hrc" 65 #include <swundo.hxx> 66 #include <com/sun/star/text/HoriOrientation.hpp> 67 #include <com/sun/star/text/VertOrientation.hpp> 68 #include <com/sun/star/text/RelOrientation.hpp> 69 #include <IDocumentDrawModelAccess.hxx> 70 #include <drawdoc.hxx> 71 72 using namespace ::com::sun::star; 73 74 SFX_IMPL_INTERFACE(SwDrawBaseShell, SwBaseShell, SW_RES(0)) 75 { 76 } 77 78 TYPEINIT1(SwDrawBaseShell,SwBaseShell) 79 80 /*-------------------------------------------------------------------- 81 Beschreibung: 82 --------------------------------------------------------------------*/ 83 84 85 SwDrawBaseShell::SwDrawBaseShell(SwView &_rView): 86 SwBaseShell( _rView ) 87 { 88 GetShell().NoEdit(sal_True); 89 90 SwEditWin& rWin = GetView().GetEditWin(); 91 92 rWin.SetBezierMode(SID_BEZIER_MOVE); 93 94 if ( !_rView.GetDrawFuncPtr() ) 95 _rView.GetEditWin().StdDrawMode( OBJ_NONE, sal_True ); 96 97 SwTransferable::CreateSelection( GetShell() ); 98 } 99 100 /*-------------------------------------------------------------------- 101 Beschreibung: 102 --------------------------------------------------------------------*/ 103 104 105 SwDrawBaseShell::~SwDrawBaseShell() 106 { 107 GetView().ExitDraw(); 108 GetShell().Edit(); 109 SwTransferable::ClearSelection( GetShell() ); 110 } 111 112 /*-------------------------------------------------------------------- 113 Beschreibung: 114 --------------------------------------------------------------------*/ 115 116 117 void SwDrawBaseShell::Execute(SfxRequest &rReq) 118 { 119 SwWrtShell *pSh = &GetShell(); 120 SdrView* pSdrView = pSh->GetDrawView(); 121 const SfxItemSet *pArgs = rReq.GetArgs(); 122 sal_uInt16 nSlotId = rReq.GetSlot(); 123 sal_Bool bChanged = pSdrView->GetModel()->IsChanged(); 124 pSdrView->GetModel()->SetChanged(sal_False); 125 const SfxPoolItem* pItem = 0; 126 if(pArgs) 127 pArgs->GetItemState(nSlotId, sal_False, &pItem); 128 129 //Sonderfall Align per Menue 130 if(pItem && nSlotId == SID_OBJECT_ALIGN) 131 { 132 DBG_ASSERT(PTR_CAST(SfxEnumItem, pItem),"SfxEnumItem erwartet"); 133 nSlotId = nSlotId + ((const SfxEnumItem*)pItem)->GetValue(); 134 nSlotId++; 135 } 136 137 sal_Bool bAlignPossible = pSh->IsAlignPossible(); 138 139 sal_Bool bTopParam = sal_True, bBottomParam = sal_True; 140 sal_Bool bNotify = sal_False; 141 sal_Bool bDone = sal_False; 142 SfxBindings& rBind = GetView().GetViewFrame()->GetBindings(); 143 144 switch (nSlotId) 145 { 146 case FN_DRAW_WRAP_DLG: 147 { 148 if(pSdrView->AreObjectsMarked()) 149 { 150 if(!pArgs) 151 { 152 const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); 153 if( rMarkList.GetMark(0) != 0 ) 154 { 155 SfxItemSet aSet(GetPool(), RES_SURROUND, RES_SURROUND, 156 RES_ANCHOR, RES_ANCHOR, 157 RES_LR_SPACE, RES_UL_SPACE, 158 SID_HTML_MODE, SID_HTML_MODE, 159 FN_DRAW_WRAP_DLG, FN_DRAW_WRAP_DLG, 160 0); 161 162 aSet.Put(SfxBoolItem(SID_HTML_MODE, 163 0 != ::GetHtmlMode(pSh->GetView().GetDocShell()))); 164 165 aSet.Put(SfxInt16Item(FN_DRAW_WRAP_DLG, pSh->GetLayerId())); 166 167 pSh->GetObjAttr(aSet); 168 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); 169 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!"); 170 171 SfxAbstractDialog* pDlg = pFact->CreateSwWrapDlg( GetView().GetWindow(), aSet, pSh, sal_True, RC_DLG_SWWRAPDLG ); 172 DBG_ASSERT(pDlg, "Dialogdiet fail!"); 173 174 if (pDlg->Execute() == RET_OK) 175 { 176 const SfxPoolItem* pWrapItem; 177 const SfxItemSet* pOutSet = pDlg->GetOutputItemSet(); 178 if(SFX_ITEM_SET == pOutSet->GetItemState(FN_DRAW_WRAP_DLG, sal_False, &pWrapItem)) 179 { 180 short nLayer = ((const SfxInt16Item*)pWrapItem)->GetValue(); 181 if (nLayer == 1) 182 pSh->SelectionToHeaven(); 183 else 184 pSh->SelectionToHell(); 185 } 186 187 pSh->SetObjAttr(*pOutSet); 188 } 189 delete pDlg; 190 } 191 } 192 } 193 } 194 break; 195 196 case SID_ATTR_TRANSFORM: 197 { 198 if(pSdrView->AreObjectsMarked()) 199 { 200 if(!pArgs) 201 { 202 const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); 203 if( rMarkList.GetMark(0) != 0 ) 204 { 205 SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); 206 SfxAbstractTabDialog *pDlg=NULL; 207 sal_Bool bCaption = sal_False; 208 209 // Erlaubte Verankerungen: 210 short nAnchor = pSh->GetAnchorId(); 211 sal_uInt16 nAllowedAnchors = SVX_OBJ_AT_CNTNT|SVX_OBJ_IN_CNTNT; 212 sal_uInt16 nHtmlMode = ::GetHtmlMode(pSh->GetView().GetDocShell()); 213 214 if( !((HTMLMODE_ON & nHtmlMode) && (0 == (nHtmlMode & HTMLMODE_SOME_ABS_POS))) ) 215 nAllowedAnchors |= SVX_OBJ_PAGE; 216 if ( pSh->IsFlyInFly() ) 217 nAllowedAnchors |= SVX_OBJ_AT_FLY; 218 219 if (pObj->GetObjIdentifier() == OBJ_CAPTION ) 220 bCaption = sal_True; 221 222 if (bCaption) 223 { 224 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 225 if ( pFact ) 226 { 227 AbstractSvxCaptionDialog* pCaptionDlg = 228 pFact->CreateCaptionDialog( NULL, pSdrView, nAllowedAnchors ); 229 pCaptionDlg->SetValidateFramePosLink( LINK(this, SwDrawBaseShell, ValidatePosition) ); 230 pDlg = pCaptionDlg; 231 DBG_ASSERT(pDlg, "Dialogdiet fail!"); 232 } 233 } 234 else 235 { 236 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 237 if ( pFact ) 238 { 239 240 AbstractSvxTransformTabDialog* pTransform = 241 pFact->CreateSvxTransformTabDialog( NULL, NULL, pSdrView, nAllowedAnchors ); 242 pTransform->SetValidateFramePosLink( LINK(this, SwDrawBaseShell, ValidatePosition) ); 243 pDlg = pTransform; 244 DBG_ASSERT(pDlg, "Dialogdiet fail!"); 245 } 246 } 247 SfxItemSet aNewAttr(pSdrView->GetGeoAttrFromMarked()); 248 249 const sal_uInt16* pRange = pDlg->GetInputRanges( *aNewAttr.GetPool() ); 250 SfxItemSet aSet( *aNewAttr.GetPool(), pRange ); 251 FieldUnit eMetric = ::GetDfltMetric(0 != dynamic_cast<SwWebView*>(&GetView())); 252 SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, static_cast< sal_uInt16 >(eMetric)) ); 253 254 aSet.Put( aNewAttr, sal_False ); 255 256 if (bCaption) 257 pSdrView->GetAttributes( aSet ); 258 259 aSet.Put(SfxInt16Item(SID_ATTR_TRANSFORM_ANCHOR, nAnchor)); 260 sal_Bool bRTL; 261 sal_Bool bVertL2R; 262 aSet.Put(SfxBoolItem(SID_ATTR_TRANSFORM_IN_VERTICAL_TEXT, pSh->IsFrmVertical(sal_True, bRTL, bVertL2R))); 263 aSet.Put(SfxBoolItem(SID_ATTR_TRANSFORM_IN_RTL_TEXT, bRTL)); 264 265 SwFrmFmt* pFrmFmt = FindFrmFmt( pObj ); 266 267 aSet.Put( pFrmFmt->GetFmtAttr(RES_FOLLOW_TEXT_FLOW) ); 268 269 SwFmtVertOrient aVOrient((const SwFmtVertOrient&)pFrmFmt->GetFmtAttr(RES_VERT_ORIENT)); 270 aSet.Put(SfxInt16Item(SID_ATTR_TRANSFORM_VERT_ORIENT, aVOrient.GetVertOrient())); 271 aSet.Put(SfxInt16Item(SID_ATTR_TRANSFORM_VERT_RELATION, aVOrient.GetRelationOrient() )); 272 aSet.Put(SfxInt32Item(SID_ATTR_TRANSFORM_VERT_POSITION, aVOrient.GetPos())); 273 274 SwFmtHoriOrient aHOrient((const SwFmtHoriOrient&)pFrmFmt->GetFmtAttr(RES_HORI_ORIENT)); 275 aSet.Put(SfxInt16Item(SID_ATTR_TRANSFORM_HORI_ORIENT, aHOrient.GetHoriOrient())); 276 aSet.Put(SfxInt16Item(SID_ATTR_TRANSFORM_HORI_RELATION, aHOrient.GetRelationOrient() )); 277 aSet.Put(SfxBoolItem(SID_ATTR_TRANSFORM_HORI_MIRROR, aHOrient.IsPosToggle())); 278 aSet.Put(SfxInt32Item(SID_ATTR_TRANSFORM_HORI_POSITION, aHOrient.GetPos())); 279 280 aSet.Put(SfxUInt16Item(SID_HTML_MODE, nHtmlMode)); 281 282 pDlg->SetInputSet( &aSet ); 283 284 if (pDlg->Execute() == RET_OK) 285 { 286 const SfxItemSet* pOutSet = pDlg->GetOutputItemSet(); 287 pSh->StartAllAction(); 288 289 // --> OD 2004-07-14 #i30451# 290 pSh->StartUndo(UNDO_INSFMTATTR); 291 292 pSdrView->SetGeoAttrToMarked(*pOutSet); 293 294 if (bCaption) 295 pSdrView->SetAttributes(*pOutSet); 296 297 sal_Bool bPosCorr = 298 SFX_ITEM_SET != pOutSet->GetItemState( 299 SID_ATTR_TRANSFORM_POS_X, sal_False ) && 300 SFX_ITEM_SET != pOutSet->GetItemState( 301 SID_ATTR_TRANSFORM_POS_Y, sal_False ); 302 303 SfxItemSet aFrmAttrSet(GetPool(), RES_FRMATR_BEGIN, RES_FRMATR_END - 1); 304 305 bool bSingleSelection = rMarkList.GetMarkCount() == 1; 306 307 const SfxPoolItem* pAnchorItem; 308 if(SFX_ITEM_SET == pOutSet->GetItemState( 309 SID_ATTR_TRANSFORM_ANCHOR, sal_False, &pAnchorItem)) 310 { 311 if(!bSingleSelection) 312 pSh->ChgAnchor(((const SfxInt16Item*)pAnchorItem) 313 ->GetValue(), sal_False, bPosCorr ); 314 else 315 { 316 SwFmtAnchor aAnchor(pFrmFmt->GetAnchor()); 317 aAnchor.SetType((RndStdIds)((const SfxInt16Item*)pAnchorItem)->GetValue()); 318 aFrmAttrSet.Put( aAnchor ); 319 } 320 } 321 const SfxPoolItem* pHoriOrient = 0; 322 const SfxPoolItem* pHoriRelation = 0; 323 const SfxPoolItem* pHoriPosition = 0; 324 const SfxPoolItem* pHoriMirror = 0; 325 pOutSet->GetItemState(SID_ATTR_TRANSFORM_HORI_ORIENT, sal_False, &pHoriOrient); 326 pOutSet->GetItemState(SID_ATTR_TRANSFORM_HORI_RELATION, sal_False, &pHoriRelation); 327 pOutSet->GetItemState(SID_ATTR_TRANSFORM_HORI_POSITION, sal_False, &pHoriPosition); 328 pOutSet->GetItemState(SID_ATTR_TRANSFORM_HORI_MIRROR, sal_False, &pHoriMirror); 329 if(pHoriOrient || pHoriRelation || pHoriPosition || pHoriMirror) 330 { 331 if(pHoriOrient) 332 aHOrient.SetHoriOrient( 333 static_cast<const SfxInt16Item*>(pHoriOrient)->GetValue()); 334 if(pHoriRelation) 335 aHOrient.SetRelationOrient( 336 static_cast<const SfxInt16Item*>(pHoriRelation)->GetValue()); 337 if(pHoriPosition) 338 aHOrient.SetPos( static_cast<const SfxInt32Item*>(pHoriPosition)->GetValue()); 339 if(pHoriMirror) 340 aHOrient.SetPosToggle( static_cast<const SfxBoolItem*>(pHoriMirror)->GetValue()); 341 aFrmAttrSet.Put(aHOrient); 342 } 343 344 const SfxPoolItem* pVertOrient = 0; 345 const SfxPoolItem* pVertRelation = 0; 346 const SfxPoolItem* pVertPosition = 0; 347 pOutSet->GetItemState(SID_ATTR_TRANSFORM_VERT_ORIENT, sal_False, &pVertOrient); 348 pOutSet->GetItemState(SID_ATTR_TRANSFORM_VERT_RELATION, sal_False, &pVertRelation); 349 pOutSet->GetItemState(SID_ATTR_TRANSFORM_VERT_POSITION, sal_False, &pVertPosition); 350 if(pVertOrient || pVertRelation || pVertPosition ) 351 { 352 if(pVertOrient) 353 aVOrient.SetVertOrient( 354 static_cast<const SfxInt16Item*>(pVertOrient)->GetValue()); 355 if(pVertRelation) 356 aVOrient.SetRelationOrient( 357 static_cast<const SfxInt16Item*>(pVertRelation)->GetValue()); 358 if(pVertPosition) 359 aVOrient.SetPos( static_cast<const SfxInt32Item*>(pVertPosition)->GetValue()); 360 aFrmAttrSet.Put( aVOrient ); 361 } 362 const SfxPoolItem* pFollowItem = 0; 363 pOutSet->GetItemState(RES_FOLLOW_TEXT_FLOW, sal_False, &pFollowItem); 364 if(pFollowItem) 365 aFrmAttrSet.Put(*pFollowItem); 366 367 if(aFrmAttrSet.Count()) 368 pSh->SetDrawingAttr(aFrmAttrSet); 369 370 rBind.InvalidateAll(sal_False); 371 372 // --> OD 2004-07-14 #i30451# 373 pSh->EndUndo( UNDO_INSFMTATTR ); 374 375 pSh->EndAllAction(); 376 } 377 delete pDlg; 378 379 } 380 } 381 else 382 { 383 pSdrView->SetGeoAttrToMarked( *pArgs ); 384 } 385 } 386 } 387 break; 388 389 case SID_DELETE: 390 case FN_BACKSPACE: 391 if (pSh->IsObjSelected() && !pSdrView->IsTextEdit()) 392 { 393 bDone = sal_True; 394 395 if( GetView().IsDrawRotate() ) 396 { 397 pSh->SetDragMode( SDRDRAG_MOVE ); 398 GetView().FlipDrawRotate(); 399 } 400 401 pSh->SetModified(); 402 pSh->DelSelectedObj(); 403 404 if (rReq.IsAPI() || 405 GetView().GetEditWin().IsObjectSelect() ) 406 { 407 // Wenn Basic-Aufruf, dann zurueck in die Textshell, da das 408 // Basic sonst keine Rueckkehrmoeglichkeit hat. 409 if (GetView().GetDrawFuncPtr()) 410 { 411 GetView().GetDrawFuncPtr()->Deactivate(); 412 GetView().SetDrawFuncPtr(NULL); 413 } 414 GetView().LeaveDrawCreate(); // In Selektionsmode wechseln 415 } 416 417 if (pSh->IsSelFrmMode()) 418 { 419 pSh->LeaveSelFrmMode(); 420 // #105852# FME 421 // pSh->NoEdit(); 422 } 423 bNotify = sal_True; 424 } 425 break; 426 427 case SID_GROUP: 428 if (pSh->IsObjSelected() > 1 && pSh->IsGroupAllowed()) 429 { 430 pSh->GroupSelection(); // Objekt gruppieren 431 rBind.Invalidate(SID_UNGROUP); 432 } 433 break; 434 435 case SID_UNGROUP: 436 if (pSh->IsGroupSelected()) 437 { 438 pSh->UnGroupSelection(); // Objektgruppierung aufheben 439 rBind.Invalidate(SID_GROUP); 440 } 441 break; 442 443 case SID_ENTER_GROUP: 444 if (pSh->IsGroupSelected()) 445 { 446 pSdrView->EnterMarkedGroup(); 447 rBind.InvalidateAll(sal_False); 448 } 449 break; 450 451 case SID_LEAVE_GROUP: 452 if (pSdrView->IsGroupEntered()) 453 { 454 pSdrView->LeaveOneGroup(); 455 rBind.Invalidate(SID_ENTER_GROUP); 456 rBind.Invalidate(SID_UNGROUP); 457 } 458 break; 459 460 case SID_OBJECT_ALIGN_LEFT: 461 case SID_OBJECT_ALIGN_CENTER: 462 case SID_OBJECT_ALIGN_RIGHT: 463 case SID_OBJECT_ALIGN_UP: 464 case SID_OBJECT_ALIGN_MIDDLE: 465 case SID_OBJECT_ALIGN_DOWN: 466 { 467 if ( bAlignPossible ) 468 { 469 const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); 470 if( rMarkList.GetMarkCount() == 1 && bAlignPossible ) 471 { // Objekte nicht aneinander ausrichten 472 473 sal_uInt16 nAnchor = pSh->GetAnchorId(); 474 if (nAnchor == FLY_AS_CHAR) 475 { 476 sal_Int16 nVertOrient = -1; 477 478 switch (nSlotId) 479 { 480 case SID_OBJECT_ALIGN_UP: 481 nVertOrient = text::VertOrientation::TOP; 482 break; 483 case SID_OBJECT_ALIGN_MIDDLE: 484 nVertOrient = text::VertOrientation::CENTER; 485 break; 486 case SID_OBJECT_ALIGN_DOWN: 487 nVertOrient = text::VertOrientation::BOTTOM; 488 break; 489 default: 490 break; 491 } 492 if (nVertOrient != -1) 493 { 494 pSh->StartAction(); 495 SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); 496 SwFrmFmt* pFrmFmt = FindFrmFmt( pObj ); 497 SwFmtVertOrient aVOrient((SwFmtVertOrient&)pFrmFmt->GetFmtAttr(RES_VERT_ORIENT)); 498 aVOrient.SetVertOrient( nVertOrient ); 499 pFrmFmt->SetFmtAttr(aVOrient); 500 pSh->EndAction(); 501 } 502 break; 503 } 504 if (nAnchor == FLY_AT_PARA) 505 break; // Absatzverankerte Rahmen nicht ausrichten 506 } 507 508 pSh->StartAction(); 509 switch (nSlotId) 510 { 511 case SID_OBJECT_ALIGN_LEFT: 512 pSdrView->AlignMarkedObjects(SDRHALIGN_LEFT, SDRVALIGN_NONE); 513 break; 514 case SID_OBJECT_ALIGN_CENTER: 515 pSdrView->AlignMarkedObjects(SDRHALIGN_CENTER, SDRVALIGN_NONE); 516 break; 517 case SID_OBJECT_ALIGN_RIGHT: 518 pSdrView->AlignMarkedObjects(SDRHALIGN_RIGHT, SDRVALIGN_NONE); 519 break; 520 case SID_OBJECT_ALIGN_UP: 521 pSdrView->AlignMarkedObjects(SDRHALIGN_NONE, SDRVALIGN_TOP); 522 break; 523 case SID_OBJECT_ALIGN_MIDDLE: 524 pSdrView->AlignMarkedObjects(SDRHALIGN_NONE, SDRVALIGN_CENTER); 525 break; 526 case SID_OBJECT_ALIGN_DOWN: 527 pSdrView->AlignMarkedObjects(SDRHALIGN_NONE, SDRVALIGN_BOTTOM); 528 break; 529 } 530 pSh->EndAction(); 531 } 532 } 533 break; 534 535 case FN_FRAME_UP: 536 bTopParam = sal_False; 537 /* no break */ 538 case SID_FRAME_TO_TOP: 539 pSh->SelectionToTop( bTopParam ); 540 break; 541 542 case FN_FRAME_DOWN: 543 bBottomParam = sal_False; 544 /* no break */ 545 case SID_FRAME_TO_BOTTOM: 546 pSh->SelectionToBottom( bBottomParam ); 547 break; 548 549 case FN_NAME_SHAPE: 550 { 551 bDone = sal_True; 552 553 if(1L == pSdrView->GetMarkedObjectCount()) 554 { 555 // #i68101# 556 SdrObject* pSelected = pSdrView->GetMarkedObjectByIndex(0L); 557 OSL_ENSURE(pSelected, "DrawViewShell::FuTemp03: nMarkCount, but no object (!)"); 558 String aName(pSelected->GetName()); 559 560 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 561 OSL_ENSURE(pFact, "Dialogdiet fail!"); 562 AbstractSvxObjectNameDialog* pDlg = pFact->CreateSvxObjectNameDialog(NULL, aName); 563 OSL_ENSURE(pDlg, "Dialogdiet fail!"); 564 565 pDlg->SetCheckNameHdl(LINK(this, SwDrawBaseShell, CheckGroupShapeNameHdl)); 566 567 if(RET_OK == pDlg->Execute()) 568 { 569 pDlg->GetName(aName); 570 pSelected->SetName(aName); 571 pSh->SetModified(); 572 } 573 574 delete pDlg; 575 } 576 577 break; 578 } 579 580 // #i68101# 581 case FN_TITLE_DESCRIPTION_SHAPE: 582 { 583 bDone = sal_True; 584 585 if(1L == pSdrView->GetMarkedObjectCount()) 586 { 587 SdrObject* pSelected = pSdrView->GetMarkedObjectByIndex(0L); 588 OSL_ENSURE(pSelected, "DrawViewShell::FuTemp03: nMarkCount, but no object (!)"); 589 String aTitle(pSelected->GetTitle()); 590 String aDescription(pSelected->GetDescription()); 591 592 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 593 OSL_ENSURE(pFact, "Dialogdiet fail!"); 594 AbstractSvxObjectTitleDescDialog* pDlg = pFact->CreateSvxObjectTitleDescDialog(NULL, aTitle, aDescription); 595 OSL_ENSURE(pDlg, "Dialogdiet fail!"); 596 597 if(RET_OK == pDlg->Execute()) 598 { 599 pDlg->GetTitle(aTitle); 600 pDlg->GetDescription(aDescription); 601 602 pSelected->SetTitle(aTitle); 603 pSelected->SetDescription(aDescription); 604 605 pSh->SetModified(); 606 } 607 608 delete pDlg; 609 } 610 611 break; 612 } 613 614 default: 615 DBG_ASSERT(!this, "falscher Dispatcher"); 616 return; 617 } 618 if(!bDone) 619 { 620 if(nSlotId >= SID_OBJECT_ALIGN_LEFT && nSlotId <= SID_OBJECT_ALIGN_DOWN) 621 rBind.Invalidate(SID_ATTR_LONG_LRSPACE); 622 if (pSdrView->GetModel()->IsChanged()) 623 pSh->SetModified(); 624 else if (bChanged) 625 pSdrView->GetModel()->SetChanged(sal_True); 626 // 40220: Nach dem Loeschen von DrawObjekten ueber die API GPF durch Selbstzerstoerung 627 if(bNotify) 628 GetView().AttrChangedNotify(pSh); // ggf Shellwechsel... 629 } 630 } 631 /* -----------------------------27.02.2002 15:27------------------------------ 632 Checks whether a given name is allowed for a group shape 633 ---------------------------------------------------------------------------*/ 634 IMPL_LINK( SwDrawBaseShell, CheckGroupShapeNameHdl, AbstractSvxNameDialog*, pNameDialog ) 635 { 636 SwWrtShell &rSh = GetShell(); 637 SdrView *pSdrView = rSh.GetDrawView(); 638 const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); 639 DBG_ASSERT(rMarkList.GetMarkCount() == 1, "wrong draw selection"); 640 SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); 641 const String sCurrentName = pObj->GetName(); 642 String sNewName; 643 pNameDialog->GetName(sNewName); 644 long nRet = 0; 645 if(!sNewName.Len() || sCurrentName == sNewName) 646 nRet = 1; 647 else 648 { 649 nRet = 1; 650 SwDrawModel* pModel = rSh.getIDocumentDrawModelAccess()->GetDrawModel(); 651 // --> OD 2006-03-09 #i51726# - all drawing objects can be named now. 652 // consider also drawing objects inside group objects 653 // SdrPage* pPage = pModel->GetPage(0); 654 // sal_uInt32 nCount = pPage->GetObjCount(); 655 // for( sal_uInt32 i=0; i< nCount; i++ ) 656 // { 657 // SdrObject* pTemp = pPage->GetObj(i); 658 // if(pObj != pTemp && pTemp->ISA(SdrObjGroup) && pTemp->GetName() == sNewName) 659 // { 660 // nRet = 0; 661 // break; 662 // } 663 // } 664 SdrObjListIter aIter( *(pModel->GetPage(0)), IM_DEEPWITHGROUPS ); 665 while( aIter.IsMore() ) 666 { 667 SdrObject* pTempObj = aIter.Next(); 668 if ( pObj != pTempObj && pTempObj->GetName() == sNewName ) 669 { 670 nRet = 0; 671 break; 672 } 673 } 674 // <-- 675 } 676 return nRet; 677 } 678 /*-------------------------------------------------------------------- 679 Beschreibung: 680 --------------------------------------------------------------------*/ 681 void SwDrawBaseShell::GetState(SfxItemSet& rSet) 682 { 683 SwWrtShell &rSh = GetShell(); 684 SdrView* pSdrView = rSh.GetDrawViewWithValidMarkList(); 685 SfxWhichIter aIter( rSet ); 686 sal_uInt16 nWhich = aIter.FirstWhich(); 687 sal_Bool bProtected = rSh.IsSelObjProtected(FLYPROTECT_CONTENT); 688 689 if (!bProtected) // Im Parent nachsehen 690 bProtected |= rSh.IsSelObjProtected( FLYPROTECT_CONTENT|FLYPROTECT_PARENT ) != 0; 691 692 while( nWhich ) 693 { 694 switch( nWhich ) 695 { 696 case FN_DRAW_WRAP_DLG: 697 case SID_ATTR_TRANSFORM: 698 case SID_FRAME_TO_TOP: 699 case SID_FRAME_TO_BOTTOM: 700 case FN_FRAME_UP: 701 case FN_FRAME_DOWN: 702 case SID_DELETE: 703 case FN_BACKSPACE: 704 if( bProtected || !rSh.IsObjSelected() ) 705 rSet.DisableItem( nWhich ); 706 break; 707 case SID_GROUP: 708 if ( rSh.IsObjSelected() < 2 || bProtected || !rSh.IsGroupAllowed() ) 709 rSet.DisableItem( nWhich ); 710 break; 711 case SID_UNGROUP: 712 if ( !rSh.IsGroupSelected() || bProtected ) 713 rSet.DisableItem( nWhich ); 714 break; 715 case SID_ENTER_GROUP: 716 if ( !rSh.IsGroupSelected() ) 717 rSet.DisableItem( nWhich ); 718 break; 719 case SID_LEAVE_GROUP: 720 if ( !pSdrView->IsGroupEntered() ) 721 rSet.DisableItem( nWhich ); 722 break; 723 case SID_OBJECT_ALIGN_LEFT: 724 case SID_OBJECT_ALIGN_CENTER: 725 case SID_OBJECT_ALIGN_RIGHT: 726 case SID_OBJECT_ALIGN_UP: 727 case SID_OBJECT_ALIGN_MIDDLE: 728 case SID_OBJECT_ALIGN_DOWN: 729 case SID_OBJECT_ALIGN: 730 if ( !rSh.IsAlignPossible() || bProtected ) 731 rSet.DisableItem( nWhich ); 732 else 733 { 734 SfxAllEnumItem aEnumItem(nWhich, USHRT_MAX); 735 const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); 736 //if only one object is selected it can only be vertically 737 // aligned because it is character bound 738 if( rMarkList.GetMarkCount() == 1 ) 739 { 740 aEnumItem.DisableValue(SID_OBJECT_ALIGN_LEFT); 741 aEnumItem.DisableValue(SID_OBJECT_ALIGN_CENTER); 742 aEnumItem.DisableValue(SID_OBJECT_ALIGN_RIGHT); 743 } 744 rSet.Put(aEnumItem); 745 } 746 break; 747 748 case FN_NAME_SHAPE : 749 { 750 if(1L != pSdrView->GetMarkedObjectCount()) 751 { 752 rSet.DisableItem( nWhich ); 753 } 754 } 755 break; 756 757 // #i68101# 758 case FN_TITLE_DESCRIPTION_SHAPE: 759 { 760 const bool bIsWebView(NULL != dynamic_cast<SwWebView*>(&GetView())); 761 762 if(!bIsWebView && 1L != pSdrView->GetMarkedObjectCount()) 763 { 764 rSet.DisableItem( nWhich ); 765 } 766 } 767 break; 768 } 769 nWhich = aIter.NextWhich(); 770 } 771 } 772 773 774 void SwDrawBaseShell::GetDrawAttrStateForIFBX( SfxItemSet& rSet ) 775 { 776 SwWrtShell *pSh = &GetShell(); 777 SdrView* pSdrView = pSh->GetDrawView(); 778 const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); 779 if( rMarkList.GetMark(0) != 0 ) 780 { 781 // SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();//OST_IFBX@WL2 782 SfxItemSet aNewAttr(pSdrView->GetGeoAttrFromMarked()); 783 rSet.Put(aNewAttr,false); 784 } 785 } 786 787 788 sal_Bool SwDrawBaseShell::Disable(SfxItemSet& rSet, sal_uInt16 nWhich) 789 { 790 sal_Bool bDisable = GetShell().IsSelObjProtected(FLYPROTECT_CONTENT); 791 792 if (bDisable) 793 { 794 if (nWhich) 795 rSet.DisableItem( nWhich ); 796 else 797 { 798 SfxWhichIter aIter( rSet ); 799 nWhich = aIter.FirstWhich(); 800 while (nWhich) 801 { 802 rSet.DisableItem( nWhich ); 803 nWhich = aIter.NextWhich(); 804 } 805 } 806 } 807 808 return bDisable; 809 } 810 811 /*-- 09.03.2004 13:15:03--------------------------------------------------- 812 Validate of drawing positions 813 -----------------------------------------------------------------------*/ 814 IMPL_LINK(SwDrawBaseShell, ValidatePosition, SvxSwFrameValidation*, pValidation ) 815 { 816 SwWrtShell *pSh = &GetShell(); 817 pValidation->nMinHeight = MINFLY; 818 pValidation->nMinWidth = MINFLY; 819 820 SwRect aBoundRect; 821 822 // OD 18.09.2003 #i18732# - adjustment for allowing vertical position 823 // aligned to page for fly frame anchored to paragraph or to character. 824 const RndStdIds eAnchorType = static_cast<RndStdIds >(pValidation->nAnchorType); 825 const SwPosition* pCntntPos = 0; 826 SdrView* pSdrView = pSh->GetDrawView(); 827 const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); 828 if( rMarkList.GetMarkCount() == 1 ) 829 { 830 SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); 831 SwFrmFmt* pFrmFmt = FindFrmFmt( pObj ); 832 pCntntPos = pFrmFmt->GetAnchor().GetCntntAnchor(); 833 } 834 835 pSh->CalcBoundRect( aBoundRect, eAnchorType, 836 pValidation->nHRelOrient, 837 pValidation->nVRelOrient, 838 pCntntPos, 839 pValidation->bFollowTextFlow, 840 pValidation->bMirror, NULL, &pValidation->aPercentSize); 841 842 sal_Bool bIsInVertical( sal_False ); 843 { 844 sal_Bool bRTL; 845 sal_Bool bVertL2R; 846 bIsInVertical = pSh->IsFrmVertical(sal_True, bRTL, bVertL2R); 847 } 848 if(bIsInVertical) 849 { 850 Point aPos(aBoundRect.Pos()); 851 long nTmp = aPos.X(); 852 aPos.X() = aPos.Y(); 853 aPos.Y() = nTmp; 854 Size aSize(aBoundRect.SSize()); 855 nTmp = aSize.Width(); 856 aSize.Width() = aSize.Height(); 857 aSize.Height() = nTmp; 858 aBoundRect.Chg( aPos, aSize ); 859 //exchange width/height to enable correct values 860 nTmp = pValidation->nWidth; 861 pValidation->nWidth = pValidation->nHeight; 862 pValidation->nHeight = nTmp; 863 } 864 if ((eAnchorType == FLY_AT_PAGE) || (eAnchorType == FLY_AT_FLY)) 865 { 866 // MinimalPosition 867 pValidation->nMinHPos = aBoundRect.Left(); 868 pValidation->nMinVPos = aBoundRect.Top(); 869 SwTwips nH = pValidation->nHPos; 870 SwTwips nV = pValidation->nVPos; 871 872 if (pValidation->nHPos + pValidation->nWidth > aBoundRect.Right()) 873 { 874 if (pValidation->nHoriOrient == text::HoriOrientation::NONE) 875 { 876 pValidation->nHPos -= ((pValidation->nHPos + pValidation->nWidth) - aBoundRect.Right()); 877 nH = pValidation->nHPos; 878 } 879 else 880 pValidation->nWidth = aBoundRect.Right() - pValidation->nHPos; 881 } 882 883 if (pValidation->nHPos + pValidation->nWidth > aBoundRect.Right()) 884 pValidation->nWidth = aBoundRect.Right() - pValidation->nHPos; 885 886 if (pValidation->nVPos + pValidation->nHeight > aBoundRect.Bottom()) 887 { 888 if (pValidation->nVertOrient == text::VertOrientation::NONE) 889 { 890 pValidation->nVPos -= ((pValidation->nVPos + pValidation->nHeight) - aBoundRect.Bottom()); 891 nV = pValidation->nVPos; 892 } 893 else 894 pValidation->nHeight = aBoundRect.Bottom() - pValidation->nVPos; 895 } 896 897 if (pValidation->nVPos + pValidation->nHeight > aBoundRect.Bottom()) 898 pValidation->nHeight = aBoundRect.Bottom() - pValidation->nVPos; 899 900 if ( pValidation->nVertOrient != text::VertOrientation::NONE ) 901 nV = aBoundRect.Top(); 902 903 if ( pValidation->nHoriOrient != text::HoriOrientation::NONE ) 904 nH = aBoundRect.Left(); 905 906 pValidation->nMaxHPos = aBoundRect.Right() - pValidation->nWidth; 907 pValidation->nMaxHeight = aBoundRect.Bottom() - nV; 908 909 pValidation->nMaxVPos = aBoundRect.Bottom() - pValidation->nHeight; 910 pValidation->nMaxWidth = aBoundRect.Right() - nH; 911 } 912 else if ((eAnchorType == FLY_AT_PARA) || (eAnchorType == FLY_AT_CHAR)) 913 { 914 if (pValidation->nHPos + pValidation->nWidth > aBoundRect.Right()) 915 { 916 if (pValidation->nHoriOrient == text::HoriOrientation::NONE) 917 { 918 pValidation->nHPos -= ((pValidation->nHPos + pValidation->nWidth) - aBoundRect.Right()); 919 } 920 else 921 pValidation->nWidth = aBoundRect.Right() - pValidation->nHPos; 922 } 923 924 // OD 29.09.2003 #i17567#, #i18732# - consider following the text flow 925 // and alignment at page areas. 926 const bool bMaxVPosAtBottom = !pValidation->bFollowTextFlow || 927 pValidation->nVRelOrient == text::RelOrientation::PAGE_FRAME || 928 pValidation->nVRelOrient == text::RelOrientation::PAGE_PRINT_AREA; 929 { 930 SwTwips nTmpMaxVPos = ( bMaxVPosAtBottom 931 ? aBoundRect.Bottom() 932 : aBoundRect.Height() ) - 933 pValidation->nHeight; 934 if ( pValidation->nVPos > nTmpMaxVPos ) 935 { 936 if (pValidation->nVertOrient == text::VertOrientation::NONE) 937 { 938 pValidation->nVPos = nTmpMaxVPos; 939 } 940 else 941 { 942 pValidation->nHeight = ( bMaxVPosAtBottom 943 ? aBoundRect.Bottom() 944 : aBoundRect.Height() ) - pValidation->nVPos; 945 } 946 } 947 } 948 949 pValidation->nMinHPos = aBoundRect.Left(); 950 pValidation->nMaxHPos = aBoundRect.Right() - pValidation->nWidth; 951 952 pValidation->nMinVPos = aBoundRect.Top(); 953 // OD 26.09.2003 #i17567#, #i18732# - determine maximum vertical position 954 if ( bMaxVPosAtBottom ) 955 { 956 pValidation->nMaxVPos = aBoundRect.Bottom() - pValidation->nHeight; 957 } 958 else 959 { 960 pValidation->nMaxVPos = aBoundRect.Height() - pValidation->nHeight; 961 } 962 963 // Maximale Breite Hoehe 964 const SwTwips nH = ( pValidation->nHoriOrient != text::HoriOrientation::NONE ) 965 ? aBoundRect.Left() 966 : pValidation->nHPos; 967 const SwTwips nV = ( pValidation->nVertOrient != text::VertOrientation::NONE ) 968 ? aBoundRect.Top() 969 : pValidation->nVPos; 970 pValidation->nMaxHeight = pValidation->nMaxVPos + pValidation->nHeight - nV; 971 pValidation->nMaxWidth = pValidation->nMaxHPos + pValidation->nWidth - nH; 972 } 973 else if (eAnchorType == FLY_AS_CHAR) 974 { 975 pValidation->nMinHPos = 0; 976 pValidation->nMaxHPos = 0; 977 978 pValidation->nMaxHeight = aBoundRect.Height(); 979 pValidation->nMaxWidth = aBoundRect.Width(); 980 981 pValidation->nMaxVPos = aBoundRect.Height(); 982 pValidation->nMinVPos = -aBoundRect.Height() + pValidation->nHeight; 983 if (pValidation->nMaxVPos < pValidation->nMinVPos) 984 { 985 pValidation->nMinVPos = pValidation->nMaxVPos; 986 pValidation->nMaxVPos = -aBoundRect.Height(); 987 } 988 } 989 if(bIsInVertical) 990 { 991 //restore width/height exchange 992 long nTmp = pValidation->nWidth; 993 pValidation->nWidth = pValidation->nHeight; 994 pValidation->nHeight = nTmp; 995 } 996 997 if (pValidation->nMaxWidth < pValidation->nWidth) 998 pValidation->nWidth = pValidation->nMaxWidth; 999 if (pValidation->nMaxHeight < pValidation->nHeight) 1000 pValidation->nHeight = pValidation->nMaxHeight; 1001 return 0; 1002 } 1003