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