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

Generated by: LCOV version 1.11