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