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