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