Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <stdlib.h>
21 : #include <tools/errinf.hxx>
22 : #include <tools/urlobj.hxx>
23 : #include <unotools/ucbstreamhelper.hxx>
24 : #include <vcl/msgbox.hxx>
25 : #include <vcl/group.hxx>
26 : #include <vcl/lstbox.hxx>
27 : #include <svl/eitem.hxx>
28 : #include <unotools/pathoptions.hxx>
29 : #include <sfx2/dispatch.hxx>
30 : #include <sfx2/module.hxx>
31 : #include <sfx2/filedlghelper.hxx>
32 : #include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
33 : #include <svl/urihelper.hxx>
34 : #include <svtools/miscopt.hxx>
35 : #include <svtools/ehdl.hxx>
36 : #include <svtools/sfxecode.hxx>
37 : #include <sfx2/viewfrm.hxx>
38 : #include <sfx2/objsh.hxx>
39 : #include <sfx2/docfile.hxx>
40 : #include <unotools/localedatawrapper.hxx>
41 : #include <comphelper/processfactory.hxx>
42 : #include <vcl/layout.hxx>
43 : #include <svx/imapdlg.hxx>
44 : #include <svx/dialmgr.hxx>
45 : #include <svx/dialogs.hrc>
46 : #include <svx/svxids.hrc>
47 : #include "imapdlg.hrc"
48 : #include "imapwnd.hxx"
49 : #include "imapimp.hxx"
50 : #include "svx/dlgutil.hxx"
51 : #include <svx/svdtrans.hxx>
52 : #include <svx/svdopath.hxx>
53 : #include <vcl/svapp.hxx>
54 : #include <vcl/settings.hxx>
55 : #include "dlgunit.hxx"
56 : #include <boost/scoped_ptr.hpp>
57 :
58 : #define SELF_TARGET "_self"
59 : #define IMAP_ALL_FILTER OUString("<Alle>")
60 : #define IMAP_CERN_FILTER OUString("MAP - CERN")
61 : #define IMAP_NCSA_FILTER OUString("MAP - NCSA")
62 : #define IMAP_BINARY_FILTER OUString("SIP - StarView ImageMap")
63 : #define IMAP_ALL_TYPE OUString("*.*")
64 : #define IMAP_BINARY_TYPE OUString("*.sip")
65 : #define IMAP_CERN_TYPE OUString("*.map")
66 : #define IMAP_NCSA_TYPE OUString("*.map")
67 : #define IMAP_BINARY_EXT OUString("sip")
68 : #define IMAP_CERN_EXT OUString("map")
69 : #define IMAP_NCSA_EXT OUString("map")
70 :
71 522 : SFX_IMPL_MODELESSDIALOG_WITHID( SvxIMapDlgChildWindow, SID_IMAP );
72 :
73 : // ControllerItem
74 :
75 0 : SvxIMapDlgItem::SvxIMapDlgItem( sal_uInt16 _nId, SvxIMapDlg& rIMapDlg, SfxBindings& rBindings ) :
76 : SfxControllerItem ( _nId, rBindings ),
77 0 : rIMap ( rIMapDlg )
78 : {
79 0 : }
80 :
81 0 : void SvxIMapDlgItem::StateChanged( sal_uInt16 nSID, SfxItemState /*eState*/,
82 : const SfxPoolItem* pItem )
83 : {
84 0 : if ( ( nSID == SID_IMAP_EXEC ) && pItem )
85 : {
86 0 : const SfxBoolItem* pStateItem = PTR_CAST( SfxBoolItem, pItem );
87 : assert(pStateItem); //SfxBoolItem expected
88 0 : if (pStateItem)
89 : {
90 : // Disable Float if possible
91 0 : rIMap.SetExecState( !pStateItem->GetValue() );
92 : }
93 : }
94 0 : }
95 :
96 0 : SvxIMapDlgChildWindow::SvxIMapDlgChildWindow( vcl::Window* _pParent, sal_uInt16 nId,
97 : SfxBindings* pBindings,
98 : SfxChildWinInfo* pInfo ) :
99 0 : SfxChildWindow( _pParent, nId )
100 : {
101 0 : pWindow = new SvxIMapDlg( pBindings, this, _pParent );
102 0 : SvxIMapDlg* pDlg = static_cast<SvxIMapDlg*>(pWindow);
103 :
104 0 : if ( pInfo->nFlags & SFX_CHILDWIN_ZOOMIN )
105 0 : pDlg->RollUp();
106 :
107 0 : eChildAlignment = SFX_ALIGN_NOALIGNMENT;
108 :
109 0 : pDlg->Initialize( pInfo );
110 0 : }
111 :
112 0 : void SvxIMapDlgChildWindow::UpdateIMapDlg( const Graphic& rGraphic, const ImageMap* pImageMap,
113 : const TargetList* pTargetList, void* pEditingObj )
114 : {
115 0 : if ( SfxViewFrame::Current() &&
116 0 : SfxViewFrame::Current()->HasChildWindow( SvxIMapDlgChildWindow::GetChildWindowId() ) )
117 0 : SVXIMAPDLG()->UpdateLink( rGraphic, pImageMap, pTargetList, pEditingObj );
118 0 : }
119 :
120 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeStatusBar(vcl::Window *pParent, VclBuilder::stringmap &)
121 : {
122 0 : return new StatusBar(pParent);
123 : }
124 :
125 0 : SvxIMapDlg::SvxIMapDlg(SfxBindings *_pBindings, SfxChildWindow *pCW, vcl::Window* _pParent)
126 : : SfxModelessDialog(_pBindings, pCW, _pParent, "ImapDialog", "svx/ui/imapdialog.ui")
127 : , pCheckObj(NULL)
128 0 : , aIMapItem(SID_IMAP_EXEC, *this, *_pBindings)
129 : {
130 0 : get(m_pTbxIMapDlg1, "toolbar");
131 0 : m_pTbxIMapDlg1->InsertSeparator(3, 5);
132 0 : m_pTbxIMapDlg1->InsertSeparator(9, 5);
133 0 : m_pTbxIMapDlg1->InsertSeparator(14, 5);
134 0 : m_pTbxIMapDlg1->InsertSeparator(17, 5);
135 :
136 0 : mnApplyId = m_pTbxIMapDlg1->GetItemId("TBI_APPLY");
137 0 : mnOpenId = m_pTbxIMapDlg1->GetItemId("TBI_OPEN");
138 0 : mnSaveAsId = m_pTbxIMapDlg1->GetItemId("TBI_SAVEAS");
139 0 : mnSelectId = m_pTbxIMapDlg1->GetItemId("TBI_SELECT");
140 0 : mnRectId = m_pTbxIMapDlg1->GetItemId("TBI_RECT");
141 0 : mnCircleId = m_pTbxIMapDlg1->GetItemId("TBI_CIRCLE");
142 0 : mnPolyId = m_pTbxIMapDlg1->GetItemId("TBI_POLY");
143 0 : mnFreePolyId = m_pTbxIMapDlg1->GetItemId("TBI_FREEPOLY");
144 0 : mnPolyEditId = m_pTbxIMapDlg1->GetItemId("TBI_POLYEDIT");
145 0 : mnPolyMoveId = m_pTbxIMapDlg1->GetItemId("TBI_POLYMOVE");
146 0 : mnPolyInsertId = m_pTbxIMapDlg1->GetItemId("TBI_POLYINSERT");
147 0 : mnPolyDeleteId = m_pTbxIMapDlg1->GetItemId("TBI_POLYDELETE");
148 0 : mnUndoId = m_pTbxIMapDlg1->GetItemId("TBI_UNDO");
149 0 : mnRedoId = m_pTbxIMapDlg1->GetItemId("TBI_REDO");
150 0 : mnActiveId = m_pTbxIMapDlg1->GetItemId("TBI_ACTIVE");
151 0 : mnMacroId = m_pTbxIMapDlg1->GetItemId("TBI_MACRO");
152 0 : mnPropertyId = m_pTbxIMapDlg1->GetItemId("TBI_PROPERTY");
153 :
154 0 : get(m_pFtURL, "urlft");
155 0 : get(m_pURLBox, "url");
156 0 : get(m_pFtText, "textft");
157 0 : get(m_pEdtText, "text");
158 0 : get(m_pFtTarget, "targetft");
159 0 : get(m_pCbbTarget, "target");
160 :
161 : //lock this down so it doesn't jump around in size
162 : //as entries are added later on
163 0 : TargetList aTmpList;
164 0 : SfxFrame::GetDefaultTargetList(aTmpList);
165 0 : for (size_t i = 0, n = aTmpList.size(); i < n; ++i)
166 0 : m_pCbbTarget->InsertEntry(aTmpList[i]);
167 0 : Size aPrefSize(m_pCbbTarget->get_preferred_size());
168 0 : m_pCbbTarget->set_width_request(aPrefSize.Width());
169 0 : m_pCbbTarget->Clear();
170 :
171 0 : get(m_pStbStatus, "statusbar");
172 :
173 0 : VclVBox* _pContainer = get<VclVBox>("container");
174 0 : pIMapWnd = new IMapWindow( _pContainer, WB_BORDER, _pBindings->GetActiveFrame() );
175 0 : pIMapWnd->set_hexpand(true);
176 0 : pIMapWnd->set_vexpand(true);
177 0 : pIMapWnd->Show();
178 :
179 0 : pOwnData = new IMapOwnData;
180 :
181 0 : pIMapWnd->SetInfoLink( LINK( this, SvxIMapDlg, InfoHdl ) );
182 0 : pIMapWnd->SetMousePosLink( LINK( this, SvxIMapDlg, MousePosHdl ) );
183 0 : pIMapWnd->SetGraphSizeLink( LINK( this, SvxIMapDlg, GraphSizeHdl ) );
184 0 : pIMapWnd->SetUpdateLink( LINK( this, SvxIMapDlg, StateHdl ) );
185 :
186 0 : m_pURLBox->SetModifyHdl( LINK( this, SvxIMapDlg, URLModifyHdl ) );
187 0 : m_pURLBox->SetSelectHdl( LINK( this, SvxIMapDlg, URLModifyHdl ) );
188 0 : m_pURLBox->SetLoseFocusHdl( LINK( this, SvxIMapDlg, URLLoseFocusHdl ) );
189 0 : m_pEdtText->SetModifyHdl( LINK( this, SvxIMapDlg, URLModifyHdl ) );
190 0 : m_pCbbTarget->SetLoseFocusHdl( LINK( this, SvxIMapDlg, URLLoseFocusHdl ) );
191 :
192 0 : SvtMiscOptions aMiscOptions;
193 0 : aMiscOptions.AddListenerLink( LINK( this, SvxIMapDlg, MiscHdl ) );
194 :
195 0 : m_pTbxIMapDlg1->SetSelectHdl( LINK( this, SvxIMapDlg, TbxClickHdl ) );
196 0 : m_pTbxIMapDlg1->CheckItem( mnSelectId, true );
197 0 : TbxClickHdl( m_pTbxIMapDlg1 );
198 :
199 0 : SetMinOutputSizePixel( aLastSize = GetOutputSizePixel() );
200 :
201 0 : m_pStbStatus->InsertItem( 1, 130, SIB_LEFT | SIB_IN | SIB_AUTOSIZE );
202 0 : m_pStbStatus->InsertItem( 2, 10 + GetTextWidth( OUString(" 9999,99 cm / 9999,99 cm ") ), SIB_CENTER | SIB_IN );
203 0 : m_pStbStatus->InsertItem( 3, 10 + GetTextWidth( OUString(" 9999,99 cm x 9999,99 cm ") ), SIB_CENTER | SIB_IN );
204 :
205 0 : m_pFtURL->Disable();
206 0 : m_pURLBox->Disable();
207 0 : m_pFtText->Disable();
208 0 : m_pEdtText->Disable();
209 0 : m_pFtTarget->Disable();
210 0 : m_pCbbTarget->Disable();
211 0 : pOwnData->bExecState = false;
212 :
213 0 : pOwnData->aTimer.SetTimeout( 100 );
214 0 : pOwnData->aTimer.SetTimeoutHdl( LINK( this, SvxIMapDlg, UpdateHdl ) );
215 :
216 0 : m_pTbxIMapDlg1->EnableItem( mnActiveId, false );
217 0 : m_pTbxIMapDlg1->EnableItem( mnMacroId, false );
218 0 : m_pTbxIMapDlg1->EnableItem( mnPropertyId, false );
219 0 : }
220 :
221 0 : SvxIMapDlg::~SvxIMapDlg()
222 : {
223 : // Delete URL-List
224 0 : delete pIMapWnd;
225 0 : delete pOwnData;
226 0 : }
227 :
228 0 : bool SvxIMapDlg::Close()
229 : {
230 0 : bool bRet = true;
231 :
232 0 : if ( m_pTbxIMapDlg1->IsItemEnabled( mnApplyId ) )
233 : {
234 0 : MessageDialog aQBox( this,"QueryModifyImageMapChangesDialog","svx/ui/querymodifyimagemapchangesdialog.ui");
235 0 : const long nRet = aQBox.Execute();
236 :
237 0 : if( nRet == RET_YES )
238 : {
239 0 : SfxBoolItem aBoolItem( SID_IMAP_EXEC, true );
240 0 : GetBindings().GetDispatcher()->Execute(
241 0 : SID_IMAP_EXEC, SfxCallMode::SYNCHRON | SfxCallMode::RECORD, &aBoolItem, 0L );
242 : }
243 0 : else if( nRet == RET_CANCEL )
244 0 : bRet = false;
245 : }
246 0 : else if( pIMapWnd->IsChanged() )
247 : {
248 0 : MessageDialog aQBox( this,"QuerySaveImageMapChangesDialog","svx/ui/querysaveimagemapchangesdialog.ui");
249 0 : const long nRet = aQBox.Execute();
250 :
251 0 : if( nRet == RET_YES )
252 0 : bRet = DoSave();
253 0 : else if( nRet == RET_CANCEL )
254 0 : bRet = false;
255 : }
256 :
257 0 : return( bRet ? SfxModelessDialog::Close() : sal_False );
258 : }
259 :
260 : // Enabled or disable all Controls
261 :
262 0 : void SvxIMapDlg::SetExecState( bool bEnable )
263 : {
264 0 : pOwnData->bExecState = bEnable;
265 0 : }
266 :
267 0 : void SvxIMapDlg::SetGraphic( const Graphic& rGraphic )
268 : {
269 0 : pIMapWnd->SetGraphic( rGraphic );
270 0 : }
271 :
272 0 : void SvxIMapDlg::SetImageMap( const ImageMap& rImageMap )
273 : {
274 0 : pIMapWnd->SetImageMap( rImageMap );
275 0 : }
276 :
277 0 : const ImageMap& SvxIMapDlg::GetImageMap() const
278 : {
279 0 : return pIMapWnd->GetImageMap();
280 : }
281 :
282 0 : void SvxIMapDlg::SetTargetList( const TargetList& rTargetList )
283 : {
284 0 : TargetList aNewList( rTargetList );
285 :
286 0 : pIMapWnd->SetTargetList( aNewList );
287 :
288 0 : m_pCbbTarget->Clear();
289 :
290 0 : for ( size_t i = 0, n = aNewList.size(); i < n; ++i )
291 0 : m_pCbbTarget->InsertEntry( aNewList[ i ] );
292 0 : }
293 :
294 0 : void SvxIMapDlg::UpdateLink( const Graphic& rGraphic, const ImageMap* pImageMap,
295 : const TargetList* pTargetList, void* pEditingObj )
296 : {
297 0 : pOwnData->aUpdateGraphic = rGraphic;
298 :
299 0 : if ( pImageMap )
300 0 : pOwnData->aUpdateImageMap = *pImageMap;
301 : else
302 0 : pOwnData->aUpdateImageMap.ClearImageMap();
303 :
304 0 : pOwnData->pUpdateEditingObject = pEditingObj;
305 :
306 : // Delete UpdateTargetList, because this method can still be called several
307 : // times before the update timer is turned on
308 0 : pOwnData->aUpdateTargetList.clear();
309 :
310 : // TargetList must be copied, since it is owned by the caller and can be
311 : // deleted immediately after this call the copied list will be deleted
312 : // again in the handler
313 0 : if( pTargetList )
314 : {
315 0 : TargetList aTargetList( *pTargetList );
316 :
317 0 : for ( size_t i = 0, n = aTargetList.size(); i < n; ++i )
318 0 : pOwnData->aUpdateTargetList.push_back( aTargetList[ i ] );
319 : }
320 :
321 0 : pOwnData->aTimer.Start();
322 0 : }
323 :
324 :
325 0 : void SvxIMapDlg::KeyInput( const KeyEvent& rKEvt )
326 : {
327 0 : SfxModelessDialog::KeyInput( rKEvt );
328 0 : }
329 :
330 : // Click-handler for ToolBox
331 :
332 0 : IMPL_LINK( SvxIMapDlg, TbxClickHdl, ToolBox*, pTbx )
333 : {
334 0 : sal_uInt16 nNewItemId = pTbx->GetCurItemId();
335 :
336 0 : if(nNewItemId == mnApplyId)
337 : {
338 0 : URLLoseFocusHdl( NULL );
339 0 : SfxBoolItem aBoolItem( SID_IMAP_EXEC, true );
340 0 : GetBindings().GetDispatcher()->Execute(
341 0 : SID_IMAP_EXEC, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, &aBoolItem, 0L );
342 : }
343 0 : else if(nNewItemId == mnOpenId)
344 0 : DoOpen();
345 0 : else if(nNewItemId == mnSaveAsId)
346 0 : DoSave();
347 0 : else if(nNewItemId == mnSelectId)
348 : {
349 0 : pTbx->CheckItem( nNewItemId, true );
350 0 : pIMapWnd->SetEditMode( true );
351 0 : if( pTbx->IsKeyEvent() )
352 : {
353 0 : if((pTbx->GetKeyModifier() & KEY_MOD1) != 0)
354 0 : pIMapWnd->SelectFirstObject();
355 : else
356 0 : pIMapWnd->GrabFocus();
357 : }
358 : }
359 0 : else if(nNewItemId == mnRectId)
360 : {
361 0 : pTbx->CheckItem( nNewItemId, true );
362 0 : pIMapWnd->SetObjKind( OBJ_RECT );
363 0 : if( pTbx->IsKeyEvent() && ((pTbx->GetKeyModifier() & KEY_MOD1) != 0) )
364 : {
365 0 : pIMapWnd->CreateDefaultObject();
366 0 : pIMapWnd->GrabFocus();
367 : }
368 : }
369 0 : else if(nNewItemId == mnCircleId)
370 : {
371 0 : pTbx->CheckItem( nNewItemId, true );
372 0 : pIMapWnd->SetObjKind( OBJ_CIRC );
373 0 : if( pTbx->IsKeyEvent() && ((pTbx->GetKeyModifier() & KEY_MOD1) != 0) )
374 : {
375 0 : pIMapWnd->CreateDefaultObject();
376 0 : pIMapWnd->GrabFocus();
377 : }
378 : }
379 0 : else if(nNewItemId == mnPolyId)
380 : {
381 0 : pTbx->CheckItem( nNewItemId, true );
382 0 : pIMapWnd->SetObjKind( OBJ_POLY );
383 0 : if( pTbx->IsKeyEvent() && ((pTbx->GetKeyModifier() & KEY_MOD1) != 0) )
384 : {
385 0 : pIMapWnd->CreateDefaultObject();
386 0 : pIMapWnd->GrabFocus();
387 : }
388 : }
389 0 : else if(nNewItemId == mnFreePolyId)
390 : {
391 0 : pTbx->CheckItem( nNewItemId, true );
392 0 : pIMapWnd->SetObjKind( OBJ_FREEFILL );
393 0 : if( pTbx->IsKeyEvent() && ((pTbx->GetKeyModifier() & KEY_MOD1) != 0) )
394 : {
395 0 : pIMapWnd->CreateDefaultObject();
396 0 : pIMapWnd->GrabFocus();
397 : }
398 : }
399 0 : else if(nNewItemId == mnActiveId)
400 : {
401 0 : URLLoseFocusHdl( NULL );
402 0 : bool bNewState = !pTbx->IsItemChecked( TBI_ACTIVE );
403 0 : pTbx->CheckItem( TBI_ACTIVE, bNewState );
404 0 : pIMapWnd->SetCurrentObjState( !bNewState );
405 : }
406 0 : else if(nNewItemId == mnMacroId)
407 0 : pIMapWnd->DoMacroAssign();
408 0 : else if(nNewItemId == mnPropertyId)
409 0 : pIMapWnd->DoPropertyDialog();
410 0 : else if(nNewItemId == mnPolyEditId)
411 : {
412 0 : pIMapWnd->SetPolyEditMode( pTbx->IsItemChecked( TBI_POLYEDIT ) ? SID_BEZIER_MOVE : 0 );
413 0 : if( pTbx->IsKeyEvent() && pTbx->IsItemChecked( TBI_POLYEDIT ) )
414 0 : pIMapWnd->StartPolyEdit();
415 : }
416 0 : else if(nNewItemId == mnPolyMoveId)
417 0 : pIMapWnd->SetPolyEditMode( SID_BEZIER_MOVE );
418 0 : else if(nNewItemId == mnPolyInsertId)
419 0 : pIMapWnd->SetPolyEditMode( SID_BEZIER_INSERT );
420 0 : else if(nNewItemId == mnPolyDeleteId)
421 0 : pIMapWnd->GetSdrView()->DeleteMarkedPoints();
422 0 : else if(nNewItemId == mnUndoId)
423 : {
424 0 : URLLoseFocusHdl( NULL );
425 0 : pIMapWnd->GetSdrModel()->Undo();
426 : }
427 0 : else if(nNewItemId == mnRedoId)
428 : {
429 0 : URLLoseFocusHdl( NULL );
430 0 : pIMapWnd->GetSdrModel()->Redo();
431 : }
432 :
433 0 : return 0;
434 : }
435 :
436 0 : void SvxIMapDlg::DoOpen()
437 : {
438 : ::sfx2::FileDialogHelper aDlg(
439 0 : com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, 0 );
440 :
441 0 : ImageMap aLoadIMap;
442 0 : const OUString aFilter( IMAP_ALL_FILTER );
443 :
444 0 : aDlg.AddFilter( aFilter, IMAP_ALL_TYPE );
445 0 : aDlg.AddFilter( IMAP_CERN_FILTER, IMAP_CERN_TYPE );
446 0 : aDlg.AddFilter( IMAP_NCSA_FILTER, IMAP_NCSA_TYPE );
447 0 : aDlg.AddFilter( IMAP_BINARY_FILTER, IMAP_BINARY_TYPE );
448 :
449 0 : aDlg.SetCurrentFilter( aFilter );
450 0 : aDlg.SetDisplayDirectory( SvtPathOptions().GetWorkPath() );
451 :
452 0 : if( aDlg.Execute() == ERRCODE_NONE )
453 : {
454 0 : INetURLObject aURL( aDlg.GetPath() );
455 : DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
456 0 : boost::scoped_ptr<SvStream> pIStm(::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ ));
457 :
458 0 : if( pIStm )
459 : {
460 0 : aLoadIMap.Read( *pIStm, IMAP_FORMAT_DETECT, "" );
461 :
462 0 : if( pIStm->GetError() )
463 : {
464 0 : SfxErrorContext eEC(ERRCODE_SFX_GENERAL,this);
465 0 : ErrorHandler::HandleError( ERRCODE_IO_GENERAL );
466 : }
467 : else
468 0 : pIMapWnd->SetImageMap( aLoadIMap );
469 : }
470 :
471 0 : pIMapWnd->Invalidate();
472 0 : }
473 0 : }
474 :
475 0 : bool SvxIMapDlg::DoSave()
476 : {
477 : ::sfx2::FileDialogHelper aDlg(
478 0 : com::sun::star::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE, 0 );
479 :
480 0 : const OUString aBinFilter( IMAP_BINARY_FILTER );
481 0 : const OUString aCERNFilter( IMAP_CERN_FILTER );
482 0 : const OUString aNCSAFilter( IMAP_NCSA_FILTER );
483 0 : SdrModel* pModel = pIMapWnd->GetSdrModel();
484 0 : const bool bChanged = pModel->IsChanged();
485 0 : bool bRet = false;
486 :
487 0 : aDlg.AddFilter( aCERNFilter, IMAP_CERN_TYPE );
488 0 : aDlg.AddFilter( aNCSAFilter, IMAP_NCSA_TYPE );
489 0 : aDlg.AddFilter( aBinFilter, IMAP_BINARY_TYPE );
490 :
491 0 : aDlg.SetCurrentFilter( aCERNFilter );
492 0 : aDlg.SetDisplayDirectory( SvtPathOptions().GetWorkPath() );
493 :
494 0 : if( aDlg.Execute() == ERRCODE_NONE )
495 : {
496 0 : const OUString aFilter( aDlg.GetCurrentFilter() );
497 0 : OUString aExt;
498 : sal_uIntPtr nFormat;
499 :
500 0 : if ( aFilter == aBinFilter )
501 : {
502 0 : nFormat = IMAP_FORMAT_BIN;
503 0 : aExt = IMAP_BINARY_EXT;
504 : }
505 0 : else if ( aFilter == aCERNFilter )
506 : {
507 0 : nFormat = IMAP_FORMAT_CERN;
508 0 : aExt = IMAP_CERN_EXT;
509 : }
510 0 : else if ( aFilter == aNCSAFilter )
511 : {
512 0 : nFormat = IMAP_FORMAT_NCSA;
513 0 : aExt = IMAP_NCSA_EXT;
514 : }
515 : else
516 : {
517 0 : return false;
518 : }
519 :
520 0 : INetURLObject aURL( aDlg.GetPath() );
521 :
522 0 : if( aURL.GetProtocol() == INET_PROT_NOT_VALID )
523 : {
524 : OSL_FAIL( "invalid URL" );
525 : }
526 : else
527 : {
528 0 : if( aURL.getExtension().isEmpty() )
529 0 : aURL.setExtension( aExt );
530 :
531 0 : boost::scoped_ptr<SvStream> pOStm(::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE | STREAM_TRUNC ));
532 0 : if( pOStm )
533 : {
534 0 : pIMapWnd->GetImageMap().Write( *pOStm, nFormat, "" );
535 :
536 0 : if( pOStm->GetError() )
537 0 : ErrorHandler::HandleError( ERRCODE_IO_GENERAL );
538 :
539 0 : pOStm.reset();
540 0 : pModel->SetChanged( bChanged );
541 0 : bRet = true;
542 0 : }
543 0 : }
544 : }
545 :
546 0 : return bRet;
547 : }
548 :
549 0 : IMPL_LINK( SvxIMapDlg, InfoHdl, IMapWindow*, pWnd )
550 : {
551 0 : OUString aStr;
552 0 : const NotifyInfo& rInfo = pWnd->GetInfo();
553 :
554 0 : if ( rInfo.bNewObj )
555 : {
556 0 : if( !rInfo.aMarkURL.isEmpty() && ( m_pURLBox->GetEntryPos( rInfo.aMarkURL ) == LISTBOX_ENTRY_NOTFOUND ) )
557 0 : m_pURLBox->InsertEntry( rInfo.aMarkURL );
558 :
559 0 : m_pURLBox->SetText( rInfo.aMarkURL );
560 0 : m_pEdtText->SetText( rInfo.aMarkAltText );
561 :
562 0 : if ( rInfo.aMarkTarget.isEmpty() )
563 0 : m_pCbbTarget->SetText( SELF_TARGET );
564 : else
565 0 : m_pCbbTarget->SetText( rInfo.aMarkTarget );
566 : }
567 :
568 0 : if ( !rInfo.bOneMarked )
569 : {
570 0 : m_pTbxIMapDlg1->CheckItem( mnActiveId, false );
571 0 : m_pTbxIMapDlg1->EnableItem( mnActiveId, false );
572 0 : m_pTbxIMapDlg1->EnableItem( mnMacroId, false );
573 0 : m_pTbxIMapDlg1->EnableItem( mnPropertyId, false );
574 0 : m_pStbStatus->SetItemText( 1, aStr );
575 :
576 0 : m_pFtURL->Disable();
577 0 : m_pURLBox->Disable();
578 0 : m_pFtText->Disable();
579 0 : m_pEdtText->Disable();
580 0 : m_pFtTarget->Disable();
581 0 : m_pCbbTarget->Disable();
582 :
583 0 : m_pURLBox->SetText( "" );
584 0 : m_pEdtText->SetText( "" );
585 : }
586 : else
587 : {
588 0 : m_pTbxIMapDlg1->EnableItem( mnActiveId, true );
589 0 : m_pTbxIMapDlg1->CheckItem( mnActiveId, !rInfo.bActivated );
590 0 : m_pTbxIMapDlg1->EnableItem( mnMacroId, true );
591 0 : m_pTbxIMapDlg1->EnableItem( mnPropertyId, true );
592 :
593 0 : m_pFtURL->Enable();
594 0 : m_pURLBox->Enable();
595 0 : m_pFtText->Enable();
596 0 : m_pEdtText->Enable();
597 0 : m_pFtTarget->Enable();
598 0 : m_pCbbTarget->Enable();
599 :
600 0 : m_pStbStatus->SetItemText( 1, rInfo.aMarkURL );
601 :
602 0 : if ( m_pURLBox->GetText() != OUString(rInfo.aMarkURL) )
603 0 : m_pURLBox->SetText( rInfo.aMarkURL );
604 :
605 0 : if ( m_pEdtText->GetText() != OUString(rInfo.aMarkAltText) )
606 0 : m_pEdtText->SetText( rInfo.aMarkAltText );
607 :
608 0 : if ( rInfo.aMarkTarget.isEmpty() )
609 0 : m_pCbbTarget->SetText( SELF_TARGET );
610 : else
611 0 : m_pCbbTarget->SetText( rInfo.aMarkTarget );
612 : }
613 :
614 0 : return 0;
615 : }
616 :
617 0 : IMPL_LINK( SvxIMapDlg, MousePosHdl, IMapWindow*, pWnd )
618 : {
619 0 : const FieldUnit eFieldUnit = GetBindings().GetDispatcher()->GetModule()->GetFieldUnit();
620 0 : const Point& rMousePos = pWnd->GetMousePos();
621 0 : const LocaleDataWrapper& rLocaleWrapper( Application::GetSettings().GetLocaleDataWrapper() );
622 0 : const sal_Unicode cSep = rLocaleWrapper.getNumDecimalSep()[0];
623 :
624 0 : OUString aStr = GetUnitString( rMousePos.X(), eFieldUnit, cSep ) +
625 0 : " / " + GetUnitString( rMousePos.Y(), eFieldUnit, cSep );
626 :
627 0 : m_pStbStatus->SetItemText( 2, aStr );
628 :
629 0 : return 0L;
630 : }
631 :
632 0 : IMPL_LINK( SvxIMapDlg, GraphSizeHdl, IMapWindow*, pWnd )
633 : {
634 0 : const FieldUnit eFieldUnit = GetBindings().GetDispatcher()->GetModule()->GetFieldUnit();
635 0 : const Size& rSize = pWnd->GetGraphicSize();
636 0 : const LocaleDataWrapper& rLocaleWrapper( Application::GetSettings().GetLocaleDataWrapper() );
637 0 : const sal_Unicode cSep = rLocaleWrapper.getNumDecimalSep()[0];
638 :
639 0 : OUString aStr = GetUnitString( rSize.Width(), eFieldUnit, cSep ) +
640 0 : " x " + GetUnitString( rSize.Height(), eFieldUnit, cSep );
641 :
642 0 : m_pStbStatus->SetItemText( 3, aStr );
643 :
644 0 : return 0L;
645 : }
646 :
647 0 : IMPL_LINK_NOARG(SvxIMapDlg, URLModifyHdl)
648 : {
649 0 : NotifyInfo aNewInfo;
650 :
651 0 : aNewInfo.aMarkURL = m_pURLBox->GetText();
652 0 : aNewInfo.aMarkAltText = m_pEdtText->GetText();
653 0 : aNewInfo.aMarkTarget = m_pCbbTarget->GetText();
654 :
655 0 : pIMapWnd->ReplaceActualIMapInfo( aNewInfo );
656 :
657 0 : return 0;
658 : }
659 :
660 0 : IMPL_LINK_NOARG(SvxIMapDlg, URLLoseFocusHdl)
661 : {
662 0 : NotifyInfo aNewInfo;
663 0 : const OUString aURLText( m_pURLBox->GetText() );
664 0 : const OUString aTargetText( m_pCbbTarget->GetText() );
665 :
666 0 : if ( !aURLText.isEmpty() )
667 : {
668 0 : OUString aBase = GetBindings().GetDispatcher()->GetFrame()->GetObjectShell()->GetMedium()->GetBaseURL();
669 0 : aNewInfo.aMarkURL = ::URIHelper::SmartRel2Abs( INetURLObject(aBase), aURLText, URIHelper::GetMaybeFileHdl(), true, false,
670 : INetURLObject::WAS_ENCODED,
671 0 : INetURLObject::DECODE_UNAMBIGUOUS );
672 : }
673 : else
674 0 : aNewInfo.aMarkURL = aURLText;
675 :
676 0 : aNewInfo.aMarkAltText = m_pEdtText->GetText();
677 :
678 0 : if ( aTargetText.isEmpty() )
679 0 : aNewInfo.aMarkTarget = SELF_TARGET;
680 : else
681 0 : aNewInfo.aMarkTarget = aTargetText;
682 :
683 0 : pIMapWnd->ReplaceActualIMapInfo( aNewInfo );
684 :
685 0 : return 0;
686 : }
687 :
688 0 : IMPL_LINK_NOARG(SvxIMapDlg, UpdateHdl)
689 : {
690 0 : pOwnData->aTimer.Stop();
691 :
692 0 : if ( pOwnData->pUpdateEditingObject != pCheckObj )
693 : {
694 0 : if ( pIMapWnd->IsChanged() &&
695 : ( MessageDialog( this,"QuerySaveImageMapChangesDialog",
696 0 : "svx/ui/querysaveimagemapchangesdialog.ui" ).Execute() == RET_YES ) )
697 : {
698 0 : DoSave();
699 : }
700 :
701 0 : SetGraphic( pOwnData->aUpdateGraphic );
702 0 : SetImageMap( pOwnData->aUpdateImageMap );
703 0 : SetTargetList( pOwnData->aUpdateTargetList );
704 0 : SetEditingObject( pOwnData->pUpdateEditingObject );
705 :
706 : // After changes => default selection
707 0 : m_pTbxIMapDlg1->CheckItem( mnSelectId, true );
708 0 : pIMapWnd->SetEditMode( true );
709 : }
710 :
711 : // Delete the copied list again in the Update method
712 0 : pOwnData->aUpdateTargetList.clear();
713 :
714 0 : GetBindings().Invalidate( SID_IMAP_EXEC );
715 :
716 0 : return 0L;
717 : }
718 :
719 0 : IMPL_LINK( SvxIMapDlg, StateHdl, IMapWindow*, pWnd )
720 : {
721 0 : const SdrObject* pObj = pWnd->GetSelectedSdrObject();
722 0 : const SdrModel* pModel = pWnd->GetSdrModel();
723 0 : const SdrView* pView = pWnd->GetSdrView();
724 0 : const bool bPolyEdit = ( pObj != NULL ) && pObj->ISA( SdrPathObj );
725 0 : const bool bDrawEnabled = !( bPolyEdit && m_pTbxIMapDlg1->IsItemChecked( mnPolyEditId ) );
726 :
727 0 : m_pTbxIMapDlg1->EnableItem( mnApplyId, pOwnData->bExecState && pWnd->IsChanged() );
728 :
729 0 : m_pTbxIMapDlg1->EnableItem( mnSelectId, bDrawEnabled );
730 0 : m_pTbxIMapDlg1->EnableItem( mnRectId, bDrawEnabled );
731 0 : m_pTbxIMapDlg1->EnableItem( mnCircleId, bDrawEnabled );
732 0 : m_pTbxIMapDlg1->EnableItem( mnPolyId, bDrawEnabled );
733 0 : m_pTbxIMapDlg1->EnableItem( mnFreePolyId, bDrawEnabled );
734 :
735 : // BezierEditor State
736 0 : m_pTbxIMapDlg1->EnableItem( mnPolyEditId, bPolyEdit );
737 0 : m_pTbxIMapDlg1->EnableItem( mnPolyMoveId, !bDrawEnabled );
738 0 : m_pTbxIMapDlg1->EnableItem( mnPolyInsertId, !bDrawEnabled );
739 0 : m_pTbxIMapDlg1->EnableItem( mnPolyDeleteId, !bDrawEnabled && pView->IsDeleteMarkedPointsPossible() );
740 :
741 : // Undo/Redo
742 0 : m_pTbxIMapDlg1->EnableItem( mnUndoId, pModel->HasUndoActions() );
743 0 : m_pTbxIMapDlg1->EnableItem( mnRedoId, pModel->HasRedoActions() );
744 :
745 0 : if ( bPolyEdit )
746 : {
747 0 : sal_uInt16 nId = 0;
748 :
749 0 : switch( pWnd->GetPolyEditMode() )
750 : {
751 0 : case( SID_BEZIER_MOVE ): nId = mnPolyMoveId; break;
752 0 : case( SID_BEZIER_INSERT ): nId = mnPolyInsertId; break;
753 :
754 : default:
755 0 : break;
756 : }
757 :
758 0 : m_pTbxIMapDlg1->CheckItem( nId, true );
759 : }
760 : else
761 : {
762 0 : m_pTbxIMapDlg1->CheckItem( mnPolyEditId, false );
763 0 : m_pTbxIMapDlg1->CheckItem( mnPolyMoveId, true );
764 0 : m_pTbxIMapDlg1->CheckItem( mnPolyInsertId, false );
765 0 : pWnd->SetPolyEditMode( 0 );
766 : }
767 :
768 0 : return 0L;
769 : }
770 :
771 0 : IMPL_LINK_NOARG(SvxIMapDlg, MiscHdl)
772 : {
773 0 : SvtMiscOptions aMiscOptions;
774 0 : m_pTbxIMapDlg1->SetOutStyle( aMiscOptions.GetToolboxStyle() );
775 :
776 0 : return 0L;
777 594 : }
778 :
779 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|