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