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