xref: /aoo42x/main/sd/source/ui/func/fusel.cxx (revision 5b190011)
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