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 :
21 :
22 : #include "basidesh.hrc"
23 :
24 : #include "moduldlg.hxx"
25 : #include "localizationmgr.hxx"
26 : #include "basidesh.hxx"
27 :
28 : #include <basic/basmgr.hxx>
29 : #include <com/sun/star/script/XLibraryContainerPassword.hpp>
30 : #include <comphelper/processfactory.hxx>
31 : #include <sfx2/app.hxx>
32 : #include <sfx2/dispatch.hxx>
33 : #include <sfx2/request.hxx>
34 : #include <svl/stritem.hxx>
35 : #include <vcl/builderfactory.hxx>
36 : #include <tools/diagnose_ex.h>
37 : #include <xmlscript/xmldlg_imexp.hxx>
38 : #include <svtools/treelistentry.hxx>
39 :
40 : namespace basctl
41 : {
42 :
43 : using namespace ::com::sun::star;
44 : using namespace ::com::sun::star::uno;
45 : using namespace ::com::sun::star::resource;
46 :
47 :
48 : // ExtTreeListBox
49 :
50 0 : ExtTreeListBox::ExtTreeListBox(vcl::Window* pParent, WinBits nStyle)
51 0 : : TreeListBox(pParent, nStyle)
52 : {
53 0 : }
54 :
55 0 : VCL_BUILDER_DECL_FACTORY(ExtTreeListBox)
56 : {
57 0 : WinBits nWinBits = WB_TABSTOP;
58 0 : OString sBorder = VclBuilder::extractCustomProperty(rMap);
59 0 : if (!sBorder.isEmpty())
60 0 : nWinBits |= WB_BORDER;
61 0 : rRet = VclPtr<ExtTreeListBox>::Create(pParent, nWinBits);
62 0 : }
63 :
64 0 : bool ExtTreeListBox::EditingEntry( SvTreeListEntry* pEntry, Selection& )
65 : {
66 0 : bool bRet = false;
67 :
68 0 : if ( pEntry )
69 : {
70 0 : sal_uInt16 nDepth = GetModel()->GetDepth( pEntry );
71 0 : if ( nDepth >= 2 )
72 : {
73 0 : EntryDescriptor aDesc = GetEntryDescriptor(pEntry);
74 0 : ScriptDocument aDocument( aDesc.GetDocument() );
75 0 : OUString aLibName( aDesc.GetLibName() );
76 0 : Reference< script::XLibraryContainer2 > xModLibContainer( aDocument.getLibraryContainer( E_SCRIPTS ), UNO_QUERY );
77 0 : Reference< script::XLibraryContainer2 > xDlgLibContainer( aDocument.getLibraryContainer( E_DIALOGS ), UNO_QUERY );
78 0 : if ( !( ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) && xModLibContainer->isLibraryReadOnly( aLibName ) ) ||
79 0 : ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aLibName ) && xDlgLibContainer->isLibraryReadOnly( aLibName ) ) ) )
80 : {
81 : // allow editing only for libraries, which are not readonly
82 0 : bRet = true;
83 0 : }
84 : }
85 : }
86 :
87 0 : return bRet;
88 : }
89 :
90 0 : bool ExtTreeListBox::EditedEntry( SvTreeListEntry* pEntry, const OUString& rNewText )
91 : {
92 0 : if ( !IsValidSbxName(rNewText) )
93 : {
94 0 : ScopedVclPtrInstance<MessageDialog>::Create(this, IDE_RESSTR(RID_STR_BADSBXNAME))->Execute();
95 0 : return false;
96 : }
97 :
98 0 : OUString aCurText( GetEntryText( pEntry ) );
99 0 : if ( aCurText == rNewText )
100 : // nothing to do
101 0 : return true;
102 :
103 0 : EntryDescriptor aDesc = GetEntryDescriptor(pEntry);
104 0 : ScriptDocument aDocument( aDesc.GetDocument() );
105 : DBG_ASSERT( aDocument.isValid(), "ExtTreeListBox::EditedEntry: no document!" );
106 0 : if ( !aDocument.isValid() )
107 0 : return false;
108 0 : OUString aLibName( aDesc.GetLibName() );
109 0 : EntryType eType = aDesc.GetType();
110 :
111 : bool bSuccess = eType == OBJ_TYPE_MODULE ?
112 0 : RenameModule(this, aDocument, aLibName, aCurText, rNewText) :
113 0 : RenameDialog(this, aDocument, aLibName, aCurText, rNewText);
114 :
115 0 : if ( !bSuccess )
116 0 : return false;
117 :
118 0 : MarkDocumentModified( aDocument );
119 :
120 0 : if (SfxDispatcher* pDispatcher = GetDispatcher())
121 : {
122 0 : SbxItem aSbxItem( SID_BASICIDE_ARG_SBX, aDocument, aLibName, rNewText, ConvertType( eType ) );
123 : pDispatcher->Execute( SID_BASICIDE_SBXRENAMED,
124 0 : SfxCallMode::SYNCHRON, &aSbxItem, 0L );
125 : }
126 :
127 : // OV-Bug?!
128 0 : SetEntryText( pEntry, rNewText );
129 0 : SetCurEntry( pEntry );
130 0 : SetCurEntry( pEntry );
131 0 : Select( pEntry, false );
132 0 : Select( pEntry ); // so that handler is called => update edit
133 :
134 0 : return true;
135 : }
136 :
137 :
138 0 : DragDropMode ExtTreeListBox::NotifyStartDrag( TransferDataContainer&, SvTreeListEntry* pEntry )
139 : {
140 0 : DragDropMode nMode_ = DragDropMode::NONE;
141 :
142 0 : if ( pEntry )
143 : {
144 0 : sal_uInt16 nDepth = GetModel()->GetDepth( pEntry );
145 0 : if ( nDepth >= 2 )
146 : {
147 0 : nMode_ = DragDropMode::CTRL_COPY;
148 0 : EntryDescriptor aDesc = GetEntryDescriptor(pEntry);
149 0 : ScriptDocument aDocument( aDesc.GetDocument() );
150 0 : OUString aLibName( aDesc.GetLibName() );
151 : // allow MOVE mode only for libraries, which are not readonly
152 0 : Reference< script::XLibraryContainer2 > xModLibContainer( aDocument.getLibraryContainer( E_SCRIPTS ), UNO_QUERY );
153 0 : Reference< script::XLibraryContainer2 > xDlgLibContainer( aDocument.getLibraryContainer( E_DIALOGS ), UNO_QUERY );
154 0 : if ( !( ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) && xModLibContainer->isLibraryReadOnly( aLibName ) ) ||
155 0 : ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aLibName ) && xDlgLibContainer->isLibraryReadOnly( aLibName ) ) ) )
156 : {
157 : // Only allow copy for localized libraries
158 0 : bool bAllowMove = true;
159 0 : if ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aLibName ) )
160 : {
161 : // Get StringResourceManager
162 0 : Reference< container::XNameContainer > xDialogLib( aDocument.getLibrary( E_DIALOGS, aLibName, true ) );
163 : Reference< XStringResourceManager > xSourceMgr =
164 0 : LocalizationMgr::getStringResourceFromDialogLibrary( xDialogLib );
165 0 : if( xSourceMgr.is() )
166 0 : bAllowMove = ( xSourceMgr->getLocales().getLength() == 0 );
167 : }
168 0 : if( bAllowMove )
169 0 : nMode_ |= DragDropMode::CTRL_MOVE;
170 0 : }
171 : }
172 : }
173 :
174 0 : return nMode_;
175 : }
176 :
177 :
178 0 : bool ExtTreeListBox::NotifyAcceptDrop( SvTreeListEntry* pEntry )
179 : {
180 : // don't drop on a BasicManager (nDepth == 0)
181 0 : sal_uInt16 nDepth = pEntry ? GetModel()->GetDepth( pEntry ) : 0;
182 0 : bool bValid = nDepth != 0;
183 :
184 : // don't drop in the same library
185 0 : SvTreeListEntry* pSelected = FirstSelected();
186 0 : if ( ( nDepth == 1 ) && ( pEntry == GetParent( pSelected ) ) )
187 0 : bValid = false;
188 0 : else if ( ( nDepth == 2 ) && ( GetParent( pEntry ) == GetParent( pSelected ) ) )
189 0 : bValid = false;
190 :
191 : // don't drop on a library, which is not loaded, readonly or password protected
192 : // or which already has a module/dialog with this name
193 0 : if ( bValid && ( nDepth > 0 ) )
194 : {
195 : // get source module/dialog name
196 0 : EntryDescriptor aSourceDesc = GetEntryDescriptor(pSelected);
197 0 : OUString aSourceName = aSourceDesc.GetName();
198 0 : EntryType eSourceType = aSourceDesc.GetType();
199 :
200 : // get target shell and target library name
201 0 : EntryDescriptor aDestDesc = GetEntryDescriptor(pEntry);
202 0 : ScriptDocument const& rDestDoc = aDestDesc.GetDocument();
203 0 : OUString aDestLibName = aDestDesc.GetLibName();
204 :
205 : // check if module library is not loaded, readonly or password protected
206 0 : Reference< script::XLibraryContainer2 > xModLibContainer( rDestDoc.getLibraryContainer( E_SCRIPTS ), UNO_QUERY );
207 0 : if ( xModLibContainer.is() && xModLibContainer->hasByName( aDestLibName ) )
208 : {
209 0 : if ( !xModLibContainer->isLibraryLoaded( aDestLibName ) )
210 0 : bValid = false;
211 :
212 0 : if ( xModLibContainer->isLibraryReadOnly( aDestLibName ) )
213 0 : bValid = false;
214 :
215 0 : Reference< script::XLibraryContainerPassword > xPasswd( xModLibContainer, UNO_QUERY );
216 0 : if ( xPasswd.is() && xPasswd->isLibraryPasswordProtected( aDestLibName ) && !xPasswd->isLibraryPasswordVerified( aDestLibName ) )
217 0 : bValid = false;
218 : }
219 :
220 : // check if dialog library is not loaded or readonly
221 0 : Reference< script::XLibraryContainer2 > xDlgLibContainer( rDestDoc.getLibraryContainer( E_DIALOGS ), UNO_QUERY );
222 0 : if ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aDestLibName ) )
223 : {
224 0 : if ( !xDlgLibContainer->isLibraryLoaded( aDestLibName ) )
225 0 : bValid = false;
226 :
227 0 : if ( xDlgLibContainer->isLibraryReadOnly( aDestLibName ) )
228 0 : bValid = false;
229 : }
230 :
231 : // check, if module/dialog with this name is already existing in target library
232 0 : if ( ( eSourceType == OBJ_TYPE_MODULE && rDestDoc.hasModule( aDestLibName, aSourceName ) ) ||
233 0 : ( eSourceType == OBJ_TYPE_DIALOG && rDestDoc.hasDialog( aDestLibName, aSourceName ) ) )
234 : {
235 0 : bValid = false;
236 0 : }
237 : }
238 :
239 0 : return bValid;
240 : }
241 :
242 0 : TriState ExtTreeListBox::NotifyMoving( SvTreeListEntry* pTarget, SvTreeListEntry* pEntry,
243 : SvTreeListEntry*& rpNewParent, sal_uLong& rNewChildPos )
244 : {
245 : return NotifyCopyingMoving( pTarget, pEntry,
246 0 : rpNewParent, rNewChildPos, true );
247 : }
248 :
249 0 : TriState ExtTreeListBox::NotifyCopying( SvTreeListEntry* pTarget, SvTreeListEntry* pEntry,
250 : SvTreeListEntry*& rpNewParent, sal_uLong& rNewChildPos )
251 : {
252 : return NotifyCopyingMoving( pTarget, pEntry,
253 0 : rpNewParent, rNewChildPos, false );
254 : }
255 :
256 0 : void Shell::CopyDialogResources(
257 : Reference< io::XInputStreamProvider >& io_xISP,
258 : ScriptDocument const& rSourceDoc,
259 : OUString const& rSourceLibName,
260 : ScriptDocument const& rDestDoc,
261 : OUString const& rDestLibName,
262 : OUString const& rDlgName
263 : )
264 : {
265 0 : if ( !io_xISP.is() )
266 0 : return;
267 :
268 : // Get StringResourceManager
269 0 : Reference< container::XNameContainer > xSourceDialogLib( rSourceDoc.getLibrary( E_DIALOGS, rSourceLibName, true ) );
270 : Reference< XStringResourceManager > xSourceMgr =
271 0 : LocalizationMgr::getStringResourceFromDialogLibrary( xSourceDialogLib );
272 0 : if( !xSourceMgr.is() )
273 0 : return;
274 0 : bool bSourceLocalized = ( xSourceMgr->getLocales().getLength() > 0 );
275 :
276 0 : Reference< container::XNameContainer > xDestDialogLib( rDestDoc.getLibrary( E_DIALOGS, rDestLibName, true ) );
277 : Reference< XStringResourceManager > xDestMgr =
278 0 : LocalizationMgr::getStringResourceFromDialogLibrary( xDestDialogLib );
279 0 : if( !xDestMgr.is() )
280 0 : return;
281 0 : bool bDestLocalized = ( xDestMgr->getLocales().getLength() > 0 );
282 :
283 0 : if( !bSourceLocalized && !bDestLocalized )
284 0 : return;
285 :
286 : // create dialog model
287 0 : Reference< XComponentContext > xContext = comphelper::getProcessComponentContext();
288 0 : Reference< container::XNameContainer > xDialogModel = Reference< container::XNameContainer >( xContext->getServiceManager()->createInstanceWithContext
289 0 : ( "com.sun.star.awt.UnoControlDialogModel", xContext ), UNO_QUERY );
290 0 : Reference< io::XInputStream > xInput( io_xISP->createInputStream() );
291 0 : ::xmlscript::importDialogModel( xInput, xDialogModel, xContext, rSourceDoc.isDocument() ? rSourceDoc.getDocument() : Reference< frame::XModel >() );
292 :
293 0 : if( xDialogModel.is() )
294 : {
295 0 : if( bSourceLocalized && bDestLocalized )
296 : {
297 0 : Reference< resource::XStringResourceResolver > xSourceStringResolver( xSourceMgr, UNO_QUERY );
298 0 : LocalizationMgr::copyResourceForDroppedDialog( xDialogModel, rDlgName, xDestMgr, xSourceStringResolver );
299 : }
300 0 : else if( bSourceLocalized )
301 : {
302 0 : LocalizationMgr::resetResourceForDialog( xDialogModel, xSourceMgr );
303 : }
304 0 : else if( bDestLocalized )
305 : {
306 0 : LocalizationMgr::setResourceIDsForDialog( xDialogModel, xDestMgr );
307 : }
308 0 : io_xISP = ::xmlscript::exportDialogModel( xDialogModel, xContext, rDestDoc.isDocument() ? rDestDoc.getDocument() : Reference< frame::XModel >() );
309 0 : }
310 : }
311 :
312 0 : TriState ExtTreeListBox::NotifyCopyingMoving( SvTreeListEntry* pTarget, SvTreeListEntry* pEntry,
313 : SvTreeListEntry*& rpNewParent, sal_uLong& rNewChildPos, bool bMove )
314 : {
315 : (void)pEntry;
316 : DBG_ASSERT( pEntry, "Kein Eintrag?" ); // ASS is ok here, should not be reached
317 : DBG_ASSERT( pTarget, "Kein Ziel?" ); // with NULL (right at the beginning)
318 0 : sal_uInt16 nDepth = GetModel()->GetDepth( pTarget );
319 : DBG_ASSERT( nDepth, "Tiefe?" );
320 0 : if ( nDepth == 1 )
321 : {
322 : // Target = Basic => put module/dialog under the Basic
323 0 : rpNewParent = pTarget;
324 0 : rNewChildPos = 0;
325 : }
326 0 : else if ( nDepth >= 2 )
327 : {
328 : // Target = module/dialog => put module/dialog under the superordinate Basic
329 0 : rpNewParent = GetParent( pTarget );
330 0 : rNewChildPos = SvTreeList::GetRelPos( pTarget ) + 1;
331 : }
332 :
333 : // get target shell and target library name
334 0 : EntryDescriptor aDestDesc = GetEntryDescriptor(rpNewParent);
335 0 : const ScriptDocument& rDestDoc( aDestDesc.GetDocument() );
336 0 : OUString aDestLibName( aDestDesc.GetLibName() );
337 :
338 : // get source shell, library name and module/dialog name
339 0 : EntryDescriptor aSourceDesc = GetEntryDescriptor(FirstSelected());
340 0 : const ScriptDocument rSourceDoc( aSourceDesc.GetDocument() );
341 0 : OUString aSourceLibName( aSourceDesc.GetLibName() );
342 0 : OUString aSourceName( aSourceDesc.GetName() );
343 0 : EntryType eType = aSourceDesc.GetType();
344 :
345 : // get dispatcher
346 0 : SfxDispatcher* pDispatcher = GetDispatcher();
347 :
348 0 : if ( bMove ) // move
349 : {
350 : // remove source module/dialog window
351 0 : if ( rSourceDoc != rDestDoc || aSourceLibName != aDestLibName )
352 : {
353 0 : if( pDispatcher )
354 : {
355 0 : SbxItem aSbxItem( SID_BASICIDE_ARG_SBX, rSourceDoc, aSourceLibName, aSourceName, ConvertType( eType ) );
356 : pDispatcher->Execute( SID_BASICIDE_SBXDELETED,
357 0 : SfxCallMode::SYNCHRON, &aSbxItem, 0L );
358 : }
359 : }
360 :
361 : try
362 : {
363 0 : if ( eType == OBJ_TYPE_MODULE ) // module
364 : {
365 : // get module
366 0 : OUString aModule;
367 0 : if ( rSourceDoc.getModule( aSourceLibName, aSourceName, aModule ) )
368 : {
369 : // remove module from source library
370 0 : if ( rSourceDoc.removeModule( aSourceLibName, aSourceName ) )
371 : {
372 0 : MarkDocumentModified( rSourceDoc );
373 :
374 : // insert module into target library
375 0 : if ( rDestDoc.insertModule( aDestLibName, aSourceName, aModule ) )
376 0 : MarkDocumentModified( rDestDoc );
377 : }
378 0 : }
379 : }
380 0 : else if ( eType == OBJ_TYPE_DIALOG ) // dialog
381 : {
382 : // get dialog
383 0 : Reference< io::XInputStreamProvider > xISP;
384 0 : if ( rSourceDoc.getDialog( aSourceLibName, aSourceName, xISP ) )
385 : {
386 : Shell::CopyDialogResources( xISP, rSourceDoc,
387 0 : aSourceLibName, rDestDoc, aDestLibName, aSourceName );
388 :
389 : // remove dialog from source library
390 0 : if (RemoveDialog(rSourceDoc, aSourceLibName, aSourceName))
391 : {
392 0 : MarkDocumentModified(rSourceDoc);
393 :
394 : // insert dialog into target library
395 0 : if ( rDestDoc.insertDialog( aDestLibName, aSourceName, xISP ) )
396 0 : MarkDocumentModified(rDestDoc);
397 : }
398 0 : }
399 : }
400 : }
401 0 : catch (const uno::Exception& )
402 : {
403 : DBG_UNHANDLED_EXCEPTION();
404 : }
405 : }
406 : else // copy
407 : {
408 : try
409 : {
410 0 : if ( eType == OBJ_TYPE_MODULE ) // module
411 : {
412 : // get module
413 0 : OUString aModule;
414 0 : if ( rSourceDoc.getModule( aSourceLibName, aSourceName, aModule ) )
415 : {
416 : // insert module into target library
417 0 : if ( rDestDoc.insertModule( aDestLibName, aSourceName, aModule ) )
418 0 : MarkDocumentModified( rDestDoc );
419 0 : }
420 : }
421 0 : else if ( eType == OBJ_TYPE_DIALOG ) // dialog
422 : {
423 : // get dialog
424 0 : Reference< io::XInputStreamProvider > xISP;
425 0 : if ( rSourceDoc.getDialog( aSourceLibName, aSourceName, xISP ) )
426 : {
427 : Shell::CopyDialogResources( xISP, rSourceDoc,
428 0 : aSourceLibName, rDestDoc, aDestLibName, aSourceName );
429 :
430 : // insert dialog into target library
431 0 : if ( rDestDoc.insertDialog( aDestLibName, aSourceName, xISP ) )
432 0 : MarkDocumentModified( rDestDoc );
433 0 : }
434 : }
435 : }
436 0 : catch ( const Exception& )
437 : {
438 : DBG_UNHANDLED_EXCEPTION();
439 : }
440 : }
441 :
442 : // create target module/dialog window
443 0 : if ( rSourceDoc != rDestDoc || aSourceLibName != aDestLibName )
444 : {
445 0 : if( pDispatcher )
446 : {
447 0 : SbxItem aSbxItem( SID_BASICIDE_ARG_SBX, rDestDoc, aDestLibName, aSourceName, ConvertType( eType ) );
448 : pDispatcher->Execute( SID_BASICIDE_SBXINSERTED,
449 0 : SfxCallMode::SYNCHRON, &aSbxItem, 0L );
450 : }
451 : }
452 :
453 0 : return TRISTATE_INDET; // open...
454 : }
455 :
456 : // OrganizeDialog
457 0 : OrganizeDialog::OrganizeDialog(vcl::Window* pParent, sal_Int16 tabId,
458 : EntryDescriptor& rDesc )
459 : : TabDialog( pParent, "OrganizeDialog",
460 : "modules/BasicIDE/ui/organizedialog.ui" )
461 0 : , m_aCurEntry( rDesc )
462 : {
463 0 : get(m_pTabCtrl, "tabcontrol");
464 :
465 0 : m_pTabCtrl->SetActivatePageHdl(LINK(this, OrganizeDialog, ActivatePageHdl));
466 :
467 0 : if( tabId == 0 )
468 : {
469 0 : m_pTabCtrl->SetCurPageId(m_pTabCtrl->GetPageId("modules"));
470 : }
471 0 : else if ( tabId == 1 )
472 : {
473 0 : m_pTabCtrl->SetCurPageId(m_pTabCtrl->GetPageId("dialogs"));
474 : }
475 : else
476 : {
477 0 : m_pTabCtrl->SetCurPageId(m_pTabCtrl->GetPageId("libraries"));
478 : }
479 :
480 0 : ActivatePageHdl(m_pTabCtrl);
481 :
482 0 : if (SfxDispatcher* pDispatcher = GetDispatcher())
483 0 : pDispatcher->Execute( SID_BASICIDE_STOREALLMODULESOURCES );
484 0 : }
485 :
486 0 : OrganizeDialog::~OrganizeDialog()
487 : {
488 0 : disposeOnce();
489 0 : }
490 :
491 0 : void OrganizeDialog::dispose()
492 : {
493 0 : if (m_pTabCtrl)
494 : {
495 0 : for ( sal_uInt16 i = 0; i < m_pTabCtrl->GetPageCount(); i++ )
496 0 : VclPtr<vcl::Window>(m_pTabCtrl->GetTabPage( m_pTabCtrl->GetPageId( i ) )).disposeAndClear();
497 : }
498 0 : m_pTabCtrl.clear();
499 :
500 0 : TabDialog::dispose();
501 0 : };
502 :
503 0 : short OrganizeDialog::Execute()
504 : {
505 0 : vcl::Window* pPrevDlgParent = Application::GetDefDialogParent();
506 0 : Application::SetDefDialogParent( this );
507 0 : short nRet = TabDialog::Execute();
508 0 : Application::SetDefDialogParent( pPrevDlgParent );
509 0 : return nRet;
510 : }
511 :
512 :
513 0 : IMPL_LINK( OrganizeDialog, ActivatePageHdl, TabControl *, pTabCtrl )
514 : {
515 0 : sal_uInt16 nId = pTabCtrl->GetCurPageId();
516 :
517 0 : if ( !pTabCtrl->GetTabPage( nId ) )
518 : {
519 0 : OString sPageName(pTabCtrl->GetPageName(nId));
520 0 : VclPtr<TabPage> pNewTabPage;
521 0 : if (sPageName == "modules")
522 : {
523 0 : VclPtrInstance<ObjectPage> pObjectPage(pTabCtrl, "ModulePage", BROWSEMODE_MODULES);
524 0 : pNewTabPage.reset(pObjectPage);
525 0 : pObjectPage->SetTabDlg(this);
526 0 : pObjectPage->SetCurrentEntry(m_aCurEntry);
527 : }
528 0 : else if (sPageName == "dialogs")
529 : {
530 0 : VclPtrInstance<ObjectPage> pObjectPage( pTabCtrl, "DialogPage", BROWSEMODE_DIALOGS );
531 0 : pNewTabPage.reset(pObjectPage);
532 0 : pObjectPage->SetTabDlg(this);
533 0 : pObjectPage->SetCurrentEntry(m_aCurEntry);
534 : }
535 0 : else if (sPageName == "libraries")
536 : {
537 0 : VclPtrInstance<LibPage> pLibPage( pTabCtrl );
538 0 : pNewTabPage.reset(pLibPage);
539 0 : pLibPage->SetTabDlg( this );
540 : }
541 : else
542 : {
543 : OSL_FAIL( "PageHdl: Unbekannte ID!" );
544 : }
545 : DBG_ASSERT( pNewTabPage, "Keine Page!" );
546 0 : pTabCtrl->SetTabPage( nId, pNewTabPage );
547 : }
548 0 : return 0;
549 : }
550 :
551 :
552 : // ObjectPage
553 :
554 :
555 :
556 0 : ObjectPage::ObjectPage(vcl::Window *pParent, const OString &rName, sal_uInt16 nMode)
557 0 : : TabPage(pParent, rName, "modules/BasicIDE/ui/" +
558 0 : OStringToOUString(rName, RTL_TEXTENCODING_UTF8).toAsciiLowerCase() +
559 0 : ".ui")
560 : {
561 0 : get(m_pBasicBox, "library");
562 0 : Size aSize(m_pBasicBox->LogicToPixel(Size(130, 117), MAP_APPFONT));
563 0 : m_pBasicBox->set_height_request(aSize.Height());
564 0 : m_pBasicBox->set_width_request(aSize.Width());
565 0 : get(m_pEditButton, "edit");
566 0 : get(m_pNewModButton, "newmodule");
567 0 : get(m_pNewDlgButton, "newdialog");
568 0 : get(m_pDelButton, "delete");
569 :
570 0 : pTabDlg = 0;
571 :
572 0 : m_pEditButton->SetClickHdl( LINK( this, ObjectPage, ButtonHdl ) );
573 0 : m_pDelButton->SetClickHdl( LINK( this, ObjectPage, ButtonHdl ) );
574 0 : m_pBasicBox->SetSelectHdl( LINK( this, ObjectPage, BasicBoxHighlightHdl ) );
575 :
576 0 : if( nMode & BROWSEMODE_MODULES )
577 : {
578 0 : m_pNewModButton->SetClickHdl( LINK( this, ObjectPage, ButtonHdl ) );
579 0 : m_pNewDlgButton->Hide();
580 : }
581 0 : else if ( nMode & BROWSEMODE_DIALOGS )
582 : {
583 0 : m_pNewDlgButton->SetClickHdl( LINK( this, ObjectPage, ButtonHdl ) );
584 0 : m_pNewModButton->Hide();
585 : }
586 :
587 0 : m_pBasicBox->SetDragDropMode( DragDropMode::CTRL_MOVE | DragDropMode::CTRL_COPY );
588 0 : m_pBasicBox->EnableInplaceEditing(true);
589 0 : m_pBasicBox->SetMode( nMode );
590 0 : m_pBasicBox->SetStyle( WB_BORDER | WB_TABSTOP |
591 : WB_HASLINES | WB_HASLINESATROOT |
592 : WB_HASBUTTONS | WB_HASBUTTONSATROOT |
593 0 : WB_HSCROLL );
594 0 : m_pBasicBox->ScanAllEntries();
595 :
596 0 : m_pEditButton->GrabFocus();
597 0 : CheckButtons();
598 0 : }
599 :
600 0 : ObjectPage::~ObjectPage()
601 : {
602 0 : disposeOnce();
603 0 : }
604 :
605 0 : void ObjectPage::dispose()
606 : {
607 0 : m_pBasicBox.clear();
608 0 : m_pEditButton.clear();
609 0 : m_pNewModButton.clear();
610 0 : m_pNewDlgButton.clear();
611 0 : m_pDelButton.clear();
612 0 : pTabDlg.clear();
613 0 : TabPage::dispose();
614 0 : }
615 :
616 0 : void ObjectPage::SetCurrentEntry (EntryDescriptor& rDesc)
617 : {
618 0 : m_pBasicBox->SetCurrentEntry( rDesc );
619 0 : }
620 :
621 0 : void ObjectPage::ActivatePage()
622 : {
623 0 : m_pBasicBox->UpdateEntries();
624 0 : }
625 :
626 0 : void ObjectPage::DeactivatePage()
627 : {
628 0 : }
629 :
630 0 : void ObjectPage::CheckButtons()
631 : {
632 : // enable/disable edit button
633 0 : SvTreeListEntry* pCurEntry = m_pBasicBox->GetCurEntry();
634 0 : EntryDescriptor aDesc = m_pBasicBox->GetEntryDescriptor(pCurEntry);
635 0 : ScriptDocument aDocument( aDesc.GetDocument() );
636 0 : OUString aLibName( aDesc.GetLibName() );
637 0 : OUString aLibSubName( aDesc.GetLibSubName() );
638 0 : bool bVBAEnabled = aDocument.isInVBAMode();
639 0 : sal_uInt16 nMode = m_pBasicBox->GetMode();
640 :
641 0 : sal_uInt16 nDepth = pCurEntry ? m_pBasicBox->GetModel()->GetDepth( pCurEntry ) : 0;
642 0 : if ( nDepth >= 2 )
643 : {
644 0 : if( bVBAEnabled && ( nMode & BROWSEMODE_MODULES ) && ( nDepth == 2 ) )
645 0 : m_pEditButton->Disable();
646 : else
647 0 : m_pEditButton->Enable();
648 : }
649 : else
650 0 : m_pEditButton->Disable();
651 :
652 : // enable/disable new module/dialog buttons
653 0 : LibraryLocation eLocation( aDesc.GetLocation() );
654 0 : bool bReadOnly = false;
655 0 : if ( nDepth > 0 )
656 : {
657 0 : Reference< script::XLibraryContainer2 > xModLibContainer( aDocument.getLibraryContainer( E_SCRIPTS ), UNO_QUERY );
658 0 : Reference< script::XLibraryContainer2 > xDlgLibContainer( aDocument.getLibraryContainer( E_DIALOGS ), UNO_QUERY );
659 0 : if ( ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) && xModLibContainer->isLibraryReadOnly( aLibName ) ) ||
660 0 : ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aLibName ) && xDlgLibContainer->isLibraryReadOnly( aLibName ) ) )
661 : {
662 0 : bReadOnly = true;
663 0 : }
664 : }
665 0 : if ( bReadOnly || eLocation == LIBRARY_LOCATION_SHARE )
666 : {
667 0 : m_pNewModButton->Disable();
668 0 : m_pNewDlgButton->Disable();
669 : }
670 : else
671 : {
672 0 : m_pNewModButton->Enable();
673 0 : m_pNewDlgButton->Enable();
674 : }
675 :
676 : // enable/disable delete button
677 0 : if ( nDepth >= 2 && !bReadOnly && eLocation != LIBRARY_LOCATION_SHARE )
678 : {
679 0 : if( bVBAEnabled && ( nMode & BROWSEMODE_MODULES ) && ( ( nDepth == 2 ) || aLibSubName == IDE_RESSTR(RID_STR_DOCUMENT_OBJECTS) ) )
680 0 : m_pDelButton->Disable();
681 : else
682 0 : m_pDelButton->Enable();
683 : }
684 : else
685 0 : m_pDelButton->Disable();
686 0 : }
687 :
688 0 : IMPL_LINK( ObjectPage, BasicBoxHighlightHdl, TreeListBox *, pBox )
689 : {
690 0 : if ( !pBox->IsSelected( pBox->GetHdlEntry() ) )
691 0 : return 0;
692 :
693 0 : CheckButtons();
694 0 : return 0;
695 : }
696 :
697 0 : IMPL_LINK( ObjectPage, ButtonHdl, Button *, pButton )
698 : {
699 0 : if (pButton == m_pEditButton)
700 : {
701 0 : SfxAllItemSet aArgs( SfxGetpApp()->GetPool() );
702 0 : SfxRequest aRequest( SID_BASICIDE_APPEAR, SfxCallMode::SYNCHRON, aArgs );
703 0 : SfxGetpApp()->ExecuteSlot( aRequest );
704 :
705 0 : SfxDispatcher* pDispatcher = GetDispatcher();
706 0 : SvTreeListEntry* pCurEntry = m_pBasicBox->GetCurEntry();
707 : DBG_ASSERT( pCurEntry, "Entry?!" );
708 0 : if ( m_pBasicBox->GetModel()->GetDepth( pCurEntry ) >= 2 )
709 : {
710 0 : EntryDescriptor aDesc = m_pBasicBox->GetEntryDescriptor(pCurEntry);
711 0 : if ( pDispatcher )
712 : {
713 0 : OUString aModName( aDesc.GetName() );
714 : // extract the module name from the string like "Sheet1 (Example1)"
715 0 : if( aDesc.GetLibSubName() == IDE_RESSTR(RID_STR_DOCUMENT_OBJECTS) )
716 : {
717 0 : sal_Int32 nIndex = 0;
718 0 : aModName = aModName.getToken( 0, ' ', nIndex );
719 : }
720 0 : SbxItem aSbxItem( SID_BASICIDE_ARG_SBX, aDesc.GetDocument(), aDesc.GetLibName(),
721 0 : aModName, TreeListBox::ConvertType( aDesc.GetType() ) );
722 0 : pDispatcher->Execute( SID_BASICIDE_SHOWSBX, SfxCallMode::SYNCHRON, &aSbxItem, 0L );
723 0 : }
724 : }
725 : else // Nur Lib selektiert
726 : {
727 : DBG_ASSERT( m_pBasicBox->GetModel()->GetDepth( pCurEntry ) == 1, "Kein LibEntry?!" );
728 0 : ScriptDocument aDocument( ScriptDocument::getApplicationScriptDocument() );
729 0 : SvTreeListEntry* pParentEntry = m_pBasicBox->GetParent( pCurEntry );
730 0 : if ( pParentEntry )
731 : {
732 0 : DocumentEntry* pDocumentEntry = static_cast<DocumentEntry*>(pParentEntry->GetUserData());
733 0 : if (pDocumentEntry)
734 0 : aDocument = pDocumentEntry->GetDocument();
735 : }
736 0 : SfxUsrAnyItem aDocItem( SID_BASICIDE_ARG_DOCUMENT_MODEL, makeAny( aDocument.getDocumentOrNull() ) );
737 0 : OUString aLibName( m_pBasicBox->GetEntryText( pCurEntry ) );
738 0 : SfxStringItem aLibNameItem( SID_BASICIDE_ARG_LIBNAME, aLibName );
739 0 : if ( pDispatcher )
740 : {
741 0 : pDispatcher->Execute( SID_BASICIDE_LIBSELECTED, SfxCallMode::ASYNCHRON, &aDocItem, &aLibNameItem, 0L );
742 0 : }
743 : }
744 0 : EndTabDialog( 1 );
745 : }
746 0 : else if (pButton == m_pNewModButton)
747 0 : NewModule();
748 0 : else if (pButton == m_pNewDlgButton)
749 0 : NewDialog();
750 0 : else if (pButton == m_pDelButton)
751 0 : DeleteCurrent();
752 :
753 0 : return 0;
754 : }
755 :
756 0 : bool ObjectPage::GetSelection( ScriptDocument& rDocument, OUString& rLibName )
757 : {
758 0 : bool bRet = false;
759 :
760 0 : SvTreeListEntry* pCurEntry = m_pBasicBox->GetCurEntry();
761 0 : EntryDescriptor aDesc = m_pBasicBox->GetEntryDescriptor(pCurEntry);
762 0 : rDocument = aDesc.GetDocument();
763 0 : rLibName = aDesc.GetLibName();
764 0 : if ( rLibName.isEmpty() )
765 0 : rLibName = "Standard" ;
766 :
767 : DBG_ASSERT( rDocument.isAlive(), "ObjectPage::GetSelection: no or dead ScriptDocument in the selection!" );
768 0 : if ( !rDocument.isAlive() )
769 0 : return false;
770 :
771 : // check if the module library is loaded
772 0 : bool bOK = true;
773 0 : OUString aLibName( rLibName );
774 0 : Reference< script::XLibraryContainer > xModLibContainer( rDocument.getLibraryContainer( E_SCRIPTS ) );
775 0 : if ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) && !xModLibContainer->isLibraryLoaded( aLibName ) )
776 : {
777 : // check password
778 0 : Reference< script::XLibraryContainerPassword > xPasswd( xModLibContainer, UNO_QUERY );
779 0 : if ( xPasswd.is() && xPasswd->isLibraryPasswordProtected( aLibName ) && !xPasswd->isLibraryPasswordVerified( aLibName ) )
780 : {
781 0 : OUString aPassword;
782 0 : bOK = QueryPassword( xModLibContainer, rLibName, aPassword );
783 : }
784 :
785 : // load library
786 0 : if ( bOK )
787 0 : xModLibContainer->loadLibrary( aLibName );
788 : }
789 :
790 : // check if the dialog library is loaded
791 0 : Reference< script::XLibraryContainer > xDlgLibContainer( rDocument.getLibraryContainer( E_DIALOGS ) );
792 0 : if ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aLibName ) && !xDlgLibContainer->isLibraryLoaded( aLibName ) )
793 : {
794 : // load library
795 0 : if ( bOK )
796 0 : xDlgLibContainer->loadLibrary( aLibName );
797 : }
798 :
799 0 : if ( bOK )
800 0 : bRet = true;
801 :
802 0 : return bRet;
803 : }
804 :
805 0 : void ObjectPage::NewModule()
806 : {
807 0 : ScriptDocument aDocument( ScriptDocument::getApplicationScriptDocument() );
808 0 : OUString aLibName;
809 :
810 0 : if ( GetSelection( aDocument, aLibName ) )
811 : {
812 0 : OUString aModName;
813 : createModImpl( static_cast<vcl::Window*>( this ), aDocument,
814 0 : *m_pBasicBox, aLibName, aModName, true );
815 0 : }
816 0 : }
817 :
818 0 : void ObjectPage::NewDialog()
819 : {
820 0 : ScriptDocument aDocument( ScriptDocument::getApplicationScriptDocument() );
821 0 : OUString aLibName;
822 :
823 0 : if ( GetSelection( aDocument, aLibName ) )
824 : {
825 0 : aDocument.getOrCreateLibrary( E_DIALOGS, aLibName );
826 :
827 0 : ScopedVclPtrInstance< NewObjectDialog > aNewDlg(this, ObjectMode::Dialog, true);
828 0 : aNewDlg->SetObjectName( aDocument.createObjectName( E_DIALOGS, aLibName ) );
829 :
830 0 : if (aNewDlg->Execute() != 0)
831 : {
832 0 : OUString aDlgName = aNewDlg->GetObjectName();
833 0 : if (aDlgName.isEmpty())
834 0 : aDlgName = aDocument.createObjectName( E_DIALOGS, aLibName);
835 :
836 0 : if ( aDocument.hasDialog( aLibName, aDlgName ) )
837 : {
838 0 : ScopedVclPtrInstance<MessageDialog>::Create(this, IDE_RESSTR(RID_STR_SBXNAMEALLREADYUSED2))->Execute();
839 : }
840 : else
841 : {
842 0 : Reference< io::XInputStreamProvider > xISP;
843 0 : if ( !aDocument.createDialog( aLibName, aDlgName, xISP ) )
844 0 : return;
845 :
846 0 : SbxItem aSbxItem( SID_BASICIDE_ARG_SBX, aDocument, aLibName, aDlgName, TYPE_DIALOG );
847 0 : if (SfxDispatcher* pDispatcher = GetDispatcher())
848 : pDispatcher->Execute( SID_BASICIDE_SBXINSERTED,
849 0 : SfxCallMode::SYNCHRON, &aSbxItem, 0L );
850 0 : LibraryLocation eLocation = aDocument.getLibraryLocation( aLibName );
851 0 : SvTreeListEntry* pRootEntry = m_pBasicBox->FindRootEntry( aDocument, eLocation );
852 0 : if ( pRootEntry )
853 : {
854 0 : if ( !m_pBasicBox->IsExpanded( pRootEntry ) )
855 0 : m_pBasicBox->Expand( pRootEntry );
856 0 : SvTreeListEntry* pLibEntry = m_pBasicBox->FindEntry( pRootEntry, aLibName, OBJ_TYPE_LIBRARY );
857 : DBG_ASSERT( pLibEntry, "Libeintrag nicht gefunden!" );
858 0 : if ( pLibEntry )
859 : {
860 0 : if ( !m_pBasicBox->IsExpanded( pLibEntry ) )
861 0 : m_pBasicBox->Expand( pLibEntry );
862 0 : SvTreeListEntry* pEntry = m_pBasicBox->FindEntry( pLibEntry, aDlgName, OBJ_TYPE_DIALOG );
863 0 : if ( !pEntry )
864 : {
865 0 : std::unique_ptr<Entry> e(new Entry(OBJ_TYPE_DIALOG));
866 0 : pEntry = m_pBasicBox->AddEntry(
867 : aDlgName,
868 : Image( IDEResId( RID_IMG_DIALOG ) ),
869 0 : pLibEntry, false, &e);
870 0 : DBG_ASSERT( pEntry, "InsertEntry fehlgeschlagen!" );
871 : }
872 0 : m_pBasicBox->SetCurEntry( pEntry );
873 0 : m_pBasicBox->Select( m_pBasicBox->GetCurEntry() ); // OV-Bug?!
874 : }
875 0 : }
876 0 : }
877 0 : }
878 0 : }
879 : }
880 :
881 0 : void ObjectPage::DeleteCurrent()
882 : {
883 0 : SvTreeListEntry* pCurEntry = m_pBasicBox->GetCurEntry();
884 : DBG_ASSERT( pCurEntry, "Kein aktueller Eintrag!" );
885 0 : EntryDescriptor aDesc( m_pBasicBox->GetEntryDescriptor( pCurEntry ) );
886 0 : ScriptDocument aDocument( aDesc.GetDocument() );
887 : DBG_ASSERT( aDocument.isAlive(), "ObjectPage::DeleteCurrent: no document!" );
888 0 : if ( !aDocument.isAlive() )
889 0 : return;
890 0 : OUString aLibName( aDesc.GetLibName() );
891 0 : OUString aName( aDesc.GetName() );
892 0 : EntryType eType = aDesc.GetType();
893 :
894 0 : if ( ( eType == OBJ_TYPE_MODULE && QueryDelModule( aName, this ) ) ||
895 0 : ( eType == OBJ_TYPE_DIALOG && QueryDelDialog( aName, this ) ) )
896 : {
897 0 : m_pBasicBox->GetModel()->Remove( pCurEntry );
898 0 : if ( m_pBasicBox->GetCurEntry() ) // OV-Bug ?
899 0 : m_pBasicBox->Select( m_pBasicBox->GetCurEntry() );
900 0 : if (SfxDispatcher* pDispatcher = GetDispatcher())
901 : {
902 0 : SbxItem aSbxItem( SID_BASICIDE_ARG_SBX, aDocument, aLibName, aName, TreeListBox::ConvertType( eType ) );
903 : pDispatcher->Execute( SID_BASICIDE_SBXDELETED,
904 0 : SfxCallMode::SYNCHRON, &aSbxItem, 0L );
905 : }
906 :
907 : try
908 : {
909 0 : bool bSuccess = false;
910 0 : if ( eType == OBJ_TYPE_MODULE )
911 0 : bSuccess = aDocument.removeModule( aLibName, aName );
912 0 : else if ( eType == OBJ_TYPE_DIALOG )
913 0 : bSuccess = RemoveDialog( aDocument, aLibName, aName );
914 :
915 0 : if ( bSuccess )
916 0 : MarkDocumentModified( aDocument );
917 : }
918 0 : catch (const container::NoSuchElementException& )
919 : {
920 : DBG_UNHANDLED_EXCEPTION();
921 : }
922 0 : }
923 : }
924 :
925 :
926 :
927 0 : void ObjectPage::EndTabDialog( sal_uInt16 nRet )
928 : {
929 : DBG_ASSERT( pTabDlg, "TabDlg nicht gesetzt!" );
930 0 : if ( pTabDlg )
931 0 : pTabDlg->EndDialog( nRet );
932 0 : }
933 :
934 0 : LibDialog::LibDialog( vcl::Window* pParent )
935 0 : : ModalDialog(pParent, "ImportLibDialog", "modules/BasicIDE/ui/importlibdialog.ui")
936 : {
937 0 : get(m_pStorageFrame, "storageframe");
938 0 : get(m_pReferenceBox, "ref");
939 0 : get(m_pReplaceBox, "replace");
940 0 : get(m_pLibBox, "entries");
941 0 : m_pLibBox->set_height_request(m_pLibBox->GetTextHeight() * 8);
942 0 : m_pLibBox->set_width_request(m_pLibBox->approximate_char_width() * 32);
943 0 : }
944 :
945 0 : LibDialog::~LibDialog()
946 : {
947 0 : disposeOnce();
948 0 : }
949 :
950 0 : void LibDialog::dispose()
951 : {
952 0 : m_pStorageFrame.clear();
953 0 : m_pLibBox.clear();
954 0 : m_pReferenceBox.clear();
955 0 : m_pReplaceBox.clear();
956 0 : ModalDialog::dispose();
957 0 : }
958 :
959 :
960 0 : void LibDialog::SetStorageName( const OUString& rName )
961 : {
962 0 : OUString aName( IDE_RESSTR(RID_STR_FILENAME) );
963 0 : aName += rName;
964 0 : m_pStorageFrame->set_label(aName);
965 0 : }
966 :
967 : // Helper function
968 0 : SbModule* createModImpl( vcl::Window* pWin, const ScriptDocument& rDocument,
969 : TreeListBox& rBasicBox, const OUString& rLibName, const OUString& _aModName, bool bMain )
970 : {
971 : OSL_ENSURE( rDocument.isAlive(), "createModImpl: invalid document!" );
972 0 : if ( !rDocument.isAlive() )
973 0 : return NULL;
974 :
975 0 : SbModule* pModule = NULL;
976 :
977 0 : OUString aLibName( rLibName );
978 0 : if ( aLibName.isEmpty() )
979 0 : aLibName = "Standard" ;
980 0 : rDocument.getOrCreateLibrary( E_SCRIPTS, aLibName );
981 0 : OUString aModName = _aModName;
982 0 : if ( aModName.isEmpty() )
983 0 : aModName = rDocument.createObjectName( E_SCRIPTS, aLibName );
984 :
985 0 : ScopedVclPtrInstance< NewObjectDialog > aNewDlg(pWin, ObjectMode::Module, true);
986 0 : aNewDlg->SetObjectName( aModName );
987 :
988 0 : if (aNewDlg->Execute() != 0)
989 : {
990 0 : if (!aNewDlg->GetObjectName().isEmpty() )
991 0 : aModName = aNewDlg->GetObjectName();
992 :
993 : try
994 : {
995 0 : OUString sModuleCode;
996 : // the module has existed
997 0 : if( rDocument.hasModule( aLibName, aModName ) )
998 0 : return NULL;
999 0 : rDocument.createModule( aLibName, aModName, bMain, sModuleCode );
1000 0 : BasicManager* pBasMgr = rDocument.getBasicManager();
1001 0 : StarBASIC* pBasic = pBasMgr? pBasMgr->GetLib( aLibName ) : 0;
1002 0 : if ( pBasic )
1003 0 : pModule = pBasic->FindModule( aModName );
1004 0 : SbxItem aSbxItem( SID_BASICIDE_ARG_SBX, rDocument, aLibName, aModName, TYPE_MODULE );
1005 0 : if (SfxDispatcher* pDispatcher = GetDispatcher())
1006 : pDispatcher->Execute( SID_BASICIDE_SBXINSERTED,
1007 0 : SfxCallMode::SYNCHRON, &aSbxItem, 0L );
1008 0 : LibraryLocation eLocation = rDocument.getLibraryLocation( aLibName );
1009 0 : SvTreeListEntry* pRootEntry = rBasicBox.FindRootEntry( rDocument, eLocation );
1010 0 : if ( pRootEntry )
1011 : {
1012 0 : if ( !rBasicBox.IsExpanded( pRootEntry ) )
1013 0 : rBasicBox.Expand( pRootEntry );
1014 0 : SvTreeListEntry* pLibEntry = rBasicBox.FindEntry( pRootEntry, aLibName, OBJ_TYPE_LIBRARY );
1015 : DBG_ASSERT( pLibEntry, "Libeintrag nicht gefunden!" );
1016 0 : if ( pLibEntry )
1017 : {
1018 0 : if ( !rBasicBox.IsExpanded( pLibEntry ) )
1019 0 : rBasicBox.Expand( pLibEntry );
1020 0 : SvTreeListEntry* pSubRootEntry = pLibEntry;
1021 0 : if( pBasic && rDocument.isInVBAMode() )
1022 : {
1023 : // add the new module in the "Modules" entry
1024 0 : SvTreeListEntry* pLibSubEntry = rBasicBox.FindEntry( pLibEntry, IDE_RESSTR(RID_STR_NORMAL_MODULES) , OBJ_TYPE_NORMAL_MODULES );
1025 0 : if( pLibSubEntry )
1026 : {
1027 0 : if( !rBasicBox.IsExpanded( pLibSubEntry ) )
1028 0 : rBasicBox.Expand( pLibSubEntry );
1029 0 : pSubRootEntry = pLibSubEntry;
1030 : }
1031 : }
1032 :
1033 0 : SvTreeListEntry* pEntry = rBasicBox.FindEntry( pSubRootEntry, aModName, OBJ_TYPE_MODULE );
1034 0 : if ( !pEntry )
1035 : {
1036 0 : std::unique_ptr<Entry> e(new Entry(OBJ_TYPE_MODULE));
1037 : pEntry = rBasicBox.AddEntry(
1038 : aModName,
1039 : Image( IDEResId( RID_IMG_MODULE ) ),
1040 0 : pSubRootEntry, false, &e);
1041 0 : DBG_ASSERT( pEntry, "InsertEntry fehlgeschlagen!" );
1042 : }
1043 0 : rBasicBox.SetCurEntry( pEntry );
1044 0 : rBasicBox.Select( rBasicBox.GetCurEntry() ); // OV-Bug?!
1045 : }
1046 0 : }
1047 : }
1048 0 : catch (const container::ElementExistException& )
1049 : {
1050 0 : ScopedVclPtrInstance<MessageDialog>::Create(pWin, IDE_RESSTR(RID_STR_SBXNAMEALLREADYUSED2))->Execute();
1051 : }
1052 0 : catch (const container::NoSuchElementException& )
1053 : {
1054 : DBG_UNHANDLED_EXCEPTION();
1055 : }
1056 : }
1057 0 : return pModule;
1058 : }
1059 :
1060 :
1061 0 : } // namespace basctl
1062 :
1063 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|