xref: /trunk/main/sd/source/ui/func/fupoor.cxx (revision a5258243accf51c522d45cf65e4b16cb17a336f7)
1cdf0e10cSrcweir /*************************************************************************
2cdf0e10cSrcweir  *
3cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4cdf0e10cSrcweir  *
5cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6cdf0e10cSrcweir  *
7cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8cdf0e10cSrcweir  *
9cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10cdf0e10cSrcweir  *
11cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14cdf0e10cSrcweir  *
15cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20cdf0e10cSrcweir  *
21cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25cdf0e10cSrcweir  *
26cdf0e10cSrcweir  ************************************************************************/
27cdf0e10cSrcweir 
28cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29cdf0e10cSrcweir #include "precompiled_sd.hxx"
30cdf0e10cSrcweir 
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #include "fupoor.hxx"
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #include <svx/svxids.hrc>
35cdf0e10cSrcweir #include <svl/aeitem.hxx>
36cdf0e10cSrcweir #include <svx/svdpagv.hxx>
37cdf0e10cSrcweir #include <svx/svdoole2.hxx>
38cdf0e10cSrcweir #include <svx/svdograf.hxx>
39cdf0e10cSrcweir #include <vcl/seleng.hxx>
40cdf0e10cSrcweir #include <sfx2/app.hxx>
41cdf0e10cSrcweir #include <sfx2/dispatch.hxx>
42cdf0e10cSrcweir #include <sfx2/bindings.hxx>
43cdf0e10cSrcweir #include <sfx2/request.hxx>
44cdf0e10cSrcweir #include <vcl/dialog.hxx>
45cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
46cdf0e10cSrcweir #include <com/sun/star/drawing/XLayer.hpp>
47cdf0e10cSrcweir #include <com/sun/star/drawing/XLayerManager.hpp>
48cdf0e10cSrcweir #include <com/sun/star/container/XChild.hpp>
49cdf0e10cSrcweir 
50cdf0e10cSrcweir #ifndef SD_FRAMW_VIEW_HXX
51cdf0e10cSrcweir #include "FrameView.hxx"
52cdf0e10cSrcweir #endif
53cdf0e10cSrcweir #include "app.hrc"
54cdf0e10cSrcweir #include "fusel.hxx"
55cdf0e10cSrcweir #include "sdpage.hxx"
56cdf0e10cSrcweir #include "drawview.hxx"
57cdf0e10cSrcweir #include "DrawViewShell.hxx"
58cdf0e10cSrcweir #ifndef SD_WINDOW_SHELL_HXX
59cdf0e10cSrcweir #include "Window.hxx"
60cdf0e10cSrcweir #endif
61cdf0e10cSrcweir #include "drawdoc.hxx"
62cdf0e10cSrcweir #include "DrawDocShell.hxx"
63cdf0e10cSrcweir #include "zoomlist.hxx"
64cdf0e10cSrcweir #include "Client.hxx"
65cdf0e10cSrcweir #include "slideshow.hxx"
66cdf0e10cSrcweir #include "LayerTabBar.hxx"
67cdf0e10cSrcweir 
68cdf0e10cSrcweir #include <sfx2/viewfrm.hxx>
69cdf0e10cSrcweir 
70cdf0e10cSrcweir // #97016# IV
71cdf0e10cSrcweir #include <svx/svditer.hxx>
72cdf0e10cSrcweir 
73cdf0e10cSrcweir // #98533#
74cdf0e10cSrcweir #include <editeng/editeng.hxx>
75cdf0e10cSrcweir 
76cdf0e10cSrcweir using namespace ::com::sun::star;
77cdf0e10cSrcweir using ::com::sun::star::uno::Reference;
78cdf0e10cSrcweir 
79cdf0e10cSrcweir namespace sd {
80cdf0e10cSrcweir 
81cdf0e10cSrcweir TYPEINIT0( FuPoor );
82cdf0e10cSrcweir 
83cdf0e10cSrcweir /*************************************************************************
84cdf0e10cSrcweir |*
85cdf0e10cSrcweir |* Konstruktor
86cdf0e10cSrcweir |*
87cdf0e10cSrcweir \************************************************************************/
88cdf0e10cSrcweir 
89cdf0e10cSrcweir FuPoor::FuPoor (
90cdf0e10cSrcweir     ViewShell* pViewSh,
91cdf0e10cSrcweir     ::sd::Window* pWin,
92cdf0e10cSrcweir     ::sd::View* pView,
93cdf0e10cSrcweir     SdDrawDocument* pDrDoc,
94cdf0e10cSrcweir     SfxRequest& rReq)
95cdf0e10cSrcweir     : mpView(pView),
96cdf0e10cSrcweir       mpViewShell(pViewSh),
97cdf0e10cSrcweir       mpWindow(pWin),
98cdf0e10cSrcweir       mpDocSh( pDrDoc->GetDocSh() ),
99cdf0e10cSrcweir       mpDoc(pDrDoc),
100cdf0e10cSrcweir       nSlotId( rReq.GetSlot() ),
101cdf0e10cSrcweir       nSlotValue(0),
102cdf0e10cSrcweir       pDialog(NULL),
103cdf0e10cSrcweir       bIsInDragMode(sal_False),
104cdf0e10cSrcweir       bNoScrollUntilInside (sal_True),
105cdf0e10cSrcweir       bScrollable (sal_False),
106cdf0e10cSrcweir       bDelayActive (sal_False),
107cdf0e10cSrcweir       bFirstMouseMove (sal_False),
108cdf0e10cSrcweir       // #95491# remember MouseButton state
109cdf0e10cSrcweir       mnCode(0)
110cdf0e10cSrcweir {
111cdf0e10cSrcweir     ReceiveRequest(rReq);
112cdf0e10cSrcweir 
113cdf0e10cSrcweir     aScrollTimer.SetTimeoutHdl( LINK(this, FuPoor, ScrollHdl) );
114cdf0e10cSrcweir     aScrollTimer.SetTimeout(SELENG_AUTOREPEAT_INTERVAL);
115cdf0e10cSrcweir 
116cdf0e10cSrcweir     aDragTimer.SetTimeoutHdl( LINK(this, FuPoor, DragHdl) );
117cdf0e10cSrcweir     aDragTimer.SetTimeout(SELENG_DRAGDROP_TIMEOUT);
118cdf0e10cSrcweir 
119cdf0e10cSrcweir     aDelayToScrollTimer.SetTimeoutHdl( LINK(this, FuPoor, DelayHdl) );
120cdf0e10cSrcweir     aDelayToScrollTimer.SetTimeout(2000);
121cdf0e10cSrcweir }
122cdf0e10cSrcweir 
123cdf0e10cSrcweir /*************************************************************************
124cdf0e10cSrcweir |*
125cdf0e10cSrcweir |* Destruktor
126cdf0e10cSrcweir |*
127cdf0e10cSrcweir \************************************************************************/
128cdf0e10cSrcweir 
129cdf0e10cSrcweir FuPoor::~FuPoor()
130cdf0e10cSrcweir {
131cdf0e10cSrcweir     aDragTimer.Stop();
132cdf0e10cSrcweir     aScrollTimer.Stop();
133cdf0e10cSrcweir     aDelayToScrollTimer.Stop ();
134cdf0e10cSrcweir 
135cdf0e10cSrcweir     if (pDialog)
136cdf0e10cSrcweir         delete pDialog;
137cdf0e10cSrcweir }
138cdf0e10cSrcweir 
139cdf0e10cSrcweir /*************************************************************************
140cdf0e10cSrcweir |*
141cdf0e10cSrcweir |* Function aktivieren
142cdf0e10cSrcweir |*
143cdf0e10cSrcweir \************************************************************************/
144cdf0e10cSrcweir 
145cdf0e10cSrcweir void FuPoor::Activate()
146cdf0e10cSrcweir {
147cdf0e10cSrcweir     if (pDialog)
148cdf0e10cSrcweir     {
149cdf0e10cSrcweir         pDialog->Show();
150cdf0e10cSrcweir     }
151cdf0e10cSrcweir }
152cdf0e10cSrcweir 
153cdf0e10cSrcweir /*************************************************************************
154cdf0e10cSrcweir |*
155cdf0e10cSrcweir |* Function deaktivieren
156cdf0e10cSrcweir |*
157cdf0e10cSrcweir \************************************************************************/
158cdf0e10cSrcweir 
159cdf0e10cSrcweir void FuPoor::Deactivate()
160cdf0e10cSrcweir {
161cdf0e10cSrcweir     aDragTimer.Stop();
162cdf0e10cSrcweir     aScrollTimer.Stop();
163cdf0e10cSrcweir     aDelayToScrollTimer.Stop ();
164cdf0e10cSrcweir         bScrollable  =
165cdf0e10cSrcweir         bDelayActive = sal_False;
166cdf0e10cSrcweir 
167cdf0e10cSrcweir     if (pDialog)
168cdf0e10cSrcweir     {
169cdf0e10cSrcweir         pDialog->Hide();
170cdf0e10cSrcweir     }
171cdf0e10cSrcweir 
172cdf0e10cSrcweir     if (mpWindow) mpWindow->ReleaseMouse ();
173cdf0e10cSrcweir }
174cdf0e10cSrcweir 
175cdf0e10cSrcweir /*************************************************************************
176cdf0e10cSrcweir |*
177cdf0e10cSrcweir |* Scrollen bei Erreichen des Fensterrandes; wird von
178cdf0e10cSrcweir |* MouseMove aufgerufen
179cdf0e10cSrcweir |*
180cdf0e10cSrcweir \************************************************************************/
181cdf0e10cSrcweir 
182cdf0e10cSrcweir void FuPoor::ForceScroll(const Point& aPixPos)
183cdf0e10cSrcweir {
184cdf0e10cSrcweir     aScrollTimer.Stop();
185cdf0e10cSrcweir 
186cdf0e10cSrcweir     if ( !mpView->IsDragHelpLine() && !mpView->IsSetPageOrg() &&
187cdf0e10cSrcweir             !SlideShow::IsRunning( mpViewShell->GetViewShellBase() ) )
188cdf0e10cSrcweir     {
189cdf0e10cSrcweir /*      Size aSize = mpWindow->GetSizePixel();
190cdf0e10cSrcweir         short dx = 0, dy = 0;
191cdf0e10cSrcweir 
192cdf0e10cSrcweir         if ( aPixPos.X() <= 0              ) dx = -1;
193cdf0e10cSrcweir         if ( aPixPos.X() >= aSize.Width()  ) dx =  1;
194cdf0e10cSrcweir         if ( aPixPos.Y() <= 0              ) dy = -1;
195cdf0e10cSrcweir         if ( aPixPos.Y() >= aSize.Height() ) dy =  1;
196cdf0e10cSrcweir */
197cdf0e10cSrcweir         Point aPos = mpWindow->OutputToScreenPixel(aPixPos);
198cdf0e10cSrcweir         const Rectangle& rRect = mpViewShell->GetAllWindowRect();
199cdf0e10cSrcweir 
200cdf0e10cSrcweir         if ( bNoScrollUntilInside )
201cdf0e10cSrcweir         {
202cdf0e10cSrcweir             if ( rRect.IsInside(aPos) )
203cdf0e10cSrcweir                 bNoScrollUntilInside = sal_False;
204cdf0e10cSrcweir         }
205cdf0e10cSrcweir         else
206cdf0e10cSrcweir         {
207cdf0e10cSrcweir             short dx = 0, dy = 0;
208cdf0e10cSrcweir 
209cdf0e10cSrcweir             if ( aPos.X() <= rRect.Left()   ) dx = -1;
210cdf0e10cSrcweir             if ( aPos.X() >= rRect.Right()  ) dx =  1;
211cdf0e10cSrcweir             if ( aPos.Y() <= rRect.Top()    ) dy = -1;
212cdf0e10cSrcweir             if ( aPos.Y() >= rRect.Bottom() ) dy =  1;
213cdf0e10cSrcweir 
214cdf0e10cSrcweir             if ( dx != 0 || dy != 0 )
215cdf0e10cSrcweir             {
216cdf0e10cSrcweir                 if (bScrollable)
217cdf0e10cSrcweir                 {
218cdf0e10cSrcweir                     // Scrollaktion in abgeleiteter Klasse
219cdf0e10cSrcweir                     ScrollStart();
220cdf0e10cSrcweir                     mpViewShell->ScrollLines(dx, dy);
221cdf0e10cSrcweir                     ScrollEnd();
222cdf0e10cSrcweir                     aScrollTimer.Start();
223cdf0e10cSrcweir                 }
224cdf0e10cSrcweir                 else if (! bDelayActive) StartDelayToScrollTimer ();
225cdf0e10cSrcweir             }
226cdf0e10cSrcweir         }
227cdf0e10cSrcweir     }
228cdf0e10cSrcweir }
229cdf0e10cSrcweir 
230cdf0e10cSrcweir /*************************************************************************
231cdf0e10cSrcweir |*
232cdf0e10cSrcweir |* Timer-Handler fuer Fensterscrolling
233cdf0e10cSrcweir |*
234cdf0e10cSrcweir \************************************************************************/
235cdf0e10cSrcweir 
236cdf0e10cSrcweir IMPL_LINK_INLINE_START( FuPoor, ScrollHdl, Timer *, EMPTYARG )
237cdf0e10cSrcweir {
238cdf0e10cSrcweir     Point aPnt(mpWindow->GetPointerPosPixel());
239cdf0e10cSrcweir 
240cdf0e10cSrcweir     // #95491# use remembered MouseButton state to create correct
241cdf0e10cSrcweir     // MouseEvents for this artifical MouseMove.
242cdf0e10cSrcweir     MouseMove(MouseEvent(aPnt, 1, 0, GetMouseButtonCode()));
243cdf0e10cSrcweir 
244cdf0e10cSrcweir     return 0;
245cdf0e10cSrcweir }
246cdf0e10cSrcweir IMPL_LINK_INLINE_END( FuPoor, ScrollHdl, Timer *, pTimer )
247cdf0e10cSrcweir 
248cdf0e10cSrcweir /*************************************************************************
249cdf0e10cSrcweir |*
250cdf0e10cSrcweir |* Tastaturereignisse bearbeiten
251cdf0e10cSrcweir |*
252cdf0e10cSrcweir |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls
253cdf0e10cSrcweir |* sal_False.
254cdf0e10cSrcweir |*
255cdf0e10cSrcweir \************************************************************************/
256cdf0e10cSrcweir 
257cdf0e10cSrcweir sal_Bool FuPoor::KeyInput(const KeyEvent& rKEvt)
258cdf0e10cSrcweir {
259cdf0e10cSrcweir     sal_uInt16          nCode = rKEvt.GetKeyCode().GetCode();
260cdf0e10cSrcweir     sal_Bool            bReturn = sal_False;
261cdf0e10cSrcweir     sal_Bool            bSlideShow = SlideShow::IsRunning( mpViewShell->GetViewShellBase() );
262cdf0e10cSrcweir 
263cdf0e10cSrcweir     switch (nCode)
264cdf0e10cSrcweir     {
265cdf0e10cSrcweir         // #97016# IV
266cdf0e10cSrcweir         case KEY_RETURN:
267cdf0e10cSrcweir         {
268cdf0e10cSrcweir             if(rKEvt.GetKeyCode().IsMod1())
269cdf0e10cSrcweir             {
270cdf0e10cSrcweir                 if(mpViewShell && mpViewShell->ISA(DrawViewShell))
271cdf0e10cSrcweir                 {
272cdf0e10cSrcweir                     DrawViewShell* pDrawViewShell =
273cdf0e10cSrcweir                         static_cast<DrawViewShell*>(mpViewShell);
274cdf0e10cSrcweir                     SdPage* pActualPage = pDrawViewShell->GetActualPage();
275cdf0e10cSrcweir                     SdrTextObj* pCandidate = 0L;
276cdf0e10cSrcweir 
277cdf0e10cSrcweir                     if(pActualPage)
278cdf0e10cSrcweir                     {
279cdf0e10cSrcweir                         SdrObjListIter aIter(*pActualPage, IM_DEEPNOGROUPS);
280cdf0e10cSrcweir 
281cdf0e10cSrcweir                         while(aIter.IsMore() && !pCandidate)
282cdf0e10cSrcweir                         {
283cdf0e10cSrcweir                             SdrObject* pObj = aIter.Next();
284cdf0e10cSrcweir 
285cdf0e10cSrcweir                             if(pObj && pObj->ISA(SdrTextObj))
286cdf0e10cSrcweir                             {
287cdf0e10cSrcweir                                 sal_uInt32 nInv(pObj->GetObjInventor());
288cdf0e10cSrcweir                                 sal_uInt16 nKnd(pObj->GetObjIdentifier());
289cdf0e10cSrcweir 
290cdf0e10cSrcweir                                 if(SdrInventor == nInv &&
291cdf0e10cSrcweir                                     (OBJ_TITLETEXT == nKnd || OBJ_OUTLINETEXT == nKnd || OBJ_TEXT == nKnd))
292cdf0e10cSrcweir                                 {
293cdf0e10cSrcweir                                     pCandidate = (SdrTextObj*)pObj;
294cdf0e10cSrcweir                                 }
295cdf0e10cSrcweir                             }
296cdf0e10cSrcweir                         }
297cdf0e10cSrcweir                     }
298cdf0e10cSrcweir 
299cdf0e10cSrcweir                     if(pCandidate)
300cdf0e10cSrcweir                     {
301cdf0e10cSrcweir                         mpView->UnMarkAll();
302cdf0e10cSrcweir                         mpView->MarkObj(pCandidate, mpView->GetSdrPageView());
303cdf0e10cSrcweir 
304cdf0e10cSrcweir                         mpViewShell->GetViewFrame()->GetDispatcher()->Execute(
305cdf0e10cSrcweir                             SID_ATTR_CHAR, SFX_CALLMODE_ASYNCHRON);
306cdf0e10cSrcweir                     }
307cdf0e10cSrcweir                     else
308cdf0e10cSrcweir                     {
309cdf0e10cSrcweir                         // insert a new page with the same page layout
310cdf0e10cSrcweir                         mpViewShell->GetViewFrame()->GetDispatcher()->Execute(
311cdf0e10cSrcweir                             SID_INSERTPAGE_QUICK, SFX_CALLMODE_ASYNCHRON);
312cdf0e10cSrcweir                     }
313cdf0e10cSrcweir 
314cdf0e10cSrcweir                     // consumed
315cdf0e10cSrcweir                     bReturn = sal_True;
316cdf0e10cSrcweir                 }
317cdf0e10cSrcweir             }
318cdf0e10cSrcweir             else
319cdf0e10cSrcweir             {
320cdf0e10cSrcweir                 // #98255# activate OLE object on RETURN for selected object
321cdf0e10cSrcweir                 // #98198# activate text edit on RETURN for selected object
322cdf0e10cSrcweir                 const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
323cdf0e10cSrcweir 
324cdf0e10cSrcweir                 if( !mpView->IsTextEdit() && 1 == rMarkList.GetMarkCount() )
325cdf0e10cSrcweir                 {
326cdf0e10cSrcweir                     SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
327cdf0e10cSrcweir 
328cdf0e10cSrcweir                     if( pObj && pObj->ISA( SdrOle2Obj ) && !mpDocSh->IsUIActive() )
329cdf0e10cSrcweir                     {
330cdf0e10cSrcweir                         //HMHmpView->HideMarkHdl();
331cdf0e10cSrcweir                         mpViewShell->ActivateObject( static_cast< SdrOle2Obj* >( pObj ), 0 );
332cdf0e10cSrcweir                     }
333cdf0e10cSrcweir                     else if( pObj && pObj->IsEmptyPresObj() && pObj->ISA( SdrGrafObj ) )
334cdf0e10cSrcweir                     {
335cdf0e10cSrcweir                         mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_INSERT_GRAPHIC, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD );
336cdf0e10cSrcweir                     }
337cdf0e10cSrcweir                     else
338cdf0e10cSrcweir                     {
339cdf0e10cSrcweir                         mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_ATTR_CHAR, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD );
340cdf0e10cSrcweir                     }
341cdf0e10cSrcweir 
342cdf0e10cSrcweir                     // consumed
343cdf0e10cSrcweir                     bReturn = sal_True;
344cdf0e10cSrcweir                 }
345cdf0e10cSrcweir             }
346cdf0e10cSrcweir         }
347cdf0e10cSrcweir         break;
348cdf0e10cSrcweir 
349cdf0e10cSrcweir         // #97016# II
350cdf0e10cSrcweir         case KEY_TAB:
351cdf0e10cSrcweir         {
352cdf0e10cSrcweir             // #98994# handle Mod1 and Mod2 to get travelling running on different systems
353cdf0e10cSrcweir             if(rKEvt.GetKeyCode().IsMod1() || rKEvt.GetKeyCode().IsMod2())
354cdf0e10cSrcweir             {
355cdf0e10cSrcweir                 // #97016# II do something with a selected handle?
356cdf0e10cSrcweir                 const SdrHdlList& rHdlList = mpView->GetHdlList();
357cdf0e10cSrcweir                 sal_Bool bForward(!rKEvt.GetKeyCode().IsShift());
358cdf0e10cSrcweir 
359cdf0e10cSrcweir                 ((SdrHdlList&)rHdlList).TravelFocusHdl(bForward);
360cdf0e10cSrcweir 
361cdf0e10cSrcweir                 // guarantee visibility of focused handle
362cdf0e10cSrcweir                 SdrHdl* pHdl = rHdlList.GetFocusHdl();
363cdf0e10cSrcweir 
364cdf0e10cSrcweir                 if(pHdl)
365cdf0e10cSrcweir                 {
366cdf0e10cSrcweir                     Point aHdlPosition(pHdl->GetPos());
367cdf0e10cSrcweir                     Rectangle aVisRect(aHdlPosition - Point(100, 100), Size(200, 200));
368cdf0e10cSrcweir                     mpView->MakeVisible(aVisRect, *mpWindow);
369cdf0e10cSrcweir                 }
370cdf0e10cSrcweir 
371cdf0e10cSrcweir                 // consumed
372cdf0e10cSrcweir                 bReturn = sal_True;
373cdf0e10cSrcweir             }
374cdf0e10cSrcweir         }
375cdf0e10cSrcweir         break;
376cdf0e10cSrcweir 
377cdf0e10cSrcweir         case KEY_ESCAPE:
378cdf0e10cSrcweir         {
379cdf0e10cSrcweir             bReturn = FuPoor::cancel();
380cdf0e10cSrcweir         }
381cdf0e10cSrcweir         break;
382cdf0e10cSrcweir 
383cdf0e10cSrcweir         case KEY_ADD:
384cdf0e10cSrcweir         {
385cdf0e10cSrcweir             if (!mpView->IsTextEdit() && !bSlideShow && !mpDocSh->IsUIActive())
386cdf0e10cSrcweir             {
387cdf0e10cSrcweir                 // Zoom vergroessern
388cdf0e10cSrcweir                 mpViewShell->SetZoom(mpWindow->GetZoom() * 3 / 2);
389cdf0e10cSrcweir 
390cdf0e10cSrcweir                 if (mpViewShell->ISA(DrawViewShell))
391cdf0e10cSrcweir                     static_cast<DrawViewShell*>(mpViewShell)
392cdf0e10cSrcweir                         ->SetZoomOnPage(sal_False);
393cdf0e10cSrcweir 
394cdf0e10cSrcweir                 bReturn = sal_True;
395cdf0e10cSrcweir             }
396cdf0e10cSrcweir         }
397cdf0e10cSrcweir         break;
398cdf0e10cSrcweir 
399cdf0e10cSrcweir         case KEY_SUBTRACT:
400cdf0e10cSrcweir         {
401cdf0e10cSrcweir             if (!mpView->IsTextEdit() && !bSlideShow && !mpDocSh->IsUIActive())
402cdf0e10cSrcweir             {
403cdf0e10cSrcweir                 // Zoom verringern
404cdf0e10cSrcweir                 mpViewShell->SetZoom(mpWindow->GetZoom() * 2 / 3);
405cdf0e10cSrcweir 
406cdf0e10cSrcweir                 if (mpViewShell->ISA(DrawViewShell))
407cdf0e10cSrcweir                     static_cast<DrawViewShell*>(mpViewShell)
408cdf0e10cSrcweir                         ->SetZoomOnPage(sal_False);
409cdf0e10cSrcweir 
410cdf0e10cSrcweir                 bReturn = sal_True;
411cdf0e10cSrcweir             }
412cdf0e10cSrcweir         }
413cdf0e10cSrcweir         break;
414cdf0e10cSrcweir 
415cdf0e10cSrcweir         case KEY_MULTIPLY:
416cdf0e10cSrcweir         {
417cdf0e10cSrcweir             if (!mpView->IsTextEdit() && !bSlideShow)
418cdf0e10cSrcweir             {
419cdf0e10cSrcweir                 // Zoom auf Seite
420cdf0e10cSrcweir                 mpViewShell->GetViewFrame()->GetDispatcher()->
421cdf0e10cSrcweir                 Execute(SID_SIZE_PAGE, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD);
422cdf0e10cSrcweir                 bReturn = sal_True;
423cdf0e10cSrcweir             }
424cdf0e10cSrcweir         }
425cdf0e10cSrcweir         break;
426cdf0e10cSrcweir 
427cdf0e10cSrcweir         case KEY_DIVIDE:
428cdf0e10cSrcweir         {
429cdf0e10cSrcweir             if (!mpView->IsTextEdit() && !bSlideShow)
430cdf0e10cSrcweir             {
431cdf0e10cSrcweir                 // Zoom auf selektierte Objekte
432cdf0e10cSrcweir                 mpViewShell->GetViewFrame()->GetDispatcher()->
433cdf0e10cSrcweir                 Execute(SID_SIZE_OPTIMAL, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD);
434cdf0e10cSrcweir                 bReturn = sal_True;
435cdf0e10cSrcweir             }
436cdf0e10cSrcweir         }
437cdf0e10cSrcweir         break;
438cdf0e10cSrcweir 
439cdf0e10cSrcweir         case KEY_POINT:
440cdf0e10cSrcweir         {
441cdf0e10cSrcweir             ZoomList* pZoomList = mpViewShell->GetZoomList();
442cdf0e10cSrcweir 
443cdf0e10cSrcweir             if (!mpView->IsTextEdit() && pZoomList->IsNextPossible() && !bSlideShow && !mpDocSh->IsUIActive())
444cdf0e10cSrcweir             {
445cdf0e10cSrcweir                 // Naechstes ZoomRect einstellen
446cdf0e10cSrcweir                 mpViewShell->SetZoomRect(pZoomList->GetNextZoomRect());
447cdf0e10cSrcweir                 bReturn = sal_True;
448cdf0e10cSrcweir             }
449cdf0e10cSrcweir         }
450cdf0e10cSrcweir         break;
451cdf0e10cSrcweir 
452cdf0e10cSrcweir         case KEY_COMMA:
453cdf0e10cSrcweir         {
454cdf0e10cSrcweir             ZoomList* pZoomList = mpViewShell->GetZoomList();
455cdf0e10cSrcweir 
456cdf0e10cSrcweir             if (!mpView->IsTextEdit() && pZoomList->IsPreviousPossible() && !bSlideShow && !mpDocSh->IsUIActive())
457cdf0e10cSrcweir             {
458cdf0e10cSrcweir                 // Vorheriges ZoomRect einstellen
459cdf0e10cSrcweir                 mpViewShell->SetZoomRect(pZoomList->GetPreviousZoomRect());
460cdf0e10cSrcweir                 bReturn = sal_True;
461cdf0e10cSrcweir             }
462cdf0e10cSrcweir         }
463cdf0e10cSrcweir         break;
464cdf0e10cSrcweir 
465cdf0e10cSrcweir         case KEY_HOME:
466cdf0e10cSrcweir         {
467cdf0e10cSrcweir             if (!mpView->IsTextEdit()
468cdf0e10cSrcweir                 && mpViewShell->ISA(DrawViewShell)
469cdf0e10cSrcweir                 && !bSlideShow)
470cdf0e10cSrcweir             {
471cdf0e10cSrcweir                // Sprung zu erster Seite
472cdf0e10cSrcweir                static_cast<DrawViewShell*>(mpViewShell)->SwitchPage(0);
473cdf0e10cSrcweir                bReturn = sal_True;
474cdf0e10cSrcweir             }
475cdf0e10cSrcweir         }
476cdf0e10cSrcweir         break;
477cdf0e10cSrcweir 
478cdf0e10cSrcweir         case KEY_END:
479cdf0e10cSrcweir         {
480cdf0e10cSrcweir             if (!mpView->IsTextEdit()
481cdf0e10cSrcweir                 && mpViewShell->ISA(DrawViewShell)
482cdf0e10cSrcweir                 && !bSlideShow)
483cdf0e10cSrcweir             {
484cdf0e10cSrcweir                 // Sprung zu letzter Seite
485cdf0e10cSrcweir                 SdPage* pPage =
486cdf0e10cSrcweir                     static_cast<DrawViewShell*>(mpViewShell)->GetActualPage();
487cdf0e10cSrcweir                 static_cast<DrawViewShell*>(mpViewShell)
488cdf0e10cSrcweir                     ->SwitchPage(mpDoc->GetSdPageCount(
489cdf0e10cSrcweir                         pPage->GetPageKind()) - 1);
490cdf0e10cSrcweir                 bReturn = sal_True;
491cdf0e10cSrcweir             }
492cdf0e10cSrcweir         }
493cdf0e10cSrcweir         break;
494cdf0e10cSrcweir 
495cdf0e10cSrcweir         case KEY_PAGEUP:
496cdf0e10cSrcweir         {
497cdf0e10cSrcweir             if( rKEvt.GetKeyCode().IsMod1() && rKEvt.GetKeyCode().IsMod2() )
498cdf0e10cSrcweir                 break;
499cdf0e10cSrcweir 
500cdf0e10cSrcweir             if(mpViewShell->ISA(DrawViewShell) && !bSlideShow)
501cdf0e10cSrcweir             {
502cdf0e10cSrcweir                 // The page-up key switches layers or pages depending on the
503cdf0e10cSrcweir                 // modifier key.
504cdf0e10cSrcweir                 if ( ! rKEvt.GetKeyCode().GetAllModifier())
505cdf0e10cSrcweir                 {
506cdf0e10cSrcweir                     // With no modifier pressed we move to the previous
507cdf0e10cSrcweir                     // slide.
508cdf0e10cSrcweir                     mpView->SdrEndTextEdit();
509cdf0e10cSrcweir 
510cdf0e10cSrcweir                     // Previous page.
511cdf0e10cSrcweir                     bReturn = sal_True;
512cdf0e10cSrcweir                     SdPage* pPage = static_cast<DrawViewShell*>(mpViewShell)->GetActualPage();
513cdf0e10cSrcweir                     sal_uInt16 nSdPage = (pPage->GetPageNum() - 1) / 2;
514cdf0e10cSrcweir 
515cdf0e10cSrcweir                     if (nSdPage > 0)
516cdf0e10cSrcweir                     {
517cdf0e10cSrcweir                         // Switch the page and send events regarding
518cdf0e10cSrcweir                         // deactivation the old page and activating the new
519cdf0e10cSrcweir                         // one.
520cdf0e10cSrcweir                         TabControl* pPageTabControl =
521cdf0e10cSrcweir                             static_cast<DrawViewShell*>(mpViewShell)
522cdf0e10cSrcweir                             ->GetPageTabControl();
523cdf0e10cSrcweir                         if (pPageTabControl->IsReallyShown())
524cdf0e10cSrcweir                             pPageTabControl->SendDeactivatePageEvent ();
525cdf0e10cSrcweir                         static_cast<DrawViewShell*>(mpViewShell)->SwitchPage(nSdPage - 1);
526cdf0e10cSrcweir                         if (pPageTabControl->IsReallyShown())
527cdf0e10cSrcweir                             pPageTabControl->SendActivatePageEvent ();
528cdf0e10cSrcweir                     }
529cdf0e10cSrcweir                 }
530cdf0e10cSrcweir                 else if (rKEvt.GetKeyCode().IsMod1())
531cdf0e10cSrcweir                 {
532cdf0e10cSrcweir                     // With the CONTROL modifier we switch layers.
533cdf0e10cSrcweir                     if (static_cast<DrawViewShell*>(mpViewShell)->IsLayerModeActive())
534cdf0e10cSrcweir                     {
535cdf0e10cSrcweir                         // Moves to the previous layer.
536cdf0e10cSrcweir                         SwitchLayer (-1);
537cdf0e10cSrcweir                     }
538cdf0e10cSrcweir                 }
539cdf0e10cSrcweir             }
540cdf0e10cSrcweir         }
541cdf0e10cSrcweir         break;
542cdf0e10cSrcweir 
543cdf0e10cSrcweir         case KEY_PAGEDOWN:
544cdf0e10cSrcweir         {
545cdf0e10cSrcweir             if( rKEvt.GetKeyCode().IsMod1() && rKEvt.GetKeyCode().IsMod2() )
546cdf0e10cSrcweir                 break;
547cdf0e10cSrcweir             if(mpViewShell->ISA(DrawViewShell) && !bSlideShow)
548cdf0e10cSrcweir             {
549cdf0e10cSrcweir                 // The page-down key switches layers or pages depending on the
550cdf0e10cSrcweir                 // modifier key.
551cdf0e10cSrcweir                 if ( ! rKEvt.GetKeyCode().GetAllModifier())
552cdf0e10cSrcweir                 {
553cdf0e10cSrcweir                     // With no modifier pressed we move to the next slide.
554cdf0e10cSrcweir                     mpView->SdrEndTextEdit();
555cdf0e10cSrcweir 
556cdf0e10cSrcweir                     // Next page.
557cdf0e10cSrcweir                     bReturn = sal_True;
558cdf0e10cSrcweir                     SdPage* pPage = static_cast<DrawViewShell*>(mpViewShell)->GetActualPage();
559cdf0e10cSrcweir                     sal_uInt16 nSdPage = (pPage->GetPageNum() - 1) / 2;
560cdf0e10cSrcweir 
561cdf0e10cSrcweir                     if (nSdPage < mpDoc->GetSdPageCount(pPage->GetPageKind()) - 1)
562cdf0e10cSrcweir                     {
563cdf0e10cSrcweir                         // Switch the page and send events regarding
564cdf0e10cSrcweir                         // deactivation the old page and activating the new
565cdf0e10cSrcweir                         // one.
566cdf0e10cSrcweir                         TabControl* pPageTabControl =
567cdf0e10cSrcweir                             static_cast<DrawViewShell*>(mpViewShell)->GetPageTabControl();
568cdf0e10cSrcweir                         if (pPageTabControl->IsReallyShown())
569cdf0e10cSrcweir                             pPageTabControl->SendDeactivatePageEvent ();
570cdf0e10cSrcweir                         static_cast<DrawViewShell*>(mpViewShell)->SwitchPage(nSdPage + 1);
571cdf0e10cSrcweir                         if (pPageTabControl->IsReallyShown())
572cdf0e10cSrcweir                             pPageTabControl->SendActivatePageEvent ();
573cdf0e10cSrcweir                     }
574cdf0e10cSrcweir                 }
575cdf0e10cSrcweir                 else if (rKEvt.GetKeyCode().IsMod1())
576cdf0e10cSrcweir                 {
577cdf0e10cSrcweir                     // With the CONTROL modifier we switch layers.
578cdf0e10cSrcweir                     if (static_cast<DrawViewShell*>(mpViewShell)->IsLayerModeActive())
579cdf0e10cSrcweir                     {
580cdf0e10cSrcweir                         // With the layer mode active pressing page-down
581cdf0e10cSrcweir                         // moves to the next layer.
582cdf0e10cSrcweir                         SwitchLayer (+1);
583cdf0e10cSrcweir                     }
584cdf0e10cSrcweir                 }
585cdf0e10cSrcweir             }
586cdf0e10cSrcweir         }
587cdf0e10cSrcweir         break;
588cdf0e10cSrcweir 
589cdf0e10cSrcweir         // #97016# II change select state when focus is on poly point
590cdf0e10cSrcweir         case KEY_SPACE:
591cdf0e10cSrcweir         {
592cdf0e10cSrcweir             const SdrHdlList& rHdlList = mpView->GetHdlList();
593cdf0e10cSrcweir             SdrHdl* pHdl = rHdlList.GetFocusHdl();
594cdf0e10cSrcweir 
595cdf0e10cSrcweir             if(pHdl)
596cdf0e10cSrcweir             {
597cdf0e10cSrcweir                 if(pHdl->GetKind() == HDL_POLY)
598cdf0e10cSrcweir                 {
599cdf0e10cSrcweir                     // rescue ID of point with focus
600cdf0e10cSrcweir                     sal_uInt32 nPol(pHdl->GetPolyNum());
601cdf0e10cSrcweir                     sal_uInt32 nPnt(pHdl->GetPointNum());
602cdf0e10cSrcweir 
603cdf0e10cSrcweir                     if(mpView->IsPointMarked(*pHdl))
604cdf0e10cSrcweir                     {
605cdf0e10cSrcweir                         if(rKEvt.GetKeyCode().IsShift())
606cdf0e10cSrcweir                         {
607cdf0e10cSrcweir                             mpView->UnmarkPoint(*pHdl);
608cdf0e10cSrcweir                         }
609cdf0e10cSrcweir                     }
610cdf0e10cSrcweir                     else
611cdf0e10cSrcweir                     {
612cdf0e10cSrcweir                         if(!rKEvt.GetKeyCode().IsShift())
613cdf0e10cSrcweir                         {
614cdf0e10cSrcweir                             mpView->UnmarkAllPoints();
615cdf0e10cSrcweir                         }
616cdf0e10cSrcweir 
617cdf0e10cSrcweir                         mpView->MarkPoint(*pHdl);
618cdf0e10cSrcweir                     }
619cdf0e10cSrcweir 
620cdf0e10cSrcweir                     if(0L == rHdlList.GetFocusHdl())
621cdf0e10cSrcweir                     {
622cdf0e10cSrcweir                         // restore point with focus
623cdf0e10cSrcweir                         SdrHdl* pNewOne = 0L;
624cdf0e10cSrcweir 
625cdf0e10cSrcweir                         for(sal_uInt32 a(0); !pNewOne && a < rHdlList.GetHdlCount(); a++)
626cdf0e10cSrcweir                         {
627cdf0e10cSrcweir                             SdrHdl* pAct = rHdlList.GetHdl(a);
628cdf0e10cSrcweir 
629cdf0e10cSrcweir                             if(pAct
630cdf0e10cSrcweir                                 && pAct->GetKind() == HDL_POLY
631cdf0e10cSrcweir                                 && pAct->GetPolyNum() == nPol
632cdf0e10cSrcweir                                 && pAct->GetPointNum() == nPnt)
633cdf0e10cSrcweir                             {
634cdf0e10cSrcweir                                 pNewOne = pAct;
635cdf0e10cSrcweir                             }
636cdf0e10cSrcweir                         }
637cdf0e10cSrcweir 
638cdf0e10cSrcweir                         if(pNewOne)
639cdf0e10cSrcweir                         {
640cdf0e10cSrcweir                             ((SdrHdlList&)rHdlList).SetFocusHdl(pNewOne);
641cdf0e10cSrcweir                         }
642cdf0e10cSrcweir                     }
643cdf0e10cSrcweir 
644cdf0e10cSrcweir                     bReturn = sal_True;
645cdf0e10cSrcweir                 }
646cdf0e10cSrcweir             }
647cdf0e10cSrcweir         }
648cdf0e10cSrcweir         break;
649cdf0e10cSrcweir 
650cdf0e10cSrcweir         case KEY_UP:
651cdf0e10cSrcweir         case KEY_DOWN:
652cdf0e10cSrcweir         case KEY_LEFT:
653cdf0e10cSrcweir         case KEY_RIGHT:
654cdf0e10cSrcweir         {
655cdf0e10cSrcweir             if (!mpView->IsTextEdit() && !bSlideShow)
656cdf0e10cSrcweir             {
657cdf0e10cSrcweir                 long nX = 0;
658cdf0e10cSrcweir                 long nY = 0;
659cdf0e10cSrcweir 
660cdf0e10cSrcweir                 if (nCode == KEY_UP)
661cdf0e10cSrcweir                 {
662cdf0e10cSrcweir                     // Scroll nach oben
663cdf0e10cSrcweir                     nX = 0;
664cdf0e10cSrcweir                     nY =-1;
665cdf0e10cSrcweir                 }
666cdf0e10cSrcweir                 else if (nCode == KEY_DOWN)
667cdf0e10cSrcweir                 {
668cdf0e10cSrcweir                     // Scroll nach unten
669cdf0e10cSrcweir                     nX = 0;
670cdf0e10cSrcweir                     nY = 1;
671cdf0e10cSrcweir                 }
672cdf0e10cSrcweir                 else if (nCode == KEY_LEFT)
673cdf0e10cSrcweir                 {
674cdf0e10cSrcweir                     // Scroll nach links
675cdf0e10cSrcweir                     nX =-1;
676cdf0e10cSrcweir                     nY = 0;
677cdf0e10cSrcweir                 }
678cdf0e10cSrcweir                 else if (nCode == KEY_RIGHT)
679cdf0e10cSrcweir                 {
680cdf0e10cSrcweir                     // Scroll nach rechts
681cdf0e10cSrcweir                     nX = 1;
682cdf0e10cSrcweir                     nY = 0;
683cdf0e10cSrcweir                 }
684cdf0e10cSrcweir 
685cdf0e10cSrcweir                 if (mpView->AreObjectsMarked() && !rKEvt.GetKeyCode().IsMod1() &&
686cdf0e10cSrcweir                     !mpDocSh->IsReadOnly())
687cdf0e10cSrcweir                 {
688cdf0e10cSrcweir                     // #97016# II
689cdf0e10cSrcweir                     const SdrHdlList& rHdlList = mpView->GetHdlList();
690cdf0e10cSrcweir                     SdrHdl* pHdl = rHdlList.GetFocusHdl();
691cdf0e10cSrcweir 
692cdf0e10cSrcweir                     // #109007#
693cdf0e10cSrcweir                     sal_Bool bIsMoveOfConnectedHandle(sal_False);
694cdf0e10cSrcweir                     sal_Bool bOldSuppress = false;
695cdf0e10cSrcweir                     SdrEdgeObj* pEdgeObj = 0L;
696cdf0e10cSrcweir 
697cdf0e10cSrcweir                     if(pHdl && pHdl->GetObj() && pHdl->GetObj()->ISA(SdrEdgeObj) && 0 == pHdl->GetPolyNum())
698cdf0e10cSrcweir                     {
699cdf0e10cSrcweir                         pEdgeObj = (SdrEdgeObj*)pHdl->GetObj();
700cdf0e10cSrcweir 
701cdf0e10cSrcweir                         if(0L == pHdl->GetPointNum())
702cdf0e10cSrcweir                         {
703cdf0e10cSrcweir                             if(pEdgeObj->GetConnection(sal_True).GetObject())
704cdf0e10cSrcweir                             {
705cdf0e10cSrcweir                                 bIsMoveOfConnectedHandle = sal_True;
706cdf0e10cSrcweir                             }
707cdf0e10cSrcweir                         }
708cdf0e10cSrcweir                         if(1L == pHdl->GetPointNum())
709cdf0e10cSrcweir                         {
710cdf0e10cSrcweir                             if(pEdgeObj->GetConnection(sal_False).GetObject())
711cdf0e10cSrcweir                             {
712cdf0e10cSrcweir                                 bIsMoveOfConnectedHandle = sal_True;
713cdf0e10cSrcweir                             }
714cdf0e10cSrcweir                         }
715cdf0e10cSrcweir                     }
716cdf0e10cSrcweir 
717cdf0e10cSrcweir                     // #109007#
718cdf0e10cSrcweir                     if(pEdgeObj)
719cdf0e10cSrcweir                     {
720cdf0e10cSrcweir                         // Suppress default connects to inside object and object center
721cdf0e10cSrcweir                         bOldSuppress = pEdgeObj->GetSuppressDefaultConnect();
722cdf0e10cSrcweir                         pEdgeObj->SetSuppressDefaultConnect(sal_True);
723cdf0e10cSrcweir                     }
724cdf0e10cSrcweir 
725cdf0e10cSrcweir                     // #109007#
726cdf0e10cSrcweir                     if(bIsMoveOfConnectedHandle)
727cdf0e10cSrcweir                     {
728cdf0e10cSrcweir                         sal_uInt16 nMarkHdSiz(mpView->GetMarkHdlSizePixel());
729cdf0e10cSrcweir                         Size aHalfConSiz(nMarkHdSiz + 1, nMarkHdSiz + 1);
730cdf0e10cSrcweir                         aHalfConSiz = mpWindow->PixelToLogic(aHalfConSiz);
731cdf0e10cSrcweir 
732cdf0e10cSrcweir                         if(100 < aHalfConSiz.Width())
733cdf0e10cSrcweir                             nX *= aHalfConSiz.Width();
734cdf0e10cSrcweir                         else
735cdf0e10cSrcweir                             nX *= 100;
736cdf0e10cSrcweir 
737cdf0e10cSrcweir                         if(100 < aHalfConSiz.Height())
738cdf0e10cSrcweir                             nY *= aHalfConSiz.Height();
739cdf0e10cSrcweir                         else
740cdf0e10cSrcweir                             nY *= 100;
741cdf0e10cSrcweir                     }
742cdf0e10cSrcweir                     else if(rKEvt.GetKeyCode().IsMod2())
743cdf0e10cSrcweir                     {
744cdf0e10cSrcweir                         // #97016# move in 1 pixel distance
745cdf0e10cSrcweir                         Size aLogicSizeOnePixel = (mpWindow) ? mpWindow->PixelToLogic(Size(1,1)) : Size(100, 100);
746cdf0e10cSrcweir                         nX *= aLogicSizeOnePixel.Width();
747cdf0e10cSrcweir                         nY *= aLogicSizeOnePixel.Height();
748cdf0e10cSrcweir                     }
749cdf0e10cSrcweir                     else if(rKEvt.GetKeyCode().IsShift())
750cdf0e10cSrcweir                     {
751cdf0e10cSrcweir                         nX *= 1000;
752cdf0e10cSrcweir                         nY *= 1000;
753cdf0e10cSrcweir                     }
754cdf0e10cSrcweir                     else
755cdf0e10cSrcweir                     {
756cdf0e10cSrcweir                         // old, fixed move distance
757cdf0e10cSrcweir                         nX *= 100;
758cdf0e10cSrcweir                         nY *= 100;
759cdf0e10cSrcweir                     }
760cdf0e10cSrcweir 
761cdf0e10cSrcweir                     if(0L == pHdl)
762cdf0e10cSrcweir                     {
763cdf0e10cSrcweir                         // #67368# only take action when move is allowed
764cdf0e10cSrcweir                         if(mpView->IsMoveAllowed())
765cdf0e10cSrcweir                         {
766cdf0e10cSrcweir                             // #90129# restrict movement to WorkArea
767cdf0e10cSrcweir                             const Rectangle& rWorkArea = mpView->GetWorkArea();
768cdf0e10cSrcweir 
769cdf0e10cSrcweir                             if(!rWorkArea.IsEmpty())
770cdf0e10cSrcweir                             {
771cdf0e10cSrcweir                                 Rectangle aMarkRect(mpView->GetMarkedObjRect());
772cdf0e10cSrcweir                                 aMarkRect.Move(nX, nY);
773cdf0e10cSrcweir 
774cdf0e10cSrcweir                                 if(!aMarkRect.IsInside(rWorkArea))
775cdf0e10cSrcweir                                 {
776cdf0e10cSrcweir                                     if(aMarkRect.Left() < rWorkArea.Left())
777cdf0e10cSrcweir                                     {
778cdf0e10cSrcweir                                         nX += rWorkArea.Left() - aMarkRect.Left();
779cdf0e10cSrcweir                                     }
780cdf0e10cSrcweir 
781cdf0e10cSrcweir                                     if(aMarkRect.Right() > rWorkArea.Right())
782cdf0e10cSrcweir                                     {
783cdf0e10cSrcweir                                         nX -= aMarkRect.Right() - rWorkArea.Right();
784cdf0e10cSrcweir                                     }
785cdf0e10cSrcweir 
786cdf0e10cSrcweir                                     if(aMarkRect.Top() < rWorkArea.Top())
787cdf0e10cSrcweir                                     {
788cdf0e10cSrcweir                                         nY += rWorkArea.Top() - aMarkRect.Top();
789cdf0e10cSrcweir                                     }
790cdf0e10cSrcweir 
791cdf0e10cSrcweir                                     if(aMarkRect.Bottom() > rWorkArea.Bottom())
792cdf0e10cSrcweir                                     {
793cdf0e10cSrcweir                                         nY -= aMarkRect.Bottom() - rWorkArea.Bottom();
794cdf0e10cSrcweir                                     }
795cdf0e10cSrcweir                                 }
796cdf0e10cSrcweir                             }
797cdf0e10cSrcweir 
798cdf0e10cSrcweir                             // no handle selected
799cdf0e10cSrcweir                             if(0 != nX || 0 != nY)
800cdf0e10cSrcweir                             {
801cdf0e10cSrcweir                                 mpView->MoveAllMarked(Size(nX, nY));
802cdf0e10cSrcweir 
803cdf0e10cSrcweir                                 // #97016# II
804cdf0e10cSrcweir                                 mpView->MakeVisible(mpView->GetAllMarkedRect(), *mpWindow);
805cdf0e10cSrcweir                             }
806cdf0e10cSrcweir                         }
807cdf0e10cSrcweir                     }
808cdf0e10cSrcweir                     else
809cdf0e10cSrcweir                     {
810cdf0e10cSrcweir                         // move handle with index nHandleIndex
811cdf0e10cSrcweir                         if(pHdl && (nX || nY))
812cdf0e10cSrcweir                         {
813cdf0e10cSrcweir                             // now move the Handle (nX, nY)
814cdf0e10cSrcweir                             Point aStartPoint(pHdl->GetPos());
815cdf0e10cSrcweir                             Point aEndPoint(pHdl->GetPos() + Point(nX, nY));
816cdf0e10cSrcweir                             const SdrDragStat& rDragStat = mpView->GetDragStat();
817cdf0e10cSrcweir 
818cdf0e10cSrcweir                             // start dragging
819cdf0e10cSrcweir                             mpView->BegDragObj(aStartPoint, 0, pHdl, 0);
820cdf0e10cSrcweir 
821cdf0e10cSrcweir                             if(mpView->IsDragObj())
822cdf0e10cSrcweir                             {
823cdf0e10cSrcweir                                 FASTBOOL bWasNoSnap = rDragStat.IsNoSnap();
824cdf0e10cSrcweir                                 sal_Bool bWasSnapEnabled = mpView->IsSnapEnabled();
825cdf0e10cSrcweir 
826cdf0e10cSrcweir                                 // switch snapping off
827cdf0e10cSrcweir                                 if(!bWasNoSnap)
828cdf0e10cSrcweir                                     ((SdrDragStat&)rDragStat).SetNoSnap(sal_True);
829cdf0e10cSrcweir                                 if(bWasSnapEnabled)
830cdf0e10cSrcweir                                     mpView->SetSnapEnabled(sal_False);
831cdf0e10cSrcweir 
832cdf0e10cSrcweir                                 mpView->MovAction(aEndPoint);
833cdf0e10cSrcweir                                 mpView->EndDragObj();
834cdf0e10cSrcweir 
835cdf0e10cSrcweir                                 // restore snap
836cdf0e10cSrcweir                                 if(!bWasNoSnap)
837cdf0e10cSrcweir                                     ((SdrDragStat&)rDragStat).SetNoSnap(bWasNoSnap);
838cdf0e10cSrcweir                                 if(bWasSnapEnabled)
839cdf0e10cSrcweir                                     mpView->SetSnapEnabled(bWasSnapEnabled);
840cdf0e10cSrcweir                             }
841cdf0e10cSrcweir 
842cdf0e10cSrcweir                             // make moved handle visible
843cdf0e10cSrcweir                             Rectangle aVisRect(aEndPoint - Point(100, 100), Size(200, 200));
844cdf0e10cSrcweir                             mpView->MakeVisible(aVisRect, *mpWindow);
845cdf0e10cSrcweir                         }
846cdf0e10cSrcweir                     }
847cdf0e10cSrcweir 
848cdf0e10cSrcweir                     // #109007#
849cdf0e10cSrcweir                     if(pEdgeObj)
850cdf0e10cSrcweir                     {
851cdf0e10cSrcweir                         // Restore original suppress value
852cdf0e10cSrcweir                         pEdgeObj->SetSuppressDefaultConnect(bOldSuppress);
853cdf0e10cSrcweir                     }
854cdf0e10cSrcweir                 }
855cdf0e10cSrcweir                 else
856cdf0e10cSrcweir                 {
857cdf0e10cSrcweir                     // Seite scrollen
858cdf0e10cSrcweir                     ScrollStart();
859cdf0e10cSrcweir                     mpViewShell->ScrollLines(nX, nY);
860cdf0e10cSrcweir                     ScrollEnd();
861cdf0e10cSrcweir                 }
862cdf0e10cSrcweir 
863cdf0e10cSrcweir                 bReturn = sal_True;
864cdf0e10cSrcweir             }
865cdf0e10cSrcweir         }
866cdf0e10cSrcweir         break;
867cdf0e10cSrcweir     }
868cdf0e10cSrcweir 
869cdf0e10cSrcweir     if (bReturn)
870cdf0e10cSrcweir     {
871cdf0e10cSrcweir         mpWindow->ReleaseMouse();
872cdf0e10cSrcweir     }
873cdf0e10cSrcweir 
874cdf0e10cSrcweir     // #98198# when a text-editable object is selected and the
875cdf0e10cSrcweir     // input character is printable, activate text edit on that object
876cdf0e10cSrcweir     // and feed character to object
877cdf0e10cSrcweir     if(!bReturn && !mpDocSh->IsReadOnly())
878cdf0e10cSrcweir     {
879cdf0e10cSrcweir         if(!mpView->IsTextEdit() && mpViewShell)
880cdf0e10cSrcweir         {
881cdf0e10cSrcweir             const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
882cdf0e10cSrcweir 
883cdf0e10cSrcweir             if(1 == rMarkList.GetMarkCount())
884cdf0e10cSrcweir             {
885cdf0e10cSrcweir                 SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
886cdf0e10cSrcweir 
887*a5258243SPedro Giffuni                 // #i118485# allow TextInput for OLEs, too
888*a5258243SPedro Giffuni                 if(pObj->ISA(SdrTextObj) && pObj->HasTextEdit())
889cdf0e10cSrcweir                 {
890cdf0e10cSrcweir                     // #98533# use common IsSimpleCharInput from
891cdf0e10cSrcweir                     // the EditEngine.
892cdf0e10cSrcweir                     sal_Bool bPrintable(EditEngine::IsSimpleCharInput(rKEvt));
893cdf0e10cSrcweir 
894cdf0e10cSrcweir                     if(bPrintable)
895cdf0e10cSrcweir                     {
896cdf0e10cSrcweir                         // try to activate textedit mode for the selected object
897cdf0e10cSrcweir                         SfxStringItem aInputString(SID_ATTR_CHAR, String(rKEvt.GetCharCode()));
898cdf0e10cSrcweir 
899cdf0e10cSrcweir                         mpViewShell->GetViewFrame()->GetDispatcher()->Execute(
900cdf0e10cSrcweir                             SID_ATTR_CHAR,
901cdf0e10cSrcweir                             SFX_CALLMODE_ASYNCHRON,
902cdf0e10cSrcweir                             &aInputString,
903cdf0e10cSrcweir                             0L);
904cdf0e10cSrcweir 
905cdf0e10cSrcweir                         // consumed
906cdf0e10cSrcweir                         bReturn = sal_True;
907cdf0e10cSrcweir                     }
908cdf0e10cSrcweir                 }
909cdf0e10cSrcweir             }
910cdf0e10cSrcweir             else
911cdf0e10cSrcweir             {
912cdf0e10cSrcweir                 // #99039# test if there is a title object there. If yes, try to
913cdf0e10cSrcweir                 // set it to edit mode and start typing...
914cdf0e10cSrcweir                 if(mpViewShell->ISA(DrawViewShell)
915cdf0e10cSrcweir                     && EditEngine::IsSimpleCharInput(rKEvt))
916cdf0e10cSrcweir                 {
917cdf0e10cSrcweir                     DrawViewShell* pDrawViewShell =
918cdf0e10cSrcweir                         static_cast<DrawViewShell*>(mpViewShell);
919cdf0e10cSrcweir                     SdPage* pActualPage = pDrawViewShell->GetActualPage();
920cdf0e10cSrcweir                     SdrTextObj* pCandidate = 0L;
921cdf0e10cSrcweir 
922cdf0e10cSrcweir                     if(pActualPage)
923cdf0e10cSrcweir                     {
924cdf0e10cSrcweir                         SdrObjListIter aIter(*pActualPage, IM_DEEPNOGROUPS);
925cdf0e10cSrcweir 
926cdf0e10cSrcweir                         while(aIter.IsMore() && !pCandidate)
927cdf0e10cSrcweir                         {
928cdf0e10cSrcweir                             SdrObject* pObj = aIter.Next();
929cdf0e10cSrcweir 
930cdf0e10cSrcweir                             if(pObj && pObj->ISA(SdrTextObj))
931cdf0e10cSrcweir                             {
932cdf0e10cSrcweir                                 sal_uInt32 nInv(pObj->GetObjInventor());
933cdf0e10cSrcweir                                 sal_uInt16 nKnd(pObj->GetObjIdentifier());
934cdf0e10cSrcweir 
935cdf0e10cSrcweir                                 if(SdrInventor == nInv && OBJ_TITLETEXT == nKnd)
936cdf0e10cSrcweir                                 {
937cdf0e10cSrcweir                                     pCandidate = (SdrTextObj*)pObj;
938cdf0e10cSrcweir                                 }
939cdf0e10cSrcweir                             }
940cdf0e10cSrcweir                         }
941cdf0e10cSrcweir                     }
942cdf0e10cSrcweir 
943cdf0e10cSrcweir                     // when candidate found and candidate is untouched, start editing text...
944cdf0e10cSrcweir                     if(pCandidate && pCandidate->IsEmptyPresObj())
945cdf0e10cSrcweir                     {
946cdf0e10cSrcweir                         mpView->UnMarkAll();
947cdf0e10cSrcweir                         mpView->MarkObj(pCandidate, mpView->GetSdrPageView());
948cdf0e10cSrcweir                         SfxStringItem aInputString(SID_ATTR_CHAR, String(rKEvt.GetCharCode()));
949cdf0e10cSrcweir 
950cdf0e10cSrcweir                         mpViewShell->GetViewFrame()->GetDispatcher()->Execute(
951cdf0e10cSrcweir                             SID_ATTR_CHAR,
952cdf0e10cSrcweir                             SFX_CALLMODE_ASYNCHRON,
953cdf0e10cSrcweir                             &aInputString,
954cdf0e10cSrcweir                             0L);
955cdf0e10cSrcweir 
956cdf0e10cSrcweir                         // consumed
957cdf0e10cSrcweir                         bReturn = sal_True;
958cdf0e10cSrcweir                     }
959cdf0e10cSrcweir                 }
960cdf0e10cSrcweir             }
961cdf0e10cSrcweir         }
962cdf0e10cSrcweir     }
963cdf0e10cSrcweir 
964cdf0e10cSrcweir     return(bReturn);
965cdf0e10cSrcweir }
966cdf0e10cSrcweir 
967cdf0e10cSrcweir sal_Bool FuPoor::MouseMove(const MouseEvent& )
968cdf0e10cSrcweir {
969cdf0e10cSrcweir     return sal_False;
970cdf0e10cSrcweir }
971cdf0e10cSrcweir 
972cdf0e10cSrcweir // #97016# II
973cdf0e10cSrcweir void FuPoor::SelectionHasChanged()
974cdf0e10cSrcweir {
975cdf0e10cSrcweir     const SdrHdlList& rHdlList = mpView->GetHdlList();
976cdf0e10cSrcweir     ((SdrHdlList&)rHdlList).ResetFocusHdl();
977cdf0e10cSrcweir }
978cdf0e10cSrcweir 
979cdf0e10cSrcweir /*************************************************************************
980cdf0e10cSrcweir |*
981cdf0e10cSrcweir |* Cut object to clipboard
982cdf0e10cSrcweir |*
983cdf0e10cSrcweir \************************************************************************/
984cdf0e10cSrcweir 
985cdf0e10cSrcweir void FuPoor::DoCut()
986cdf0e10cSrcweir {
987cdf0e10cSrcweir     if (mpView)
988cdf0e10cSrcweir     {
989cdf0e10cSrcweir         mpView->DoCut(mpWindow);
990cdf0e10cSrcweir     }
991cdf0e10cSrcweir }
992cdf0e10cSrcweir 
993cdf0e10cSrcweir /*************************************************************************
994cdf0e10cSrcweir |*
995cdf0e10cSrcweir |* Copy object to clipboard
996cdf0e10cSrcweir |*
997cdf0e10cSrcweir \************************************************************************/
998cdf0e10cSrcweir 
999cdf0e10cSrcweir void FuPoor::DoCopy()
1000cdf0e10cSrcweir {
1001cdf0e10cSrcweir     if (mpView)
1002cdf0e10cSrcweir     {
1003cdf0e10cSrcweir         mpView->DoCopy(mpWindow);
1004cdf0e10cSrcweir     }
1005cdf0e10cSrcweir }
1006cdf0e10cSrcweir 
1007cdf0e10cSrcweir /*************************************************************************
1008cdf0e10cSrcweir |*
1009cdf0e10cSrcweir |* Paste object from clipboard
1010cdf0e10cSrcweir |*
1011cdf0e10cSrcweir \************************************************************************/
1012cdf0e10cSrcweir 
1013cdf0e10cSrcweir void FuPoor::DoPaste()
1014cdf0e10cSrcweir {
1015cdf0e10cSrcweir     if (mpView)
1016cdf0e10cSrcweir     {
1017cdf0e10cSrcweir         mpView->DoPaste(mpWindow);
1018cdf0e10cSrcweir     }
1019cdf0e10cSrcweir }
1020cdf0e10cSrcweir 
1021cdf0e10cSrcweir /*************************************************************************
1022cdf0e10cSrcweir |*
1023cdf0e10cSrcweir |* Timer-Handler fuer Drag&Drop
1024cdf0e10cSrcweir |*
1025cdf0e10cSrcweir \************************************************************************/
1026cdf0e10cSrcweir 
1027cdf0e10cSrcweir IMPL_LINK( FuPoor, DragHdl, Timer *, EMPTYARG )
1028cdf0e10cSrcweir {
1029cdf0e10cSrcweir     if( mpView )
1030cdf0e10cSrcweir     {
1031cdf0e10cSrcweir         sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() );
1032cdf0e10cSrcweir         SdrHdl* pHdl = mpView->PickHandle(aMDPos);
1033cdf0e10cSrcweir 
1034cdf0e10cSrcweir         if ( pHdl==NULL && mpView->IsMarkedHit(aMDPos, nHitLog)
1035cdf0e10cSrcweir              && !mpView->IsPresObjSelected(sal_False, sal_True) )
1036cdf0e10cSrcweir         {
1037cdf0e10cSrcweir             mpWindow->ReleaseMouse();
1038cdf0e10cSrcweir             bIsInDragMode = sal_True;
1039cdf0e10cSrcweir             mpView->StartDrag( aMDPos, mpWindow );
1040cdf0e10cSrcweir         }
1041cdf0e10cSrcweir     }
1042cdf0e10cSrcweir     return 0;
1043cdf0e10cSrcweir }
1044cdf0e10cSrcweir 
1045cdf0e10cSrcweir /*************************************************************************
1046cdf0e10cSrcweir |*
1047cdf0e10cSrcweir |* Command-event
1048cdf0e10cSrcweir |*
1049cdf0e10cSrcweir \************************************************************************/
1050cdf0e10cSrcweir 
1051cdf0e10cSrcweir sal_Bool FuPoor::Command(const CommandEvent& rCEvt)
1052cdf0e10cSrcweir {
1053cdf0e10cSrcweir     return( mpView->Command(rCEvt,mpWindow) );
1054cdf0e10cSrcweir }
1055cdf0e10cSrcweir 
1056cdf0e10cSrcweir /*************************************************************************
1057cdf0e10cSrcweir |*
1058cdf0e10cSrcweir |* Timer-Handler fuer Fensterscrolling
1059cdf0e10cSrcweir |*
1060cdf0e10cSrcweir \************************************************************************/
1061cdf0e10cSrcweir 
1062cdf0e10cSrcweir IMPL_LINK_INLINE_START( FuPoor, DelayHdl, Timer *, EMPTYARG )
1063cdf0e10cSrcweir {
1064cdf0e10cSrcweir     aDelayToScrollTimer.Stop ();
1065cdf0e10cSrcweir     bScrollable = sal_True;
1066cdf0e10cSrcweir 
1067cdf0e10cSrcweir     Point aPnt(mpWindow->GetPointerPosPixel());
1068cdf0e10cSrcweir 
1069cdf0e10cSrcweir     // #95491# use remembered MouseButton state to create correct
1070cdf0e10cSrcweir     // MouseEvents for this artifical MouseMove.
1071cdf0e10cSrcweir     MouseMove(MouseEvent(aPnt, 1, 0, GetMouseButtonCode()));
1072cdf0e10cSrcweir 
1073cdf0e10cSrcweir     return 0;
1074cdf0e10cSrcweir }
1075cdf0e10cSrcweir IMPL_LINK_INLINE_END( FuPoor, DelayHdl, Timer *, pTimer )
1076cdf0e10cSrcweir 
1077cdf0e10cSrcweir /*************************************************************************
1078cdf0e10cSrcweir |*
1079cdf0e10cSrcweir |* Handler fuer Maustaste
1080cdf0e10cSrcweir |*
1081cdf0e10cSrcweir \************************************************************************/
1082cdf0e10cSrcweir 
1083cdf0e10cSrcweir sal_Bool FuPoor::MouseButtonUp (const MouseEvent& rMEvt)
1084cdf0e10cSrcweir {
1085cdf0e10cSrcweir     // #95491# remember button state for creation of own MouseEvents
1086cdf0e10cSrcweir     SetMouseButtonCode(rMEvt.GetButtons());
1087cdf0e10cSrcweir 
1088cdf0e10cSrcweir     aDelayToScrollTimer.Stop ();
1089cdf0e10cSrcweir     return bScrollable  =
1090cdf0e10cSrcweir         bDelayActive = sal_False;
1091cdf0e10cSrcweir }
1092cdf0e10cSrcweir 
1093cdf0e10cSrcweir sal_Bool FuPoor::MouseButtonDown(const MouseEvent& rMEvt)
1094cdf0e10cSrcweir {
1095cdf0e10cSrcweir     // #95491# remember button state for creation of own MouseEvents
1096cdf0e10cSrcweir     SetMouseButtonCode(rMEvt.GetButtons());
1097cdf0e10cSrcweir 
1098cdf0e10cSrcweir     return sal_False;
1099cdf0e10cSrcweir }
1100cdf0e10cSrcweir 
1101cdf0e10cSrcweir /*************************************************************************
1102cdf0e10cSrcweir |*
1103cdf0e10cSrcweir |* Handler fuer Maustaste
1104cdf0e10cSrcweir |*
1105cdf0e10cSrcweir \************************************************************************/
1106cdf0e10cSrcweir 
1107cdf0e10cSrcweir void FuPoor::StartDelayToScrollTimer ()
1108cdf0e10cSrcweir {
1109cdf0e10cSrcweir     bDelayActive = sal_True;
1110cdf0e10cSrcweir     aDelayToScrollTimer.Start ();
1111cdf0e10cSrcweir }
1112cdf0e10cSrcweir 
1113cdf0e10cSrcweir /*************************************************************************
1114cdf0e10cSrcweir |*
1115cdf0e10cSrcweir |* Help-event
1116cdf0e10cSrcweir |*
1117cdf0e10cSrcweir \************************************************************************/
1118cdf0e10cSrcweir 
1119cdf0e10cSrcweir sal_Bool FuPoor::RequestHelp(const HelpEvent& rHEvt)
1120cdf0e10cSrcweir {
1121cdf0e10cSrcweir     sal_Bool bReturn = sal_False;
1122cdf0e10cSrcweir 
1123cdf0e10cSrcweir     SdrPageView* pPV = mpView->GetSdrPageView();
1124cdf0e10cSrcweir 
1125cdf0e10cSrcweir     if (pPV)
1126cdf0e10cSrcweir     {
1127cdf0e10cSrcweir         SdPage* pPage = (SdPage*) pPV->GetPage();
1128cdf0e10cSrcweir 
1129cdf0e10cSrcweir         if (pPage)
1130cdf0e10cSrcweir         {
1131cdf0e10cSrcweir             bReturn = pPage->RequestHelp(mpWindow, mpView, rHEvt);
1132cdf0e10cSrcweir         }
1133cdf0e10cSrcweir     }
1134cdf0e10cSrcweir 
1135cdf0e10cSrcweir     return(bReturn);
1136cdf0e10cSrcweir }
1137cdf0e10cSrcweir 
1138cdf0e10cSrcweir void FuPoor::Paint(const Rectangle&, ::sd::Window* )
1139cdf0e10cSrcweir {
1140cdf0e10cSrcweir }
1141cdf0e10cSrcweir 
1142cdf0e10cSrcweir /*************************************************************************
1143cdf0e10cSrcweir |*
1144cdf0e10cSrcweir |* Request verarbeiten
1145cdf0e10cSrcweir |*
1146cdf0e10cSrcweir \************************************************************************/
1147cdf0e10cSrcweir 
1148cdf0e10cSrcweir void FuPoor::ReceiveRequest(SfxRequest& rReq)
1149cdf0e10cSrcweir {
1150cdf0e10cSrcweir     const SfxItemSet* pSet = rReq.GetArgs();
1151cdf0e10cSrcweir 
1152cdf0e10cSrcweir     if (pSet)
1153cdf0e10cSrcweir     {
1154cdf0e10cSrcweir         if( pSet->GetItemState( nSlotId ) == SFX_ITEM_SET )
1155cdf0e10cSrcweir         {
1156cdf0e10cSrcweir             const SfxPoolItem& rItem = pSet->Get( nSlotId );
1157cdf0e10cSrcweir 
1158cdf0e10cSrcweir             if( rItem.ISA( SfxAllEnumItem ) )
1159cdf0e10cSrcweir             {
1160cdf0e10cSrcweir                 nSlotValue = ( ( const SfxAllEnumItem& ) rItem ).GetValue();
1161cdf0e10cSrcweir             }
1162cdf0e10cSrcweir         }
1163cdf0e10cSrcweir     }
1164cdf0e10cSrcweir }
1165cdf0e10cSrcweir 
1166cdf0e10cSrcweir /*************************************************************************
1167cdf0e10cSrcweir |*
1168cdf0e10cSrcweir |* #97016#
1169cdf0e10cSrcweir |*
1170cdf0e10cSrcweir \************************************************************************/
1171cdf0e10cSrcweir 
1172cdf0e10cSrcweir SdrObject* FuPoor::CreateDefaultObject(const sal_uInt16, const Rectangle& )
1173cdf0e10cSrcweir {
1174cdf0e10cSrcweir     // empty base implementation
1175cdf0e10cSrcweir     return 0L;
1176cdf0e10cSrcweir }
1177cdf0e10cSrcweir 
1178cdf0e10cSrcweir void FuPoor::ImpForceQuadratic(Rectangle& rRect)
1179cdf0e10cSrcweir {
1180cdf0e10cSrcweir     if(rRect.GetWidth() > rRect.GetHeight())
1181cdf0e10cSrcweir     {
1182cdf0e10cSrcweir         rRect = Rectangle(
1183cdf0e10cSrcweir             Point(rRect.Left() + ((rRect.GetWidth() - rRect.GetHeight()) / 2), rRect.Top()),
1184cdf0e10cSrcweir             Size(rRect.GetHeight(), rRect.GetHeight()));
1185cdf0e10cSrcweir     }
1186cdf0e10cSrcweir     else
1187cdf0e10cSrcweir     {
1188cdf0e10cSrcweir         rRect = Rectangle(
1189cdf0e10cSrcweir             Point(rRect.Left(), rRect.Top() + ((rRect.GetHeight() - rRect.GetWidth()) / 2)),
1190cdf0e10cSrcweir             Size(rRect.GetWidth(), rRect.GetWidth()));
1191cdf0e10cSrcweir     }
1192cdf0e10cSrcweir }
1193cdf0e10cSrcweir 
1194cdf0e10cSrcweir 
1195cdf0e10cSrcweir 
1196cdf0e10cSrcweir 
1197cdf0e10cSrcweir void FuPoor::SwitchLayer (sal_Int32 nOffset)
1198cdf0e10cSrcweir {
1199cdf0e10cSrcweir     if(mpViewShell && mpViewShell->ISA(DrawViewShell))
1200cdf0e10cSrcweir     {
1201cdf0e10cSrcweir         DrawViewShell* pDrawViewShell =
1202cdf0e10cSrcweir             static_cast<DrawViewShell*>(mpViewShell);
1203cdf0e10cSrcweir 
1204cdf0e10cSrcweir         // Calculate the new index.
1205cdf0e10cSrcweir         sal_Int32 nIndex = pDrawViewShell->GetActiveTabLayerIndex() + nOffset;
1206cdf0e10cSrcweir 
1207cdf0e10cSrcweir         // Make sure the new index lies inside the range of valid indices.
1208cdf0e10cSrcweir         if (nIndex < 0)
1209cdf0e10cSrcweir             nIndex = 0;
1210cdf0e10cSrcweir         else if (nIndex >= pDrawViewShell->GetTabLayerCount ())
1211cdf0e10cSrcweir             nIndex = pDrawViewShell->GetTabLayerCount() - 1;
1212cdf0e10cSrcweir 
1213cdf0e10cSrcweir         // Set the new active layer.
1214cdf0e10cSrcweir         if (nIndex != pDrawViewShell->GetActiveTabLayerIndex ())
1215cdf0e10cSrcweir         {
1216cdf0e10cSrcweir             LayerTabBar* pLayerTabControl =
1217cdf0e10cSrcweir                 static_cast<DrawViewShell*>(mpViewShell)->GetLayerTabControl();
1218cdf0e10cSrcweir             if (pLayerTabControl != NULL)
1219cdf0e10cSrcweir                 pLayerTabControl->SendDeactivatePageEvent ();
1220cdf0e10cSrcweir 
1221cdf0e10cSrcweir             pDrawViewShell->SetActiveTabLayerIndex (nIndex);
1222cdf0e10cSrcweir 
1223cdf0e10cSrcweir             if (pLayerTabControl != NULL)
1224cdf0e10cSrcweir                 pLayerTabControl->SendActivatePageEvent ();
1225cdf0e10cSrcweir         }
1226cdf0e10cSrcweir     }
1227cdf0e10cSrcweir }
1228cdf0e10cSrcweir 
1229cdf0e10cSrcweir /** is called when the currenct function should be aborted. <p>
1230cdf0e10cSrcweir     This is used when a function gets a KEY_ESCAPE but can also
1231cdf0e10cSrcweir     be called directly.
1232cdf0e10cSrcweir 
1233cdf0e10cSrcweir     @returns true if a active function was aborted
1234cdf0e10cSrcweir */
1235cdf0e10cSrcweir bool FuPoor::cancel()
1236cdf0e10cSrcweir {
1237cdf0e10cSrcweir     if ( !this->ISA(FuSelection) )
1238cdf0e10cSrcweir     {
1239cdf0e10cSrcweir         mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON);
1240cdf0e10cSrcweir         return true;
1241cdf0e10cSrcweir     }
1242cdf0e10cSrcweir 
1243cdf0e10cSrcweir     return false;
1244cdf0e10cSrcweir }
1245cdf0e10cSrcweir 
1246cdf0e10cSrcweir // #i33136#
1247cdf0e10cSrcweir bool FuPoor::doConstructOrthogonal() const
1248cdf0e10cSrcweir {
1249cdf0e10cSrcweir     return (
1250cdf0e10cSrcweir         SID_DRAW_XLINE == nSlotId ||
1251cdf0e10cSrcweir         SID_DRAW_CIRCLEARC == nSlotId ||
1252cdf0e10cSrcweir         SID_DRAW_SQUARE == nSlotId ||
1253cdf0e10cSrcweir         SID_DRAW_SQUARE_NOFILL == nSlotId ||
1254cdf0e10cSrcweir         SID_DRAW_SQUARE_ROUND == nSlotId ||
1255cdf0e10cSrcweir         SID_DRAW_SQUARE_ROUND_NOFILL == nSlotId ||
1256cdf0e10cSrcweir         SID_DRAW_CIRCLE == nSlotId ||
1257cdf0e10cSrcweir         SID_DRAW_CIRCLE_NOFILL == nSlotId ||
1258cdf0e10cSrcweir         SID_DRAW_CIRCLEPIE == nSlotId ||
1259cdf0e10cSrcweir         SID_DRAW_CIRCLEPIE_NOFILL == nSlotId ||
1260cdf0e10cSrcweir         SID_DRAW_CIRCLECUT == nSlotId ||
1261cdf0e10cSrcweir         SID_DRAW_CIRCLECUT_NOFILL == nSlotId ||
1262cdf0e10cSrcweir         SID_DRAW_XPOLYGON == nSlotId ||
1263cdf0e10cSrcweir         SID_DRAW_XPOLYGON_NOFILL == nSlotId ||
1264cdf0e10cSrcweir         SID_3D_CUBE == nSlotId ||
1265cdf0e10cSrcweir         SID_3D_SPHERE == nSlotId ||
1266cdf0e10cSrcweir         SID_3D_SHELL == nSlotId ||
1267cdf0e10cSrcweir         SID_3D_HALF_SPHERE == nSlotId ||
1268cdf0e10cSrcweir         SID_3D_TORUS == nSlotId ||
1269cdf0e10cSrcweir         SID_3D_CYLINDER == nSlotId ||
1270cdf0e10cSrcweir         SID_3D_CONE == nSlotId ||
1271cdf0e10cSrcweir         SID_3D_PYRAMID == nSlotId);
1272cdf0e10cSrcweir }
1273cdf0e10cSrcweir 
1274cdf0e10cSrcweir void FuPoor::DoExecute( SfxRequest& )
1275cdf0e10cSrcweir {
1276cdf0e10cSrcweir }
1277cdf0e10cSrcweir 
1278cdf0e10cSrcweir } // end of namespace sd
1279