LibreOffice Module svx (master)  1
graphctl.cxx
Go to the documentation of this file.
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/settings.hxx>
22 #include <vcl/ptrstyle.hxx>
23 #include <vcl/svapp.hxx>
24 
25 #include <svx/graphctl.hxx>
28 #include <svx/svxids.hrc>
29 #include <svx/svdpage.hxx>
30 #include <svx/sdrpaintwindow.hxx>
31 
32 void GraphCtrlUserCall::Changed( const SdrObject& rObj, SdrUserCallType eType, const tools::Rectangle& /*rOldBoundRect*/ )
33 {
34  switch( eType )
35  {
38  rWin.SdrObjChanged( rObj );
39  break;
40 
42  rWin.SdrObjCreated( rObj );
43  break;
44 
45  default:
46  break;
47  }
49 }
50 
52  : aUpdateIdle("svx GraphCtrl Update")
53  , aMap100(MapUnit::Map100thMM)
54  , eObjKind(OBJ_NONE)
55  , nPolyEdit(0)
56  , bEditMode(false)
57  , mbSdrMode(false)
58  , mbInIdleUpdate(false)
59  , mpDialog(pDialog)
60 {
61  pUserCall.reset(new GraphCtrlUserCall( *this ));
62  aUpdateIdle.SetPriority( TaskPriority::LOWEST );
63  aUpdateIdle.SetInvokeHandler( LINK( this, GraphCtrl, UpdateHdl ) );
65 }
66 
68 {
70  EnableRTL(false);
71 }
72 
74 {
75  aUpdateIdle.Stop();
76 
77  if( mpAccContext.is() )
78  {
79  mpAccContext->disposing();
80  mpAccContext.clear();
81  }
82  pView.reset();
83  pModel.reset();
84  pUserCall.reset();
85 }
86 
87 void GraphCtrl::SetSdrMode(bool bSdrMode)
88 {
89  mbSdrMode = bSdrMode;
90 
91  const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
93  rDevice.SetBackground( Wallpaper( rStyleSettings.GetWindowColor() ) );
94  xVD->SetBackground( Wallpaper( rStyleSettings.GetWindowColor() ) );
95  rDevice.SetMapMode( aMap100 );
96  xVD->SetMapMode( aMap100 );
97 
98  pView.reset();
99  pModel.reset();
100 
101  if ( mbSdrMode )
102  InitSdrModel();
103 
104  QueueIdleUpdate();
105 }
106 
108 {
109  SolarMutexGuard aGuard;
110 
111  SdrPage* pPage;
112 
113  // destroy old junk
114  pView.reset();
115  pModel.reset();
116 
117  // Creating a Model
118  pModel.reset(new SdrModel(nullptr, nullptr, true));
119  pModel->GetItemPool().FreezeIdRanges();
120  pModel->SetScaleUnit( aMap100.GetMapUnit() );
121  pModel->SetScaleFraction( Fraction( 1, 1 ) );
122  pModel->SetDefaultFontHeight( 500 );
123 
124  pPage = new SdrPage( *pModel );
125 
126  pPage->SetSize( aGraphSize );
127  pPage->SetBorder( 0, 0, 0, 0 );
128  pModel->InsertPage( pPage );
129  pModel->SetChanged( false );
130 
131  // Creating a View
132  pView.reset(new GraphCtrlView(*pModel, this));
133  pView->SetWorkArea( tools::Rectangle( Point(), aGraphSize ) );
134  pView->EnableExtendedMouseEventDispatcher( true );
135  pView->ShowSdrPage(pView->GetModel()->GetPage(0));
136  pView->SetFrameDragSingles();
137  pView->SetMarkedPointsSmooth( SdrPathSmoothKind::Symmetric );
138  pView->SetEditMode();
139 
140  // #i72889# set needed flags
141  pView->SetPagePaintingAllowed(false);
142  pView->SetBufferedOutputAllowed(true);
143  pView->SetBufferedOverlayAllowed(true);
144 
145  // Tell the accessibility object about the changes.
146  if (mpAccContext.is())
147  mpAccContext->setModelAndView (pModel.get(), pView.get());
148 }
149 
150 void GraphCtrl::SetGraphic( const Graphic& rGraphic, bool bNewModel )
151 {
152  aGraphic = rGraphic;
153  xVD->SetOutputSizePixel(Size(0, 0)); //force redraw
154 
155  if ( aGraphic.GetPrefMapMode().GetMapUnit() == MapUnit::MapPixel )
157  else
159 
160  if ( mbSdrMode && bNewModel )
161  InitSdrModel();
162 
163  aGraphSizeLink.Call( this );
164 
165  Resize();
166 
167  Invalidate();
168  QueueIdleUpdate();
169 }
170 
172 {
174  xVD->SetOutputSizePixel(GetOutputSizePixel());
175  xVD->SetBackground(rDevice.GetBackground());
176  xVD->Erase();
177  const bool bGraphicValid(GraphicType::NONE != aGraphic.GetType());
178  if (bGraphicValid)
180 }
181 
183 {
185 
186  if (aGraphSize.Width() && aGraphSize.Height())
187  {
188  MapMode aDisplayMap( aMap100 );
189  Point aNewPos;
190  Size aNewSize;
192  const Size aWinSize = rDevice.PixelToLogic( GetOutputSizePixel(), aDisplayMap );
193  const long nWidth = aWinSize.Width();
194  const long nHeight = aWinSize.Height();
195  double fGrfWH = static_cast<double>(aGraphSize.Width()) / aGraphSize.Height();
196  double fWinWH = static_cast<double>(nWidth) / nHeight;
197 
198  // Adapt Bitmap to Thumb size
199  if ( fGrfWH < fWinWH)
200  {
201  aNewSize.setWidth( static_cast<long>( static_cast<double>(nHeight) * fGrfWH ) );
202  aNewSize.setHeight( nHeight );
203  }
204  else
205  {
206  aNewSize.setWidth( nWidth );
207  aNewSize.setHeight( static_cast<long>( static_cast<double>(nWidth) / fGrfWH ) );
208  }
209 
210  aNewPos.setX( ( nWidth - aNewSize.Width() ) >> 1 );
211  aNewPos.setY( ( nHeight - aNewSize.Height() ) >> 1 );
212 
213  // Implementing MapMode for Engine
214  aDisplayMap.SetScaleX( Fraction( aNewSize.Width(), aGraphSize.Width() ) );
215  aDisplayMap.SetScaleY( Fraction( aNewSize.Height(), aGraphSize.Height() ) );
216 
217  aDisplayMap.SetOrigin( OutputDevice::LogicToLogic( aNewPos, aMap100, aDisplayMap ) );
218  rDevice.SetMapMode( aDisplayMap );
219  xVD->SetMapMode( aDisplayMap );
220  }
221 
222  Invalidate();
223 }
224 
225 void GraphCtrl::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect)
226 {
227  // #i72889# used split repaint to be able to paint an own background
228  // even to the buffered view
229  const bool bGraphicValid(GraphicType::NONE != aGraphic.GetType());
230 
231  if (GetOutputSizePixel() != xVD->GetOutputSizePixel())
232  GraphicToVD();
233 
234  if (mbSdrMode)
235  {
236  SdrPaintWindow* pPaintWindow = pView->BeginCompleteRedraw(&rRenderContext);
237  pPaintWindow->SetOutputToWindow(true);
238 
239  if (bGraphicValid)
240  {
242 
244  rTarget.SetBackground(rDevice.GetBackground());
245  rTarget.Erase();
246 
247  rTarget.DrawOutDev(Point(), xVD->GetOutputSize(), Point(), xVD->GetOutputSize(), *xVD);
248  }
249 
250  const vcl::Region aRepaintRegion(rRect);
251  pView->DoCompleteRedraw(*pPaintWindow, aRepaintRegion);
252  pView->EndCompleteRedraw(*pPaintWindow, true);
253  }
254  else
255  {
256  // #i73381# in non-SdrMode, paint to local directly
257  rRenderContext.DrawOutDev(rRect.TopLeft(), rRect.GetSize(),
258  rRect.TopLeft(), rRect.GetSize(),
259  *xVD);
260  }
261 }
262 
264 {
265  QueueIdleUpdate();
266 }
267 
269 {
270  QueueIdleUpdate();
271 }
272 
274 {
275  QueueIdleUpdate();
276 }
277 
278 bool GraphCtrl::KeyInput( const KeyEvent& rKEvt )
279 {
280  vcl::KeyCode aCode( rKEvt.GetKeyCode() );
281  bool bProc = false;
282 
284 
285  switch ( aCode.GetCode() )
286  {
287  case KEY_DELETE:
288  case KEY_BACKSPACE:
289  {
290  if ( mbSdrMode )
291  {
292  pView->DeleteMarked();
293  bProc = true;
294  }
295  }
296  break;
297 
298  case KEY_ESCAPE:
299  {
300  if ( mbSdrMode )
301  {
302  if ( pView->IsAction() )
303  {
304  pView->BrkAction();
305  bProc = true;
306  }
307  else if ( pView->AreObjectsMarked() )
308  {
309  pView->UnmarkAllObj();
310  bProc = true;
311  }
312  }
313  }
314  break;
315 
316  case KEY_F11:
317  case KEY_TAB:
318  {
319  if( mbSdrMode )
320  {
321  if( !aCode.IsMod1() && !aCode.IsMod2() )
322  {
323  bool bForward = !aCode.IsShift();
324  // select next object
325  if ( ! pView->MarkNextObj( bForward ))
326  {
327  // At first or last object. Cycle to the other end
328  // of the list.
329  pView->UnmarkAllObj();
330  pView->MarkNextObj (bForward);
331  }
332  bProc = true;
333  }
334  else if(aCode.IsMod1())
335  {
336  // select next handle
337  const SdrHdlList& rHdlList = pView->GetHdlList();
338  bool bForward(!aCode.IsShift());
339 
340  const_cast<SdrHdlList&>(rHdlList).TravelFocusHdl(bForward);
341 
342  bProc = true;
343  }
344  }
345  }
346  break;
347 
348  case KEY_END:
349  {
350 
351  if ( aCode.IsMod1() )
352  {
353  // mark last object
354  pView->UnmarkAllObj();
355  pView->MarkNextObj();
356 
357  bProc = true;
358  }
359  }
360  break;
361 
362  case KEY_HOME:
363  {
364  if ( aCode.IsMod1() )
365  {
366  pView->UnmarkAllObj();
367  pView->MarkNextObj(true);
368 
369  bProc = true;
370  }
371  }
372  break;
373 
374  case KEY_UP:
375  case KEY_DOWN:
376  case KEY_LEFT:
377  case KEY_RIGHT:
378  {
379  long nX = 0;
380  long nY = 0;
381 
382  if (aCode.GetCode() == KEY_UP)
383  {
384  // Scroll up
385  nX = 0;
386  nY =-1;
387  }
388  else if (aCode.GetCode() == KEY_DOWN)
389  {
390  // Scroll down
391  nX = 0;
392  nY = 1;
393  }
394  else if (aCode.GetCode() == KEY_LEFT)
395  {
396  // Scroll left
397  nX =-1;
398  nY = 0;
399  }
400  else if (aCode.GetCode() == KEY_RIGHT)
401  {
402  // Scroll right
403  nX = 1;
404  nY = 0;
405  }
406 
407  if (pView->AreObjectsMarked() && !aCode.IsMod1() )
408  {
409  if(aCode.IsMod2())
410  {
411  // move in 1 pixel distance
412  Size aLogicSizeOnePixel = rDevice.PixelToLogic(Size(1,1));
413  nX *= aLogicSizeOnePixel.Width();
414  nY *= aLogicSizeOnePixel.Height();
415  }
416  else
417  {
418  // old, fixed move distance
419  nX *= 100;
420  nY *= 100;
421  }
422 
423  // II
424  const SdrHdlList& rHdlList = pView->GetHdlList();
425  SdrHdl* pHdl = rHdlList.GetFocusHdl();
426 
427  if(nullptr == pHdl)
428  {
429  // restrict movement to WorkArea
430  const tools::Rectangle& rWorkArea = pView->GetWorkArea();
431 
432  if(!rWorkArea.IsEmpty())
433  {
434  tools::Rectangle aMarkRect(pView->GetMarkedObjRect());
435  aMarkRect.Move(nX, nY);
436 
437  if(!aMarkRect.IsInside(rWorkArea))
438  {
439  if(aMarkRect.Left() < rWorkArea.Left())
440  {
441  nX += rWorkArea.Left() - aMarkRect.Left();
442  }
443 
444  if(aMarkRect.Right() > rWorkArea.Right())
445  {
446  nX -= aMarkRect.Right() - rWorkArea.Right();
447  }
448 
449  if(aMarkRect.Top() < rWorkArea.Top())
450  {
451  nY += rWorkArea.Top() - aMarkRect.Top();
452  }
453 
454  if(aMarkRect.Bottom() > rWorkArea.Bottom())
455  {
456  nY -= aMarkRect.Bottom() - rWorkArea.Bottom();
457  }
458  }
459  }
460 
461  // no handle selected
462  if(0 != nX || 0 != nY)
463  {
464  pView->MoveAllMarked(Size(nX, nY));
465  }
466  }
467  else
468  {
469  // move handle with index nHandleIndex
470  if (nX || nY)
471  {
472  // now move the Handle (nX, nY)
473  Point aStartPoint(pHdl->GetPos());
474  Point aEndPoint(pHdl->GetPos() + Point(nX, nY));
475  const SdrDragStat& rDragStat = pView->GetDragStat();
476 
477  // start dragging
478  pView->BegDragObj(aStartPoint, nullptr, pHdl, 0);
479 
480  if(pView->IsDragObj())
481  {
482  bool bWasNoSnap = rDragStat.IsNoSnap();
483  bool bWasSnapEnabled = pView->IsSnapEnabled();
484 
485  // switch snapping off
486  if(!bWasNoSnap)
487  const_cast<SdrDragStat&>(rDragStat).SetNoSnap();
488  if(bWasSnapEnabled)
489  pView->SetSnapEnabled(false);
490 
491  pView->MovAction(aEndPoint);
492  pView->EndDragObj();
493 
494  // restore snap
495  if(!bWasNoSnap)
496  const_cast<SdrDragStat&>(rDragStat).SetNoSnap(bWasNoSnap);
497  if(bWasSnapEnabled)
498  pView->SetSnapEnabled(bWasSnapEnabled);
499  }
500  }
501  }
502 
503  bProc = true;
504  }
505  }
506  break;
507 
508  case KEY_SPACE:
509  {
510  const SdrHdlList& rHdlList = pView->GetHdlList();
511  SdrHdl* pHdl = rHdlList.GetFocusHdl();
512 
513  if(pHdl)
514  {
515  if(pHdl->GetKind() == SdrHdlKind::Poly)
516  {
517  // rescue ID of point with focus
518  sal_uInt32 nPol(pHdl->GetPolyNum());
519  sal_uInt32 nPnt(pHdl->GetPointNum());
520 
521  if(pView->IsPointMarked(*pHdl))
522  {
523  if(rKEvt.GetKeyCode().IsShift())
524  {
525  pView->UnmarkPoint(*pHdl);
526  }
527  }
528  else
529  {
530  if(!rKEvt.GetKeyCode().IsShift())
531  {
532  pView->UnmarkAllPoints();
533  }
534 
535  pView->MarkPoint(*pHdl);
536  }
537 
538  if(nullptr == rHdlList.GetFocusHdl())
539  {
540  // restore point with focus
541  SdrHdl* pNewOne = nullptr;
542 
543  for(size_t a = 0; !pNewOne && a < rHdlList.GetHdlCount(); ++a)
544  {
545  SdrHdl* pAct = rHdlList.GetHdl(a);
546 
547  if(pAct
548  && pAct->GetKind() == SdrHdlKind::Poly
549  && pAct->GetPolyNum() == nPol
550  && pAct->GetPointNum() == nPnt)
551  {
552  pNewOne = pAct;
553  }
554  }
555 
556  if(pNewOne)
557  {
558  const_cast<SdrHdlList&>(rHdlList).SetFocusHdl(pNewOne);
559  }
560  }
561 
562  bProc = true;
563  }
564  }
565  }
566  break;
567 
568  default:
569  break;
570  }
571 
572  if (bProc)
573  ReleaseMouse();
574 
575  QueueIdleUpdate();
576 
577  return bProc;
578 }
579 
581 {
582  if ( mbSdrMode && ( rMEvt.GetClicks() < 2 ) )
583  {
585 
586  const Point aLogPt( rDevice.PixelToLogic( rMEvt.GetPosPixel() ) );
587 
588  if ( !tools::Rectangle( Point(), aGraphSize ).IsInside( aLogPt ) && !pView->IsEditMode() )
590  else
591  {
592  // Get Focus for key inputs
593  GrabFocus();
594 
595  if ( nPolyEdit )
596  {
597  SdrViewEvent aVEvt;
598  SdrHitKind eHit = pView->PickAnything( rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt );
599 
600  if ( nPolyEdit == SID_BEZIER_INSERT && eHit == SdrHitKind::MarkedObject )
601  pView->BegInsObjPoint( aLogPt, rMEvt.IsMod1());
602  else
603  pView->MouseButtonDown( rMEvt, &rDevice );
604  }
605  else
606  pView->MouseButtonDown( rMEvt, &rDevice );
607  }
608 
609  SdrObject* pCreateObj = pView->GetCreateObj();
610 
611  // We want to realize the insert
612  if ( pCreateObj && !pCreateObj->GetUserCall() )
613  pCreateObj->SetUserCall( pUserCall.get() );
614 
615  SetPointer( pView->GetPreferredPointer( aLogPt, &rDevice ) );
616  }
617  else
619 
620  QueueIdleUpdate();
621 
622  return false;
623 }
624 
626 {
628  const Point aLogPos( rDevice.PixelToLogic( rMEvt.GetPosPixel() ) );
629 
630  if ( mbSdrMode )
631  {
632  pView->MouseMove( rMEvt, &rDevice );
633 
634  if( ( SID_BEZIER_INSERT == nPolyEdit ) &&
635  !pView->PickHandle( aLogPos ) &&
636  !pView->IsInsObjPoint() )
637  {
638  SetPointer( PointerStyle::Cross );
639  }
640  else
641  SetPointer( pView->GetPreferredPointer( aLogPos, &rDevice ) );
642  }
643  else
645 
646  if ( aMousePosLink.IsSet() )
647  {
648  if ( tools::Rectangle( Point(), aGraphSize ).IsInside( aLogPos ) )
649  aMousePos = aLogPos;
650  else
651  aMousePos = Point();
652 
653  aMousePosLink.Call( this );
654  }
655 
656  QueueIdleUpdate();
657 
658  return false;
659 }
660 
662 {
663  if ( mbSdrMode )
664  {
666 
667  if ( pView->IsInsObjPoint() )
668  pView->EndInsObjPoint( SdrCreateCmd::ForceEnd );
669  else
670  pView->MouseButtonUp( rMEvt, &rDevice );
671 
672  ReleaseMouse();
673  SetPointer( pView->GetPreferredPointer( rDevice.PixelToLogic( rMEvt.GetPosPixel() ), &rDevice ) );
674  }
675  else
677 
678  QueueIdleUpdate();
679 
680  return false;
681 }
682 
684 {
685  SdrObject* pSdrObj = nullptr;
686 
687  if ( mbSdrMode )
688  {
689  const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
690 
691  if ( rMarkList.GetMarkCount() == 1 )
692  pSdrObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
693  }
694 
695  return pSdrObj;
696 }
697 
698 void GraphCtrl::SetEditMode( const bool _bEditMode )
699 {
700  if ( mbSdrMode )
701  {
702  bEditMode = _bEditMode;
703  pView->SetEditMode( bEditMode );
704  eObjKind = OBJ_NONE;
705  pView->SetCurrentObj( sal::static_int_cast< sal_uInt16 >( eObjKind ) );
706  }
707  else
708  bEditMode = false;
709 
710  QueueIdleUpdate();
711 }
712 
713 void GraphCtrl::SetPolyEditMode( const sal_uInt16 _nPolyEdit )
714 {
715  if ( mbSdrMode && ( _nPolyEdit != nPolyEdit ) )
716  {
717  nPolyEdit = _nPolyEdit;
718  pView->SetFrameDragSingles( nPolyEdit == 0 );
719  }
720  else
721  nPolyEdit = 0;
722 
723  QueueIdleUpdate();
724 }
725 
726 void GraphCtrl::SetObjKind( const SdrObjKind _eObjKind )
727 {
728  if ( mbSdrMode )
729  {
730  bEditMode = false;
731  pView->SetEditMode( bEditMode );
732  eObjKind = _eObjKind;
733  pView->SetCurrentObj( sal::static_int_cast< sal_uInt16 >( eObjKind ) );
734  }
735  else
736  eObjKind = OBJ_NONE;
737 
738  QueueIdleUpdate();
739 }
740 
741 IMPL_LINK_NOARG(GraphCtrl, UpdateHdl, Timer *, void)
742 {
743  mbInIdleUpdate = true;
744  aUpdateLink.Call( this );
745  mbInIdleUpdate = false;
746 }
747 
749 {
750  if (!mbInIdleUpdate)
751  aUpdateIdle.Start();
752 }
753 
754 namespace
755 {
756  class WeldOverlayManager final : public sdr::overlay::OverlayManager
757  {
758  weld::CustomWidgetController& m_rGraphCtrl;
759 
760  public:
761  WeldOverlayManager(weld::CustomWidgetController& rGraphCtrl, OutputDevice& rDevice)
762  : OverlayManager(rDevice)
763  , m_rGraphCtrl(rGraphCtrl)
764  {
765  }
766 
767  // invalidate the given range at local OutputDevice
768  virtual void invalidateRange(const basegfx::B2DRange& rRange) override
769  {
770  tools::Rectangle aInvalidateRectangle(RangeToInvalidateRectangle(rRange));
771  m_rGraphCtrl.Invalidate(aInvalidateRectangle);
772  }
773  };
774 }
775 
777 {
778  assert(&rDevice == &rGraphCtrl.GetDrawingArea()->get_ref_device());
779  if (rDevice.GetOutDevType() == OUTDEV_VIRDEV)
780  {
781  rtl::Reference<sdr::overlay::OverlayManager> xOverlayManager(new WeldOverlayManager(rGraphCtrl, rDevice));
782  InitOverlayManager(xOverlayManager);
783  return xOverlayManager;
784  }
785  return SdrView::CreateOverlayManager(rDevice);
786 }
787 
789 {
790  assert(&rDevice == &rGraphCtrl.GetDrawingArea()->get_ref_device());
791  if (rDevice.GetOutDevType() == OUTDEV_VIRDEV)
792  {
794  return;
795  }
796  SdrView::InvalidateOneWin(rDevice);
797 }
798 
800 {
801  assert(&rDevice == &rGraphCtrl.GetDrawingArea()->get_ref_device());
802  if (rDevice.GetOutDevType() == OUTDEV_VIRDEV)
803  {
804  rGraphCtrl.Invalidate(rArea);
805  return;
806  }
807  SdrView::InvalidateOneWin(rDevice, rArea);
808 }
809 
811 {
812  // turn SetOutputToWindow back off again before
813  // turning back into our baseclass during dtoring
814  const sal_uInt32 nWindowCount(PaintWindowCount());
815  for (sal_uInt32 nWinNum(0); nWinNum < nWindowCount; nWinNum++)
816  {
817  SdrPaintWindow* pPaintWindow = GetPaintWindow(nWinNum);
818  pPaintWindow->SetOutputToWindow(false);
819  }
820 }
821 
823 {
824  int x, y, width, height;
825  if (GetDrawingArea()->get_extents_relative_to(*mpDialog, x, y, width, height))
826  return Point(x, y);
827  return Point();
828 }
829 
830 css::uno::Reference< css::accessibility::XAccessible > GraphCtrl::CreateAccessible()
831 {
832  if(mpAccContext == nullptr )
833  {
834  // Disable accessibility if no model/view data available
835  if (pView && pModel)
837  }
838  return mpAccContext.get();
839 }
840 
841 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Point TopLeft() const
long Width() const
std::unique_ptr< GraphCtrlUserCall > pUserCall
Definition: graphctl.hxx:60
OutDevType GetOutDevType() const
const Wallpaper & GetBackground() const
sal_uInt16 nPolyEdit
Definition: graphctl.hxx:62
virtual void SetDrawingArea(weld::DrawingArea *pDrawingArea) override
Definition: graphctl.cxx:67
size_t GetMarkCount() const
Definition: svdmark.hxx:180
sal_uInt32 GetPolyNum() const
Definition: svdhdl.hxx:219
virtual void SetSize(const Size &aSiz)
Definition: svdpage.cxx:1340
std::unique_ptr< SdrModel > pModel
Definition: graphctl.hxx:74
GraphCtrl(weld::Dialog *pDialog)
Definition: graphctl.cxx:51
void QueueIdleUpdate()
Definition: graphctl.cxx:748
OUTDEV_VIRDEV
Point LogicToLogic(const Point &rPtSource, const MapMode *pMapModeSource, const MapMode *pMapModeDest) const
long Height() const
const StyleSettings & GetStyleSettings() const
static const AllSettings & GetSettings()
virtual rtl::Reference< sdr::overlay::OverlayManager > CreateOverlayManager(OutputDevice &rDevice) const override
Definition: graphctl.cxx:776
SdrUserCallType
Definition: svdobj.hxx:167
FilterGroup & rTarget
virtual bool MouseButtonUp(const MouseEvent &)
sal_uInt32 GetPointNum() const
Definition: svdhdl.hxx:222
void GraphicToVD()
Definition: graphctl.cxx:171
virtual void MarkListHasChanged()
Definition: graphctl.cxx:273
Graphic aGraphic
Definition: graphctl.hxx:51
void InitOverlayManager(rtl::Reference< sdr::overlay::OverlayManager > xOverlayManager) const
SdrMark * GetMark(size_t nNum) const
Definition: svdmark.cxx:229
const Point & GetPos() const
Definition: svdhdl.hxx:197
constexpr sal_uInt16 KEY_SPACE
float x
void SetGraphic(const Graphic &rGraphic, bool bNewModel=true)
Definition: graphctl.cxx:150
void SetMapMode()
constexpr sal_uInt16 KEY_UP
Size const & GetOutputSizePixel() const
void Move(long nHorzMoveDelta, long nVertMoveDelta)
constexpr sal_uInt16 KEY_END
static OutputDevice * GetDefaultDevice()
bool IsEmpty() const
sal_uInt16 GetClicks() const
void SetBackground()
long Right() const
virtual void Changed(const SdrObject &rObj, SdrUserCallType eType, const tools::Rectangle &rOldBoundRect) override
Definition: graphctl.cxx:32
rtl::Reference< SvxGraphCtrlAccessibleContext > mpAccContext
Definition: graphctl.hxx:70
virtual rtl::Reference< sdr::overlay::OverlayManager > CreateOverlayManager(OutputDevice &rDevice) const
virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessible() override
Definition: graphctl.cxx:830
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
OutputDevice & GetTargetOutputDevice()
virtual void Paint(vcl::RenderContext &rRenderContext, const tools::Rectangle &rRect) override
Definition: graphctl.cxx:225
friend class GraphCtrlView
Definition: graphctl.hxx:48
Point GetPositionInDialog() const
Definition: graphctl.cxx:822
virtual void Start() override
virtual void InvalidateOneWin(OutputDevice &rWin) override
If the View should not call Invalidate() on the windows, override the following 2 methods and do some...
Definition: graphctl.cxx:788
bool mbInIdleUpdate
Definition: graphctl.hxx:65
long Top() const
virtual OutputDevice & get_ref_device()=0
sal_uInt32 PaintWindowCount() const
Definition: svdpntv.hxx:222
float y
ScopedVclPtrInstance< VirtualDevice > xVD
Definition: graphctl.hxx:52
DocumentType eType
constexpr sal_uInt16 KEY_DOWN
SdrObject * GetMarkedSdrObj() const
Definition: svdmark.hxx:68
SdrHitKind
Definition: svdmrkv.hxx:58
weld::Dialog * mpDialog
Definition: graphctl.hxx:66
void SetScaleX(const Fraction &rScaleX)
void SetObjKind(const SdrObjKind eObjKind)
Definition: graphctl.cxx:726
void Draw(OutputDevice *pOutDev, const Point &rDestPt) const
uno_Any a
MapMode aMap100
Definition: graphctl.hxx:57
GraphicType GetType() const
virtual void InitSdrModel()
Definition: graphctl.cxx:107
constexpr sal_uInt16 KEY_HOME
void SetOrigin(const Point &rOrigin)
void SetOutputToWindow(bool bOutputToWindow)
IMPL_LINK_NOARG(GraphCtrl, UpdateHdl, Timer *, void)
Definition: graphctl.cxx:741
long Bottom() const
Link< GraphCtrl *, void > aMousePosLink
Definition: graphctl.hxx:54
void SetScaleY(const Fraction &rScaleY)
virtual bool MouseMove(const MouseEvent &rMEvt) override
Definition: graphctl.cxx:625
virtual bool MouseButtonDown(const MouseEvent &rMEvt) override
Definition: graphctl.cxx:580
bool IsInside(const Point &rPOINT) const
MapUnit GetMapUnit() const
void SetUserCall(SdrObjUserCall *pUser)
Definition: svdobj.cxx:2649
tools::Rectangle RangeToInvalidateRectangle(const basegfx::B2DRange &rRange) const
Abstract DrawObject.
Definition: svdobj.hxx:313
Size GetSize() const
bool bEditMode
Definition: graphctl.hxx:63
void SetPolyEditMode(const sal_uInt16 nPolyEdit)
Definition: graphctl.cxx:713
virtual void SdrObjChanged(const SdrObject &rObj)
Definition: graphctl.cxx:263
constexpr sal_uInt16 KEY_RIGHT
Point PixelToLogic(const Point &rDevicePt) const
Size GetPrefSize() const
SdrHdl * GetFocusHdl() const
Definition: svdhdl.cxx:2127
size_t GetHdlCount() const
Definition: svdhdl.hxx:461
SdrHdl * GetHdl(size_t nNum) const
Definition: svdhdl.hxx:462
const vcl::KeyCode & GetKeyCode() const
virtual void Resize() override
Definition: graphctl.cxx:182
bool IsShift() const
weld::DrawingArea * GetDrawingArea() const
void Stop()
SdrObjKind
Definition: svdobj.hxx:117
virtual bool KeyInput(const KeyEvent &rKEvt) override
Definition: graphctl.cxx:278
MapMode GetPrefMapMode() const
virtual ~GraphCtrlView() override
Definition: graphctl.cxx:810
constexpr sal_uInt16 KEY_ESCAPE
virtual bool MouseButtonDown(const MouseEvent &)
constexpr sal_uInt16 KEY_F11
SdrObjKind eObjKind
Definition: graphctl.hxx:61
std::unique_ptr< SdrView > pView
Definition: graphctl.hxx:75
virtual void SetDrawingArea(weld::DrawingArea *pDrawingArea)
SdrObject * GetSelectedSdrObject() const
Definition: graphctl.cxx:683
void SetInvokeHandler(const Link< Timer *, void > &rLink)
const Color & GetWindowColor() const
const Point & GetPosPixel() const
long Left() const
constexpr sal_uInt16 KEY_BACKSPACE
Idle aUpdateIdle
Definition: graphctl.hxx:53
Point aMousePos
Definition: graphctl.hxx:59
virtual void SdrObjCreated(const SdrObject &rObj)
Definition: graphctl.cxx:268
virtual void SetBorder(sal_Int32 nLft, sal_Int32 nUpp, sal_Int32 nRgt, sal_Int32 Lwr)
Definition: svdpage.cxx:1398
bool mbSdrMode
Definition: graphctl.hxx:64
reference_type * get() const
MapUnit
void SetPriority(TaskPriority ePriority)
void SetSdrMode(bool b)
Definition: graphctl.cxx:87
virtual ~GraphCtrl() override
Definition: graphctl.cxx:73
constexpr sal_uInt16 KEY_DELETE
constexpr sal_uInt16 KEY_LEFT
A SdrPage contains exactly one SdrObjList and a description of the physical page dimensions (size / m...
Definition: svdpage.hxx:365
Link< GraphCtrl *, void > aGraphSizeLink
Definition: graphctl.hxx:55
void SetEditMode(const bool bEditMode)
Definition: graphctl.cxx:698
virtual void InvalidateOneWin(OutputDevice &rWin)
If the View should not call Invalidate() on the windows, override the following 2 methods and do some...
Definition: svdpntv.cxx:849
GraphCtrl & rGraphCtrl
Definition: graphctl.hxx:133
GraphCtrl & rWin
Definition: graphctl.hxx:33
void SetPointer(PointerStyle ePointerStyle)
virtual bool MouseButtonUp(const MouseEvent &rMEvt) override
Definition: graphctl.cxx:661
void setWidth(long nWidth)
SdrObjUserCall * GetUserCall() const
Definition: svdobj.hxx:886
virtual void invalidateRange(const basegfx::B2DRange &rRange)
Size aGraphSize
Definition: graphctl.hxx:58
SdrPaintWindow * GetPaintWindow(sal_uInt32 nIndex) const
Definition: svdpntv.cxx:71
SAL_DLLPRIVATE void DrawOutDev(const Point &, const Size &, const Point &, const Size &, const Printer &)=delete
friend class GraphCtrlUserCall
Definition: graphctl.hxx:49
constexpr sal_uInt16 KEY_TAB
SdrHdlKind GetKind() const
Definition: svdhdl.hxx:194
bool IsMod1() const
void EnableRTL(bool bEnable)
void setHeight(long nHeight)