xref: /trunk/main/svx/source/dialog/imapwnd.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_svx.hxx"
30*cdf0e10cSrcweir #include <tools/urlobj.hxx>
31*cdf0e10cSrcweir #include <vcl/msgbox.hxx>
32*cdf0e10cSrcweir #include <vcl/help.hxx>
33*cdf0e10cSrcweir #include <sfx2/sfxsids.hrc>     // SID_ATTR_MACROITEM
34*cdf0e10cSrcweir #define _ANIMATION
35*cdf0e10cSrcweir #include <svtools/imaprect.hxx>
36*cdf0e10cSrcweir #include <svtools/imapcirc.hxx>
37*cdf0e10cSrcweir #include <svtools/imappoly.hxx>
38*cdf0e10cSrcweir #include <svl/urlbmk.hxx>
39*cdf0e10cSrcweir 
40*cdf0e10cSrcweir #include <svx/xoutbmp.hxx>
41*cdf0e10cSrcweir #include <svx/dialmgr.hxx>
42*cdf0e10cSrcweir #include <svx/dialogs.hrc>
43*cdf0e10cSrcweir #include <svx/svxids.hrc>
44*cdf0e10cSrcweir #include <imapdlg.hrc>
45*cdf0e10cSrcweir #include <imapwnd.hxx>
46*cdf0e10cSrcweir #include <svx/svdpage.hxx>
47*cdf0e10cSrcweir #include <svx/svdorect.hxx>
48*cdf0e10cSrcweir #include <svx/svdocirc.hxx>
49*cdf0e10cSrcweir #include <svx/svdopath.hxx>
50*cdf0e10cSrcweir #include <svx/xfltrit.hxx>
51*cdf0e10cSrcweir #include <svx/svdpagv.hxx>
52*cdf0e10cSrcweir #include <svl/urihelper.hxx>
53*cdf0e10cSrcweir #include <svx/xfillit.hxx>
54*cdf0e10cSrcweir #include <svx/xlineit.hxx>
55*cdf0e10cSrcweir #include <sfx2/evntconf.hxx>
56*cdf0e10cSrcweir 
57*cdf0e10cSrcweir #include <sot/formats.hxx>
58*cdf0e10cSrcweir 
59*cdf0e10cSrcweir #include <svx/svxdlg.hxx>
60*cdf0e10cSrcweir #include <svx/dialogs.hrc>
61*cdf0e10cSrcweir #include <basegfx/point/b2dpoint.hxx>
62*cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygon.hxx>
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir using ::com::sun::star::frame::XFrame;
65*cdf0e10cSrcweir using ::com::sun::star::uno::Reference;
66*cdf0e10cSrcweir 
67*cdf0e10cSrcweir #define TRANSCOL Color( COL_WHITE )
68*cdf0e10cSrcweir 
69*cdf0e10cSrcweir /*************************************************************************
70*cdf0e10cSrcweir |*
71*cdf0e10cSrcweir |*
72*cdf0e10cSrcweir |*
73*cdf0e10cSrcweir \************************************************************************/
74*cdf0e10cSrcweir 
75*cdf0e10cSrcweir IMapWindow::IMapWindow( Window* pParent, const ResId& rResId, const Reference< XFrame >& rxDocumentFrame ) :
76*cdf0e10cSrcweir             GraphCtrl( pParent, rResId ),
77*cdf0e10cSrcweir             DropTargetHelper( this ),
78*cdf0e10cSrcweir             mxDocumentFrame( rxDocumentFrame )
79*cdf0e10cSrcweir {
80*cdf0e10cSrcweir     SetWinStyle( WB_SDRMODE );
81*cdf0e10cSrcweir 
82*cdf0e10cSrcweir     pItemInfo = new SfxItemInfo[ 1 ];
83*cdf0e10cSrcweir     memset( pItemInfo, 0, sizeof( SfxItemInfo ) );
84*cdf0e10cSrcweir     pIMapPool = new SfxItemPool( String::CreateFromAscii( "IMapItemPool" ),
85*cdf0e10cSrcweir                                  SID_ATTR_MACROITEM, SID_ATTR_MACROITEM, pItemInfo );
86*cdf0e10cSrcweir     pIMapPool->FreezeIdRanges();
87*cdf0e10cSrcweir }
88*cdf0e10cSrcweir 
89*cdf0e10cSrcweir /*************************************************************************
90*cdf0e10cSrcweir |*
91*cdf0e10cSrcweir |*
92*cdf0e10cSrcweir |*
93*cdf0e10cSrcweir \************************************************************************/
94*cdf0e10cSrcweir 
95*cdf0e10cSrcweir IMapWindow::~IMapWindow()
96*cdf0e10cSrcweir {
97*cdf0e10cSrcweir     // Liste loeschen
98*cdf0e10cSrcweir     for( String* pStr = aTargetList.First(); pStr; pStr = aTargetList.Next() )
99*cdf0e10cSrcweir         delete pStr;
100*cdf0e10cSrcweir 
101*cdf0e10cSrcweir     SfxItemPool::Free(pIMapPool);
102*cdf0e10cSrcweir     delete[] pItemInfo;
103*cdf0e10cSrcweir }
104*cdf0e10cSrcweir 
105*cdf0e10cSrcweir /*************************************************************************
106*cdf0e10cSrcweir |*
107*cdf0e10cSrcweir |*
108*cdf0e10cSrcweir |*
109*cdf0e10cSrcweir \************************************************************************/
110*cdf0e10cSrcweir 
111*cdf0e10cSrcweir void IMapWindow::SetImageMap( const ImageMap& rImageMap )
112*cdf0e10cSrcweir {
113*cdf0e10cSrcweir     ReplaceImageMap( rImageMap, sal_False );
114*cdf0e10cSrcweir }
115*cdf0e10cSrcweir 
116*cdf0e10cSrcweir /*************************************************************************
117*cdf0e10cSrcweir |*
118*cdf0e10cSrcweir |*
119*cdf0e10cSrcweir |*
120*cdf0e10cSrcweir \************************************************************************/
121*cdf0e10cSrcweir 
122*cdf0e10cSrcweir void IMapWindow::ReplaceImageMap( const ImageMap& rImageMap, sal_Bool /*bScaleToGraphic*/ )
123*cdf0e10cSrcweir {
124*cdf0e10cSrcweir     SdrPage* pPage = 0;
125*cdf0e10cSrcweir     aIMap = rImageMap;
126*cdf0e10cSrcweir 
127*cdf0e10cSrcweir     if(GetSdrModel())
128*cdf0e10cSrcweir     {
129*cdf0e10cSrcweir         // try to access page
130*cdf0e10cSrcweir         pPage = GetSdrModel()->GetPage(0L);
131*cdf0e10cSrcweir     }
132*cdf0e10cSrcweir 
133*cdf0e10cSrcweir     if(pPage)
134*cdf0e10cSrcweir     {
135*cdf0e10cSrcweir         // clear all draw objects
136*cdf0e10cSrcweir         pPage->Clear();
137*cdf0e10cSrcweir     }
138*cdf0e10cSrcweir 
139*cdf0e10cSrcweir     if(GetSdrView())
140*cdf0e10cSrcweir     {
141*cdf0e10cSrcweir         // #i63762# reset selection at view
142*cdf0e10cSrcweir         GetSdrView()->UnmarkAllObj();
143*cdf0e10cSrcweir     }
144*cdf0e10cSrcweir 
145*cdf0e10cSrcweir     // create new drawing objects
146*cdf0e10cSrcweir     const sal_uInt16 nCount(rImageMap.GetIMapObjectCount());
147*cdf0e10cSrcweir 
148*cdf0e10cSrcweir     for ( sal_uInt16 i(nCount); i > 0; i-- )
149*cdf0e10cSrcweir     {
150*cdf0e10cSrcweir         SdrObject* pNewObj = CreateObj( rImageMap.GetIMapObject( i - 1 ) );
151*cdf0e10cSrcweir 
152*cdf0e10cSrcweir         if ( pNewObj )
153*cdf0e10cSrcweir         {
154*cdf0e10cSrcweir             pPage->InsertObject( pNewObj );
155*cdf0e10cSrcweir         }
156*cdf0e10cSrcweir     }
157*cdf0e10cSrcweir }
158*cdf0e10cSrcweir 
159*cdf0e10cSrcweir /*************************************************************************
160*cdf0e10cSrcweir |*
161*cdf0e10cSrcweir |*
162*cdf0e10cSrcweir |*
163*cdf0e10cSrcweir \************************************************************************/
164*cdf0e10cSrcweir 
165*cdf0e10cSrcweir sal_Bool IMapWindow::ReplaceActualIMapInfo( const NotifyInfo& rNewInfo )
166*cdf0e10cSrcweir {
167*cdf0e10cSrcweir     const SdrObject*    pSdrObj = GetSelectedSdrObject();
168*cdf0e10cSrcweir     IMapObject*         pIMapObj;
169*cdf0e10cSrcweir     sal_Bool                bRet = sal_False;
170*cdf0e10cSrcweir 
171*cdf0e10cSrcweir     if ( pSdrObj && ( ( pIMapObj = GetIMapObj( pSdrObj ) ) != NULL ) )
172*cdf0e10cSrcweir     {
173*cdf0e10cSrcweir         pIMapObj->SetURL( rNewInfo.aMarkURL );
174*cdf0e10cSrcweir         pIMapObj->SetAltText( rNewInfo.aMarkAltText );
175*cdf0e10cSrcweir         pIMapObj->SetTarget( rNewInfo.aMarkTarget );
176*cdf0e10cSrcweir         pModel->SetChanged( sal_True );
177*cdf0e10cSrcweir         UpdateInfo( sal_False );
178*cdf0e10cSrcweir 
179*cdf0e10cSrcweir         bRet = sal_True;
180*cdf0e10cSrcweir     }
181*cdf0e10cSrcweir 
182*cdf0e10cSrcweir     return bRet;
183*cdf0e10cSrcweir }
184*cdf0e10cSrcweir 
185*cdf0e10cSrcweir /*************************************************************************
186*cdf0e10cSrcweir |*
187*cdf0e10cSrcweir |*
188*cdf0e10cSrcweir |*
189*cdf0e10cSrcweir \************************************************************************/
190*cdf0e10cSrcweir 
191*cdf0e10cSrcweir const ImageMap& IMapWindow::GetImageMap()
192*cdf0e10cSrcweir {
193*cdf0e10cSrcweir     if ( pModel->IsChanged() )
194*cdf0e10cSrcweir     {
195*cdf0e10cSrcweir         SdrPage* pPage = (SdrPage*) pModel->GetPage( 0 );
196*cdf0e10cSrcweir 
197*cdf0e10cSrcweir         if ( pPage )
198*cdf0e10cSrcweir         {
199*cdf0e10cSrcweir             const long nCount = pPage->GetObjCount();
200*cdf0e10cSrcweir 
201*cdf0e10cSrcweir             aIMap.ClearImageMap();
202*cdf0e10cSrcweir 
203*cdf0e10cSrcweir             for ( long i = nCount - 1; i > -1; i-- )
204*cdf0e10cSrcweir                 aIMap.InsertIMapObject( *( ( (IMapUserData*) pPage->GetObj( i )->GetUserData( 0 ) )->GetObject() ) );
205*cdf0e10cSrcweir         }
206*cdf0e10cSrcweir 
207*cdf0e10cSrcweir         pModel->SetChanged( sal_False );
208*cdf0e10cSrcweir     }
209*cdf0e10cSrcweir 
210*cdf0e10cSrcweir     return aIMap;
211*cdf0e10cSrcweir }
212*cdf0e10cSrcweir 
213*cdf0e10cSrcweir /*************************************************************************
214*cdf0e10cSrcweir |*
215*cdf0e10cSrcweir |*
216*cdf0e10cSrcweir |*
217*cdf0e10cSrcweir \************************************************************************/
218*cdf0e10cSrcweir 
219*cdf0e10cSrcweir void IMapWindow::SetTargetList( TargetList& rTargetList )
220*cdf0e10cSrcweir {
221*cdf0e10cSrcweir     String* pStr;
222*cdf0e10cSrcweir 
223*cdf0e10cSrcweir     // alte Liste loeschen
224*cdf0e10cSrcweir     for( pStr = aTargetList.First(); pStr; pStr = aTargetList.Next() )
225*cdf0e10cSrcweir         delete pStr;
226*cdf0e10cSrcweir 
227*cdf0e10cSrcweir     aTargetList.Clear();
228*cdf0e10cSrcweir 
229*cdf0e10cSrcweir     // mit uebergebener Liste fuellen
230*cdf0e10cSrcweir     for( pStr = rTargetList.First(); pStr; pStr = rTargetList.Next() )
231*cdf0e10cSrcweir         aTargetList.Insert( new String( *pStr ) );
232*cdf0e10cSrcweir 
233*cdf0e10cSrcweir     pModel->SetChanged( sal_False );
234*cdf0e10cSrcweir }
235*cdf0e10cSrcweir 
236*cdf0e10cSrcweir /*************************************************************************
237*cdf0e10cSrcweir |*
238*cdf0e10cSrcweir |*
239*cdf0e10cSrcweir |*
240*cdf0e10cSrcweir \************************************************************************/
241*cdf0e10cSrcweir 
242*cdf0e10cSrcweir SdrObject* IMapWindow::CreateObj( const IMapObject* pIMapObj )
243*cdf0e10cSrcweir {
244*cdf0e10cSrcweir     Point       aPoint;
245*cdf0e10cSrcweir     Rectangle   aClipRect( aPoint, GetGraphicSize() );
246*cdf0e10cSrcweir     SdrObject*  pSdrObj = NULL;
247*cdf0e10cSrcweir     IMapObjectPtr pCloneIMapObj;
248*cdf0e10cSrcweir 
249*cdf0e10cSrcweir     switch( pIMapObj->GetType() )
250*cdf0e10cSrcweir     {
251*cdf0e10cSrcweir         case( IMAP_OBJ_RECTANGLE ):
252*cdf0e10cSrcweir         {
253*cdf0e10cSrcweir             IMapRectangleObject*    pIMapRectObj = (IMapRectangleObject*) pIMapObj;
254*cdf0e10cSrcweir             Rectangle               aDrawRect( pIMapRectObj->GetRectangle( sal_False ) );
255*cdf0e10cSrcweir 
256*cdf0e10cSrcweir             // auf Zeichenflaeche clippen
257*cdf0e10cSrcweir             aDrawRect.Intersection( aClipRect );
258*cdf0e10cSrcweir 
259*cdf0e10cSrcweir             pSdrObj = (SdrObject*) new SdrRectObj( aDrawRect );
260*cdf0e10cSrcweir             pCloneIMapObj.reset((IMapObject*) new IMapRectangleObject( *pIMapRectObj ));
261*cdf0e10cSrcweir         }
262*cdf0e10cSrcweir         break;
263*cdf0e10cSrcweir 
264*cdf0e10cSrcweir         case( IMAP_OBJ_CIRCLE ):
265*cdf0e10cSrcweir         {
266*cdf0e10cSrcweir             IMapCircleObject*   pIMapCircleObj = (IMapCircleObject*) pIMapObj;
267*cdf0e10cSrcweir             const Point         aCenter( pIMapCircleObj->GetCenter( sal_False ) );
268*cdf0e10cSrcweir             const long          nRadius = pIMapCircleObj->GetRadius( sal_False );
269*cdf0e10cSrcweir             const Point         aOffset( nRadius, nRadius );
270*cdf0e10cSrcweir             Rectangle           aCircle( aCenter - aOffset, aCenter + aOffset );
271*cdf0e10cSrcweir 
272*cdf0e10cSrcweir             // auf Zeichenflaeche begrenzen
273*cdf0e10cSrcweir             aCircle.Intersection( aClipRect );
274*cdf0e10cSrcweir 
275*cdf0e10cSrcweir             pSdrObj = (SdrObject*) new SdrCircObj( OBJ_CIRC, aCircle, 0, 36000 );
276*cdf0e10cSrcweir             pCloneIMapObj.reset((IMapObject*) new IMapCircleObject( *pIMapCircleObj ));
277*cdf0e10cSrcweir         }
278*cdf0e10cSrcweir         break;
279*cdf0e10cSrcweir 
280*cdf0e10cSrcweir         case( IMAP_OBJ_POLYGON ):
281*cdf0e10cSrcweir         {
282*cdf0e10cSrcweir             IMapPolygonObject*  pIMapPolyObj = (IMapPolygonObject*) pIMapObj;
283*cdf0e10cSrcweir 
284*cdf0e10cSrcweir             // Falls wir eigentlich eine Ellipse sind,
285*cdf0e10cSrcweir             // erzeugen wir auch wieder eine Ellipse
286*cdf0e10cSrcweir             if ( pIMapPolyObj->HasExtraEllipse() )
287*cdf0e10cSrcweir             {
288*cdf0e10cSrcweir                 Rectangle aDrawRect( pIMapPolyObj->GetExtraEllipse() );
289*cdf0e10cSrcweir 
290*cdf0e10cSrcweir                 // auf Zeichenflaeche clippen
291*cdf0e10cSrcweir                 aDrawRect.Intersection( aClipRect );
292*cdf0e10cSrcweir 
293*cdf0e10cSrcweir                 pSdrObj = (SdrObject*) new SdrCircObj( OBJ_CIRC, aDrawRect, 0, 36000 );
294*cdf0e10cSrcweir             }
295*cdf0e10cSrcweir             else
296*cdf0e10cSrcweir             {
297*cdf0e10cSrcweir                 const Polygon&  rPoly = pIMapPolyObj->GetPolygon( sal_False );
298*cdf0e10cSrcweir                 Polygon         aDrawPoly( rPoly );
299*cdf0e10cSrcweir 
300*cdf0e10cSrcweir                 // auf Zeichenflaeche clippen
301*cdf0e10cSrcweir                 aDrawPoly.Clip( aClipRect );
302*cdf0e10cSrcweir 
303*cdf0e10cSrcweir                 basegfx::B2DPolygon aPolygon;
304*cdf0e10cSrcweir                 aPolygon.append(aDrawPoly.getB2DPolygon());
305*cdf0e10cSrcweir                 pSdrObj = (SdrObject*)new SdrPathObj(OBJ_POLY, basegfx::B2DPolyPolygon(aPolygon));
306*cdf0e10cSrcweir             }
307*cdf0e10cSrcweir 
308*cdf0e10cSrcweir             pCloneIMapObj.reset((IMapObject*) new IMapPolygonObject( *pIMapPolyObj ));
309*cdf0e10cSrcweir         }
310*cdf0e10cSrcweir         break;
311*cdf0e10cSrcweir 
312*cdf0e10cSrcweir         default:
313*cdf0e10cSrcweir         break;
314*cdf0e10cSrcweir     }
315*cdf0e10cSrcweir 
316*cdf0e10cSrcweir     if ( pSdrObj )
317*cdf0e10cSrcweir     {
318*cdf0e10cSrcweir         SfxItemSet aSet( pModel->GetItemPool() );
319*cdf0e10cSrcweir 
320*cdf0e10cSrcweir         aSet.Put( XFillStyleItem( XFILL_SOLID ) );
321*cdf0e10cSrcweir         aSet.Put( XFillColorItem( String(), TRANSCOL ) );
322*cdf0e10cSrcweir 
323*cdf0e10cSrcweir         if ( !pIMapObj->IsActive() )
324*cdf0e10cSrcweir         {
325*cdf0e10cSrcweir             aSet.Put( XFillTransparenceItem( 100 ) );
326*cdf0e10cSrcweir             aSet.Put( XLineColorItem( String(), Color( COL_RED ) ) );
327*cdf0e10cSrcweir         }
328*cdf0e10cSrcweir         else
329*cdf0e10cSrcweir         {
330*cdf0e10cSrcweir             aSet.Put( XFillTransparenceItem( 50 ) );
331*cdf0e10cSrcweir             aSet.Put( XLineColorItem( String(), Color( COL_BLACK ) ) );
332*cdf0e10cSrcweir         }
333*cdf0e10cSrcweir 
334*cdf0e10cSrcweir         //pSdrObj->SetItemSetAndBroadcast(aSet);
335*cdf0e10cSrcweir         pSdrObj->SetMergedItemSetAndBroadcast(aSet);
336*cdf0e10cSrcweir 
337*cdf0e10cSrcweir         pSdrObj->InsertUserData( new IMapUserData( pCloneIMapObj ) );
338*cdf0e10cSrcweir         pSdrObj->SetUserCall( GetSdrUserCall() );
339*cdf0e10cSrcweir     }
340*cdf0e10cSrcweir 
341*cdf0e10cSrcweir     return pSdrObj;
342*cdf0e10cSrcweir }
343*cdf0e10cSrcweir 
344*cdf0e10cSrcweir /*************************************************************************
345*cdf0e10cSrcweir |*
346*cdf0e10cSrcweir |*
347*cdf0e10cSrcweir |*
348*cdf0e10cSrcweir \************************************************************************/
349*cdf0e10cSrcweir 
350*cdf0e10cSrcweir void IMapWindow::InitSdrModel()
351*cdf0e10cSrcweir {
352*cdf0e10cSrcweir     GraphCtrl::InitSdrModel();
353*cdf0e10cSrcweir 
354*cdf0e10cSrcweir     SfxItemSet aSet( pModel->GetItemPool() );
355*cdf0e10cSrcweir 
356*cdf0e10cSrcweir     aSet.Put( XFillColorItem( String(), TRANSCOL ) );
357*cdf0e10cSrcweir     aSet.Put( XFillTransparenceItem( 50 ) );
358*cdf0e10cSrcweir     pView->SetAttributes( aSet );
359*cdf0e10cSrcweir     pView->SetFrameDragSingles( sal_True );
360*cdf0e10cSrcweir }
361*cdf0e10cSrcweir 
362*cdf0e10cSrcweir /*************************************************************************
363*cdf0e10cSrcweir |*
364*cdf0e10cSrcweir |*
365*cdf0e10cSrcweir |*
366*cdf0e10cSrcweir \************************************************************************/
367*cdf0e10cSrcweir 
368*cdf0e10cSrcweir void IMapWindow::SdrObjCreated( const SdrObject& rObj )
369*cdf0e10cSrcweir {
370*cdf0e10cSrcweir     switch( rObj.GetObjIdentifier() )
371*cdf0e10cSrcweir     {
372*cdf0e10cSrcweir         case( OBJ_RECT ):
373*cdf0e10cSrcweir         {
374*cdf0e10cSrcweir             SdrRectObj*          pRectObj = (SdrRectObj*) &rObj;
375*cdf0e10cSrcweir             IMapRectangleObject* pObj = new IMapRectangleObject( pRectObj->GetLogicRect(),
376*cdf0e10cSrcweir                 String(), String(), String(), String(), String(), sal_True, sal_False );
377*cdf0e10cSrcweir 
378*cdf0e10cSrcweir             pRectObj->InsertUserData( new IMapUserData( IMapObjectPtr(pObj) ) );
379*cdf0e10cSrcweir         }
380*cdf0e10cSrcweir         break;
381*cdf0e10cSrcweir 
382*cdf0e10cSrcweir         case( OBJ_CIRC ):
383*cdf0e10cSrcweir         {
384*cdf0e10cSrcweir             SdrCircObj* pCircObj = (SdrCircObj*) &rObj;
385*cdf0e10cSrcweir             SdrPathObj* pPathObj = (SdrPathObj*) pCircObj->ConvertToPolyObj( sal_False, sal_False );
386*cdf0e10cSrcweir             Polygon aPoly(pPathObj->GetPathPoly().getB2DPolygon(0L));
387*cdf0e10cSrcweir             delete pPathObj;
388*cdf0e10cSrcweir 
389*cdf0e10cSrcweir             IMapPolygonObject* pObj = new IMapPolygonObject( Polygon(aPoly), String(), String(), String(), String(), String(),  sal_True, sal_False );
390*cdf0e10cSrcweir             pObj->SetExtraEllipse( aPoly.GetBoundRect() );
391*cdf0e10cSrcweir             pCircObj->InsertUserData( new IMapUserData( IMapObjectPtr(pObj) ) );
392*cdf0e10cSrcweir         }
393*cdf0e10cSrcweir         break;
394*cdf0e10cSrcweir 
395*cdf0e10cSrcweir         case( OBJ_POLY ):
396*cdf0e10cSrcweir         case( OBJ_FREEFILL ):
397*cdf0e10cSrcweir         case( OBJ_PATHPOLY ):
398*cdf0e10cSrcweir         case( OBJ_PATHFILL ):
399*cdf0e10cSrcweir         {
400*cdf0e10cSrcweir             SdrPathObj* pPathObj = (SdrPathObj*) &rObj;
401*cdf0e10cSrcweir             const basegfx::B2DPolyPolygon& rXPolyPoly = pPathObj->GetPathPoly();
402*cdf0e10cSrcweir 
403*cdf0e10cSrcweir             if ( rXPolyPoly.count() )
404*cdf0e10cSrcweir             {
405*cdf0e10cSrcweir                 Polygon aPoly(rXPolyPoly.getB2DPolygon(0L));
406*cdf0e10cSrcweir                 IMapPolygonObject* pObj = new IMapPolygonObject( aPoly, String(), String(), String(), String(), String(),  sal_True, sal_False );
407*cdf0e10cSrcweir                 pPathObj->InsertUserData( new IMapUserData( IMapObjectPtr(pObj) ) );
408*cdf0e10cSrcweir             }
409*cdf0e10cSrcweir         }
410*cdf0e10cSrcweir         break;
411*cdf0e10cSrcweir 
412*cdf0e10cSrcweir         default:
413*cdf0e10cSrcweir         break;
414*cdf0e10cSrcweir     }
415*cdf0e10cSrcweir }
416*cdf0e10cSrcweir 
417*cdf0e10cSrcweir /*************************************************************************
418*cdf0e10cSrcweir |*
419*cdf0e10cSrcweir |*
420*cdf0e10cSrcweir |*
421*cdf0e10cSrcweir \************************************************************************/
422*cdf0e10cSrcweir 
423*cdf0e10cSrcweir void IMapWindow::SdrObjChanged( const SdrObject& rObj )
424*cdf0e10cSrcweir {
425*cdf0e10cSrcweir     IMapUserData* pUserData = (IMapUserData*) rObj.GetUserData( 0 );
426*cdf0e10cSrcweir 
427*cdf0e10cSrcweir     if ( pUserData )
428*cdf0e10cSrcweir     {
429*cdf0e10cSrcweir         String          aURL;
430*cdf0e10cSrcweir         String          aAltText;
431*cdf0e10cSrcweir         String          aDesc;
432*cdf0e10cSrcweir         String          aTarget;
433*cdf0e10cSrcweir         IMapObjectPtr   pIMapObj = pUserData->GetObject();
434*cdf0e10cSrcweir         sal_Bool            bActive = sal_True;
435*cdf0e10cSrcweir 
436*cdf0e10cSrcweir         if ( pIMapObj.get() )
437*cdf0e10cSrcweir         {
438*cdf0e10cSrcweir             aURL = pIMapObj->GetURL();
439*cdf0e10cSrcweir             aAltText = pIMapObj->GetAltText();
440*cdf0e10cSrcweir             aDesc = pIMapObj->GetDesc();
441*cdf0e10cSrcweir             aTarget = pIMapObj->GetTarget();
442*cdf0e10cSrcweir             bActive = pIMapObj->IsActive();
443*cdf0e10cSrcweir         }
444*cdf0e10cSrcweir 
445*cdf0e10cSrcweir         switch( rObj.GetObjIdentifier() )
446*cdf0e10cSrcweir         {
447*cdf0e10cSrcweir             case( OBJ_RECT ):
448*cdf0e10cSrcweir             {
449*cdf0e10cSrcweir                 pUserData->ReplaceObject( IMapObjectPtr(new IMapRectangleObject( ( (const SdrRectObj&) rObj ).GetLogicRect(),
450*cdf0e10cSrcweir                           aURL, aAltText, aDesc, aTarget, String(), bActive, sal_False ) ) );
451*cdf0e10cSrcweir             }
452*cdf0e10cSrcweir             break;
453*cdf0e10cSrcweir 
454*cdf0e10cSrcweir             case( OBJ_CIRC ):
455*cdf0e10cSrcweir             {
456*cdf0e10cSrcweir                 const SdrCircObj& rCircObj = (const SdrCircObj&) rObj;
457*cdf0e10cSrcweir                 SdrPathObj* pPathObj = (SdrPathObj*) rCircObj.ConvertToPolyObj( sal_False, sal_False );
458*cdf0e10cSrcweir                 Polygon aPoly(pPathObj->GetPathPoly().getB2DPolygon(0L));
459*cdf0e10cSrcweir 
460*cdf0e10cSrcweir                 IMapPolygonObject* pObj = new IMapPolygonObject( aPoly, aURL, aAltText, aDesc, aTarget, String(), bActive, sal_False );
461*cdf0e10cSrcweir                 pObj->SetExtraEllipse( aPoly.GetBoundRect() );
462*cdf0e10cSrcweir 
463*cdf0e10cSrcweir                 // wurde von uns nur temporaer angelegt
464*cdf0e10cSrcweir                 delete pPathObj;
465*cdf0e10cSrcweir                 pUserData->ReplaceObject( IMapObjectPtr(pObj) );
466*cdf0e10cSrcweir             }
467*cdf0e10cSrcweir             break;
468*cdf0e10cSrcweir 
469*cdf0e10cSrcweir             case( OBJ_POLY ):
470*cdf0e10cSrcweir             case( OBJ_FREEFILL ):
471*cdf0e10cSrcweir             case( OBJ_PATHPOLY ):
472*cdf0e10cSrcweir             case( OBJ_PATHFILL ):
473*cdf0e10cSrcweir             {
474*cdf0e10cSrcweir                 const SdrPathObj& rPathObj = (const SdrPathObj&) rObj;
475*cdf0e10cSrcweir                 const basegfx::B2DPolyPolygon& rXPolyPoly = rPathObj.GetPathPoly();
476*cdf0e10cSrcweir 
477*cdf0e10cSrcweir                 if ( rXPolyPoly.count() )
478*cdf0e10cSrcweir                 {
479*cdf0e10cSrcweir                     Polygon aPoly(rPathObj.GetPathPoly().getB2DPolygon(0L));
480*cdf0e10cSrcweir                     IMapPolygonObject*  pObj = new IMapPolygonObject( aPoly, aURL, aAltText, aDesc, aTarget, String(), bActive, sal_False );
481*cdf0e10cSrcweir                     pUserData->ReplaceObject( IMapObjectPtr(pObj) );
482*cdf0e10cSrcweir                 }
483*cdf0e10cSrcweir             }
484*cdf0e10cSrcweir             break;
485*cdf0e10cSrcweir 
486*cdf0e10cSrcweir             default:
487*cdf0e10cSrcweir             break;
488*cdf0e10cSrcweir         }
489*cdf0e10cSrcweir     }
490*cdf0e10cSrcweir }
491*cdf0e10cSrcweir 
492*cdf0e10cSrcweir /*************************************************************************
493*cdf0e10cSrcweir |*
494*cdf0e10cSrcweir |*
495*cdf0e10cSrcweir |*
496*cdf0e10cSrcweir \************************************************************************/
497*cdf0e10cSrcweir 
498*cdf0e10cSrcweir void IMapWindow::MouseButtonUp(const MouseEvent& rMEvt)
499*cdf0e10cSrcweir {
500*cdf0e10cSrcweir     GraphCtrl::MouseButtonUp( rMEvt );
501*cdf0e10cSrcweir     UpdateInfo( sal_True );
502*cdf0e10cSrcweir }
503*cdf0e10cSrcweir 
504*cdf0e10cSrcweir /*************************************************************************
505*cdf0e10cSrcweir |*
506*cdf0e10cSrcweir |*
507*cdf0e10cSrcweir |*
508*cdf0e10cSrcweir \************************************************************************/
509*cdf0e10cSrcweir 
510*cdf0e10cSrcweir void IMapWindow::MarkListHasChanged()
511*cdf0e10cSrcweir {
512*cdf0e10cSrcweir     GraphCtrl::MarkListHasChanged();
513*cdf0e10cSrcweir     UpdateInfo( sal_False );
514*cdf0e10cSrcweir }
515*cdf0e10cSrcweir 
516*cdf0e10cSrcweir /*************************************************************************
517*cdf0e10cSrcweir |*
518*cdf0e10cSrcweir |*
519*cdf0e10cSrcweir |*
520*cdf0e10cSrcweir \************************************************************************/
521*cdf0e10cSrcweir 
522*cdf0e10cSrcweir SdrObject* IMapWindow::GetHitSdrObj( const Point& rPosPixel ) const
523*cdf0e10cSrcweir {
524*cdf0e10cSrcweir     SdrObject*  pObj = NULL;
525*cdf0e10cSrcweir     Point       aPt = PixelToLogic( rPosPixel );
526*cdf0e10cSrcweir 
527*cdf0e10cSrcweir     if ( Rectangle( Point(), GetGraphicSize() ).IsInside( aPt ) )
528*cdf0e10cSrcweir     {
529*cdf0e10cSrcweir         SdrPage* pPage = (SdrPage*) pModel->GetPage( 0 );
530*cdf0e10cSrcweir         sal_uIntPtr  nCount;
531*cdf0e10cSrcweir 
532*cdf0e10cSrcweir         if ( pPage && ( ( nCount = pPage->GetObjCount() ) > 0 ) )
533*cdf0e10cSrcweir         {
534*cdf0e10cSrcweir             for ( long i = nCount - 1; i >= 0; i-- )
535*cdf0e10cSrcweir             {
536*cdf0e10cSrcweir                 SdrObject*  pTestObj = pPage->GetObj( i );
537*cdf0e10cSrcweir                 IMapObject* pIMapObj = GetIMapObj( pTestObj );
538*cdf0e10cSrcweir 
539*cdf0e10cSrcweir                 if ( pIMapObj && pIMapObj->IsHit( aPt ) )
540*cdf0e10cSrcweir                 {
541*cdf0e10cSrcweir                     pObj = pTestObj;
542*cdf0e10cSrcweir                     break;
543*cdf0e10cSrcweir                 }
544*cdf0e10cSrcweir             }
545*cdf0e10cSrcweir         }
546*cdf0e10cSrcweir     }
547*cdf0e10cSrcweir 
548*cdf0e10cSrcweir     return pObj;
549*cdf0e10cSrcweir }
550*cdf0e10cSrcweir 
551*cdf0e10cSrcweir /*************************************************************************
552*cdf0e10cSrcweir |*
553*cdf0e10cSrcweir |*
554*cdf0e10cSrcweir |*
555*cdf0e10cSrcweir \************************************************************************/
556*cdf0e10cSrcweir 
557*cdf0e10cSrcweir IMapObject* IMapWindow::GetIMapObj( const SdrObject* pSdrObj ) const
558*cdf0e10cSrcweir {
559*cdf0e10cSrcweir     IMapObject* pIMapObj = NULL;
560*cdf0e10cSrcweir 
561*cdf0e10cSrcweir     if ( pSdrObj )
562*cdf0e10cSrcweir     {
563*cdf0e10cSrcweir         IMapUserData* pUserData = (IMapUserData*) pSdrObj->GetUserData( 0 );
564*cdf0e10cSrcweir 
565*cdf0e10cSrcweir         if ( pUserData )
566*cdf0e10cSrcweir             pIMapObj = pUserData->GetObject().get();
567*cdf0e10cSrcweir     }
568*cdf0e10cSrcweir 
569*cdf0e10cSrcweir     return pIMapObj;
570*cdf0e10cSrcweir }
571*cdf0e10cSrcweir 
572*cdf0e10cSrcweir /*************************************************************************
573*cdf0e10cSrcweir |*
574*cdf0e10cSrcweir |*
575*cdf0e10cSrcweir |*
576*cdf0e10cSrcweir \************************************************************************/
577*cdf0e10cSrcweir 
578*cdf0e10cSrcweir SdrObject* IMapWindow::GetSdrObj( const IMapObject* pIMapObj ) const
579*cdf0e10cSrcweir {
580*cdf0e10cSrcweir     SdrObject*  pSdrObj = NULL;
581*cdf0e10cSrcweir     SdrPage*    pPage = (SdrPage*) pModel->GetPage( 0 );
582*cdf0e10cSrcweir     sal_uIntPtr     nCount;
583*cdf0e10cSrcweir 
584*cdf0e10cSrcweir     if ( pPage && ( ( nCount = pPage->GetObjCount() ) > 0 ) )
585*cdf0e10cSrcweir     {
586*cdf0e10cSrcweir         for ( sal_uIntPtr i = 0; i < nCount; i++ )
587*cdf0e10cSrcweir         {
588*cdf0e10cSrcweir             SdrObject* pTestObj = pPage->GetObj( i );
589*cdf0e10cSrcweir 
590*cdf0e10cSrcweir             if ( pIMapObj == GetIMapObj( pTestObj ) )
591*cdf0e10cSrcweir             {
592*cdf0e10cSrcweir                 pSdrObj = pTestObj;
593*cdf0e10cSrcweir                 break;
594*cdf0e10cSrcweir             }
595*cdf0e10cSrcweir         }
596*cdf0e10cSrcweir     }
597*cdf0e10cSrcweir 
598*cdf0e10cSrcweir     return pSdrObj;
599*cdf0e10cSrcweir }
600*cdf0e10cSrcweir 
601*cdf0e10cSrcweir /*************************************************************************
602*cdf0e10cSrcweir |*
603*cdf0e10cSrcweir |*
604*cdf0e10cSrcweir |*
605*cdf0e10cSrcweir \************************************************************************/
606*cdf0e10cSrcweir 
607*cdf0e10cSrcweir void IMapWindow::Command(const CommandEvent& rCEvt)
608*cdf0e10cSrcweir {
609*cdf0e10cSrcweir     Region  aRegion;
610*cdf0e10cSrcweir 
611*cdf0e10cSrcweir     if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU )
612*cdf0e10cSrcweir     {
613*cdf0e10cSrcweir         PopupMenu           aMenu( SVX_RES( RID_SVXMN_IMAP ) );
614*cdf0e10cSrcweir         const SdrMarkList&  rMarkList = pView->GetMarkedObjectList();
615*cdf0e10cSrcweir         sal_uIntPtr             nMarked = rMarkList.GetMarkCount();
616*cdf0e10cSrcweir 
617*cdf0e10cSrcweir         aMenu.EnableItem( MN_URL, sal_False );
618*cdf0e10cSrcweir         aMenu.EnableItem( MN_ACTIVATE, sal_False );
619*cdf0e10cSrcweir         aMenu.EnableItem( MN_MACRO, sal_False );
620*cdf0e10cSrcweir         aMenu.EnableItem( MN_MARK_ALL, pModel->GetPage( 0 )->GetObjCount() != pView->GetMarkedObjectCount() );
621*cdf0e10cSrcweir 
622*cdf0e10cSrcweir         if ( !nMarked )
623*cdf0e10cSrcweir         {
624*cdf0e10cSrcweir             aMenu.EnableItem( MN_POSITION, sal_False );
625*cdf0e10cSrcweir             aMenu.EnableItem( MN_FRAME_TO_TOP, sal_False );
626*cdf0e10cSrcweir             aMenu.EnableItem( MN_MOREFRONT, sal_False );
627*cdf0e10cSrcweir             aMenu.EnableItem( MN_MOREBACK, sal_False );
628*cdf0e10cSrcweir             aMenu.EnableItem( MN_FRAME_TO_BOTTOM, sal_False );
629*cdf0e10cSrcweir             aMenu.EnableItem( MN_DELETE1, sal_False );
630*cdf0e10cSrcweir         }
631*cdf0e10cSrcweir         else
632*cdf0e10cSrcweir         {
633*cdf0e10cSrcweir             if ( nMarked == 1 )
634*cdf0e10cSrcweir             {
635*cdf0e10cSrcweir                 SdrObject*  pSdrObj = GetSelectedSdrObject();
636*cdf0e10cSrcweir 
637*cdf0e10cSrcweir                 aMenu.EnableItem( MN_URL, sal_True );
638*cdf0e10cSrcweir                 aMenu.EnableItem( MN_ACTIVATE, sal_True );
639*cdf0e10cSrcweir                 aMenu.EnableItem( MN_MACRO, sal_True );
640*cdf0e10cSrcweir                 aMenu.CheckItem( MN_ACTIVATE, GetIMapObj( pSdrObj )->IsActive() );
641*cdf0e10cSrcweir             }
642*cdf0e10cSrcweir 
643*cdf0e10cSrcweir             aMenu.EnableItem( MN_POSITION, sal_True );
644*cdf0e10cSrcweir             aMenu.EnableItem( MN_FRAME_TO_TOP, sal_True );
645*cdf0e10cSrcweir             aMenu.EnableItem( MN_MOREFRONT, sal_True );
646*cdf0e10cSrcweir             aMenu.EnableItem( MN_MOREBACK, sal_True );
647*cdf0e10cSrcweir             aMenu.EnableItem( MN_FRAME_TO_BOTTOM, sal_True );
648*cdf0e10cSrcweir             aMenu.EnableItem( MN_DELETE1, sal_True );
649*cdf0e10cSrcweir         }
650*cdf0e10cSrcweir 
651*cdf0e10cSrcweir         aMenu.SetSelectHdl( LINK( this, IMapWindow, MenuSelectHdl ) );
652*cdf0e10cSrcweir         aMenu.Execute( this, rCEvt.GetMousePosPixel() );
653*cdf0e10cSrcweir     }
654*cdf0e10cSrcweir     else
655*cdf0e10cSrcweir         Window::Command(rCEvt);
656*cdf0e10cSrcweir }
657*cdf0e10cSrcweir 
658*cdf0e10cSrcweir /*************************************************************************
659*cdf0e10cSrcweir |*
660*cdf0e10cSrcweir |*
661*cdf0e10cSrcweir |*
662*cdf0e10cSrcweir \************************************************************************/
663*cdf0e10cSrcweir 
664*cdf0e10cSrcweir sal_Int8 IMapWindow::AcceptDrop( const AcceptDropEvent& rEvt )
665*cdf0e10cSrcweir {
666*cdf0e10cSrcweir     return( ( GetHitSdrObj( rEvt.maPosPixel ) != NULL ) ? rEvt.mnAction : DND_ACTION_NONE );
667*cdf0e10cSrcweir }
668*cdf0e10cSrcweir 
669*cdf0e10cSrcweir /*************************************************************************
670*cdf0e10cSrcweir |*
671*cdf0e10cSrcweir |*
672*cdf0e10cSrcweir |*
673*cdf0e10cSrcweir \************************************************************************/
674*cdf0e10cSrcweir 
675*cdf0e10cSrcweir sal_Int8 IMapWindow::ExecuteDrop( const ExecuteDropEvent& rEvt )
676*cdf0e10cSrcweir {
677*cdf0e10cSrcweir     sal_Int8 nRet = DND_ACTION_NONE;
678*cdf0e10cSrcweir 
679*cdf0e10cSrcweir     if( IsDropFormatSupported( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ) )
680*cdf0e10cSrcweir     {
681*cdf0e10cSrcweir         const String    aString;
682*cdf0e10cSrcweir         INetBookmark    aBookMark( aString, aString );
683*cdf0e10cSrcweir         SdrObject*      pSdrObj = GetHitSdrObj( rEvt.maPosPixel );
684*cdf0e10cSrcweir 
685*cdf0e10cSrcweir         if( pSdrObj && TransferableDataHelper( rEvt.maDropEvent.Transferable ).GetINetBookmark( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK, aBookMark ) )
686*cdf0e10cSrcweir         {
687*cdf0e10cSrcweir             IMapObject* pIMapObj = GetIMapObj( pSdrObj );
688*cdf0e10cSrcweir 
689*cdf0e10cSrcweir             pIMapObj->SetURL( aBookMark.GetURL() );
690*cdf0e10cSrcweir             pIMapObj->SetAltText( aBookMark.GetDescription() );
691*cdf0e10cSrcweir             pModel->SetChanged( sal_True );
692*cdf0e10cSrcweir             pView->UnmarkAll();
693*cdf0e10cSrcweir             pView->MarkObj( pSdrObj, pView->GetSdrPageView() );
694*cdf0e10cSrcweir             UpdateInfo( sal_True );
695*cdf0e10cSrcweir             nRet =  rEvt.mnAction;
696*cdf0e10cSrcweir         }
697*cdf0e10cSrcweir     }
698*cdf0e10cSrcweir 
699*cdf0e10cSrcweir     return nRet;
700*cdf0e10cSrcweir }
701*cdf0e10cSrcweir 
702*cdf0e10cSrcweir /*************************************************************************
703*cdf0e10cSrcweir |*
704*cdf0e10cSrcweir |*
705*cdf0e10cSrcweir |*
706*cdf0e10cSrcweir \************************************************************************/
707*cdf0e10cSrcweir 
708*cdf0e10cSrcweir void IMapWindow::RequestHelp( const HelpEvent& rHEvt )
709*cdf0e10cSrcweir {
710*cdf0e10cSrcweir     SdrObject*          pSdrObj = NULL;
711*cdf0e10cSrcweir     SdrPageView*        pPageView = NULL;
712*cdf0e10cSrcweir     Point               aPos = PixelToLogic( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ) );
713*cdf0e10cSrcweir 
714*cdf0e10cSrcweir     if ( Help::IsBalloonHelpEnabled() || Help::IsQuickHelpEnabled() )
715*cdf0e10cSrcweir     {
716*cdf0e10cSrcweir         if ( pView->PickObj( aPos, pView->getHitTolLog(), pSdrObj, pPageView ) )
717*cdf0e10cSrcweir         {
718*cdf0e10cSrcweir             const IMapObject*   pIMapObj = GetIMapObj( pSdrObj );
719*cdf0e10cSrcweir             String              aStr;
720*cdf0e10cSrcweir 
721*cdf0e10cSrcweir             if ( pIMapObj && ( aStr = pIMapObj->GetURL() ).Len() )
722*cdf0e10cSrcweir             {
723*cdf0e10cSrcweir                 String      aDescr( pIMapObj->GetAltText() );
724*cdf0e10cSrcweir                 Rectangle   aLogicPix( LogicToPixel( Rectangle( Point(), GetGraphicSize() ) ) );
725*cdf0e10cSrcweir                 Rectangle   aScreenRect( OutputToScreenPixel( aLogicPix.TopLeft() ),
726*cdf0e10cSrcweir                                          OutputToScreenPixel( aLogicPix.BottomRight() ) );
727*cdf0e10cSrcweir 
728*cdf0e10cSrcweir                 if ( Help::IsBalloonHelpEnabled() )
729*cdf0e10cSrcweir                     Help::ShowBalloon( this, rHEvt.GetMousePosPixel(), aScreenRect, aStr );
730*cdf0e10cSrcweir                 else if ( Help::IsQuickHelpEnabled() )
731*cdf0e10cSrcweir                     Help::ShowQuickHelp( this, aScreenRect, aStr );
732*cdf0e10cSrcweir             }
733*cdf0e10cSrcweir         }
734*cdf0e10cSrcweir         else
735*cdf0e10cSrcweir             Window::RequestHelp( rHEvt );
736*cdf0e10cSrcweir     }
737*cdf0e10cSrcweir }
738*cdf0e10cSrcweir 
739*cdf0e10cSrcweir /*************************************************************************
740*cdf0e10cSrcweir |*
741*cdf0e10cSrcweir |*
742*cdf0e10cSrcweir |*
743*cdf0e10cSrcweir \************************************************************************/
744*cdf0e10cSrcweir 
745*cdf0e10cSrcweir void IMapWindow::SetCurrentObjState( sal_Bool bActive )
746*cdf0e10cSrcweir {
747*cdf0e10cSrcweir     SdrObject* pObj = GetSelectedSdrObject();
748*cdf0e10cSrcweir 
749*cdf0e10cSrcweir     if ( pObj )
750*cdf0e10cSrcweir     {
751*cdf0e10cSrcweir         SfxItemSet aSet( pModel->GetItemPool() );
752*cdf0e10cSrcweir 
753*cdf0e10cSrcweir         GetIMapObj( pObj )->SetActive( bActive );
754*cdf0e10cSrcweir 
755*cdf0e10cSrcweir         aSet.Put( XFillColorItem( String(), TRANSCOL ) );
756*cdf0e10cSrcweir 
757*cdf0e10cSrcweir         if ( !bActive )
758*cdf0e10cSrcweir         {
759*cdf0e10cSrcweir             aSet.Put( XFillTransparenceItem( 100 ) );
760*cdf0e10cSrcweir             aSet.Put( XLineColorItem( String(), Color( COL_RED ) ) );
761*cdf0e10cSrcweir         }
762*cdf0e10cSrcweir         else
763*cdf0e10cSrcweir         {
764*cdf0e10cSrcweir             aSet.Put( XFillTransparenceItem( 50 ) );
765*cdf0e10cSrcweir             aSet.Put( XLineColorItem( String(), Color( COL_BLACK ) ) );
766*cdf0e10cSrcweir         }
767*cdf0e10cSrcweir 
768*cdf0e10cSrcweir         pView->SetAttributes( aSet, sal_False );
769*cdf0e10cSrcweir     }
770*cdf0e10cSrcweir }
771*cdf0e10cSrcweir 
772*cdf0e10cSrcweir /*************************************************************************
773*cdf0e10cSrcweir |*
774*cdf0e10cSrcweir |*
775*cdf0e10cSrcweir |*
776*cdf0e10cSrcweir \************************************************************************/
777*cdf0e10cSrcweir 
778*cdf0e10cSrcweir void IMapWindow::UpdateInfo( sal_Bool bNewObj )
779*cdf0e10cSrcweir {
780*cdf0e10cSrcweir     if ( aInfoLink.IsSet() )
781*cdf0e10cSrcweir     {
782*cdf0e10cSrcweir         const SdrObject*    pSdrObj = GetSelectedSdrObject();
783*cdf0e10cSrcweir         const IMapObject*   pIMapObj = pSdrObj ? GetIMapObj( pSdrObj ) : NULL;
784*cdf0e10cSrcweir 
785*cdf0e10cSrcweir         aInfo.bNewObj = bNewObj;
786*cdf0e10cSrcweir 
787*cdf0e10cSrcweir         if ( pIMapObj )
788*cdf0e10cSrcweir         {
789*cdf0e10cSrcweir             aInfo.bOneMarked = sal_True;
790*cdf0e10cSrcweir             aInfo.aMarkURL = pIMapObj->GetURL();
791*cdf0e10cSrcweir             aInfo.aMarkAltText = pIMapObj->GetAltText();
792*cdf0e10cSrcweir             aInfo.aMarkTarget = pIMapObj->GetTarget();
793*cdf0e10cSrcweir             aInfo.bActivated = pIMapObj->IsActive();
794*cdf0e10cSrcweir             aInfoLink.Call( this );
795*cdf0e10cSrcweir         }
796*cdf0e10cSrcweir         else
797*cdf0e10cSrcweir         {
798*cdf0e10cSrcweir             aInfo.aMarkURL = aInfo.aMarkAltText = aInfo.aMarkTarget = String();
799*cdf0e10cSrcweir             aInfo.bOneMarked = sal_False;
800*cdf0e10cSrcweir             aInfo.bActivated = sal_False;
801*cdf0e10cSrcweir         }
802*cdf0e10cSrcweir 
803*cdf0e10cSrcweir         aInfoLink.Call( this );
804*cdf0e10cSrcweir     }
805*cdf0e10cSrcweir }
806*cdf0e10cSrcweir 
807*cdf0e10cSrcweir /*************************************************************************
808*cdf0e10cSrcweir |*
809*cdf0e10cSrcweir |*
810*cdf0e10cSrcweir |*
811*cdf0e10cSrcweir \************************************************************************/
812*cdf0e10cSrcweir 
813*cdf0e10cSrcweir void IMapWindow::DoMacroAssign()
814*cdf0e10cSrcweir {
815*cdf0e10cSrcweir     SdrObject*  pSdrObj = GetSelectedSdrObject();
816*cdf0e10cSrcweir 
817*cdf0e10cSrcweir     if ( pSdrObj )
818*cdf0e10cSrcweir     {
819*cdf0e10cSrcweir         SfxItemSet      aSet( *pIMapPool, SID_ATTR_MACROITEM, SID_ATTR_MACROITEM, SID_EVENTCONFIG, SID_EVENTCONFIG, 0 );
820*cdf0e10cSrcweir 
821*cdf0e10cSrcweir         SfxEventNamesItem aNamesItem(SID_EVENTCONFIG);
822*cdf0e10cSrcweir         aNamesItem.AddEvent( String::CreateFromAscii( "MouseOver" ), String(), SFX_EVENT_MOUSEOVER_OBJECT );
823*cdf0e10cSrcweir         aNamesItem.AddEvent( String::CreateFromAscii( "MouseOut" ), String(), SFX_EVENT_MOUSEOUT_OBJECT );
824*cdf0e10cSrcweir         aSet.Put( aNamesItem );
825*cdf0e10cSrcweir 
826*cdf0e10cSrcweir         SvxMacroItem    aMacroItem(SID_ATTR_MACROITEM);
827*cdf0e10cSrcweir         IMapObject*     pIMapObj = GetIMapObj( pSdrObj );
828*cdf0e10cSrcweir         aMacroItem.SetMacroTable( pIMapObj->GetMacroTable() );
829*cdf0e10cSrcweir         aSet.Put( aMacroItem, SID_ATTR_MACROITEM );
830*cdf0e10cSrcweir 
831*cdf0e10cSrcweir         SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
832*cdf0e10cSrcweir         SfxAbstractDialog* pMacroDlg = pFact->CreateSfxDialog( this, aSet, mxDocumentFrame, SID_EVENTCONFIG );
833*cdf0e10cSrcweir 
834*cdf0e10cSrcweir         if ( pMacroDlg && pMacroDlg->Execute() == RET_OK )
835*cdf0e10cSrcweir         {
836*cdf0e10cSrcweir             const SfxItemSet* pOutSet = pMacroDlg->GetOutputItemSet();
837*cdf0e10cSrcweir             pIMapObj->SetMacroTable( ((const SvxMacroItem& )pOutSet->Get( SID_ATTR_MACROITEM )).GetMacroTable() );
838*cdf0e10cSrcweir             pModel->SetChanged( sal_True );
839*cdf0e10cSrcweir             UpdateInfo( sal_False );
840*cdf0e10cSrcweir         }
841*cdf0e10cSrcweir 
842*cdf0e10cSrcweir         delete pMacroDlg;
843*cdf0e10cSrcweir     }
844*cdf0e10cSrcweir }
845*cdf0e10cSrcweir 
846*cdf0e10cSrcweir /*************************************************************************
847*cdf0e10cSrcweir |*
848*cdf0e10cSrcweir |*
849*cdf0e10cSrcweir |*
850*cdf0e10cSrcweir \************************************************************************/
851*cdf0e10cSrcweir 
852*cdf0e10cSrcweir void IMapWindow::DoPropertyDialog()
853*cdf0e10cSrcweir {
854*cdf0e10cSrcweir     SdrObject*  pSdrObj = GetSelectedSdrObject();
855*cdf0e10cSrcweir 
856*cdf0e10cSrcweir     if ( pSdrObj )
857*cdf0e10cSrcweir     {
858*cdf0e10cSrcweir         IMapObject* pIMapObj = GetIMapObj( pSdrObj );
859*cdf0e10cSrcweir         SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
860*cdf0e10cSrcweir         if(pFact)
861*cdf0e10cSrcweir         {
862*cdf0e10cSrcweir             AbstractURLDlg* aDlg = pFact->CreateURLDialog( this, pIMapObj->GetURL(), pIMapObj->GetAltText(), pIMapObj->GetDesc(),
863*cdf0e10cSrcweir                                             pIMapObj->GetTarget(), pIMapObj->GetName(), aTargetList );
864*cdf0e10cSrcweir             DBG_ASSERT(aDlg, "Dialogdiet fail!");
865*cdf0e10cSrcweir             if ( aDlg->Execute() == RET_OK )
866*cdf0e10cSrcweir             {
867*cdf0e10cSrcweir                 const String aURLText( aDlg->GetURL() );
868*cdf0e10cSrcweir 
869*cdf0e10cSrcweir                 if ( aURLText.Len() )
870*cdf0e10cSrcweir                 {
871*cdf0e10cSrcweir                     INetURLObject aObj( aURLText, INET_PROT_FILE );
872*cdf0e10cSrcweir                     DBG_ASSERT( aObj.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL" );
873*cdf0e10cSrcweir                     pIMapObj->SetURL( aObj.GetMainURL( INetURLObject::NO_DECODE ) );
874*cdf0e10cSrcweir                 }
875*cdf0e10cSrcweir                 else
876*cdf0e10cSrcweir                     pIMapObj->SetURL( aURLText );
877*cdf0e10cSrcweir 
878*cdf0e10cSrcweir                 pIMapObj->SetAltText( aDlg->GetAltText() );
879*cdf0e10cSrcweir                 pIMapObj->SetDesc( aDlg->GetDesc() );
880*cdf0e10cSrcweir                 pIMapObj->SetTarget( aDlg->GetTarget() );
881*cdf0e10cSrcweir                 pIMapObj->SetName( aDlg->GetName() );
882*cdf0e10cSrcweir                 pModel->SetChanged( sal_True );
883*cdf0e10cSrcweir                 UpdateInfo( sal_True );
884*cdf0e10cSrcweir             }
885*cdf0e10cSrcweir             delete aDlg; //add by CHINA001
886*cdf0e10cSrcweir         }
887*cdf0e10cSrcweir     }
888*cdf0e10cSrcweir }
889*cdf0e10cSrcweir 
890*cdf0e10cSrcweir /*************************************************************************
891*cdf0e10cSrcweir |*
892*cdf0e10cSrcweir |*
893*cdf0e10cSrcweir |*
894*cdf0e10cSrcweir \************************************************************************/
895*cdf0e10cSrcweir 
896*cdf0e10cSrcweir IMPL_LINK( IMapWindow, MenuSelectHdl, Menu*, pMenu )
897*cdf0e10cSrcweir {
898*cdf0e10cSrcweir     if (pMenu)
899*cdf0e10cSrcweir     {
900*cdf0e10cSrcweir         sal_uInt16  nId = pMenu->GetCurItemId();
901*cdf0e10cSrcweir 
902*cdf0e10cSrcweir         switch(nId)
903*cdf0e10cSrcweir         {
904*cdf0e10cSrcweir             case( MN_URL ):
905*cdf0e10cSrcweir                 DoPropertyDialog();
906*cdf0e10cSrcweir             break;
907*cdf0e10cSrcweir 
908*cdf0e10cSrcweir             case( MN_MACRO ):
909*cdf0e10cSrcweir                 DoMacroAssign();
910*cdf0e10cSrcweir             break;
911*cdf0e10cSrcweir 
912*cdf0e10cSrcweir             case( MN_ACTIVATE ):
913*cdf0e10cSrcweir             {
914*cdf0e10cSrcweir                 const sal_Bool bNewState = !pMenu->IsItemChecked( MN_ACTIVATE );
915*cdf0e10cSrcweir 
916*cdf0e10cSrcweir                 pMenu->CheckItem( MN_ACTIVATE, bNewState );
917*cdf0e10cSrcweir                 SetCurrentObjState( bNewState );
918*cdf0e10cSrcweir                 UpdateInfo( sal_False );
919*cdf0e10cSrcweir             }
920*cdf0e10cSrcweir 
921*cdf0e10cSrcweir             case( MN_FRAME_TO_TOP ):
922*cdf0e10cSrcweir                 pView->PutMarkedToTop();
923*cdf0e10cSrcweir             break;
924*cdf0e10cSrcweir 
925*cdf0e10cSrcweir             case( MN_MOREFRONT ):
926*cdf0e10cSrcweir                 pView->MovMarkedToTop();
927*cdf0e10cSrcweir             break;
928*cdf0e10cSrcweir 
929*cdf0e10cSrcweir             case( MN_MOREBACK ):
930*cdf0e10cSrcweir                 pView->MovMarkedToBtm();
931*cdf0e10cSrcweir             break;
932*cdf0e10cSrcweir 
933*cdf0e10cSrcweir             case( MN_FRAME_TO_BOTTOM ):
934*cdf0e10cSrcweir                 pView->PutMarkedToBtm();
935*cdf0e10cSrcweir             break;
936*cdf0e10cSrcweir 
937*cdf0e10cSrcweir             case( MN_MARK_ALL ):
938*cdf0e10cSrcweir                 pView->MarkAll();
939*cdf0e10cSrcweir             break;
940*cdf0e10cSrcweir 
941*cdf0e10cSrcweir             case( MN_DELETE1 ):
942*cdf0e10cSrcweir                 pView->DeleteMarked();
943*cdf0e10cSrcweir 
944*cdf0e10cSrcweir             default :
945*cdf0e10cSrcweir             break;
946*cdf0e10cSrcweir         }
947*cdf0e10cSrcweir     }
948*cdf0e10cSrcweir 
949*cdf0e10cSrcweir     return 0;
950*cdf0e10cSrcweir }
951*cdf0e10cSrcweir 
952*cdf0e10cSrcweir void IMapWindow::CreateDefaultObject()
953*cdf0e10cSrcweir {
954*cdf0e10cSrcweir     SdrPageView* pPageView = pView->GetSdrPageView();
955*cdf0e10cSrcweir 
956*cdf0e10cSrcweir     if(pPageView)
957*cdf0e10cSrcweir     {
958*cdf0e10cSrcweir         // calc position and size
959*cdf0e10cSrcweir         Point aPagePos(0, 0); // = pPageView->GetOffset();
960*cdf0e10cSrcweir         Size aPageSize = pPageView->GetPage()->GetSize();
961*cdf0e10cSrcweir         sal_uInt32 nDefaultObjectSizeWidth = aPageSize.Width() / 4;
962*cdf0e10cSrcweir         sal_uInt32 nDefaultObjectSizeHeight = aPageSize.Height() / 4;
963*cdf0e10cSrcweir         aPagePos.X() += (aPageSize.Width() / 2) - (nDefaultObjectSizeWidth / 2);
964*cdf0e10cSrcweir         aPagePos.Y() += (aPageSize.Height() / 2) - (nDefaultObjectSizeHeight / 2);
965*cdf0e10cSrcweir         Rectangle aNewObjectRectangle(aPagePos, Size(nDefaultObjectSizeWidth, nDefaultObjectSizeHeight));
966*cdf0e10cSrcweir 
967*cdf0e10cSrcweir         SdrObject* pObj = SdrObjFactory::MakeNewObject( pView->GetCurrentObjInventor(), pView->GetCurrentObjIdentifier(), 0L, pModel);
968*cdf0e10cSrcweir         pObj->SetLogicRect(aNewObjectRectangle);
969*cdf0e10cSrcweir 
970*cdf0e10cSrcweir         switch( pObj->GetObjIdentifier() )
971*cdf0e10cSrcweir         {
972*cdf0e10cSrcweir         case OBJ_POLY:
973*cdf0e10cSrcweir         case OBJ_PATHPOLY:
974*cdf0e10cSrcweir             {
975*cdf0e10cSrcweir                 basegfx::B2DPolygon aInnerPoly;
976*cdf0e10cSrcweir                 aInnerPoly.append(basegfx::B2DPoint(aNewObjectRectangle.BottomLeft().X(), aNewObjectRectangle.BottomLeft().Y()));
977*cdf0e10cSrcweir                 aInnerPoly.append(basegfx::B2DPoint(aNewObjectRectangle.TopLeft().X(), aNewObjectRectangle.TopLeft().Y()));
978*cdf0e10cSrcweir                 aInnerPoly.append(basegfx::B2DPoint(aNewObjectRectangle.TopCenter().X(), aNewObjectRectangle.TopCenter().Y()));
979*cdf0e10cSrcweir                 aInnerPoly.append(basegfx::B2DPoint(aNewObjectRectangle.Center().X(), aNewObjectRectangle.Center().Y()));
980*cdf0e10cSrcweir                 aInnerPoly.append(basegfx::B2DPoint(aNewObjectRectangle.RightCenter().X(), aNewObjectRectangle.RightCenter().Y()));
981*cdf0e10cSrcweir                 aInnerPoly.append(basegfx::B2DPoint(aNewObjectRectangle.BottomRight().X(), aNewObjectRectangle.BottomRight().Y()));
982*cdf0e10cSrcweir                 aInnerPoly.setClosed(true);
983*cdf0e10cSrcweir                 ((SdrPathObj*)pObj)->SetPathPoly(basegfx::B2DPolyPolygon(aInnerPoly));
984*cdf0e10cSrcweir                 break;
985*cdf0e10cSrcweir             }
986*cdf0e10cSrcweir         case OBJ_FREEFILL:
987*cdf0e10cSrcweir         case OBJ_PATHFILL:
988*cdf0e10cSrcweir             {
989*cdf0e10cSrcweir                 sal_Int32 nWdt(aNewObjectRectangle.GetWidth() / 2);
990*cdf0e10cSrcweir                 sal_Int32 nHgt(aNewObjectRectangle.GetHeight() / 2);
991*cdf0e10cSrcweir                 basegfx::B2DPolygon aInnerPoly(XPolygon(aNewObjectRectangle.Center(), nWdt, nHgt).getB2DPolygon());
992*cdf0e10cSrcweir                 ((SdrPathObj*)pObj)->SetPathPoly(basegfx::B2DPolyPolygon(aInnerPoly));
993*cdf0e10cSrcweir                 break;
994*cdf0e10cSrcweir             }
995*cdf0e10cSrcweir 
996*cdf0e10cSrcweir         }
997*cdf0e10cSrcweir 
998*cdf0e10cSrcweir         pView->InsertObjectAtView(pObj, *pPageView);
999*cdf0e10cSrcweir         SdrObjCreated( *pObj );
1000*cdf0e10cSrcweir         SetCurrentObjState( true );
1001*cdf0e10cSrcweir         pView->MarkObj( pObj, pPageView );
1002*cdf0e10cSrcweir     }
1003*cdf0e10cSrcweir }
1004*cdf0e10cSrcweir 
1005*cdf0e10cSrcweir void IMapWindow::KeyInput( const KeyEvent& rKEvt )
1006*cdf0e10cSrcweir {
1007*cdf0e10cSrcweir     KeyCode aCode = rKEvt.GetKeyCode();
1008*cdf0e10cSrcweir 
1009*cdf0e10cSrcweir /*
1010*cdf0e10cSrcweir     switch(aCode.GetCode())
1011*cdf0e10cSrcweir     {
1012*cdf0e10cSrcweir         case KEY_ESCAPE:
1013*cdf0e10cSrcweir         {
1014*cdf0e10cSrcweir             if ( pView->IsAction() )
1015*cdf0e10cSrcweir             {
1016*cdf0e10cSrcweir                 pView->BrkAction();
1017*cdf0e10cSrcweir                 return;
1018*cdf0e10cSrcweir             }
1019*cdf0e10cSrcweir             else if ( pView->AreObjectsMarked() )
1020*cdf0e10cSrcweir             {
1021*cdf0e10cSrcweir                 const SdrHdlList& rHdlList = pView->GetHdlList();
1022*cdf0e10cSrcweir                 SdrHdl* pHdl = rHdlList.GetFocusHdl();
1023*cdf0e10cSrcweir 
1024*cdf0e10cSrcweir                 if(pHdl)
1025*cdf0e10cSrcweir                 {
1026*cdf0e10cSrcweir                     ((SdrHdlList&)rHdlList).ResetFocusHdl();
1027*cdf0e10cSrcweir                 }
1028*cdf0e10cSrcweir                 else
1029*cdf0e10cSrcweir                 {
1030*cdf0e10cSrcweir                     pView->UnmarkAllObj();
1031*cdf0e10cSrcweir                     ((Dialog*)GetParent())->GrabFocusToFirstControl();
1032*cdf0e10cSrcweir                 }
1033*cdf0e10cSrcweir 
1034*cdf0e10cSrcweir                 return;
1035*cdf0e10cSrcweir             }
1036*cdf0e10cSrcweir         }
1037*cdf0e10cSrcweir         break;
1038*cdf0e10cSrcweir 
1039*cdf0e10cSrcweir     }
1040*cdf0e10cSrcweir */
1041*cdf0e10cSrcweir     GraphCtrl::KeyInput( rKEvt );
1042*cdf0e10cSrcweir }
1043*cdf0e10cSrcweir 
1044*cdf0e10cSrcweir void IMapWindow::SelectFirstObject()
1045*cdf0e10cSrcweir {
1046*cdf0e10cSrcweir     SdrPage*    pPage = (SdrPage*) pModel->GetPage( 0 );
1047*cdf0e10cSrcweir     if( pPage->GetObjCount() != 0 )
1048*cdf0e10cSrcweir     {
1049*cdf0e10cSrcweir         GrabFocus();
1050*cdf0e10cSrcweir         pView->UnmarkAllObj();
1051*cdf0e10cSrcweir         pView->MarkNextObj(sal_True);
1052*cdf0e10cSrcweir     }
1053*cdf0e10cSrcweir }
1054*cdf0e10cSrcweir 
1055*cdf0e10cSrcweir void IMapWindow::StartPolyEdit()
1056*cdf0e10cSrcweir {
1057*cdf0e10cSrcweir     GrabFocus();
1058*cdf0e10cSrcweir 
1059*cdf0e10cSrcweir     if( !pView->AreObjectsMarked() )
1060*cdf0e10cSrcweir         pView->MarkNextObj(sal_True);
1061*cdf0e10cSrcweir 
1062*cdf0e10cSrcweir     const SdrHdlList& rHdlList = pView->GetHdlList();
1063*cdf0e10cSrcweir     SdrHdl* pHdl = rHdlList.GetFocusHdl();
1064*cdf0e10cSrcweir 
1065*cdf0e10cSrcweir     if(!pHdl)
1066*cdf0e10cSrcweir     {
1067*cdf0e10cSrcweir         ((SdrHdlList&)rHdlList).TravelFocusHdl(true);
1068*cdf0e10cSrcweir     }
1069*cdf0e10cSrcweir }
1070