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_basctl.hxx" 30 31 //svdraw.hxx 32 //#define _SVDRAW_HXX *** 33 #define _SDR_NOITEMS 34 #define _SDR_NOTOUCH 35 #define _SDR_NOTRANSFORM 36 #define _SDR_NOOBJECTS 37 //#define _SDR_NOVIEWS *** 38 #define _SDR_NOVIEWMARKER 39 #define _SDR_NODRAGMETHODS 40 //#define _SDR_NOUNDO *** 41 #define _SDR_NOXOUTDEV 42 43 #include <ide_pch.hxx> 44 45 46 #include <vector> 47 #include <basidesh.hrc> 48 #include <baside3.hxx> 49 #include <localizationmgr.hxx> 50 #include <accessibledialogwindow.hxx> 51 #include <dlged.hxx> 52 #include <dlgedmod.hxx> 53 #include <dlgedview.hxx> 54 #include <dlgeddef.hxx> 55 #include <propbrw.hxx> 56 57 #include <basobj.hxx> 58 #include <iderdll.hxx> 59 #include <basidesh.hxx> 60 #include <idetemp.hxx> 61 #include <helpid.hrc> 62 #include <bastype2.hxx> 63 #include <svx/svdview.hxx> 64 #include <editeng/unolingu.hxx> 65 #include <tools/diagnose_ex.h> 66 #include <tools/urlobj.hxx> 67 #include <comphelper/processfactory.hxx> 68 #include <com/sun/star/container/XNameContainer.hpp> 69 #include <com/sun/star/beans/XPropertySet.hpp> 70 #include <xmlscript/xmldlg_imexp.hxx> 71 #ifndef _COM_SUN_STAR_SCRIPT_XLIBRYARYCONTAINER2_HPP_ 72 #include <com/sun/star/script/XLibraryContainer2.hpp> 73 #endif 74 #include <svtools/ehdl.hxx> 75 #include <svtools/langtab.hxx> 76 #include <com/sun/star/ui/dialogs/XFilePicker.hpp> 77 #include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp> 78 #include <com/sun/star/ui/dialogs/XFilterManager.hpp> 79 #include <com/sun/star/ui/dialogs/TemplateDescription.hpp> 80 #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp> 81 #include <com/sun/star/ucb/XSimpleFileAccess.hpp> 82 #include <com/sun/star/resource/XStringResourceResolver.hpp> 83 #include <com/sun/star/resource/StringResourceWithLocation.hpp> 84 #include <com/sun/star/task/XInteractionHandler.hpp> 85 86 using namespace comphelper; 87 using namespace ::com::sun::star; 88 using namespace ::com::sun::star::uno; 89 using namespace ::com::sun::star::ucb; 90 using namespace ::com::sun::star::io; 91 using namespace ::com::sun::star::resource; 92 using namespace ::com::sun::star::ui::dialogs; 93 94 #if defined(UNX) 95 #define FILTERMASK_ALL "*" 96 #elif defined(PM2) 97 #define FILTERMASK_ALL "" 98 #else 99 #define FILTERMASK_ALL "*.*" 100 #endif 101 102 DBG_NAME( DialogWindow ) 103 104 TYPEINIT1( DialogWindow, IDEBaseWindow ); 105 106 DialogWindow::DialogWindow( Window* pParent, const ScriptDocument& rDocument, String aLibName, String aName, 107 const com::sun::star::uno::Reference< com::sun::star::container::XNameContainer >& xDialogModel ) 108 :IDEBaseWindow( pParent, rDocument, aLibName, aName ) 109 ,pUndoMgr(NULL) 110 { 111 InitSettings( sal_True, sal_True, sal_True ); 112 113 pEditor = new DlgEditor(); 114 pEditor->SetWindow( this ); 115 pEditor->SetDialog( xDialogModel ); 116 117 // Undo einrichten 118 pUndoMgr = new SfxUndoManager; 119 120 Link aDummyLink; 121 aOldNotifyUndoActionHdl = pEditor->GetModel()->GetNotifyUndoActionHdl(); 122 pEditor->GetModel()->SetNotifyUndoActionHdl( 123 LINK(this, DialogWindow, NotifyUndoActionHdl)); 124 125 SetHelpId( HID_BASICIDE_DIALOGWINDOW ); 126 127 // set readonly mode for readonly libraries 128 ::rtl::OUString aOULibName( aLibName ); 129 Reference< script::XLibraryContainer2 > xDlgLibContainer( GetDocument().getLibraryContainer( E_DIALOGS ), UNO_QUERY ); 130 if ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aOULibName ) && xDlgLibContainer->isLibraryReadOnly( aOULibName ) ) 131 SetReadOnly( sal_True ); 132 133 if ( rDocument.isDocument() && rDocument.isReadOnly() ) 134 SetReadOnly( sal_True ); 135 } 136 137 DialogWindow::~DialogWindow() 138 { 139 delete pEditor; 140 delete pUndoMgr; 141 } 142 143 void DialogWindow::LoseFocus() 144 { 145 if ( IsModified() ) 146 StoreData(); 147 148 Window::LoseFocus(); 149 } 150 151 152 153 void DialogWindow::Paint( const Rectangle& rRect ) 154 { 155 pEditor->Paint( rRect ); 156 } 157 158 159 160 void DialogWindow::Resize() 161 { 162 if ( GetHScrollBar() && GetVScrollBar() ) { 163 pEditor->SetScrollBars( GetHScrollBar(), GetVScrollBar() ); 164 } 165 } 166 167 168 169 void DialogWindow::MouseButtonDown( const MouseEvent& rMEvt ) 170 { 171 pEditor->MouseButtonDown( rMEvt ); 172 173 SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); 174 if ( pBindings ) 175 pBindings->Invalidate( SID_SHOW_PROPERTYBROWSER ); 176 } 177 178 179 180 void DialogWindow::MouseButtonUp( const MouseEvent& rMEvt ) 181 { 182 pEditor->MouseButtonUp( rMEvt ); 183 SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); 184 if( (pEditor->GetMode() == DLGED_INSERT) && !pEditor->IsCreateOK() ) 185 { 186 pEditor->SetMode( DLGED_SELECT ); 187 if ( pBindings ) 188 pBindings->Invalidate( SID_CHOOSE_CONTROLS ); 189 } 190 if ( pBindings ) 191 { 192 pBindings->Invalidate( SID_SHOW_PROPERTYBROWSER ); 193 pBindings->Invalidate( SID_DOC_MODIFIED ); 194 pBindings->Invalidate( SID_SAVEDOC ); 195 } 196 } 197 198 199 200 void DialogWindow::MouseMove( const MouseEvent& rMEvt ) 201 { 202 pEditor->MouseMove( rMEvt ); 203 } 204 205 206 207 void DialogWindow::KeyInput( const KeyEvent& rKEvt ) 208 { 209 if( rKEvt.GetKeyCode() == KEY_BACKSPACE ) 210 { 211 BasicIDEShell* pIDEShell = IDE_DLL()->GetShell(); 212 SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL; 213 SfxDispatcher* pDispatcher = pViewFrame ? pViewFrame->GetDispatcher() : NULL; 214 if( pDispatcher ) 215 { 216 pDispatcher->Execute( SID_BACKSPACE ); 217 } 218 } 219 else 220 { 221 SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); 222 if( pBindings && rKEvt.GetKeyCode() == KEY_TAB ) 223 pBindings->Invalidate( SID_SHOW_PROPERTYBROWSER ); 224 225 if( !pEditor->KeyInput( rKEvt ) ) 226 { 227 if( !SfxViewShell::Current()->KeyInput( rKEvt ) ) 228 Window::KeyInput( rKEvt ); 229 } 230 } 231 } 232 233 void DialogWindow::Command( const CommandEvent& rCEvt ) 234 { 235 if ( ( rCEvt.GetCommand() == COMMAND_WHEEL ) || 236 ( rCEvt.GetCommand() == COMMAND_STARTAUTOSCROLL ) || 237 ( rCEvt.GetCommand() == COMMAND_AUTOSCROLL ) ) 238 { 239 HandleScrollCommand( rCEvt, GetHScrollBar(), GetVScrollBar() ); 240 } 241 else if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU ) 242 { 243 BasicIDEShell* pIDEShell = IDE_DLL()->GetShell(); 244 SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL; 245 SfxDispatcher* pDispatcher = pViewFrame ? pViewFrame->GetDispatcher() : NULL; 246 if ( pDispatcher ) 247 { 248 SdrView* pView = GetView(); 249 if( !rCEvt.IsMouseEvent() && pView->AreObjectsMarked() ) 250 { 251 Rectangle aMarkedRect( pView->GetMarkedRect() ); 252 Point MarkedCenter( aMarkedRect.Center() ); 253 Point PosPixel( LogicToPixel( MarkedCenter ) ); 254 pDispatcher->ExecutePopup( IDEResId(RID_POPUP_DLGED), this, &PosPixel ); 255 } 256 else 257 { 258 pDispatcher->ExecutePopup( IDEResId(RID_POPUP_DLGED) ); 259 } 260 261 } 262 } 263 else 264 IDEBaseWindow::Command( rCEvt ); 265 } 266 267 268 269 270 IMPL_LINK( DialogWindow, NotifyUndoActionHdl, SfxUndoAction *, pUndoAction ) 271 { 272 (void)pUndoAction; 273 274 // not working yet for unocontrols 275 /* 276 if (pUndoAction) 277 { 278 pUndoMgr->AddUndoAction( pUndoAction ); 279 SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); 280 if ( pBindings ) 281 pBindings->Invalidate( SID_UNDO ); 282 } 283 */ 284 285 return 0; 286 } 287 288 289 290 void __EXPORT DialogWindow::DoInit() 291 { 292 GetHScrollBar()->Show(); 293 GetVScrollBar()->Show(); 294 pEditor->SetScrollBars( GetHScrollBar(), GetVScrollBar() ); 295 } 296 297 298 299 void __EXPORT DialogWindow::DoScroll( ScrollBar* pCurScrollBar ) 300 { 301 pEditor->DoScroll( pCurScrollBar ); 302 } 303 304 void __EXPORT DialogWindow::GetState( SfxItemSet& rSet ) 305 { 306 SfxWhichIter aIter(rSet); 307 for ( sal_uInt16 nWh = aIter.FirstWhich(); 0 != nWh; nWh = aIter.NextWhich() ) 308 { 309 switch ( nWh ) 310 { 311 case SID_PASTE: 312 { 313 if ( !IsPasteAllowed() ) 314 rSet.DisableItem( nWh ); 315 316 if ( IsReadOnly() ) 317 rSet.DisableItem( nWh ); 318 } 319 break; 320 case SID_COPY: 321 { 322 // any object selected? 323 if ( !pEditor->GetView()->AreObjectsMarked() ) 324 rSet.DisableItem( nWh ); 325 } 326 break; 327 case SID_CUT: 328 case SID_DELETE: 329 case SID_BACKSPACE: 330 { 331 // any object selected? 332 if ( !pEditor->GetView()->AreObjectsMarked() ) 333 rSet.DisableItem( nWh ); 334 335 if ( IsReadOnly() ) 336 rSet.DisableItem( nWh ); 337 } 338 break; 339 case SID_REDO: 340 { 341 if ( !pUndoMgr->GetUndoActionCount() ) 342 rSet.DisableItem( nWh ); 343 } 344 break; 345 346 // Nur Dialogfenster: 347 case SID_DIALOG_TESTMODE: 348 { 349 // ist die IDE noch aktiv? 350 if( IDE_DLL()->GetShell()->GetFrame() ) 351 { 352 rSet.Put( SfxBoolItem( SID_DIALOG_TESTMODE, 353 (pEditor->GetMode() == DLGED_TEST) ? sal_True : sal_False) ); 354 } 355 else 356 rSet.Put( SfxBoolItem( SID_DIALOG_TESTMODE,sal_False )); 357 } 358 break; 359 360 case SID_CHOOSE_CONTROLS: 361 { 362 if ( IsReadOnly() ) 363 { 364 rSet.DisableItem( nWh ); 365 } 366 else 367 { 368 SfxAllEnumItem aItem( SID_CHOOSE_CONTROLS ); 369 if ( GetEditor()->GetMode() == DLGED_SELECT ) 370 aItem.SetValue( SVX_SNAP_SELECT ); 371 else 372 { 373 sal_uInt16 nObj; 374 switch( pEditor->GetInsertObj() ) 375 { 376 case OBJ_DLG_PUSHBUTTON: nObj = SVX_SNAP_PUSHBUTTON; break; 377 case OBJ_DLG_RADIOBUTTON: nObj = SVX_SNAP_RADIOBUTTON; break; 378 case OBJ_DLG_CHECKBOX: nObj = SVX_SNAP_CHECKBOX; break; 379 case OBJ_DLG_LISTBOX: nObj = SVX_SNAP_LISTBOX; break; 380 case OBJ_DLG_COMBOBOX: nObj = SVX_SNAP_COMBOBOX; break; 381 case OBJ_DLG_GROUPBOX: nObj = SVX_SNAP_GROUPBOX; break; 382 case OBJ_DLG_EDIT: nObj = SVX_SNAP_EDIT; break; 383 case OBJ_DLG_FIXEDTEXT: nObj = SVX_SNAP_FIXEDTEXT; break; 384 case OBJ_DLG_IMAGECONTROL: nObj = SVX_SNAP_IMAGECONTROL; break; 385 case OBJ_DLG_PROGRESSBAR: nObj = SVX_SNAP_PROGRESSBAR; break; 386 case OBJ_DLG_HSCROLLBAR: nObj = SVX_SNAP_HSCROLLBAR; break; 387 case OBJ_DLG_VSCROLLBAR: nObj = SVX_SNAP_VSCROLLBAR; break; 388 case OBJ_DLG_HFIXEDLINE: nObj = SVX_SNAP_HFIXEDLINE; break; 389 case OBJ_DLG_VFIXEDLINE: nObj = SVX_SNAP_VFIXEDLINE; break; 390 case OBJ_DLG_DATEFIELD: nObj = SVX_SNAP_DATEFIELD; break; 391 case OBJ_DLG_TIMEFIELD: nObj = SVX_SNAP_TIMEFIELD; break; 392 case OBJ_DLG_NUMERICFIELD: nObj = SVX_SNAP_NUMERICFIELD; break; 393 case OBJ_DLG_CURRENCYFIELD: nObj = SVX_SNAP_CURRENCYFIELD; break; 394 case OBJ_DLG_FORMATTEDFIELD: nObj = SVX_SNAP_FORMATTEDFIELD; break; 395 case OBJ_DLG_PATTERNFIELD: nObj = SVX_SNAP_PATTERNFIELD; break; 396 case OBJ_DLG_FILECONTROL: nObj = SVX_SNAP_FILECONTROL; break; 397 case OBJ_DLG_TREECONTROL: nObj = SVX_SNAP_TREECONTROL; break; 398 default: nObj = 0; 399 } 400 #ifdef DBG_UTIL 401 if( !nObj ) 402 { 403 DBG_WARNING( "SID_CHOOSE_CONTROLS: Unbekannt!" ); 404 } 405 #endif 406 aItem.SetValue( nObj ); 407 } 408 409 rSet.Put( aItem ); 410 } 411 } 412 break; 413 414 case SID_SHOW_PROPERTYBROWSER: 415 { 416 BasicIDEShell* pIDEShell = IDE_DLL()->GetShell(); 417 SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL; 418 if ( pViewFrame && !pViewFrame->HasChildWindow( SID_SHOW_PROPERTYBROWSER ) && !pEditor->GetView()->AreObjectsMarked() ) 419 rSet.DisableItem( nWh ); 420 421 if ( IsReadOnly() ) 422 rSet.DisableItem( nWh ); 423 } 424 break; 425 } 426 } 427 } 428 429 430 431 void __EXPORT DialogWindow::ExecuteCommand( SfxRequest& rReq ) 432 { 433 switch ( rReq.GetSlot() ) 434 { 435 case SID_CUT: 436 if ( !IsReadOnly() ) 437 { 438 GetEditor()->Cut(); 439 SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); 440 if ( pBindings ) 441 pBindings->Invalidate( SID_DOC_MODIFIED ); 442 } 443 break; 444 case SID_DELETE: 445 if ( !IsReadOnly() ) 446 { 447 GetEditor()->Delete(); 448 SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); 449 if ( pBindings ) 450 pBindings->Invalidate( SID_DOC_MODIFIED ); 451 } 452 break; 453 case SID_COPY: 454 GetEditor()->Copy(); 455 break; 456 case SID_PASTE: 457 if ( !IsReadOnly() ) 458 { 459 GetEditor()->Paste(); 460 SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); 461 if ( pBindings ) 462 pBindings->Invalidate( SID_DOC_MODIFIED ); 463 } 464 break; 465 case SID_CHOOSE_CONTROLS: 466 { 467 const SfxItemSet* pArgs = rReq.GetArgs(); 468 DBG_ASSERT( pArgs, "Nix Args" ); 469 470 const SfxAllEnumItem& rItem = (SfxAllEnumItem&)pArgs->Get( SID_CHOOSE_CONTROLS ); 471 switch( rItem.GetValue() ) 472 { 473 case SVX_SNAP_PUSHBUTTON: 474 { 475 GetEditor()->SetMode( DLGED_INSERT ); 476 GetEditor()->SetInsertObj( OBJ_DLG_PUSHBUTTON ); 477 } 478 break; 479 case SVX_SNAP_RADIOBUTTON: 480 { 481 GetEditor()->SetMode( DLGED_INSERT ); 482 GetEditor()->SetInsertObj( OBJ_DLG_RADIOBUTTON ); 483 } 484 break; 485 case SVX_SNAP_CHECKBOX: 486 { 487 GetEditor()->SetMode( DLGED_INSERT ); 488 GetEditor()->SetInsertObj( OBJ_DLG_CHECKBOX); 489 } 490 break; 491 case SVX_SNAP_LISTBOX: 492 { 493 GetEditor()->SetMode( DLGED_INSERT ); 494 GetEditor()->SetInsertObj( OBJ_DLG_LISTBOX ); 495 } 496 break; 497 case SVX_SNAP_COMBOBOX: 498 { 499 GetEditor()->SetMode( DLGED_INSERT ); 500 GetEditor()->SetInsertObj( OBJ_DLG_COMBOBOX ); 501 } 502 break; 503 case SVX_SNAP_GROUPBOX: 504 { 505 GetEditor()->SetMode( DLGED_INSERT ); 506 GetEditor()->SetInsertObj( OBJ_DLG_GROUPBOX ); 507 } 508 break; 509 case SVX_SNAP_EDIT: 510 { 511 GetEditor()->SetMode( DLGED_INSERT ); 512 GetEditor()->SetInsertObj( OBJ_DLG_EDIT ); 513 } 514 break; 515 case SVX_SNAP_FIXEDTEXT: 516 { 517 GetEditor()->SetMode( DLGED_INSERT ); 518 GetEditor()->SetInsertObj( OBJ_DLG_FIXEDTEXT ); 519 } 520 break; 521 case SVX_SNAP_IMAGECONTROL: 522 { 523 GetEditor()->SetMode( DLGED_INSERT ); 524 GetEditor()->SetInsertObj( OBJ_DLG_IMAGECONTROL ); 525 } 526 break; 527 case SVX_SNAP_PROGRESSBAR: 528 { 529 GetEditor()->SetMode( DLGED_INSERT ); 530 GetEditor()->SetInsertObj( OBJ_DLG_PROGRESSBAR ); 531 } 532 break; 533 case SVX_SNAP_HSCROLLBAR: 534 { 535 GetEditor()->SetMode( DLGED_INSERT ); 536 GetEditor()->SetInsertObj( OBJ_DLG_HSCROLLBAR ); 537 } 538 break; 539 case SVX_SNAP_VSCROLLBAR: 540 { 541 GetEditor()->SetMode( DLGED_INSERT ); 542 GetEditor()->SetInsertObj( OBJ_DLG_VSCROLLBAR ); 543 } 544 break; 545 case SVX_SNAP_HFIXEDLINE: 546 { 547 GetEditor()->SetMode( DLGED_INSERT ); 548 GetEditor()->SetInsertObj( OBJ_DLG_HFIXEDLINE ); 549 } 550 break; 551 case SVX_SNAP_VFIXEDLINE: 552 { 553 GetEditor()->SetMode( DLGED_INSERT ); 554 GetEditor()->SetInsertObj( OBJ_DLG_VFIXEDLINE ); 555 } 556 break; 557 case SVX_SNAP_DATEFIELD: 558 { 559 GetEditor()->SetMode( DLGED_INSERT ); 560 GetEditor()->SetInsertObj( OBJ_DLG_DATEFIELD ); 561 } 562 break; 563 case SVX_SNAP_TIMEFIELD: 564 { 565 GetEditor()->SetMode( DLGED_INSERT ); 566 GetEditor()->SetInsertObj( OBJ_DLG_TIMEFIELD ); 567 } 568 break; 569 case SVX_SNAP_NUMERICFIELD: 570 { 571 GetEditor()->SetMode( DLGED_INSERT ); 572 GetEditor()->SetInsertObj( OBJ_DLG_NUMERICFIELD ); 573 } 574 break; 575 case SVX_SNAP_CURRENCYFIELD: 576 { 577 GetEditor()->SetMode( DLGED_INSERT ); 578 GetEditor()->SetInsertObj( OBJ_DLG_CURRENCYFIELD ); 579 } 580 break; 581 case SVX_SNAP_FORMATTEDFIELD: 582 { 583 GetEditor()->SetMode( DLGED_INSERT ); 584 GetEditor()->SetInsertObj( OBJ_DLG_FORMATTEDFIELD ); 585 } 586 break; 587 case SVX_SNAP_PATTERNFIELD: 588 { 589 GetEditor()->SetMode( DLGED_INSERT ); 590 GetEditor()->SetInsertObj( OBJ_DLG_PATTERNFIELD ); 591 } 592 break; 593 case SVX_SNAP_FILECONTROL: 594 { 595 GetEditor()->SetMode( DLGED_INSERT ); 596 GetEditor()->SetInsertObj( OBJ_DLG_FILECONTROL ); 597 } 598 break; 599 case SVX_SNAP_TREECONTROL: 600 { 601 GetEditor()->SetMode( DLGED_INSERT ); 602 GetEditor()->SetInsertObj( OBJ_DLG_TREECONTROL ); 603 } 604 break; 605 606 case SVX_SNAP_SELECT: 607 { 608 GetEditor()->SetMode( DLGED_SELECT ); 609 } 610 break; 611 } 612 613 if ( rReq.GetModifier() & KEY_MOD1 ) 614 { 615 if ( GetEditor()->GetMode() == DLGED_INSERT ) 616 GetEditor()->CreateDefaultObject(); 617 } 618 619 SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); 620 if ( pBindings ) 621 pBindings->Invalidate( SID_DOC_MODIFIED ); 622 } 623 break; 624 625 case SID_DIALOG_TESTMODE: 626 { 627 DlgEdMode eOldMode = GetEditor()->GetMode(); 628 GetEditor()->SetMode( DLGED_TEST ); 629 GetEditor()->SetMode( eOldMode ); 630 rReq.Done(); 631 SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); 632 if ( pBindings ) 633 pBindings->Invalidate( SID_DIALOG_TESTMODE ); 634 return; 635 } 636 case SID_EXPORT_DIALOG: 637 SaveDialog(); 638 break; 639 640 case SID_IMPORT_DIALOG: 641 ImportDialog(); 642 break; 643 } 644 645 rReq.Done(); 646 } 647 648 Reference< container::XNameContainer > DialogWindow::GetDialog() const 649 { 650 return pEditor->GetDialog(); 651 } 652 653 sal_Bool DialogWindow::RenameDialog( const String& rNewName ) 654 { 655 if ( !BasicIDE::RenameDialog( this, GetDocument(), GetLibName(), GetName(), rNewName ) ) 656 return sal_False; 657 658 SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); 659 if ( pBindings ) 660 pBindings->Invalidate( SID_DOC_MODIFIED ); 661 662 return sal_True; 663 } 664 665 void DialogWindow::DisableBrowser() 666 { 667 BasicIDEShell* pIDEShell = IDE_DLL()->GetShell(); 668 SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL; 669 SfxChildWindow* pChildWin = pViewFrame ? pViewFrame->GetChildWindow(SID_SHOW_PROPERTYBROWSER) : NULL; 670 if( pChildWin ) 671 ((PropBrw*)(pChildWin->GetWindow()))->Update( NULL ); 672 } 673 674 void DialogWindow::UpdateBrowser() 675 { 676 BasicIDEShell* pIDEShell = IDE_DLL()->GetShell(); 677 SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL; 678 SfxChildWindow* pChildWin = pViewFrame ? pViewFrame->GetChildWindow(SID_SHOW_PROPERTYBROWSER) : NULL; 679 if( pChildWin ) 680 ((PropBrw*)(pChildWin->GetWindow()))->Update( pIDEShell ); 681 } 682 683 static ::rtl::OUString aResourceResolverPropName = 684 ::rtl::OUString::createFromAscii( "ResourceResolver" ); 685 686 sal_Bool DialogWindow::SaveDialog() 687 { 688 DBG_CHKTHIS( DialogWindow, 0 ); 689 sal_Bool bDone = sal_False; 690 691 Reference< lang::XMultiServiceFactory > xMSF( ::comphelper::getProcessServiceFactory() ); 692 Reference < XFilePicker > xFP; 693 if( xMSF.is() ) 694 { 695 Sequence <Any> aServiceType(1); 696 aServiceType[0] <<= TemplateDescription::FILESAVE_AUTOEXTENSION_PASSWORD; 697 xFP = Reference< XFilePicker >( xMSF->createInstanceWithArguments( 698 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.dialogs.FilePicker" ) ), aServiceType ), UNO_QUERY ); 699 } 700 701 Reference< XFilePickerControlAccess > xFPControl(xFP, UNO_QUERY); 702 xFPControl->enableControl(ExtendedFilePickerElementIds::CHECKBOX_PASSWORD, sal_False); 703 Any aValue; 704 aValue <<= (sal_Bool) sal_True; 705 xFPControl->setValue(ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, 0, aValue); 706 707 if ( aCurPath.Len() ) 708 xFP->setDisplayDirectory ( aCurPath ); 709 710 xFP->setDefaultName( ::rtl::OUString( GetName() ) ); 711 712 String aDialogStr( IDEResId( RID_STR_STDDIALOGNAME ) ); 713 Reference< XFilterManager > xFltMgr(xFP, UNO_QUERY); 714 xFltMgr->appendFilter( aDialogStr, String( RTL_CONSTASCII_USTRINGPARAM( "*.xdl" ) ) ); 715 xFltMgr->appendFilter( String( IDEResId( RID_STR_FILTER_ALLFILES ) ), String( RTL_CONSTASCII_USTRINGPARAM( FILTERMASK_ALL ) ) ); 716 xFltMgr->setCurrentFilter( aDialogStr ); 717 718 if( xFP->execute() == RET_OK ) 719 { 720 Sequence< ::rtl::OUString > aPaths = xFP->getFiles(); 721 aCurPath = aPaths[0]; 722 723 // export dialog model to xml 724 Reference< container::XNameContainer > xDialogModel = GetDialog(); 725 Reference< XComponentContext > xContext; 726 Reference< beans::XPropertySet > xProps( ::comphelper::getProcessServiceFactory(), UNO_QUERY ); 727 OSL_ASSERT( xProps.is() ); 728 OSL_VERIFY( xProps->getPropertyValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")) ) >>= xContext ); 729 Reference< XInputStreamProvider > xISP = ::xmlscript::exportDialogModel( xDialogModel, xContext ); 730 Reference< XInputStream > xInput( xISP->createInputStream() ); 731 732 Reference< XSimpleFileAccess > xSFI( xMSF->createInstance 733 ( ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ) ), UNO_QUERY ); 734 735 Reference< XOutputStream > xOutput; 736 try 737 { 738 if( xSFI->exists( aCurPath ) ) 739 xSFI->kill( aCurPath ); 740 xOutput = xSFI->openFileWrite( aCurPath ); 741 } 742 catch( Exception& ) 743 {} 744 745 if( xOutput.is() ) 746 { 747 Sequence< sal_Int8 > bytes; 748 sal_Int32 nRead = xInput->readBytes( bytes, xInput->available() ); 749 for (;;) 750 { 751 if( nRead ) 752 xOutput->writeBytes( bytes ); 753 754 nRead = xInput->readBytes( bytes, 1024 ); 755 if (! nRead) 756 break; 757 } 758 bDone = true; 759 760 // With resource? 761 Reference< beans::XPropertySet > xDialogModelPropSet( xDialogModel, UNO_QUERY ); 762 Reference< resource::XStringResourceResolver > xStringResourceResolver; 763 if( xDialogModelPropSet.is() ) 764 { 765 try 766 { 767 Any aResourceResolver = xDialogModelPropSet->getPropertyValue( aResourceResolverPropName ); 768 aResourceResolver >>= xStringResourceResolver; 769 } 770 catch( beans::UnknownPropertyException& ) 771 {} 772 } 773 774 bool bResource = false; 775 if( xStringResourceResolver.is() ) 776 { 777 Sequence< lang::Locale > aLocaleSeq = xStringResourceResolver->getLocales(); 778 sal_Int32 nLocaleCount = aLocaleSeq.getLength(); 779 if( nLocaleCount > 0 ) 780 bResource = true; 781 } 782 783 if( bResource ) 784 { 785 INetURLObject aURLObj( aCurPath ); 786 aURLObj.removeExtension(); 787 ::rtl::OUString aDialogName( aURLObj.getName() ); 788 aURLObj.removeSegment(); 789 ::rtl::OUString aURL( aURLObj.GetMainURL( INetURLObject::NO_DECODE ) ); 790 sal_Bool bReadOnly = sal_False; 791 ::rtl::OUString aComment( ::rtl::OUString::createFromAscii( "# " ) ); 792 aComment += aDialogName; 793 aComment += ::rtl::OUString::createFromAscii( " strings" ); 794 Reference< task::XInteractionHandler > xDummyHandler; 795 796 // Remove old properties files in case of overwriting Dialog files 797 if( xSFI->isFolder( aURL ) ) 798 { 799 Sequence< ::rtl::OUString > aContentSeq = xSFI->getFolderContents( aURL, false ); 800 801 ::rtl::OUString aDialogName_( aDialogName ); 802 aDialogName_ += ::rtl::OUString::createFromAscii( "_" ); 803 sal_Int32 nCount = aContentSeq.getLength(); 804 const ::rtl::OUString* pFiles = aContentSeq.getConstArray(); 805 for( int i = 0 ; i < nCount ; i++ ) 806 { 807 ::rtl::OUString aCompleteName = pFiles[i]; 808 rtl::OUString aPureName; 809 rtl::OUString aExtension; 810 sal_Int32 iDot = aCompleteName.lastIndexOf( '.' ); 811 sal_Int32 iSlash = aCompleteName.lastIndexOf( '/' ); 812 if( iDot != -1 ) 813 { 814 sal_Int32 iCopyFrom = (iSlash != -1) ? iSlash + 1 : 0; 815 aPureName = aCompleteName.copy( iCopyFrom, iDot-iCopyFrom ); 816 aExtension = aCompleteName.copy( iDot + 1 ); 817 } 818 819 if( aExtension.equalsAscii( "properties" ) || 820 aExtension.equalsAscii( "default" ) ) 821 { 822 if( aPureName.indexOf( aDialogName_ ) == 0 ) 823 { 824 try 825 { 826 xSFI->kill( aCompleteName ); 827 } 828 catch( uno::Exception& ) 829 {} 830 } 831 } 832 } 833 } 834 835 Reference< XStringResourceWithLocation > xStringResourceWithLocation = 836 StringResourceWithLocation::create( xContext, aURL, bReadOnly, 837 xStringResourceResolver->getDefaultLocale(), aDialogName, aComment, xDummyHandler ); 838 839 // Add locales 840 Sequence< lang::Locale > aLocaleSeq = xStringResourceResolver->getLocales(); 841 const lang::Locale* pLocales = aLocaleSeq.getConstArray(); 842 sal_Int32 nLocaleCount = aLocaleSeq.getLength(); 843 for( sal_Int32 iLocale = 0 ; iLocale < nLocaleCount ; iLocale++ ) 844 { 845 const lang::Locale& rLocale = pLocales[ iLocale ]; 846 xStringResourceWithLocation->newLocale( rLocale ); 847 } 848 849 Reference< XStringResourceManager > xTargetStringResourceManager( xStringResourceWithLocation, uno::UNO_QUERY ); 850 851 LocalizationMgr::copyResourceForDialog( xDialogModel, 852 xStringResourceResolver, xTargetStringResourceManager ); 853 854 xStringResourceWithLocation->store(); 855 } 856 } 857 else 858 ErrorBox( this, WB_OK | WB_DEF_OK, String( IDEResId( RID_STR_COULDNTWRITE) ) ).Execute(); 859 } 860 861 return bDone; 862 } 863 864 extern bool localesAreEqual( const ::com::sun::star::lang::Locale& rLocaleLeft, 865 const ::com::sun::star::lang::Locale& rLocaleRight ); 866 867 std::vector< lang::Locale > implGetLanguagesOnlyContainedInFirstSeq 868 ( Sequence< lang::Locale > aFirstSeq, Sequence< lang::Locale > aSecondSeq ) 869 { 870 std::vector< lang::Locale > avRet; 871 872 const lang::Locale* pFirst = aFirstSeq.getConstArray(); 873 const lang::Locale* pSecond = aSecondSeq.getConstArray(); 874 sal_Int32 nFirstCount = aFirstSeq.getLength(); 875 sal_Int32 nSecondCount = aSecondSeq.getLength(); 876 877 for( sal_Int32 iFirst = 0 ; iFirst < nFirstCount ; iFirst++ ) 878 { 879 const lang::Locale& rFirstLocale = pFirst[ iFirst ]; 880 881 bool bAlsoContainedInSecondSeq = false; 882 for( sal_Int32 iSecond = 0 ; iSecond < nSecondCount ; iSecond++ ) 883 { 884 const lang::Locale& rSecondLocale = pSecond[ iSecond ]; 885 886 bool bMatch = localesAreEqual( rFirstLocale, rSecondLocale ); 887 if( bMatch ) 888 { 889 bAlsoContainedInSecondSeq = true; 890 break; 891 } 892 } 893 894 if( !bAlsoContainedInSecondSeq ) 895 avRet.push_back( rFirstLocale ); 896 } 897 898 return avRet; 899 } 900 901 902 class NameClashQueryBox : public MessBox 903 { 904 public: 905 NameClashQueryBox( Window* pParent, 906 const XubString& rTitle, const XubString& rMessage ); 907 }; 908 909 NameClashQueryBox::NameClashQueryBox( Window* pParent, 910 const XubString& rTitle, const XubString& rMessage ) 911 : MessBox( pParent, 0, rTitle, rMessage ) 912 { 913 if ( rTitle.Len() ) 914 SetText( rTitle ); 915 916 maMessText = rMessage; 917 918 AddButton( String( IDEResId( RID_STR_DLGIMP_CLASH_RENAME ) ), RET_YES, 919 BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_OKBUTTON | BUTTONDIALOG_FOCUSBUTTON ); 920 AddButton( String( IDEResId( RID_STR_DLGIMP_CLASH_REPLACE ) ), RET_NO, 0 ); 921 AddButton( BUTTON_CANCEL, RET_CANCEL, BUTTONDIALOG_CANCELBUTTON ); 922 923 SetImage( GetSettings().GetStyleSettings().GetHighContrastMode() ? 924 QueryBox::GetStandardImageHC() : QueryBox::GetStandardImage() ); 925 } 926 927 928 class LanguageMismatchQueryBox : public MessBox 929 { 930 public: 931 LanguageMismatchQueryBox( Window* pParent, 932 const XubString& rTitle, const XubString& rMessage ); 933 }; 934 935 LanguageMismatchQueryBox::LanguageMismatchQueryBox( Window* pParent, 936 const XubString& rTitle, const XubString& rMessage ) 937 : MessBox( pParent, 0, rTitle, rMessage ) 938 { 939 if ( rTitle.Len() ) 940 SetText( rTitle ); 941 942 maMessText = rMessage; 943 AddButton( String( IDEResId( RID_STR_DLGIMP_MISMATCH_ADD ) ), RET_YES, 944 BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_OKBUTTON | BUTTONDIALOG_FOCUSBUTTON ); 945 AddButton( String( IDEResId( RID_STR_DLGIMP_MISMATCH_OMIT ) ), RET_NO, 0 ); 946 AddButton( BUTTON_CANCEL, RET_CANCEL, BUTTONDIALOG_CANCELBUTTON ); 947 AddButton( BUTTON_HELP, BUTTONID_HELP, BUTTONDIALOG_HELPBUTTON, 4 ); 948 949 SetImage( GetSettings().GetStyleSettings().GetHighContrastMode() ? 950 QueryBox::GetStandardImageHC() : QueryBox::GetStandardImage() ); 951 } 952 953 sal_Bool implImportDialog( Window* pWin, const String& rCurPath, const ScriptDocument& rDocument, const String& aLibName ) 954 { 955 sal_Bool bDone = sal_False; 956 957 Reference< lang::XMultiServiceFactory > xMSF( ::comphelper::getProcessServiceFactory() ); 958 Reference < XFilePicker > xFP; 959 if( xMSF.is() ) 960 { 961 Sequence <Any> aServiceType(1); 962 aServiceType[0] <<= TemplateDescription::FILEOPEN_SIMPLE; 963 xFP = Reference< XFilePicker >( xMSF->createInstanceWithArguments( 964 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.dialogs.FilePicker" ) ), aServiceType ), UNO_QUERY ); 965 } 966 967 Reference< XFilePickerControlAccess > xFPControl(xFP, UNO_QUERY); 968 xFPControl->enableControl(ExtendedFilePickerElementIds::CHECKBOX_PASSWORD, sal_False); 969 Any aValue; 970 aValue <<= (sal_Bool) sal_True; 971 xFPControl->setValue(ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, 0, aValue); 972 973 String aCurPath( rCurPath ); 974 if ( aCurPath.Len() ) 975 xFP->setDisplayDirectory ( aCurPath ); 976 977 String aDialogStr( IDEResId( RID_STR_STDDIALOGNAME ) ); 978 Reference< XFilterManager > xFltMgr(xFP, UNO_QUERY); 979 xFltMgr->appendFilter( aDialogStr, String( RTL_CONSTASCII_USTRINGPARAM( "*.xdl" ) ) ); 980 xFltMgr->appendFilter( String( IDEResId( RID_STR_FILTER_ALLFILES ) ), String( RTL_CONSTASCII_USTRINGPARAM( FILTERMASK_ALL ) ) ); 981 xFltMgr->setCurrentFilter( aDialogStr ); 982 983 if( xFP->execute() == RET_OK ) 984 { 985 Sequence< ::rtl::OUString > aPaths = xFP->getFiles(); 986 aCurPath = aPaths[0]; 987 988 ::rtl::OUString aBasePath; 989 ::rtl::OUString aOUCurPath( aCurPath ); 990 sal_Int32 iSlash = aOUCurPath.lastIndexOf( '/' ); 991 if( iSlash != -1 ) 992 aBasePath = aOUCurPath.copy( 0, iSlash + 1 ); 993 994 try 995 { 996 // create dialog model 997 Reference< container::XNameContainer > xDialogModel( xMSF->createInstance 998 ( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlDialogModel" ) ) ), UNO_QUERY_THROW ); 999 1000 Reference< XSimpleFileAccess > xSFI( xMSF->createInstance 1001 ( ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ) ), UNO_QUERY_THROW ); 1002 1003 Reference< XInputStream > xInput; 1004 if( xSFI->exists( aCurPath ) ) 1005 xInput = xSFI->openFileRead( aCurPath ); 1006 1007 Reference< XComponentContext > xContext; 1008 Reference< beans::XPropertySet > xProps( xMSF, UNO_QUERY ); 1009 OSL_ASSERT( xProps.is() ); 1010 OSL_VERIFY( xProps->getPropertyValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")) ) >>= xContext ); 1011 ::xmlscript::importDialogModel( xInput, xDialogModel, xContext ); 1012 1013 String aXmlDlgName; 1014 Reference< beans::XPropertySet > xDialogModelPropSet( xDialogModel, UNO_QUERY ); 1015 if( xDialogModelPropSet.is() ) 1016 { 1017 try 1018 { 1019 Any aXmlDialogNameAny = xDialogModelPropSet->getPropertyValue( DLGED_PROP_NAME ); 1020 ::rtl::OUString aOUXmlDialogName; 1021 aXmlDialogNameAny >>= aOUXmlDialogName; 1022 aXmlDlgName = aOUXmlDialogName; 1023 } 1024 catch( beans::UnknownPropertyException& ) 1025 {} 1026 } 1027 bool bValidName = (aXmlDlgName.Len() != 0); 1028 OSL_ASSERT( bValidName ); 1029 if( !bValidName ) 1030 return bDone; 1031 1032 bool bDialogAlreadyExists = rDocument.hasDialog( aLibName, aXmlDlgName ); 1033 1034 String aNewDlgName = aXmlDlgName; 1035 enum NameClashMode 1036 { 1037 NO_CLASH, 1038 CLASH_OVERWRITE_DIALOG, 1039 CLASH_RENAME_DIALOG, 1040 }; 1041 NameClashMode eNameClashMode = NO_CLASH; 1042 if( bDialogAlreadyExists ) 1043 { 1044 String aQueryBoxTitle( IDEResId( RID_STR_DLGIMP_CLASH_TITLE ) ); 1045 String aQueryBoxText( IDEResId( RID_STR_DLGIMP_CLASH_TEXT ) ); 1046 aQueryBoxText.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "$(ARG1)" ) ), aXmlDlgName ); 1047 1048 NameClashQueryBox aQueryBox( pWin, aQueryBoxTitle, aQueryBoxText ); 1049 sal_uInt16 nRet = aQueryBox.Execute(); 1050 if( RET_YES == nRet ) 1051 { 1052 // RET_YES == Rename, see NameClashQueryBox::NameClashQueryBox 1053 eNameClashMode = CLASH_RENAME_DIALOG; 1054 1055 aNewDlgName = rDocument.createObjectName( E_DIALOGS, aLibName ); 1056 } 1057 else if( RET_NO == nRet ) 1058 { 1059 // RET_NO == Replace, see NameClashQueryBox::NameClashQueryBox 1060 eNameClashMode = CLASH_OVERWRITE_DIALOG; 1061 } 1062 else if( RET_CANCEL == nRet ) 1063 { 1064 return bDone; 1065 } 1066 } 1067 1068 BasicIDEShell* pIDEShell = IDE_DLL()->GetShell(); 1069 if( pIDEShell == NULL ) 1070 { 1071 OSL_ASSERT( pIDEShell != NULL ); 1072 return bDone; 1073 } 1074 1075 // Resource? 1076 ::com::sun::star::lang::Locale aLocale = Application::GetSettings().GetUILocale(); 1077 Reference< task::XInteractionHandler > xDummyHandler; 1078 bool bReadOnly = true; 1079 Reference< XStringResourceWithLocation > xImportStringResource = 1080 StringResourceWithLocation::create( xContext, aBasePath, bReadOnly, 1081 aLocale, aXmlDlgName, ::rtl::OUString(), xDummyHandler ); 1082 1083 Sequence< lang::Locale > aImportLocaleSeq = xImportStringResource->getLocales(); 1084 sal_Int32 nImportLocaleCount = aImportLocaleSeq.getLength(); 1085 1086 Reference< container::XNameContainer > xDialogLib( rDocument.getLibrary( E_DIALOGS, aLibName, sal_True ) ); 1087 Reference< resource::XStringResourceManager > xLibStringResourceManager = LocalizationMgr::getStringResourceFromDialogLibrary( xDialogLib ); 1088 sal_Int32 nLibLocaleCount = 0; 1089 Sequence< lang::Locale > aLibLocaleSeq; 1090 if( xLibStringResourceManager.is() ) 1091 { 1092 aLibLocaleSeq = xLibStringResourceManager->getLocales(); 1093 nLibLocaleCount = aLibLocaleSeq.getLength(); 1094 } 1095 1096 // Check language matches 1097 std::vector< lang::Locale > aOnlyInImportLanguages = 1098 implGetLanguagesOnlyContainedInFirstSeq( aImportLocaleSeq, aLibLocaleSeq ); 1099 int nOnlyInImportLanguageCount = aOnlyInImportLanguages.size(); 1100 1101 // For now: Keep languages from lib 1102 bool bLibLocalized = (nLibLocaleCount > 0); 1103 bool bImportLocalized = (nImportLocaleCount > 0); 1104 1105 bool bAddDialogLanguagesToLib = false; 1106 if( nOnlyInImportLanguageCount > 0 ) 1107 { 1108 String aQueryBoxTitle( IDEResId( RID_STR_DLGIMP_MISMATCH_TITLE ) ); 1109 String aQueryBoxText( IDEResId( RID_STR_DLGIMP_MISMATCH_TEXT ) ); 1110 LanguageMismatchQueryBox aQueryBox( pWin, aQueryBoxTitle, aQueryBoxText ); 1111 sal_uInt16 nRet = aQueryBox.Execute(); 1112 if( RET_YES == nRet ) 1113 { 1114 // RET_YES == Add, see LanguageMismatchQueryBox::LanguageMismatchQueryBox 1115 bAddDialogLanguagesToLib = true; 1116 } 1117 // RET_NO == Omit, see LanguageMismatchQueryBox::LanguageMismatchQueryBox 1118 // -> nothing to do here 1119 //else if( RET_NO == nRet ) 1120 //{ 1121 //} 1122 else if( RET_CANCEL == nRet ) 1123 { 1124 return bDone; 1125 } 1126 } 1127 1128 if( bImportLocalized ) 1129 { 1130 bool bCopyResourcesForDialog = true; 1131 if( bAddDialogLanguagesToLib ) 1132 { 1133 LocalizationMgr* pCurMgr = pIDEShell->GetCurLocalizationMgr(); 1134 1135 lang::Locale aFirstLocale; 1136 aFirstLocale = aOnlyInImportLanguages[0]; 1137 if( nOnlyInImportLanguageCount > 1 ) 1138 { 1139 // Check if import default belongs to only import languages and use it then 1140 lang::Locale aImportDefaultLocale = xImportStringResource->getDefaultLocale(); 1141 lang::Locale aTmpLocale; 1142 for( int i = 0 ; i < nOnlyInImportLanguageCount ; ++i ) 1143 { 1144 aTmpLocale = aOnlyInImportLanguages[i]; 1145 if( localesAreEqual( aImportDefaultLocale, aTmpLocale ) ) 1146 { 1147 aFirstLocale = aImportDefaultLocale; 1148 break; 1149 } 1150 } 1151 } 1152 1153 Sequence< lang::Locale > aFirstLocaleSeq( 1 ); 1154 aFirstLocaleSeq[0] = aFirstLocale; 1155 pCurMgr->handleAddLocales( aFirstLocaleSeq ); 1156 1157 if( nOnlyInImportLanguageCount > 1 ) 1158 { 1159 Sequence< lang::Locale > aRemainingLocaleSeq( nOnlyInImportLanguageCount - 1 ); 1160 lang::Locale aTmpLocale; 1161 int iSeq = 0; 1162 for( int i = 0 ; i < nOnlyInImportLanguageCount ; ++i ) 1163 { 1164 aTmpLocale = aOnlyInImportLanguages[i]; 1165 if( !localesAreEqual( aFirstLocale, aTmpLocale ) ) 1166 aRemainingLocaleSeq[iSeq++] = aTmpLocale; 1167 } 1168 pCurMgr->handleAddLocales( aRemainingLocaleSeq ); 1169 } 1170 } 1171 else if( !bLibLocalized ) 1172 { 1173 Reference< resource::XStringResourceManager > xImportStringResourceManager( xImportStringResource, UNO_QUERY ); 1174 LocalizationMgr::resetResourceForDialog( xDialogModel, xImportStringResourceManager ); 1175 bCopyResourcesForDialog = false; 1176 } 1177 1178 if( bCopyResourcesForDialog ) 1179 { 1180 Reference< resource::XStringResourceResolver > xImportStringResourceResolver( xImportStringResource, UNO_QUERY ); 1181 LocalizationMgr::copyResourceForDroppedDialog( xDialogModel, aXmlDlgName, 1182 xLibStringResourceManager, xImportStringResourceResolver ); 1183 } 1184 } 1185 else if( bLibLocalized ) 1186 { 1187 LocalizationMgr::setResourceIDsForDialog( xDialogModel, xLibStringResourceManager ); 1188 } 1189 1190 1191 LocalizationMgr::setStringResourceAtDialog( rDocument, aLibName, aNewDlgName, xDialogModel ); 1192 1193 if( eNameClashMode == CLASH_OVERWRITE_DIALOG ) 1194 { 1195 if ( BasicIDE::RemoveDialog( rDocument, aLibName, aNewDlgName ) ) 1196 { 1197 IDEBaseWindow* pDlgWin = pIDEShell->FindDlgWin( rDocument, aLibName, aNewDlgName, sal_False, sal_True ); 1198 if( pDlgWin != NULL ) 1199 pIDEShell->RemoveWindow( pDlgWin, sal_True ); 1200 BasicIDE::MarkDocumentModified( rDocument ); 1201 } 1202 else 1203 { 1204 // TODO: Assertion? 1205 return bDone; 1206 } 1207 } 1208 1209 if( eNameClashMode == CLASH_RENAME_DIALOG ) 1210 { 1211 bool bRenamed = false; 1212 if( xDialogModelPropSet.is() ) 1213 { 1214 try 1215 { 1216 Any aXmlDialogNameAny; 1217 aXmlDialogNameAny <<= ::rtl::OUString( aNewDlgName ); 1218 xDialogModelPropSet->setPropertyValue( DLGED_PROP_NAME, aXmlDialogNameAny ); 1219 bRenamed = true; 1220 } 1221 catch( beans::UnknownPropertyException& ) 1222 {} 1223 } 1224 1225 1226 if( bRenamed ) 1227 { 1228 LocalizationMgr::renameStringResourceIDs( rDocument, aLibName, aNewDlgName, xDialogModel ); 1229 } 1230 else 1231 { 1232 // TODO: Assertion? 1233 return bDone; 1234 } 1235 } 1236 1237 Reference< XInputStreamProvider > xISP = ::xmlscript::exportDialogModel( xDialogModel, xContext ); 1238 bool bSuccess = rDocument.insertDialog( aLibName, aNewDlgName, xISP ); 1239 if( bSuccess ) 1240 { 1241 DialogWindow* pNewDlgWin = pIDEShell->CreateDlgWin( rDocument, aLibName, aNewDlgName ); 1242 pIDEShell->SetCurWindow( pNewDlgWin, sal_True ); 1243 } 1244 1245 bDone = sal_True; 1246 } 1247 catch( Exception& ) 1248 {} 1249 } 1250 1251 return bDone; 1252 } 1253 1254 sal_Bool DialogWindow::ImportDialog() 1255 { 1256 DBG_CHKTHIS( DialogWindow, 0 ); 1257 1258 const ScriptDocument& rDocument = GetDocument(); 1259 String aLibName = GetLibName(); 1260 sal_Bool bRet = implImportDialog( this, aCurPath, rDocument, aLibName ); 1261 return bRet; 1262 } 1263 1264 DlgEdModel* DialogWindow::GetModel() const 1265 { 1266 return pEditor ? pEditor->GetModel() : NULL; 1267 } 1268 1269 DlgEdPage* DialogWindow::GetPage() const 1270 { 1271 return pEditor ? pEditor->GetPage() : NULL; 1272 } 1273 1274 DlgEdView* DialogWindow::GetView() const 1275 { 1276 return pEditor ? pEditor->GetView() : NULL; 1277 } 1278 1279 sal_Bool __EXPORT DialogWindow::IsModified() 1280 { 1281 return pEditor->IsModified(); 1282 } 1283 1284 ::svl::IUndoManager* __EXPORT DialogWindow::GetUndoManager() 1285 { 1286 return pUndoMgr; 1287 } 1288 1289 String DialogWindow::GetTitle() 1290 { 1291 return GetName(); 1292 } 1293 1294 BasicEntryDescriptor DialogWindow::CreateEntryDescriptor() 1295 { 1296 ScriptDocument aDocument( GetDocument() ); 1297 String aLibName( GetLibName() ); 1298 String aLibSubName; 1299 LibraryLocation eLocation = aDocument.getLibraryLocation( aLibName ); 1300 return BasicEntryDescriptor( aDocument, eLocation, aLibName, aLibSubName, GetName(), OBJ_TYPE_DIALOG ); 1301 } 1302 1303 void DialogWindow::SetReadOnly( sal_Bool b ) 1304 { 1305 if ( pEditor ) 1306 { 1307 if ( b ) 1308 pEditor->SetMode( DLGED_READONLY ); 1309 else 1310 pEditor->SetMode( DLGED_SELECT ); 1311 } 1312 } 1313 1314 sal_Bool DialogWindow::IsReadOnly() 1315 { 1316 sal_Bool bReadOnly = sal_False; 1317 1318 if ( pEditor && pEditor->GetMode() == DLGED_READONLY ) 1319 bReadOnly = sal_True; 1320 1321 return bReadOnly; 1322 } 1323 1324 sal_Bool DialogWindow::IsPasteAllowed() 1325 { 1326 return pEditor ? pEditor->IsPasteAllowed() : sal_False; 1327 } 1328 1329 void DialogWindow::StoreData() 1330 { 1331 if ( IsModified() ) 1332 { 1333 try 1334 { 1335 Reference< container::XNameContainer > xLib = GetDocument().getLibrary( E_DIALOGS, GetLibName(), true ); 1336 1337 if( xLib.is() ) 1338 { 1339 Reference< container::XNameContainer > xDialogModel = pEditor->GetDialog(); 1340 1341 if( xDialogModel.is() ) 1342 { 1343 Reference< XComponentContext > xContext; 1344 Reference< beans::XPropertySet > xProps( ::comphelper::getProcessServiceFactory(), UNO_QUERY ); 1345 OSL_ASSERT( xProps.is() ); 1346 OSL_VERIFY( xProps->getPropertyValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")) ) >>= xContext ); 1347 Reference< XInputStreamProvider > xISP = ::xmlscript::exportDialogModel( xDialogModel, xContext ); 1348 xLib->replaceByName( ::rtl::OUString( GetName() ), makeAny( xISP ) ); 1349 } 1350 } 1351 } 1352 catch ( uno::Exception& ) 1353 { 1354 DBG_UNHANDLED_EXCEPTION(); 1355 } 1356 BasicIDE::MarkDocumentModified( GetDocument() ); 1357 pEditor->ClearModifyFlag(); 1358 } 1359 } 1360 1361 void DialogWindow::Deactivating() 1362 { 1363 if ( IsModified() ) 1364 BasicIDE::MarkDocumentModified( GetDocument() ); 1365 } 1366 1367 sal_Int32 DialogWindow::countPages( Printer* pPrinter ) 1368 { 1369 return pEditor->countPages( pPrinter ); 1370 } 1371 1372 void DialogWindow::printPage( sal_Int32 nPage, Printer* pPrinter ) 1373 { 1374 pEditor->printPage( nPage, pPrinter, CreateQualifiedName() ); 1375 } 1376 1377 void DialogWindow::DataChanged( const DataChangedEvent& rDCEvt ) 1378 { 1379 if( (rDCEvt.GetType()==DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) ) 1380 { 1381 InitSettings( sal_True, sal_True, sal_True ); 1382 Invalidate(); 1383 } 1384 else 1385 IDEBaseWindow::DataChanged( rDCEvt ); 1386 } 1387 1388 void DialogWindow::InitSettings(sal_Bool bFont,sal_Bool bForeground,sal_Bool bBackground) 1389 { 1390 const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); 1391 if( bFont ) 1392 { 1393 Font aFont; 1394 aFont = rStyleSettings.GetFieldFont(); 1395 SetPointFont( aFont ); 1396 } 1397 1398 if( bForeground || bFont ) 1399 { 1400 SetTextColor( rStyleSettings.GetFieldTextColor() ); 1401 SetTextFillColor(); 1402 } 1403 1404 if( bBackground ) 1405 SetBackground( rStyleSettings.GetFieldColor() ); 1406 } 1407 1408 ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > DialogWindow::CreateAccessible() 1409 { 1410 return (::com::sun::star::accessibility::XAccessible*) new AccessibleDialogWindow( this ); 1411 } 1412