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 28 #include "fusel.hxx" 29 #include <vos/process.hxx> 30 #include <basic/sbstar.hxx> 31 #include <svx/svdpagv.hxx> 32 #include <svx/svdogrp.hxx> 33 #include <svx/polysc3d.hxx> 34 #include "drawview.hxx" 35 #include <svtools/imapobj.hxx> 36 #include <svl/urihelper.hxx> 37 #include <unotools/localfilehelper.hxx> 38 #include <svx/svxids.hrc> 39 #include <svx/xfillit0.hxx> 40 #include <sfx2/app.hxx> 41 #include <sfx2/viewfrm.hxx> 42 #include <svl/aeitem.hxx> 43 #include <svl/stritem.hxx> 44 #include <svl/intitem.hxx> 45 #include <sfx2/dispatch.hxx> 46 #include <tools/urlobj.hxx> 47 #include <sfx2/docfile.hxx> 48 #include <tools/debug.hxx> 49 #include <editeng/eeitem.hxx> 50 #include <editeng/flditem.hxx> 51 52 #include <svx/svdotable.hxx> 53 54 #include "app.hrc" 55 #include "strings.hrc" 56 #include "res_bmp.hrc" 57 #include "GraphicDocShell.hxx" 58 #include "app.hxx" 59 #include "DrawDocShell.hxx" 60 #include "stlpool.hxx" 61 #include "anmdef.hxx" 62 #include "anminfo.hxx" 63 #include "fudraw.hxx" 64 #include "ViewShell.hxx" 65 #include "ViewShellBase.hxx" 66 #ifndef SD_FRAMW_VIEW_HXX 67 #include "FrameView.hxx" 68 #endif 69 #include "View.hxx" 70 #ifndef SD_WINDOW_SHELL_HXX 71 #include "Window.hxx" 72 #endif 73 #include "drawdoc.hxx" 74 #include "sdpage.hxx" 75 #include "DrawViewShell.hxx" 76 #include "ToolBarManager.hxx" 77 #include "pgjump.hxx" 78 #include <svx/globl3d.hxx> 79 #include "Client.hxx" 80 81 #include "slideshow.hxx" 82 83 // #108981# 84 #include <svx/svdundo.hxx> 85 #include <avmedia/mediawindow.hxx> 86 87 #include <svx/sdrhittesthelper.hxx> 88 89 using namespace ::com::sun::star; 90 91 namespace sd { 92 93 TYPEINIT1( FuSelection, FuDraw ); 94 95 /************************************************************************* 96 |* 97 |* Konstruktor 98 |* 99 \************************************************************************/ 100 101 FuSelection::FuSelection ( 102 ViewShell* pViewSh, 103 ::sd::Window* pWin, 104 ::sd::View* pView, 105 SdDrawDocument* pDoc, 106 SfxRequest& rReq) 107 : FuDraw(pViewSh, pWin, pView, pDoc, rReq), 108 bTempRotation(sal_False), 109 bSelectionChanged(sal_False), 110 bHideAndAnimate(sal_False), 111 pHdl(NULL), 112 bSuppressChangesOfSelection(sal_False), 113 bMirrorSide0(sal_False), 114 nEditMode(SID_BEZIER_MOVE), 115 pWaterCanCandidate(NULL) 116 { 117 } 118 119 FunctionReference FuSelection::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) 120 { 121 FunctionReference xFunc( new FuSelection( pViewSh, pWin, pView, pDoc, rReq ) ); 122 xFunc->DoExecute(rReq); 123 return xFunc; 124 } 125 126 void FuSelection::DoExecute( SfxRequest& rReq ) 127 { 128 FuDraw::DoExecute( rReq ); 129 130 // Objektbar auswaehlen 131 SelectionHasChanged(); 132 } 133 134 /************************************************************************* 135 |* 136 |* Destruktor 137 |* 138 \************************************************************************/ 139 140 FuSelection::~FuSelection() 141 { 142 mpView->UnmarkAllPoints(); 143 mpView->ResetCreationActive(); 144 145 if ( mpView->GetDragMode() != SDRDRAG_MOVE ) 146 { 147 mpView->SetDragMode(SDRDRAG_MOVE); 148 } 149 } 150 151 /************************************************************************* 152 |* 153 |* MouseButtonDown-event 154 |* 155 \************************************************************************/ 156 157 sal_Bool FuSelection::MouseButtonDown(const MouseEvent& rMEvt) 158 { 159 // Hack fuer #?????# 160 bHideAndAnimate = sal_False; 161 162 pHdl = NULL; 163 sal_Bool bReturn = FuDraw::MouseButtonDown(rMEvt); 164 sal_Bool bWaterCan = SD_MOD()->GetWaterCan(); 165 const bool bReadOnly = mpDocSh->IsReadOnly(); 166 // When the right mouse button is pressed then only select objects 167 // (and deselect others) as a preparation for showing the context 168 // menu. 169 const bool bSelectionOnly = rMEvt.IsRight(); 170 171 bMBDown = sal_True; 172 bSelectionChanged = sal_False; 173 174 if ( mpView->IsAction() ) 175 { 176 if ( rMEvt.IsRight() ) 177 mpView->BckAction(); 178 return sal_True; 179 } 180 181 sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() ); 182 sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); 183 184 // The following code is executed for right clicks as well as for left 185 // clicks in order to modify the selection for the right button as a 186 // preparation for the context menu. The functions BegMarkObject() and 187 // BegDragObject(), however, are not called for right clicks because a) 188 // it makes no sense and b) to have IsAction() return sal_False when called 189 // from Command() which is a prerequisite for the context menu. 190 if ((rMEvt.IsLeft() || rMEvt.IsRight()) 191 && !mpView->IsAction() 192 && (mpView->IsFrameDragSingles() || !mpView->HasMarkablePoints())) 193 { 194 /****************************************************************** 195 * KEIN BEZIER_EDITOR 196 ******************************************************************/ 197 mpWindow->CaptureMouse(); 198 pHdl = mpView->PickHandle(aMDPos); 199 SdrObject* pObj; 200 SdrPageView* pPV; 201 202 long nAngle0 = GetAngle(aMDPos - mpView->GetRef1()); 203 nAngle0 -= 27000; 204 nAngle0 = NormAngle360(nAngle0); 205 bMirrorSide0 = sal_Bool (nAngle0 < 18000L); 206 207 if (!pHdl && mpView->Is3DRotationCreationActive()) 208 { 209 /****************************************************************** 210 * Wenn 3D-Rotationskoerper erstellt werden sollen, jetzt 211 * die Erstellung beenden 212 ******************************************************************/ 213 bSuppressChangesOfSelection = sal_True; 214 if(mpWindow) 215 mpWindow->EnterWait(); 216 mpView->End3DCreation(); 217 bSuppressChangesOfSelection = sal_False; 218 mpView->ResetCreationActive(); 219 if(mpWindow) 220 mpWindow->LeaveWait(); 221 } 222 223 sal_Bool bTextEdit = sal_False; 224 SdrViewEvent aVEvt; 225 SdrHitKind eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt); 226 227 if ( eHit == SDRHIT_TEXTEDITOBJ && ( mpViewShell->GetFrameView()->IsQuickEdit() || dynamic_cast< sdr::table::SdrTableObj* >( aVEvt.pObj ) != NULL ) ) 228 { 229 bTextEdit = sal_True; 230 } 231 232 if(!bTextEdit 233 && !mpDocSh->IsReadOnly() 234 && ((mpView->IsMarkedHit(aMDPos, nHitLog) && !rMEvt.IsShift() && !rMEvt.IsMod2()) || pHdl != NULL) 235 && (rMEvt.GetClicks() != 2) 236 ) 237 { 238 if (!pHdl && mpView->Is3DRotationCreationActive()) 239 { 240 // Wechsel Rotationskoerper -> Selektion 241 mpView->ResetCreationActive(); 242 } 243 else if (bWaterCan) 244 { 245 // Remember the selected object for proper handling in 246 // MouseButtonUp(). 247 pWaterCanCandidate = pickObject (aMDPos); 248 } 249 else 250 { 251 // Handle oder markiertes Objekt getroffen 252 bFirstMouseMove = sal_True; 253 aDragTimer.Start(); 254 } 255 256 if ( ! rMEvt.IsRight()) 257 mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl, nDrgLog); 258 bReturn = sal_True; 259 } 260 else 261 { 262 if (!rMEvt.IsMod2() && mpView->PickObj(aMDPos, mpView->getHitTolLog(), pObj, pPV, SDRSEARCH_PICKMACRO)) 263 { 264 mpView->BegMacroObj(aMDPos, nHitLog, pObj, pPV, mpWindow); 265 bReturn = sal_True; 266 } 267 else if ( bTextEdit ) 268 { 269 sal_uInt16 nSdrObjKind = aVEvt.pObj->GetObjIdentifier(); 270 271 if (aVEvt.pObj->GetObjInventor() == SdrInventor && 272 (nSdrObjKind == OBJ_TEXT || 273 nSdrObjKind == OBJ_TITLETEXT || 274 nSdrObjKind == OBJ_OUTLINETEXT || 275 !aVEvt.pObj->IsEmptyPresObj())) 276 { 277 // Seamless Editing: Verzweigen zur Texteingabe 278 if (!rMEvt.IsShift()) 279 mpView->UnmarkAll(); 280 281 SfxUInt16Item aItem(SID_TEXTEDIT, 1); 282 mpViewShell->GetViewFrame()->GetDispatcher()-> 283 Execute(SID_TEXTEDIT, SFX_CALLMODE_SYNCHRON | 284 SFX_CALLMODE_RECORD, &aItem, 0L); 285 return bReturn; // VORSICHT, durch den synchronen Slot ist das objekt jetzt geloescht 286 } 287 } 288 else if ( !rMEvt.IsMod2() && rMEvt.GetClicks() == 1 && 289 aVEvt.eEvent == SDREVENT_EXECUTEURL ) 290 { 291 mpWindow->ReleaseMouse(); 292 SfxStringItem aStrItem(SID_FILE_NAME, aVEvt.pURLField->GetURL()); 293 SfxStringItem aReferer(SID_REFERER, mpDocSh->GetMedium()->GetName()); 294 SfxBoolItem aBrowseItem( SID_BROWSE, sal_True ); 295 SfxViewFrame* pFrame = mpViewShell->GetViewFrame(); 296 mpWindow->ReleaseMouse(); 297 298 if (rMEvt.IsMod1()) 299 { 300 // Im neuen Frame oeffnen 301 pFrame->GetDispatcher()->Execute(SID_OPENDOC, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, 302 &aStrItem, &aBrowseItem, &aReferer, 0L); 303 } 304 else 305 { 306 // Im aktuellen Frame oeffnen 307 SfxFrameItem aFrameItem(SID_DOCFRAME, pFrame); 308 pFrame->GetDispatcher()->Execute(SID_OPENDOC, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, 309 &aStrItem, &aFrameItem, &aBrowseItem, &aReferer, 0L); 310 } 311 312 bReturn = sal_True; 313 } 314 else if(!rMEvt.IsMod2() 315 && mpViewShell->ISA(DrawViewShell) 316 ) 317 { 318 if(mpView->PickObj(aMDPos, mpView->getHitTolLog(), pObj, pPV, SDRSEARCH_ALSOONMASTER)) 319 { 320 // Animate object when not just selecting. 321 if ( ! bSelectionOnly) 322 bReturn = AnimateObj(pObj, aMDPos); 323 324 if (!bReturn && (pObj->ISA(SdrObjGroup) || pObj->ISA(E3dPolyScene))) 325 { 326 if(rMEvt.GetClicks() == 1) 327 { 328 // In die Gruppe hineinschauen 329 if (mpView->PickObj(aMDPos, mpView->getHitTolLog(), pObj, pPV, SDRSEARCH_ALSOONMASTER | SDRSEARCH_DEEP)) 330 bReturn = AnimateObj(pObj, aMDPos); 331 } 332 else if( !bReadOnly && rMEvt.GetClicks() == 2) 333 { 334 // Neu: Doppelklick auf selektiertes Gruppenobjekt 335 // Gruppe betreten 336 if ( ! bSelectionOnly 337 && pObj 338 && pObj->GetPage() == pPV->GetPage()) 339 bReturn = pPV->EnterGroup(pObj); 340 } 341 } 342 } 343 344 // #i71727# replaced else here with two possibilities, once the original else (!pObj) 345 // and also ignoring the found object when it's on a masterpage 346 if(!pObj || (pObj->GetPage() && pObj->GetPage()->IsMasterPage())) 347 { 348 if(mpView->IsGroupEntered() && 2 == rMEvt.GetClicks()) 349 { 350 // New: double click on empty space/on obj on MasterPage, leave group 351 mpView->LeaveOneGroup(); 352 bReturn = sal_True; 353 } 354 } 355 } 356 357 if (!bReturn) 358 { 359 if (bWaterCan) 360 { 361 if ( ! (rMEvt.IsShift() || rMEvt.IsMod2())) 362 { 363 // Find the object under the current mouse position 364 // and store it for the MouseButtonUp() method to 365 // evaluate. 366 pWaterCanCandidate = pickObject (aMDPos); 367 } 368 } 369 else 370 { 371 bReturn = sal_True; 372 sal_Bool bDeactivateOLE = sal_False; 373 374 if ( !rMEvt.IsShift() && !rMEvt.IsMod2() ) 375 { 376 OSL_ASSERT (mpViewShell->GetViewShell()!=NULL); 377 Client* pIPClient = static_cast<Client*>( 378 mpViewShell->GetViewShell()->GetIPClient()); 379 380 if (pIPClient && pIPClient->IsObjectInPlaceActive()) 381 { 382 // OLE-Objekt wird im nachfolgenden UnmarkAll() deaktiviert 383 bDeactivateOLE = sal_True; 384 } 385 386 mpView->UnmarkAll(); 387 } 388 389 sal_Bool bMarked = sal_False; 390 391 if ( !rMEvt.IsMod1() && !bDeactivateOLE) 392 { 393 if ( rMEvt.IsMod2() ) 394 { 395 bMarked = mpView->MarkNextObj(aMDPos, nHitLog, rMEvt.IsShift() ); 396 } 397 else 398 { 399 sal_Bool bToggle = sal_False; 400 401 if (rMEvt.IsShift() && mpView->GetMarkedObjectList().GetMarkCount() > 1) 402 { 403 // Bei Einfachselektion kein Toggle 404 bToggle = sal_True; 405 } 406 407 bMarked = mpView->MarkObj(aMDPos, nHitLog, bToggle, sal_False); 408 } 409 } 410 411 if( !bDeactivateOLE ) 412 { 413 if ( !bReadOnly && 414 bMarked && 415 (!rMEvt.IsShift() || mpView->IsMarkedHit(aMDPos, nHitLog))) 416 { 417 /********************************************************** 418 * Objekt verschieben 419 **********************************************************/ 420 aDragTimer.Start(); 421 422 pHdl=mpView->PickHandle(aMDPos); 423 if ( ! rMEvt.IsRight()) 424 mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl, nDrgLog); 425 } 426 else 427 { 428 /********************************************************** 429 * Objekt selektieren 430 **********************************************************/ 431 if ( ! rMEvt.IsRight()) 432 mpView->BegMarkObj(aMDPos); 433 } 434 } 435 436 if( bMarked && bTempRotation && (nSlotId == SID_OBJECT_ROTATE) && !rMEvt.IsShift() && (rMEvt.GetClicks() != 2) ) 437 { 438 nSlotId = SID_OBJECT_SELECT; 439 Activate(); 440 } 441 } 442 } 443 } 444 } 445 else if ( !bReadOnly 446 && (rMEvt.IsLeft() || rMEvt.IsRight()) 447 && !mpView->IsAction()) 448 { 449 /********************************************************************** 450 * BEZIER-EDITOR 451 **********************************************************************/ 452 mpWindow->CaptureMouse(); 453 SdrViewEvent aVEvt; 454 SdrHitKind eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt); 455 456 if (eHit == SDRHIT_HANDLE && aVEvt.pHdl->GetKind() == HDL_BWGT) 457 { 458 /****************************************************************** 459 * Handle draggen 460 ******************************************************************/ 461 if ( ! rMEvt.IsRight()) 462 mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, aVEvt.pHdl, nDrgLog); 463 } 464 else if (eHit == SDRHIT_MARKEDOBJECT && nEditMode == SID_BEZIER_INSERT) 465 { 466 /****************************************************************** 467 * Klebepunkt einfuegen 468 ******************************************************************/ 469 mpView->BegInsObjPoint(aMDPos, rMEvt.IsMod1()); 470 } 471 else if (eHit == SDRHIT_MARKEDOBJECT && rMEvt.IsMod1()) 472 { 473 /****************************************************************** 474 * Klebepunkt selektieren 475 ******************************************************************/ 476 if (!rMEvt.IsShift()) 477 mpView->UnmarkAllPoints(); 478 479 if ( ! rMEvt.IsRight()) 480 mpView->BegMarkPoints(aMDPos); 481 } 482 else if (eHit == SDRHIT_MARKEDOBJECT && !rMEvt.IsShift() && !rMEvt.IsMod2()) 483 { 484 /****************************************************************** 485 * Objekt verschieben 486 ******************************************************************/ 487 if ( ! rMEvt.IsRight()) 488 mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, NULL, nDrgLog); 489 } 490 else if (eHit == SDRHIT_HANDLE) 491 { 492 /****************************************************************** 493 * Klebepunkt selektieren 494 ******************************************************************/ 495 if (!mpView->IsPointMarked(*aVEvt.pHdl) || rMEvt.IsShift()) 496 { 497 if (!rMEvt.IsShift()) 498 { 499 mpView->UnmarkAllPoints(); 500 pHdl = mpView->PickHandle(aMDPos); 501 } 502 else 503 { 504 if (mpView->IsPointMarked(*aVEvt.pHdl)) 505 { 506 mpView->UnmarkPoint(*aVEvt.pHdl); 507 pHdl = NULL; 508 } 509 else 510 { 511 pHdl = mpView->PickHandle(aMDPos); 512 } 513 } 514 515 if (pHdl) 516 { 517 mpView->MarkPoint(*pHdl); 518 if ( ! rMEvt.IsRight()) 519 mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl, nDrgLog); 520 } 521 } 522 else 523 { 524 // #90239# point IS marked and NO shift is pressed. Start 525 // dragging of selected point(s) 526 pHdl = mpView->PickHandle(aMDPos); 527 if(pHdl) 528 if ( ! rMEvt.IsRight()) 529 mpView->BegDragObj(aMDPos, (OutputDevice*)NULL, pHdl, nDrgLog); 530 } 531 } 532 else 533 { 534 /****************************************************************** 535 * Objekt selektieren oder draggen 536 ******************************************************************/ 537 if (!rMEvt.IsShift() && !rMEvt.IsMod2() && eHit == SDRHIT_UNMARKEDOBJECT) 538 { 539 mpView->UnmarkAllObj(); 540 } 541 542 sal_Bool bMarked = sal_False; 543 544 if (!rMEvt.IsMod1()) 545 { 546 if (rMEvt.IsMod2()) 547 { 548 bMarked = mpView->MarkNextObj(aMDPos, nHitLog, rMEvt.IsShift()); 549 } 550 else 551 { 552 bMarked = mpView->MarkObj(aMDPos, nHitLog, rMEvt.IsShift(), sal_False); 553 } 554 } 555 556 if (bMarked && 557 (!rMEvt.IsShift() || eHit == SDRHIT_MARKEDOBJECT)) 558 { 559 // Objekt verschieben 560 if ( ! rMEvt.IsRight()) 561 mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, aVEvt.pHdl, nDrgLog); 562 } 563 else if (mpView->AreObjectsMarked()) 564 { 565 /************************************************************** 566 * Klebepunkt selektieren 567 **************************************************************/ 568 if (!rMEvt.IsShift()) 569 mpView->UnmarkAllPoints(); 570 571 if ( ! rMEvt.IsRight()) 572 mpView->BegMarkPoints(aMDPos); 573 } 574 else 575 { 576 /************************************************************** 577 * Objekt selektieren 578 **************************************************************/ 579 if ( ! rMEvt.IsRight()) 580 mpView->BegMarkObj(aMDPos); 581 } 582 583 ForcePointer(&rMEvt); 584 } 585 } 586 587 if (!bIsInDragMode) 588 { 589 ForcePointer(&rMEvt); 590 } 591 592 return bReturn; 593 } 594 595 /************************************************************************* 596 |* 597 |* MouseMove-event 598 |* 599 \************************************************************************/ 600 601 sal_Bool FuSelection::MouseMove(const MouseEvent& rMEvt) 602 { 603 sal_Bool bReturn = FuDraw::MouseMove(rMEvt); 604 605 if (aDragTimer.IsActive()) 606 { 607 if(bFirstMouseMove) 608 { 609 bFirstMouseMove = sal_False; 610 } 611 else 612 { 613 aDragTimer.Stop(); 614 } 615 } 616 617 if (mpView->IsAction()) 618 { 619 Point aPix(rMEvt.GetPosPixel()); 620 Point aPnt(mpWindow->PixelToLogic(aPix)); 621 622 ForceScroll(aPix); 623 624 if (mpView->IsInsObjPoint()) 625 { 626 mpView->MovInsObjPoint(aPnt); 627 } 628 else 629 { 630 mpView->MovAction(aPnt); 631 } 632 } 633 634 ForcePointer(&rMEvt); 635 636 return (bReturn); 637 } 638 639 /************************************************************************* 640 |* 641 |* MouseButtonUp-event 642 |* 643 \************************************************************************/ 644 645 sal_Bool FuSelection::MouseButtonUp(const MouseEvent& rMEvt) 646 { 647 sal_Bool bReturn = sal_False; 648 // When the right mouse button is pressed then only select objects 649 // (and deselect others) as a preparation for showing the context 650 // menu. 651 const bool bSelectionOnly = rMEvt.IsRight(); 652 653 if (bHideAndAnimate) 654 { 655 // Animation laeuft noch -> sofort returnieren 656 bHideAndAnimate = sal_False; 657 pHdl = NULL; 658 mpWindow->ReleaseMouse(); 659 return(sal_True); 660 } 661 662 if (aDragTimer.IsActive() ) 663 { 664 aDragTimer.Stop(); 665 bIsInDragMode = sal_False; 666 } 667 668 if( !mpView ) 669 return (sal_False); 670 671 Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); 672 sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); 673 sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() ); 674 675 if (mpView->IsFrameDragSingles() || !mpView->HasMarkablePoints()) 676 { 677 /********************************************************************** 678 * KEIN BEZIER_EDITOR 679 **********************************************************************/ 680 if ( mpView->IsDragObj() ) 681 { 682 /****************************************************************** 683 * Objekt wurde verschoben 684 ******************************************************************/ 685 FrameView* pFrameView = mpViewShell->GetFrameView(); 686 sal_Bool bDragWithCopy = (rMEvt.IsMod1() && pFrameView->IsDragWithCopy()); 687 688 if (bDragWithCopy) 689 { 690 bDragWithCopy = !mpView->IsPresObjSelected(sal_False, sal_True); 691 } 692 693 mpView->SetDragWithCopy(bDragWithCopy); 694 mpView->EndDragObj( mpView->IsDragWithCopy() ); 695 696 mpView->ForceMarkedToAnotherPage(); 697 698 if (!rMEvt.IsShift() && !rMEvt.IsMod1() && !rMEvt.IsMod2() && 699 !bSelectionChanged && 700 Abs(aPnt.X() - aMDPos.X()) < nDrgLog && 701 Abs(aPnt.Y() - aMDPos.Y()) < nDrgLog) 702 { 703 /************************************************************** 704 * Toggle zw. Selektion und Rotation 705 **************************************************************/ 706 SdrObject* pSingleObj = NULL; 707 sal_uLong nMarkCount = mpView->GetMarkedObjectList().GetMarkCount(); 708 709 if (nMarkCount==1) 710 { 711 pSingleObj = mpView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj(); 712 } 713 714 if (nSlotId == SID_OBJECT_SELECT 715 && mpView->IsRotateAllowed() 716 717 && (rMEvt.GetClicks() != 2) 718 && (mpViewShell->GetFrameView()->IsClickChangeRotation() 719 || (pSingleObj 720 && pSingleObj->GetObjInventor()==E3dInventor)) 721 && ! bSelectionOnly) 722 723 { 724 bTempRotation = sal_True; 725 nSlotId = SID_OBJECT_ROTATE; 726 Activate(); 727 } 728 else if (nSlotId == SID_OBJECT_ROTATE) 729 { 730 nSlotId = SID_OBJECT_SELECT; 731 Activate(); 732 } 733 } 734 else if (nSlotId == SID_CONVERT_TO_3D_LATHE) 735 { 736 if (!pHdl) 737 { 738 bSuppressChangesOfSelection = sal_True; 739 mpView->Start3DCreation(); 740 bSuppressChangesOfSelection = sal_False; 741 } 742 else if (pHdl->GetKind() != HDL_MIRX && 743 pHdl->GetKind() != HDL_REF1 && 744 pHdl->GetKind() != HDL_REF2 && mpView->Is3DRotationCreationActive()) 745 { 746 /********************************************************* 747 * Wenn 3D-Rotationskoerper erstellt werden sollen, jetzt 748 * die Erstellung beenden 749 **********************************************************/ 750 long nAngle1 = GetAngle(aPnt - mpView->GetRef1()); 751 nAngle1 -= 27000; 752 nAngle1 = NormAngle360(nAngle1); 753 sal_Bool bMirrorSide1 = sal_Bool (nAngle1 < 18000L); 754 755 if (bMirrorSide0 != bMirrorSide1) 756 { 757 bSuppressChangesOfSelection = sal_True; 758 if(mpWindow) 759 mpWindow->EnterWait(); 760 mpView->End3DCreation(); 761 bSuppressChangesOfSelection = sal_False; 762 nSlotId = SID_OBJECT_SELECT; 763 if(mpWindow) 764 mpWindow->LeaveWait(); 765 Activate(); 766 } 767 } 768 } 769 } 770 else if (rMEvt.IsMod1() 771 && !rMEvt.IsMod2() 772 && Abs(aPnt.X() - aMDPos.X()) < nDrgLog 773 && Abs(aPnt.Y() - aMDPos.Y()) < nDrgLog) 774 { 775 // Gruppe betreten 776 mpView->MarkObj(aPnt, nHitLog, rMEvt.IsShift(), rMEvt.IsMod1()); 777 } 778 779 if (mpView->IsAction() ) 780 { 781 mpView->EndAction(); 782 } 783 784 if( SD_MOD()->GetWaterCan() ) 785 { 786 if( rMEvt.IsRight() ) 787 { 788 // Bei rechter Maustaste wird im Giesskannenmodus ein Undo ausgefuehrt 789 mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_UNDO, SFX_CALLMODE_ASYNCHRON ); 790 } 791 else if (pWaterCanCandidate != NULL) 792 { 793 // Is the candiate object still under the mouse? 794 if (pickObject (aPnt) == pWaterCanCandidate) 795 { 796 SdStyleSheetPool* pPool = static_cast<SdStyleSheetPool*>( 797 mpDocSh->GetStyleSheetPool()); 798 if (pPool != NULL) 799 { 800 SfxStyleSheet* pStyleSheet = static_cast<SfxStyleSheet*>( 801 pPool->GetActualStyleSheet()); 802 if (pStyleSheet != NULL && mpView->IsUndoEnabled() ) 803 { 804 // #108981# 805 // Added UNDOs for the WaterCan mode. This was never done in 806 // the past, thus it was missing all the time. 807 SdrUndoAction* pUndoAttr = mpDoc->GetSdrUndoFactory().CreateUndoAttrObject(*pWaterCanCandidate, sal_True, sal_True); 808 mpView->BegUndo(pUndoAttr->GetComment()); 809 mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoGeoObject(*pWaterCanCandidate)); 810 mpView->AddUndo(pUndoAttr); 811 812 pWaterCanCandidate->SetStyleSheet (pStyleSheet, sal_False); 813 814 // #108981# 815 mpView->EndUndo(); 816 } 817 } 818 } 819 } 820 // else when there has been no object under the mouse when the 821 // button was pressed then nothing happens even when there is 822 // one now. 823 } 824 825 sal_uInt16 nClicks = rMEvt.GetClicks(); 826 827 if (nClicks == 2 && rMEvt.IsLeft() && bMBDown && 828 !rMEvt.IsMod1() && !rMEvt.IsShift() ) 829 { 830 DoubleClick(rMEvt); 831 } 832 833 bMBDown = sal_False; 834 835 ForcePointer(&rMEvt); 836 pHdl = NULL; 837 mpWindow->ReleaseMouse(); 838 SdrObject* pSingleObj = NULL; 839 sal_uLong nMarkCount = mpView->GetMarkedObjectList().GetMarkCount(); 840 841 if (nMarkCount==1) 842 { 843 pSingleObj = mpView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj(); 844 } 845 846 if ( (nSlotId != SID_OBJECT_SELECT && nMarkCount==0) || 847 ( mpView->GetDragMode() == SDRDRAG_CROOK && 848 !mpView->IsCrookAllowed( mpView->IsCrookNoContortion() ) ) || 849 ( mpView->GetDragMode() == SDRDRAG_SHEAR && 850 !mpView->IsShearAllowed() && !mpView->IsDistortAllowed() ) || 851 ( nSlotId==SID_CONVERT_TO_3D_LATHE && pSingleObj && 852 (pSingleObj->GetObjInventor() != SdrInventor || 853 pSingleObj->GetObjIdentifier() == OBJ_MEASURE) ) ) 854 { 855 bReturn = sal_True; 856 ForcePointer(&rMEvt); 857 pHdl = NULL; 858 mpWindow->ReleaseMouse(); 859 FuDraw::MouseButtonUp(rMEvt); 860 mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_SYNCHRON); 861 return bReturn; // VORSICHT, durch den synchronen Slot ist das objekt jetzt geloescht 862 } 863 864 FuDraw::MouseButtonUp(rMEvt); 865 } 866 else 867 { 868 /********************************************************************** 869 * BEZIER_EDITOR 870 **********************************************************************/ 871 if ( mpView->IsAction() ) 872 { 873 if ( mpView->IsInsObjPoint() ) 874 { 875 mpView->EndInsObjPoint(SDRCREATE_FORCEEND); 876 } 877 else if ( mpView->IsDragObj() ) 878 { 879 FrameView* pFrameView = mpViewShell->GetFrameView(); 880 sal_Bool bDragWithCopy = (rMEvt.IsMod1() && pFrameView->IsDragWithCopy()); 881 882 if (bDragWithCopy) 883 { 884 bDragWithCopy = !mpView->IsPresObjSelected(sal_False, sal_True); 885 } 886 887 mpView->SetDragWithCopy(bDragWithCopy); 888 mpView->EndDragObj( mpView->IsDragWithCopy() ); 889 } 890 else 891 { 892 mpView->EndAction(); 893 894 sal_uInt16 nDrgLog2 = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() ); 895 Point aPos = mpWindow->PixelToLogic( rMEvt.GetPosPixel() ); 896 897 if (Abs(aMDPos.X() - aPos.X()) < nDrgLog2 && 898 Abs(aMDPos.Y() - aPos.Y()) < nDrgLog2 && 899 !rMEvt.IsShift() && !rMEvt.IsMod2()) 900 { 901 SdrViewEvent aVEvt; 902 SdrHitKind eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt); 903 904 if (eHit == SDRHIT_NONE) 905 { 906 // Klick auf der Stelle: deselektieren 907 mpView->UnmarkAllObj(); 908 } 909 } 910 } 911 } 912 else if (!rMEvt.IsShift() && rMEvt.IsMod1() && !rMEvt.IsMod2() && 913 Abs(aPnt.X() - aMDPos.X()) < nDrgLog && 914 Abs(aPnt.Y() - aMDPos.Y()) < nDrgLog) 915 { 916 // Gruppe betreten 917 mpView->MarkObj(aPnt, nHitLog, sal_False, rMEvt.IsMod1()); 918 } 919 920 921 ForcePointer(&rMEvt); 922 pHdl = NULL; 923 mpWindow->ReleaseMouse(); 924 925 FuDraw::MouseButtonUp(rMEvt); 926 } 927 928 return (bReturn); 929 } 930 931 /************************************************************************* 932 |* 933 |* Tastaturereignisse bearbeiten 934 |* 935 |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls 936 |* sal_False. 937 |* 938 \************************************************************************/ 939 940 sal_Bool FuSelection::KeyInput(const KeyEvent& rKEvt) 941 { 942 sal_Bool bReturn = sal_False; 943 944 switch (rKEvt.GetKeyCode().GetCode()) 945 { 946 case KEY_ESCAPE: 947 { 948 bReturn = FuSelection::cancel(); 949 } 950 break; 951 } 952 953 if (!bReturn) 954 { 955 bReturn = FuDraw::KeyInput(rKEvt); 956 957 if(mpView->GetMarkedObjectList().GetMarkCount() == 0) 958 { 959 mpView->ResetCreationActive(); 960 961 mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD); 962 } 963 } 964 965 return(bReturn); 966 967 } 968 969 970 /************************************************************************* 971 |* 972 |* Function aktivieren 973 |* 974 \************************************************************************/ 975 976 void FuSelection::Activate() 977 { 978 SdrDragMode eMode; 979 mpView->ResetCreationActive(); 980 mpView->SetEditMode(SDREDITMODE_EDIT); 981 982 switch( nSlotId ) 983 { 984 case SID_OBJECT_ROTATE: 985 { 986 // (gemapter) Slot wird explizit auf Rotate gesetzt #31052# 987 if( mpViewShell->ISA(DrawViewShell) ) 988 { 989 sal_uInt16* pSlotArray = 990 static_cast<DrawViewShell*>(mpViewShell)->GetSlotArray(); 991 pSlotArray[ 1 ] = SID_OBJECT_ROTATE; 992 } 993 994 eMode = SDRDRAG_ROTATE; 995 996 if ( mpView->GetDragMode() != eMode ) 997 mpView->SetDragMode(eMode); 998 } 999 break; 1000 1001 case SID_OBJECT_MIRROR: 1002 { 1003 eMode = SDRDRAG_MIRROR; 1004 1005 if ( mpView->GetDragMode() != eMode ) 1006 mpView->SetDragMode(eMode); 1007 } 1008 break; 1009 1010 case SID_OBJECT_CROP: 1011 { 1012 eMode = SDRDRAG_CROP; 1013 1014 if ( mpView->GetDragMode() != eMode ) 1015 mpView->SetDragMode(eMode); 1016 } 1017 break; 1018 1019 case SID_OBJECT_TRANSPARENCE: 1020 { 1021 eMode = SDRDRAG_TRANSPARENCE; 1022 1023 if ( mpView->GetDragMode() != eMode ) 1024 mpView->SetDragMode(eMode); 1025 } 1026 break; 1027 1028 case SID_OBJECT_GRADIENT: 1029 { 1030 eMode = SDRDRAG_GRADIENT; 1031 1032 if ( mpView->GetDragMode() != eMode ) 1033 mpView->SetDragMode(eMode); 1034 } 1035 break; 1036 1037 case SID_OBJECT_SHEAR: 1038 { 1039 eMode = SDRDRAG_SHEAR; 1040 1041 if ( mpView->GetDragMode() != eMode ) 1042 mpView->SetDragMode(eMode); 1043 } 1044 break; 1045 1046 case SID_OBJECT_CROOK_ROTATE: 1047 { 1048 eMode = SDRDRAG_CROOK; 1049 1050 if ( mpView->GetDragMode() != eMode ) 1051 { 1052 mpView->SetDragMode(eMode); 1053 mpView->SetCrookMode(SDRCROOK_ROTATE); 1054 } 1055 } 1056 break; 1057 1058 case SID_OBJECT_CROOK_SLANT: 1059 { 1060 eMode = SDRDRAG_CROOK; 1061 1062 if ( mpView->GetDragMode() != eMode ) 1063 { 1064 mpView->SetDragMode(eMode); 1065 mpView->SetCrookMode(SDRCROOK_SLANT); 1066 } 1067 } 1068 break; 1069 1070 case SID_OBJECT_CROOK_STRETCH: 1071 { 1072 eMode = SDRDRAG_CROOK; 1073 1074 if ( mpView->GetDragMode() != eMode ) 1075 { 1076 mpView->SetDragMode(eMode); 1077 mpView->SetCrookMode(SDRCROOK_STRETCH); 1078 } 1079 } 1080 break; 1081 1082 case SID_CONVERT_TO_3D_LATHE: 1083 { 1084 eMode = SDRDRAG_MIRROR; 1085 bSuppressChangesOfSelection = sal_True; 1086 1087 if ( mpView->GetDragMode() != eMode ) 1088 mpView->SetDragMode(eMode); 1089 1090 if (!mpView->Is3DRotationCreationActive()) 1091 mpView->Start3DCreation(); 1092 1093 bSuppressChangesOfSelection = sal_False; 1094 } 1095 break; 1096 1097 default: 1098 { 1099 eMode = SDRDRAG_MOVE; 1100 1101 if ( mpView->GetDragMode() != eMode ) 1102 mpView->SetDragMode(eMode); 1103 } 1104 break; 1105 } 1106 1107 if (nSlotId != SID_OBJECT_ROTATE) 1108 { 1109 bTempRotation = sal_False; 1110 } 1111 1112 FuDraw::Activate(); 1113 } 1114 1115 1116 1117 /************************************************************************* 1118 |* 1119 |* Function deaktivieren 1120 |* 1121 \************************************************************************/ 1122 1123 void FuSelection::Deactivate() 1124 { 1125 FuDraw::Deactivate(); 1126 } 1127 1128 1129 /************************************************************************* 1130 |* 1131 |* Selektion hat sich geaendert 1132 |* 1133 \************************************************************************/ 1134 1135 void FuSelection::SelectionHasChanged() 1136 { 1137 bSelectionChanged = sal_True; 1138 1139 FuDraw::SelectionHasChanged(); 1140 1141 if ((mpView->Is3DRotationCreationActive() && !bSuppressChangesOfSelection)) 1142 { 1143 // Wechsel Rotationskoerper -> Selektion 1144 mpView->ResetCreationActive(); 1145 nSlotId = SID_OBJECT_SELECT; 1146 Activate(); 1147 } 1148 1149 // Activate the right tool bar for the current context of the view. 1150 mpViewShell->GetViewShellBase().GetToolBarManager()->SelectionHasChanged(*mpViewShell, *mpView); 1151 } 1152 1153 1154 /************************************************************************* 1155 |* 1156 |* Aktuellen Bezier-Editmodus setzen 1157 |* 1158 \************************************************************************/ 1159 1160 void FuSelection::SetEditMode(sal_uInt16 nMode) 1161 { 1162 nEditMode = nMode; 1163 1164 if (nEditMode == SID_BEZIER_INSERT) 1165 { 1166 mpView->SetInsObjPointMode(sal_True); 1167 } 1168 else 1169 { 1170 mpView->SetInsObjPointMode(sal_False); 1171 } 1172 1173 ForcePointer(); 1174 1175 SfxBindings& rBindings = mpViewShell->GetViewFrame()->GetBindings(); 1176 rBindings.Invalidate(SID_BEZIER_MOVE); 1177 rBindings.Invalidate(SID_BEZIER_INSERT); 1178 } 1179 1180 /************************************************************************* 1181 |* 1182 |* Animation oder Interaktion ausfuehren 1183 |* 1184 \************************************************************************/ 1185 1186 sal_Bool FuSelection::AnimateObj(SdrObject* pObj, const Point& rPos) 1187 { 1188 sal_Bool bAnimated = sal_False; 1189 sal_Bool bClosed = pObj->IsClosedObj(); 1190 sal_Bool bFilled = sal_False; 1191 1192 if (bClosed) 1193 { 1194 SfxItemSet aSet(mpDoc->GetPool()); 1195 1196 aSet.Put(pObj->GetMergedItemSet()); 1197 1198 const XFillStyleItem& rFillStyle = (const XFillStyleItem&) aSet.Get(XATTR_FILLSTYLE); 1199 bFilled = rFillStyle.GetValue() != XFILL_NONE; 1200 } 1201 1202 const SetOfByte* pVisiLayer = &mpView->GetSdrPageView()->GetVisibleLayers(); 1203 sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); 1204 const long n2HitLog = nHitLog * 2; 1205 Point aHitPosR(rPos); 1206 Point aHitPosL(rPos); 1207 Point aHitPosT(rPos); 1208 Point aHitPosB(rPos); 1209 1210 aHitPosR.X() += n2HitLog; 1211 aHitPosL.X() -= n2HitLog; 1212 aHitPosT.Y() += n2HitLog; 1213 aHitPosB.Y() -= n2HitLog; 1214 1215 if ( !bClosed || 1216 !bFilled || 1217 (SdrObjectPrimitiveHit(*pObj, aHitPosR, nHitLog, *mpView->GetSdrPageView(), pVisiLayer, false) && 1218 SdrObjectPrimitiveHit(*pObj, aHitPosL, nHitLog, *mpView->GetSdrPageView(), pVisiLayer, false) && 1219 SdrObjectPrimitiveHit(*pObj, aHitPosT, nHitLog, *mpView->GetSdrPageView(), pVisiLayer, false) && 1220 SdrObjectPrimitiveHit(*pObj, aHitPosB, nHitLog, *mpView->GetSdrPageView(), pVisiLayer, false) ) ) 1221 { 1222 if ( mpDoc->GetIMapInfo( pObj ) ) 1223 { 1224 const IMapObject* pIMapObj = mpDoc->GetHitIMapObject( pObj, rPos, *mpWindow ); 1225 1226 if ( pIMapObj && pIMapObj->GetURL().Len() ) 1227 { 1228 // Sprung zu Dokument 1229 mpWindow->ReleaseMouse(); 1230 SfxStringItem aStrItem(SID_FILE_NAME, pIMapObj->GetURL()); 1231 SfxStringItem aReferer(SID_REFERER, mpDocSh->GetMedium()->GetName()); 1232 SfxViewFrame* pFrame = mpViewShell->GetViewFrame(); 1233 SfxFrameItem aFrameItem(SID_DOCFRAME, pFrame); 1234 SfxBoolItem aBrowseItem( SID_BROWSE, sal_True ); 1235 mpWindow->ReleaseMouse(); 1236 pFrame->GetDispatcher()-> 1237 Execute(SID_OPENDOC, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, 1238 &aStrItem, &aFrameItem, &aBrowseItem, &aReferer, 0L); 1239 1240 bAnimated = sal_True; 1241 } 1242 } 1243 else if (!mpDocSh->ISA(GraphicDocShell) && 1244 mpView->ISA(DrawView) && 1245 mpDoc->GetAnimationInfo(pObj)) 1246 { 1247 /********************************************************** 1248 * Animations-Objekt in der Mitte getroffen -> Interaktion 1249 **********************************************************/ 1250 SdAnimationInfo* pInfo = mpDoc->GetAnimationInfo(pObj); 1251 DrawViewShell* pDrViewSh = static_cast<DrawViewShell*>(mpViewShell); 1252 mpWindow->ReleaseMouse(); 1253 1254 switch (pInfo->meClickAction) 1255 { 1256 case presentation::ClickAction_BOOKMARK: 1257 { 1258 // Sprung zu Bookmark (Seite oder Objekt) 1259 SfxStringItem aItem(SID_NAVIGATOR_OBJECT, pInfo->GetBookmark()); 1260 mpViewShell->GetViewFrame()->GetDispatcher()-> 1261 Execute(SID_NAVIGATOR_OBJECT, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, &aItem, 0L); 1262 bAnimated = sal_True; 1263 } 1264 break; 1265 1266 case presentation::ClickAction_DOCUMENT: 1267 { 1268 String sBookmark( pInfo->GetBookmark() ); 1269 // Sprung zu Dokument 1270 if (sBookmark.Len()) 1271 { 1272 SfxStringItem aReferer(SID_REFERER, mpDocSh->GetMedium()->GetName()); 1273 SfxStringItem aStrItem(SID_FILE_NAME, sBookmark); 1274 SfxViewFrame* pFrame = mpViewShell->GetViewFrame(); 1275 SfxFrameItem aFrameItem(SID_DOCFRAME, pFrame); 1276 SfxBoolItem aBrowseItem( SID_BROWSE, sal_True ); 1277 pFrame->GetDispatcher()-> 1278 Execute(SID_OPENDOC, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, 1279 &aStrItem, &aFrameItem, &aBrowseItem, &aReferer, 0L); 1280 } 1281 1282 bAnimated = sal_True; 1283 } 1284 break; 1285 1286 case presentation::ClickAction_PREVPAGE: 1287 { 1288 // Sprung zur vorherigen Seite 1289 SfxUInt16Item aItem(SID_NAVIGATOR_PAGE, PAGE_PREVIOUS); 1290 mpViewShell->GetViewFrame()->GetDispatcher()-> 1291 Execute(SID_NAVIGATOR_PAGE, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, 1292 &aItem, 0L); 1293 bAnimated = sal_True; 1294 } 1295 break; 1296 1297 case presentation::ClickAction_NEXTPAGE: 1298 { 1299 // Sprung zur naechsten Seite 1300 SfxUInt16Item aItem(SID_NAVIGATOR_PAGE, PAGE_NEXT); 1301 mpViewShell->GetViewFrame()->GetDispatcher()-> 1302 Execute(SID_NAVIGATOR_PAGE, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, 1303 &aItem, 0L); 1304 bAnimated = sal_True; 1305 } 1306 break; 1307 1308 case presentation::ClickAction_FIRSTPAGE: 1309 { 1310 // Sprung zu erster Seite 1311 SfxUInt16Item aItem(SID_NAVIGATOR_PAGE, PAGE_FIRST); 1312 mpViewShell->GetViewFrame()->GetDispatcher()-> 1313 Execute(SID_NAVIGATOR_PAGE, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, 1314 &aItem, 0L); 1315 bAnimated = sal_True; 1316 } 1317 break; 1318 1319 case presentation::ClickAction_LASTPAGE: 1320 { 1321 // Sprung zu letzter Seite 1322 SfxUInt16Item aItem(SID_NAVIGATOR_PAGE, PAGE_LAST); 1323 mpViewShell->GetViewFrame()->GetDispatcher()-> 1324 Execute(SID_NAVIGATOR_PAGE, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, 1325 &aItem, 0L); 1326 bAnimated = sal_True; 1327 } 1328 break; 1329 1330 case presentation::ClickAction_SOUND: 1331 { 1332 try 1333 { 1334 mxPlayer.set( avmedia::MediaWindow::createPlayer( pInfo->GetBookmark()), uno::UNO_QUERY_THROW ); 1335 mxPlayer->start(); 1336 } 1337 catch( uno::Exception& e ) 1338 { 1339 (void)e; 1340 } 1341 bAnimated = sal_True; 1342 } 1343 break; 1344 1345 case presentation::ClickAction_VERB: 1346 { 1347 // Verb zuweisen 1348 mpView->UnmarkAll(); 1349 mpView->MarkObj(pObj, mpView->GetSdrPageView(), sal_False, sal_False); 1350 pDrViewSh->DoVerb((sal_Int16)pInfo->mnVerb); 1351 bAnimated = sal_True; 1352 } 1353 break; 1354 1355 case presentation::ClickAction_PROGRAM: 1356 { 1357 String aBaseURL = GetDocSh()->GetMedium()->GetBaseURL(); 1358 INetURLObject aURL( ::URIHelper::SmartRel2Abs( INetURLObject(aBaseURL), pInfo->GetBookmark(), 1359 URIHelper::GetMaybeFileHdl(), true, false, 1360 INetURLObject::WAS_ENCODED, INetURLObject::DECODE_UNAMBIGUOUS ) ); 1361 1362 if( INET_PROT_FILE == aURL.GetProtocol() ) 1363 { 1364 SfxStringItem aUrl( SID_FILE_NAME, aURL.GetMainURL( INetURLObject::NO_DECODE ) ); 1365 SfxBoolItem aBrowsing( SID_BROWSE, sal_True ); 1366 1367 SfxViewFrame* pViewFrm = SfxViewFrame::Current(); 1368 if (pViewFrm) 1369 pViewFrm->GetDispatcher()->Execute( SID_OPENDOC, 1370 SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, 1371 &aUrl, 1372 &aBrowsing, 1373 0L ); 1374 } 1375 1376 bAnimated = sal_True; 1377 } 1378 break; 1379 1380 case presentation::ClickAction_MACRO: 1381 { 1382 // Execute makro 1383 String aMacro = pInfo->GetBookmark(); 1384 1385 if ( SfxApplication::IsXScriptURL( aMacro ) ) 1386 { 1387 uno::Any aRet; 1388 uno::Sequence< sal_Int16 > aOutArgsIndex; 1389 uno::Sequence< uno::Any > aOutArgs; 1390 uno::Sequence< uno::Any >* pInArgs = 1391 new uno::Sequence< uno::Any >(0); 1392 1393 ErrCode eErr = mpDocSh->CallXScript( aMacro, 1394 *pInArgs, aRet, aOutArgsIndex, aOutArgs); 1395 1396 // Check the return value from the script 1397 sal_Bool bTmp = sal_False; 1398 if ( eErr == ERRCODE_NONE && 1399 aRet.getValueType() == getCppuBooleanType() && 1400 sal_True == ( aRet >>= bTmp ) && 1401 bTmp == sal_True ) 1402 { 1403 bAnimated = sal_True; 1404 } 1405 else 1406 { 1407 bAnimated = sal_False; 1408 } 1409 } 1410 else 1411 { 1412 // aMacro has got following format: 1413 // "Macroname.Modulname.Libname.Documentname" or 1414 // "Macroname.Modulname.Libname.Applicationsname" 1415 String aMacroName = 1416 aMacro.GetToken(0, sal_Unicode('.')); 1417 String aModulName = 1418 aMacro.GetToken(1, sal_Unicode('.')); 1419 String aLibName = 1420 aMacro.GetToken(2, sal_Unicode('.')); 1421 String aDocName = 1422 aMacro.GetToken(3, sal_Unicode('.')); 1423 1424 // In this moment the Call-method only 1425 // resolves modulename+macroname 1426 String aExecMacro(aModulName); 1427 aExecMacro.Append( sal_Unicode('.') ); 1428 aExecMacro.Append( aMacroName ); 1429 bAnimated = mpDocSh->GetBasic()->Call(aExecMacro); 1430 } 1431 } 1432 break; 1433 1434 default: 1435 { 1436 bAnimated = sal_False; 1437 } 1438 break; 1439 } 1440 } 1441 1442 if (!bAnimated && 1443 mpView->ISA(DrawView) && 1444 !mpDocSh->ISA(GraphicDocShell) && 1445 SlideShow::IsRunning( mpViewShell->GetViewShellBase() ) && 1446 mpDoc->GetAnimationInfo(pObj)) 1447 { 1448 /********************************************************** 1449 * Effekt-Objekt in der Mitte getroffen -> Effekt abspielen 1450 **********************************************************/ 1451 SdAnimationInfo* pInfo = mpDoc->GetAnimationInfo(pObj); 1452 1453 switch (pInfo->meClickAction) 1454 { 1455 case presentation::ClickAction_VANISH: 1456 case presentation::ClickAction_INVISIBLE: 1457 break; 1458 1459 default: 1460 bAnimated = sal_False; 1461 break; 1462 } 1463 } 1464 } 1465 1466 return bAnimated; 1467 } 1468 1469 1470 1471 /** is called when the currenct function should be aborted. <p> 1472 This is used when a function gets a KEY_ESCAPE but can also 1473 be called directly. 1474 1475 @returns true if a active function was aborted 1476 */ 1477 bool FuSelection::cancel() 1478 { 1479 if (mpView->Is3DRotationCreationActive()) 1480 { 1481 mpView->ResetCreationActive(); 1482 mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD); 1483 return true; 1484 } 1485 else 1486 { 1487 return false; 1488 } 1489 } 1490 1491 1492 1493 1494 SdrObject* FuSelection::pickObject (const Point& rTestPoint) 1495 { 1496 SdrObject* pObject = NULL; 1497 SdrPageView* pPageView; 1498 sal_uInt16 nHitLog = sal_uInt16 (mpWindow->PixelToLogic(Size(HITPIX,0)).Width()); 1499 mpView->PickObj (rTestPoint, nHitLog, pObject, pPageView, SDRSEARCH_PICKMARKABLE); 1500 return pObject; 1501 } 1502 } // end of namespace sd 1503