xref: /trunk/main/svx/source/dialog/graphctl.cxx (revision 5f22f2ef)
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_svx.hxx"
26 #include <svl/itempool.hxx>
27 #include <vcl/dialog.hxx>
28 #include <vcl/wrkwin.hxx>
29 #include <unotools/syslocale.hxx>
30 #include <rtl/math.hxx>
31 #include <unotools/localedatawrapper.hxx>
32 #ifndef _UNOTOOLS_PROCESSFACTORY_HXX
33 #include <comphelper/processfactory.hxx>
34 #endif
35 #include <vcl/svapp.hxx>
36 #include <osl/mutex.hxx>
37 
38 #include <svx/graphctl.hxx>
39 #include "GraphCtlAccessibleContext.hxx"
40 #include "svx/xoutbmp.hxx"
41 #include <svx/svxids.hrc>
42 #include <svx/svdpage.hxx>
43 
44 // #i72889#
45 #include "svx/sdrpaintwindow.hxx"
46 
47 /*************************************************************************
48 |*
49 |*
50 |*
51 \************************************************************************/
52 
Changed(const SdrObject & rObj,SdrUserCallType eType,const Rectangle &)53 void GraphCtrlUserCall::Changed( const SdrObject& rObj, SdrUserCallType eType, const Rectangle& /*rOldBoundRect*/ )
54 {
55 	switch( eType )
56 	{
57 		case( SDRUSERCALL_MOVEONLY ):
58 		case( SDRUSERCALL_RESIZE ):
59 			rWin.SdrObjChanged( rObj );
60 		break;
61 
62 		case( SDRUSERCALL_INSERTED ):
63 			rWin.SdrObjCreated( rObj );
64 		break;
65 
66 		default:
67 		break;
68 	}
69 }
70 
71 
72 /*************************************************************************
73 |*
74 |*
75 |*
76 \************************************************************************/
77 
GraphCtrl(Window * pParent,const WinBits nWinBits)78 GraphCtrl::GraphCtrl( Window* pParent, const WinBits nWinBits ) :
79 			Control			( pParent, nWinBits ),
80 			aMap100			( MAP_100TH_MM ),
81             eObjKind        ( OBJ_NONE ),
82 			nPolyEdit		( 0 ),
83 			bEditMode		( sal_False ),
84 			bSdrMode		( sal_False ),
85             mpAccContext    ( NULL ),
86             pModel          ( NULL ),
87             pView           ( NULL )
88 {
89 	pUserCall = new GraphCtrlUserCall( *this );
90 	aUpdateTimer.SetTimeout( 200 );
91 	aUpdateTimer.SetTimeoutHdl( LINK( this, GraphCtrl, UpdateHdl ) );
92 	aUpdateTimer.Start();
93 
94 	SetWinStyle( nWinBits );
95 
96 	EnableRTL( sal_False );
97 }
98 
99 
100 /*************************************************************************
101 |*
102 |*
103 |*
104 \************************************************************************/
105 
GraphCtrl(Window * pParent,const ResId & rResId)106 GraphCtrl::GraphCtrl( Window* pParent, const ResId& rResId ) :
107 			Control			( pParent, rResId ),
108 			aMap100			( MAP_100TH_MM ),
109             nWinStyle       ( 0 ),
110             eObjKind        ( OBJ_NONE ),
111 			nPolyEdit		( 0 ),
112             bEditMode       ( sal_False ),
113             bSdrMode        ( sal_False ),
114             bAnim           ( sal_False ),
115             mpAccContext    ( NULL ),
116             pModel          ( NULL ),
117             pView           ( NULL )
118 {
119 	pUserCall = new GraphCtrlUserCall( *this );
120 	aUpdateTimer.SetTimeout( 500 );
121 	aUpdateTimer.SetTimeoutHdl( LINK( this, GraphCtrl, UpdateHdl ) );
122 	aUpdateTimer.Start();
123 	EnableRTL( sal_False );
124 }
125 
126 
127 /*************************************************************************
128 |*
129 |*
130 |*
131 \************************************************************************/
132 
~GraphCtrl()133 GraphCtrl::~GraphCtrl()
134 {
135 	if( mpAccContext )
136 	{
137 		mpAccContext->disposing();
138 		mpAccContext->release();
139 	}
140 	delete pView;
141 	delete pModel;
142 	delete pUserCall;
143 }
144 
145 
146 /*************************************************************************
147 |*
148 |*
149 |*
150 \************************************************************************/
151 
SetWinStyle(WinBits nWinBits)152 void GraphCtrl::SetWinStyle( WinBits nWinBits )
153 {
154 	nWinStyle = nWinBits;
155 	bAnim = ( nWinStyle & WB_ANIMATION ) == WB_ANIMATION;
156 	bSdrMode = ( nWinStyle & WB_SDRMODE ) == WB_SDRMODE;
157 
158 	const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
159 	SetBackground( Wallpaper( rStyleSettings.GetWindowColor() ) );
160 	SetMapMode( aMap100 );
161 
162 	delete pView;
163 	pView = NULL;
164 
165 	delete pModel;
166 	pModel = NULL;
167 
168 	if ( bSdrMode )
169 		InitSdrModel();
170 }
171 
172 
173 /*************************************************************************
174 |*
175 |*
176 |*
177 \************************************************************************/
178 
InitSdrModel()179 void GraphCtrl::InitSdrModel()
180 {
181 	::vos::OGuard aGuard (Application::GetSolarMutex());
182 
183 	SdrPage* pPage;
184 
185 	// alten Kram zerstoeren
186 	delete pView;
187 	delete pModel;
188 
189 	// Model anlegen
190 	pModel = new SdrModel;
191 	pModel->GetItemPool().FreezeIdRanges();
192 	pModel->SetScaleUnit( aMap100.GetMapUnit() );
193 	pModel->SetScaleFraction( Fraction( 1, 1 ) );
194 	pModel->SetDefaultFontHeight( 500 );
195 
196 	pPage = new SdrPage( *pModel );
197 
198 	pPage->SetSize( aGraphSize );
199 	pPage->SetBorder( 0, 0, 0, 0 );
200 	pModel->InsertPage( pPage );
201 	pModel->SetChanged( sal_False );
202 
203 	// View anlegen
204 	pView = new GraphCtrlView( pModel, this );
205 	pView->SetWorkArea( Rectangle( Point(), aGraphSize ) );
206 	pView->EnableExtendedMouseEventDispatcher( sal_True );
207 	pView->ShowSdrPage(pView->GetModel()->GetPage(0));
208 //	pView->ShowSdrPage(pView->GetModel()->GetPage(0));
209 	pView->SetFrameDragSingles( sal_True );
210 	pView->SetMarkedPointsSmooth( SDRPATHSMOOTH_SYMMETRIC );
211 	pView->SetEditMode( sal_True );
212 
213 	// #i72889# set neeeded flags
214 	pView->SetPagePaintingAllowed(false);
215 	pView->SetBufferedOutputAllowed(true);
216 	pView->SetBufferedOverlayAllowed(true);
217 
218     // Tell the accessibility object about the changes.
219     if (mpAccContext != NULL)
220         mpAccContext->setModelAndView (pModel, pView);
221 }
222 
223 
224 /*************************************************************************
225 |*
226 |*
227 |*
228 \************************************************************************/
229 
SetGraphic(const Graphic & rGraphic,sal_Bool bNewModel)230 void GraphCtrl::SetGraphic( const Graphic& rGraphic, sal_Bool bNewModel )
231 {
232 	// Bitmaps dithern wir ggf. fuer die Anzeige
233 	if ( !bAnim && ( rGraphic.GetType() == GRAPHIC_BITMAP )  )
234 	{
235 		if ( rGraphic.IsTransparent() )
236 		{
237 			Bitmap	aBmp( rGraphic.GetBitmap() );
238 
239 			DitherBitmap( aBmp );
240 			aGraphic = Graphic( BitmapEx( aBmp, rGraphic.GetBitmapEx().GetMask() ) );
241 		}
242 		else
243 		{
244 			Bitmap aBmp( rGraphic.GetBitmap() );
245 			DitherBitmap( aBmp );
246 			aGraphic = aBmp;
247 		}
248 	}
249 	else
250 		aGraphic = rGraphic;
251 
252 	if ( aGraphic.GetPrefMapMode().GetMapUnit() == MAP_PIXEL )
253 		aGraphSize = Application::GetDefaultDevice()->PixelToLogic( aGraphic.GetPrefSize(), aMap100 );
254 	else
255 		aGraphSize = OutputDevice::LogicToLogic( aGraphic.GetPrefSize(), aGraphic.GetPrefMapMode(), aMap100 );
256 
257 	if ( bSdrMode && bNewModel )
258 		InitSdrModel();
259 
260 	if ( aGraphSizeLink.IsSet() )
261 		aGraphSizeLink.Call( this );
262 
263 	Resize();
264 	Invalidate();
265 }
266 
267 
268 /*************************************************************************
269 |*
270 |*
271 |*
272 \************************************************************************/
273 
Resize()274 void GraphCtrl::Resize()
275 {
276 	Control::Resize();
277 
278 	if ( aGraphSize.Width() && aGraphSize.Height() )
279 	{
280 		MapMode			aDisplayMap( aMap100 );
281 		Point           aNewPos;
282 		Size			aNewSize;
283 		const Size		aWinSize = PixelToLogic( GetOutputSizePixel(), aDisplayMap );
284 		const long		nWidth = aWinSize.Width();
285 		const long		nHeight = aWinSize.Height();
286 		double          fGrfWH = (double) aGraphSize.Width() / aGraphSize.Height();
287 		double          fWinWH = (double) nWidth / nHeight;
288 
289 		// Bitmap an Thumbgroesse anpassen
290 		if ( fGrfWH < fWinWH)
291 		{
292 			aNewSize.Width() = (long) ( (double) nHeight * fGrfWH );
293 			aNewSize.Height()= nHeight;
294 		}
295 		else
296 		{
297 			aNewSize.Width() = nWidth;
298 			aNewSize.Height()= (long) ( (double) nWidth / fGrfWH );
299 		}
300 
301 		aNewPos.X() = ( nWidth - aNewSize.Width() )  >> 1;
302 		aNewPos.Y() = ( nHeight - aNewSize.Height() ) >> 1;
303 
304 		// MapMode fuer Engine umsetzen
305 		aDisplayMap.SetScaleX( Fraction( aNewSize.Width(), aGraphSize.Width() ) );
306 		aDisplayMap.SetScaleY( Fraction( aNewSize.Height(), aGraphSize.Height() ) );
307 
308 		aDisplayMap.SetOrigin( LogicToLogic( aNewPos, aMap100, aDisplayMap ) );
309 		SetMapMode( aDisplayMap );
310 	}
311 
312 	Invalidate();
313 }
314 
315 
316 /*************************************************************************
317 |*
318 |*
319 |*
320 \************************************************************************/
321 
Paint(const Rectangle & rRect)322 void GraphCtrl::Paint( const Rectangle& rRect )
323 {
324 	// #i72889# used splitted repaint to be able to paint an own background
325 	// even to the buffered view
326 	const bool bGraphicValid(GRAPHIC_NONE != aGraphic.GetType());
327 
328 	if(bSdrMode)
329 	{
330 		SdrPaintWindow* pPaintWindow = pView->BeginCompleteRedraw(this);
331 
332 		if(bGraphicValid)
333 		{
334 			OutputDevice& rTarget = pPaintWindow->GetTargetOutputDevice();
335 
336 			rTarget.SetBackground(GetBackground());
337 			rTarget.Erase();
338 
339 			aGraphic.Draw(&rTarget, Point(), aGraphSize);
340 		}
341 
342 		const Region aRepaintRegion(rRect);
343 		pView->DoCompleteRedraw(*pPaintWindow, aRepaintRegion);
344 		pView->EndCompleteRedraw(*pPaintWindow, true);
345 	}
346 	else
347 	{
348 		// #i73381# in non-SdrMode, paint to local directly
349 		if(bGraphicValid)
350 		{
351 			aGraphic.Draw(this, Point(), aGraphSize);
352 		}
353 	}
354 }
355 
356 
357 /*************************************************************************
358 |*
359 |*
360 |*
361 \************************************************************************/
362 
SdrObjChanged(const SdrObject &)363 void GraphCtrl::SdrObjChanged( const SdrObject&  )
364 {
365 }
366 
367 
368 /*************************************************************************
369 |*
370 |*
371 |*
372 \************************************************************************/
373 
SdrObjCreated(const SdrObject &)374 void GraphCtrl::SdrObjCreated( const SdrObject& )
375 {
376 }
377 
378 
379 /*************************************************************************
380 |*
381 |*
382 |*
383 \************************************************************************/
384 
MarkListHasChanged()385 void GraphCtrl::MarkListHasChanged()
386 {
387 	if ( aMarkObjLink.IsSet() )
388 		aMarkObjLink.Call( this );
389 }
390 
391 
392 /*************************************************************************
393 |*
394 |*
395 |*
396 \************************************************************************/
397 
KeyInput(const KeyEvent & rKEvt)398 void GraphCtrl::KeyInput( const KeyEvent& rKEvt )
399 {
400 	KeyCode aCode( rKEvt.GetKeyCode() );
401 	sal_Bool	bProc = sal_False;
402 
403 	switch ( aCode.GetCode() )
404 	{
405 		case KEY_DELETE:
406 		case KEY_BACKSPACE:
407 		{
408 			if ( bSdrMode )
409 			{
410 				pView->DeleteMarked();
411 				bProc = sal_True;
412 				if( !pView->AreObjectsMarked() )
413 					((Dialog*)GetParent())->GrabFocusToFirstControl();
414 			}
415 		}
416 		break;
417 
418 		case KEY_ESCAPE:
419 		{
420 			if ( bSdrMode )
421 			{
422 				if ( pView->IsAction() )
423 				{
424 					pView->BrkAction();
425 				}
426 				else if ( pView->AreObjectsMarked() )
427 				{
428 					const SdrHdlList& rHdlList = pView->GetHdlList();
429 					SdrHdl* pHdl = rHdlList.GetFocusHdl();
430 
431 					if(pHdl)
432 					{
433 						((SdrHdlList&)rHdlList).ResetFocusHdl();
434 					}
435 					else
436 					{
437 						((Dialog*)GetParent())->GrabFocusToFirstControl();
438 					}
439 				}
440 				else
441 				{
442 					((Dialog*)GetParent())->GrabFocusToFirstControl();
443 				}
444 				bProc = sal_True;
445 			}
446 		}
447 		break;
448 
449 		case KEY_F11:
450 		case KEY_TAB:
451 		{
452 			if( bSdrMode )
453 			{
454 				if( !aCode.IsMod1() && !aCode.IsMod2() )
455 				{
456 					bool bForward = !aCode.IsShift();
457 					// select next object
458 					if ( ! pView->MarkNextObj( bForward ))
459                     {
460                         // At first or last object.  Cycle to the other end
461                         // of the list.
462                         pView->UnmarkAllObj();
463                         pView->MarkNextObj (bForward);
464                     }
465 					bProc = sal_True;
466 				}
467 				else if(aCode.IsMod1())
468 				{
469 					// select next handle
470 					const SdrHdlList& rHdlList = pView->GetHdlList();
471 					sal_Bool bForward(!aCode.IsShift());
472 
473 					((SdrHdlList&)rHdlList).TravelFocusHdl(bForward);
474 
475 					bProc = true;
476 				}
477 			}
478 		}
479 		break;
480 
481 		case KEY_END:
482 		{
483 
484 			if ( aCode.IsMod1() )
485 			{
486 				// #97016# mark last object
487 				pView->UnmarkAllObj();
488 				pView->MarkNextObj(sal_False);
489 
490 				bProc = true;
491 			}
492 		}
493 		break;
494 
495 		case KEY_HOME:
496 		{
497 			if ( aCode.IsMod1() )
498 			{
499 				pView->UnmarkAllObj();
500 				pView->MarkNextObj(sal_True);
501 
502 				bProc = true;
503 			}
504 		}
505 		break;
506 
507 		case KEY_UP:
508 		case KEY_DOWN:
509 		case KEY_LEFT:
510 		case KEY_RIGHT:
511 		{
512 			long nX = 0;
513 			long nY = 0;
514 
515 			if (aCode.GetCode() == KEY_UP)
516 			{
517 				// Scroll nach oben
518 				nX = 0;
519 				nY =-1;
520 			}
521 			else if (aCode.GetCode() == KEY_DOWN)
522 			{
523 				// Scroll nach unten
524 				nX = 0;
525 				nY = 1;
526 			}
527 			else if (aCode.GetCode() == KEY_LEFT)
528 			{
529 				// Scroll nach links
530 				nX =-1;
531 				nY = 0;
532 			}
533 			else if (aCode.GetCode() == KEY_RIGHT)
534 			{
535 				// Scroll nach rechts
536 				nX = 1;
537 				nY = 0;
538 			}
539 
540 			if (pView->AreObjectsMarked() && !aCode.IsMod1() )
541 			{
542 				if(aCode.IsMod2())
543 				{
544 					// #97016# move in 1 pixel distance
545 					Size aLogicSizeOnePixel = PixelToLogic(Size(1,1));
546 					nX *= aLogicSizeOnePixel.Width();
547 					nY *= aLogicSizeOnePixel.Height();
548 				}
549 				else
550 				{
551 					// old, fixed move distance
552 					nX *= 100;
553 					nY *= 100;
554 				}
555 
556 				// #97016# II
557 				const SdrHdlList& rHdlList = pView->GetHdlList();
558 				SdrHdl* pHdl = rHdlList.GetFocusHdl();
559 
560 				if(0L == pHdl)
561 				{
562 					// #90129# restrict movement to WorkArea
563 					const Rectangle& rWorkArea = pView->GetWorkArea();
564 
565 					if(!rWorkArea.IsEmpty())
566 					{
567 						Rectangle aMarkRect(pView->GetMarkedObjRect());
568 						aMarkRect.Move(nX, nY);
569 
570 						if(!aMarkRect.IsInside(rWorkArea))
571 						{
572 							if(aMarkRect.Left() < rWorkArea.Left())
573 							{
574 								nX += rWorkArea.Left() - aMarkRect.Left();
575 							}
576 
577 							if(aMarkRect.Right() > rWorkArea.Right())
578 							{
579 								nX -= aMarkRect.Right() - rWorkArea.Right();
580 							}
581 
582 							if(aMarkRect.Top() < rWorkArea.Top())
583 							{
584 								nY += rWorkArea.Top() - aMarkRect.Top();
585 							}
586 
587 							if(aMarkRect.Bottom() > rWorkArea.Bottom())
588 							{
589 								nY -= aMarkRect.Bottom() - rWorkArea.Bottom();
590 							}
591 						}
592 					}
593 
594 					// no handle selected
595 					if(0 != nX || 0 != nY)
596 					{
597 						pView->MoveAllMarked(Size(nX, nY));
598 					}
599 				}
600 				else
601 				{
602 					// move handle with index nHandleIndex
603 					if(pHdl && (nX || nY))
604 					{
605 						// now move the Handle (nX, nY)
606 						Point aStartPoint(pHdl->GetPos());
607 						Point aEndPoint(pHdl->GetPos() + Point(nX, nY));
608 						const SdrDragStat& rDragStat = pView->GetDragStat();
609 
610 						// start dragging
611 						pView->BegDragObj(aStartPoint, 0, pHdl, 0);
612 
613 					    if(pView->IsDragObj())
614 						{
615 							FASTBOOL bWasNoSnap = rDragStat.IsNoSnap();
616 							sal_Bool bWasSnapEnabled = pView->IsSnapEnabled();
617 
618 							// switch snapping off
619 							if(!bWasNoSnap)
620 								((SdrDragStat&)rDragStat).SetNoSnap(sal_True);
621 							if(bWasSnapEnabled)
622 								pView->SetSnapEnabled(sal_False);
623 
624 							pView->MovAction(aEndPoint);
625 							pView->EndDragObj();
626 
627 							// restore snap
628 							if(!bWasNoSnap)
629 								((SdrDragStat&)rDragStat).SetNoSnap(bWasNoSnap);
630 							if(bWasSnapEnabled)
631 								pView->SetSnapEnabled(bWasSnapEnabled);
632 						}
633 					}
634 				}
635 
636 				bProc = true;
637 			}
638 		}
639 		break;
640 
641 		case KEY_SPACE:
642 		{
643 			const SdrHdlList& rHdlList = pView->GetHdlList();
644 			SdrHdl* pHdl = rHdlList.GetFocusHdl();
645 
646 			if(pHdl)
647 			{
648 				if(pHdl->GetKind() == HDL_POLY)
649 				{
650 					// rescue ID of point with focus
651 					sal_uInt32 nPol(pHdl->GetPolyNum());
652 					sal_uInt32 nPnt(pHdl->GetPointNum());
653 
654 					if(pView->IsPointMarked(pHdl))
655 					{
656 						if(rKEvt.GetKeyCode().IsShift())
657 						{
658 							pView->UnmarkPoint(*pHdl);
659 						}
660 					}
661 					else
662 					{
663 						if(!rKEvt.GetKeyCode().IsShift())
664 						{
665 							pView->UnmarkAllPoints();
666 						}
667 
668 						pView->MarkPoint(*pHdl);
669 					}
670 
671 					if(0L == rHdlList.GetFocusHdl())
672 					{
673 						// restore point with focus
674 						SdrHdl* pNewOne = 0L;
675 
676 						for(sal_uInt32 a(0); !pNewOne && a < rHdlList.GetHdlCount(); a++)
677 						{
678 							SdrHdl* pAct = rHdlList.GetHdl(a);
679 
680 							if(pAct
681 								&& pAct->GetKind() == HDL_POLY
682 								&& pAct->GetPolyNum() == nPol
683 								&& pAct->GetPointNum() == nPnt)
684 							{
685 								pNewOne = pAct;
686 							}
687 						}
688 
689 						if(pNewOne)
690 						{
691 							((SdrHdlList&)rHdlList).SetFocusHdl(pNewOne);
692 						}
693 					}
694 
695 					bProc = sal_True;
696 				}
697 			}
698 		}
699 		break;
700 
701 		default:
702 		break;
703 	}
704 
705 	if ( !bProc )
706 		Control::KeyInput( rKEvt );
707 	else
708 		ReleaseMouse();
709 }
710 
711 
712 /*************************************************************************
713 |*
714 |*
715 |*
716 \************************************************************************/
717 
MouseButtonDown(const MouseEvent & rMEvt)718 void GraphCtrl::MouseButtonDown( const MouseEvent& rMEvt )
719 {
720 	if ( bSdrMode && ( rMEvt.GetClicks() < 2 ) )
721 	{
722 		const Point aLogPt( PixelToLogic( rMEvt.GetPosPixel() ) );
723 
724 		if ( !Rectangle( Point(), aGraphSize ).IsInside( aLogPt ) && !pView->IsEditMode() )
725 			Control::MouseButtonDown( rMEvt );
726 		else
727 		{
728 			// Focus anziehen fuer Key-Inputs
729 			GrabFocus();
730 
731 			if ( nPolyEdit )
732 			{
733 				SdrViewEvent	aVEvt;
734 				SdrHitKind		eHit = pView->PickAnything( rMEvt, SDRMOUSEBUTTONDOWN, aVEvt );
735 
736 				if ( nPolyEdit == SID_BEZIER_INSERT && eHit == SDRHIT_MARKEDOBJECT )
737 					pView->BegInsObjPoint( aLogPt, rMEvt.IsMod1());
738 				else
739 					pView->MouseButtonDown( rMEvt, this );
740 			}
741 			else
742 				pView->MouseButtonDown( rMEvt, this );
743 		}
744 
745 		SdrObject* pCreateObj = pView->GetCreateObj();
746 
747 		// Wir wollen das Inserten mitbekommen
748 		if ( pCreateObj && !pCreateObj->GetUserCall() )
749 			pCreateObj->SetUserCall( pUserCall );
750 
751 		SetPointer( pView->GetPreferedPointer( aLogPt, this ) );
752 	}
753 	else
754 		Control::MouseButtonDown( rMEvt );
755 }
756 
757 
758 /*************************************************************************
759 |*
760 |*
761 |*
762 \************************************************************************/
763 
MouseMove(const MouseEvent & rMEvt)764 void GraphCtrl::MouseMove(const MouseEvent& rMEvt)
765 {
766 	const Point	aLogPos( PixelToLogic( rMEvt.GetPosPixel() ) );
767 
768 	if ( bSdrMode )
769 	{
770 		pView->MouseMove( rMEvt, this );
771 
772 		if( ( SID_BEZIER_INSERT == nPolyEdit ) &&
773 			!pView->PickHandle( aLogPos ) &&
774 			!pView->IsInsObjPoint() )
775 		{
776 			SetPointer( POINTER_CROSS );
777 		}
778 		else
779 			SetPointer( pView->GetPreferedPointer( aLogPos, this ) );
780 	}
781 	else
782 		Control::MouseButtonUp( rMEvt );
783 
784 	if ( aMousePosLink.IsSet() )
785 	{
786 		if ( Rectangle( Point(), aGraphSize ).IsInside( aLogPos ) )
787 			aMousePos = aLogPos;
788 		else
789 			aMousePos = Point();
790 
791 		aMousePosLink.Call( this );
792 	}
793 }
794 
795 
796 /*************************************************************************
797 |*
798 |*
799 |*
800 \************************************************************************/
801 
MouseButtonUp(const MouseEvent & rMEvt)802 void GraphCtrl::MouseButtonUp(const MouseEvent& rMEvt)
803 {
804 	if ( bSdrMode )
805 	{
806 		if ( pView->IsInsObjPoint() )
807 			pView->EndInsObjPoint( SDRCREATE_FORCEEND );
808 		else
809 			pView->MouseButtonUp( rMEvt, this );
810 
811 		ReleaseMouse();
812 		SetPointer( pView->GetPreferedPointer( PixelToLogic( rMEvt.GetPosPixel() ), this ) );
813 	}
814 	else
815 		Control::MouseButtonUp( rMEvt );
816 }
817 
818 
819 /*************************************************************************
820 |*
821 |*
822 |*
823 \************************************************************************/
824 
GetSelectedSdrObject() const825 SdrObject* GraphCtrl::GetSelectedSdrObject() const
826 {
827 	SdrObject* pSdrObj = NULL;
828 
829 	if ( bSdrMode )
830 	{
831 		const SdrMarkList&	rMarkList = pView->GetMarkedObjectList();
832 
833 		if ( rMarkList.GetMarkCount() == 1 )
834 			pSdrObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
835 	}
836 
837 	return pSdrObj;
838 }
839 
840 
841 /*************************************************************************
842 |*
843 |*
844 |*
845 \************************************************************************/
846 
SetEditMode(const sal_Bool _bEditMode)847 void GraphCtrl::SetEditMode( const sal_Bool _bEditMode )
848 {
849 	if ( bSdrMode )
850 	{
851         bEditMode = _bEditMode;
852 		pView->SetEditMode( bEditMode );
853         eObjKind = OBJ_NONE;
854 		pView->SetCurrentObj( sal::static_int_cast< sal_uInt16 >( eObjKind ) );
855 	}
856 	else
857 		bEditMode = sal_False;
858 }
859 
860 
861 /*************************************************************************
862 |*
863 |*
864 |*
865 \************************************************************************/
866 
SetPolyEditMode(const sal_uInt16 _nPolyEdit)867 void GraphCtrl::SetPolyEditMode( const sal_uInt16 _nPolyEdit )
868 {
869 	if ( bSdrMode && ( _nPolyEdit != nPolyEdit ) )
870 	{
871 		nPolyEdit = _nPolyEdit;
872 		pView->SetFrameDragSingles( nPolyEdit == 0 );
873 	}
874 	else
875 		nPolyEdit = 0;
876 }
877 
878 
879 /*************************************************************************
880 |*
881 |*
882 |*
883 \************************************************************************/
884 
SetObjKind(const SdrObjKind _eObjKind)885 void GraphCtrl::SetObjKind( const SdrObjKind _eObjKind )
886 {
887 	if ( bSdrMode )
888 	{
889         bEditMode = sal_False;
890 		pView->SetEditMode( bEditMode );
891         eObjKind = _eObjKind;
892 		pView->SetCurrentObj( sal::static_int_cast< sal_uInt16 >( eObjKind ) );
893 	}
894 	else
895 		eObjKind = OBJ_NONE;
896 }
897 
898 
899 /*************************************************************************
900 |*
901 |*
902 |*
903 \************************************************************************/
904 
GetStringFromDouble(const double & rDouble)905 String GraphCtrl::GetStringFromDouble( const double& rDouble )
906 {
907     sal_Unicode cSep =
908         SvtSysLocale().GetLocaleData().getNumDecimalSep().GetChar(0);
909     String aStr( ::rtl::math::doubleToUString( rDouble,
910                 rtl_math_StringFormat_F, 2, cSep ));
911     return aStr;
912 }
913 
914 
915 /*************************************************************************
916 www|*
917 |*
918 |*
919 \************************************************************************/
920 
IMPL_LINK(GraphCtrl,UpdateHdl,Timer *,pTimer)921 IMPL_LINK( GraphCtrl, UpdateHdl, Timer*, pTimer )
922 {
923 	if ( aUpdateLink.IsSet() )
924 		aUpdateLink.Call( this );
925 
926 	pTimer->Start();
927 
928 	return 0L;
929 }
930 
931 
CreateAccessible()932 ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > GraphCtrl::CreateAccessible()
933 {
934 	if( mpAccContext == NULL )
935 	{
936 		Window* pParent = GetParent();
937 
938 		DBG_ASSERT( pParent, "-GraphCtrl::CreateAccessible(): No Parent!" );
939 
940 		if( pParent )
941 		{
942 			::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > xAccParent( pParent->GetAccessible() );
943 
944             // #103856# Disable accessibility if no model/view data available
945 			if( pView &&
946                 pModel &&
947                 xAccParent.is() )
948 			{
949 				mpAccContext = new SvxGraphCtrlAccessibleContext( xAccParent, *this );
950 				mpAccContext->acquire();
951 			}
952 		}
953 	}
954 
955 	return mpAccContext;
956 }
957