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