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 :
21 : #include "fuediglu.hxx"
22 : #include <svl/eitem.hxx>
23 : #include <svx/dialogs.hrc>
24 : #include <svx/svdglue.hxx>
25 : #include <sfx2/request.hxx>
26 :
27 :
28 : #include "app.hrc"
29 : #include "strings.hrc"
30 : #include "res_bmp.hrc"
31 : #include "Window.hxx"
32 : #include "drawdoc.hxx"
33 : #include "FrameView.hxx"
34 : #include "View.hxx"
35 : #include "ViewShell.hxx"
36 : #include "ViewShellBase.hxx"
37 : #include "ToolBarManager.hxx"
38 :
39 : namespace sd {
40 :
41 0 : TYPEINIT1( FuEditGluePoints, FuDraw );
42 :
43 :
44 0 : FuEditGluePoints::FuEditGluePoints (
45 : ViewShell* pViewSh,
46 : ::sd::Window* pWin,
47 : ::sd::View* pView,
48 : SdDrawDocument* pDoc,
49 : SfxRequest& rReq)
50 : : FuDraw(pViewSh, pWin, pView, pDoc, rReq)
51 : //Add Shift+UP/DOWN/LEFT/RIGHT key to move the position of insert point,
52 : //and SHIFT+ENTER key to decide the postion and draw the new insert point
53 : ,bBeginInsertPoint(sal_False),
54 0 : oldPoint(0,0)
55 : {
56 0 : }
57 :
58 0 : rtl::Reference<FuPoor> FuEditGluePoints::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent )
59 : {
60 : FuEditGluePoints* pFunc;
61 0 : rtl::Reference<FuPoor> xFunc( pFunc = new FuEditGluePoints( pViewSh, pWin, pView, pDoc, rReq ) );
62 0 : xFunc->DoExecute(rReq);
63 0 : pFunc->SetPermanent( bPermanent );
64 0 : return xFunc;
65 : }
66 :
67 0 : void FuEditGluePoints::DoExecute( SfxRequest& rReq )
68 : {
69 0 : FuDraw::DoExecute( rReq );
70 0 : mpView->SetInsGluePointMode(false);
71 0 : mpViewShell->GetViewShellBase().GetToolBarManager()->AddToolBar(
72 : ToolBarManager::TBG_FUNCTION,
73 0 : ToolBarManager::msGluePointsToolBar);
74 0 : }
75 :
76 :
77 0 : FuEditGluePoints::~FuEditGluePoints()
78 : {
79 0 : mpView->BrkAction();
80 0 : mpView->UnmarkAllGluePoints();
81 0 : mpView->SetInsGluePointMode(false);
82 0 : }
83 :
84 :
85 0 : sal_Bool FuEditGluePoints::MouseButtonDown(const MouseEvent& rMEvt)
86 : {
87 0 : mpView->SetActualWin( mpWindow );
88 :
89 0 : sal_Bool bReturn = FuDraw::MouseButtonDown(rMEvt);
90 :
91 0 : if (mpView->IsAction())
92 : {
93 0 : if (rMEvt.IsRight())
94 0 : mpView->BckAction();
95 :
96 0 : return sal_True;
97 : }
98 :
99 0 : if (rMEvt.IsLeft())
100 : {
101 0 : bReturn = sal_True;
102 0 : sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() );
103 0 : sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
104 0 : mpWindow->CaptureMouse();
105 :
106 0 : SdrViewEvent aVEvt;
107 0 : SdrHitKind eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
108 :
109 0 : if (eHit == SDRHIT_HANDLE)
110 : {
111 : // drag handle
112 0 : SdrHdl* pHdl = aVEvt.pHdl;
113 :
114 0 : if (mpView->IsGluePointMarked(aVEvt.pObj, aVEvt.nGlueId) && rMEvt.IsShift())
115 : {
116 0 : mpView->UnmarkGluePoint(aVEvt.pObj, aVEvt.nGlueId, aVEvt.pPV);
117 0 : pHdl = NULL;
118 : }
119 :
120 0 : if (pHdl)
121 : {
122 : // drag handle
123 0 : mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, aVEvt.pHdl, nDrgLog);
124 : }
125 : }
126 0 : else if (eHit == SDRHIT_MARKEDOBJECT && mpView->IsInsGluePointMode())
127 : {
128 : // insert glue points
129 0 : mpView->BegInsGluePoint(aMDPos);
130 : }
131 0 : else if (eHit == SDRHIT_MARKEDOBJECT && rMEvt.IsMod1())
132 : {
133 : // select glue points
134 0 : if (!rMEvt.IsShift())
135 0 : mpView->UnmarkAllGluePoints();
136 :
137 0 : mpView->BegMarkGluePoints(aMDPos);
138 : }
139 0 : else if (eHit == SDRHIT_MARKEDOBJECT && !rMEvt.IsShift() && !rMEvt.IsMod2())
140 : {
141 : // move object
142 0 : mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, NULL, nDrgLog);
143 : }
144 0 : else if (eHit == SDRHIT_GLUEPOINT)
145 : {
146 : // select glue points
147 0 : if (!rMEvt.IsShift())
148 0 : mpView->UnmarkAllGluePoints();
149 :
150 0 : mpView->MarkGluePoint(aVEvt.pObj, aVEvt.nGlueId, aVEvt.pPV);
151 0 : SdrHdl* pHdl = mpView->GetGluePointHdl(aVEvt.pObj, aVEvt.nGlueId);
152 :
153 0 : if (pHdl)
154 : {
155 0 : mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl, nDrgLog);
156 : }
157 : }
158 : else
159 : {
160 : // select or drag object
161 0 : if (!rMEvt.IsShift() && !rMEvt.IsMod2() && eHit == SDRHIT_UNMARKEDOBJECT)
162 : {
163 0 : mpView->UnmarkAllObj();
164 : }
165 :
166 0 : sal_Bool bMarked = sal_False;
167 :
168 0 : if (!rMEvt.IsMod1())
169 : {
170 0 : if (rMEvt.IsMod2())
171 : {
172 0 : bMarked = mpView->MarkNextObj(aMDPos, nHitLog, rMEvt.IsShift());
173 : }
174 : else
175 : {
176 0 : bMarked = mpView->MarkObj(aMDPos, nHitLog, rMEvt.IsShift());
177 : }
178 : }
179 :
180 0 : if (bMarked &&
181 0 : (!rMEvt.IsShift() || eHit == SDRHIT_MARKEDOBJECT))
182 : {
183 : // move object
184 0 : mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, aVEvt.pHdl, nDrgLog);
185 : }
186 0 : else if (mpView->AreObjectsMarked())
187 : {
188 : // select glue point
189 0 : if (!rMEvt.IsShift())
190 0 : mpView->UnmarkAllGluePoints();
191 :
192 0 : mpView->BegMarkGluePoints(aMDPos);
193 : }
194 : else
195 : {
196 : // select object
197 0 : mpView->BegMarkObj(aMDPos);
198 : }
199 : }
200 :
201 0 : ForcePointer(&rMEvt);
202 : }
203 :
204 0 : return bReturn;
205 : }
206 :
207 :
208 0 : sal_Bool FuEditGluePoints::MouseMove(const MouseEvent& rMEvt)
209 : {
210 0 : mpView->SetActualWin( mpWindow );
211 :
212 0 : FuDraw::MouseMove(rMEvt);
213 :
214 0 : if (mpView->IsAction())
215 : {
216 0 : Point aPix(rMEvt.GetPosPixel());
217 0 : Point aPnt( mpWindow->PixelToLogic(aPix) );
218 0 : ForceScroll(aPix);
219 0 : mpView->MovAction(aPnt);
220 : }
221 :
222 0 : ForcePointer(&rMEvt);
223 :
224 0 : return sal_True;
225 : }
226 :
227 :
228 0 : sal_Bool FuEditGluePoints::MouseButtonUp(const MouseEvent& rMEvt)
229 : {
230 0 : mpView->SetActualWin( mpWindow );
231 :
232 0 : sal_Bool bReturn = sal_False;
233 :
234 0 : if (mpView->IsAction())
235 : {
236 0 : bReturn = sal_True;
237 0 : mpView->EndAction();
238 : }
239 :
240 0 : FuDraw::MouseButtonUp(rMEvt);
241 :
242 0 : sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
243 0 : Point aPos = mpWindow->PixelToLogic( rMEvt.GetPosPixel() );
244 :
245 0 : if (std::abs(aMDPos.X() - aPos.X()) < nDrgLog &&
246 0 : std::abs(aMDPos.Y() - aPos.Y()) < nDrgLog &&
247 0 : !rMEvt.IsShift() && !rMEvt.IsMod2())
248 : {
249 0 : SdrViewEvent aVEvt;
250 0 : SdrHitKind eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
251 :
252 0 : if (eHit == SDRHIT_NONE)
253 : {
254 : // click on position: deselect
255 0 : mpView->UnmarkAllObj();
256 0 : }
257 : }
258 :
259 0 : mpWindow->ReleaseMouse();
260 :
261 0 : return bReturn;
262 : }
263 :
264 : /**
265 : * Process keyboard input
266 : * @returns sal_True if a KeyEvent is being processed, sal_False otherwise
267 : */
268 0 : sal_Bool FuEditGluePoints::KeyInput(const KeyEvent& rKEvt)
269 : {
270 0 : mpView->SetActualWin( mpWindow );
271 :
272 : //Add Shift+UP/DOWN/LEFT/RIGHT key to move the position of insert point,
273 : //and SHIFT+ENTER key to decide the postion and draw the new insert point
274 :
275 0 : sal_Bool bReturn = sal_False;
276 :
277 0 : switch (rKEvt.GetKeyCode().GetCode())
278 : {
279 : case KEY_UP:
280 : case KEY_DOWN:
281 : case KEY_LEFT:
282 : case KEY_RIGHT:
283 : {
284 0 : if(rKEvt.GetKeyCode().IsShift()&& mpView->IsInsGluePointMode() ){
285 0 : long nX = 0;
286 0 : long nY = 0;
287 0 : sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode();
288 0 : if (nCode == KEY_UP)
289 : {
290 : // Scroll nach oben
291 0 : nX = 0;
292 0 : nY =-1;
293 : }
294 0 : else if (nCode == KEY_DOWN)
295 : {
296 : // Scroll nach unten
297 0 : nX = 0;
298 0 : nY = 1;
299 : }
300 0 : else if (nCode == KEY_LEFT)
301 : {
302 : // Scroll nach links
303 0 : nX =-1;
304 0 : nY = 0;
305 : }
306 0 : else if (nCode == KEY_RIGHT)
307 : {
308 : // Scroll nach rechts
309 0 : nX = 1;
310 0 : nY = 0;
311 : }
312 0 : Point centerPoint;
313 0 : Rectangle rect = mpView->GetMarkedObjRect();
314 0 : centerPoint = mpWindow->LogicToPixel(rect.Center());
315 0 : Point aPoint = bBeginInsertPoint? oldPoint:centerPoint;
316 0 : Point ePoint = aPoint + Point(nX,nY);
317 0 : mpWindow->SetPointerPosPixel(ePoint);
318 : //simulate mouse move action
319 0 : MouseEvent eMevt(ePoint,1,2,MOUSE_LEFT, 0);
320 0 : MouseMove(eMevt);
321 0 : oldPoint = ePoint;
322 0 : bBeginInsertPoint = sal_True;
323 0 : bReturn = sal_True;
324 : }
325 : }
326 0 : break;
327 : case KEY_RETURN:
328 0 : if(rKEvt.GetKeyCode().IsShift() && mpView->IsInsGluePointMode() )
329 : {
330 0 : if(bBeginInsertPoint)
331 : {
332 0 : mpWindow->SetPointerPosPixel(oldPoint);
333 : //simulate mouse button down action
334 0 : MouseEvent aMevt(oldPoint,1,3,MOUSE_LEFT,KEY_SHIFT);
335 : // MT IA2: Not used?
336 : // sal_uInt16 ubuttons = aMevt.GetButtons();
337 : // sal_uInt16 uMod = aMevt.GetModifier();
338 0 : MouseButtonDown(aMevt);
339 0 : mpWindow->CaptureMouse();
340 : //simulate mouse button up action
341 0 : MouseEvent rMEvt(oldPoint+Point(0,0),1,17, MOUSE_LEFT, KEY_SHIFT);
342 0 : MouseButtonUp(rMEvt);
343 0 : bReturn= sal_True;
344 : }
345 : }
346 0 : break;
347 : }
348 :
349 0 : if(!bReturn)
350 0 : bReturn = FuDraw::KeyInput(rKEvt);
351 :
352 0 : return bReturn;
353 : }
354 :
355 : //Add Shift+UP/DOWN/LEFT/RIGHT key to move the position of insert point, and
356 : //SHIFT+ENTER key to decide the postion and draw the new insert point
357 0 : void FuEditGluePoints::ForcePointer(const MouseEvent* pMEvt)
358 : {
359 0 : if(bBeginInsertPoint && pMEvt)
360 : {
361 0 : MouseEvent aMEvt(pMEvt->GetPosPixel(), pMEvt->GetClicks(),
362 0 : pMEvt->GetMode(), pMEvt->GetButtons(), pMEvt->GetModifier() & ~KEY_SHIFT);
363 0 : FuDraw::ForcePointer(&aMEvt);
364 : }
365 : else
366 : {
367 0 : FuDraw::ForcePointer(pMEvt);
368 : }
369 0 : }
370 :
371 0 : sal_Bool FuEditGluePoints::Command(const CommandEvent& rCEvt)
372 : {
373 0 : mpView->SetActualWin( mpWindow );
374 0 : return FuPoor::Command( rCEvt );
375 : }
376 :
377 :
378 0 : void FuEditGluePoints::Activate()
379 : {
380 0 : mpView->SetGluePointEditMode();
381 0 : FuDraw::Activate();
382 0 : }
383 :
384 :
385 0 : void FuEditGluePoints::Deactivate()
386 : {
387 0 : mpView->SetGluePointEditMode( false );
388 0 : FuDraw::Deactivate();
389 0 : }
390 :
391 :
392 0 : void FuEditGluePoints::ReceiveRequest(SfxRequest& rReq)
393 : {
394 0 : switch (rReq.GetSlot())
395 : {
396 : case SID_GLUE_INSERT_POINT:
397 : {
398 0 : mpView->SetInsGluePointMode(!mpView->IsInsGluePointMode());
399 : }
400 0 : break;
401 :
402 : case SID_GLUE_ESCDIR_LEFT:
403 : {
404 : mpView->SetMarkedGluePointsEscDir( SDRESC_LEFT,
405 0 : !mpView->IsMarkedGluePointsEscDir( SDRESC_LEFT ) );
406 : }
407 0 : break;
408 :
409 : case SID_GLUE_ESCDIR_RIGHT:
410 : {
411 : mpView->SetMarkedGluePointsEscDir( SDRESC_RIGHT,
412 0 : !mpView->IsMarkedGluePointsEscDir( SDRESC_RIGHT ) );
413 : }
414 0 : break;
415 :
416 : case SID_GLUE_ESCDIR_TOP:
417 : {
418 : mpView->SetMarkedGluePointsEscDir( SDRESC_TOP,
419 0 : !mpView->IsMarkedGluePointsEscDir( SDRESC_TOP ) );
420 : }
421 0 : break;
422 :
423 : case SID_GLUE_ESCDIR_BOTTOM:
424 : {
425 : mpView->SetMarkedGluePointsEscDir( SDRESC_BOTTOM,
426 0 : !mpView->IsMarkedGluePointsEscDir( SDRESC_BOTTOM ) );
427 : }
428 0 : break;
429 :
430 : case SID_GLUE_PERCENT:
431 : {
432 0 : const SfxItemSet* pSet = rReq.GetArgs();
433 0 : const SfxPoolItem& rItem = pSet->Get(SID_GLUE_PERCENT);
434 0 : sal_Bool bPercent = ((const SfxBoolItem&) rItem).GetValue();
435 0 : mpView->SetMarkedGluePointsPercent(bPercent);
436 : }
437 0 : break;
438 :
439 : case SID_GLUE_HORZALIGN_CENTER:
440 : {
441 0 : mpView->SetMarkedGluePointsAlign(false, SDRHORZALIGN_CENTER);
442 : }
443 0 : break;
444 :
445 : case SID_GLUE_HORZALIGN_LEFT:
446 : {
447 0 : mpView->SetMarkedGluePointsAlign(false, SDRHORZALIGN_LEFT);
448 : }
449 0 : break;
450 :
451 : case SID_GLUE_HORZALIGN_RIGHT:
452 : {
453 0 : mpView->SetMarkedGluePointsAlign(false, SDRHORZALIGN_RIGHT);
454 : }
455 0 : break;
456 :
457 : case SID_GLUE_VERTALIGN_CENTER:
458 : {
459 0 : mpView->SetMarkedGluePointsAlign(true, SDRVERTALIGN_CENTER);
460 : }
461 0 : break;
462 :
463 : case SID_GLUE_VERTALIGN_TOP:
464 : {
465 0 : mpView->SetMarkedGluePointsAlign(true, SDRVERTALIGN_TOP);
466 : }
467 0 : break;
468 :
469 : case SID_GLUE_VERTALIGN_BOTTOM:
470 : {
471 0 : mpView->SetMarkedGluePointsAlign(true, SDRVERTALIGN_BOTTOM);
472 : }
473 0 : break;
474 : }
475 :
476 : // at the end, call base class
477 0 : FuPoor::ReceiveRequest(rReq);
478 0 : }
479 :
480 :
481 : } // end of namespace sd
482 :
483 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|