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 : #include <svl/itempool.hxx>
21 : #include <vcl/dialog.hxx>
22 : #include <vcl/wrkwin.hxx>
23 : #include <vcl/settings.hxx>
24 : #include <unotools/syslocale.hxx>
25 : #include <rtl/math.hxx>
26 : #include <unotools/localedatawrapper.hxx>
27 : #include <comphelper/processfactory.hxx>
28 : #include <vcl/svapp.hxx>
29 : #include <osl/mutex.hxx>
30 :
31 : #include <svx/graphctl.hxx>
32 : #include "GraphCtlAccessibleContext.hxx"
33 : #include "svx/xoutbmp.hxx"
34 : #include <svx/svxids.hrc>
35 : #include <svx/svdpage.hxx>
36 : #include "svx/sdrpaintwindow.hxx"
37 :
38 0 : void GraphCtrlUserCall::Changed( const SdrObject& rObj, SdrUserCallType eType, const Rectangle& /*rOldBoundRect*/ )
39 : {
40 0 : switch( eType )
41 : {
42 : case( SDRUSERCALL_MOVEONLY ):
43 : case( SDRUSERCALL_RESIZE ):
44 0 : rWin.SdrObjChanged( rObj );
45 0 : break;
46 :
47 : case( SDRUSERCALL_INSERTED ):
48 0 : rWin.SdrObjCreated( rObj );
49 0 : break;
50 :
51 : default:
52 0 : break;
53 : }
54 0 : }
55 :
56 0 : GraphCtrl::GraphCtrl( vcl::Window* pParent, WinBits nStyle ) :
57 : Control ( pParent, nStyle ),
58 : aMap100 ( MAP_100TH_MM ),
59 : nWinStyle ( 0 ),
60 : eObjKind ( OBJ_NONE ),
61 : nPolyEdit ( 0 ),
62 : bEditMode ( false ),
63 : bSdrMode ( false ),
64 : bAnim ( false ),
65 : mpAccContext ( NULL ),
66 : pModel ( NULL ),
67 0 : pView ( NULL )
68 : {
69 0 : pUserCall = new GraphCtrlUserCall( *this );
70 0 : aUpdateTimer.SetTimeout( 500 );
71 0 : aUpdateTimer.SetTimeoutHdl( LINK( this, GraphCtrl, UpdateHdl ) );
72 0 : aUpdateTimer.Start();
73 0 : EnableRTL( false );
74 0 : }
75 :
76 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeGraphCtrl(vcl::Window *pParent, VclBuilder::stringmap &rMap)
77 : {
78 0 : WinBits nWinStyle = 0;
79 0 : OString sBorder = VclBuilder::extractCustomProperty(rMap);
80 0 : if (!sBorder.isEmpty())
81 0 : nWinStyle |= WB_BORDER;
82 0 : return new GraphCtrl(pParent, nWinStyle);
83 : }
84 :
85 0 : GraphCtrl::~GraphCtrl()
86 : {
87 0 : if( mpAccContext )
88 : {
89 0 : mpAccContext->disposing();
90 0 : mpAccContext->release();
91 : }
92 0 : delete pView;
93 0 : delete pModel;
94 0 : delete pUserCall;
95 0 : }
96 :
97 0 : void GraphCtrl::SetWinStyle( WinBits nWinBits )
98 : {
99 0 : nWinStyle = nWinBits;
100 0 : bAnim = ( nWinStyle & WB_ANIMATION ) == WB_ANIMATION;
101 0 : bSdrMode = ( nWinStyle & WB_SDRMODE ) == WB_SDRMODE;
102 :
103 0 : const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
104 0 : SetBackground( Wallpaper( rStyleSettings.GetWindowColor() ) );
105 0 : SetMapMode( aMap100 );
106 :
107 0 : delete pView;
108 0 : pView = NULL;
109 :
110 0 : delete pModel;
111 0 : pModel = NULL;
112 :
113 0 : if ( bSdrMode )
114 0 : InitSdrModel();
115 0 : }
116 :
117 0 : void GraphCtrl::InitSdrModel()
118 : {
119 0 : SolarMutexGuard aGuard;
120 :
121 : SdrPage* pPage;
122 :
123 : // destroy old junk
124 0 : delete pView;
125 0 : delete pModel;
126 :
127 : // Creating a Model
128 0 : pModel = new SdrModel;
129 0 : pModel->GetItemPool().FreezeIdRanges();
130 0 : pModel->SetScaleUnit( aMap100.GetMapUnit() );
131 0 : pModel->SetScaleFraction( Fraction( 1, 1 ) );
132 0 : pModel->SetDefaultFontHeight( 500 );
133 :
134 0 : pPage = new SdrPage( *pModel );
135 :
136 0 : pPage->SetSize( aGraphSize );
137 0 : pPage->SetBorder( 0, 0, 0, 0 );
138 0 : pModel->InsertPage( pPage );
139 0 : pModel->SetChanged( false );
140 :
141 : // Creating a View
142 0 : pView = new GraphCtrlView( pModel, this );
143 0 : pView->SetWorkArea( Rectangle( Point(), aGraphSize ) );
144 0 : pView->EnableExtendedMouseEventDispatcher( true );
145 0 : pView->ShowSdrPage(pView->GetModel()->GetPage(0));
146 0 : pView->SetFrameDragSingles( true );
147 0 : pView->SetMarkedPointsSmooth( SDRPATHSMOOTH_SYMMETRIC );
148 0 : pView->SetEditMode( true );
149 :
150 : // #i72889# set neeeded flags
151 0 : pView->SetPagePaintingAllowed(false);
152 0 : pView->SetBufferedOutputAllowed(true);
153 0 : pView->SetBufferedOverlayAllowed(true);
154 :
155 : // Tell the accessibility object about the changes.
156 0 : if (mpAccContext != NULL)
157 0 : mpAccContext->setModelAndView (pModel, pView);
158 0 : }
159 :
160 0 : void GraphCtrl::SetGraphic( const Graphic& rGraphic, bool bNewModel )
161 : {
162 : // If possible we dither bitmaps for the display
163 0 : if ( !bAnim && ( rGraphic.GetType() == GRAPHIC_BITMAP ) )
164 : {
165 0 : if ( rGraphic.IsTransparent() )
166 : {
167 0 : Bitmap aBmp( rGraphic.GetBitmap() );
168 :
169 0 : DitherBitmap( aBmp );
170 0 : aGraphic = Graphic( BitmapEx( aBmp, rGraphic.GetBitmapEx().GetMask() ) );
171 : }
172 : else
173 : {
174 0 : Bitmap aBmp( rGraphic.GetBitmap() );
175 0 : DitherBitmap( aBmp );
176 0 : aGraphic = aBmp;
177 : }
178 : }
179 : else
180 0 : aGraphic = rGraphic;
181 :
182 0 : if ( aGraphic.GetPrefMapMode().GetMapUnit() == MAP_PIXEL )
183 0 : aGraphSize = Application::GetDefaultDevice()->PixelToLogic( aGraphic.GetPrefSize(), aMap100 );
184 : else
185 0 : aGraphSize = OutputDevice::LogicToLogic( aGraphic.GetPrefSize(), aGraphic.GetPrefMapMode(), aMap100 );
186 :
187 0 : if ( bSdrMode && bNewModel )
188 0 : InitSdrModel();
189 :
190 0 : if ( aGraphSizeLink.IsSet() )
191 0 : aGraphSizeLink.Call( this );
192 :
193 0 : Resize();
194 0 : Invalidate();
195 0 : }
196 :
197 0 : void GraphCtrl::Resize()
198 : {
199 0 : Control::Resize();
200 :
201 0 : if ( aGraphSize.Width() && aGraphSize.Height() )
202 : {
203 0 : MapMode aDisplayMap( aMap100 );
204 0 : Point aNewPos;
205 0 : Size aNewSize;
206 0 : const Size aWinSize = PixelToLogic( GetOutputSizePixel(), aDisplayMap );
207 0 : const long nWidth = aWinSize.Width();
208 0 : const long nHeight = aWinSize.Height();
209 0 : double fGrfWH = (double) aGraphSize.Width() / aGraphSize.Height();
210 0 : double fWinWH = (double) nWidth / nHeight;
211 :
212 : // Adapt Bitmap to Thumb size
213 0 : if ( fGrfWH < fWinWH)
214 : {
215 0 : aNewSize.Width() = (long) ( (double) nHeight * fGrfWH );
216 0 : aNewSize.Height()= nHeight;
217 : }
218 : else
219 : {
220 0 : aNewSize.Width() = nWidth;
221 0 : aNewSize.Height()= (long) ( (double) nWidth / fGrfWH );
222 : }
223 :
224 0 : aNewPos.X() = ( nWidth - aNewSize.Width() ) >> 1;
225 0 : aNewPos.Y() = ( nHeight - aNewSize.Height() ) >> 1;
226 :
227 : // Implementing MapMode for Engine
228 0 : aDisplayMap.SetScaleX( Fraction( aNewSize.Width(), aGraphSize.Width() ) );
229 0 : aDisplayMap.SetScaleY( Fraction( aNewSize.Height(), aGraphSize.Height() ) );
230 :
231 0 : aDisplayMap.SetOrigin( LogicToLogic( aNewPos, aMap100, aDisplayMap ) );
232 0 : SetMapMode( aDisplayMap );
233 : }
234 :
235 0 : Invalidate();
236 0 : }
237 :
238 0 : void GraphCtrl::Paint( const Rectangle& rRect )
239 : {
240 : // #i72889# used splitted repaint to be able to paint an own background
241 : // even to the buffered view
242 0 : const bool bGraphicValid(GRAPHIC_NONE != aGraphic.GetType());
243 :
244 0 : if(bSdrMode)
245 : {
246 0 : SdrPaintWindow* pPaintWindow = pView->BeginCompleteRedraw(this);
247 :
248 0 : if(bGraphicValid)
249 : {
250 0 : OutputDevice& rTarget = pPaintWindow->GetTargetOutputDevice();
251 :
252 0 : rTarget.SetBackground(GetBackground());
253 0 : rTarget.Erase();
254 :
255 0 : aGraphic.Draw(&rTarget, Point(), aGraphSize);
256 : }
257 :
258 0 : const vcl::Region aRepaintRegion(rRect);
259 0 : pView->DoCompleteRedraw(*pPaintWindow, aRepaintRegion);
260 0 : pView->EndCompleteRedraw(*pPaintWindow, true);
261 : }
262 : else
263 : {
264 : // #i73381# in non-SdrMode, paint to local directly
265 0 : if(bGraphicValid)
266 : {
267 0 : aGraphic.Draw(this, Point(), aGraphSize);
268 : }
269 : }
270 0 : }
271 :
272 0 : void GraphCtrl::SdrObjChanged( const SdrObject& )
273 : {
274 0 : }
275 :
276 0 : void GraphCtrl::SdrObjCreated( const SdrObject& )
277 : {
278 0 : }
279 :
280 0 : void GraphCtrl::MarkListHasChanged()
281 : {
282 0 : if ( aMarkObjLink.IsSet() )
283 0 : aMarkObjLink.Call( this );
284 0 : }
285 :
286 0 : void GraphCtrl::KeyInput( const KeyEvent& rKEvt )
287 : {
288 0 : vcl::KeyCode aCode( rKEvt.GetKeyCode() );
289 0 : bool bProc = false;
290 :
291 0 : Dialog* pDialog = GetParentDialog();
292 :
293 0 : switch ( aCode.GetCode() )
294 : {
295 : case KEY_DELETE:
296 : case KEY_BACKSPACE:
297 : {
298 0 : if ( bSdrMode )
299 : {
300 0 : pView->DeleteMarked();
301 0 : bProc = true;
302 0 : if (!pView->AreObjectsMarked() && pDialog)
303 0 : pDialog->GrabFocusToFirstControl();
304 : }
305 : }
306 0 : break;
307 :
308 : case KEY_ESCAPE:
309 : {
310 0 : if ( bSdrMode )
311 : {
312 0 : bool bGrabFocusToFirstControl = true;
313 0 : if ( pView->IsAction() )
314 : {
315 0 : pView->BrkAction();
316 0 : bGrabFocusToFirstControl = false;
317 : }
318 0 : else if ( pView->AreObjectsMarked() )
319 : {
320 0 : const SdrHdlList& rHdlList = pView->GetHdlList();
321 0 : SdrHdl* pHdl = rHdlList.GetFocusHdl();
322 :
323 0 : if(pHdl)
324 : {
325 0 : ((SdrHdlList&)rHdlList).ResetFocusHdl();
326 0 : bGrabFocusToFirstControl = false;
327 : }
328 : }
329 0 : if (bGrabFocusToFirstControl && pDialog)
330 0 : pDialog->GrabFocusToFirstControl();
331 0 : bProc = true;
332 : }
333 : }
334 0 : break;
335 :
336 : case KEY_F11:
337 : case KEY_TAB:
338 : {
339 0 : if( bSdrMode )
340 : {
341 0 : if( !aCode.IsMod1() && !aCode.IsMod2() )
342 : {
343 0 : bool bForward = !aCode.IsShift();
344 : // select next object
345 0 : if ( ! pView->MarkNextObj( bForward ))
346 : {
347 : // At first or last object. Cycle to the other end
348 : // of the list.
349 0 : pView->UnmarkAllObj();
350 0 : pView->MarkNextObj (bForward);
351 : }
352 0 : bProc = true;
353 : }
354 0 : else if(aCode.IsMod1())
355 : {
356 : // select next handle
357 0 : const SdrHdlList& rHdlList = pView->GetHdlList();
358 0 : bool bForward(!aCode.IsShift());
359 :
360 0 : ((SdrHdlList&)rHdlList).TravelFocusHdl(bForward);
361 :
362 0 : bProc = true;
363 : }
364 : }
365 : }
366 0 : break;
367 :
368 : case KEY_END:
369 : {
370 :
371 0 : if ( aCode.IsMod1() )
372 : {
373 : // mark last object
374 0 : pView->UnmarkAllObj();
375 0 : pView->MarkNextObj(false);
376 :
377 0 : bProc = true;
378 : }
379 : }
380 0 : break;
381 :
382 : case KEY_HOME:
383 : {
384 0 : if ( aCode.IsMod1() )
385 : {
386 0 : pView->UnmarkAllObj();
387 0 : pView->MarkNextObj(true);
388 :
389 0 : bProc = true;
390 : }
391 : }
392 0 : break;
393 :
394 : case KEY_UP:
395 : case KEY_DOWN:
396 : case KEY_LEFT:
397 : case KEY_RIGHT:
398 : {
399 0 : long nX = 0;
400 0 : long nY = 0;
401 :
402 0 : if (aCode.GetCode() == KEY_UP)
403 : {
404 : // Scroll up
405 0 : nX = 0;
406 0 : nY =-1;
407 : }
408 0 : else if (aCode.GetCode() == KEY_DOWN)
409 : {
410 : // Scroll down
411 0 : nX = 0;
412 0 : nY = 1;
413 : }
414 0 : else if (aCode.GetCode() == KEY_LEFT)
415 : {
416 : // Scroll left
417 0 : nX =-1;
418 0 : nY = 0;
419 : }
420 0 : else if (aCode.GetCode() == KEY_RIGHT)
421 : {
422 : // Scroll right
423 0 : nX = 1;
424 0 : nY = 0;
425 : }
426 :
427 0 : if (pView->AreObjectsMarked() && !aCode.IsMod1() )
428 : {
429 0 : if(aCode.IsMod2())
430 : {
431 : // move in 1 pixel distance
432 0 : Size aLogicSizeOnePixel = PixelToLogic(Size(1,1));
433 0 : nX *= aLogicSizeOnePixel.Width();
434 0 : nY *= aLogicSizeOnePixel.Height();
435 : }
436 : else
437 : {
438 : // old, fixed move distance
439 0 : nX *= 100;
440 0 : nY *= 100;
441 : }
442 :
443 : // II
444 0 : const SdrHdlList& rHdlList = pView->GetHdlList();
445 0 : SdrHdl* pHdl = rHdlList.GetFocusHdl();
446 :
447 0 : if(0L == pHdl)
448 : {
449 : // restrict movement to WorkArea
450 0 : const Rectangle& rWorkArea = pView->GetWorkArea();
451 :
452 0 : if(!rWorkArea.IsEmpty())
453 : {
454 0 : Rectangle aMarkRect(pView->GetMarkedObjRect());
455 0 : aMarkRect.Move(nX, nY);
456 :
457 0 : if(!aMarkRect.IsInside(rWorkArea))
458 : {
459 0 : if(aMarkRect.Left() < rWorkArea.Left())
460 : {
461 0 : nX += rWorkArea.Left() - aMarkRect.Left();
462 : }
463 :
464 0 : if(aMarkRect.Right() > rWorkArea.Right())
465 : {
466 0 : nX -= aMarkRect.Right() - rWorkArea.Right();
467 : }
468 :
469 0 : if(aMarkRect.Top() < rWorkArea.Top())
470 : {
471 0 : nY += rWorkArea.Top() - aMarkRect.Top();
472 : }
473 :
474 0 : if(aMarkRect.Bottom() > rWorkArea.Bottom())
475 : {
476 0 : nY -= aMarkRect.Bottom() - rWorkArea.Bottom();
477 : }
478 : }
479 : }
480 :
481 : // no handle selected
482 0 : if(0 != nX || 0 != nY)
483 : {
484 0 : pView->MoveAllMarked(Size(nX, nY));
485 : }
486 : }
487 : else
488 : {
489 : // move handle with index nHandleIndex
490 0 : if(pHdl && (nX || nY))
491 : {
492 : // now move the Handle (nX, nY)
493 0 : Point aStartPoint(pHdl->GetPos());
494 0 : Point aEndPoint(pHdl->GetPos() + Point(nX, nY));
495 0 : const SdrDragStat& rDragStat = pView->GetDragStat();
496 :
497 : // start dragging
498 0 : pView->BegDragObj(aStartPoint, 0, pHdl, 0);
499 :
500 0 : if(pView->IsDragObj())
501 : {
502 0 : bool bWasNoSnap = rDragStat.IsNoSnap();
503 0 : bool bWasSnapEnabled = pView->IsSnapEnabled();
504 :
505 : // switch snapping off
506 0 : if(!bWasNoSnap)
507 0 : ((SdrDragStat&)rDragStat).SetNoSnap(true);
508 0 : if(bWasSnapEnabled)
509 0 : pView->SetSnapEnabled(false);
510 :
511 0 : pView->MovAction(aEndPoint);
512 0 : pView->EndDragObj();
513 :
514 : // restore snap
515 0 : if(!bWasNoSnap)
516 0 : ((SdrDragStat&)rDragStat).SetNoSnap(bWasNoSnap);
517 0 : if(bWasSnapEnabled)
518 0 : pView->SetSnapEnabled(bWasSnapEnabled);
519 : }
520 : }
521 : }
522 :
523 0 : bProc = true;
524 : }
525 : }
526 0 : break;
527 :
528 : case KEY_SPACE:
529 : {
530 0 : const SdrHdlList& rHdlList = pView->GetHdlList();
531 0 : SdrHdl* pHdl = rHdlList.GetFocusHdl();
532 :
533 0 : if(pHdl)
534 : {
535 0 : if(pHdl->GetKind() == HDL_POLY)
536 : {
537 : // rescue ID of point with focus
538 0 : sal_uInt32 nPol(pHdl->GetPolyNum());
539 0 : sal_uInt32 nPnt(pHdl->GetPointNum());
540 :
541 0 : if(pView->IsPointMarked(*pHdl))
542 : {
543 0 : if(rKEvt.GetKeyCode().IsShift())
544 : {
545 0 : pView->UnmarkPoint(*pHdl);
546 : }
547 : }
548 : else
549 : {
550 0 : if(!rKEvt.GetKeyCode().IsShift())
551 : {
552 0 : pView->UnmarkAllPoints();
553 : }
554 :
555 0 : pView->MarkPoint(*pHdl);
556 : }
557 :
558 0 : if(0L == rHdlList.GetFocusHdl())
559 : {
560 : // restore point with focus
561 0 : SdrHdl* pNewOne = 0L;
562 :
563 0 : for(size_t a = 0; !pNewOne && a < rHdlList.GetHdlCount(); ++a)
564 : {
565 0 : SdrHdl* pAct = rHdlList.GetHdl(a);
566 :
567 0 : if(pAct
568 0 : && pAct->GetKind() == HDL_POLY
569 0 : && pAct->GetPolyNum() == nPol
570 0 : && pAct->GetPointNum() == nPnt)
571 : {
572 0 : pNewOne = pAct;
573 : }
574 : }
575 :
576 0 : if(pNewOne)
577 : {
578 0 : ((SdrHdlList&)rHdlList).SetFocusHdl(pNewOne);
579 : }
580 : }
581 :
582 0 : bProc = true;
583 : }
584 : }
585 : }
586 0 : break;
587 :
588 : default:
589 0 : break;
590 : }
591 :
592 0 : if ( !bProc )
593 0 : Control::KeyInput( rKEvt );
594 : else
595 0 : ReleaseMouse();
596 0 : }
597 :
598 0 : void GraphCtrl::MouseButtonDown( const MouseEvent& rMEvt )
599 : {
600 0 : if ( bSdrMode && ( rMEvt.GetClicks() < 2 ) )
601 : {
602 0 : const Point aLogPt( PixelToLogic( rMEvt.GetPosPixel() ) );
603 :
604 0 : if ( !Rectangle( Point(), aGraphSize ).IsInside( aLogPt ) && !pView->IsEditMode() )
605 0 : Control::MouseButtonDown( rMEvt );
606 : else
607 : {
608 : // Get Focus for key inputs
609 0 : GrabFocus();
610 :
611 0 : if ( nPolyEdit )
612 : {
613 0 : SdrViewEvent aVEvt;
614 0 : SdrHitKind eHit = pView->PickAnything( rMEvt, SDRMOUSEBUTTONDOWN, aVEvt );
615 :
616 0 : if ( nPolyEdit == SID_BEZIER_INSERT && eHit == SDRHIT_MARKEDOBJECT )
617 0 : pView->BegInsObjPoint( aLogPt, rMEvt.IsMod1());
618 : else
619 0 : pView->MouseButtonDown( rMEvt, this );
620 : }
621 : else
622 0 : pView->MouseButtonDown( rMEvt, this );
623 : }
624 :
625 0 : SdrObject* pCreateObj = pView->GetCreateObj();
626 :
627 : // We want to realize the insert
628 0 : if ( pCreateObj && !pCreateObj->GetUserCall() )
629 0 : pCreateObj->SetUserCall( pUserCall );
630 :
631 0 : SetPointer( pView->GetPreferredPointer( aLogPt, this ) );
632 : }
633 : else
634 0 : Control::MouseButtonDown( rMEvt );
635 0 : }
636 :
637 0 : void GraphCtrl::MouseMove(const MouseEvent& rMEvt)
638 : {
639 0 : const Point aLogPos( PixelToLogic( rMEvt.GetPosPixel() ) );
640 :
641 0 : if ( bSdrMode )
642 : {
643 0 : pView->MouseMove( rMEvt, this );
644 :
645 0 : if( ( SID_BEZIER_INSERT == nPolyEdit ) &&
646 0 : !pView->PickHandle( aLogPos ) &&
647 0 : !pView->IsInsObjPoint() )
648 : {
649 0 : SetPointer( POINTER_CROSS );
650 : }
651 : else
652 0 : SetPointer( pView->GetPreferredPointer( aLogPos, this ) );
653 : }
654 : else
655 0 : Control::MouseButtonUp( rMEvt );
656 :
657 0 : if ( aMousePosLink.IsSet() )
658 : {
659 0 : if ( Rectangle( Point(), aGraphSize ).IsInside( aLogPos ) )
660 0 : aMousePos = aLogPos;
661 : else
662 0 : aMousePos = Point();
663 :
664 0 : aMousePosLink.Call( this );
665 : }
666 0 : }
667 :
668 0 : void GraphCtrl::MouseButtonUp(const MouseEvent& rMEvt)
669 : {
670 0 : if ( bSdrMode )
671 : {
672 0 : if ( pView->IsInsObjPoint() )
673 0 : pView->EndInsObjPoint( SDRCREATE_FORCEEND );
674 : else
675 0 : pView->MouseButtonUp( rMEvt, this );
676 :
677 0 : ReleaseMouse();
678 0 : SetPointer( pView->GetPreferredPointer( PixelToLogic( rMEvt.GetPosPixel() ), this ) );
679 : }
680 : else
681 0 : Control::MouseButtonUp( rMEvt );
682 0 : }
683 :
684 0 : SdrObject* GraphCtrl::GetSelectedSdrObject() const
685 : {
686 0 : SdrObject* pSdrObj = NULL;
687 :
688 0 : if ( bSdrMode )
689 : {
690 0 : const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
691 :
692 0 : if ( rMarkList.GetMarkCount() == 1 )
693 0 : pSdrObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
694 : }
695 :
696 0 : return pSdrObj;
697 : }
698 :
699 0 : void GraphCtrl::SetEditMode( const bool _bEditMode )
700 : {
701 0 : if ( bSdrMode )
702 : {
703 0 : bEditMode = _bEditMode;
704 0 : pView->SetEditMode( bEditMode );
705 0 : eObjKind = OBJ_NONE;
706 0 : pView->SetCurrentObj( sal::static_int_cast< sal_uInt16 >( eObjKind ) );
707 : }
708 : else
709 0 : bEditMode = false;
710 0 : }
711 :
712 0 : void GraphCtrl::SetPolyEditMode( const sal_uInt16 _nPolyEdit )
713 : {
714 0 : if ( bSdrMode && ( _nPolyEdit != nPolyEdit ) )
715 : {
716 0 : nPolyEdit = _nPolyEdit;
717 0 : pView->SetFrameDragSingles( nPolyEdit == 0 );
718 : }
719 : else
720 0 : nPolyEdit = 0;
721 0 : }
722 :
723 0 : void GraphCtrl::SetObjKind( const SdrObjKind _eObjKind )
724 : {
725 0 : if ( bSdrMode )
726 : {
727 0 : bEditMode = false;
728 0 : pView->SetEditMode( bEditMode );
729 0 : eObjKind = _eObjKind;
730 0 : pView->SetCurrentObj( sal::static_int_cast< sal_uInt16 >( eObjKind ) );
731 : }
732 : else
733 0 : eObjKind = OBJ_NONE;
734 0 : }
735 :
736 0 : IMPL_LINK( GraphCtrl, UpdateHdl, Timer*, pTimer )
737 : {
738 0 : if ( aUpdateLink.IsSet() )
739 0 : aUpdateLink.Call( this );
740 :
741 0 : pTimer->Start();
742 :
743 0 : return 0L;
744 : }
745 :
746 :
747 0 : ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > GraphCtrl::CreateAccessible()
748 : {
749 0 : if( mpAccContext == NULL )
750 : {
751 0 : vcl::Window* pParent = GetParent();
752 :
753 : DBG_ASSERT( pParent, "-GraphCtrl::CreateAccessible(): No Parent!" );
754 :
755 0 : if( pParent )
756 : {
757 0 : ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > xAccParent( pParent->GetAccessible() );
758 :
759 : // Disable accessibility if no model/view data available
760 0 : if( pView &&
761 0 : pModel &&
762 0 : xAccParent.is() )
763 : {
764 0 : mpAccContext = new SvxGraphCtrlAccessibleContext( xAccParent, *this );
765 0 : mpAccContext->acquire();
766 0 : }
767 : }
768 : }
769 :
770 0 : return mpAccContext;
771 594 : }
772 :
773 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|