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