LCOV - code coverage report
Current view: top level - libreoffice/svx/source/dialog - imapwnd.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 1 428 0.2 %
Date: 2012-12-27 Functions: 2 32 6.2 %
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 <tools/urlobj.hxx>
      21             : #include <vcl/msgbox.hxx>
      22             : #include <vcl/help.hxx>
      23             : #include <sfx2/sfxsids.hrc>     // SID_ATTR_MACROITEM
      24             : #include <svtools/imaprect.hxx>
      25             : #include <svtools/imapcirc.hxx>
      26             : #include <svtools/imappoly.hxx>
      27             : #include <svl/urlbmk.hxx>
      28             : 
      29             : #include <svx/xoutbmp.hxx>
      30             : #include <svx/dialmgr.hxx>
      31             : #include <svx/dialogs.hrc>
      32             : #include <svx/svxids.hrc>
      33             : #include <imapdlg.hrc>
      34             : #include <imapwnd.hxx>
      35             : #include <svx/svdpage.hxx>
      36             : #include <svx/svdorect.hxx>
      37             : #include <svx/svdocirc.hxx>
      38             : #include <svx/svdopath.hxx>
      39             : #include <svx/xfltrit.hxx>
      40             : #include <svx/svdpagv.hxx>
      41             : #include <svl/urihelper.hxx>
      42             : #include <svx/xfillit.hxx>
      43             : #include <svx/xlineit.hxx>
      44             : #include <sfx2/evntconf.hxx>
      45             : 
      46             : #include <sot/formats.hxx>
      47             : 
      48             : #include <svx/svxdlg.hxx>
      49             : #include <basegfx/point/b2dpoint.hxx>
      50             : #include <basegfx/polygon/b2dpolygon.hxx>
      51             : 
      52             : using ::com::sun::star::frame::XFrame;
      53             : using ::com::sun::star::uno::Reference;
      54             : 
      55             : #define TRANSCOL Color( COL_WHITE )
      56             : 
      57           0 : IMapWindow::IMapWindow( Window* pParent, const ResId& rResId, const Reference< XFrame >& rxDocumentFrame ) :
      58             :             GraphCtrl( pParent, rResId ),
      59             :             DropTargetHelper( this ),
      60           0 :             mxDocumentFrame( rxDocumentFrame )
      61             : {
      62           0 :     SetWinStyle( WB_SDRMODE );
      63             : 
      64           0 :     pItemInfo = new SfxItemInfo[ 1 ];
      65           0 :     memset( pItemInfo, 0, sizeof( SfxItemInfo ) );
      66             :     pIMapPool = new SfxItemPool( rtl::OUString("IMapItemPool"),
      67           0 :                                  SID_ATTR_MACROITEM, SID_ATTR_MACROITEM, pItemInfo );
      68           0 :     pIMapPool->FreezeIdRanges();
      69           0 : }
      70             : 
      71           0 : IMapWindow::~IMapWindow()
      72             : {
      73             :     // Delete Liste
      74           0 :     for ( size_t i = 0, n = aTargetList.size(); i < n; ++i )
      75           0 :         delete aTargetList[ i ];
      76             : 
      77           0 :     SfxItemPool::Free(pIMapPool);
      78           0 :     delete[] pItemInfo;
      79           0 : }
      80             : 
      81           0 : void IMapWindow::SetImageMap( const ImageMap& rImageMap )
      82             : {
      83           0 :     ReplaceImageMap( rImageMap, sal_False );
      84           0 : }
      85             : 
      86           0 : void IMapWindow::ReplaceImageMap( const ImageMap& rImageMap, sal_Bool /*bScaleToGraphic*/ )
      87             : {
      88           0 :     SdrPage* pPage = 0;
      89           0 :     aIMap = rImageMap;
      90             : 
      91           0 :     if(GetSdrModel())
      92             :     {
      93             :         // try to access page
      94           0 :         pPage = GetSdrModel()->GetPage(0L);
      95             :     }
      96             : 
      97           0 :     if(pPage)
      98             :     {
      99             :         // clear all draw objects
     100           0 :         pPage->Clear();
     101             :     }
     102             : 
     103           0 :     if(GetSdrView())
     104             :     {
     105             :         // #i63762# reset selection at view
     106           0 :         GetSdrView()->UnmarkAllObj();
     107             :     }
     108             : 
     109             :     // create new drawing objects
     110           0 :     const sal_uInt16 nCount(rImageMap.GetIMapObjectCount());
     111             : 
     112           0 :     for ( sal_uInt16 i(nCount); i > 0; i-- )
     113             :     {
     114           0 :         SdrObject* pNewObj = CreateObj( rImageMap.GetIMapObject( i - 1 ) );
     115             : 
     116           0 :         if ( pNewObj )
     117             :         {
     118           0 :             pPage->InsertObject( pNewObj );
     119             :         }
     120             :     }
     121           0 : }
     122             : 
     123           0 : sal_Bool IMapWindow::ReplaceActualIMapInfo( const NotifyInfo& rNewInfo )
     124             : {
     125           0 :     const SdrObject*    pSdrObj = GetSelectedSdrObject();
     126             :     IMapObject*         pIMapObj;
     127           0 :     sal_Bool                bRet = sal_False;
     128             : 
     129           0 :     if ( pSdrObj && ( ( pIMapObj = GetIMapObj( pSdrObj ) ) != NULL ) )
     130             :     {
     131           0 :         pIMapObj->SetURL( rNewInfo.aMarkURL );
     132           0 :         pIMapObj->SetAltText( rNewInfo.aMarkAltText );
     133           0 :         pIMapObj->SetTarget( rNewInfo.aMarkTarget );
     134           0 :         pModel->SetChanged( sal_True );
     135           0 :         UpdateInfo( sal_False );
     136             : 
     137           0 :         bRet = sal_True;
     138             :     }
     139             : 
     140           0 :     return bRet;
     141             : }
     142             : 
     143           0 : const ImageMap& IMapWindow::GetImageMap()
     144             : {
     145           0 :     if ( pModel->IsChanged() )
     146             :     {
     147           0 :         SdrPage* pPage = (SdrPage*) pModel->GetPage( 0 );
     148             : 
     149           0 :         if ( pPage )
     150             :         {
     151           0 :             const long nCount = pPage->GetObjCount();
     152             : 
     153           0 :             aIMap.ClearImageMap();
     154             : 
     155           0 :             for ( long i = nCount - 1; i > -1; i-- )
     156           0 :                 aIMap.InsertIMapObject( *( ( (IMapUserData*) pPage->GetObj( i )->GetUserData( 0 ) )->GetObject() ) );
     157             :         }
     158             : 
     159           0 :         pModel->SetChanged( sal_False );
     160             :     }
     161             : 
     162           0 :     return aIMap;
     163             : }
     164             : 
     165           0 : void IMapWindow::SetTargetList( TargetList& rTargetList )
     166             : {
     167             :     // Delete old List
     168           0 :     for( size_t i = 0, n = aTargetList.size(); i < n; ++i )
     169           0 :         delete aTargetList[ i ];
     170           0 :     aTargetList.clear();
     171             : 
     172             :     // Fill with the provided list
     173           0 :     for( size_t i = 0, n = rTargetList.size(); i < n; ++i )
     174           0 :         aTargetList.push_back( new String( *rTargetList[ i ] ) );
     175             : 
     176           0 :     pModel->SetChanged( sal_False );
     177           0 : }
     178             : 
     179           0 : SdrObject* IMapWindow::CreateObj( const IMapObject* pIMapObj )
     180             : {
     181           0 :     Point       aPoint;
     182           0 :     Rectangle   aClipRect( aPoint, GetGraphicSize() );
     183           0 :     SdrObject*  pSdrObj = NULL;
     184           0 :     IMapObjectPtr pCloneIMapObj;
     185             : 
     186           0 :     switch( pIMapObj->GetType() )
     187             :     {
     188             :         case( IMAP_OBJ_RECTANGLE ):
     189             :         {
     190           0 :             IMapRectangleObject*    pIMapRectObj = (IMapRectangleObject*) pIMapObj;
     191           0 :             Rectangle               aDrawRect( pIMapRectObj->GetRectangle( sal_False ) );
     192             : 
     193             :             // clipped on CanvasPane
     194           0 :             aDrawRect.Intersection( aClipRect );
     195             : 
     196           0 :             pSdrObj = (SdrObject*) new SdrRectObj( aDrawRect );
     197           0 :             pCloneIMapObj.reset((IMapObject*) new IMapRectangleObject( *pIMapRectObj ));
     198             :         }
     199           0 :         break;
     200             : 
     201             :         case( IMAP_OBJ_CIRCLE ):
     202             :         {
     203           0 :             IMapCircleObject*   pIMapCircleObj = (IMapCircleObject*) pIMapObj;
     204           0 :             const Point         aCenter( pIMapCircleObj->GetCenter( sal_False ) );
     205           0 :             const long          nRadius = pIMapCircleObj->GetRadius( sal_False );
     206           0 :             const Point         aOffset( nRadius, nRadius );
     207           0 :             Rectangle           aCircle( aCenter - aOffset, aCenter + aOffset );
     208             : 
     209             :             // limited to CanvasPane
     210           0 :             aCircle.Intersection( aClipRect );
     211             : 
     212           0 :             pSdrObj = (SdrObject*) new SdrCircObj( OBJ_CIRC, aCircle, 0, 36000 );
     213           0 :             pCloneIMapObj.reset((IMapObject*) new IMapCircleObject( *pIMapCircleObj ));
     214             :         }
     215           0 :         break;
     216             : 
     217             :         case( IMAP_OBJ_POLYGON ):
     218             :         {
     219           0 :             IMapPolygonObject*  pIMapPolyObj = (IMapPolygonObject*) pIMapObj;
     220             : 
     221             :             // If it actually is an ellipse, then another ellipse is created again
     222           0 :             if ( pIMapPolyObj->HasExtraEllipse() )
     223             :             {
     224           0 :                 Rectangle aDrawRect( pIMapPolyObj->GetExtraEllipse() );
     225             : 
     226             :                 // clipped on CanvasPane
     227           0 :                 aDrawRect.Intersection( aClipRect );
     228             : 
     229           0 :                 pSdrObj = (SdrObject*) new SdrCircObj( OBJ_CIRC, aDrawRect, 0, 36000 );
     230             :             }
     231             :             else
     232             :             {
     233           0 :                 const Polygon&  rPoly = pIMapPolyObj->GetPolygon( sal_False );
     234           0 :                 Polygon         aDrawPoly( rPoly );
     235             : 
     236             :                 // clipped on CanvasPane
     237           0 :                 aDrawPoly.Clip( aClipRect );
     238             : 
     239           0 :                 basegfx::B2DPolygon aPolygon;
     240           0 :                 aPolygon.append(aDrawPoly.getB2DPolygon());
     241           0 :                 pSdrObj = (SdrObject*)new SdrPathObj(OBJ_POLY, basegfx::B2DPolyPolygon(aPolygon));
     242             :             }
     243             : 
     244           0 :             pCloneIMapObj.reset((IMapObject*) new IMapPolygonObject( *pIMapPolyObj ));
     245             :         }
     246           0 :         break;
     247             : 
     248             :         default:
     249           0 :         break;
     250             :     }
     251             : 
     252           0 :     if ( pSdrObj )
     253             :     {
     254           0 :         SfxItemSet aSet( pModel->GetItemPool() );
     255             : 
     256           0 :         aSet.Put( XFillStyleItem( XFILL_SOLID ) );
     257           0 :         aSet.Put( XFillColorItem( String(), TRANSCOL ) );
     258             : 
     259           0 :         if ( !pIMapObj->IsActive() )
     260             :         {
     261           0 :             aSet.Put( XFillTransparenceItem( 100 ) );
     262           0 :             aSet.Put( XLineColorItem( String(), Color( COL_RED ) ) );
     263             :         }
     264             :         else
     265             :         {
     266           0 :             aSet.Put( XFillTransparenceItem( 50 ) );
     267           0 :             aSet.Put( XLineColorItem( String(), Color( COL_BLACK ) ) );
     268             :         }
     269             : 
     270           0 :         pSdrObj->SetMergedItemSetAndBroadcast(aSet);
     271             : 
     272           0 :         pSdrObj->AppendUserData( new IMapUserData( pCloneIMapObj ) );
     273           0 :         pSdrObj->SetUserCall( GetSdrUserCall() );
     274             :     }
     275             : 
     276           0 :     return pSdrObj;
     277             : }
     278             : 
     279           0 : void IMapWindow::InitSdrModel()
     280             : {
     281           0 :     GraphCtrl::InitSdrModel();
     282             : 
     283           0 :     SfxItemSet aSet( pModel->GetItemPool() );
     284             : 
     285           0 :     aSet.Put( XFillColorItem( String(), TRANSCOL ) );
     286           0 :     aSet.Put( XFillTransparenceItem( 50 ) );
     287           0 :     pView->SetAttributes( aSet );
     288           0 :     pView->SetFrameDragSingles( sal_True );
     289           0 : }
     290             : 
     291           0 : void IMapWindow::SdrObjCreated( const SdrObject& rObj )
     292             : {
     293           0 :     switch( rObj.GetObjIdentifier() )
     294             :     {
     295             :         case( OBJ_RECT ):
     296             :         {
     297           0 :             SdrRectObj*          pRectObj = (SdrRectObj*) &rObj;
     298           0 :             IMapRectangleObject* pObj = new IMapRectangleObject( pRectObj->GetLogicRect(),
     299           0 :                 String(), String(), String(), String(), String(), sal_True, sal_False );
     300             : 
     301           0 :             pRectObj->AppendUserData( new IMapUserData( IMapObjectPtr(pObj) ) );
     302             :         }
     303           0 :         break;
     304             : 
     305             :         case( OBJ_CIRC ):
     306             :         {
     307           0 :             SdrCircObj* pCircObj = (SdrCircObj*) &rObj;
     308           0 :             SdrPathObj* pPathObj = (SdrPathObj*) pCircObj->ConvertToPolyObj( sal_False, sal_False );
     309           0 :             Polygon aPoly(pPathObj->GetPathPoly().getB2DPolygon(0L));
     310           0 :             delete pPathObj;
     311             : 
     312           0 :             IMapPolygonObject* pObj = new IMapPolygonObject( Polygon(aPoly), String(), String(), String(), String(), String(),  sal_True, sal_False );
     313           0 :             pObj->SetExtraEllipse( aPoly.GetBoundRect() );
     314           0 :             pCircObj->AppendUserData( new IMapUserData( IMapObjectPtr(pObj) ) );
     315             :         }
     316           0 :         break;
     317             : 
     318             :         case( OBJ_POLY ):
     319             :         case( OBJ_FREEFILL ):
     320             :         case( OBJ_PATHPOLY ):
     321             :         case( OBJ_PATHFILL ):
     322             :         {
     323           0 :             SdrPathObj* pPathObj = (SdrPathObj*) &rObj;
     324           0 :             const basegfx::B2DPolyPolygon& rXPolyPoly = pPathObj->GetPathPoly();
     325             : 
     326           0 :             if ( rXPolyPoly.count() )
     327             :             {
     328           0 :                 Polygon aPoly(rXPolyPoly.getB2DPolygon(0L));
     329           0 :                 IMapPolygonObject* pObj = new IMapPolygonObject( aPoly, String(), String(), String(), String(), String(),  sal_True, sal_False );
     330           0 :                 pPathObj->AppendUserData( new IMapUserData( IMapObjectPtr(pObj) ) );
     331             :             }
     332             :         }
     333           0 :         break;
     334             : 
     335             :         default:
     336           0 :         break;
     337             :     }
     338           0 : }
     339             : 
     340           0 : void IMapWindow::SdrObjChanged( const SdrObject& rObj )
     341             : {
     342           0 :     IMapUserData* pUserData = (IMapUserData*) rObj.GetUserData( 0 );
     343             : 
     344           0 :     if ( pUserData )
     345             :     {
     346           0 :         String          aURL;
     347           0 :         String          aAltText;
     348           0 :         String          aDesc;
     349           0 :         String          aTarget;
     350           0 :         IMapObjectPtr   pIMapObj = pUserData->GetObject();
     351           0 :         sal_Bool            bActive = sal_True;
     352             : 
     353           0 :         if ( pIMapObj.get() )
     354             :         {
     355           0 :             aURL = pIMapObj->GetURL();
     356           0 :             aAltText = pIMapObj->GetAltText();
     357           0 :             aDesc = pIMapObj->GetDesc();
     358           0 :             aTarget = pIMapObj->GetTarget();
     359           0 :             bActive = pIMapObj->IsActive();
     360             :         }
     361             : 
     362           0 :         switch( rObj.GetObjIdentifier() )
     363             :         {
     364             :             case( OBJ_RECT ):
     365             :             {
     366           0 :                 pUserData->ReplaceObject( IMapObjectPtr(new IMapRectangleObject( ( (const SdrRectObj&) rObj ).GetLogicRect(),
     367           0 :                           aURL, aAltText, aDesc, aTarget, String(), bActive, sal_False ) ) );
     368             :             }
     369           0 :             break;
     370             : 
     371             :             case( OBJ_CIRC ):
     372             :             {
     373           0 :                 const SdrCircObj& rCircObj = (const SdrCircObj&) rObj;
     374           0 :                 SdrPathObj* pPathObj = (SdrPathObj*) rCircObj.ConvertToPolyObj( sal_False, sal_False );
     375           0 :                 Polygon aPoly(pPathObj->GetPathPoly().getB2DPolygon(0L));
     376             : 
     377           0 :                 IMapPolygonObject* pObj = new IMapPolygonObject( aPoly, aURL, aAltText, aDesc, aTarget, String(), bActive, sal_False );
     378           0 :                 pObj->SetExtraEllipse( aPoly.GetBoundRect() );
     379             : 
     380             :                 // was only created by us temporarily
     381           0 :                 delete pPathObj;
     382           0 :                 pUserData->ReplaceObject( IMapObjectPtr(pObj) );
     383             :             }
     384           0 :             break;
     385             : 
     386             :             case( OBJ_POLY ):
     387             :             case( OBJ_FREEFILL ):
     388             :             case( OBJ_PATHPOLY ):
     389             :             case( OBJ_PATHFILL ):
     390             :             {
     391           0 :                 const SdrPathObj& rPathObj = (const SdrPathObj&) rObj;
     392           0 :                 const basegfx::B2DPolyPolygon& rXPolyPoly = rPathObj.GetPathPoly();
     393             : 
     394           0 :                 if ( rXPolyPoly.count() )
     395             :                 {
     396           0 :                     Polygon aPoly(rPathObj.GetPathPoly().getB2DPolygon(0L));
     397           0 :                     IMapPolygonObject*  pObj = new IMapPolygonObject( aPoly, aURL, aAltText, aDesc, aTarget, String(), bActive, sal_False );
     398           0 :                     pUserData->ReplaceObject( IMapObjectPtr(pObj) );
     399             :                 }
     400             :             }
     401           0 :             break;
     402             : 
     403             :             default:
     404           0 :             break;
     405           0 :         }
     406             :     }
     407           0 : }
     408             : 
     409           0 : void IMapWindow::MouseButtonUp(const MouseEvent& rMEvt)
     410             : {
     411           0 :     GraphCtrl::MouseButtonUp( rMEvt );
     412           0 :     UpdateInfo( sal_True );
     413           0 : }
     414             : 
     415           0 : void IMapWindow::MarkListHasChanged()
     416             : {
     417           0 :     GraphCtrl::MarkListHasChanged();
     418           0 :     UpdateInfo( sal_False );
     419           0 : }
     420             : 
     421           0 : SdrObject* IMapWindow::GetHitSdrObj( const Point& rPosPixel ) const
     422             : {
     423           0 :     SdrObject*  pObj = NULL;
     424           0 :     Point       aPt = PixelToLogic( rPosPixel );
     425             : 
     426           0 :     if ( Rectangle( Point(), GetGraphicSize() ).IsInside( aPt ) )
     427             :     {
     428           0 :         SdrPage* pPage = (SdrPage*) pModel->GetPage( 0 );
     429             :         sal_uIntPtr  nCount;
     430             : 
     431           0 :         if ( pPage && ( ( nCount = pPage->GetObjCount() ) > 0 ) )
     432             :         {
     433           0 :             for ( long i = nCount - 1; i >= 0; i-- )
     434             :             {
     435           0 :                 SdrObject*  pTestObj = pPage->GetObj( i );
     436           0 :                 IMapObject* pIMapObj = GetIMapObj( pTestObj );
     437             : 
     438           0 :                 if ( pIMapObj && pIMapObj->IsHit( aPt ) )
     439             :                 {
     440           0 :                     pObj = pTestObj;
     441           0 :                     break;
     442             :                 }
     443             :             }
     444             :         }
     445             :     }
     446             : 
     447           0 :     return pObj;
     448             : }
     449             : 
     450           0 : IMapObject* IMapWindow::GetIMapObj( const SdrObject* pSdrObj ) const
     451             : {
     452           0 :     IMapObject* pIMapObj = NULL;
     453             : 
     454           0 :     if ( pSdrObj )
     455             :     {
     456           0 :         IMapUserData* pUserData = (IMapUserData*) pSdrObj->GetUserData( 0 );
     457             : 
     458           0 :         if ( pUserData )
     459           0 :             pIMapObj = pUserData->GetObject().get();
     460             :     }
     461             : 
     462           0 :     return pIMapObj;
     463             : }
     464             : 
     465           0 : void IMapWindow::Command(const CommandEvent& rCEvt)
     466             : {
     467           0 :     Region  aRegion;
     468             : 
     469           0 :     if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU )
     470             :     {
     471           0 :         PopupMenu           aMenu( SVX_RES( RID_SVXMN_IMAP ) );
     472           0 :         const SdrMarkList&  rMarkList = pView->GetMarkedObjectList();
     473           0 :         sal_uIntPtr             nMarked = rMarkList.GetMarkCount();
     474             : 
     475           0 :         aMenu.EnableItem( MN_URL, sal_False );
     476           0 :         aMenu.EnableItem( MN_ACTIVATE, sal_False );
     477           0 :         aMenu.EnableItem( MN_MACRO, sal_False );
     478           0 :         aMenu.EnableItem( MN_MARK_ALL, pModel->GetPage( 0 )->GetObjCount() != pView->GetMarkedObjectCount() );
     479             : 
     480           0 :         if ( !nMarked )
     481             :         {
     482           0 :             aMenu.EnableItem( MN_POSITION, sal_False );
     483           0 :             aMenu.EnableItem( MN_FRAME_TO_TOP, sal_False );
     484           0 :             aMenu.EnableItem( MN_MOREFRONT, sal_False );
     485           0 :             aMenu.EnableItem( MN_MOREBACK, sal_False );
     486           0 :             aMenu.EnableItem( MN_FRAME_TO_BOTTOM, sal_False );
     487           0 :             aMenu.EnableItem( MN_DELETE1, sal_False );
     488             :         }
     489             :         else
     490             :         {
     491           0 :             if ( nMarked == 1 )
     492             :             {
     493           0 :                 SdrObject*  pSdrObj = GetSelectedSdrObject();
     494             : 
     495           0 :                 aMenu.EnableItem( MN_URL, sal_True );
     496           0 :                 aMenu.EnableItem( MN_ACTIVATE, sal_True );
     497           0 :                 aMenu.EnableItem( MN_MACRO, sal_True );
     498           0 :                 aMenu.CheckItem( MN_ACTIVATE, GetIMapObj( pSdrObj )->IsActive() );
     499             :             }
     500             : 
     501           0 :             aMenu.EnableItem( MN_POSITION, sal_True );
     502           0 :             aMenu.EnableItem( MN_FRAME_TO_TOP, sal_True );
     503           0 :             aMenu.EnableItem( MN_MOREFRONT, sal_True );
     504           0 :             aMenu.EnableItem( MN_MOREBACK, sal_True );
     505           0 :             aMenu.EnableItem( MN_FRAME_TO_BOTTOM, sal_True );
     506           0 :             aMenu.EnableItem( MN_DELETE1, sal_True );
     507             :         }
     508             : 
     509           0 :         aMenu.SetSelectHdl( LINK( this, IMapWindow, MenuSelectHdl ) );
     510           0 :         aMenu.Execute( this, rCEvt.GetMousePosPixel() );
     511             :     }
     512             :     else
     513           0 :         Window::Command(rCEvt);
     514           0 : }
     515             : 
     516           0 : sal_Int8 IMapWindow::AcceptDrop( const AcceptDropEvent& rEvt )
     517             : {
     518           0 :     return( ( GetHitSdrObj( rEvt.maPosPixel ) != NULL ) ? rEvt.mnAction : DND_ACTION_NONE );
     519             : }
     520             : 
     521           0 : sal_Int8 IMapWindow::ExecuteDrop( const ExecuteDropEvent& rEvt )
     522             : {
     523           0 :     sal_Int8 nRet = DND_ACTION_NONE;
     524             : 
     525           0 :     if( IsDropFormatSupported( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ) )
     526             :     {
     527           0 :         const String    aString;
     528           0 :         INetBookmark    aBookMark( aString, aString );
     529           0 :         SdrObject*      pSdrObj = GetHitSdrObj( rEvt.maPosPixel );
     530             : 
     531           0 :         if( pSdrObj && TransferableDataHelper( rEvt.maDropEvent.Transferable ).GetINetBookmark( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK, aBookMark ) )
     532             :         {
     533           0 :             IMapObject* pIMapObj = GetIMapObj( pSdrObj );
     534             : 
     535           0 :             pIMapObj->SetURL( aBookMark.GetURL() );
     536           0 :             pIMapObj->SetAltText( aBookMark.GetDescription() );
     537           0 :             pModel->SetChanged( sal_True );
     538           0 :             pView->UnmarkAll();
     539           0 :             pView->MarkObj( pSdrObj, pView->GetSdrPageView() );
     540           0 :             UpdateInfo( sal_True );
     541           0 :             nRet =  rEvt.mnAction;
     542           0 :         }
     543             :     }
     544             : 
     545           0 :     return nRet;
     546             : }
     547             : 
     548           0 : void IMapWindow::RequestHelp( const HelpEvent& rHEvt )
     549             : {
     550           0 :     Point               aPos = PixelToLogic( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ) );
     551             : 
     552           0 :     if ( Help::IsBalloonHelpEnabled() || Help::IsQuickHelpEnabled() )
     553             :     {
     554           0 :         SdrObject*          pSdrObj = NULL;
     555           0 :         SdrPageView*        pPageView = NULL;
     556           0 :         if ( pView->PickObj( aPos, pView->getHitTolLog(), pSdrObj, pPageView ) )
     557             :         {
     558           0 :             const IMapObject*   pIMapObj = GetIMapObj( pSdrObj );
     559           0 :             String              aStr;
     560             : 
     561           0 :             if ( pIMapObj && ( aStr = pIMapObj->GetURL() ).Len() )
     562             :             {
     563           0 :                 String      aDescr( pIMapObj->GetAltText() );
     564           0 :                 Rectangle   aLogicPix( LogicToPixel( Rectangle( Point(), GetGraphicSize() ) ) );
     565           0 :                 Rectangle   aScreenRect( OutputToScreenPixel( aLogicPix.TopLeft() ),
     566           0 :                                          OutputToScreenPixel( aLogicPix.BottomRight() ) );
     567             : 
     568           0 :                 if ( Help::IsBalloonHelpEnabled() )
     569           0 :                     Help::ShowBalloon( this, rHEvt.GetMousePosPixel(), aScreenRect, aStr );
     570           0 :                 else if ( Help::IsQuickHelpEnabled() )
     571           0 :                     Help::ShowQuickHelp( this, aScreenRect, aStr );
     572           0 :             }
     573             :         }
     574             :         else
     575           0 :             Window::RequestHelp( rHEvt );
     576             :     }
     577           0 : }
     578             : 
     579           0 : void IMapWindow::SetCurrentObjState( sal_Bool bActive )
     580             : {
     581           0 :     SdrObject* pObj = GetSelectedSdrObject();
     582             : 
     583           0 :     if ( pObj )
     584             :     {
     585           0 :         SfxItemSet aSet( pModel->GetItemPool() );
     586             : 
     587           0 :         GetIMapObj( pObj )->SetActive( bActive );
     588             : 
     589           0 :         aSet.Put( XFillColorItem( String(), TRANSCOL ) );
     590             : 
     591           0 :         if ( !bActive )
     592             :         {
     593           0 :             aSet.Put( XFillTransparenceItem( 100 ) );
     594           0 :             aSet.Put( XLineColorItem( String(), Color( COL_RED ) ) );
     595             :         }
     596             :         else
     597             :         {
     598           0 :             aSet.Put( XFillTransparenceItem( 50 ) );
     599           0 :             aSet.Put( XLineColorItem( String(), Color( COL_BLACK ) ) );
     600             :         }
     601             : 
     602           0 :         pView->SetAttributes( aSet, sal_False );
     603             :     }
     604           0 : }
     605             : 
     606           0 : void IMapWindow::UpdateInfo( sal_Bool bNewObj )
     607             : {
     608           0 :     if ( aInfoLink.IsSet() )
     609             :     {
     610           0 :         const SdrObject*    pSdrObj = GetSelectedSdrObject();
     611           0 :         const IMapObject*   pIMapObj = pSdrObj ? GetIMapObj( pSdrObj ) : NULL;
     612             : 
     613           0 :         aInfo.bNewObj = bNewObj;
     614             : 
     615           0 :         if ( pIMapObj )
     616             :         {
     617           0 :             aInfo.bOneMarked = sal_True;
     618           0 :             aInfo.aMarkURL = pIMapObj->GetURL();
     619           0 :             aInfo.aMarkAltText = pIMapObj->GetAltText();
     620           0 :             aInfo.aMarkTarget = pIMapObj->GetTarget();
     621           0 :             aInfo.bActivated = pIMapObj->IsActive();
     622           0 :             aInfoLink.Call( this );
     623             :         }
     624             :         else
     625             :         {
     626           0 :             aInfo.aMarkURL = aInfo.aMarkAltText = aInfo.aMarkTarget = String();
     627           0 :             aInfo.bOneMarked = sal_False;
     628           0 :             aInfo.bActivated = sal_False;
     629             :         }
     630             : 
     631           0 :         aInfoLink.Call( this );
     632             :     }
     633           0 : }
     634             : 
     635           0 : void IMapWindow::DoMacroAssign()
     636             : {
     637           0 :     SdrObject*  pSdrObj = GetSelectedSdrObject();
     638             : 
     639           0 :     if ( pSdrObj )
     640             :     {
     641           0 :         SfxItemSet      aSet( *pIMapPool, SID_ATTR_MACROITEM, SID_ATTR_MACROITEM, SID_EVENTCONFIG, SID_EVENTCONFIG, 0 );
     642             : 
     643           0 :         SfxEventNamesItem aNamesItem(SID_EVENTCONFIG);
     644           0 :         aNamesItem.AddEvent( rtl::OUString("MouseOver"), String(), SFX_EVENT_MOUSEOVER_OBJECT );
     645           0 :         aNamesItem.AddEvent( rtl::OUString("MouseOut"), String(), SFX_EVENT_MOUSEOUT_OBJECT );
     646           0 :         aSet.Put( aNamesItem );
     647             : 
     648           0 :         SvxMacroItem    aMacroItem(SID_ATTR_MACROITEM);
     649           0 :         IMapObject*     pIMapObj = GetIMapObj( pSdrObj );
     650           0 :         aMacroItem.SetMacroTable( pIMapObj->GetMacroTable() );
     651           0 :         aSet.Put( aMacroItem, SID_ATTR_MACROITEM );
     652             : 
     653           0 :         SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
     654           0 :         SfxAbstractDialog* pMacroDlg = pFact->CreateSfxDialog( this, aSet, mxDocumentFrame, SID_EVENTCONFIG );
     655             : 
     656           0 :         if ( pMacroDlg && pMacroDlg->Execute() == RET_OK )
     657             :         {
     658           0 :             const SfxItemSet* pOutSet = pMacroDlg->GetOutputItemSet();
     659           0 :             pIMapObj->SetMacroTable( ((const SvxMacroItem& )pOutSet->Get( SID_ATTR_MACROITEM )).GetMacroTable() );
     660           0 :             pModel->SetChanged( sal_True );
     661           0 :             UpdateInfo( sal_False );
     662             :         }
     663             : 
     664           0 :         delete pMacroDlg;
     665             :     }
     666           0 : }
     667             : 
     668           0 : void IMapWindow::DoPropertyDialog()
     669             : {
     670           0 :     SdrObject*  pSdrObj = GetSelectedSdrObject();
     671             : 
     672           0 :     if ( pSdrObj )
     673             :     {
     674           0 :         IMapObject* pIMapObj = GetIMapObj( pSdrObj );
     675           0 :         SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
     676           0 :         if(pFact)
     677             :         {
     678           0 :             AbstractURLDlg* aDlg = pFact->CreateURLDialog( this, pIMapObj->GetURL(), pIMapObj->GetAltText(), pIMapObj->GetDesc(),
     679           0 :                                             pIMapObj->GetTarget(), pIMapObj->GetName(), aTargetList );
     680             :             DBG_ASSERT(aDlg, "Dialogdiet fail!");
     681           0 :             if ( aDlg->Execute() == RET_OK )
     682             :             {
     683           0 :                 const String aURLText( aDlg->GetURL() );
     684             : 
     685           0 :                 if ( aURLText.Len() )
     686             :                 {
     687           0 :                     INetURLObject aObj( aURLText, INET_PROT_FILE );
     688             :                     DBG_ASSERT( aObj.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL" );
     689           0 :                     pIMapObj->SetURL( aObj.GetMainURL( INetURLObject::NO_DECODE ) );
     690             :                 }
     691             :                 else
     692           0 :                     pIMapObj->SetURL( aURLText );
     693             : 
     694           0 :                 pIMapObj->SetAltText( aDlg->GetAltText() );
     695           0 :                 pIMapObj->SetDesc( aDlg->GetDesc() );
     696           0 :                 pIMapObj->SetTarget( aDlg->GetTarget() );
     697           0 :                 pIMapObj->SetName( aDlg->GetName() );
     698           0 :                 pModel->SetChanged( sal_True );
     699           0 :                 UpdateInfo( sal_True );
     700             :             }
     701           0 :             delete aDlg;
     702             :         }
     703             :     }
     704           0 : }
     705             : 
     706           0 : IMPL_LINK( IMapWindow, MenuSelectHdl, Menu*, pMenu )
     707             : {
     708           0 :     if (pMenu)
     709             :     {
     710           0 :         sal_uInt16  nId = pMenu->GetCurItemId();
     711             : 
     712           0 :         switch(nId)
     713             :         {
     714             :             case( MN_URL ):
     715           0 :                 DoPropertyDialog();
     716           0 :             break;
     717             : 
     718             :             case( MN_MACRO ):
     719           0 :                 DoMacroAssign();
     720           0 :             break;
     721             : 
     722             :             case( MN_ACTIVATE ):
     723             :             {
     724           0 :                 const sal_Bool bNewState = !pMenu->IsItemChecked( MN_ACTIVATE );
     725             : 
     726           0 :                 pMenu->CheckItem( MN_ACTIVATE, bNewState );
     727           0 :                 SetCurrentObjState( bNewState );
     728           0 :                 UpdateInfo( sal_False );
     729             :             }
     730             : 
     731             :             case( MN_FRAME_TO_TOP ):
     732           0 :                 pView->PutMarkedToTop();
     733           0 :             break;
     734             : 
     735             :             case( MN_MOREFRONT ):
     736           0 :                 pView->MovMarkedToTop();
     737           0 :             break;
     738             : 
     739             :             case( MN_MOREBACK ):
     740           0 :                 pView->MovMarkedToBtm();
     741           0 :             break;
     742             : 
     743             :             case( MN_FRAME_TO_BOTTOM ):
     744           0 :                 pView->PutMarkedToBtm();
     745           0 :             break;
     746             : 
     747             :             case( MN_MARK_ALL ):
     748           0 :                 pView->MarkAll();
     749           0 :             break;
     750             : 
     751             :             case( MN_DELETE1 ):
     752           0 :                 pView->DeleteMarked();
     753             : 
     754             :             default :
     755           0 :             break;
     756             :         }
     757             :     }
     758             : 
     759           0 :     return 0;
     760             : }
     761             : 
     762           0 : void IMapWindow::CreateDefaultObject()
     763             : {
     764           0 :     SdrPageView* pPageView = pView->GetSdrPageView();
     765             : 
     766           0 :     if(pPageView)
     767             :     {
     768             :         // calc position and size
     769           0 :         Point aPagePos(0, 0); // = pPageView->GetOffset();
     770           0 :         Size aPageSize = pPageView->GetPage()->GetSize();
     771           0 :         sal_uInt32 nDefaultObjectSizeWidth = aPageSize.Width() / 4;
     772           0 :         sal_uInt32 nDefaultObjectSizeHeight = aPageSize.Height() / 4;
     773           0 :         aPagePos.X() += (aPageSize.Width() / 2) - (nDefaultObjectSizeWidth / 2);
     774           0 :         aPagePos.Y() += (aPageSize.Height() / 2) - (nDefaultObjectSizeHeight / 2);
     775           0 :         Rectangle aNewObjectRectangle(aPagePos, Size(nDefaultObjectSizeWidth, nDefaultObjectSizeHeight));
     776             : 
     777           0 :         SdrObject* pObj = SdrObjFactory::MakeNewObject( pView->GetCurrentObjInventor(), pView->GetCurrentObjIdentifier(), 0L, pModel);
     778           0 :         pObj->SetLogicRect(aNewObjectRectangle);
     779             : 
     780           0 :         switch( pObj->GetObjIdentifier() )
     781             :         {
     782             :         case OBJ_POLY:
     783             :         case OBJ_PATHPOLY:
     784             :             {
     785           0 :                 basegfx::B2DPolygon aInnerPoly;
     786           0 :                 aInnerPoly.append(basegfx::B2DPoint(aNewObjectRectangle.BottomLeft().X(), aNewObjectRectangle.BottomLeft().Y()));
     787           0 :                 aInnerPoly.append(basegfx::B2DPoint(aNewObjectRectangle.TopLeft().X(), aNewObjectRectangle.TopLeft().Y()));
     788           0 :                 aInnerPoly.append(basegfx::B2DPoint(aNewObjectRectangle.TopCenter().X(), aNewObjectRectangle.TopCenter().Y()));
     789           0 :                 aInnerPoly.append(basegfx::B2DPoint(aNewObjectRectangle.Center().X(), aNewObjectRectangle.Center().Y()));
     790           0 :                 aInnerPoly.append(basegfx::B2DPoint(aNewObjectRectangle.RightCenter().X(), aNewObjectRectangle.RightCenter().Y()));
     791           0 :                 aInnerPoly.append(basegfx::B2DPoint(aNewObjectRectangle.BottomRight().X(), aNewObjectRectangle.BottomRight().Y()));
     792           0 :                 aInnerPoly.setClosed(true);
     793           0 :                 ((SdrPathObj*)pObj)->SetPathPoly(basegfx::B2DPolyPolygon(aInnerPoly));
     794           0 :                 break;
     795             :             }
     796             :         case OBJ_FREEFILL:
     797             :         case OBJ_PATHFILL:
     798             :             {
     799           0 :                 sal_Int32 nWdt(aNewObjectRectangle.GetWidth() / 2);
     800           0 :                 sal_Int32 nHgt(aNewObjectRectangle.GetHeight() / 2);
     801           0 :                 basegfx::B2DPolygon aInnerPoly(XPolygon(aNewObjectRectangle.Center(), nWdt, nHgt).getB2DPolygon());
     802           0 :                 ((SdrPathObj*)pObj)->SetPathPoly(basegfx::B2DPolyPolygon(aInnerPoly));
     803           0 :                 break;
     804             :             }
     805             : 
     806             :         }
     807             : 
     808           0 :         pView->InsertObjectAtView(pObj, *pPageView);
     809           0 :         SdrObjCreated( *pObj );
     810           0 :         SetCurrentObjState( true );
     811           0 :         pView->MarkObj( pObj, pPageView );
     812             :     }
     813           0 : }
     814             : 
     815           0 : void IMapWindow::KeyInput( const KeyEvent& rKEvt )
     816             : {
     817           0 :     GraphCtrl::KeyInput( rKEvt );
     818           0 : }
     819             : 
     820           0 : void IMapWindow::SelectFirstObject()
     821             : {
     822           0 :     SdrPage*    pPage = (SdrPage*) pModel->GetPage( 0 );
     823           0 :     if( pPage->GetObjCount() != 0 )
     824             :     {
     825           0 :         GrabFocus();
     826           0 :         pView->UnmarkAllObj();
     827           0 :         pView->MarkNextObj(sal_True);
     828             :     }
     829           0 : }
     830             : 
     831           0 : void IMapWindow::StartPolyEdit()
     832             : {
     833           0 :     GrabFocus();
     834             : 
     835           0 :     if( !pView->AreObjectsMarked() )
     836           0 :         pView->MarkNextObj(sal_True);
     837             : 
     838           0 :     const SdrHdlList& rHdlList = pView->GetHdlList();
     839           0 :     SdrHdl* pHdl = rHdlList.GetFocusHdl();
     840             : 
     841           0 :     if(!pHdl)
     842             :     {
     843           0 :         ((SdrHdlList&)rHdlList).TravelFocusHdl(true);
     844             :     }
     845          57 : }
     846             : 
     847             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10