LCOV - code coverage report
Current view: top level - svx/source/dialog - graphctl.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 1 372 0.3 %
Date: 2015-06-13 12:38:46 Functions: 2 27 7.4 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.11