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