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