xref: /trunk/main/svx/source/dialog/imapdlg.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 
31 #define _SDR_NOITEMS
32 #define _SDR_NOTOUCH
33 #define _SDR_NOTRANSFORM
34 #define _SDR_NOOBJECTS
35 #define _SDR_NOVIEWMARKER
36 #define _SDR_NODRAGMETHODS
37 #define _SDR_NOUNDO
38 #define _SDR_NOXOUTDEV
39 
40 #include <stdlib.h>
41 #include <tools/shl.hxx>
42 #ifndef _EINF_HXX
43 #include <tools/errinf.hxx>
44 #endif
45 #include <tools/urlobj.hxx>
46 #ifndef _UNOTOOLS_UCBSTREAMHELPER_HXX
47 #include <unotools/ucbstreamhelper.hxx>
48 #endif
49 #include <vcl/msgbox.hxx>
50 #include <vcl/group.hxx>
51 #include <vcl/lstbox.hxx>
52 #include <svl/eitem.hxx>
53 #include <unotools/pathoptions.hxx>
54 #include <sfx2/dispatch.hxx>
55 #include <sfx2/module.hxx>
56 #include <sfx2/filedlghelper.hxx>
57 #include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
58 #include <svl/urihelper.hxx>
59 #include <svtools/miscopt.hxx>
60 #include <svtools/ehdl.hxx>
61 #include <svtools/sfxecode.hxx>
62 #include <sfx2/viewfrm.hxx>
63 #include <sfx2/objsh.hxx>
64 #include <sfx2/docfile.hxx>
65 #include <unotools/localedatawrapper.hxx>
66 #ifndef _UNOTOOLS_PROCESSFACTORY_HXX
67 #include <comphelper/processfactory.hxx>
68 #endif
69 
70 #define _IMAPDLG_PRIVATE
71 #include "svx/imapdlg.hxx"
72 
73 #include <svx/dialmgr.hxx>
74 #include <svx/dialogs.hrc>
75 #include <svx/svxids.hrc>
76 #include "imapdlg.hrc"
77 #include "imapwnd.hxx"
78 #include "imapimp.hxx"
79 #include "svx/dlgutil.hxx"
80 #include <svx/svdtrans.hxx>
81 #include <svx/svdopath.hxx>
82 #include <vcl/svapp.hxx>
83 
84 #define SELF_TARGET         "_self"
85 #define IMAP_ALL_FILTER     "<Alle>"
86 #define IMAP_CERN_FILTER    "MAP - CERN"
87 #define IMAP_NCSA_FILTER    "MAP - NCSA"
88 #define IMAP_BINARY_FILTER  "SIP - StarView ImageMap"
89 #define IMAP_ALL_TYPE       "*.*"
90 #define IMAP_BINARY_TYPE    "*.sip"
91 #define IMAP_CERN_TYPE      "*.map"
92 #define IMAP_NCSA_TYPE      "*.map"
93 #define IMAP_BINARY_EXT     "sip"
94 #define IMAP_CERN_EXT       "map"
95 #define IMAP_NCSA_EXT       "map"
96 
97 /******************************************************************************/
98 
99 SFX_IMPL_MODELESSDIALOG( SvxIMapDlgChildWindow, SID_IMAP );
100 
101 /******************************************************************************/
102 
103 inline String GetUnitString( long nVal_100, FieldUnit eFieldUnit, sal_Unicode cSep )
104 {
105     String aVal = UniString::CreateFromInt64( MetricField::ConvertValue( nVal_100, 2, MAP_100TH_MM, eFieldUnit ) );
106 
107     while( aVal.Len() < 3 )
108         aVal.Insert( sal_Unicode('0'), 0 );
109 
110     aVal.Insert( cSep, aVal.Len() - 2 );
111     aVal += sal_Unicode(' ');
112     aVal += SdrFormatter::GetUnitStr( eFieldUnit );
113 
114     return aVal;
115 }
116 
117 /*************************************************************************
118 |*
119 |* ControllerItem
120 |*
121 \************************************************************************/
122 
123 SvxIMapDlgItem::SvxIMapDlgItem( sal_uInt16 _nId, SvxIMapDlg& rIMapDlg, SfxBindings& rBindings ) :
124             SfxControllerItem   ( _nId, rBindings ),
125             rIMap               ( rIMapDlg )
126 {
127 }
128 
129 /*************************************************************************
130 |*
131 |* StateChanged-Methode
132 |*
133 \************************************************************************/
134 
135 void SvxIMapDlgItem::StateChanged( sal_uInt16 nSID, SfxItemState /*eState*/,
136                                    const SfxPoolItem* pItem )
137 {
138     if ( ( nSID == SID_IMAP_EXEC ) && pItem )
139     {
140         const SfxBoolItem* pStateItem = PTR_CAST( SfxBoolItem, pItem );
141 
142         DBG_ASSERT( pStateItem || pItem == 0, "SfxBoolItem erwartet");
143 
144         // Float ggf. disablen
145         rIMap.SetExecState( !pStateItem->GetValue() );
146     }
147 }
148 
149 /*************************************************************************
150 |*
151 |*
152 |*
153 \************************************************************************/
154 
155 SvxIMapDlgChildWindow::SvxIMapDlgChildWindow( Window* _pParent, sal_uInt16 nId,
156                                               SfxBindings* pBindings,
157                                               SfxChildWinInfo* pInfo ) :
158             SfxChildWindow( _pParent, nId )
159 {
160     pWindow = new SvxIMapDlg( pBindings, this, _pParent, SVX_RES( RID_SVXDLG_IMAP ) );
161     SvxIMapDlg* pDlg = (SvxIMapDlg*) pWindow;
162 
163     if ( pInfo->nFlags & SFX_CHILDWIN_ZOOMIN )
164         pDlg->RollUp();
165 
166     eChildAlignment = SFX_ALIGN_NOALIGNMENT;
167 
168     pDlg->Initialize( pInfo );
169 }
170 
171 
172 /*************************************************************************
173 |*
174 |*
175 |*
176 \************************************************************************/
177 
178 void SvxIMapDlgChildWindow::UpdateIMapDlg( const Graphic& rGraphic, const ImageMap* pImageMap,
179                                            const TargetList* pTargetList, void* pEditingObj )
180 {
181     if ( SfxViewFrame::Current() &&
182          SfxViewFrame::Current()->HasChildWindow( SvxIMapDlgChildWindow::GetChildWindowId() ) )
183         SVXIMAPDLG()->Update( rGraphic, pImageMap, pTargetList, pEditingObj );
184 }
185 
186 
187 /*************************************************************************
188 |*
189 |*
190 |*
191 \************************************************************************/
192 
193 SvxIMapDlg::SvxIMapDlg( SfxBindings *_pBindings, SfxChildWindow *pCW,
194                         Window* _pParent, const ResId& rResId ) :
195         SfxModelessDialog   ( _pBindings, pCW, _pParent, rResId ),
196 
197         aTbxIMapDlg1        ( this, SVX_RES( TBX_IMAPDLG1 ) ),
198         aFtURL              ( this, SVX_RES( FT_URL ) ),
199         maURLBox            ( this, SVX_RES( CBB_URL ) ),
200         aFtText             ( this, SVX_RES( FT_TEXT ) ),
201         aEdtText            ( this, SVX_RES( EDT_TEXT ) ),
202         maFtTarget          ( this, SVX_RES( RID_SVXCTL_FT_TARGET ) ),
203         maCbbTarget         ( this, SVX_RES( RID_SVXCTL_CBB_TARGET ) ),
204         aStbStatus          ( this, WB_BORDER | WB_3DLOOK | WB_LEFT ),
205         maImageList         ( SVX_RES( IL_IMAPDLG ) ),
206         maImageListH        ( SVX_RES( ILH_IMAPDLG ) ),
207         pCheckObj           ( NULL ),
208         aIMapItem           ( SID_IMAP_EXEC, *this, *_pBindings )
209 {
210     pIMapWnd = new IMapWindow( this, SVX_RES( RID_SVXCTL_IMAP ), _pBindings->GetActiveFrame() );
211 
212     ApplyImageList();
213 
214     FreeResource();
215 
216     pOwnData = new IMapOwnData( this );
217 
218     pIMapWnd->SetInfoLink( LINK( this, SvxIMapDlg, InfoHdl ) );
219     pIMapWnd->SetMousePosLink( LINK( this, SvxIMapDlg, MousePosHdl ) );
220     pIMapWnd->SetGraphSizeLink( LINK( this, SvxIMapDlg, GraphSizeHdl ) );
221     pIMapWnd->SetUpdateLink( LINK( this, SvxIMapDlg, StateHdl ) );
222 
223     maURLBox.SetModifyHdl( LINK( this, SvxIMapDlg, URLModifyHdl ) );
224     maURLBox.SetSelectHdl( LINK( this, SvxIMapDlg, URLModifyHdl ) );
225     maURLBox.SetLoseFocusHdl( LINK( this, SvxIMapDlg, URLLoseFocusHdl ) );
226     aEdtText.SetModifyHdl( LINK( this, SvxIMapDlg, URLModifyHdl ) );
227     maCbbTarget.SetLoseFocusHdl( LINK( this, SvxIMapDlg, URLLoseFocusHdl ) );
228 
229     SvtMiscOptions aMiscOptions;
230     aMiscOptions.AddListenerLink( LINK( this, SvxIMapDlg, MiscHdl ) );
231 
232     aTbxIMapDlg1.SetOutStyle( aMiscOptions.GetToolboxStyle() );
233     aTbxIMapDlg1.SetSizePixel( aTbxIMapDlg1.CalcWindowSizePixel() );
234     aTbxIMapDlg1.SetSelectHdl( LINK( this, SvxIMapDlg, TbxClickHdl ) );
235     aTbxIMapDlg1.CheckItem( TBI_SELECT, sal_True );
236     TbxClickHdl( &aTbxIMapDlg1 );
237 
238     SetMinOutputSizePixel( aLastSize = GetOutputSizePixel() );
239 
240     aStbStatus.InsertItem( 1, 130, SIB_LEFT | SIB_IN | SIB_AUTOSIZE );
241     aStbStatus.InsertItem( 2, 10 + GetTextWidth( DEFINE_CONST_UNICODE( " 9999,99 cm / 9999,99 cm ") ), SIB_CENTER | SIB_IN );
242     aStbStatus.InsertItem( 3, 10 + GetTextWidth( DEFINE_CONST_UNICODE( " 9999,99 cm x 9999,99 cm ") ), SIB_CENTER | SIB_IN );
243 
244     aFtURL.Disable();
245     maURLBox.Disable();
246     aFtText.Disable();
247     aEdtText.Disable();
248     maFtTarget.Disable();
249     maCbbTarget.Disable();
250     pOwnData->bExecState = sal_False;
251 
252     Resize();
253 
254     pOwnData->aTimer.SetTimeout( 100 );
255     pOwnData->aTimer.SetTimeoutHdl( LINK( this, SvxIMapDlg, UpdateHdl ) );
256 
257     aTbxIMapDlg1.EnableItem( TBI_ACTIVE, sal_False );
258     aTbxIMapDlg1.EnableItem( TBI_MACRO, sal_False );
259     aTbxIMapDlg1.EnableItem( TBI_PROPERTY, sal_False );
260 }
261 
262 
263 /*************************************************************************
264 |*
265 |* Dtor
266 |*
267 \************************************************************************/
268 
269 SvxIMapDlg::~SvxIMapDlg()
270 {
271     // URL-Liste loeschen
272     delete pIMapWnd;
273     delete pOwnData;
274 }
275 
276 
277 /*************************************************************************
278 |*
279 |* Resize-Methode
280 |*
281 \************************************************************************/
282 
283 void SvxIMapDlg::Resize()
284 {
285     SfxModelessDialog::Resize();
286 
287     Size aMinSize( GetMinOutputSizePixel() );
288     Size aNewSize( GetOutputSizePixel() );
289 
290     if ( aNewSize.Height() >= aMinSize.Height() )
291     {
292         Size    _aSize( aStbStatus.GetSizePixel() );
293         Point   aPoint( 0, aNewSize.Height() - _aSize.Height() );
294 
295         // StatusBar positionieren
296         aStbStatus.SetPosSizePixel( aPoint, Size( aNewSize.Width(), _aSize.Height() ) );
297         aStbStatus.Show();
298 
299         // EditWindow positionieren
300         _aSize.Width() = aNewSize.Width() - 18;
301         _aSize.Height() = aPoint.Y() - pIMapWnd->GetPosPixel().Y() - 6;
302         pIMapWnd->SetSizePixel( _aSize );
303 
304         aLastSize = aNewSize;
305     }
306 }
307 
308 
309 /*************************************************************************
310 |*
311 |* Close-Methode
312 |*
313 \************************************************************************/
314 
315 sal_Bool SvxIMapDlg::Close()
316 {
317     sal_Bool bRet = sal_True;
318 
319     if ( aTbxIMapDlg1.IsItemEnabled( TBI_APPLY ) )
320     {
321         QueryBox    aQBox( this, WB_YES_NO_CANCEL | WB_DEF_YES,
322                            String( SVX_RES( STR_IMAPDLG_MODIFY ) ) );
323         const long  nRet = aQBox.Execute();
324 
325         if( nRet == RET_YES )
326         {
327             SfxBoolItem aBoolItem( SID_IMAP_EXEC, sal_True );
328             GetBindings().GetDispatcher()->Execute(
329                 SID_IMAP_EXEC, SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD, &aBoolItem, 0L );
330         }
331         else if( nRet == RET_CANCEL )
332             bRet = sal_False;
333     }
334     else if( pIMapWnd->IsChanged() )
335     {
336         QueryBox    aQBox( this, WB_YES_NO_CANCEL | WB_DEF_YES,
337                            String( SVX_RES( STR_IMAPDLG_SAVE ) ) );
338         const long  nRet = aQBox.Execute();
339 
340         if( nRet == RET_YES )
341             bRet = DoSave();
342         else if( nRet == RET_CANCEL )
343             bRet = sal_False;
344     }
345 
346     return( bRet ? SfxModelessDialog::Close() : sal_False );
347 }
348 
349 
350 /*************************************************************************
351 |*
352 |* Enabled oder disabled alle Controls
353 |*
354 \************************************************************************/
355 
356 void SvxIMapDlg::SetExecState( sal_Bool bEnable )
357 {
358     pOwnData->bExecState = bEnable;
359 }
360 
361 
362 /*************************************************************************
363 |*
364 |*
365 |*
366 \************************************************************************/
367 
368 void SvxIMapDlg::SetGraphic( const Graphic& rGraphic )
369 {
370     pIMapWnd->SetGraphic( rGraphic );
371 }
372 
373 
374 /*************************************************************************
375 |*
376 |*
377 |*
378 \************************************************************************/
379 
380 void SvxIMapDlg::SetImageMap( const ImageMap& rImageMap )
381 {
382     pIMapWnd->SetImageMap( rImageMap );
383 }
384 
385 
386 /*************************************************************************
387 |*
388 |*
389 |*
390 \************************************************************************/
391 
392 const ImageMap& SvxIMapDlg::GetImageMap() const
393 {
394     return pIMapWnd->GetImageMap();
395 }
396 
397 
398 /*************************************************************************
399 |*
400 |*
401 |*
402 \************************************************************************/
403 
404 void SvxIMapDlg::SetTargetList( const TargetList& rTargetList )
405 {
406     TargetList  aNewList( rTargetList );
407 
408     pIMapWnd->SetTargetList( aNewList );
409 
410     maCbbTarget.Clear();
411 
412     for( String* pStr = aNewList.First(); pStr; pStr = aNewList.Next() )
413         maCbbTarget.InsertEntry( *pStr );
414 }
415 
416 
417 /*************************************************************************
418 |*
419 |*
420 |*
421 \************************************************************************/
422 
423 const TargetList& SvxIMapDlg::GetTargetList() const
424 {
425     return pIMapWnd->GetTargetList();
426 }
427 
428 
429 /*************************************************************************
430 |*
431 |*
432 |*
433 \************************************************************************/
434 
435 void SvxIMapDlg::Update( const Graphic& rGraphic, const ImageMap* pImageMap,
436                          const TargetList* pTargetList, void* pEditingObj )
437 {
438     pOwnData->aUpdateGraphic = rGraphic;
439 
440     if ( pImageMap )
441         pOwnData->aUpdateImageMap = *pImageMap;
442     else
443         pOwnData->aUpdateImageMap.ClearImageMap();
444 
445     pOwnData->pUpdateEditingObject = pEditingObj;
446 
447     // UpdateTargetList loeschen, da diese Methode
448     // vor dem Zuschlagen des Update-Timers noch
449     // mehrmals gerufen werden kann( #46540 )
450     for( String* pStr = pOwnData->aUpdateTargetList.First(); pStr; pStr = pOwnData->aUpdateTargetList.Next() )
451         delete pStr;
452     pOwnData->aUpdateTargetList.Clear();
453 
454     // TargetListe muss kopiert werden, da sie im
455     // Besitz des Aufrufers ist und von ihm nach diesem
456     // Aufruf sofort geloescht werden kann;
457     // die kopierte Liste wird im Handler wieder geloescht
458     if( pTargetList )
459     {
460         TargetList aTargetList( *pTargetList );
461 
462         for( String* pStr = aTargetList.First(); pStr; pStr = aTargetList.Next() )
463             pOwnData->aUpdateTargetList.Insert( new String( *pStr ) );
464     }
465 
466     pOwnData->aTimer.Start();
467 }
468 
469 
470 void SvxIMapDlg::KeyInput( const KeyEvent& rKEvt )
471 {
472         SfxModelessDialog::KeyInput( rKEvt );
473 }
474 
475 /*************************************************************************
476 |*
477 |* Click-Hdl fuer ToolBox
478 |*
479 \************************************************************************/
480 
481 IMPL_LINK( SvxIMapDlg, TbxClickHdl, ToolBox*, pTbx )
482 {
483     sal_uInt16 nNewItemId = pTbx->GetCurItemId();
484 
485     switch( pTbx->GetCurItemId() )
486     {
487         case( TBI_APPLY ):
488         {
489             URLLoseFocusHdl( NULL );
490             SfxBoolItem aBoolItem( SID_IMAP_EXEC, sal_True );
491             GetBindings().GetDispatcher()->Execute(
492                 SID_IMAP_EXEC, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aBoolItem, 0L );
493         }
494         break;
495 
496         case( TBI_OPEN ):
497             DoOpen();
498         break;
499 
500         case( TBI_SAVEAS ):
501             DoSave();
502         break;
503 
504         case( TBI_SELECT ):
505         {
506             pTbx->CheckItem( nNewItemId, sal_True );
507             pIMapWnd->SetEditMode( sal_True );
508             if( pTbx->IsKeyEvent() )
509             {
510                 if((pTbx->GetKeyModifier() & KEY_MOD1) != 0)
511                     pIMapWnd->SelectFirstObject();
512                 else
513                     pIMapWnd->GrabFocus();
514             }
515         }
516         break;
517 
518         case( TBI_RECT ):
519         {
520             pTbx->CheckItem( nNewItemId, sal_True );
521             pIMapWnd->SetObjKind( OBJ_RECT );
522             if( pTbx->IsKeyEvent() && ((pTbx->GetKeyModifier() & KEY_MOD1) != 0) )
523             {
524                 pIMapWnd->CreateDefaultObject();
525                 pIMapWnd->GrabFocus();
526             }
527         }
528         break;
529 
530         case( TBI_CIRCLE ):
531         {
532             pTbx->CheckItem( nNewItemId, sal_True );
533             pIMapWnd->SetObjKind( OBJ_CIRC );
534             if( pTbx->IsKeyEvent() && ((pTbx->GetKeyModifier() & KEY_MOD1) != 0) )
535             {
536                 pIMapWnd->CreateDefaultObject();
537                 pIMapWnd->GrabFocus();
538             }
539         }
540         break;
541 
542         case( TBI_POLY ):
543         {
544             pTbx->CheckItem( nNewItemId, sal_True );
545             pIMapWnd->SetObjKind( OBJ_POLY );
546             if( pTbx->IsKeyEvent() && ((pTbx->GetKeyModifier() & KEY_MOD1) != 0) )
547             {
548                 pIMapWnd->CreateDefaultObject();
549                 pIMapWnd->GrabFocus();
550             }
551         }
552         break;
553 
554         case( TBI_FREEPOLY ):
555         {
556             pTbx->CheckItem( nNewItemId, sal_True );
557             pIMapWnd->SetObjKind( OBJ_FREEFILL );
558             if( pTbx->IsKeyEvent() && ((pTbx->GetKeyModifier() & KEY_MOD1) != 0) )
559             {
560                 pIMapWnd->CreateDefaultObject();
561                 pIMapWnd->GrabFocus();
562             }
563         }
564         break;
565 
566         case( TBI_ACTIVE ):
567         {
568             URLLoseFocusHdl( NULL );
569             sal_Bool bNewState = !pTbx->IsItemChecked( TBI_ACTIVE );
570             pTbx->CheckItem( TBI_ACTIVE, bNewState );
571             pIMapWnd->SetCurrentObjState( !bNewState );
572         }
573         break;
574 
575         case( TBI_MACRO ):
576             pIMapWnd->DoMacroAssign();
577         break;
578 
579         case( TBI_PROPERTY ):
580             pIMapWnd->DoPropertyDialog();
581         break;
582 
583         case( TBI_POLYEDIT ):
584             pIMapWnd->SetPolyEditMode( pTbx->IsItemChecked( TBI_POLYEDIT ) ? SID_BEZIER_MOVE : 0 );
585             if( pTbx->IsKeyEvent() && pTbx->IsItemChecked( TBI_POLYEDIT ) )
586                 pIMapWnd->StartPolyEdit();
587         break;
588 
589         case( TBI_POLYMOVE ):
590             pIMapWnd->SetPolyEditMode( SID_BEZIER_MOVE );
591         break;
592 
593         case( TBI_POLYINSERT ):
594             pIMapWnd->SetPolyEditMode( SID_BEZIER_INSERT );
595         break;
596 
597         case( TBI_POLYDELETE ):
598             pIMapWnd->GetSdrView()->DeleteMarkedPoints();
599         break;
600 
601         case( TBI_UNDO ):
602         {
603             URLLoseFocusHdl( NULL );
604             pIMapWnd->GetSdrModel()->Undo();
605         }
606         break;
607 
608         case( TBI_REDO ):
609         {
610             URLLoseFocusHdl( NULL );
611             pIMapWnd->GetSdrModel()->Redo();
612         }
613         break;
614 
615         default:
616         break;
617     }
618 
619     return 0;
620 }
621 
622 
623 /*************************************************************************
624 |*
625 |*
626 |*
627 \************************************************************************/
628 
629 void SvxIMapDlg::DoOpen()
630 {
631     ::sfx2::FileDialogHelper aDlg(
632         com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, 0 );
633 
634     ImageMap        aLoadIMap;
635     const String    aFilter( DEFINE_CONST_UNICODE( IMAP_ALL_FILTER ) );
636 
637     aDlg.AddFilter( aFilter, DEFINE_CONST_UNICODE( IMAP_ALL_TYPE ) );
638     aDlg.AddFilter( DEFINE_CONST_UNICODE( IMAP_CERN_FILTER ), DEFINE_CONST_UNICODE( IMAP_CERN_TYPE ) );
639     aDlg.AddFilter( DEFINE_CONST_UNICODE( IMAP_NCSA_FILTER ), DEFINE_CONST_UNICODE( IMAP_NCSA_TYPE ) );
640     aDlg.AddFilter( DEFINE_CONST_UNICODE( IMAP_BINARY_FILTER ), DEFINE_CONST_UNICODE( IMAP_BINARY_TYPE ) );
641 
642     aDlg.SetCurrentFilter( aFilter );
643     aDlg.SetDisplayDirectory( SvtPathOptions().GetWorkPath() );
644 
645     if( aDlg.Execute() == ERRCODE_NONE )
646     {
647         INetURLObject aURL( aDlg.GetPath() );
648         DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
649         SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ );
650 
651         if( pIStm )
652         {
653             aLoadIMap.Read( *pIStm, IMAP_FORMAT_DETECT, String() );
654 
655             if( pIStm->GetError() )
656             {
657                 SfxErrorContext eEC(ERRCODE_SFX_GENERAL,this);
658                 ErrorHandler::HandleError( ERRCODE_IO_GENERAL );
659             }
660             else
661                 pIMapWnd->SetImageMap( aLoadIMap );
662 
663             delete pIStm;
664         }
665 
666         pIMapWnd->Invalidate();
667     }
668 }
669 
670 
671 /*************************************************************************
672 |*
673 |*
674 |*
675 \************************************************************************/
676 
677 sal_Bool SvxIMapDlg::DoSave()
678 {
679     ::sfx2::FileDialogHelper aDlg(
680         com::sun::star::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE, 0 );
681 
682     const String    aBinFilter( DEFINE_CONST_UNICODE( IMAP_BINARY_FILTER ) );
683     const String    aCERNFilter( DEFINE_CONST_UNICODE( IMAP_CERN_FILTER ) );
684     const String    aNCSAFilter( DEFINE_CONST_UNICODE( IMAP_NCSA_FILTER ) );
685     SdrModel*       pModel = pIMapWnd->GetSdrModel();
686     const sal_Bool bChanged = pModel->IsChanged();
687     sal_Bool            bRet = false;
688 
689     aDlg.AddFilter( aCERNFilter, DEFINE_CONST_UNICODE( IMAP_CERN_TYPE ) );
690     aDlg.AddFilter( aNCSAFilter, DEFINE_CONST_UNICODE( IMAP_NCSA_TYPE ) );
691     aDlg.AddFilter( aBinFilter, DEFINE_CONST_UNICODE( IMAP_BINARY_TYPE ) );
692 
693     aDlg.SetCurrentFilter( aCERNFilter );
694     aDlg.SetDisplayDirectory( SvtPathOptions().GetWorkPath() );
695 
696     if( aDlg.Execute() == ERRCODE_NONE )
697     {
698         const String    aFilter( aDlg.GetCurrentFilter() );
699         String          aExt;
700         sal_uIntPtr         nFormat;
701 
702         if ( aFilter == aBinFilter )
703         {
704             nFormat = IMAP_FORMAT_BIN;
705             aExt = DEFINE_CONST_UNICODE( IMAP_BINARY_EXT );
706         }
707         else if ( aFilter == aCERNFilter )
708         {
709             nFormat = IMAP_FORMAT_CERN;
710             aExt = DEFINE_CONST_UNICODE( IMAP_CERN_EXT );
711         }
712         else if ( aFilter == aNCSAFilter )
713         {
714             nFormat = IMAP_FORMAT_NCSA;
715             aExt = DEFINE_CONST_UNICODE( IMAP_NCSA_EXT );
716         }
717         else
718         {
719             return sal_False;
720         }
721 
722         INetURLObject aURL( aDlg.GetPath() );
723 
724         if( aURL.GetProtocol() == INET_PROT_NOT_VALID )
725         {
726             DBG_ERROR( "invalid URL" );
727         }
728         else
729         {
730             if( !aURL.getExtension().getLength() )
731                 aURL.setExtension( aExt );
732 
733             SvStream* pOStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE | STREAM_TRUNC );
734             if( pOStm )
735             {
736                 pIMapWnd->GetImageMap().Write( *pOStm, nFormat, String() );
737 
738                 if( pOStm->GetError() )
739                     ErrorHandler::HandleError( ERRCODE_IO_GENERAL );
740 
741                 delete pOStm;
742                 pModel->SetChanged( bChanged );
743                 bRet = sal_True;
744             }
745         }
746     }
747 
748     return bRet;
749 }
750 
751 
752 /*************************************************************************
753 |*
754 |*
755 |*
756 \************************************************************************/
757 
758 IMPL_LINK( SvxIMapDlg, InfoHdl, IMapWindow*, pWnd )
759 {
760     String              aStr;
761     const NotifyInfo&   rInfo = pWnd->GetInfo();
762 
763     if ( rInfo.bNewObj )
764     {
765         if( rInfo.aMarkURL.Len() && ( maURLBox.GetEntryPos( rInfo.aMarkURL ) == LISTBOX_ENTRY_NOTFOUND ) )
766             maURLBox.InsertEntry( rInfo.aMarkURL );
767 
768         maURLBox.SetText( rInfo.aMarkURL );
769         aEdtText.SetText( rInfo.aMarkAltText );
770 
771         if ( !rInfo.aMarkTarget.Len() )
772             maCbbTarget.SetText( DEFINE_CONST_UNICODE( SELF_TARGET ) );
773         else
774             maCbbTarget.SetText( rInfo.aMarkTarget );
775     }
776 
777     if ( !rInfo.bOneMarked )
778     {
779         aTbxIMapDlg1.CheckItem( TBI_ACTIVE, sal_False );
780         aTbxIMapDlg1.EnableItem( TBI_ACTIVE, sal_False );
781         aTbxIMapDlg1.EnableItem( TBI_MACRO, sal_False );
782         aTbxIMapDlg1.EnableItem( TBI_PROPERTY, sal_False );
783         aStbStatus.SetItemText( 1, aStr );
784 
785         aFtURL.Disable();
786         maURLBox.Disable();
787         aFtText.Disable();
788         aEdtText.Disable();
789         maFtTarget.Disable();
790         maCbbTarget.Disable();
791 
792         maURLBox.SetText( String() );
793         aEdtText.SetText( String() );
794     }
795     else
796     {
797         aTbxIMapDlg1.EnableItem( TBI_ACTIVE, sal_True );
798         aTbxIMapDlg1.CheckItem( TBI_ACTIVE, !rInfo.bActivated );
799         aTbxIMapDlg1.EnableItem( TBI_MACRO, sal_True );
800         aTbxIMapDlg1.EnableItem( TBI_PROPERTY, sal_True );
801 
802         aFtURL.Enable();
803         maURLBox.Enable();
804         aFtText.Enable();
805         aEdtText.Enable();
806         maFtTarget.Enable();
807         maCbbTarget.Enable();
808 
809         aStbStatus.SetItemText( 1, rInfo.aMarkURL );
810 
811         if ( maURLBox.GetText() != rInfo.aMarkURL )
812             maURLBox.SetText( rInfo.aMarkURL );
813 
814         if ( aEdtText.GetText() != rInfo.aMarkAltText )
815             aEdtText.SetText( rInfo.aMarkAltText );
816 
817         if ( !rInfo.aMarkTarget.Len() )
818             maCbbTarget.SetText( DEFINE_CONST_UNICODE( SELF_TARGET ) );
819         else
820             maCbbTarget.SetText(  rInfo.aMarkTarget );
821     }
822 
823     return 0;
824 }
825 
826 /*************************************************************************
827 |*
828 |*
829 |*
830 \************************************************************************/
831 
832 IMPL_LINK( SvxIMapDlg, MousePosHdl, IMapWindow*, pWnd )
833 {
834     String aStr;
835     const FieldUnit eFieldUnit = GetBindings().GetDispatcher()->GetModule()->GetFieldUnit();
836     const Point& rMousePos = pWnd->GetMousePos();
837     LocaleDataWrapper aLocaleWrapper( ::comphelper::getProcessServiceFactory(), Application::GetSettings().GetLocale() );
838     const sal_Unicode cSep = aLocaleWrapper.getNumDecimalSep().GetChar(0);
839 
840     aStr.Assign( GetUnitString( rMousePos.X(), eFieldUnit, cSep ) );
841     aStr.Append( DEFINE_CONST_UNICODE( " / " ) );
842     aStr.Append( GetUnitString( rMousePos.Y(), eFieldUnit, cSep ) );
843 
844     aStbStatus.SetItemText( 2, aStr );
845 
846     return 0L;
847 }
848 
849 /*************************************************************************
850 |*
851 |*
852 |*
853 \************************************************************************/
854 
855 IMPL_LINK( SvxIMapDlg, GraphSizeHdl, IMapWindow*, pWnd )
856 {
857     String aStr;
858     const FieldUnit eFieldUnit = GetBindings().GetDispatcher()->GetModule()->GetFieldUnit();
859     const Size& rSize = pWnd->GetGraphicSize();
860     LocaleDataWrapper aLocaleWrapper( ::comphelper::getProcessServiceFactory(), Application::GetSettings().GetLocale() );
861     const sal_Unicode cSep = aLocaleWrapper.getNumDecimalSep().GetChar(0);
862 
863     aStr.Assign( GetUnitString( rSize.Width(), eFieldUnit, cSep ) );
864     aStr.Append( DEFINE_CONST_UNICODE( " x " ) );
865     aStr.Append( GetUnitString( rSize.Height(), eFieldUnit, cSep ) );
866 
867     aStbStatus.SetItemText( 3, aStr );
868 
869     return 0L;
870 }
871 
872 /*************************************************************************
873 |*
874 |*
875 |*
876 \************************************************************************/
877 
878 IMPL_LINK( SvxIMapDlg, URLModifyHdl, void*, EMPTYARG )
879 {
880     NotifyInfo  aNewInfo;
881 
882     aNewInfo.aMarkURL = maURLBox.GetText();
883     aNewInfo.aMarkAltText = aEdtText.GetText();
884     aNewInfo.aMarkTarget = maCbbTarget.GetText();
885 
886     pIMapWnd->ReplaceActualIMapInfo( aNewInfo );
887 
888     return 0;
889 }
890 
891 
892 /*************************************************************************
893 |*
894 |*
895 |*
896 \************************************************************************/
897 
898 IMPL_LINK( SvxIMapDlg, URLLoseFocusHdl, void*, EMPTYARG )
899 {
900     NotifyInfo      aNewInfo;
901     const String    aURLText( maURLBox.GetText() );
902     const String    aTargetText( maCbbTarget.GetText() );
903 
904     if ( aURLText.Len() )
905     {
906         String aBase = GetBindings().GetDispatcher()->GetFrame()->GetObjectShell()->GetMedium()->GetBaseURL();
907         aNewInfo.aMarkURL = ::URIHelper::SmartRel2Abs( INetURLObject(aBase), aURLText, URIHelper::GetMaybeFileHdl(), true, false,
908                                                         INetURLObject::WAS_ENCODED,
909                                                         INetURLObject::DECODE_UNAMBIGUOUS );
910     }
911     else
912         aNewInfo.aMarkURL = aURLText;
913 
914     aNewInfo.aMarkAltText = aEdtText.GetText();
915 
916     if ( !aTargetText.Len() )
917         aNewInfo.aMarkTarget = DEFINE_CONST_UNICODE( SELF_TARGET );
918     else
919         aNewInfo.aMarkTarget = aTargetText;
920 
921     pIMapWnd->ReplaceActualIMapInfo( aNewInfo );
922 
923     return 0;
924 }
925 
926 
927 /*************************************************************************
928 |*
929 |*
930 |*
931 \************************************************************************/
932 
933 IMPL_LINK( SvxIMapDlg, UpdateHdl, Timer*, EMPTYARG )
934 {
935     pOwnData->aTimer.Stop();
936 
937     if ( pOwnData->pUpdateEditingObject != pCheckObj )
938     {
939         if ( pIMapWnd->IsChanged() &&
940              ( QueryBox( this, WB_YES_NO | WB_DEF_YES,
941              String( SVX_RES( STR_IMAPDLG_SAVE ) ) ).Execute() == RET_YES ) )
942         {
943             DoSave();
944         }
945 
946         SetGraphic( pOwnData->aUpdateGraphic );
947         SetImageMap( pOwnData->aUpdateImageMap );
948         SetTargetList( pOwnData->aUpdateTargetList );
949         SetEditingObject( pOwnData->pUpdateEditingObject );
950 
951         // Nach Wechsel => default Selektion
952         aTbxIMapDlg1.CheckItem( TBI_SELECT, sal_True );
953         pIMapWnd->SetEditMode( sal_True );
954     }
955 
956     // die in der Update-Methode kopierte Liste wieder loeschen
957     for( String* pStr = pOwnData->aUpdateTargetList.First(); pStr; pStr = pOwnData->aUpdateTargetList.Next() )
958         delete pStr;
959 
960     pOwnData->aUpdateTargetList.Clear();
961 
962     GetBindings().Invalidate( SID_IMAP_EXEC );
963 
964     return 0L;
965 }
966 
967 
968 /*************************************************************************
969 |*
970 |*
971 |*
972 \************************************************************************/
973 
974 IMPL_LINK( SvxIMapDlg, StateHdl, IMapWindow*, pWnd )
975 {
976     const SdrObject*    pObj = pWnd->GetSelectedSdrObject();
977     const SdrModel*     pModel = pWnd->GetSdrModel();
978     const SdrView*      pView = pWnd->GetSdrView();
979     const sal_Bool          bPolyEdit = ( pObj != NULL ) && pObj->ISA( SdrPathObj );
980     const sal_Bool          bDrawEnabled = !( bPolyEdit && aTbxIMapDlg1.IsItemChecked( TBI_POLYEDIT ) );
981 
982     aTbxIMapDlg1.EnableItem( TBI_APPLY, pOwnData->bExecState && pWnd->IsChanged() );
983 
984     aTbxIMapDlg1.EnableItem( TBI_SELECT, bDrawEnabled );
985     aTbxIMapDlg1.EnableItem( TBI_RECT, bDrawEnabled );
986     aTbxIMapDlg1.EnableItem( TBI_CIRCLE, bDrawEnabled );
987     aTbxIMapDlg1.EnableItem( TBI_POLY, bDrawEnabled );
988     aTbxIMapDlg1.EnableItem( TBI_FREEPOLY, bDrawEnabled );
989 
990     // BezierEditor-Stati
991     aTbxIMapDlg1.EnableItem( TBI_POLYEDIT, bPolyEdit );
992     aTbxIMapDlg1.EnableItem( TBI_POLYMOVE, !bDrawEnabled );
993     aTbxIMapDlg1.EnableItem( TBI_POLYINSERT, !bDrawEnabled );
994     aTbxIMapDlg1.EnableItem( TBI_POLYDELETE, !bDrawEnabled && pView->IsDeleteMarkedPointsPossible() );
995 
996     // Undo/Redo
997     aTbxIMapDlg1.EnableItem( TBI_UNDO, pModel->GetUndoActionCount() > 0 );
998     aTbxIMapDlg1.EnableItem( TBI_REDO, pModel->GetRedoActionCount() > 0 );
999 
1000     if ( bPolyEdit )
1001     {
1002         sal_uInt16 nId = 0;
1003 
1004         switch( pWnd->GetPolyEditMode() )
1005         {
1006             case( SID_BEZIER_MOVE ): nId = TBI_POLYMOVE; break;
1007             case( SID_BEZIER_INSERT ): nId = TBI_POLYINSERT; break;
1008 
1009             default:
1010             break;
1011         }
1012 
1013         aTbxIMapDlg1.CheckItem( nId, sal_True );
1014     }
1015     else
1016     {
1017         aTbxIMapDlg1.CheckItem( TBI_POLYEDIT, sal_False );
1018         aTbxIMapDlg1.CheckItem( TBI_POLYMOVE, sal_True );
1019         aTbxIMapDlg1.CheckItem( TBI_POLYINSERT, sal_False );
1020         pWnd->SetPolyEditMode( 0 );
1021     }
1022 
1023     return 0L;
1024 }
1025 
1026 /*************************************************************************
1027 |*
1028 |*
1029 |*
1030 \************************************************************************/
1031 
1032 IMPL_LINK( SvxIMapDlg, MiscHdl, void*, EMPTYARG )
1033 {
1034     SvtMiscOptions aMiscOptions;
1035     aTbxIMapDlg1.SetOutStyle( aMiscOptions.GetToolboxStyle() );
1036 
1037     return 0L;
1038 }
1039 
1040 void SvxIMapDlg::ApplyImageList()
1041 {
1042     bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
1043 
1044     ImageList& rImgLst = bHighContrast ? maImageListH : maImageList;
1045 
1046     aTbxIMapDlg1.SetImageList( rImgLst );
1047 }
1048 
1049 void SvxIMapDlg::DataChanged( const DataChangedEvent& rDCEvt )
1050 {
1051     SfxModelessDialog::DataChanged( rDCEvt );
1052 
1053     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
1054             ApplyImageList();
1055 }
1056