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