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