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