xref: /AOO41X/main/basctl/source/dlged/dlgedfunc.cxx (revision 31598a226906602f93ad246cbee896e3caca5f8f)
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_basctl.hxx"
26 #include <vcl/scrbar.hxx>
27 #include <svx/svdview.hxx>
28 #include "dlgedfunc.hxx"
29 #include "dlged.hxx"
30 #include "dlgedview.hxx"
31 #include <vcl/seleng.hxx>
32 
33 
34 //----------------------------------------------------------------------------
35 
IMPL_LINK_INLINE_START(DlgEdFunc,ScrollTimeout,Timer *,pTimer)36 IMPL_LINK_INLINE_START( DlgEdFunc, ScrollTimeout, Timer *, pTimer )
37 {
38     (void)pTimer;
39     Window* pWindow = pParent->GetWindow();
40     Point aPos = pWindow->ScreenToOutputPixel( pWindow->GetPointerPosPixel() );
41     aPos = pWindow->PixelToLogic( aPos );
42     ForceScroll( aPos );
43     return 0;
44 }
IMPL_LINK_INLINE_END(DlgEdFunc,ScrollTimeout,Timer *,pTimer)45 IMPL_LINK_INLINE_END( DlgEdFunc, ScrollTimeout, Timer *, pTimer )
46 
47 //----------------------------------------------------------------------------
48 
49 void DlgEdFunc::ForceScroll( const Point& rPos )
50 {
51     aScrollTimer.Stop();
52 
53     Window* pWindow  = pParent->GetWindow();
54 
55     static Point aDefPoint;
56     Rectangle aOutRect( aDefPoint, pWindow->GetOutputSizePixel() );
57     aOutRect = pWindow->PixelToLogic( aOutRect );
58 
59     ScrollBar* pHScroll = pParent->GetHScroll();
60     ScrollBar* pVScroll = pParent->GetVScroll();
61     long nDeltaX = pHScroll->GetLineSize();
62     long nDeltaY = pVScroll->GetLineSize();
63 
64     if( !aOutRect.IsInside( rPos ) )
65     {
66         if( rPos.X() < aOutRect.Left() )
67             nDeltaX = -nDeltaX;
68         else
69         if( rPos.X() <= aOutRect.Right() )
70             nDeltaX = 0;
71 
72         if( rPos.Y() < aOutRect.Top() )
73             nDeltaY = -nDeltaY;
74         else
75         if( rPos.Y() <= aOutRect.Bottom() )
76             nDeltaY = 0;
77 
78         if( nDeltaX )
79             pHScroll->SetThumbPos( pHScroll->GetThumbPos() + nDeltaX );
80         if( nDeltaY )
81             pVScroll->SetThumbPos( pVScroll->GetThumbPos() + nDeltaY );
82 
83         if( nDeltaX )
84             pParent->DoScroll( pHScroll );
85         if( nDeltaY )
86             pParent->DoScroll( pVScroll );
87     }
88 
89     aScrollTimer.Start();
90 }
91 
92 //----------------------------------------------------------------------------
93 
DlgEdFunc(DlgEditor * pParent_)94 DlgEdFunc::DlgEdFunc( DlgEditor* pParent_ )
95 {
96     DlgEdFunc::pParent = pParent_;
97     aScrollTimer.SetTimeoutHdl( LINK( this, DlgEdFunc, ScrollTimeout ) );
98     aScrollTimer.SetTimeout( SELENG_AUTOREPEAT_INTERVAL );
99 }
100 
101 //----------------------------------------------------------------------------
102 
~DlgEdFunc()103 DlgEdFunc::~DlgEdFunc()
104 {
105 }
106 
107 //----------------------------------------------------------------------------
108 
MouseButtonDown(const MouseEvent &)109 sal_Bool DlgEdFunc::MouseButtonDown( const MouseEvent& )
110 {
111     return sal_True;
112 }
113 
114 //----------------------------------------------------------------------------
115 
MouseButtonUp(const MouseEvent &)116 sal_Bool DlgEdFunc::MouseButtonUp( const MouseEvent& )
117 {
118     aScrollTimer.Stop();
119     return sal_True;
120 }
121 
122 //----------------------------------------------------------------------------
123 
MouseMove(const MouseEvent &)124 sal_Bool DlgEdFunc::MouseMove( const MouseEvent& )
125 {
126     return sal_True;
127 }
128 
129 //----------------------------------------------------------------------------
130 
KeyInput(const KeyEvent & rKEvt)131 sal_Bool DlgEdFunc::KeyInput( const KeyEvent& rKEvt )
132 {
133     sal_Bool bReturn = sal_False;
134 
135     SdrView* pView = pParent->GetView();
136     Window* pWindow = pParent->GetWindow();
137 
138     KeyCode aCode = rKEvt.GetKeyCode();
139     sal_uInt16 nCode = aCode.GetCode();
140 
141     switch ( nCode )
142     {
143         case KEY_ESCAPE:
144         {
145             if ( pView->IsAction() )
146             {
147                 pView->BrkAction();
148                 bReturn = sal_True;
149             }
150             else if ( pView->AreObjectsMarked() )
151             {
152                 const SdrHdlList& rHdlList = pView->GetHdlList();
153                 SdrHdl* pHdl = rHdlList.GetFocusHdl();
154                 if ( pHdl )
155                     ((SdrHdlList&)rHdlList).ResetFocusHdl();
156                 else
157                     pView->UnmarkAll();
158 
159                 bReturn = sal_True;
160             }
161         }
162         break;
163         case KEY_TAB:
164         {
165             if ( !aCode.IsMod1() && !aCode.IsMod2() )
166             {
167                 // mark next object
168                 if ( !pView->MarkNextObj( !aCode.IsShift() ) )
169                 {
170                     // if no next object, mark first/last
171                     pView->UnmarkAllObj();
172                     pView->MarkNextObj( !aCode.IsShift() );
173                 }
174 
175                 if ( pView->AreObjectsMarked() )
176                     pView->MakeVisible( pView->GetAllMarkedRect(), *pWindow );
177 
178                 bReturn = sal_True;
179             }
180             else if ( aCode.IsMod1() )
181             {
182                 // selected handle
183                 const SdrHdlList& rHdlList = pView->GetHdlList();
184                 ((SdrHdlList&)rHdlList).TravelFocusHdl( !aCode.IsShift() );
185 
186                 // guarantee visibility of focused handle
187                 SdrHdl* pHdl = rHdlList.GetFocusHdl();
188                 if ( pHdl )
189                 {
190                     Point aHdlPosition( pHdl->GetPos() );
191                     Rectangle aVisRect( aHdlPosition - Point( 100, 100 ), Size( 200, 200 ) );
192                     pView->MakeVisible( aVisRect, *pWindow );
193                 }
194 
195                 bReturn = sal_True;
196             }
197         }
198         break;
199         case KEY_UP:
200         case KEY_DOWN:
201         case KEY_LEFT:
202         case KEY_RIGHT:
203         {
204             long nX = 0;
205             long nY = 0;
206 
207             if ( nCode == KEY_UP )
208             {
209                 // scroll up
210                 nX =  0;
211                 nY = -1;
212             }
213             else if ( nCode == KEY_DOWN )
214             {
215                 // scroll down
216                 nX =  0;
217                 nY =  1;
218             }
219             else if ( nCode == KEY_LEFT )
220             {
221                 // scroll left
222                 nX = -1;
223                 nY =  0;
224             }
225             else if ( nCode == KEY_RIGHT )
226             {
227                 // scroll right
228                 nX =  1;
229                 nY =  0;
230             }
231 
232             if ( pView->AreObjectsMarked() && !aCode.IsMod1() )
233             {
234                 if ( aCode.IsMod2() )
235                 {
236                     // move in 1 pixel distance
237                     Size aPixelSize = pWindow ? pWindow->PixelToLogic( Size( 1, 1 ) ) : Size( 100, 100 );
238                     nX *= aPixelSize.Width();
239                     nY *= aPixelSize.Height();
240                 }
241                 else
242                 {
243                     // move in 1 mm distance
244                     nX *= 100;
245                     nY *= 100;
246                 }
247 
248                 const SdrHdlList& rHdlList = pView->GetHdlList();
249                 SdrHdl* pHdl = rHdlList.GetFocusHdl();
250 
251                 if ( pHdl == 0 )
252                 {
253                     // no handle selected
254                     if ( pView->IsMoveAllowed() )
255                     {
256                         // restrict movement to work area
257                         const Rectangle& rWorkArea = pView->GetWorkArea();
258 
259                         if ( !rWorkArea.IsEmpty() )
260                         {
261                             Rectangle aMarkRect( pView->GetMarkedObjRect() );
262                             aMarkRect.Move( nX, nY );
263 
264                             if ( !rWorkArea.IsInside( aMarkRect ) )
265                             {
266                                 if ( aMarkRect.Left() < rWorkArea.Left() )
267                                     nX += rWorkArea.Left() - aMarkRect.Left();
268 
269                                 if ( aMarkRect.Right() > rWorkArea.Right() )
270                                     nX -= aMarkRect.Right() - rWorkArea.Right();
271 
272                                 if ( aMarkRect.Top() < rWorkArea.Top() )
273                                     nY += rWorkArea.Top() - aMarkRect.Top();
274 
275                                 if ( aMarkRect.Bottom() > rWorkArea.Bottom() )
276                                     nY -= aMarkRect.Bottom() - rWorkArea.Bottom();
277                             }
278                         }
279 
280                         if ( nX != 0 || nY != 0 )
281                         {
282                             pView->MoveAllMarked( Size( nX, nY ) );
283                             pView->MakeVisible( pView->GetAllMarkedRect(), *pWindow );
284                         }
285                     }
286                 }
287                 else
288                 {
289                     // move the handle
290                     if ( pHdl && ( nX || nY ) )
291                     {
292                         Point aStartPoint( pHdl->GetPos() );
293                         Point aEndPoint( pHdl->GetPos() + Point( nX, nY ) );
294                         const SdrDragStat& rDragStat = pView->GetDragStat();
295 
296                         // start dragging
297                         pView->BegDragObj( aStartPoint, 0, pHdl, 0 );
298 
299                         if ( pView->IsDragObj() )
300                         {
301                             FASTBOOL bWasNoSnap = rDragStat.IsNoSnap();
302                             sal_Bool bWasSnapEnabled = pView->IsSnapEnabled();
303 
304                             // switch snapping off
305                             if ( !bWasNoSnap )
306                                 ((SdrDragStat&)rDragStat).SetNoSnap( sal_True );
307                             if ( bWasSnapEnabled )
308                                 pView->SetSnapEnabled( sal_False );
309 
310                             pView->MovAction( aEndPoint );
311                             pView->EndDragObj();
312 
313                             // restore snap
314                             if ( !bWasNoSnap )
315                                 ((SdrDragStat&)rDragStat).SetNoSnap( bWasNoSnap );
316                             if ( bWasSnapEnabled )
317                                 pView->SetSnapEnabled( bWasSnapEnabled );
318                         }
319 
320                         // make moved handle visible
321                         Rectangle aVisRect( aEndPoint - Point( 100, 100 ), Size( 200, 200 ) );
322                         pView->MakeVisible( aVisRect, *pWindow );
323                     }
324                 }
325             }
326             else
327             {
328                 // scroll page
329                 ScrollBar* pScrollBar = ( nX != 0 ) ? pParent->GetHScroll() : pParent->GetVScroll();
330                 if ( pScrollBar )
331                 {
332                     long nRangeMin = pScrollBar->GetRangeMin();
333                     long nRangeMax = pScrollBar->GetRangeMax();
334                     long nThumbPos = pScrollBar->GetThumbPos() + ( ( nX != 0 ) ? nX : nY ) * pScrollBar->GetLineSize();
335                     if ( nThumbPos < nRangeMin )
336                         nThumbPos = nRangeMin;
337                     if ( nThumbPos > nRangeMax )
338                         nThumbPos = nRangeMax;
339                     pScrollBar->SetThumbPos( nThumbPos );
340                     pParent->DoScroll( pScrollBar );
341                 }
342             }
343 
344             bReturn = sal_True;
345         }
346         break;
347         default:
348         {
349         }
350         break;
351     }
352 
353     if ( bReturn )
354         pWindow->ReleaseMouse();
355 
356     return bReturn;
357 }
358 
359 //----------------------------------------------------------------------------
360 
DlgEdFuncInsert(DlgEditor * pParent_)361 DlgEdFuncInsert::DlgEdFuncInsert( DlgEditor* pParent_ ) :
362     DlgEdFunc( pParent_ )
363 {
364     pParent_->GetView()->SetCreateMode( sal_True );
365 }
366 
367 //----------------------------------------------------------------------------
368 
~DlgEdFuncInsert()369 DlgEdFuncInsert::~DlgEdFuncInsert()
370 {
371     pParent->GetView()->SetEditMode( sal_True );
372 }
373 
374 //----------------------------------------------------------------------------
375 
MouseButtonDown(const MouseEvent & rMEvt)376 sal_Bool DlgEdFuncInsert::MouseButtonDown( const MouseEvent& rMEvt )
377 {
378     if( !rMEvt.IsLeft() )
379         return sal_True;
380 
381     SdrView* pView  = pParent->GetView();
382     Window*  pWindow= pParent->GetWindow();
383     pView->SetActualWin( pWindow );
384 
385     Point aPos = pWindow->PixelToLogic( rMEvt.GetPosPixel() );
386     sal_uInt16 nHitLog = sal_uInt16 ( pWindow->PixelToLogic(Size(3,0)).Width() );
387     sal_uInt16 nDrgLog = sal_uInt16 ( pWindow->PixelToLogic(Size(3,0)).Width() );
388 
389     pWindow->CaptureMouse();
390 
391     if ( rMEvt.IsLeft() && rMEvt.GetClicks() == 1 )
392     {
393         SdrHdl* pHdl = pView->PickHandle(aPos);
394 
395         // if selected object was hit, drag object
396         if ( pHdl!=NULL || pView->IsMarkedHit(aPos, nHitLog) )
397             pView->BegDragObj(aPos, (OutputDevice*) NULL, pHdl, nDrgLog);
398         else if ( pView->AreObjectsMarked() )
399             pView->UnmarkAll();
400 
401         // if no action, create object
402         if ( !pView->IsAction() )
403             pView->BegCreateObj(aPos);
404     }
405     else if ( rMEvt.IsLeft() && rMEvt.GetClicks() == 2 )
406     {
407         // if object was hit, show property browser
408         if ( pView->IsMarkedHit(aPos, nHitLog) && pParent->GetMode() != DLGED_READONLY )
409             pParent->ShowProperties();
410     }
411 
412     return sal_True;
413 }
414 
415 //----------------------------------------------------------------------------
416 
MouseButtonUp(const MouseEvent & rMEvt)417 sal_Bool DlgEdFuncInsert::MouseButtonUp( const MouseEvent& rMEvt )
418 {
419     DlgEdFunc::MouseButtonUp( rMEvt );
420 
421     SdrView* pView  = pParent->GetView();
422     Window*  pWindow= pParent->GetWindow();
423     pView->SetActualWin( pWindow );
424 
425     pWindow->ReleaseMouse();
426 
427     // object creation active?
428     if ( pView->IsCreateObj() )
429     {
430         pView->EndCreateObj(SDRCREATE_FORCEEND);
431 
432         if ( !pView->AreObjectsMarked() )
433         {
434             sal_uInt16 nHitLog = sal_uInt16 ( pWindow->PixelToLogic(Size(3,0)).Width() );
435             Point aPos( pWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
436             pView->MarkObj(aPos, nHitLog);
437         }
438 
439         if( pView->AreObjectsMarked() )
440             return sal_True;
441         else
442             return sal_False;
443     }
444     else
445     {
446         if ( pView->IsDragObj() )
447              pView->EndDragObj( rMEvt.IsMod1() );
448         return sal_True;
449     }
450 }
451 
452 //----------------------------------------------------------------------------
453 
MouseMove(const MouseEvent & rMEvt)454 sal_Bool DlgEdFuncInsert::MouseMove( const MouseEvent& rMEvt )
455 {
456     SdrView* pView  = pParent->GetView();
457     Window*  pWindow= pParent->GetWindow();
458     pView->SetActualWin( pWindow );
459 
460     Point   aPos( pWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
461     sal_uInt16 nHitLog = sal_uInt16 ( pWindow->PixelToLogic(Size(3,0)).Width() );
462 
463     if ( pView->IsAction() )
464     {
465         ForceScroll(aPos);
466         pView->MovAction(aPos);
467     }
468 
469     pWindow->SetPointer( pView->GetPreferedPointer( aPos, pWindow, nHitLog ) );
470 
471     return sal_True;
472 }
473 
474 //----------------------------------------------------------------------------
475 
DlgEdFuncSelect(DlgEditor * pParent_)476 DlgEdFuncSelect::DlgEdFuncSelect( DlgEditor* pParent_ ) :
477     DlgEdFunc( pParent_ ),
478     bMarkAction(sal_False)
479 {
480 }
481 
482 //----------------------------------------------------------------------------
483 
~DlgEdFuncSelect()484 DlgEdFuncSelect::~DlgEdFuncSelect()
485 {
486 }
487 
488 //----------------------------------------------------------------------------
489 
MouseButtonDown(const MouseEvent & rMEvt)490 sal_Bool DlgEdFuncSelect::MouseButtonDown( const MouseEvent& rMEvt )
491 {
492     // get view from parent
493     SdrView* pView   = pParent->GetView();
494     Window*  pWindow = pParent->GetWindow();
495     pView->SetActualWin( pWindow );
496 
497     sal_uInt16 nDrgLog = sal_uInt16 ( pWindow->PixelToLogic(Size(3,0)).Width() );
498     sal_uInt16 nHitLog = sal_uInt16 ( pWindow->PixelToLogic(Size(3,0)).Width() );
499     Point  aMDPos = pWindow->PixelToLogic( rMEvt.GetPosPixel() );
500 
501     if ( rMEvt.IsLeft() && rMEvt.GetClicks() == 1 )
502     {
503         SdrHdl* pHdl = pView->PickHandle(aMDPos);
504         SdrObject* pObj;
505         SdrPageView* pPV;
506 
507         // hit selected object?
508         if ( pHdl!=NULL || pView->IsMarkedHit(aMDPos, nHitLog) )
509         {
510             pView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl, nDrgLog);
511         }
512         else
513         {
514             // if not multi selection, unmark all
515             if ( !rMEvt.IsShift() )
516                 pView->UnmarkAll();
517             else
518             {
519                 if( pView->PickObj( aMDPos, nHitLog, pObj, pPV ) )
520                 {
521                     //if( pObj->ISA( DlgEdForm ) )
522                     //  pView->UnmarkAll();
523                     //else
524                     //  pParent->UnmarkDialog();
525                 }
526             }
527 
528             if ( pView->MarkObj(aMDPos, nHitLog) )
529             {
530                 // drag object
531                 pHdl=pView->PickHandle(aMDPos);
532                 pView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl, nDrgLog);
533             }
534             else
535             {
536                 // select object
537                 pView->BegMarkObj(aMDPos);
538                 bMarkAction = sal_True;
539             }
540         }
541     }
542     else if ( rMEvt.IsLeft() && rMEvt.GetClicks() == 2 )
543     {
544         // if object was hit, show property browser
545         if ( pView->IsMarkedHit(aMDPos, nHitLog) && pParent->GetMode() != DLGED_READONLY )
546             pParent->ShowProperties();
547     }
548 
549     return sal_True;
550 }
551 
552 //----------------------------------------------------------------------------
553 
MouseButtonUp(const MouseEvent & rMEvt)554 sal_Bool DlgEdFuncSelect::MouseButtonUp( const MouseEvent& rMEvt )
555 {
556     DlgEdFunc::MouseButtonUp( rMEvt );
557 
558     // get view from parent
559     SdrView* pView  = pParent->GetView();
560     Window*  pWindow= pParent->GetWindow();
561     pView->SetActualWin( pWindow );
562 
563     Point aPnt( pWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
564     sal_uInt16 nHitLog = sal_uInt16 ( pWindow->PixelToLogic(Size(3,0)).Width() );
565 
566     if ( rMEvt.IsLeft() )
567     {
568         if ( pView->IsDragObj() )
569         {
570             // object was dragged
571             pView->EndDragObj( rMEvt.IsMod1() );
572             pView->ForceMarkedToAnotherPage();
573         }
574         else
575         if (pView->IsAction() )
576         {
577             pView->EndAction();
578             //if( bMarkAction )
579                 //pParent->UnmarkDialog();
580         }
581     }
582 
583 //  sal_uInt16 nClicks = rMEvt.GetClicks();
584 //  if (nClicks == 2)
585 //  {
586 //      if ( pView->AreObjectsMarked() )
587 //      {
588 //          const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
589 //
590 //          if (rMarkList.GetMarkCount() == 1)
591 //          {
592 //              SdrMark* pMark = rMarkList.GetMark(0);
593 //              SdrObject* pObj = pMark->GetMarkedSdrObj();
594 //
595 //              // edit objects here
596 //          }
597 //      }
598 //  }
599 
600     bMarkAction = sal_False;
601 
602     pWindow->SetPointer( pView->GetPreferedPointer( aPnt, pWindow, nHitLog ) );
603     pWindow->ReleaseMouse();
604 
605     return sal_True;
606 }
607 
608 //----------------------------------------------------------------------------
609 
MouseMove(const MouseEvent & rMEvt)610 sal_Bool DlgEdFuncSelect::MouseMove( const MouseEvent& rMEvt )
611 {
612     SdrView* pView  = pParent->GetView();
613     Window*  pWindow= pParent->GetWindow();
614     pView->SetActualWin( pWindow );
615 
616     Point aPnt( pWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
617     sal_uInt16 nHitLog = sal_uInt16 ( pWindow->PixelToLogic(Size(3,0)).Width() );
618 
619     if ( pView->IsAction() )
620     {
621         Point aPix(rMEvt.GetPosPixel());
622         Point aPnt_(pWindow->PixelToLogic(aPix));
623 
624         ForceScroll(aPnt_);
625         pView->MovAction(aPnt_);
626     }
627 
628     pWindow->SetPointer( pView->GetPreferedPointer( aPnt, pWindow, nHitLog ) );
629 
630     return sal_True;
631 }
632 
633 //----------------------------------------------------------------------------
634