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

Generated by: LCOV version 1.10