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