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