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 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sd.hxx" 26 27 #include "DrawViewShell.hxx" 28 #include "ViewShellImplementation.hxx" 29 #include <vcl/waitobj.hxx> 30 #include <svx/svdograf.hxx> 31 #ifndef _SVXIDS_HRC 32 #include <svx/svxids.hrc> 33 #endif 34 #include <svx/svdpagv.hxx> 35 #include <svx/svdundo.hxx> 36 #ifndef _ZOOMITEM_HXX 37 #include <svx/zoomitem.hxx> 38 #endif 39 #ifndef _EDITDATA_HXX 40 #include <editeng/editdata.hxx> 41 #endif 42 #include <basic/sberrors.hxx> 43 #include <vcl/msgbox.hxx> 44 #include <sfx2/request.hxx> 45 #include <sfx2/dispatch.hxx> 46 #include <svx/xfillit0.hxx> 47 #include <svx/xflclit.hxx> 48 #include <svl/aeitem.hxx> 49 #include <editeng/eeitem.hxx> 50 #include <basic/sbstar.hxx> 51 #include <editeng/flditem.hxx> 52 #include <svx/xlineit0.hxx> 53 #include <svx/xfillit0.hxx> 54 55 #ifndef _SDOUTL_HXX //autogen 56 #include <svx/svdoutl.hxx> 57 #endif 58 #include <svx/xlnwtit.hxx> 59 #include <svx/svdoattr.hxx> 60 #include <svx/xlnstwit.hxx> 61 #include <svx/sdtmfitm.hxx> 62 #include <svx/sdtagitm.hxx> 63 #include <svx/xlnedwit.hxx> 64 #include <svx/fontworkbar.hxx> 65 66 #include <svx/svxdlg.hxx> 67 #include <svx/dialogs.hrc> 68 69 #include <sfx2/viewfrm.hxx> 70 #include "sdgrffilter.hxx" 71 72 #include "app.hrc" 73 #include "glob.hrc" 74 #include "helpids.h" 75 #include "sdattr.hxx" 76 #include "drawview.hxx" 77 #include "Window.hxx" 78 #include "drawdoc.hxx" 79 #include "DrawDocShell.hxx" 80 #include "sdpage.hxx" 81 #include "fuscale.hxx" 82 #include "sdresid.hxx" 83 #include "GraphicViewShell.hxx" 84 #include "unmodpg.hxx" 85 #include "slideshow.hxx" 86 #include "fuvect.hxx" 87 #include "stlpool.hxx" 88 89 // #90356# 90 #include "optsitem.hxx" 91 #include "sdabstdlg.hxx" 92 #include <com/sun/star/drawing/XMasterPagesSupplier.hpp> 93 #include <com/sun/star/drawing/XDrawPages.hpp> 94 95 #include <strings.hrc> 96 97 using namespace ::com::sun::star; 98 using namespace ::com::sun::star::uno; 99 100 namespace sd { 101 102 /************************************************************************* 103 |* 104 |* SfxRequests fuer temporaere Funktionen 105 |* 106 \************************************************************************/ 107 108 void DrawViewShell::FuTemporary(SfxRequest& rReq) 109 { 110 // Waehrend einer Native-Diashow wird nichts ausgefuehrt! 111 if(SlideShow::IsRunning( GetViewShellBase() ) && (rReq.GetSlot() != SID_NAVIGATOR)) 112 return; 113 114 DBG_ASSERT( mpDrawView, "sd::DrawViewShell::FuTemporary(), no draw view!" ); 115 if( !mpDrawView ) 116 return; 117 118 CheckLineTo (rReq); 119 120 DeactivateCurrentFunction(); 121 122 sal_uInt16 nSId = rReq.GetSlot(); 123 124 // Slot wird gemapped (ToolboxImages/-Slots) 125 MapSlot( nSId ); 126 127 switch ( nSId ) 128 { 129 // Flaechen und Linien-Attribute: 130 // Sollten (wie StateMethode) eine eigene 131 // Execute-Methode besitzen 132 case SID_ATTR_FILL_STYLE: 133 case SID_ATTR_FILL_COLOR: 134 case SID_ATTR_FILL_GRADIENT: 135 case SID_ATTR_FILL_HATCH: 136 case SID_ATTR_FILL_BITMAP: 137 case SID_ATTR_FILL_SHADOW: 138 139 case SID_ATTR_LINE_STYLE: 140 case SID_ATTR_LINE_DASH: 141 case SID_ATTR_LINE_WIDTH: 142 case SID_ATTR_LINE_COLOR: 143 case SID_ATTR_LINEEND_STYLE: 144 145 case SID_ATTR_TEXT_FITTOSIZE: 146 { 147 if( rReq.GetArgs() ) 148 { 149 sal_Bool bMergeUndo = sal_False; 150 ::svl::IUndoManager* pUndoManager = GetDocSh()->GetUndoManager(); 151 152 // Anpassungen Start/EndWidth #63083# 153 if(nSId == SID_ATTR_LINE_WIDTH) 154 { 155 SdrObject* pObj = NULL; 156 const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); 157 sal_uLong nCount = rMarkList.GetMarkCount(); 158 159 sal_Int32 nNewLineWidth = ((const XLineWidthItem&)rReq.GetArgs()->Get(XATTR_LINEWIDTH)).GetValue(); 160 161 for (sal_uLong i=0; i<nCount; i++) 162 { 163 SfxItemSet aAttr(GetDoc()->GetPool()); 164 pObj = rMarkList.GetMark(i)->GetMarkedSdrObj(); 165 aAttr.Put(pObj->GetMergedItemSet()); 166 167 sal_Int32 nActLineWidth = ((const XLineWidthItem&)aAttr.Get(XATTR_LINEWIDTH)).GetValue(); 168 169 if(nActLineWidth != nNewLineWidth) 170 { 171 sal_Bool bSetItemSet(sal_False); 172 173 // #86265# do this for SFX_ITEM_DEFAULT and for SFX_ITEM_SET 174 if(SFX_ITEM_DONTCARE != aAttr.GetItemState(XATTR_LINESTARTWIDTH)) 175 { 176 sal_Int32 nValAct = ((const XLineStartWidthItem&)aAttr.Get(XATTR_LINESTARTWIDTH)).GetValue(); 177 sal_Int32 nValNew = nValAct + (((nNewLineWidth - nActLineWidth) * 15) / 10); 178 if(nValNew < 0) 179 nValNew = 0; 180 bSetItemSet = sal_True; 181 aAttr.Put(XLineStartWidthItem(nValNew)); 182 } 183 184 // #86265# do this for SFX_ITEM_DEFAULT and for SFX_ITEM_SET 185 if(SFX_ITEM_DONTCARE != aAttr.GetItemState(XATTR_LINEENDWIDTH)) 186 { 187 sal_Int32 nValAct = ((const XLineEndWidthItem&)aAttr.Get(XATTR_LINEENDWIDTH)).GetValue(); 188 sal_Int32 nValNew = nValAct + (((nNewLineWidth - nActLineWidth) * 15) / 10); 189 if(nValNew < 0) 190 nValNew = 0; 191 bSetItemSet = sal_True; 192 aAttr.Put(XLineEndWidthItem(nValNew)); 193 } 194 195 if(bSetItemSet) 196 pObj->SetMergedItemSet(aAttr); 197 } 198 } 199 } 200 201 if (nSId == SID_ATTR_FILL_SHADOW) 202 { 203 // Ggf. werden transparente Objekte wei?gefuellt 204 SdrObject* pObj = NULL; 205 const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); 206 sal_uLong nCount = rMarkList.GetMarkCount(); 207 208 const bool bUndo = mpDrawView->IsUndoEnabled(); 209 210 for (sal_uLong i=0; i<nCount; i++) 211 { 212 SfxItemSet aAttr(GetDoc()->GetPool()); 213 pObj = rMarkList.GetMark(i)->GetMarkedSdrObj(); 214 215 // #i25616# 216 if(!pObj->ISA(SdrGrafObj)) 217 { 218 aAttr.Put(pObj->GetMergedItemSet()); 219 220 const XFillStyleItem& rFillStyle = 221 (const XFillStyleItem&) aAttr.Get(XATTR_FILLSTYLE); 222 223 if (rFillStyle.GetValue() == XFILL_NONE) 224 { 225 if( bUndo ) 226 { 227 // Vorlage hat keine Fuellung, 228 // daher hart attributieren: Fuellung setzen 229 if (!bMergeUndo) 230 { 231 bMergeUndo = sal_True; 232 pUndoManager->EnterListAction( String(), String() ); 233 mpDrawView->BegUndo(); 234 } 235 236 mpDrawView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoAttrObject(*pObj)); 237 } 238 239 aAttr.Put(XFillStyleItem(XFILL_SOLID)); 240 aAttr.Put(XFillColorItem(String(), COL_WHITE)); 241 242 pObj->SetMergedItemSet(aAttr); 243 } 244 } 245 } 246 247 if (bMergeUndo) 248 { 249 mpDrawView->EndUndo(); 250 } 251 } 252 253 mpDrawView->SetAttributes(*rReq.GetArgs()); 254 255 if (bMergeUndo) 256 { 257 pUndoManager->LeaveListAction(); 258 } 259 260 rReq.Done(); 261 } 262 else 263 { 264 switch( rReq.GetSlot() ) 265 { 266 case SID_ATTR_FILL_SHADOW: 267 case SID_ATTR_FILL_STYLE: 268 case SID_ATTR_FILL_COLOR: 269 case SID_ATTR_FILL_GRADIENT: 270 case SID_ATTR_FILL_HATCH: 271 case SID_ATTR_FILL_BITMAP: 272 GetViewFrame()->GetDispatcher()->Execute( SID_ATTRIBUTES_AREA, SFX_CALLMODE_ASYNCHRON ); 273 break; 274 case SID_ATTR_LINE_STYLE: 275 case SID_ATTR_LINE_DASH: 276 case SID_ATTR_LINE_WIDTH: 277 case SID_ATTR_LINE_COLOR: 278 GetViewFrame()->GetDispatcher()->Execute( SID_ATTRIBUTES_LINE, SFX_CALLMODE_ASYNCHRON ); 279 break; 280 case SID_ATTR_TEXT_FITTOSIZE: 281 GetViewFrame()->GetDispatcher()->Execute( SID_TEXTATTR_DLG, SFX_CALLMODE_ASYNCHRON ); 282 break; 283 } 284 } 285 Cancel(); 286 } 287 break; 288 289 case SID_HYPHENATION: 290 { 291 // const SfxPoolItem* pItem = rReq.GetArg( SID_HYPHENATION ); 292 // ^-- Soll so nicht benutzt werden (Defaults sind falsch) ! 293 SFX_REQUEST_ARG( rReq, pItem, SfxBoolItem, SID_HYPHENATION, sal_False); 294 295 if( pItem ) 296 { 297 SfxItemSet aSet( GetPool(), EE_PARA_HYPHENATE, EE_PARA_HYPHENATE ); 298 sal_Bool bValue = ( (const SfxBoolItem*) pItem)->GetValue(); 299 aSet.Put( SfxBoolItem( EE_PARA_HYPHENATE, bValue ) ); 300 mpDrawView->SetAttributes( aSet ); 301 } 302 else // nur zum Test 303 { 304 DBG_ERROR(" Kein Wert fuer Silbentrennung!"); 305 SfxItemSet aSet( GetPool(), EE_PARA_HYPHENATE, EE_PARA_HYPHENATE ); 306 sal_Bool bValue = sal_True; 307 aSet.Put( SfxBoolItem( EE_PARA_HYPHENATE, bValue ) ); 308 mpDrawView->SetAttributes( aSet ); 309 } 310 rReq.Done(); 311 Cancel(); 312 } 313 break; 314 315 case SID_INSERTPAGE: 316 case SID_INSERTPAGE_QUICK: 317 case SID_DUPLICATE_PAGE: 318 { 319 SdPage* pNewPage = CreateOrDuplicatePage (rReq, mePageKind, GetActualPage()); 320 Cancel(); 321 if(HasCurrentFunction(SID_BEZIER_EDIT) ) 322 GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON); 323 if (pNewPage != NULL) 324 SwitchPage((pNewPage->GetPageNum()-1)/2); 325 rReq.Done (); 326 } 327 break; 328 329 case SID_INSERT_MASTER_PAGE: 330 { 331 // Use the API to create a new page. 332 Reference<drawing::XMasterPagesSupplier> xMasterPagesSupplier ( 333 GetDoc()->getUnoModel(), UNO_QUERY); 334 if (xMasterPagesSupplier.is()) 335 { 336 Reference<drawing::XDrawPages> xMasterPages ( 337 xMasterPagesSupplier->getMasterPages()); 338 if (xMasterPages.is()) 339 { 340 sal_uInt16 nIndex = GetCurPageId(); 341 xMasterPages->insertNewByIndex (nIndex); 342 343 // Create shapes for the default layout. 344 SdPage* pMasterPage = GetDoc()->GetMasterSdPage( 345 nIndex, PK_STANDARD); 346 pMasterPage->CreateTitleAndLayout (sal_True,sal_True); 347 } 348 } 349 350 Cancel(); 351 if(HasCurrentFunction(SID_BEZIER_EDIT)) 352 GetViewFrame()->GetDispatcher()->Execute( 353 SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON); 354 rReq.Done (); 355 } 356 break; 357 358 case SID_MODIFYPAGE: 359 { 360 if (mePageKind==PK_STANDARD || mePageKind==PK_NOTES || 361 (mePageKind==PK_HANDOUT && meEditMode==EM_MASTERPAGE) ) 362 { 363 if ( mpDrawView->IsTextEdit() ) 364 { 365 mpDrawView->SdrEndTextEdit(); 366 } 367 sal_uInt16 nPage = maTabControl.GetCurPageId() - 1; 368 mpActualPage = GetDoc()->GetSdPage(nPage, mePageKind); 369 ::sd::ViewShell::mpImpl->ProcessModifyPageSlot ( 370 rReq, 371 mpActualPage, 372 mePageKind); 373 } 374 375 Cancel(); 376 rReq.Done (); 377 } 378 break; 379 380 case SID_ASSIGN_LAYOUT: 381 { 382 if (mePageKind==PK_STANDARD || mePageKind==PK_NOTES || (mePageKind==PK_HANDOUT && meEditMode==EM_MASTERPAGE)) 383 { 384 if ( mpDrawView->IsTextEdit() ) 385 mpDrawView->SdrEndTextEdit(); 386 387 ::sd::ViewShell::mpImpl->AssignLayout(rReq, mePageKind); 388 } 389 Cancel(); 390 rReq.Done (); 391 } 392 break; 393 394 case SID_RENAMEPAGE: 395 case SID_RENAME_MASTER_PAGE: 396 { 397 if (mePageKind==PK_STANDARD || mePageKind==PK_NOTES ) 398 { 399 if ( mpDrawView->IsTextEdit() ) 400 { 401 mpDrawView->SdrEndTextEdit(); 402 } 403 404 sal_uInt16 nPageId = maTabControl.GetCurPageId(); 405 SdPage* pCurrentPage = ( GetEditMode() == EM_PAGE ) 406 ? GetDoc()->GetSdPage( nPageId - 1, GetPageKind() ) 407 : GetDoc()->GetMasterSdPage( nPageId - 1, GetPageKind() ); 408 409 String aTitle( SdResId( STR_TITLE_RENAMESLIDE ) ); 410 String aDescr( SdResId( STR_DESC_RENAMESLIDE ) ); 411 String aPageName = pCurrentPage->GetName(); 412 413 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 414 DBG_ASSERT(pFact, "Dialogdiet fail!"); 415 AbstractSvxNameDialog* aNameDlg = pFact->CreateSvxNameDialog( GetActiveWindow(), aPageName, aDescr ); 416 DBG_ASSERT(aNameDlg, "Dialogdiet fail!"); 417 aNameDlg->SetText( aTitle ); 418 aNameDlg->SetCheckNameHdl( LINK( this, DrawViewShell, RenameSlideHdl ), true ); 419 aNameDlg->SetEditHelpId( HID_SD_NAMEDIALOG_PAGE ); 420 421 if( aNameDlg->Execute() == RET_OK ) 422 { 423 String aNewName; 424 aNameDlg->GetName( aNewName ); 425 if( ! aNewName.Equals( aPageName ) ) 426 { 427 #ifdef DBG_UTIL 428 bool bResult = 429 #endif 430 RenameSlide( nPageId, aNewName ); 431 DBG_ASSERT( bResult, "Couldn't rename slide" ); 432 } 433 } 434 delete aNameDlg; 435 } 436 437 Cancel(); 438 rReq.Ignore (); 439 } 440 break; 441 442 case SID_RENAMEPAGE_QUICK: 443 { 444 if (mePageKind==PK_STANDARD || mePageKind==PK_NOTES ) 445 { 446 if ( mpDrawView->IsTextEdit() ) 447 { 448 mpDrawView->SdrEndTextEdit(); 449 } 450 451 maTabControl.StartEditMode( maTabControl.GetCurPageId() ); 452 } 453 454 Cancel(); 455 rReq.Ignore (); 456 } 457 break; 458 459 case SID_PAGESIZE : // entweder dieses (kein menueeintrag o. ae. !!) 460 { 461 const SfxItemSet *pArgs = rReq.GetArgs (); 462 463 if (pArgs) 464 if (pArgs->Count () == 3) 465 { 466 SFX_REQUEST_ARG (rReq, pWidth, SfxUInt32Item, ID_VAL_PAGEWIDTH, sal_False); 467 SFX_REQUEST_ARG (rReq, pHeight, SfxUInt32Item, ID_VAL_PAGEHEIGHT, sal_False); 468 SFX_REQUEST_ARG (rReq, pScaleAll, SfxBoolItem, ID_VAL_SCALEOBJECTS, sal_False); 469 470 Size aSize (pWidth->GetValue (), pHeight->GetValue ()); 471 472 SetupPage (aSize, 0, 0, 0, 0, sal_True, sal_False, pScaleAll->GetValue ()); 473 rReq.Ignore (); 474 break; 475 } 476 477 StarBASIC::FatalError (SbERR_WRONG_ARGS); 478 rReq.Ignore (); 479 break; 480 } 481 482 case SID_PAGEMARGIN : // oder dieses (kein menueeintrag o. ae. !!) 483 { 484 const SfxItemSet *pArgs = rReq.GetArgs (); 485 486 if (pArgs) 487 if (pArgs->Count () == 5) 488 { 489 SFX_REQUEST_ARG (rReq, pLeft, SfxUInt32Item, ID_VAL_PAGELEFT, sal_False); 490 SFX_REQUEST_ARG (rReq, pRight, SfxUInt32Item, ID_VAL_PAGERIGHT, sal_False); 491 SFX_REQUEST_ARG (rReq, pUpper, SfxUInt32Item, ID_VAL_PAGETOP, sal_False); 492 SFX_REQUEST_ARG (rReq, pLower, SfxUInt32Item, ID_VAL_PAGEBOTTOM, sal_False); 493 SFX_REQUEST_ARG (rReq, pScaleAll, SfxBoolItem, ID_VAL_SCALEOBJECTS, sal_False); 494 495 Size aEmptySize (0, 0); 496 497 SetupPage (aEmptySize, pLeft->GetValue (), pRight->GetValue (), 498 pUpper->GetValue (), pLower->GetValue (), 499 sal_False, sal_True, pScaleAll->GetValue ()); 500 rReq.Ignore (); 501 break; 502 } 503 504 StarBASIC::FatalError (SbERR_WRONG_ARGS); 505 rReq.Ignore (); 506 break; 507 } 508 509 case SID_ATTR_ZOOMSLIDER: 510 { 511 const SfxItemSet* pArgs = rReq.GetArgs(); 512 513 if (pArgs && pArgs->Count () == 1 ) 514 { 515 SFX_REQUEST_ARG (rReq, pScale, SfxUInt16Item, SID_ATTR_ZOOMSLIDER, sal_False); 516 if (CHECK_RANGE (5, pScale->GetValue (), 3000)) 517 { 518 SetZoom (pScale->GetValue ()); 519 520 SfxBindings& rBindings = GetViewFrame()->GetBindings(); 521 rBindings.Invalidate( SID_ATTR_ZOOM ); 522 rBindings.Invalidate( SID_ZOOM_IN ); 523 rBindings.Invalidate( SID_ZOOM_OUT ); 524 rBindings.Invalidate( SID_ATTR_ZOOMSLIDER ); 525 526 } 527 } 528 529 Cancel(); 530 rReq.Done (); 531 break; 532 } 533 case SID_ZOOMING : // kein Menueintrag, sondern aus dem Zoomdialog generiert 534 { 535 const SfxItemSet* pArgs = rReq.GetArgs(); 536 537 if (pArgs) 538 if (pArgs->Count () == 1) 539 { 540 SFX_REQUEST_ARG (rReq, pScale, SfxUInt32Item, ID_VAL_ZOOM, sal_False); 541 if (CHECK_RANGE (10, pScale->GetValue (), 1000)) 542 { 543 SetZoom (pScale->GetValue ()); 544 545 SfxBindings& rBindings = GetViewFrame()->GetBindings(); 546 rBindings.Invalidate( SID_ATTR_ZOOM ); 547 rBindings.Invalidate( SID_ZOOM_IN ); 548 rBindings.Invalidate( SID_ZOOM_OUT ); 549 rBindings.Invalidate( SID_ATTR_ZOOMSLIDER ); 550 } 551 else StarBASIC::FatalError (SbERR_BAD_PROP_VALUE); 552 553 rReq.Ignore (); 554 break; 555 } 556 557 StarBASIC::FatalError (SbERR_WRONG_ARGS); 558 rReq.Ignore (); 559 break; 560 } 561 562 case SID_ATTR_ZOOM: 563 { 564 const SfxItemSet* pArgs = rReq.GetArgs(); 565 mbZoomOnPage = sal_False; 566 567 if ( pArgs ) 568 { 569 SvxZoomType eZT = ( ( const SvxZoomItem& ) pArgs-> 570 Get( SID_ATTR_ZOOM ) ).GetType(); 571 switch( eZT ) 572 { 573 case SVX_ZOOM_PERCENT: 574 SetZoom( (long) ( ( const SvxZoomItem& ) pArgs-> 575 Get( SID_ATTR_ZOOM ) ).GetValue() ); 576 break; 577 578 case SVX_ZOOM_OPTIMAL: 579 GetViewFrame()->GetDispatcher()->Execute( SID_SIZE_ALL, 580 SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD ); 581 break; 582 583 case SVX_ZOOM_PAGEWIDTH: 584 GetViewFrame()->GetDispatcher()->Execute( SID_SIZE_PAGE_WIDTH, 585 SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD ); 586 break; 587 588 case SVX_ZOOM_WHOLEPAGE: 589 GetViewFrame()->GetDispatcher()->Execute( SID_SIZE_PAGE, 590 SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD ); 591 break; 592 case SVX_ZOOM_PAGEWIDTH_NOBORDER: 593 DBG_ERROR("sd::DrawViewShell::FuTemporary(), SVX_ZOOM_PAGEWIDTH_NOBORDER not handled!" ); 594 break; 595 } 596 rReq.Ignore (); 597 } 598 else 599 { 600 // hier den Zoom-Dialog oeffnen 601 SetCurrentFunction( FuScale::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) ); 602 } 603 Cancel(); 604 } 605 break; 606 607 case SID_CHANGEBEZIER: 608 case SID_CHANGEPOLYGON: 609 if ( mpDrawView->IsTextEdit() ) 610 { 611 mpDrawView->SdrEndTextEdit(); 612 GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON); 613 } 614 615 if ( mpDrawView->IsPresObjSelected() ) 616 { 617 ::sd::Window* pWindow = GetActiveWindow(); 618 InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute(); 619 } 620 else 621 { 622 if( rReq.GetSlot() == SID_CHANGEBEZIER ) 623 { 624 WaitObject aWait( (Window*)GetActiveWindow() ); 625 mpDrawView->ConvertMarkedToPathObj(sal_False); 626 } 627 else 628 { 629 if( mpDrawView->IsVectorizeAllowed() ) 630 { 631 SetCurrentFunction( FuVectorize::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) ); 632 } 633 else 634 { 635 WaitObject aWait( (Window*)GetActiveWindow() ); 636 mpDrawView->ConvertMarkedToPolyObj(sal_False); 637 } 638 } 639 640 Invalidate(SID_CHANGEBEZIER); 641 Invalidate(SID_CHANGEPOLYGON); 642 } 643 Cancel(); 644 645 if( HasCurrentFunction(SID_BEZIER_EDIT) ) 646 { // ggf. die richtige Editfunktion aktivieren 647 GetViewFrame()->GetDispatcher()->Execute(SID_SWITCH_POINTEDIT, 648 SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD); 649 } 650 rReq.Ignore (); 651 break; 652 653 case SID_CONVERT_TO_CONTOUR: 654 if ( mpDrawView->IsTextEdit() ) 655 { 656 mpDrawView->SdrEndTextEdit(); 657 GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON); 658 } 659 660 if ( mpDrawView->IsPresObjSelected() ) 661 { 662 ::sd::Window* pWindow = GetActiveWindow(); 663 InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute(); 664 } 665 else 666 { 667 WaitObject aWait( (Window*)GetActiveWindow() ); 668 mpDrawView->ConvertMarkedToPathObj(sal_True); 669 670 Invalidate(SID_CONVERT_TO_CONTOUR); 671 } 672 Cancel(); 673 674 rReq.Ignore (); 675 break; 676 677 case SID_CONVERT_TO_METAFILE: 678 case SID_CONVERT_TO_BITMAP: 679 { 680 // End text edit mode when it is active because the metafile or 681 // bitmap that will be created does not support it. 682 if ( mpDrawView->IsTextEdit() ) 683 { 684 mpDrawView->SdrEndTextEdit(); 685 GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON); 686 } 687 688 if ( mpDrawView->IsPresObjSelected(true,true,true) ) 689 { 690 ::sd::Window* pWindow = GetActiveWindow(); 691 InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute(); 692 } 693 else 694 { 695 WaitObject aWait( (Window*)GetActiveWindow() ); 696 697 // switch on undo for the next operations 698 mpDrawView->BegUndo( 699 String( 700 SdResId (nSId==SID_CONVERT_TO_METAFILE ? STR_UNDO_CONVERT_TO_METAFILE : STR_UNDO_CONVERT_TO_BITMAP))); 701 702 // create SdrGrafObj from metafile/bitmap 703 Graphic aGraphic; 704 switch (nSId) 705 { 706 case SID_CONVERT_TO_METAFILE: 707 { 708 GDIMetaFile aMetaFile(mpDrawView->GetAllMarkedMetaFile ()); 709 aGraphic = Graphic(aMetaFile); 710 } 711 break; 712 case SID_CONVERT_TO_BITMAP: 713 { 714 bool bDone(false); 715 716 // I have to get the image here directly since GetAllMarkedBitmap works 717 // based on Bitmaps, but not on BitmapEx, thus throwing away the alpha 718 // channel. Argh! GetAllMarkedBitmap itself is too widely used to safely 719 // change that, e.g. in the exchange formats. For now I can only add this 720 // exception to get good results for Svgs. This is how the code gets more 721 // and more crowded, at last I made a remark for myself to change this 722 // as one of the next tasks. 723 if(1 == mpDrawView->GetMarkedObjectCount()) 724 { 725 const SdrGrafObj* pSdrGrafObj = dynamic_cast< const SdrGrafObj* >(mpDrawView->GetMarkedObjectByIndex(0)); 726 727 if(pSdrGrafObj && pSdrGrafObj->isEmbeddedSvg()) 728 { 729 aGraphic = Graphic(pSdrGrafObj->GetGraphic().getSvgData()->getReplacement()); 730 bDone = true; 731 } 732 } 733 734 if(!bDone) 735 { 736 Bitmap aBitmap (mpDrawView->GetAllMarkedBitmap ()); 737 aGraphic = Graphic(aBitmap); 738 } 739 } 740 break; 741 } 742 743 // create new object 744 SdrGrafObj* pGraphicObj = new SdrGrafObj (aGraphic); 745 746 // get some necessary info and ensure it 747 const SdrMarkList& rMarkList(mpDrawView->GetMarkedObjectList()); 748 const sal_uInt32 nMarkCount(rMarkList.GetMarkCount()); 749 SdrPageView* pPageView = mpDrawView->GetSdrPageView(); 750 OSL_ENSURE(nMarkCount, "DrawViewShell::FuTemporary: SID_CONVERT_TO_BITMAP with empty selection (!)"); 751 OSL_ENSURE(pPageView, "DrawViewShell::FuTemporary: SID_CONVERT_TO_BITMAP without SdrPageView (!)"); 752 753 // fit rectangle of new graphic object to selection's mark rect 754 Rectangle aAllMarkedRect; 755 rMarkList.TakeBoundRect(pPageView, aAllMarkedRect); 756 pGraphicObj->SetLogicRect(aAllMarkedRect); 757 758 // #i71540# to keep the order, it is necessary to replace the lowest object 759 // of the selection with the new object. This also means that with multi 760 // selection, all other objects need to be deleted first 761 SdrMark* pFirstMark = rMarkList.GetMark(0L); 762 SdrObject* pReplacementCandidate = pFirstMark->GetMarkedSdrObj(); 763 764 if(nMarkCount > 1L) 765 { 766 // take first object out of selection 767 mpDrawView->MarkObj(pReplacementCandidate, pPageView, true, true); 768 769 // clear remaining selection 770 mpDrawView->DeleteMarkedObj(); 771 } 772 773 // now replace lowest object with new one 774 mpDrawView->ReplaceObjectAtView(pReplacementCandidate, *pPageView, pGraphicObj); 775 776 // switch off undo 777 mpDrawView->EndUndo(); 778 } 779 } 780 781 Cancel(); 782 783 rReq.Done (); 784 break; 785 786 case SID_SET_DEFAULT: 787 { 788 SfxItemSet* pSet = NULL; 789 790 if (mpDrawView->IsTextEdit()) 791 { 792 ::Outliner* pOutl = mpDrawView->GetTextEditOutliner(); 793 if (pOutl) 794 { 795 pOutl->RemoveFields(sal_True, (TypeId) SvxURLField::StaticType()); 796 } 797 798 pSet = new SfxItemSet( GetPool(), EE_ITEMS_START, EE_ITEMS_END ); 799 mpDrawView->SetAttributes( *pSet, sal_True ); 800 } 801 else 802 { 803 const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); 804 sal_uLong nCount = rMarkList.GetMarkCount(); 805 806 // In diese Liste werden fuer jedes Praesentationsobjekt ein SfxItemSet 807 // der harten Attribute sowie der UserCall eingetragen, da diese beim nachfolgenden 808 // mpDrawView->SetAttributes( *pSet, sal_True ) verloren gehen und spaeter restauriert 809 // werden muessen 810 List* pAttrList = new List(); 811 SdPage* pPresPage = (SdPage*) mpDrawView->GetSdrPageView()->GetPage(); 812 sal_uLong i; 813 814 for ( i = 0; i < nCount; i++ ) 815 { 816 SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj(); 817 818 if( pPresPage->IsPresObj( pObj ) ) 819 { 820 SfxItemSet* pNewSet = new SfxItemSet( GetDoc()->GetPool(), SDRATTR_TEXT_MINFRAMEHEIGHT, SDRATTR_TEXT_AUTOGROWHEIGHT, 0 ); 821 pNewSet->Put(pObj->GetMergedItemSet()); 822 pAttrList->Insert( pNewSet, LIST_APPEND ); 823 pAttrList->Insert( pObj->GetUserCall(), LIST_APPEND ); 824 } 825 } 826 827 pSet = new SfxItemSet( GetPool() ); 828 mpDrawView->SetAttributes( *pSet, sal_True ); 829 830 sal_uLong j = 0; 831 832 for ( i = 0; i < nCount; i++ ) 833 { 834 SfxStyleSheet* pSheet = NULL; 835 SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj(); 836 837 if (pObj->GetObjIdentifier() == OBJ_TITLETEXT) 838 { 839 pSheet = mpActualPage->GetStyleSheetForPresObj(PRESOBJ_TITLE); 840 if (pSheet) 841 pObj->SetStyleSheet(pSheet, sal_False); 842 } 843 else if(pObj->GetObjIdentifier() == OBJ_OUTLINETEXT) 844 { 845 for (sal_uInt16 nLevel = 1; nLevel < 10; nLevel++) 846 { 847 pSheet = mpActualPage->GetStyleSheetForPresObj( PRESOBJ_OUTLINE ); 848 DBG_ASSERT(pSheet, "Vorlage fuer Gliederungsobjekt nicht gefunden"); 849 if (pSheet) 850 { 851 pObj->StartListening(*pSheet); 852 853 if( nLevel == 1 ) 854 // Textrahmen hoert auf StyleSheet der Ebene1 855 pObj->NbcSetStyleSheet(pSheet, sal_False); 856 857 } 858 } 859 } 860 861 if( pPresPage->IsPresObj( pObj ) ) 862 { 863 SfxItemSet* pNewSet = (SfxItemSet*) pAttrList->GetObject(j++); 864 SdrObjUserCall* pUserCall = (SdrObjUserCall*) pAttrList->GetObject(j++); 865 866 if ( pNewSet && pNewSet->GetItemState( SDRATTR_TEXT_MINFRAMEHEIGHT ) == SFX_ITEM_ON ) 867 { 868 pObj->SetMergedItem(pNewSet->Get(SDRATTR_TEXT_MINFRAMEHEIGHT)); 869 } 870 871 if ( pNewSet && pNewSet->GetItemState( SDRATTR_TEXT_AUTOGROWHEIGHT ) == SFX_ITEM_ON ) 872 { 873 pObj->SetMergedItem(pNewSet->Get(SDRATTR_TEXT_AUTOGROWHEIGHT)); 874 } 875 876 if( pUserCall ) 877 pObj->SetUserCall( pUserCall ); 878 879 delete pNewSet; 880 } 881 } 882 883 delete pAttrList; 884 } 885 886 delete pSet; 887 Cancel(); 888 } 889 break; 890 891 case SID_DELETE_SNAPITEM: 892 { 893 SdrPageView* pPV; 894 Point aMPos = GetActiveWindow()->PixelToLogic( maMousePos ); 895 sal_uInt16 nHitLog = (sal_uInt16) GetActiveWindow()->PixelToLogic( Size( 896 FuPoor::HITPIX, 0 ) ).Width(); 897 sal_uInt16 nHelpLine; 898 899 mbMousePosFreezed = sal_False; 900 901 if( mpDrawView->PickHelpLine( aMPos, nHitLog, *GetActiveWindow(), nHelpLine, pPV) ) 902 { 903 pPV->DeleteHelpLine( nHelpLine ); 904 } 905 Cancel(); 906 rReq.Ignore (); 907 } 908 break; 909 910 case SID_DELETE_PAGE: 911 case SID_DELETE_MASTER_PAGE: 912 DeleteActualPage(); 913 Cancel(); 914 rReq.Ignore (); 915 break; 916 917 case SID_DELETE_LAYER: 918 DeleteActualLayer(); 919 Cancel(); 920 rReq.Ignore (); 921 break; 922 923 case SID_ORIGINAL_SIZE: 924 mpDrawView->SetMarkedOriginalSize(); 925 Cancel(); 926 rReq.Done(); 927 break; 928 929 case SID_DRAW_FONTWORK: 930 case SID_DRAW_FONTWORK_VERTICAL: 931 { 932 svx::FontworkBar::execute( mpView, rReq, GetViewFrame()->GetBindings() ); // SJ: can be removed (I think) 933 Cancel(); 934 rReq.Done(); 935 } 936 break; 937 938 case SID_SAVEGRAPHIC: 939 { 940 const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); 941 if( rMarkList.GetMarkCount() == 1 ) 942 { 943 SdrGrafObj *pGrafObj = dynamic_cast< SdrGrafObj* >( rMarkList.GetMark( 0 )->GetMarkedSdrObj() ); 944 if(pGrafObj ) 945 { 946 ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape( pGrafObj->getUnoShape(), com::sun::star::uno::UNO_QUERY ); 947 SdGRFFilter::SaveGraphic( xShape ); 948 } 949 } 950 Cancel(); 951 rReq.Ignore(); 952 } 953 break; 954 955 default: 956 { 957 // switch Anweisung wegen CLOOKS aufgeteilt. Alle case-Anweisungen die 958 // eine Fu???? -Funktion aufrufen, sind in die Methode FuTemp01 (drviews8) 959 // gewandert. 960 FuTemp01(rReq); 961 } 962 break; 963 } 964 965 if(HasCurrentFunction()) 966 { 967 GetCurrentFunction()->Activate(); 968 } 969 } 970 971 972 973 974 /** This method consists basically of three parts: 975 1. Process the arguments of the SFX request. 976 2. Use the model to create a new page or duplicate an existing one. 977 3. Update the tab control and switch to the new page. 978 */ 979 SdPage* DrawViewShell::CreateOrDuplicatePage ( 980 SfxRequest& rRequest, 981 PageKind ePageKind, 982 SdPage* pPage, 983 const sal_Int32 nInsertPosition) 984 { 985 SdPage* pNewPage = NULL; 986 if (ePageKind == PK_STANDARD && meEditMode != EM_MASTERPAGE) 987 { 988 if ( mpDrawView->IsTextEdit() ) 989 { 990 mpDrawView->SdrEndTextEdit(); 991 } 992 pNewPage = ViewShell::CreateOrDuplicatePage (rRequest, ePageKind, pPage, nInsertPosition); 993 } 994 return pNewPage; 995 } 996 997 } // end of namespace sd 998