LCOV - code coverage report
Current view: top level - sd/source/ui/func - fuconbez.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 1 185 0.5 %
Date: 2015-06-13 12:38:46 Functions: 2 19 10.5 %
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 <com/sun/star/presentation/EffectNodeType.hpp>
      21             : 
      22             : #include "fuconbez.hxx"
      23             : #include <svl/aeitem.hxx>
      24             : #include <svx/svdopath.hxx>
      25             : #include <svl/intitem.hxx>
      26             : #include <sfx2/dispatch.hxx>
      27             : #include <svx/svdobj.hxx>
      28             : #include <sfx2/bindings.hxx>
      29             : #include <sfx2/request.hxx>
      30             : #include <sfx2/viewfrm.hxx>
      31             : 
      32             : #include <svx/svxids.hrc>
      33             : #include <svx/svdpagv.hxx>
      34             : 
      35             : #include "app.hrc"
      36             : #include "ViewShell.hxx"
      37             : #include "ViewShellBase.hxx"
      38             : #include "View.hxx"
      39             : #include "Window.hxx"
      40             : #include "ToolBarManager.hxx"
      41             : #include "drawdoc.hxx"
      42             : #include "res_bmp.hrc"
      43             : #include <basegfx/polygon/b2dpolygon.hxx>
      44             : #include <basegfx/polygon/b2dpolygontools.hxx>
      45             : 
      46             : #include "CustomAnimationEffect.hxx"
      47             : 
      48             : using namespace ::com::sun::star::uno;
      49             : 
      50             : namespace sd {
      51             : 
      52           0 : TYPEINIT1( FuConstructBezierPolygon, FuConstruct );
      53             : 
      54           0 : FuConstructBezierPolygon::FuConstructBezierPolygon (
      55             :     ViewShell* pViewSh,
      56             :     ::sd::Window* pWin,
      57             :     ::sd::View* pView,
      58             :     SdDrawDocument* pDoc,
      59             :     SfxRequest& rReq)
      60             :     : FuConstruct(pViewSh, pWin, pView, pDoc, rReq),
      61           0 :       nEditMode(SID_BEZIER_MOVE)
      62             : {
      63           0 : }
      64             : 
      65           0 : rtl::Reference<FuPoor> FuConstructBezierPolygon::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent )
      66             : {
      67             :     FuConstructBezierPolygon* pFunc;
      68           0 :     rtl::Reference<FuPoor> xFunc( pFunc = new FuConstructBezierPolygon( pViewSh, pWin, pView, pDoc, rReq ) );
      69           0 :     xFunc->DoExecute(rReq);
      70           0 :     pFunc->SetPermanent(bPermanent);
      71           0 :     return xFunc;
      72             : }
      73             : 
      74           0 : void FuConstructBezierPolygon::DoExecute( SfxRequest& rReq )
      75             : {
      76           0 :     FuConstruct::DoExecute( rReq );
      77             : 
      78           0 :     const SfxItemSet* pArgs = rReq.GetArgs();
      79           0 :     if( pArgs )
      80             :     {
      81           0 :         const SfxPoolItem*  pPoolItem = NULL;
      82           0 :         if( SfxItemState::SET == pArgs->GetItemState( SID_ADD_MOTION_PATH, true, &pPoolItem ) )
      83           0 :             maTargets = static_cast<const SfxUnoAnyItem*>( pPoolItem )->GetValue();
      84             :     }
      85           0 : }
      86             : 
      87           0 : bool FuConstructBezierPolygon::MouseButtonDown(const MouseEvent& rMEvt)
      88             : {
      89           0 :     bool bReturn = FuConstruct::MouseButtonDown(rMEvt);
      90             : 
      91           0 :     SdrViewEvent aVEvt;
      92           0 :     SdrHitKind eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
      93             : 
      94           0 :     if (eHit == SDRHIT_HANDLE || rMEvt.IsMod1())
      95             :     {
      96           0 :         mpView->SetEditMode(SDREDITMODE_EDIT);
      97             :     }
      98             :     else
      99             :     {
     100           0 :         mpView->SetEditMode(SDREDITMODE_CREATE);
     101             :     }
     102             : 
     103           0 :     if (aVEvt.eEvent == SDREVENT_BEGTEXTEDIT)
     104             :     {
     105             :         // here, we do not allow text input
     106           0 :         aVEvt.eEvent = SDREVENT_BEGDRAGOBJ;
     107           0 :         mpView->EnableExtendedMouseEventDispatcher(false);
     108             :     }
     109             :     else
     110             :     {
     111           0 :         mpView->EnableExtendedMouseEventDispatcher(true);
     112             :     }
     113             : 
     114           0 :     if (eHit == SDRHIT_MARKEDOBJECT && nEditMode == SID_BEZIER_INSERT)
     115             :     {
     116             :         // insert glue point
     117           0 :         mpView->BegInsObjPoint(aMDPos, rMEvt.IsMod1());
     118             :     }
     119             :     else
     120             :     {
     121           0 :         mpView->MouseButtonDown(rMEvt, mpWindow);
     122             : 
     123           0 :         SdrObject* pObj = mpView->GetCreateObj();
     124             : 
     125           0 :         if (pObj)
     126             :         {
     127           0 :             SfxItemSet aAttr(mpDoc->GetPool());
     128           0 :             SetStyleSheet(aAttr, pObj);
     129           0 :             pObj->SetMergedItemSet(aAttr);
     130             :         }
     131             :     }
     132             : 
     133           0 :     return bReturn;
     134             : }
     135             : 
     136           0 : bool FuConstructBezierPolygon::MouseMove(const MouseEvent& rMEvt)
     137             : {
     138           0 :     return FuConstruct::MouseMove(rMEvt);
     139             : }
     140             : 
     141           0 : bool FuConstructBezierPolygon::MouseButtonUp(const MouseEvent& rMEvt )
     142             : {
     143           0 :     bool bReturn = false;
     144           0 :     bool bCreated = false;
     145             : 
     146           0 :     SdrViewEvent aVEvt;
     147           0 :     mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONUP, aVEvt);
     148             : 
     149           0 :     const size_t nCount = mpView->GetSdrPageView()->GetObjList()->GetObjCount();
     150             : 
     151           0 :     if (mpView->IsInsObjPoint())
     152             :     {
     153           0 :         mpView->EndInsObjPoint(SDRCREATE_FORCEEND);
     154             :     }
     155             :     else
     156             :     {
     157           0 :         mpView->MouseButtonUp(rMEvt, mpWindow);
     158             :     }
     159             : 
     160           0 :     if (aVEvt.eEvent == SDREVENT_ENDCREATE)
     161             :     {
     162           0 :         bReturn = true;
     163             : 
     164           0 :         if (nCount+1 == mpView->GetSdrPageView()->GetObjList()->GetObjCount())
     165             :         {
     166           0 :             bCreated = true;
     167             :         }
     168             : 
     169             :         // trick to suppress FuDraw::DoubleClick
     170           0 :         bMBDown = false;
     171             : 
     172             :     }
     173             : 
     174           0 :     bReturn = FuConstruct::MouseButtonUp(rMEvt) || bReturn;
     175             : 
     176           0 :     bool bDeleted = false;
     177           0 :     if( bCreated && maTargets.hasValue() )
     178             :     {
     179           0 :         SdrPathObj* pPathObj = dynamic_cast< SdrPathObj* >( mpView->GetSdrPageView()->GetObjList()->GetObj( nCount ) );
     180           0 :         SdPage* pPage = dynamic_cast< SdPage* >( pPathObj ? pPathObj->GetPage() : 0 );
     181           0 :         if( pPage )
     182             :         {
     183           0 :             boost::shared_ptr< sd::MainSequence > pMainSequence( pPage->getMainSequence() );
     184           0 :             if( pMainSequence.get() )
     185             :             {
     186           0 :                 Sequence< Any > aTargets;
     187           0 :                 maTargets >>= aTargets;
     188             : 
     189           0 :                 sal_Int32 nTCount = aTargets.getLength();
     190           0 :                 if( nTCount > 1 )
     191             :                 {
     192           0 :                     const Any* pTarget = aTargets.getConstArray();
     193           0 :                     double fDuration = 0.0;
     194           0 :                     *pTarget++ >>= fDuration;
     195           0 :                     bool bFirst = true;
     196           0 :                     while( --nTCount )
     197             :                     {
     198           0 :                         CustomAnimationEffectPtr pCreated( pMainSequence->append( *pPathObj, *pTarget++, fDuration ) );
     199           0 :                         if( bFirst )
     200           0 :                             bFirst = false;
     201             :                         else
     202           0 :                             pCreated->setNodeType( ::com::sun::star::presentation::EffectNodeType::WITH_PREVIOUS );
     203           0 :                     }
     204           0 :                 }
     205           0 :             }
     206             :         }
     207           0 :         mpView->DeleteMarked();
     208           0 :         bDeleted = true;
     209             :     }
     210             : 
     211           0 :     if ((!bPermanent && bCreated) || bDeleted)
     212             :     {
     213           0 :         mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
     214             :     }
     215             : 
     216           0 :     return bReturn;
     217             : }
     218             : 
     219             : /**
     220             :  * Process keyboard input
     221             :  * @returns sal_True if a KeyEvent is being processed, sal_False otherwise
     222             :  */
     223           0 : bool FuConstructBezierPolygon::KeyInput(const KeyEvent& rKEvt)
     224             : {
     225           0 :     return FuConstruct::KeyInput(rKEvt);
     226             : }
     227             : 
     228           0 : void FuConstructBezierPolygon::Activate()
     229             : {
     230           0 :     mpView->EnableExtendedMouseEventDispatcher(true);
     231             : 
     232             :     SdrObjKind eKind;
     233             : 
     234           0 :     switch (nSlotId)
     235             :     {
     236             :         case SID_DRAW_POLYGON_NOFILL:
     237             :         case SID_DRAW_XPOLYGON_NOFILL:
     238             :         {
     239           0 :             eKind = OBJ_PLIN;
     240             :         }
     241           0 :         break;
     242             : 
     243             :         case SID_DRAW_POLYGON:
     244             :         case SID_DRAW_XPOLYGON:
     245             :         {
     246           0 :             eKind = OBJ_POLY;
     247             :         }
     248           0 :         break;
     249             : 
     250             :         case SID_DRAW_BEZIER_NOFILL:
     251             :         {
     252           0 :             eKind = OBJ_PATHLINE;
     253             :         }
     254           0 :         break;
     255             : 
     256             :         case SID_DRAW_BEZIER_FILL:
     257             :         {
     258           0 :             eKind = OBJ_PATHFILL;
     259             :         }
     260           0 :         break;
     261             : 
     262             :         case SID_DRAW_FREELINE_NOFILL:
     263             :         {
     264           0 :             eKind = OBJ_FREELINE;
     265             :         }
     266           0 :         break;
     267             : 
     268             :         case SID_DRAW_FREELINE:
     269             :         {
     270           0 :             eKind = OBJ_FREEFILL;
     271             :         }
     272           0 :         break;
     273             : 
     274             :         default:
     275             :         {
     276           0 :             eKind = OBJ_PATHLINE;
     277             :         }
     278           0 :         break;
     279             :     }
     280             : 
     281           0 :     mpView->SetCurrentObj((sal_uInt16)eKind);
     282             : 
     283           0 :     FuConstruct::Activate();
     284           0 : }
     285             : 
     286           0 : void FuConstructBezierPolygon::Deactivate()
     287             : {
     288           0 :     mpView->EnableExtendedMouseEventDispatcher(false);
     289             : 
     290           0 :     FuConstruct::Deactivate();
     291           0 : }
     292             : 
     293           0 : void FuConstructBezierPolygon::SelectionHasChanged()
     294             : {
     295           0 :     FuDraw::SelectionHasChanged();
     296             : 
     297           0 :     mpViewShell->GetViewShellBase().GetToolBarManager()->SelectionHasChanged(
     298             :         *mpViewShell,
     299           0 :         *mpView);
     300           0 : }
     301             : 
     302             : /**
     303             :  * Set current bezier edit mode
     304             :  */
     305           0 : void FuConstructBezierPolygon::SetEditMode(sal_uInt16 nMode)
     306             : {
     307           0 :     nEditMode = nMode;
     308           0 :     ForcePointer();
     309             : 
     310           0 :     SfxBindings& rBindings = mpViewShell->GetViewFrame()->GetBindings();
     311           0 :     rBindings.Invalidate(SID_BEZIER_MOVE);
     312           0 :     rBindings.Invalidate(SID_BEZIER_INSERT);
     313           0 : }
     314             : 
     315           0 : SdrObject* FuConstructBezierPolygon::CreateDefaultObject(const sal_uInt16 nID, const Rectangle& rRectangle)
     316             : {
     317             :     // case SID_DRAW_POLYGON:
     318             :     // case SID_DRAW_POLYGON_NOFILL:
     319             :     // case SID_DRAW_XPOLYGON:
     320             :     // case SID_DRAW_XPOLYGON_NOFILL:
     321             :     // case SID_DRAW_FREELINE:
     322             :     // case SID_DRAW_FREELINE_NOFILL:
     323             :     // case SID_DRAW_BEZIER_FILL:          // BASIC
     324             :     // case SID_DRAW_BEZIER_NOFILL:        // BASIC
     325             : 
     326             :     SdrObject* pObj = SdrObjFactory::MakeNewObject(
     327           0 :         mpView->GetCurrentObjInventor(), mpView->GetCurrentObjIdentifier(),
     328           0 :         0L, mpDoc);
     329             : 
     330           0 :     if(pObj)
     331             :     {
     332           0 :         if(pObj->ISA(SdrPathObj))
     333             :         {
     334           0 :             basegfx::B2DPolyPolygon aPoly;
     335             : 
     336           0 :             switch(nID)
     337             :             {
     338             :                 case SID_DRAW_BEZIER_FILL:
     339             :                 {
     340           0 :                     const sal_Int32 nWdt(rRectangle.GetWidth() / 2);
     341           0 :                     const sal_Int32 nHgt(rRectangle.GetHeight() / 2);
     342           0 :                     const basegfx::B2DPolygon aInnerPoly(basegfx::tools::createPolygonFromEllipse(basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Center().Y()), nWdt, nHgt));
     343             : 
     344           0 :                     aPoly.append(aInnerPoly);
     345           0 :                     break;
     346             :                 }
     347             :                 case SID_DRAW_BEZIER_NOFILL:
     348             :                 {
     349           0 :                     basegfx::B2DPolygon aInnerPoly;
     350             : 
     351           0 :                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Bottom()));
     352             : 
     353           0 :                     const basegfx::B2DPoint aCenterBottom(rRectangle.Center().X(), rRectangle.Bottom());
     354             :                     aInnerPoly.appendBezierSegment(
     355             :                         aCenterBottom,
     356             :                         aCenterBottom,
     357           0 :                         basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Center().Y()));
     358             : 
     359           0 :                     const basegfx::B2DPoint aCenterTop(rRectangle.Center().X(), rRectangle.Top());
     360             :                     aInnerPoly.appendBezierSegment(
     361             :                         aCenterTop,
     362             :                         aCenterTop,
     363           0 :                         basegfx::B2DPoint(rRectangle.Right(), rRectangle.Top()));
     364             : 
     365           0 :                     aPoly.append(aInnerPoly);
     366           0 :                     break;
     367             :                 }
     368             :                 case SID_DRAW_FREELINE:
     369             :                 case SID_DRAW_FREELINE_NOFILL:
     370             :                 {
     371           0 :                     basegfx::B2DPolygon aInnerPoly;
     372             : 
     373           0 :                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Bottom()));
     374             : 
     375             :                     aInnerPoly.appendBezierSegment(
     376           0 :                         basegfx::B2DPoint(rRectangle.Left(), rRectangle.Top()),
     377           0 :                         basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Top()),
     378           0 :                         basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Center().Y()));
     379             : 
     380             :                     aInnerPoly.appendBezierSegment(
     381           0 :                         basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Bottom()),
     382           0 :                         basegfx::B2DPoint(rRectangle.Right(), rRectangle.Bottom()),
     383           0 :                         basegfx::B2DPoint(rRectangle.Right(), rRectangle.Top()));
     384             : 
     385           0 :                     if(SID_DRAW_FREELINE == nID)
     386             :                     {
     387           0 :                         aInnerPoly.append(basegfx::B2DPoint(rRectangle.Right(), rRectangle.Bottom()));
     388             :                     }
     389             :                     else
     390             :                     {
     391           0 :                         aInnerPoly.setClosed(true);
     392             :                     }
     393             : 
     394           0 :                     aPoly.append(aInnerPoly);
     395           0 :                     break;
     396             :                 }
     397             :                 case SID_DRAW_XPOLYGON:
     398             :                 case SID_DRAW_XPOLYGON_NOFILL:
     399             :                 {
     400           0 :                     basegfx::B2DPolygon aInnerPoly;
     401             : 
     402           0 :                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Bottom()));
     403           0 :                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Top()));
     404           0 :                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Top()));
     405           0 :                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Center().Y()));
     406           0 :                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Right(), rRectangle.Center().Y()));
     407           0 :                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Right(), rRectangle.Bottom()));
     408             : 
     409           0 :                     if(SID_DRAW_XPOLYGON_NOFILL == nID)
     410             :                     {
     411           0 :                         aInnerPoly.append(basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Bottom()));
     412             :                     }
     413             :                     else
     414             :                     {
     415           0 :                         aInnerPoly.setClosed(true);
     416             :                     }
     417             : 
     418           0 :                     aPoly.append(aInnerPoly);
     419           0 :                     break;
     420             :                 }
     421             :                 case SID_DRAW_POLYGON:
     422             :                 case SID_DRAW_POLYGON_NOFILL:
     423             :                 {
     424           0 :                     basegfx::B2DPolygon aInnerPoly;
     425           0 :                     const sal_Int32 nWdt(rRectangle.GetWidth());
     426           0 :                     const sal_Int32 nHgt(rRectangle.GetHeight());
     427             : 
     428           0 :                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Bottom()));
     429           0 :                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left() + (nWdt * 30) / 100, rRectangle.Top() + (nHgt * 70) / 100));
     430           0 :                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Top() + (nHgt * 15) / 100));
     431           0 :                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left() + (nWdt * 65) / 100, rRectangle.Top()));
     432           0 :                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left() + nWdt, rRectangle.Top() + (nHgt * 30) / 100));
     433           0 :                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left() + (nWdt * 80) / 100, rRectangle.Top() + (nHgt * 50) / 100));
     434           0 :                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left() + (nWdt * 80) / 100, rRectangle.Top() + (nHgt * 75) / 100));
     435           0 :                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Bottom(), rRectangle.Right()));
     436             : 
     437           0 :                     if(SID_DRAW_POLYGON_NOFILL == nID)
     438             :                     {
     439           0 :                         aInnerPoly.append(basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Bottom()));
     440             :                     }
     441             :                     else
     442             :                     {
     443           0 :                         aInnerPoly.setClosed(true);
     444             :                     }
     445             : 
     446           0 :                     aPoly.append(aInnerPoly);
     447           0 :                     break;
     448             :                 }
     449             :             }
     450             : 
     451           0 :             static_cast<SdrPathObj*>(pObj)->SetPathPoly(aPoly);
     452             :         }
     453             :         else
     454             :         {
     455             :             OSL_FAIL("Object is NO path object");
     456             :         }
     457             : 
     458           0 :         pObj->SetLogicRect(rRectangle);
     459             :     }
     460             : 
     461           0 :     return pObj;
     462             : }
     463             : 
     464          66 : } // end of namespace sd
     465             : 
     466             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11