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 <com/sun/star/presentation/XPresentation2.hpp> 28 #include <com/sun/star/form/FormButtonType.hpp> 29 #include <com/sun/star/beans/XPropertySet.hpp> 30 #include <com/sun/star/i18n/TransliterationModules.hpp> 31 #include <com/sun/star/i18n/TransliterationModulesExtra.hpp> 32 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp> 33 34 #include <comphelper/processfactory.hxx> 35 36 #include "undo/undomanager.hxx" 37 #include <vcl/waitobj.hxx> 38 #include <svl/aeitem.hxx> 39 #include <editeng/editstat.hxx> 40 #include <vcl/msgbox.hxx> 41 #include <svl/urlbmk.hxx> 42 #include <svx/svdpagv.hxx> 43 #include <svx/fmshell.hxx> 44 #include <vcl/scrbar.hxx> 45 #include <svx/svdopath.hxx> 46 #include <svx/svdundo.hxx> 47 #include <svx/svdorect.hxx> 48 #include <svx/svdograf.hxx> 49 #include <svl/eitem.hxx> 50 #include <editeng/eeitem.hxx> 51 #include <sfx2/dispatch.hxx> 52 #include <sfx2/viewfrm.hxx> 53 #include <sfx2/request.hxx> 54 #include <svx/svxids.hrc> 55 #include <editeng/flditem.hxx> 56 #include <svx/ruler.hxx> 57 #include <svx/obj3d.hxx> 58 #include <svx/fmglob.hxx> 59 #include <svx/svdouno.hxx> 60 #include <svx/dataaccessdescriptor.hxx> 61 #include <tools/urlobj.hxx> 62 #include <svl/slstitm.hxx> 63 #include <sfx2/ipclient.hxx> 64 #include <toolkit/helper/vclunohelper.hxx> 65 #include <avmedia/mediawindow.hxx> 66 #include <svl/urihelper.hxx> 67 #include <sfx2/docfile.hxx> 68 69 #include "DrawViewShell.hxx" 70 #include "slideshow.hxx" 71 #include "ViewShellImplementation.hxx" 72 #include "ViewShellHint.hxx" 73 #include "framework/FrameworkHelper.hxx" 74 #include "app.hrc" 75 #include "glob.hrc" 76 #include "strings.hrc" 77 #include "res_bmp.hrc" 78 #include "drawdoc.hxx" 79 #include "fusel.hxx" 80 #include "futext.hxx" 81 #include "fuconrec.hxx" 82 #include "fuconcs.hxx" 83 #include "fuconuno.hxx" 84 #include "fuconbez.hxx" 85 #include "fuediglu.hxx" 86 #include "fuconarc.hxx" 87 #include "fucon3d.hxx" 88 #include "sdresid.hxx" 89 #include "slideshow.hxx" 90 #include "Outliner.hxx" 91 #include "PresentationViewShell.hxx" 92 #include "sdpage.hxx" 93 #include "FrameView.hxx" 94 #include "zoomlist.hxx" 95 #include "drawview.hxx" 96 #include "DrawDocShell.hxx" 97 #include "sdattr.hxx" 98 #include "ViewShellBase.hxx" 99 #include "ToolBarManager.hxx" 100 #include "anminfo.hxx" 101 #include "optsitem.hxx" 102 #include "Window.hxx" 103 #include "fuformatpaintbrush.hxx" 104 105 using ::rtl::OUString; 106 using com::sun::star::ui::dialogs::XExecutableDialog; 107 using namespace ::com::sun::star; 108 using namespace ::com::sun::star::uno; 109 using namespace ::com::sun::star::presentation; 110 111 namespace sd { 112 113 #ifdef _MSC_VER 114 #pragma optimize ( "", off ) 115 #endif 116 117 /************************************************************************* 118 |* 119 |* Permanente Funktionen 120 |* 121 \************************************************************************/ 122 123 void ImpAddPrintableCharactersToTextEdit(SfxRequest& rReq, ::sd::View* pView) 124 { 125 // #98198# evtl. feed characters to activated textedit 126 const SfxItemSet* pSet = rReq.GetArgs(); 127 128 if(pSet) 129 { 130 String aInputString; 131 132 if(SFX_ITEM_SET == pSet->GetItemState(SID_ATTR_CHAR)) 133 aInputString = ((SfxStringItem&)pSet->Get(SID_ATTR_CHAR)).GetValue(); 134 135 if(aInputString.Len()) 136 { 137 OutlinerView* pOLV = pView->GetTextEditOutlinerView(); 138 139 if(pOLV) 140 { 141 for(sal_uInt16 a(0); a < aInputString.Len(); a++) 142 { 143 sal_Char aChar = (sal_Char)aInputString.GetChar(a); 144 KeyCode aKeyCode; 145 KeyEvent aKeyEvent(aChar, aKeyCode); 146 147 // add actual character 148 pOLV->PostKeyEvent(aKeyEvent); 149 } 150 } 151 } 152 } 153 } 154 155 void DrawViewShell::FuPermanent(SfxRequest& rReq) 156 { 157 // Waehrend einer Native-Diashow wird nichts ausgefuehrt! 158 159 if (SlideShow::IsRunning(GetViewShellBase())) 160 return; 161 162 sal_uInt16 nSId = rReq.GetSlot(); 163 164 if( HasCurrentFunction() && 165 ( nSId == SID_TEXTEDIT || nSId == SID_ATTR_CHAR || nSId == SID_TEXT_FITTOSIZE || 166 nSId == SID_ATTR_CHAR_VERTICAL || nSId == SID_TEXT_FITTOSIZE_VERTICAL ) ) 167 { 168 FunctionReference xFunc( GetCurrentFunction() ); 169 170 FuText* pFuText = dynamic_cast< FuText* >( xFunc.get() ); 171 172 if( pFuText ) 173 { 174 pFuText->SetPermanent(sal_True); 175 xFunc->ReceiveRequest( rReq ); 176 177 MapSlot( nSId ); 178 179 Invalidate(); 180 181 Invalidate(); 182 183 // #98198# evtl. feed characters to activated textedit 184 if(SID_ATTR_CHAR == nSId && GetView() && GetView()->IsTextEdit()) 185 ImpAddPrintableCharactersToTextEdit(rReq, GetView()); 186 187 rReq.Done(); 188 return; 189 } 190 } 191 192 CheckLineTo (rReq); 193 sal_uInt16 nOldSId = 0; 194 sal_Bool bPermanent = sal_False; 195 196 if( !mpDrawView ) 197 return; 198 199 if(HasCurrentFunction()) 200 { 201 if( (nSId == SID_FORMATPAINTBRUSH) && (GetCurrentFunction()->GetSlotID() == SID_TEXTEDIT) ) 202 { 203 // save text edit mode for format paintbrush! 204 SetOldFunction( GetCurrentFunction() ); 205 } 206 else 207 { 208 if(GetOldFunction() == GetCurrentFunction()) 209 { 210 SetOldFunction(0); 211 } 212 } 213 214 if ( nSId != SID_TEXTEDIT && nSId != SID_ATTR_CHAR && nSId != SID_TEXT_FITTOSIZE && 215 nSId != SID_ATTR_CHAR_VERTICAL && nSId != SID_TEXT_FITTOSIZE_VERTICAL && 216 nSId != SID_FORMATPAINTBRUSH && 217 mpDrawView->IsTextEdit() ) 218 { 219 mpDrawView->SdrEndTextEdit(); 220 } 221 222 if( HasCurrentFunction() ) 223 { 224 nOldSId = GetCurrentFunction()->GetSlotID(); 225 226 if (nOldSId == nSId || 227 ((nOldSId == SID_TEXTEDIT || nOldSId == SID_ATTR_CHAR || nOldSId == SID_TEXT_FITTOSIZE || 228 nOldSId == SID_ATTR_CHAR_VERTICAL || nOldSId == SID_TEXT_FITTOSIZE_VERTICAL) && 229 (nSId == SID_TEXTEDIT || nSId == SID_ATTR_CHAR || nSId == SID_TEXT_FITTOSIZE || 230 nSId == SID_ATTR_CHAR_VERTICAL || nSId == SID_TEXT_FITTOSIZE_VERTICAL ))) 231 { 232 bPermanent = sal_True; 233 } 234 235 GetCurrentFunction()->Deactivate(); 236 } 237 238 SetCurrentFunction(0); 239 240 SfxBindings& rBind = GetViewFrame()->GetBindings(); 241 rBind.Invalidate(nOldSId); 242 rBind.Update(nOldSId); 243 } 244 245 // Slot wird gemapped (ToolboxImages/-Slots) 246 MapSlot( nSId ); 247 248 switch ( nSId ) 249 { 250 case SID_TEXTEDIT: // BASIC ??? 251 case SID_ATTR_CHAR: 252 case SID_ATTR_CHAR_VERTICAL: 253 case SID_TEXT_FITTOSIZE: 254 case SID_TEXT_FITTOSIZE_VERTICAL: 255 { 256 SetCurrentFunction( FuText::Create(this, GetActiveWindow(), mpDrawView, GetDoc(), rReq) ); 257 GetCurrentFunction()->DoExecute(rReq); 258 259 SfxBindings& rBindings = GetViewFrame()->GetBindings(); 260 rBindings.Invalidate( SID_ATTR_CHAR ); 261 rBindings.Invalidate( SID_ATTR_CHAR_VERTICAL ); 262 rBindings.Invalidate( SID_TEXT_FITTOSIZE ); 263 rBindings.Invalidate( SID_TEXT_FITTOSIZE_VERTICAL ); 264 265 // #98198# evtl. feed characters to activated textedit 266 if(SID_ATTR_CHAR == nSId && GetView() && GetView()->IsTextEdit()) 267 ImpAddPrintableCharactersToTextEdit(rReq, GetView()); 268 269 rReq.Done(); 270 } 271 break; 272 273 case SID_FM_CREATE_CONTROL: 274 { 275 SetCurrentFunction( FuConstructUnoControl::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq, bPermanent ) ); 276 rReq.Done(); 277 } 278 break; 279 280 // #98721# 281 case SID_FM_CREATE_FIELDCONTROL: 282 { 283 SFX_REQUEST_ARG( rReq, pDescriptorItem, SfxUnoAnyItem, SID_FM_DATACCESS_DESCRIPTOR, sal_False ); 284 DBG_ASSERT( pDescriptorItem, "DrawViewShell::FuPermanent(SID_FM_CREATE_FIELDCONTROL): invalid request args!" ); 285 286 if(pDescriptorItem) 287 { 288 // get the form view 289 FmFormView* pFormView = PTR_CAST(FmFormView, mpDrawView); 290 SdrPageView* pPageView = pFormView ? pFormView->GetSdrPageView() : NULL; 291 292 if(pPageView) 293 { 294 ::svx::ODataAccessDescriptor aDescriptor(pDescriptorItem->GetValue()); 295 SdrObject* pNewDBField = pFormView->CreateFieldControl(aDescriptor); 296 297 if(pNewDBField) 298 { 299 Rectangle aVisArea = GetActiveWindow()->PixelToLogic(Rectangle(Point(0,0), GetActiveWindow()->GetOutputSizePixel())); 300 Point aObjPos(aVisArea.Center()); 301 Size aObjSize(pNewDBField->GetLogicRect().GetSize()); 302 aObjPos.X() -= aObjSize.Width() / 2; 303 aObjPos.Y() -= aObjSize.Height() / 2; 304 Rectangle aNewObjectRectangle(aObjPos, aObjSize); 305 306 pNewDBField->SetLogicRect(aNewObjectRectangle); 307 308 GetView()->InsertObjectAtView(pNewDBField, *pPageView); 309 } 310 } 311 } 312 rReq.Done(); 313 } 314 break; 315 316 case SID_OBJECT_SELECT: 317 case SID_OBJECT_ROTATE: 318 case SID_OBJECT_MIRROR: 319 case SID_OBJECT_CROP: 320 case SID_OBJECT_TRANSPARENCE: 321 case SID_OBJECT_GRADIENT: 322 case SID_OBJECT_SHEAR: 323 case SID_OBJECT_CROOK_ROTATE: 324 case SID_OBJECT_CROOK_SLANT: 325 case SID_OBJECT_CROOK_STRETCH: 326 case SID_CONVERT_TO_3D_LATHE: 327 { 328 short nSlotId = rReq.GetSlot(); 329 330 if( nSlotId == SID_OBJECT_ROTATE ) 331 { 332 // togle rotation 333 if( nOldSId == nSlotId ) 334 { 335 nSlotId = SID_OBJECT_SELECT; 336 rReq.SetSlot( nSlotId ); 337 } 338 } 339 340 if (nSlotId == SID_OBJECT_CROOK_ROTATE || 341 nSlotId == SID_OBJECT_CROOK_SLANT || 342 nSlotId == SID_OBJECT_CROOK_STRETCH) 343 { 344 if ( mpDrawView->GetMarkedObjectList().GetMarkCount() > 0 && 345 !mpDrawView->IsCrookAllowed( mpDrawView->IsCrookNoContortion() ) ) 346 { 347 if ( mpDrawView->IsPresObjSelected() ) 348 { 349 ::sd::Window* pWindow = GetActiveWindow(); 350 InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute(); 351 } 352 else if ( QueryBox(GetActiveWindow(), WB_YES_NO, 353 String(SdResId(STR_ASK_FOR_CONVERT_TO_BEZIER) ) 354 ).Execute() == RET_YES ) 355 { 356 // Implizite Wandlung in Bezier 357 WaitObject aWait( (Window*)GetActiveWindow() ); 358 mpDrawView->ConvertMarkedToPathObj(sal_False); 359 } 360 } 361 } 362 else if (nSlotId == SID_OBJECT_SHEAR) 363 { 364 sal_uLong i = 0; 365 const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); 366 sal_uLong nMarkCnt = rMarkList.GetMarkCount(); 367 sal_Bool b3DObjMarked = sal_False; 368 369 while (i < nMarkCnt && !b3DObjMarked) 370 { 371 if (rMarkList.GetMark(i)->GetMarkedSdrObj()->ISA(E3dObject)) 372 { 373 b3DObjMarked = sal_True; 374 } 375 else 376 { 377 i++; 378 } 379 } 380 381 if ( nMarkCnt > 0 && !b3DObjMarked && 382 (!mpDrawView->IsShearAllowed() || !mpDrawView->IsDistortAllowed()) ) 383 { 384 if ( mpDrawView->IsPresObjSelected() ) 385 { 386 ::sd::Window* pWindow = GetActiveWindow(); 387 InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute(); 388 } 389 else if ( QueryBox(GetActiveWindow(), WB_YES_NO, 390 String(SdResId(STR_ASK_FOR_CONVERT_TO_BEZIER) ) 391 ).Execute() == RET_YES ) 392 { 393 // Implizite Wandlung in Bezier 394 WaitObject aWait( (Window*)GetActiveWindow() ); 395 mpDrawView->ConvertMarkedToPathObj(sal_False); 396 } 397 } 398 } 399 400 SetCurrentFunction( FuSelection::Create(this, GetActiveWindow(), mpDrawView, GetDoc(), rReq) ); 401 rReq.Done(); 402 Invalidate( SID_OBJECT_SELECT ); 403 } 404 break; 405 406 case SID_DRAW_LINE: 407 case SID_DRAW_XLINE: 408 case SID_DRAW_MEASURELINE: 409 case SID_LINE_ARROW_START: 410 case SID_LINE_ARROW_END: 411 case SID_LINE_ARROWS: 412 case SID_LINE_ARROW_CIRCLE: 413 case SID_LINE_CIRCLE_ARROW: 414 case SID_LINE_ARROW_SQUARE: 415 case SID_LINE_SQUARE_ARROW: 416 417 case SID_DRAW_RECT: 418 case SID_DRAW_RECT_NOFILL: 419 case SID_DRAW_RECT_ROUND: 420 case SID_DRAW_RECT_ROUND_NOFILL: 421 case SID_DRAW_SQUARE: 422 case SID_DRAW_SQUARE_NOFILL: 423 case SID_DRAW_SQUARE_ROUND: 424 case SID_DRAW_SQUARE_ROUND_NOFILL: 425 case SID_DRAW_ELLIPSE: 426 case SID_DRAW_ELLIPSE_NOFILL: 427 case SID_DRAW_CIRCLE: 428 case SID_DRAW_CIRCLE_NOFILL: 429 case SID_DRAW_CAPTION: 430 case SID_DRAW_CAPTION_VERTICAL: 431 case SID_TOOL_CONNECTOR: 432 case SID_CONNECTOR_ARROW_START: 433 case SID_CONNECTOR_ARROW_END: 434 case SID_CONNECTOR_ARROWS: 435 case SID_CONNECTOR_CIRCLE_START: 436 case SID_CONNECTOR_CIRCLE_END: 437 case SID_CONNECTOR_CIRCLES: 438 case SID_CONNECTOR_LINE: 439 case SID_CONNECTOR_LINE_ARROW_START: 440 case SID_CONNECTOR_LINE_ARROW_END: 441 case SID_CONNECTOR_LINE_ARROWS: 442 case SID_CONNECTOR_LINE_CIRCLE_START: 443 case SID_CONNECTOR_LINE_CIRCLE_END: 444 case SID_CONNECTOR_LINE_CIRCLES: 445 case SID_CONNECTOR_CURVE: 446 case SID_CONNECTOR_CURVE_ARROW_START: 447 case SID_CONNECTOR_CURVE_ARROW_END: 448 case SID_CONNECTOR_CURVE_ARROWS: 449 case SID_CONNECTOR_CURVE_CIRCLE_START: 450 case SID_CONNECTOR_CURVE_CIRCLE_END: 451 case SID_CONNECTOR_CURVE_CIRCLES: 452 case SID_CONNECTOR_LINES: 453 case SID_CONNECTOR_LINES_ARROW_START: 454 case SID_CONNECTOR_LINES_ARROW_END: 455 case SID_CONNECTOR_LINES_ARROWS: 456 case SID_CONNECTOR_LINES_CIRCLE_START: 457 case SID_CONNECTOR_LINES_CIRCLE_END: 458 case SID_CONNECTOR_LINES_CIRCLES: 459 { 460 SetCurrentFunction( FuConstructRectangle::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq, bPermanent ) ); 461 rReq.Done(); 462 } 463 break; 464 case SID_DRAW_POLYGON: 465 case SID_DRAW_POLYGON_NOFILL: 466 case SID_DRAW_XPOLYGON: 467 case SID_DRAW_XPOLYGON_NOFILL: 468 case SID_DRAW_FREELINE: 469 case SID_DRAW_FREELINE_NOFILL: 470 case SID_DRAW_BEZIER_FILL: // BASIC 471 case SID_DRAW_BEZIER_NOFILL: // BASIC 472 { 473 SetCurrentFunction( FuConstructBezierPolygon::Create(this, GetActiveWindow(), mpDrawView, GetDoc(), rReq, bPermanent) ); 474 rReq.Done(); 475 } 476 break; 477 478 case SID_GLUE_EDITMODE: 479 { 480 if (nOldSId != SID_GLUE_EDITMODE) 481 { 482 SetCurrentFunction( FuEditGluePoints::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq, bPermanent ) ); 483 } 484 else 485 { 486 GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON); 487 } 488 489 rReq.Done(); 490 } 491 break; 492 493 case SID_DRAW_ARC: 494 case SID_DRAW_CIRCLEARC: 495 case SID_DRAW_PIE: 496 case SID_DRAW_PIE_NOFILL: 497 case SID_DRAW_CIRCLEPIE: 498 case SID_DRAW_CIRCLEPIE_NOFILL: 499 case SID_DRAW_ELLIPSECUT: 500 case SID_DRAW_ELLIPSECUT_NOFILL: 501 case SID_DRAW_CIRCLECUT: 502 case SID_DRAW_CIRCLECUT_NOFILL: 503 { 504 SetCurrentFunction( FuConstructArc::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq, bPermanent) ); 505 rReq.Done(); 506 } 507 break; 508 509 case SID_3D_CUBE: 510 case SID_3D_SHELL: 511 case SID_3D_SPHERE: 512 case SID_3D_TORUS: 513 case SID_3D_HALF_SPHERE: 514 case SID_3D_CYLINDER: 515 case SID_3D_CONE: 516 case SID_3D_PYRAMID: 517 { 518 SetCurrentFunction( FuConstruct3dObject::Create(this, GetActiveWindow(), mpDrawView, GetDoc(), rReq, bPermanent ) ); 519 rReq.Done(); 520 } 521 break; 522 523 case SID_DRAWTBX_CS_BASIC : 524 case SID_DRAWTBX_CS_SYMBOL : 525 case SID_DRAWTBX_CS_ARROW : 526 case SID_DRAWTBX_CS_FLOWCHART : 527 case SID_DRAWTBX_CS_CALLOUT : 528 case SID_DRAWTBX_CS_STAR : 529 case SID_DRAW_CS_ID : 530 { 531 SetCurrentFunction( FuConstructCustomShape::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq, bPermanent ) ); 532 rReq.Done(); 533 534 if ( nSId != SID_DRAW_CS_ID ) 535 { 536 SfxBindings& rBind = GetViewFrame()->GetBindings(); 537 rBind.Invalidate( nSId ); 538 rBind.Update( nSId ); 539 } 540 } 541 break; 542 543 case SID_FORMATPAINTBRUSH: 544 { 545 SetCurrentFunction( FuFormatPaintBrush::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) ); 546 rReq.Done(); 547 SfxBindings& rBind = GetViewFrame()->GetBindings(); 548 rBind.Invalidate( nSId ); 549 rBind.Update( nSId ); 550 break; 551 } 552 553 default: 554 break; 555 } 556 557 if(HasOldFunction()) 558 { 559 sal_uInt16 nSlotId = GetOldFunction()->GetSlotID(); 560 561 GetOldFunction()->Deactivate(); 562 SetOldFunction(0); 563 564 SfxBindings& rBind = GetViewFrame()->GetBindings(); 565 rBind.Invalidate( nSlotId ); 566 rBind.Update( nSlotId ); 567 } 568 569 if(HasCurrentFunction()) 570 { 571 GetCurrentFunction()->Activate(); 572 SetOldFunction( GetCurrentFunction() ); 573 574 SetHelpId( GetCurrentFunction()->GetSlotID() ); 575 } 576 577 // Shell wird invalidiert, schneller als einzeln (laut MI) 578 // Jetzt explizit der letzte Slot incl. Update() 579 Invalidate(); 580 581 // #97016# III CTRL-SID_OBJECT_SELECT -> select first draw object if none is selected yet 582 if(SID_OBJECT_SELECT == nSId && HasCurrentFunction() && (rReq.GetModifier() & KEY_MOD1)) 583 { 584 if(!GetView()->AreObjectsMarked()) 585 { 586 // select first object 587 GetView()->UnmarkAllObj(); 588 GetView()->MarkNextObj(sal_True); 589 590 // ...and make it visible 591 if(GetView()->AreObjectsMarked()) 592 GetView()->MakeVisible(GetView()->GetAllMarkedRect(), *GetActiveWindow()); 593 } 594 } 595 596 // #97016# with qualifier construct directly 597 if(HasCurrentFunction() && (rReq.GetModifier() & KEY_MOD1)) 598 { 599 // get SdOptions 600 SdOptions* pOptions = SD_MOD()->GetSdOptions(GetDoc()->GetDocumentType()); 601 sal_uInt32 nDefaultObjectSizeWidth(pOptions->GetDefaultObjectSizeWidth()); 602 sal_uInt32 nDefaultObjectSizeHeight(pOptions->GetDefaultObjectSizeHeight()); 603 604 // calc position and size 605 Rectangle aVisArea = GetActiveWindow()->PixelToLogic(Rectangle(Point(0,0), GetActiveWindow()->GetOutputSizePixel())); 606 Point aPagePos = aVisArea.Center(); 607 aPagePos.X() -= nDefaultObjectSizeWidth / 2; 608 aPagePos.Y() -= nDefaultObjectSizeHeight / 2; 609 Rectangle aNewObjectRectangle(aPagePos, Size(nDefaultObjectSizeWidth, nDefaultObjectSizeHeight)); 610 SdrPageView* pPageView = mpDrawView->GetSdrPageView(); 611 612 if(pPageView) 613 { 614 // create the default object 615 SdrObject* pObj = GetCurrentFunction()->CreateDefaultObject(nSId, aNewObjectRectangle); 616 617 if(pObj) 618 { 619 // insert into page 620 GetView()->InsertObjectAtView(pObj, *pPageView); 621 622 // Now that pFuActual has done what it was created for we 623 // can switch on the edit mode for callout objects. 624 switch (nSId) 625 { 626 case SID_DRAW_CAPTION: 627 case SID_DRAW_CAPTION_VERTICAL: 628 { 629 // Make FuText the current function. 630 SfxUInt16Item aItem (SID_TEXTEDIT, 1); 631 GetViewFrame()->GetDispatcher()-> 632 Execute(SID_TEXTEDIT, SFX_CALLMODE_SYNCHRON | 633 SFX_CALLMODE_RECORD, &aItem, 0L); 634 // Put text object into edit mode. 635 GetView()->SdrBeginTextEdit(static_cast<SdrTextObj*>(pObj), pPageView); 636 break; 637 } 638 } 639 } 640 } 641 } 642 } 643 644 /************************************************************************* 645 |* 646 |* SfxRequests fuer Support-Funktionen 647 |* 648 \************************************************************************/ 649 650 void DrawViewShell::FuSupport(SfxRequest& rReq) 651 { 652 if( rReq.GetSlot() == SID_STYLE_FAMILY && rReq.GetArgs()) 653 GetDocSh()->SetStyleFamily(((SfxUInt16Item&)rReq.GetArgs()->Get( SID_STYLE_FAMILY )).GetValue()); 654 655 // Waehrend einer Native-Diashow wird nichts ausgefuehrt! 656 if(SlideShow::IsRunning(GetViewShellBase()) && 657 (rReq.GetSlot() != SID_PRESENTATION_END && 658 rReq.GetSlot() != SID_SIZE_PAGE)) 659 return; 660 661 CheckLineTo (rReq); 662 663 if( !mpDrawView ) 664 return; 665 666 sal_uInt16 nSId = rReq.GetSlot(); 667 668 // Slot wird evtl. gemapped (ToolboxImages/-Slots) 669 MapSlot( nSId ); 670 671 switch ( nSId ) 672 { 673 case SID_CLEAR_UNDO_STACK: 674 { 675 GetDocSh()->ClearUndoBuffer(); 676 rReq.Ignore (); 677 } 678 break; 679 680 // Slots der ToolboxController gemapped ausfuehren 681 case SID_OBJECT_CHOOSE_MODE: 682 case SID_POSITION: 683 case SID_OBJECT_ALIGN: 684 case SID_ZOOM_TOOLBOX: 685 case SID_DRAWTBX_TEXT: 686 case SID_DRAWTBX_RECTANGLES: 687 case SID_DRAWTBX_ELLIPSES: 688 case SID_DRAWTBX_LINES: 689 case SID_DRAWTBX_ARROWS: 690 case SID_DRAWTBX_3D_OBJECTS: 691 case SID_DRAWTBX_CONNECTORS: 692 case SID_DRAWTBX_INSERT: 693 { 694 sal_uInt16 nMappedSlot = GetMappedSlot( nSId ); 695 if( nMappedSlot > 0 ) 696 { 697 SfxRequest aReq( nMappedSlot, 0, GetDoc()->GetItemPool() ); 698 ExecuteSlot( aReq ); 699 } 700 } 701 break; 702 703 case SID_PRESENTATION: 704 case SID_REHEARSE_TIMINGS: 705 { 706 Reference< XPresentation2 > xPresentation( GetDoc()->getPresentation() ); 707 if( xPresentation.is() ) 708 { 709 if( ( SID_REHEARSE_TIMINGS != rReq.GetSlot() ) ) 710 xPresentation->start(); 711 else 712 xPresentation->rehearseTimings(); 713 } 714 rReq.Ignore (); 715 } 716 break; 717 718 case SID_PRESENTATION_END: 719 { 720 StopSlideShow(true); 721 722 rReq.Ignore (); 723 } 724 break; 725 726 case SID_BEZIER_EDIT: 727 { 728 mpDrawView->SetFrameDragSingles(!mpDrawView->IsFrameDragSingles()); 729 730 /****************************************************************** 731 * ObjectBar einschalten 732 ******************************************************************/ 733 if( dynamic_cast< FuSelection* >( GetCurrentFunction().get() ) || dynamic_cast< FuConstructBezierPolygon* >( GetCurrentFunction().get() ) ) 734 { 735 // Tell the tool bar manager about the context change. 736 GetViewShellBase().GetToolBarManager()->SelectionHasChanged(*this,*mpDrawView); 737 } 738 739 Invalidate(SID_BEZIER_EDIT); 740 rReq.Ignore(); 741 } 742 break; 743 744 case SID_OBJECT_CLOSE: 745 { 746 const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); 747 if ( rMarkList.GetMark(0) && !mpDrawView->IsAction() ) 748 { 749 SdrPathObj* pPathObj = (SdrPathObj*) rMarkList.GetMark(0)->GetMarkedSdrObj(); 750 const bool bUndo = mpDrawView->IsUndoEnabled(); 751 if( bUndo ) 752 mpDrawView->BegUndo(String(SdResId(STR_UNDO_BEZCLOSE))); 753 754 mpDrawView->UnmarkAllPoints(); 755 756 if( bUndo ) 757 mpDrawView->AddUndo(new SdrUndoGeoObj(*pPathObj)); 758 759 pPathObj->ToggleClosed(); 760 761 if( bUndo ) 762 mpDrawView->EndUndo(); 763 } 764 rReq.Done(); 765 } 766 break; 767 768 case SID_CUT: 769 { 770 if ( mpDrawView->IsPresObjSelected(sal_False, sal_True, sal_False, sal_True) ) 771 { 772 ::sd::Window* pWindow = GetActiveWindow(); 773 InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute(); 774 } 775 else 776 { 777 if(HasCurrentFunction()) 778 { 779 GetCurrentFunction()->DoCut(); 780 } 781 else if(mpDrawView) 782 { 783 mpDrawView->DoCut(); 784 } 785 } 786 rReq.Ignore (); 787 } 788 break; 789 790 case SID_COPY: 791 { 792 if ( mpDrawView->IsPresObjSelected(sal_False, sal_True, sal_False, sal_True) ) 793 { 794 ::sd::Window* pWindow = GetActiveWindow(); 795 InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute(); 796 } 797 else 798 { 799 if(HasCurrentFunction()) 800 { 801 GetCurrentFunction()->DoCopy(); 802 } 803 else if( mpDrawView ) 804 { 805 mpDrawView->DoCopy(); 806 } 807 } 808 rReq.Ignore (); 809 } 810 break; 811 812 case SID_PASTE: 813 { 814 WaitObject aWait( (Window*)GetActiveWindow() ); 815 816 if(HasCurrentFunction()) 817 { 818 GetCurrentFunction()->DoPaste(); 819 } 820 else if(mpDrawView) 821 { 822 mpDrawView->DoPaste(); 823 } 824 825 rReq.Ignore (); 826 } 827 break; 828 829 case SID_CLIPBOARD_FORMAT_ITEMS: 830 { 831 WaitObject aWait( (Window*)GetActiveWindow() ); 832 TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( GetActiveWindow() ) ); 833 const SfxItemSet* pReqArgs = rReq.GetArgs(); 834 sal_uInt32 nFormat = 0; 835 836 if( pReqArgs ) 837 { 838 SFX_REQUEST_ARG( rReq, pIsActive, SfxUInt32Item, SID_CLIPBOARD_FORMAT_ITEMS, sal_False ); 839 nFormat = pIsActive->GetValue(); 840 } 841 842 843 if( nFormat && aDataHelper.GetTransferable().is() ) 844 { 845 sal_Int8 nAction = DND_ACTION_COPY; 846 847 if( !mpDrawView->InsertData( aDataHelper, 848 GetActiveWindow()->PixelToLogic( Rectangle( Point(), GetActiveWindow()->GetOutputSizePixel() ).Center() ), 849 nAction, sal_False, nFormat ) ) 850 { 851 INetBookmark aINetBookmark( aEmptyStr, aEmptyStr ); 852 853 if( ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ) && 854 aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK, aINetBookmark ) ) || 855 ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR ) && 856 aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR, aINetBookmark ) ) || 857 ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR ) && 858 aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR, aINetBookmark ) ) ) 859 { 860 InsertURLField( aINetBookmark.GetURL(), aINetBookmark.GetDescription(), aEmptyStr, NULL ); 861 } 862 } 863 } 864 } 865 break; 866 867 case SID_DELETE: 868 { 869 if ( mpDrawView->IsTextEdit() ) 870 { 871 OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView(); 872 873 if (pOLV) 874 { 875 KeyCode aKCode(KEY_DELETE); 876 KeyEvent aKEvt( 0, aKCode); 877 pOLV->PostKeyEvent(aKEvt); 878 } 879 } 880 else if ( mpDrawView->IsPresObjSelected(sal_False, sal_True, sal_False, sal_True) ) 881 { 882 ::sd::Window* pWindow = GetActiveWindow(); 883 InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute(); 884 } 885 else 886 { 887 KeyCode aKCode(KEY_DELETE); 888 KeyEvent aKEvt( 0, aKCode); 889 890 bool bConsumed = mpDrawView && mpDrawView->getSmartTags().KeyInput( aKEvt ); 891 892 if( !bConsumed && HasCurrentFunction() ) 893 bConsumed = GetCurrentFunction()->KeyInput(aKEvt); 894 895 if( !bConsumed && mpDrawView ) 896 mpDrawView->DeleteMarked(); 897 } 898 rReq.Ignore (); 899 } 900 break; 901 902 case SID_NOTESMODE: 903 case SID_HANDOUTMODE: 904 // AutoLayouts have to be ready. 905 GetDoc()->StopWorkStartupDelay(); 906 // Fall through to following case statements. 907 908 case SID_DRAWINGMODE: 909 case SID_DIAMODE: 910 case SID_OUTLINEMODE: 911 // Let the sub-shell manager handle the slot handling. 912 framework::FrameworkHelper::Instance(GetViewShellBase())->HandleModeChangeSlot( 913 nSId, 914 rReq); 915 rReq.Ignore (); 916 break; 917 918 case SID_MASTERPAGE: // BASIC 919 case SID_SLIDE_MASTERPAGE: // BASIC 920 case SID_TITLE_MASTERPAGE: // BASIC 921 case SID_NOTES_MASTERPAGE: // BASIC 922 case SID_HANDOUT_MASTERPAGE: // BASIC 923 { 924 // AutoLayouts muessen fertig sein 925 GetDoc()->StopWorkStartupDelay(); 926 927 const SfxItemSet* pReqArgs = rReq.GetArgs(); 928 929 if ( pReqArgs ) 930 { 931 SFX_REQUEST_ARG (rReq, pIsActive, SfxBoolItem, SID_MASTERPAGE, sal_False); 932 mbIsLayerModeActive = pIsActive->GetValue (); 933 } 934 935 Broadcast ( 936 ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_START)); 937 938 if (nSId == SID_MASTERPAGE || 939 (nSId == SID_SLIDE_MASTERPAGE && mePageKind == PK_STANDARD) || 940 (nSId == SID_TITLE_MASTERPAGE && mePageKind == PK_STANDARD) || 941 (nSId == SID_NOTES_MASTERPAGE && mePageKind == PK_NOTES) || 942 (nSId == SID_HANDOUT_MASTERPAGE && mePageKind == PK_HANDOUT)) 943 { 944 if (nSId == SID_TITLE_MASTERPAGE || 945 nSId == SID_SLIDE_MASTERPAGE) 946 { 947 // Gibt es eine Seite mit dem AutoLayout "Titel"? 948 sal_Bool bFound = sal_False; 949 sal_uInt16 i = 0; 950 sal_uInt16 nCount = GetDoc()->GetSdPageCount(PK_STANDARD); 951 952 while (i < nCount && !bFound) 953 { 954 SdPage* pPage = GetDoc()->GetSdPage(i, PK_STANDARD); 955 956 if (nSId == SID_TITLE_MASTERPAGE && pPage->GetAutoLayout() == AUTOLAYOUT_TITLE) 957 { 958 bFound = sal_True; 959 SwitchPage((pPage->GetPageNum() - 1) / 2); 960 } 961 else if (nSId == SID_SLIDE_MASTERPAGE && pPage->GetAutoLayout() != AUTOLAYOUT_TITLE) 962 { 963 bFound = sal_True; 964 SwitchPage((pPage->GetPageNum() - 1) / 2); 965 } 966 967 i++; 968 } 969 } 970 971 // Default-Layer der MasterPage einschalten 972 mpDrawView->SetActiveLayer( String( SdResId(STR_LAYER_BCKGRNDOBJ) ) ); 973 974 ChangeEditMode(EM_MASTERPAGE, mbIsLayerModeActive); 975 976 if(HasCurrentFunction(SID_BEZIER_EDIT)) 977 GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON); 978 } 979 else 980 { 981 // Switch to requested ViewShell. 982 ::OUString sRequestedView; 983 PageKind ePageKind; 984 switch (nSId) 985 { 986 case SID_SLIDE_MASTERPAGE: 987 case SID_TITLE_MASTERPAGE: 988 default: 989 sRequestedView = framework::FrameworkHelper::msImpressViewURL; 990 ePageKind = PK_STANDARD; 991 break; 992 993 case SID_NOTES_MASTERPAGE: 994 sRequestedView = framework::FrameworkHelper::msNotesViewURL; 995 ePageKind = PK_NOTES; 996 break; 997 998 case SID_HANDOUT_MASTERPAGE: 999 sRequestedView = framework::FrameworkHelper::msHandoutViewURL; 1000 ePageKind = PK_HANDOUT; 1001 break; 1002 } 1003 1004 mpFrameView->SetViewShEditMode(EM_MASTERPAGE, ePageKind); 1005 mpFrameView->SetLayerMode(mbIsLayerModeActive); 1006 framework::FrameworkHelper::Instance(GetViewShellBase())->RequestView( 1007 sRequestedView, 1008 framework::FrameworkHelper::msCenterPaneURL); 1009 } 1010 Broadcast ( 1011 ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_END)); 1012 1013 InvalidateWindows(); 1014 Invalidate(); 1015 1016 rReq.Done(); 1017 } 1018 break; 1019 1020 1021 case SID_CLOSE_MASTER_VIEW: 1022 { 1023 Broadcast ( 1024 ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_START)); 1025 1026 // Switch page back to the first one. Not doing so leads to a 1027 // crash. This seems to be some bug in the edit mode switching 1028 // and page switching methods. 1029 SwitchPage (0); 1030 ChangeEditMode(EM_PAGE, IsLayerModeActive()); 1031 Broadcast ( 1032 ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_END)); 1033 1034 if(HasCurrentFunction(SID_BEZIER_EDIT)) 1035 { 1036 GetViewFrame()->GetDispatcher()->Execute( 1037 SID_OBJECT_SELECT, 1038 SFX_CALLMODE_ASYNCHRON); 1039 } 1040 1041 1042 rReq.Done(); 1043 } 1044 break; 1045 1046 1047 case SID_RULER: 1048 { 1049 const SfxItemSet* pReqArgs = rReq.GetArgs(); 1050 1051 // #97516# Remember old ruler state 1052 sal_Bool bOldHasRuler(HasRuler()); 1053 1054 if ( pReqArgs ) 1055 { 1056 SFX_REQUEST_ARG (rReq, pIsActive, SfxBoolItem, SID_RULER, sal_False); 1057 SetRuler (pIsActive->GetValue ()); 1058 } 1059 else SetRuler (!HasRuler()); 1060 1061 // #97516# Did ruler state change? Tell that to SdOptions, too. 1062 sal_Bool bHasRuler(HasRuler()); 1063 1064 if(bOldHasRuler != bHasRuler) 1065 { 1066 SdOptions* pOptions = SD_MOD()->GetSdOptions(GetDoc()->GetDocumentType()); 1067 1068 if(pOptions && pOptions->IsRulerVisible() != bHasRuler) 1069 { 1070 pOptions->SetRulerVisible(bHasRuler); 1071 } 1072 } 1073 1074 Invalidate (SID_RULER); 1075 Resize(); 1076 rReq.Done (); 1077 } 1078 break; 1079 1080 case SID_SIZE_PAGE: 1081 case SID_SIZE_PAGE_WIDTH: // BASIC 1082 { 1083 mbZoomOnPage = ( rReq.GetSlot() == SID_SIZE_PAGE ); 1084 1085 SdrPageView* pPageView = mpDrawView->GetSdrPageView(); 1086 1087 if ( pPageView ) 1088 { 1089 Point aPagePos(0, 0); // = pPageView->GetOffset(); 1090 Size aPageSize = pPageView->GetPage()->GetSize(); 1091 1092 aPagePos.X() += aPageSize.Width() / 2; 1093 aPageSize.Width() = (long) (aPageSize.Width() * 1.03); 1094 1095 if( rReq.GetSlot() == SID_SIZE_PAGE ) 1096 { 1097 aPagePos.Y() += aPageSize.Height() / 2; 1098 aPageSize.Height() = (long) (aPageSize.Height() * 1.03); 1099 aPagePos.Y() -= aPageSize.Height() / 2; 1100 } 1101 else 1102 { 1103 Point aPt = GetActiveWindow()->PixelToLogic( Point( 0, GetActiveWindow()->GetSizePixel().Height() / 2 ) ); 1104 aPagePos.Y() += aPt.Y(); 1105 aPageSize.Height() = 2; 1106 } 1107 1108 aPagePos.X() -= aPageSize.Width() / 2; 1109 1110 SetZoomRect( Rectangle( aPagePos, aPageSize ) ); 1111 1112 Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( Rectangle( Point(0,0), 1113 GetActiveWindow()->GetOutputSizePixel()) ); 1114 mpZoomList->InsertZoomRect(aVisAreaWin); 1115 } 1116 Invalidate( SID_ZOOM_IN ); 1117 Invalidate( SID_ZOOM_OUT ); 1118 Invalidate( SID_ZOOM_PANNING ); 1119 Invalidate( SID_ZOOM_TOOLBOX ); 1120 rReq.Done (); 1121 } 1122 break; 1123 1124 case SID_SIZE_REAL: // BASIC 1125 { 1126 mbZoomOnPage = sal_False; 1127 SetZoom( 100 ); 1128 Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( Rectangle( Point(0,0), 1129 GetActiveWindow()->GetOutputSizePixel()) ); 1130 mpZoomList->InsertZoomRect(aVisAreaWin); 1131 Invalidate( SID_ZOOM_IN ); 1132 Invalidate( SID_ZOOM_OUT ); 1133 Invalidate( SID_ZOOM_PANNING ); 1134 Invalidate( SID_ZOOM_TOOLBOX ); 1135 rReq.Done (); 1136 } 1137 break; 1138 1139 case SID_ZOOM_IN: // BASIC 1140 { 1141 mbZoomOnPage = sal_False; 1142 SetZoom( Max( (long) ( GetActiveWindow()->GetZoom() / 2 ), (long) GetActiveWindow()->GetMinZoom() ) ); 1143 Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( Rectangle( Point(0,0), 1144 GetActiveWindow()->GetOutputSizePixel()) ); 1145 mpZoomList->InsertZoomRect(aVisAreaWin); 1146 Invalidate( SID_ZOOM_IN ); 1147 Invalidate( SID_ZOOM_OUT ); 1148 Invalidate( SID_ZOOM_PANNING ); 1149 Invalidate( SID_ZOOM_TOOLBOX ); 1150 rReq.Done (); 1151 } 1152 break; 1153 1154 case SID_SIZE_VISAREA: 1155 { 1156 Rectangle aVisArea = mpFrameView->GetVisArea(); 1157 Size aVisAreaSize = aVisArea.GetSize(); 1158 1159 if (aVisAreaSize.Height()!=0 && aVisAreaSize.Width()!=0) 1160 { 1161 mbZoomOnPage = sal_False; 1162 SetZoomRect(aVisArea); 1163 Invalidate( SID_ZOOM_IN ); 1164 Invalidate( SID_ZOOM_OUT ); 1165 Invalidate( SID_ZOOM_PANNING ); 1166 Invalidate( SID_ZOOM_TOOLBOX ); 1167 } 1168 rReq.Done (); 1169 } 1170 break; 1171 1172 // Namensverwirrung: SID_SIZE_OPTIMAL -> Zoom auf selektierte Objekte 1173 // --> Wird als Objektzoom im Programm angeboten 1174 case SID_SIZE_OPTIMAL: // BASIC 1175 { 1176 mbZoomOnPage = sal_False; 1177 if ( mpDrawView->AreObjectsMarked() ) 1178 { 1179 maMarkRect = mpDrawView->GetAllMarkedRect(); 1180 long nW = (long) (maMarkRect.GetWidth() * 1.03); 1181 long nH = (long) (maMarkRect.GetHeight() * 1.03); 1182 Point aPos = maMarkRect.Center(); 1183 aPos.X() -= nW / 2; 1184 aPos.Y() -= nH / 2; 1185 if ( nW && nH ) 1186 { 1187 SetZoomRect(Rectangle(aPos, Size(nW, nH))); 1188 1189 Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( Rectangle( Point(0,0), 1190 GetActiveWindow()->GetOutputSizePixel()) ); 1191 mpZoomList->InsertZoomRect(aVisAreaWin); 1192 } 1193 } 1194 Invalidate( SID_ZOOM_IN ); 1195 Invalidate( SID_ZOOM_OUT ); 1196 Invalidate( SID_ZOOM_PANNING ); 1197 Invalidate( SID_ZOOM_TOOLBOX ); 1198 rReq.Done (); 1199 } 1200 break; 1201 1202 // Namensverwirrung: SID_SIZE_ALL -> Zoom auf alle Objekte 1203 // --> Wird als Optimal im Programm angeboten 1204 case SID_SIZE_ALL: // BASIC 1205 { 1206 mbZoomOnPage = sal_False; 1207 SdrPageView* pPageView = mpDrawView->GetSdrPageView(); 1208 1209 if( pPageView ) 1210 { 1211 Rectangle aBoundRect( pPageView->GetObjList()->GetAllObjBoundRect() ); 1212 1213 long nW = (long) (aBoundRect.GetWidth() * 1.03); 1214 long nH = (long) (aBoundRect.GetHeight() * 1.03); 1215 Point aPos = aBoundRect.Center(); 1216 aPos.X() -= nW / 2; 1217 aPos.Y() -= nH / 2; 1218 if ( nW && nH ) 1219 { 1220 SetZoomRect( Rectangle( aPos, Size( nW, nH ) ) ); 1221 1222 Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( Rectangle( Point(0,0), 1223 GetActiveWindow()->GetOutputSizePixel()) ); 1224 mpZoomList->InsertZoomRect(aVisAreaWin); 1225 } 1226 1227 Invalidate( SID_ZOOM_IN ); 1228 Invalidate( SID_ZOOM_OUT ); 1229 Invalidate( SID_ZOOM_PANNING ); 1230 Invalidate( SID_ZOOM_TOOLBOX ); 1231 } 1232 rReq.Done (); 1233 } 1234 break; 1235 1236 case SID_ZOOM_PREV: 1237 { 1238 if (mpDrawView->IsTextEdit()) 1239 { 1240 mpDrawView->SdrEndTextEdit(); 1241 } 1242 1243 if (mpZoomList->IsPreviousPossible()) 1244 { 1245 // Vorheriges ZoomRect einstellen 1246 SetZoomRect(mpZoomList->GetPreviousZoomRect()); 1247 } 1248 rReq.Done (); 1249 Invalidate( SID_ZOOM_TOOLBOX ); 1250 } 1251 break; 1252 1253 case SID_ZOOM_NEXT: 1254 { 1255 if (mpDrawView->IsTextEdit()) 1256 { 1257 mpDrawView->SdrEndTextEdit(); 1258 } 1259 1260 if (mpZoomList->IsNextPossible()) 1261 { 1262 // Naechstes ZoomRect einstellen 1263 SetZoomRect(mpZoomList->GetNextZoomRect()); 1264 } 1265 rReq.Done (); 1266 Invalidate( SID_ZOOM_TOOLBOX ); 1267 } 1268 break; 1269 1270 case SID_GLUE_INSERT_POINT: 1271 case SID_GLUE_PERCENT: 1272 case SID_GLUE_ESCDIR: 1273 case SID_GLUE_ESCDIR_LEFT: 1274 case SID_GLUE_ESCDIR_RIGHT: 1275 case SID_GLUE_ESCDIR_TOP: 1276 case SID_GLUE_ESCDIR_BOTTOM: 1277 case SID_GLUE_HORZALIGN_CENTER: 1278 case SID_GLUE_HORZALIGN_LEFT: 1279 case SID_GLUE_HORZALIGN_RIGHT: 1280 case SID_GLUE_VERTALIGN_CENTER: 1281 case SID_GLUE_VERTALIGN_TOP: 1282 case SID_GLUE_VERTALIGN_BOTTOM: 1283 { 1284 FunctionReference xFunc( GetCurrentFunction() ); 1285 FuEditGluePoints* pFunc = dynamic_cast< FuEditGluePoints* >( xFunc.get() ); 1286 1287 if(pFunc) 1288 pFunc->ReceiveRequest(rReq); 1289 1290 rReq.Done(); 1291 } 1292 break; 1293 1294 #ifdef DBG_UTIL 1295 case SID_SHOW_ITEMBROWSER: 1296 { 1297 mpDrawView->ShowItemBrowser( !mpDrawView->IsItemBrowserVisible() ); 1298 rReq.Done (); 1299 } 1300 break; 1301 #endif 1302 1303 case SID_AUTOSPELL_CHECK: 1304 { 1305 sal_Bool bOnlineSpell = !GetDoc()->GetOnlineSpell(); 1306 GetDoc()->SetOnlineSpell(bOnlineSpell); 1307 1308 ::Outliner* pOL = mpDrawView->GetTextEditOutliner(); 1309 1310 if (pOL) 1311 { 1312 sal_uLong nCntrl = pOL->GetControlWord(); 1313 1314 if (bOnlineSpell) 1315 nCntrl |= EE_CNTRL_ONLINESPELLING; 1316 else 1317 nCntrl &= ~EE_CNTRL_ONLINESPELLING; 1318 1319 pOL->SetControlWord(nCntrl); 1320 } 1321 1322 GetActiveWindow()->Invalidate(); 1323 rReq.Done (); 1324 } 1325 break; 1326 1327 case SID_CONVERT_TO_1BIT_THRESHOLD: 1328 case SID_CONVERT_TO_1BIT_MATRIX: 1329 case SID_CONVERT_TO_4BIT_GRAYS: 1330 case SID_CONVERT_TO_4BIT_COLORS: 1331 case SID_CONVERT_TO_8BIT_GRAYS: 1332 case SID_CONVERT_TO_8BIT_COLORS: 1333 case SID_CONVERT_TO_24BIT: 1334 { 1335 BmpConversion eBmpConvert = BMP_CONVERSION_NONE; 1336 1337 switch( nSId ) 1338 { 1339 case SID_CONVERT_TO_1BIT_THRESHOLD: 1340 eBmpConvert = BMP_CONVERSION_1BIT_THRESHOLD; 1341 break; 1342 1343 case SID_CONVERT_TO_1BIT_MATRIX: 1344 eBmpConvert = BMP_CONVERSION_1BIT_MATRIX; 1345 break; 1346 1347 case SID_CONVERT_TO_4BIT_GRAYS: 1348 eBmpConvert = BMP_CONVERSION_4BIT_GREYS; 1349 break; 1350 1351 case SID_CONVERT_TO_4BIT_COLORS: 1352 eBmpConvert = BMP_CONVERSION_4BIT_COLORS; 1353 break; 1354 1355 case SID_CONVERT_TO_8BIT_GRAYS: 1356 eBmpConvert = BMP_CONVERSION_8BIT_GREYS; 1357 break; 1358 1359 case SID_CONVERT_TO_8BIT_COLORS: 1360 eBmpConvert = BMP_CONVERSION_8BIT_COLORS; 1361 break; 1362 1363 case SID_CONVERT_TO_24BIT: 1364 eBmpConvert = BMP_CONVERSION_24BIT; 1365 break; 1366 } 1367 1368 mpDrawView->BegUndo(String(SdResId(STR_UNDO_COLORRESOLUTION))); 1369 const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList(); 1370 1371 for (sal_uLong i=0; i<rMarkList.GetMarkCount(); i++) 1372 { 1373 SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj(); 1374 1375 if (pObj->GetObjInventor() == SdrInventor) 1376 { 1377 if (pObj->GetObjIdentifier() == OBJ_GRAF && !((SdrGrafObj*) pObj)->IsLinkedGraphic()) 1378 { 1379 const Graphic& rGraphic = ((SdrGrafObj*) pObj)->GetGraphic(); 1380 1381 if( rGraphic.GetType() == GRAPHIC_BITMAP ) 1382 { 1383 SdrGrafObj* pNewObj = (SdrGrafObj*) pObj->Clone(); 1384 1385 if( rGraphic.IsAnimated() ) 1386 { 1387 Animation aAnim( rGraphic.GetAnimation() ); 1388 aAnim.Convert( eBmpConvert ); 1389 pNewObj->SetGraphic( aAnim ); 1390 } 1391 else 1392 { 1393 BitmapEx aBmpEx( rGraphic.GetBitmapEx() ); 1394 aBmpEx.Convert( eBmpConvert ); 1395 pNewObj->SetGraphic( aBmpEx ); 1396 } 1397 1398 mpDrawView->ReplaceObjectAtView( pObj, *mpDrawView->GetSdrPageView(), pNewObj ); 1399 } 1400 } 1401 } 1402 } 1403 1404 mpDrawView->EndUndo(); 1405 rReq.Done (); 1406 } 1407 break; 1408 1409 case SID_TRANSLITERATE_SENTENCE_CASE: 1410 case SID_TRANSLITERATE_TITLE_CASE: 1411 case SID_TRANSLITERATE_TOGGLE_CASE: 1412 case SID_TRANSLITERATE_UPPER: 1413 case SID_TRANSLITERATE_LOWER: 1414 case SID_TRANSLITERATE_HALFWIDTH: 1415 case SID_TRANSLITERATE_FULLWIDTH: 1416 case SID_TRANSLITERATE_HIRAGANA: 1417 case SID_TRANSLITERATE_KATAGANA: 1418 { 1419 OutlinerView* pOLV = GetView()->GetTextEditOutlinerView(); 1420 if( pOLV ) 1421 { 1422 using namespace ::com::sun::star::i18n; 1423 sal_Int32 nType = 0; 1424 1425 switch( nSId ) 1426 { 1427 case SID_TRANSLITERATE_SENTENCE_CASE: 1428 nType = TransliterationModulesExtra::SENTENCE_CASE; 1429 break; 1430 case SID_TRANSLITERATE_TITLE_CASE: 1431 nType = TransliterationModulesExtra::TITLE_CASE; 1432 break; 1433 case SID_TRANSLITERATE_TOGGLE_CASE: 1434 nType = TransliterationModulesExtra::TOGGLE_CASE; 1435 break; 1436 case SID_TRANSLITERATE_UPPER: 1437 nType = TransliterationModules_LOWERCASE_UPPERCASE; 1438 break; 1439 case SID_TRANSLITERATE_LOWER: 1440 nType = TransliterationModules_UPPERCASE_LOWERCASE; 1441 break; 1442 case SID_TRANSLITERATE_HALFWIDTH: 1443 nType = TransliterationModules_FULLWIDTH_HALFWIDTH; 1444 break; 1445 case SID_TRANSLITERATE_FULLWIDTH: 1446 nType = TransliterationModules_HALFWIDTH_FULLWIDTH; 1447 break; 1448 case SID_TRANSLITERATE_HIRAGANA: 1449 nType = TransliterationModules_KATAKANA_HIRAGANA; 1450 break; 1451 case SID_TRANSLITERATE_KATAGANA: 1452 nType = TransliterationModules_HIRAGANA_KATAKANA; 1453 break; 1454 } 1455 1456 pOLV->TransliterateText( nType ); 1457 } 1458 1459 rReq.Done(); 1460 } 1461 break; 1462 1463 // #UndoRedo# 1464 case SID_UNDO : 1465 { 1466 // #96090# moved implementation to BaseClass 1467 ImpSidUndo(sal_True, rReq); 1468 } 1469 break; 1470 case SID_REDO : 1471 { 1472 // #96090# moved implementation to BaseClass 1473 ImpSidRedo(sal_True, rReq); 1474 } 1475 break; 1476 1477 case SID_PRESENTATION_MINIMIZER: 1478 { 1479 if ( GetDoc()->GetDocumentType() == DOCUMENT_TYPE_IMPRESS && 1480 GetViewShellBase().GetController() != NULL ) 1481 { 1482 try 1483 { 1484 uno::Reference< uno::XComponentContext > xContext( 1485 ::comphelper::getProcessComponentContext() ); 1486 uno::Sequence< uno::Any > aArgs(1); 1487 aArgs[0] <<= GetViewShellBase().GetController(); 1488 1489 uno::Reference< XExecutableDialog > xDialog( 1490 xContext->getServiceManager()-> 1491 createInstanceWithArgumentsAndContext( 1492 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 1493 "com.sun.star.ui.dialogs.PresentationMinimizerDialog")), 1494 aArgs, xContext), uno::UNO_QUERY_THROW ); 1495 xDialog->execute(); 1496 } 1497 catch (...) 1498 {} 1499 } 1500 1501 rReq.Done(); 1502 } 1503 break; 1504 1505 default: 1506 break; 1507 } 1508 } 1509 1510 /************************************************************************* 1511 |* 1512 |* URL-Feld einfuegen 1513 |* 1514 \************************************************************************/ 1515 1516 void DrawViewShell::InsertURLField(const String& rURL, const String& rText, 1517 const String& rTarget, const Point* pPos) 1518 { 1519 OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView(); 1520 1521 if (pOLV) 1522 { 1523 ESelection aSel( pOLV->GetSelection() ); 1524 SvxFieldItem aURLItem( SvxURLField( rURL, rText, SVXURLFORMAT_REPR ), EE_FEATURE_FIELD ); 1525 pOLV->InsertField( aURLItem ); 1526 if ( aSel.nStartPos <= aSel.nEndPos ) 1527 aSel.nEndPos = aSel.nStartPos + 1; 1528 else 1529 aSel.nStartPos = aSel.nEndPos + 1; 1530 pOLV->SetSelection( aSel ); 1531 } 1532 else 1533 { 1534 Outliner* pOutl = GetDoc()->GetInternalOutliner(); 1535 pOutl->Init( OUTLINERMODE_TEXTOBJECT ); 1536 sal_uInt16 nOutlMode = pOutl->GetMode(); 1537 1538 SvxURLField aURLField(rURL, rText, SVXURLFORMAT_REPR); 1539 aURLField.SetTargetFrame(rTarget); 1540 SvxFieldItem aURLItem(aURLField, EE_FEATURE_FIELD); 1541 pOutl->QuickInsertField( aURLItem, ESelection() ); 1542 OutlinerParaObject* pOutlParaObject = pOutl->CreateParaObject(); 1543 1544 SdrRectObj* pRectObj = new SdrRectObj(OBJ_TEXT); 1545 1546 pOutl->UpdateFields(); 1547 pOutl->SetUpdateMode( sal_True ); 1548 Size aSize(pOutl->CalcTextSize()); 1549 pOutl->SetUpdateMode( sal_False ); 1550 1551 Point aPos; 1552 1553 if (pPos) 1554 { 1555 aPos = *pPos; 1556 } 1557 else 1558 { 1559 Rectangle aRect(aPos, GetActiveWindow()->GetOutputSizePixel() ); 1560 aPos = aRect.Center(); 1561 aPos = GetActiveWindow()->PixelToLogic(aPos); 1562 aPos.X() -= aSize.Width() / 2; 1563 aPos.Y() -= aSize.Height() / 2; 1564 } 1565 1566 Rectangle aLogicRect(aPos, aSize); 1567 pRectObj->SetLogicRect(aLogicRect); 1568 pRectObj->SetOutlinerParaObject( pOutlParaObject ); 1569 mpDrawView->InsertObjectAtView(pRectObj, *mpDrawView->GetSdrPageView()); 1570 pOutl->Init( nOutlMode ); 1571 } 1572 } 1573 1574 /************************************************************************* 1575 |* 1576 |* URL-Button einfuegen 1577 |* 1578 \************************************************************************/ 1579 1580 void DrawViewShell::InsertURLButton(const String& rURL, const String& rText, 1581 const String& rTarget, const Point* pPos) 1582 { 1583 sal_Bool bNewObj = sal_True; 1584 1585 const OUString sTargetURL( ::URIHelper::SmartRel2Abs( INetURLObject( GetDocSh()->GetMedium()->GetBaseURL() ), rURL, URIHelper::GetMaybeFileHdl(), true, false, 1586 INetURLObject::WAS_ENCODED, 1587 INetURLObject::DECODE_UNAMBIGUOUS ) ); 1588 if (mpDrawView->GetMarkedObjectList().GetMarkCount() > 0) 1589 { 1590 SdrObject* pMarkedObj = mpDrawView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj(); 1591 if( pMarkedObj ) try 1592 { 1593 // change first marked object 1594 if( (FmFormInventor == pMarkedObj->GetObjInventor() && pMarkedObj->GetObjIdentifier() == OBJ_FM_BUTTON) ) 1595 { 1596 bNewObj = sal_False; 1597 1598 SdrUnoObj* pUnoCtrl = static_cast< SdrUnoObj* >( pMarkedObj ); 1599 1600 Reference< awt::XControlModel > xControlModel( pUnoCtrl->GetUnoControlModel(), UNO_QUERY_THROW ); 1601 Reference< beans::XPropertySet > xPropSet( xControlModel, UNO_QUERY_THROW ); 1602 1603 xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Label" )), Any( OUString( rText ) ) ); 1604 xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TargetURL" )), Any( sTargetURL ) ); 1605 1606 if( rTarget.Len() ) 1607 xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TargetFrame" )), Any( OUString( rTarget ) ) ); 1608 1609 xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "ButtonType" )), Any( form::FormButtonType_URL ) ); 1610 if ( ::avmedia::MediaWindow::isMediaURL( rURL ) ) 1611 { 1612 // #105638# OJ 1613 xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "DispatchURLInternal" )), Any( sal_True ) ); 1614 } 1615 } 1616 else 1617 { 1618 // add url as interaction for first selected shape 1619 bNewObj = sal_False; 1620 1621 SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pMarkedObj, true); 1622 pInfo->meClickAction = presentation::ClickAction_DOCUMENT; 1623 pInfo->SetBookmark( sTargetURL ); 1624 } 1625 } 1626 catch( uno::Exception& ) 1627 { 1628 } 1629 } 1630 1631 if (bNewObj) try 1632 { 1633 SdrUnoObj* pUnoCtrl = static_cast< SdrUnoObj* >( SdrObjFactory::MakeNewObject(FmFormInventor, OBJ_FM_BUTTON, 1634 mpDrawView->GetSdrPageView()->GetPage(), GetDoc()) ); 1635 1636 Reference< awt::XControlModel > xControlModel( pUnoCtrl->GetUnoControlModel(), uno::UNO_QUERY_THROW ); 1637 Reference< beans::XPropertySet > xPropSet( xControlModel, uno::UNO_QUERY_THROW ); 1638 1639 xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Label" )), Any( OUString( rText ) ) ); 1640 xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TargetURL" )), Any( sTargetURL ) ); 1641 1642 if( rTarget.Len() ) 1643 xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TargetFrame" )), Any( OUString( rTarget ) ) ); 1644 1645 xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "ButtonType" )), Any( form::FormButtonType_URL ) ); 1646 // #105638# OJ 1647 if ( ::avmedia::MediaWindow::isMediaURL( rURL ) ) 1648 xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "DispatchURLInternal" )), Any( sal_True ) ); 1649 1650 Point aPos; 1651 1652 if (pPos) 1653 { 1654 aPos = *pPos; 1655 } 1656 else 1657 { 1658 aPos = Rectangle(aPos, GetActiveWindow()->GetOutputSizePixel()).Center(); 1659 aPos = GetActiveWindow()->PixelToLogic(aPos); 1660 } 1661 1662 Size aSize(4000, 1000); 1663 aPos.X() -= aSize.Width() / 2; 1664 aPos.Y() -= aSize.Height() / 2; 1665 pUnoCtrl->SetLogicRect(Rectangle(aPos, aSize)); 1666 1667 sal_uLong nOptions = SDRINSERT_SETDEFLAYER; 1668 1669 OSL_ASSERT (GetViewShell()!=NULL); 1670 SfxInPlaceClient* pIpClient = GetViewShell()->GetIPClient(); 1671 if (pIpClient!=NULL && pIpClient->IsObjectInPlaceActive()) 1672 { 1673 nOptions |= SDRINSERT_DONTMARK; 1674 } 1675 1676 mpDrawView->InsertObjectAtView(pUnoCtrl, *mpDrawView->GetSdrPageView(), nOptions); 1677 } 1678 catch( Exception& ) 1679 { 1680 } 1681 } 1682 1683 /************************************************************************* 1684 |* 1685 |* 1686 |* 1687 \************************************************************************/ 1688 1689 void DrawViewShell::ShowUIControls (bool bVisible) 1690 { 1691 ViewShell::ShowUIControls (bVisible); 1692 1693 //AF: The LayerDialogChildWindow is not used anymore (I hope). 1694 // GetViewFrame()->SetChildWindow( 1695 // LayerDialogChildWindow::GetChildWindowId(), 1696 // IsLayerModeActive() && bVisible); 1697 maTabControl.Show (bVisible); 1698 } 1699 1700 void DrawViewShell::StopSlideShow (bool /*bCloseFrame*/) 1701 { 1702 Reference< XPresentation2 > xPresentation( GetDoc()->getPresentation() ); 1703 if(xPresentation.is() && xPresentation->isRunning()) 1704 { 1705 if( mpDrawView->IsTextEdit() ) 1706 mpDrawView->SdrEndTextEdit(); 1707 1708 xPresentation->end(); 1709 } 1710 } 1711 1712 #ifdef _MSC_VER 1713 #pragma optimize ( "", on ) 1714 #endif 1715 1716 } // end of namespace sd 1717