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 : |*
45 : |* Konstruktor
46 : |*
47 : \************************************************************************/
48 :
49 0 : FuEditGluePoints::FuEditGluePoints (
50 : ViewShell* pViewSh,
51 : ::sd::Window* pWin,
52 : ::sd::View* pView,
53 : SdDrawDocument* pDoc,
54 : SfxRequest& rReq)
55 0 : : FuDraw(pViewSh, pWin, pView, pDoc, rReq)
56 : {
57 0 : }
58 :
59 0 : FunctionReference FuEditGluePoints::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent )
60 : {
61 : FuEditGluePoints* pFunc;
62 0 : FunctionReference xFunc( pFunc = new FuEditGluePoints( pViewSh, pWin, pView, pDoc, rReq ) );
63 0 : xFunc->DoExecute(rReq);
64 0 : pFunc->SetPermanent( bPermanent );
65 0 : return xFunc;
66 : }
67 :
68 0 : void FuEditGluePoints::DoExecute( SfxRequest& rReq )
69 : {
70 0 : FuDraw::DoExecute( rReq );
71 0 : mpView->SetInsGluePointMode(sal_False);
72 0 : mpViewShell->GetViewShellBase().GetToolBarManager()->AddToolBar(
73 : ToolBarManager::TBG_FUNCTION,
74 0 : ToolBarManager::msGluePointsToolBar);
75 0 : }
76 :
77 : /*************************************************************************
78 : |*
79 : |* Destruktor
80 : |*
81 : \************************************************************************/
82 :
83 0 : FuEditGluePoints::~FuEditGluePoints()
84 : {
85 0 : mpView->BrkAction();
86 0 : mpView->UnmarkAllGluePoints();
87 0 : mpView->SetInsGluePointMode(sal_False);
88 0 : }
89 :
90 : /*************************************************************************
91 : |*
92 : |* MouseButtonDown-event
93 : |*
94 : \************************************************************************/
95 :
96 0 : sal_Bool FuEditGluePoints::MouseButtonDown(const MouseEvent& rMEvt)
97 : {
98 0 : mpView->SetActualWin( mpWindow );
99 :
100 0 : sal_Bool bReturn = FuDraw::MouseButtonDown(rMEvt);
101 :
102 0 : if (mpView->IsAction())
103 : {
104 0 : if (rMEvt.IsRight())
105 0 : mpView->BckAction();
106 :
107 0 : return sal_True;
108 : }
109 :
110 0 : if (rMEvt.IsLeft())
111 : {
112 0 : bReturn = sal_True;
113 0 : sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() );
114 0 : sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
115 0 : mpWindow->CaptureMouse();
116 :
117 0 : SdrViewEvent aVEvt;
118 0 : SdrHitKind eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
119 :
120 0 : if (eHit == SDRHIT_HANDLE)
121 : {
122 : /******************************************************************
123 : * Handle draggen
124 : ******************************************************************/
125 0 : SdrHdl* pHdl = aVEvt.pHdl;
126 :
127 0 : if (mpView->IsGluePointMarked(aVEvt.pObj, aVEvt.nGlueId) && rMEvt.IsShift())
128 : {
129 0 : mpView->UnmarkGluePoint(aVEvt.pObj, aVEvt.nGlueId, aVEvt.pPV);
130 0 : pHdl = NULL;
131 : }
132 :
133 0 : if (pHdl)
134 : {
135 : // Handle draggen
136 0 : mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, aVEvt.pHdl, nDrgLog);
137 : }
138 : }
139 0 : else if (eHit == SDRHIT_MARKEDOBJECT && mpView->IsInsGluePointMode())
140 : {
141 : /******************************************************************
142 : * Klebepunkt einfuegen
143 : ******************************************************************/
144 0 : mpView->BegInsGluePoint(aMDPos);
145 : }
146 0 : else if (eHit == SDRHIT_MARKEDOBJECT && rMEvt.IsMod1())
147 : {
148 : /******************************************************************
149 : * Klebepunkt selektieren
150 : ******************************************************************/
151 0 : if (!rMEvt.IsShift())
152 0 : mpView->UnmarkAllGluePoints();
153 :
154 0 : mpView->BegMarkGluePoints(aMDPos);
155 : }
156 0 : else if (eHit == SDRHIT_MARKEDOBJECT && !rMEvt.IsShift() && !rMEvt.IsMod2())
157 : {
158 : /******************************************************************
159 : * Objekt verschieben
160 : ******************************************************************/
161 0 : mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, NULL, nDrgLog);
162 : }
163 0 : else if (eHit == SDRHIT_GLUEPOINT)
164 : {
165 : /******************************************************************
166 : * Klebepunkt selektieren
167 : ******************************************************************/
168 0 : if (!rMEvt.IsShift())
169 0 : mpView->UnmarkAllGluePoints();
170 :
171 0 : mpView->MarkGluePoint(aVEvt.pObj, aVEvt.nGlueId, aVEvt.pPV);
172 0 : SdrHdl* pHdl = mpView->GetGluePointHdl(aVEvt.pObj, aVEvt.nGlueId);
173 :
174 0 : if (pHdl)
175 : {
176 0 : mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl, nDrgLog);
177 : }
178 : }
179 : else
180 : {
181 : /******************************************************************
182 : * Objekt selektieren oder draggen
183 : ******************************************************************/
184 0 : if (!rMEvt.IsShift() && !rMEvt.IsMod2() && eHit == SDRHIT_UNMARKEDOBJECT)
185 : {
186 0 : mpView->UnmarkAllObj();
187 : }
188 :
189 0 : sal_Bool bMarked = sal_False;
190 :
191 0 : if (!rMEvt.IsMod1())
192 : {
193 0 : if (rMEvt.IsMod2())
194 : {
195 0 : bMarked = mpView->MarkNextObj(aMDPos, nHitLog, rMEvt.IsShift());
196 : }
197 : else
198 : {
199 0 : bMarked = mpView->MarkObj(aMDPos, nHitLog, rMEvt.IsShift());
200 : }
201 : }
202 :
203 0 : if (bMarked &&
204 0 : (!rMEvt.IsShift() || eHit == SDRHIT_MARKEDOBJECT))
205 : {
206 : // Objekt verschieben
207 0 : mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, aVEvt.pHdl, nDrgLog);
208 : }
209 0 : else if (mpView->AreObjectsMarked())
210 : {
211 : /**************************************************************
212 : * Klebepunkt selektieren
213 : **************************************************************/
214 0 : if (!rMEvt.IsShift())
215 0 : mpView->UnmarkAllGluePoints();
216 :
217 0 : mpView->BegMarkGluePoints(aMDPos);
218 : }
219 : else
220 : {
221 : /**************************************************************
222 : * Objekt selektieren
223 : **************************************************************/
224 0 : mpView->BegMarkObj(aMDPos);
225 : }
226 : }
227 :
228 0 : ForcePointer(&rMEvt);
229 : }
230 :
231 0 : return bReturn;
232 : }
233 :
234 : /*************************************************************************
235 : |*
236 : |* MouseMove-event
237 : |*
238 : \************************************************************************/
239 :
240 0 : sal_Bool FuEditGluePoints::MouseMove(const MouseEvent& rMEvt)
241 : {
242 0 : mpView->SetActualWin( mpWindow );
243 :
244 0 : FuDraw::MouseMove(rMEvt);
245 :
246 0 : if (mpView->IsAction())
247 : {
248 0 : Point aPix(rMEvt.GetPosPixel());
249 0 : Point aPnt( mpWindow->PixelToLogic(aPix) );
250 0 : ForceScroll(aPix);
251 0 : mpView->MovAction(aPnt);
252 : }
253 :
254 0 : ForcePointer(&rMEvt);
255 :
256 0 : return sal_True;
257 : }
258 :
259 : /*************************************************************************
260 : |*
261 : |* MouseButtonUp-event
262 : |*
263 : \************************************************************************/
264 :
265 0 : sal_Bool FuEditGluePoints::MouseButtonUp(const MouseEvent& rMEvt)
266 : {
267 0 : mpView->SetActualWin( mpWindow );
268 :
269 0 : sal_Bool bReturn = sal_False;
270 :
271 0 : if (mpView->IsAction())
272 : {
273 0 : bReturn = sal_True;
274 0 : mpView->EndAction();
275 : }
276 :
277 0 : FuDraw::MouseButtonUp(rMEvt);
278 :
279 0 : sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
280 0 : Point aPos = mpWindow->PixelToLogic( rMEvt.GetPosPixel() );
281 :
282 0 : if (Abs(aMDPos.X() - aPos.X()) < nDrgLog &&
283 0 : Abs(aMDPos.Y() - aPos.Y()) < nDrgLog &&
284 0 : !rMEvt.IsShift() && !rMEvt.IsMod2())
285 : {
286 0 : SdrViewEvent aVEvt;
287 0 : SdrHitKind eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
288 :
289 0 : if (eHit == SDRHIT_NONE)
290 : {
291 : // Klick auf der Stelle: deselektieren
292 0 : mpView->UnmarkAllObj();
293 0 : }
294 : }
295 :
296 0 : mpWindow->ReleaseMouse();
297 :
298 0 : return bReturn;
299 : }
300 :
301 : /*************************************************************************
302 : |*
303 : |* Tastaturereignisse bearbeiten
304 : |*
305 : |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls
306 : |* sal_False.
307 : |*
308 : \************************************************************************/
309 :
310 0 : sal_Bool FuEditGluePoints::KeyInput(const KeyEvent& rKEvt)
311 : {
312 0 : mpView->SetActualWin( mpWindow );
313 :
314 0 : sal_Bool bReturn = FuDraw::KeyInput(rKEvt);
315 :
316 0 : return bReturn;
317 : }
318 :
319 : /*************************************************************************
320 : |*
321 : |* Command-event
322 : |*
323 : \************************************************************************/
324 :
325 0 : sal_Bool FuEditGluePoints::Command(const CommandEvent& rCEvt)
326 : {
327 0 : mpView->SetActualWin( mpWindow );
328 0 : return FuPoor::Command( rCEvt );
329 : }
330 :
331 : /*************************************************************************
332 : |*
333 : |* Funktion aktivieren
334 : |*
335 : \************************************************************************/
336 :
337 0 : void FuEditGluePoints::Activate()
338 : {
339 0 : mpView->SetGluePointEditMode();
340 0 : FuDraw::Activate();
341 0 : }
342 :
343 : /*************************************************************************
344 : |*
345 : |* Funktion deaktivieren
346 : |*
347 : \************************************************************************/
348 :
349 0 : void FuEditGluePoints::Deactivate()
350 : {
351 0 : mpView->SetGluePointEditMode( sal_False );
352 0 : FuDraw::Deactivate();
353 0 : }
354 :
355 : /*************************************************************************
356 : |*
357 : |* Request verarbeiten
358 : |*
359 : \************************************************************************/
360 :
361 0 : void FuEditGluePoints::ReceiveRequest(SfxRequest& rReq)
362 : {
363 0 : switch (rReq.GetSlot())
364 : {
365 : case SID_GLUE_INSERT_POINT:
366 : {
367 0 : mpView->SetInsGluePointMode(!mpView->IsInsGluePointMode());
368 : }
369 0 : break;
370 :
371 : case SID_GLUE_ESCDIR_LEFT:
372 : {
373 : mpView->SetMarkedGluePointsEscDir( SDRESC_LEFT,
374 0 : !mpView->IsMarkedGluePointsEscDir( SDRESC_LEFT ) );
375 : }
376 0 : break;
377 :
378 : case SID_GLUE_ESCDIR_RIGHT:
379 : {
380 : mpView->SetMarkedGluePointsEscDir( SDRESC_RIGHT,
381 0 : !mpView->IsMarkedGluePointsEscDir( SDRESC_RIGHT ) );
382 : }
383 0 : break;
384 :
385 : case SID_GLUE_ESCDIR_TOP:
386 : {
387 : mpView->SetMarkedGluePointsEscDir( SDRESC_TOP,
388 0 : !mpView->IsMarkedGluePointsEscDir( SDRESC_TOP ) );
389 : }
390 0 : break;
391 :
392 : case SID_GLUE_ESCDIR_BOTTOM:
393 : {
394 : mpView->SetMarkedGluePointsEscDir( SDRESC_BOTTOM,
395 0 : !mpView->IsMarkedGluePointsEscDir( SDRESC_BOTTOM ) );
396 : }
397 0 : break;
398 :
399 : case SID_GLUE_PERCENT:
400 : {
401 0 : const SfxItemSet* pSet = rReq.GetArgs();
402 0 : const SfxPoolItem& rItem = pSet->Get(SID_GLUE_PERCENT);
403 0 : sal_Bool bPercent = ((const SfxBoolItem&) rItem).GetValue();
404 0 : mpView->SetMarkedGluePointsPercent(bPercent);
405 : }
406 0 : break;
407 :
408 : case SID_GLUE_HORZALIGN_CENTER:
409 : {
410 0 : mpView->SetMarkedGluePointsAlign(sal_False, SDRHORZALIGN_CENTER);
411 : }
412 0 : break;
413 :
414 : case SID_GLUE_HORZALIGN_LEFT:
415 : {
416 0 : mpView->SetMarkedGluePointsAlign(sal_False, SDRHORZALIGN_LEFT);
417 : }
418 0 : break;
419 :
420 : case SID_GLUE_HORZALIGN_RIGHT:
421 : {
422 0 : mpView->SetMarkedGluePointsAlign(sal_False, SDRHORZALIGN_RIGHT);
423 : }
424 0 : break;
425 :
426 : case SID_GLUE_VERTALIGN_CENTER:
427 : {
428 0 : mpView->SetMarkedGluePointsAlign(sal_True, SDRVERTALIGN_CENTER);
429 : }
430 0 : break;
431 :
432 : case SID_GLUE_VERTALIGN_TOP:
433 : {
434 0 : mpView->SetMarkedGluePointsAlign(sal_True, SDRVERTALIGN_TOP);
435 : }
436 0 : break;
437 :
438 : case SID_GLUE_VERTALIGN_BOTTOM:
439 : {
440 0 : mpView->SetMarkedGluePointsAlign(sal_True, SDRVERTALIGN_BOTTOM);
441 : }
442 0 : break;
443 : }
444 :
445 : // Zum Schluss Basisklasse rufen
446 0 : FuPoor::ReceiveRequest(rReq);
447 0 : }
448 :
449 :
450 : } // end of namespace sd
451 :
452 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|