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