LCOV - code coverage report
Current view: top level - svx/source/dialog - graphctl.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 1 367 0.3 %
Date: 2014-11-03 Functions: 2 26 7.7 %
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 <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: */

Generated by: LCOV version 1.10