1*31598a22SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*31598a22SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*31598a22SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*31598a22SAndrew Rist  * distributed with this work for additional information
6*31598a22SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*31598a22SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*31598a22SAndrew Rist  * "License"); you may not use this file except in compliance
9*31598a22SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*31598a22SAndrew Rist  *
11*31598a22SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*31598a22SAndrew Rist  *
13*31598a22SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*31598a22SAndrew Rist  * software distributed under the License is distributed on an
15*31598a22SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*31598a22SAndrew Rist  * KIND, either express or implied.  See the License for the
17*31598a22SAndrew Rist  * specific language governing permissions and limitations
18*31598a22SAndrew Rist  * under the License.
19*31598a22SAndrew Rist  *
20*31598a22SAndrew Rist  *************************************************************/
21*31598a22SAndrew Rist 
22*31598a22SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_basctl.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir // CLOOKS:
28cdf0e10cSrcweir //#define _MENUBTN_HXX
29cdf0e10cSrcweir #define _SPIN_HXX
30cdf0e10cSrcweir #define _PRVWIN_HXX
31cdf0e10cSrcweir //#define _FIELD_HXX ***
32cdf0e10cSrcweir //#define _TAB_HXX ***
33cdf0e10cSrcweir #define _DIALOGS_HXX
34cdf0e10cSrcweir #define _SVRTF_HXX
35cdf0e10cSrcweir #define _ISETBRW_HXX
36cdf0e10cSrcweir #define _VCTRLS_HXX
37cdf0e10cSrcweir #define SI_NOCONTROL
38cdf0e10cSrcweir #define SI_NOSBXCONTROLS
39cdf0e10cSrcweir 
40cdf0e10cSrcweir #define ITEMID_SIZE	0
41cdf0e10cSrcweir 
42cdf0e10cSrcweir // Falls ohne PCH's:
43cdf0e10cSrcweir #include <ide_pch.hxx>
44cdf0e10cSrcweir 
45cdf0e10cSrcweir 
46cdf0e10cSrcweir #define _SOLAR__PRIVATE 1
47cdf0e10cSrcweir #include <basic/sbx.hxx>
48cdf0e10cSrcweir #include <svl/hint.hxx>
49cdf0e10cSrcweir #include <tools/diagnose_ex.h>
50cdf0e10cSrcweir #include <basidesh.hrc>
51cdf0e10cSrcweir #include <basidesh.hxx>
52cdf0e10cSrcweir #include <basdoc.hxx>
53cdf0e10cSrcweir #include <basobj.hxx>
54cdf0e10cSrcweir #include <bastypes.hxx>
55cdf0e10cSrcweir #include <basicbox.hxx>
56cdf0e10cSrcweir #include <objdlg.hxx>
57cdf0e10cSrcweir #include <sbxitem.hxx>
58cdf0e10cSrcweir #include <tbxctl.hxx>
59cdf0e10cSrcweir #include <iderdll2.hxx>
60cdf0e10cSrcweir #include <basidectrlr.hxx>
61cdf0e10cSrcweir #include <localizationmgr.hxx>
62cdf0e10cSrcweir 
63cdf0e10cSrcweir #define BasicIDEShell
64cdf0e10cSrcweir #define SFX_TYPEMAP
65cdf0e10cSrcweir #include <idetemp.hxx>
66cdf0e10cSrcweir #include <basslots.hxx>
67cdf0e10cSrcweir #include <iderdll.hxx>
68cdf0e10cSrcweir #include <svx/pszctrl.hxx>
69cdf0e10cSrcweir #include <svx/insctrl.hxx>
70cdf0e10cSrcweir #include <svx/srchdlg.hxx>
71cdf0e10cSrcweir #include <svx/lboxctrl.hxx>
72cdf0e10cSrcweir #include <svx/tbcontrl.hxx>
73cdf0e10cSrcweir #include <com/sun/star/script/XLibraryContainer.hpp>
74cdf0e10cSrcweir #include <com/sun/star/script/XLibraryContainerPassword.hpp>
75cdf0e10cSrcweir #include <com/sun/star/container/XNameContainer.hpp>
76cdf0e10cSrcweir #include <com/sun/star/container/XContainer.hpp>
77cdf0e10cSrcweir #include <com/sun/star/container/XContainerListener.hpp>
78cdf0e10cSrcweir #include <com/sun/star/script/XLibraryContainer.hpp>
79cdf0e10cSrcweir 
80cdf0e10cSrcweir #include <svx/xmlsecctrl.hxx>
81cdf0e10cSrcweir 
82cdf0e10cSrcweir using namespace ::com::sun::star::uno;
83cdf0e10cSrcweir using namespace ::com::sun::star;
84cdf0e10cSrcweir using ::rtl::OUString;
85cdf0e10cSrcweir 
86cdf0e10cSrcweir static const rtl::OUString sStandardLibName(  rtl::OUString::createFromAscii("Standard") );
87cdf0e10cSrcweir 
88cdf0e10cSrcweir typedef ::cppu::WeakImplHelper1< container::XContainerListener > ContainerListenerBASE;
89cdf0e10cSrcweir 
90cdf0e10cSrcweir class ContainerListenerImpl : public ContainerListenerBASE
91cdf0e10cSrcweir {
92cdf0e10cSrcweir     BasicIDEShell* mpShell;
93cdf0e10cSrcweir public:
94cdf0e10cSrcweir 
95cdf0e10cSrcweir     ContainerListenerImpl( BasicIDEShell* pShell ) : mpShell( pShell ) {}
96cdf0e10cSrcweir 
97cdf0e10cSrcweir     ~ContainerListenerImpl()
98cdf0e10cSrcweir     {
99cdf0e10cSrcweir     }
100cdf0e10cSrcweir 
101cdf0e10cSrcweir     void addContainerListener( const ScriptDocument& rScriptDocument, const String& aLibName )
102cdf0e10cSrcweir     {
103cdf0e10cSrcweir         try
104cdf0e10cSrcweir         {
105cdf0e10cSrcweir             uno::Reference< container::XContainer > xContainer( rScriptDocument.getLibrary( E_SCRIPTS, aLibName, sal_False ), uno::UNO_QUERY );
106cdf0e10cSrcweir             if ( xContainer.is() )
107cdf0e10cSrcweir             {
108cdf0e10cSrcweir                 uno::Reference< container::XContainerListener > xContainerListener( this );
109cdf0e10cSrcweir                 xContainer->addContainerListener( xContainerListener );
110cdf0e10cSrcweir             }
111cdf0e10cSrcweir         }
112cdf0e10cSrcweir         catch( uno::Exception& ) {}
113cdf0e10cSrcweir     }
114cdf0e10cSrcweir     void removeContainerListener( const ScriptDocument& rScriptDocument, const String& aLibName )
115cdf0e10cSrcweir     {
116cdf0e10cSrcweir         try
117cdf0e10cSrcweir         {
118cdf0e10cSrcweir             uno::Reference< container::XContainer > xContainer( rScriptDocument.getLibrary( E_SCRIPTS, aLibName, sal_False ), uno::UNO_QUERY );
119cdf0e10cSrcweir             if ( xContainer.is() )
120cdf0e10cSrcweir             {
121cdf0e10cSrcweir                 uno::Reference< container::XContainerListener > xContainerListener( this );
122cdf0e10cSrcweir                 xContainer->removeContainerListener( xContainerListener );
123cdf0e10cSrcweir             }
124cdf0e10cSrcweir         }
125cdf0e10cSrcweir         catch( uno::Exception& ) {}
126cdf0e10cSrcweir     }
127cdf0e10cSrcweir 
128cdf0e10cSrcweir     // XEventListener
129cdf0e10cSrcweir     virtual void SAL_CALL disposing( const lang::EventObject& ) throw( uno::RuntimeException ) {}
130cdf0e10cSrcweir 
131cdf0e10cSrcweir     // XContainerListener
132cdf0e10cSrcweir     virtual void SAL_CALL elementInserted( const container::ContainerEvent& Event ) throw( uno::RuntimeException )
133cdf0e10cSrcweir     {
134cdf0e10cSrcweir         rtl::OUString sModuleName;
135cdf0e10cSrcweir         if( mpShell && ( Event.Accessor >>= sModuleName ) )
136cdf0e10cSrcweir             mpShell->FindBasWin( mpShell->m_aCurDocument, mpShell->m_aCurLibName, sModuleName, sal_True, sal_False );
137cdf0e10cSrcweir     }
138cdf0e10cSrcweir     virtual void SAL_CALL elementReplaced( const container::ContainerEvent& ) throw( com::sun::star::uno::RuntimeException ) { }
139cdf0e10cSrcweir     virtual void SAL_CALL elementRemoved( const container::ContainerEvent& Event ) throw( com::sun::star::uno::RuntimeException )
140cdf0e10cSrcweir     {
141cdf0e10cSrcweir         rtl::OUString sModuleName;
142cdf0e10cSrcweir         if( mpShell  && ( Event.Accessor >>= sModuleName ) )
143cdf0e10cSrcweir         {
144cdf0e10cSrcweir             IDEBaseWindow* pWin = mpShell->FindWindow( mpShell->m_aCurDocument, mpShell->m_aCurLibName, sModuleName, BASICIDE_TYPE_MODULE, sal_True );
145cdf0e10cSrcweir             if( pWin )
146cdf0e10cSrcweir                 mpShell->RemoveWindow( pWin, sal_True, sal_True );
147cdf0e10cSrcweir         }
148cdf0e10cSrcweir     }
149cdf0e10cSrcweir 
150cdf0e10cSrcweir };
151cdf0e10cSrcweir 
152cdf0e10cSrcweir TYPEINIT1( BasicIDEShell, SfxViewShell );
153cdf0e10cSrcweir 
154cdf0e10cSrcweir SFX_IMPL_NAMED_VIEWFACTORY( BasicIDEShell, "Default" )
155cdf0e10cSrcweir {
156cdf0e10cSrcweir 	SFX_VIEW_REGISTRATION( BasicDocShell );
157cdf0e10cSrcweir }
158cdf0e10cSrcweir 
159cdf0e10cSrcweir 
160cdf0e10cSrcweir SFX_IMPL_INTERFACE( BasicIDEShell, SfxViewShell, IDEResId( RID_STR_IDENAME ) )
161cdf0e10cSrcweir {
162cdf0e10cSrcweir 	SFX_CHILDWINDOW_REGISTRATION( SID_SEARCH_DLG );
163cdf0e10cSrcweir     SFX_FEATURED_CHILDWINDOW_REGISTRATION(SID_SHOW_PROPERTYBROWSER, BASICIDE_UI_FEATURE_SHOW_BROWSER);
164cdf0e10cSrcweir     SFX_POPUPMENU_REGISTRATION( IDEResId( RID_POPUP_DLGED ) );
165cdf0e10cSrcweir }
166cdf0e10cSrcweir 
167cdf0e10cSrcweir 
168cdf0e10cSrcweir 
169cdf0e10cSrcweir #define IDE_VIEWSHELL_FLAGS		SFX_VIEW_CAN_PRINT|SFX_VIEW_NO_NEWWINDOW
170cdf0e10cSrcweir 
171cdf0e10cSrcweir 
172cdf0e10cSrcweir // Hack for #101048
173cdf0e10cSrcweir static sal_Int32 GnBasicIDEShellCount;
174cdf0e10cSrcweir sal_Int32 getBasicIDEShellCount( void )
175cdf0e10cSrcweir     { return GnBasicIDEShellCount; }
176cdf0e10cSrcweir 
177cdf0e10cSrcweir BasicIDEShell::BasicIDEShell( SfxViewFrame* pFrame_, SfxViewShell* /* pOldShell */ ) :
178cdf0e10cSrcweir 		SfxViewShell( pFrame_, IDE_VIEWSHELL_FLAGS ),
179cdf0e10cSrcweir         m_aCurDocument( ScriptDocument::getApplicationScriptDocument() ),
180cdf0e10cSrcweir 		aHScrollBar( &GetViewFrame()->GetWindow(), WinBits( WB_HSCROLL | WB_DRAG ) ),
181cdf0e10cSrcweir 		aVScrollBar( &GetViewFrame()->GetWindow(), WinBits( WB_VSCROLL | WB_DRAG ) ),
182cdf0e10cSrcweir 		aScrollBarBox( &GetViewFrame()->GetWindow(), WinBits( WB_SIZEABLE ) ),
183cdf0e10cSrcweir         m_bAppBasicModified( sal_False ),
184cdf0e10cSrcweir         m_aNotifier( *this )
185cdf0e10cSrcweir {
186cdf0e10cSrcweir     m_xLibListener = new ContainerListenerImpl( this );
187cdf0e10cSrcweir 	Init();
188cdf0e10cSrcweir     GnBasicIDEShellCount++;
189cdf0e10cSrcweir }
190cdf0e10cSrcweir 
191cdf0e10cSrcweir 
192cdf0e10cSrcweir 
193cdf0e10cSrcweir void BasicIDEShell::Init()
194cdf0e10cSrcweir {
195cdf0e10cSrcweir 	TbxControls::RegisterControl( SID_CHOOSE_CONTROLS );
196cdf0e10cSrcweir 	SvxPosSizeStatusBarControl::RegisterControl();
197cdf0e10cSrcweir 	SvxInsertStatusBarControl::RegisterControl();
198cdf0e10cSrcweir 	XmlSecStatusBarControl::RegisterControl( SID_SIGNATURE );
199cdf0e10cSrcweir     SvxSimpleUndoRedoController::RegisterControl( SID_UNDO );
200cdf0e10cSrcweir     SvxSimpleUndoRedoController::RegisterControl( SID_REDO );
201cdf0e10cSrcweir 
202cdf0e10cSrcweir 	SvxSearchDialogWrapper::RegisterChildWindow( sal_False );
203cdf0e10cSrcweir 
204cdf0e10cSrcweir 	IDE_DLL()->GetExtraData()->ShellInCriticalSection() = sal_True;
205cdf0e10cSrcweir 
206cdf0e10cSrcweir 	SetName( String( RTL_CONSTASCII_USTRINGPARAM( "BasicIDE" ) ) );
207cdf0e10cSrcweir 	SetHelpId( SVX_INTERFACE_BASIDE_VIEWSH );
208cdf0e10cSrcweir 
209cdf0e10cSrcweir 	LibBoxControl::RegisterControl( SID_BASICIDE_LIBSELECTOR );
210cdf0e10cSrcweir 	LanguageBoxControl::RegisterControl( SID_BASICIDE_CURRENT_LANG );
211cdf0e10cSrcweir 
212cdf0e10cSrcweir 	CreateModulWindowLayout();
213cdf0e10cSrcweir 
214cdf0e10cSrcweir     GetViewFrame()->GetWindow().SetBackground();
215cdf0e10cSrcweir 
216cdf0e10cSrcweir 	pCurWin = 0;
217cdf0e10cSrcweir     m_aCurDocument = ScriptDocument::getApplicationScriptDocument();
218cdf0e10cSrcweir 	pObjectCatalog = 0;
219cdf0e10cSrcweir 	bCreatingWindow = sal_False;
220cdf0e10cSrcweir 
221cdf0e10cSrcweir 	m_pCurLocalizationMgr = NULL;
222cdf0e10cSrcweir 
223cdf0e10cSrcweir 	pTabBar = new BasicIDETabBar( &GetViewFrame()->GetWindow() );
224cdf0e10cSrcweir 	pTabBar->SetSplitHdl( LINK( this, BasicIDEShell, TabBarSplitHdl ) );
225cdf0e10cSrcweir 	bTabBarSplitted = sal_False;
226cdf0e10cSrcweir 
227cdf0e10cSrcweir 	nCurKey = 100;
228cdf0e10cSrcweir 	InitScrollBars();
229cdf0e10cSrcweir 	InitTabBar();
230cdf0e10cSrcweir 
231cdf0e10cSrcweir     SetCurLib( ScriptDocument::getApplicationScriptDocument(), String::CreateFromAscii( "Standard" ), false, false );
232cdf0e10cSrcweir 
233cdf0e10cSrcweir     if ( IDE_DLL() && IDE_DLL()->pShell == NULL )
234cdf0e10cSrcweir         IDE_DLL()->pShell = this;
235cdf0e10cSrcweir 
236cdf0e10cSrcweir     IDE_DLL()->GetExtraData()->ShellInCriticalSection() = sal_False;
237cdf0e10cSrcweir 
238cdf0e10cSrcweir     // It's enough to create the controller ...
239cdf0e10cSrcweir     // It will be public by using magic :-)
240cdf0e10cSrcweir     new BasicIDEController( this );
241cdf0e10cSrcweir 
242cdf0e10cSrcweir     // Force updating the title ! Because it must be set to the controller
243cdf0e10cSrcweir     // it has to be called directly after creating those controller.
244cdf0e10cSrcweir     SetMDITitle ();
245cdf0e10cSrcweir 
246cdf0e10cSrcweir 	UpdateWindows();
247cdf0e10cSrcweir }
248cdf0e10cSrcweir 
249cdf0e10cSrcweir __EXPORT BasicIDEShell::~BasicIDEShell()
250cdf0e10cSrcweir {
251cdf0e10cSrcweir     m_aNotifier.dispose();
252cdf0e10cSrcweir 
253cdf0e10cSrcweir     if ( IDE_DLL() && IDE_DLL()->pShell == this )
254cdf0e10cSrcweir         IDE_DLL()->pShell = NULL;
255cdf0e10cSrcweir 
256cdf0e10cSrcweir 	// Damit bei einem Basic-Fehler beim Speichern die Shell nicht sofort
257cdf0e10cSrcweir 	// wieder hoch kommt:
258cdf0e10cSrcweir 	IDE_DLL()->GetExtraData()->ShellInCriticalSection() = sal_True;
259cdf0e10cSrcweir 
260cdf0e10cSrcweir 	SetWindow( 0 );
261cdf0e10cSrcweir 	SetCurWindow( 0 );
262cdf0e10cSrcweir 
263cdf0e10cSrcweir 	// Alle Fenster zerstoeren:
264cdf0e10cSrcweir 	IDEBaseWindow* pWin = aIDEWindowTable.First();
265cdf0e10cSrcweir 	while ( pWin )
266cdf0e10cSrcweir 	{
267cdf0e10cSrcweir 		// Kein Store, passiert bereits, wenn die BasicManager zerstoert werden.
268cdf0e10cSrcweir 		delete pWin;
269cdf0e10cSrcweir 		pWin = aIDEWindowTable.Next();
270cdf0e10cSrcweir 	}
271cdf0e10cSrcweir 
272cdf0e10cSrcweir 	aIDEWindowTable.Clear();
273cdf0e10cSrcweir 	delete pTabBar;
274cdf0e10cSrcweir 	delete pObjectCatalog;
275cdf0e10cSrcweir 	DestroyModulWindowLayout();
276cdf0e10cSrcweir 
277cdf0e10cSrcweir         ContainerListenerImpl* pListener = static_cast< ContainerListenerImpl* >( m_xLibListener.get() );
278cdf0e10cSrcweir         // Destroy all ContainerListeners for Basic Container.
279cdf0e10cSrcweir         if ( pListener )
280cdf0e10cSrcweir             pListener->removeContainerListener( m_aCurDocument, m_aCurLibName );
281cdf0e10cSrcweir 
282cdf0e10cSrcweir 	// MI: Das gab einen GPF im SDT beim Schliessen da dann der ViewFrame die
283cdf0e10cSrcweir 	// ObjSh loslaesst. Es wusste auch keiner mehr wozu das gut war.
284cdf0e10cSrcweir 	// GetViewFrame()->GetObjectShell()->Broadcast( SfxSimpleHint( SFX_HINT_DYING ) );
285cdf0e10cSrcweir 
286cdf0e10cSrcweir 	IDE_DLL()->GetExtraData()->ShellInCriticalSection() = sal_False;
287cdf0e10cSrcweir 
288cdf0e10cSrcweir     GnBasicIDEShellCount--;
289cdf0e10cSrcweir }
290cdf0e10cSrcweir 
291cdf0e10cSrcweir void BasicIDEShell::onDocumentCreated( const ScriptDocument& /*_rDocument*/ )
292cdf0e10cSrcweir {
293cdf0e10cSrcweir     UpdateWindows();
294cdf0e10cSrcweir }
295cdf0e10cSrcweir 
296cdf0e10cSrcweir void BasicIDEShell::onDocumentOpened( const ScriptDocument& /*_rDocument*/ )
297cdf0e10cSrcweir {
298cdf0e10cSrcweir     UpdateWindows();
299cdf0e10cSrcweir }
300cdf0e10cSrcweir 
301cdf0e10cSrcweir void BasicIDEShell::onDocumentSave( const ScriptDocument& /*_rDocument*/ )
302cdf0e10cSrcweir {
303cdf0e10cSrcweir     StoreAllWindowData();
304cdf0e10cSrcweir }
305cdf0e10cSrcweir 
306cdf0e10cSrcweir void BasicIDEShell::onDocumentSaveDone( const ScriptDocument& /*_rDocument*/ )
307cdf0e10cSrcweir {
308cdf0e10cSrcweir     // #i115671: Update SID_SAVEDOC after saving is completed
309cdf0e10cSrcweir     SfxBindings* pBindings = BasicIDE::GetBindingsPtr();
310cdf0e10cSrcweir     if ( pBindings )
311cdf0e10cSrcweir         pBindings->Invalidate( SID_SAVEDOC );
312cdf0e10cSrcweir }
313cdf0e10cSrcweir 
314cdf0e10cSrcweir void BasicIDEShell::onDocumentSaveAs( const ScriptDocument& /*_rDocument*/ )
315cdf0e10cSrcweir {
316cdf0e10cSrcweir     StoreAllWindowData();
317cdf0e10cSrcweir }
318cdf0e10cSrcweir 
319cdf0e10cSrcweir void BasicIDEShell::onDocumentSaveAsDone( const ScriptDocument& /*_rDocument*/ )
320cdf0e10cSrcweir {
321cdf0e10cSrcweir     // not interested in
322cdf0e10cSrcweir }
323cdf0e10cSrcweir 
324cdf0e10cSrcweir void BasicIDEShell::onDocumentClosed( const ScriptDocument& _rDocument )
325cdf0e10cSrcweir {
326cdf0e10cSrcweir     if ( !_rDocument.isValid() )
327cdf0e10cSrcweir         return;
328cdf0e10cSrcweir 
329cdf0e10cSrcweir     bool bSetCurWindow = false;
330cdf0e10cSrcweir     bool bSetCurLib = ( _rDocument == m_aCurDocument );
331cdf0e10cSrcweir 
332cdf0e10cSrcweir     // remove all windows which belong to this document
333cdf0e10cSrcweir     for ( sal_uLong nWin = aIDEWindowTable.Count(); nWin; )
334cdf0e10cSrcweir     {
335cdf0e10cSrcweir         IDEBaseWindow* pWin = aIDEWindowTable.GetObject( --nWin );
336cdf0e10cSrcweir         if ( pWin->IsDocument( _rDocument ) )
337cdf0e10cSrcweir         {
338cdf0e10cSrcweir             if ( pWin->GetStatus() & (BASWIN_RUNNINGBASIC|BASWIN_INRESCHEDULE) )
339cdf0e10cSrcweir             {
340cdf0e10cSrcweir                 pWin->AddStatus( BASWIN_TOBEKILLED );
341cdf0e10cSrcweir                 pWin->Hide();
342cdf0e10cSrcweir                 StarBASIC::Stop();
343cdf0e10cSrcweir                 // there's no notify
344cdf0e10cSrcweir                 pWin->BasicStopped();
345cdf0e10cSrcweir             }
346cdf0e10cSrcweir             else
347cdf0e10cSrcweir             {
348cdf0e10cSrcweir                 pWin->StoreData();
349cdf0e10cSrcweir                 if ( pWin == pCurWin )
350cdf0e10cSrcweir                     bSetCurWindow = true;
351cdf0e10cSrcweir                 RemoveWindow( pWin, sal_True, sal_False );
352cdf0e10cSrcweir             }
353cdf0e10cSrcweir         }
354cdf0e10cSrcweir     }
355cdf0e10cSrcweir 
356cdf0e10cSrcweir     // remove lib info
357cdf0e10cSrcweir     BasicIDEData* pData = IDE_DLL()->GetExtraData();
358cdf0e10cSrcweir     if ( pData )
359cdf0e10cSrcweir         pData->GetLibInfos().RemoveInfoFor( _rDocument );
360cdf0e10cSrcweir 
361cdf0e10cSrcweir     if ( bSetCurLib )
362cdf0e10cSrcweir         SetCurLib( ScriptDocument::getApplicationScriptDocument(), String::CreateFromAscii( "Standard" ), true, false );
363cdf0e10cSrcweir     else if ( bSetCurWindow )
364cdf0e10cSrcweir         SetCurWindow( FindApplicationWindow(), sal_True );
365cdf0e10cSrcweir }
366cdf0e10cSrcweir 
367cdf0e10cSrcweir void BasicIDEShell::onDocumentTitleChanged( const ScriptDocument& /*_rDocument*/ )
368cdf0e10cSrcweir {
369cdf0e10cSrcweir     SfxBindings* pBindings = BasicIDE::GetBindingsPtr();
370cdf0e10cSrcweir     if ( pBindings )
371cdf0e10cSrcweir         pBindings->Invalidate( SID_BASICIDE_LIBSELECTOR, sal_True, sal_False );
372cdf0e10cSrcweir     SetMDITitle();
373cdf0e10cSrcweir }
374cdf0e10cSrcweir 
375cdf0e10cSrcweir void BasicIDEShell::onDocumentModeChanged( const ScriptDocument& _rDocument )
376cdf0e10cSrcweir {
377cdf0e10cSrcweir     for ( sal_uLong nWin = aIDEWindowTable.Count(); nWin; )
378cdf0e10cSrcweir     {
379cdf0e10cSrcweir         IDEBaseWindow* pWin = aIDEWindowTable.GetObject( --nWin );
380cdf0e10cSrcweir         if ( pWin->IsDocument( _rDocument ) && _rDocument.isDocument() )
381cdf0e10cSrcweir             pWin->SetReadOnly( _rDocument.isReadOnly() );
382cdf0e10cSrcweir     }
383cdf0e10cSrcweir }
384cdf0e10cSrcweir 
385cdf0e10cSrcweir void BasicIDEShell::StoreAllWindowData( sal_Bool bPersistent )
386cdf0e10cSrcweir {
387cdf0e10cSrcweir 	for ( sal_uLong nWin = 0; nWin < aIDEWindowTable.Count(); nWin++ )
388cdf0e10cSrcweir 	{
389cdf0e10cSrcweir 		IDEBaseWindow* pWin = aIDEWindowTable.GetObject( nWin );
390cdf0e10cSrcweir 		DBG_ASSERT( pWin, "PrepareClose: NULL-Pointer in Table?" );
391cdf0e10cSrcweir 		if ( !pWin->IsSuspended() )
392cdf0e10cSrcweir 			pWin->StoreData();
393cdf0e10cSrcweir 	}
394cdf0e10cSrcweir 
395cdf0e10cSrcweir 	if ( bPersistent  )
396cdf0e10cSrcweir 	{
397cdf0e10cSrcweir 		SFX_APP()->SaveBasicAndDialogContainer();
398cdf0e10cSrcweir         SetAppBasicModified( sal_False );
399cdf0e10cSrcweir 
400cdf0e10cSrcweir         SfxBindings* pBindings = BasicIDE::GetBindingsPtr();
401cdf0e10cSrcweir         if ( pBindings )
402cdf0e10cSrcweir         {
403cdf0e10cSrcweir             pBindings->Invalidate( SID_SAVEDOC );
404cdf0e10cSrcweir             pBindings->Update( SID_SAVEDOC );
405cdf0e10cSrcweir         }
406cdf0e10cSrcweir 	}
407cdf0e10cSrcweir }
408cdf0e10cSrcweir 
409cdf0e10cSrcweir 
410cdf0e10cSrcweir sal_uInt16 __EXPORT BasicIDEShell::PrepareClose( sal_Bool bUI, sal_Bool bForBrowsing )
411cdf0e10cSrcweir {
412cdf0e10cSrcweir 	(void)bForBrowsing;
413cdf0e10cSrcweir 
414cdf0e10cSrcweir 	// da es nach Drucken etc. (DocInfo) modifiziert ist, hier resetten
415cdf0e10cSrcweir 	GetViewFrame()->GetObjectShell()->SetModified(sal_False);
416cdf0e10cSrcweir 
417cdf0e10cSrcweir 	if ( StarBASIC::IsRunning() )
418cdf0e10cSrcweir 	{
419cdf0e10cSrcweir         if( bUI )
420cdf0e10cSrcweir         {
421cdf0e10cSrcweir 		    String aErrorStr( IDEResId( RID_STR_CANNOTCLOSE ) );
422cdf0e10cSrcweir 		    Window *pParent = &GetViewFrame()->GetWindow();
423cdf0e10cSrcweir 		    InfoBox( pParent, aErrorStr ).Execute();
424cdf0e10cSrcweir         }
425cdf0e10cSrcweir 		return sal_False;
426cdf0e10cSrcweir 	}
427cdf0e10cSrcweir 	else
428cdf0e10cSrcweir 	{
429cdf0e10cSrcweir 		// Hier unguenstig, wird zweimal gerufen...
430cdf0e10cSrcweir //		StoreAllWindowData();
431cdf0e10cSrcweir 
432cdf0e10cSrcweir 		sal_Bool bCanClose = sal_True;
433cdf0e10cSrcweir 		for ( sal_uLong nWin = 0; bCanClose && ( nWin < aIDEWindowTable.Count() ); nWin++ )
434cdf0e10cSrcweir 		{
435cdf0e10cSrcweir 			IDEBaseWindow* pWin = aIDEWindowTable.GetObject( nWin );
436cdf0e10cSrcweir 			if ( /* !pWin->IsSuspended() && */ !pWin->CanClose() )
437cdf0e10cSrcweir 			{
438cdf0e10cSrcweir                 if ( m_aCurLibName.Len() && ( pWin->IsDocument( m_aCurDocument ) || pWin->GetLibName() != m_aCurLibName ) )
439cdf0e10cSrcweir                     SetCurLib( ScriptDocument::getApplicationScriptDocument(), String(), false );
440cdf0e10cSrcweir 				SetCurWindow( pWin, sal_True );
441cdf0e10cSrcweir 				bCanClose = sal_False;
442cdf0e10cSrcweir 			}
443cdf0e10cSrcweir 		}
444cdf0e10cSrcweir 
445cdf0e10cSrcweir 		if ( bCanClose )
446cdf0e10cSrcweir 			StoreAllWindowData( sal_False );	// Nicht auf Platte schreiben, das passiert am Ende automatisch
447cdf0e10cSrcweir 
448cdf0e10cSrcweir 		return bCanClose;
449cdf0e10cSrcweir 	}
450cdf0e10cSrcweir }
451cdf0e10cSrcweir 
452cdf0e10cSrcweir void BasicIDEShell::InitScrollBars()
453cdf0e10cSrcweir {
454cdf0e10cSrcweir 	aVScrollBar.SetLineSize( 300 );
455cdf0e10cSrcweir 	aVScrollBar.SetPageSize( 2000 );
456cdf0e10cSrcweir 	aHScrollBar.SetLineSize( 300 );
457cdf0e10cSrcweir 	aHScrollBar.SetPageSize( 2000 );
458cdf0e10cSrcweir 	aHScrollBar.Enable();
459cdf0e10cSrcweir 	aVScrollBar.Enable();
460cdf0e10cSrcweir 	aVScrollBar.Show();
461cdf0e10cSrcweir 	aHScrollBar.Show();
462cdf0e10cSrcweir 	aScrollBarBox.Show();
463cdf0e10cSrcweir }
464cdf0e10cSrcweir 
465cdf0e10cSrcweir 
466cdf0e10cSrcweir 
467cdf0e10cSrcweir void BasicIDEShell::InitTabBar()
468cdf0e10cSrcweir {
469cdf0e10cSrcweir 	pTabBar->Enable();
470cdf0e10cSrcweir 	pTabBar->Show();
471cdf0e10cSrcweir 	pTabBar->SetSelectHdl( LINK( this, BasicIDEShell, TabBarHdl ) );
472cdf0e10cSrcweir }
473cdf0e10cSrcweir 
474cdf0e10cSrcweir 
475cdf0e10cSrcweir Size __EXPORT BasicIDEShell::GetOptimalSizePixel() const
476cdf0e10cSrcweir {
477cdf0e10cSrcweir 	return Size( 400, 300 );
478cdf0e10cSrcweir }
479cdf0e10cSrcweir 
480cdf0e10cSrcweir 
481cdf0e10cSrcweir 
482cdf0e10cSrcweir void __EXPORT BasicIDEShell::OuterResizePixel( const Point &rPos, const Size &rSize )
483cdf0e10cSrcweir {
484cdf0e10cSrcweir 	// Adjust fliegt irgendwann raus...
485cdf0e10cSrcweir 	AdjustPosSizePixel( rPos, rSize );
486cdf0e10cSrcweir }
487cdf0e10cSrcweir 
488cdf0e10cSrcweir 
489cdf0e10cSrcweir IMPL_LINK_INLINE_START( BasicIDEShell, TabBarSplitHdl, TabBar *, pTBar )
490cdf0e10cSrcweir {
491cdf0e10cSrcweir 	(void)pTBar;
492cdf0e10cSrcweir 	bTabBarSplitted = sal_True;
493cdf0e10cSrcweir 	ArrangeTabBar();
494cdf0e10cSrcweir 
495cdf0e10cSrcweir 	return 0;
496cdf0e10cSrcweir }
497cdf0e10cSrcweir IMPL_LINK_INLINE_END( BasicIDEShell, TabBarSplitHdl, TabBar *, pTBar )
498cdf0e10cSrcweir 
499cdf0e10cSrcweir 
500cdf0e10cSrcweir 
501cdf0e10cSrcweir IMPL_LINK( BasicIDEShell, TabBarHdl, TabBar *, pCurTabBar )
502cdf0e10cSrcweir {
503cdf0e10cSrcweir 	sal_uInt16 nCurId = pCurTabBar->GetCurPageId();
504cdf0e10cSrcweir 	IDEBaseWindow* pWin = aIDEWindowTable.Get( nCurId );
505cdf0e10cSrcweir 	DBG_ASSERT( pWin, "Eintrag in TabBar passt zu keinem Fenster!" );
506cdf0e10cSrcweir 	SetCurWindow( pWin );
507cdf0e10cSrcweir 
508cdf0e10cSrcweir 	return 0;
509cdf0e10cSrcweir }
510cdf0e10cSrcweir 
511cdf0e10cSrcweir 
512cdf0e10cSrcweir 
513cdf0e10cSrcweir sal_Bool BasicIDEShell::NextPage( sal_Bool bPrev )
514cdf0e10cSrcweir {
515cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
516cdf0e10cSrcweir 	sal_uInt16 nPos = pTabBar->GetPagePos( pTabBar->GetCurPageId() );
517cdf0e10cSrcweir 
518cdf0e10cSrcweir 	if ( bPrev )
519cdf0e10cSrcweir 		--nPos;
520cdf0e10cSrcweir 	else
521cdf0e10cSrcweir 		++nPos;
522cdf0e10cSrcweir 
523cdf0e10cSrcweir 	if ( nPos < pTabBar->GetPageCount() )
524cdf0e10cSrcweir 	{
525cdf0e10cSrcweir 		IDEBaseWindow* pWin = aIDEWindowTable.Get( pTabBar->GetPageId( nPos ) );
526cdf0e10cSrcweir 		SetCurWindow( pWin, sal_True );
527cdf0e10cSrcweir 		bRet = sal_True;
528cdf0e10cSrcweir 	}
529cdf0e10cSrcweir 
530cdf0e10cSrcweir 	return bRet;
531cdf0e10cSrcweir }
532cdf0e10cSrcweir 
533cdf0e10cSrcweir 
534cdf0e10cSrcweir 
535cdf0e10cSrcweir void BasicIDEShell::ArrangeTabBar()
536cdf0e10cSrcweir {
537cdf0e10cSrcweir 	Size aSz( GetViewFrame()->GetWindow().GetOutputSizePixel() );
538cdf0e10cSrcweir 	long nBoxPos = aScrollBarBox.GetPosPixel().X() - 1;
539cdf0e10cSrcweir 	long nPos = pTabBar->GetSplitSize();
540cdf0e10cSrcweir 	if ( nPos <= nBoxPos )
541cdf0e10cSrcweir 	{
542cdf0e10cSrcweir 		Point aPnt( pTabBar->GetPosPixel() );
543cdf0e10cSrcweir 		long nH = aHScrollBar.GetSizePixel().Height();
544cdf0e10cSrcweir 		pTabBar->SetPosSizePixel( aPnt, Size( nPos, nH ) );
545cdf0e10cSrcweir 		long nScrlStart = aPnt.X() + nPos;
546cdf0e10cSrcweir 		aHScrollBar.SetPosSizePixel( Point( nScrlStart, aPnt.Y() ), Size( nBoxPos - nScrlStart + 2, nH ) );
547cdf0e10cSrcweir 		aHScrollBar.Update();
548cdf0e10cSrcweir 	}
549cdf0e10cSrcweir }
550cdf0e10cSrcweir 
551cdf0e10cSrcweir 
552cdf0e10cSrcweir 
553cdf0e10cSrcweir ::svl::IUndoManager* BasicIDEShell::GetUndoManager()
554cdf0e10cSrcweir {
555cdf0e10cSrcweir 	::svl::IUndoManager* pMgr = NULL;
556cdf0e10cSrcweir 	if( pCurWin )
557cdf0e10cSrcweir 		pMgr = pCurWin->GetUndoManager();
558cdf0e10cSrcweir 
559cdf0e10cSrcweir 	return pMgr;
560cdf0e10cSrcweir }
561cdf0e10cSrcweir 
562cdf0e10cSrcweir 
563cdf0e10cSrcweir 
564cdf0e10cSrcweir void BasicIDEShell::ShowObjectDialog( sal_Bool bShow, sal_Bool bCreateOrDestroy )
565cdf0e10cSrcweir {
566cdf0e10cSrcweir 	if ( bShow )
567cdf0e10cSrcweir 	{
568cdf0e10cSrcweir 		if ( !pObjectCatalog && bCreateOrDestroy )
569cdf0e10cSrcweir 		{
570cdf0e10cSrcweir 			pObjectCatalog = new ObjectCatalog( &GetViewFrame()->GetWindow() );
571cdf0e10cSrcweir 			// Position wird in BasicIDEData gemerkt und vom Dlg eingestellt
572cdf0e10cSrcweir             if ( pObjectCatalog )
573cdf0e10cSrcweir             {
574cdf0e10cSrcweir                 pObjectCatalog->SetCancelHdl( LINK( this, BasicIDEShell, ObjectDialogCancelHdl ) );
575cdf0e10cSrcweir                 BasicEntryDescriptor aDesc;
576cdf0e10cSrcweir                 IDEBaseWindow* pCurWin_ = GetCurWindow();
577cdf0e10cSrcweir                 if ( pCurWin_ )
578cdf0e10cSrcweir                     aDesc = pCurWin_->CreateEntryDescriptor();
579cdf0e10cSrcweir                 pObjectCatalog->SetCurrentEntry( aDesc );
580cdf0e10cSrcweir             }
581cdf0e10cSrcweir 		}
582cdf0e10cSrcweir 
583cdf0e10cSrcweir 		// Die allerletzten Aenderungen...
584cdf0e10cSrcweir 		if ( pCurWin )
585cdf0e10cSrcweir 			pCurWin->StoreData();
586cdf0e10cSrcweir 
587cdf0e10cSrcweir 		if ( pObjectCatalog )
588cdf0e10cSrcweir 		{
589cdf0e10cSrcweir 			pObjectCatalog->UpdateEntries();
590cdf0e10cSrcweir 			pObjectCatalog->Show();
591cdf0e10cSrcweir 		}
592cdf0e10cSrcweir 	}
593cdf0e10cSrcweir 	else if ( pObjectCatalog )
594cdf0e10cSrcweir 	{
595cdf0e10cSrcweir 		pObjectCatalog->Hide();
596cdf0e10cSrcweir 		if ( bCreateOrDestroy )
597cdf0e10cSrcweir 		{
598cdf0e10cSrcweir 			// Wegen OS/2-Focus-Problem pObjectCatalog vorm delete auf NULL
599cdf0e10cSrcweir 			ObjectCatalog* pTemp = pObjectCatalog;
600cdf0e10cSrcweir 			pObjectCatalog = 0;
601cdf0e10cSrcweir 			delete pTemp;
602cdf0e10cSrcweir 		}
603cdf0e10cSrcweir 	}
604cdf0e10cSrcweir }
605cdf0e10cSrcweir 
606cdf0e10cSrcweir 
607cdf0e10cSrcweir 
608cdf0e10cSrcweir void __EXPORT BasicIDEShell::SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId&,
609cdf0e10cSrcweir 										const SfxHint& rHint, const TypeId& )
610cdf0e10cSrcweir {
611cdf0e10cSrcweir     if ( IDE_DLL()->GetShell() )
612cdf0e10cSrcweir     {
613cdf0e10cSrcweir         if ( rHint.IsA( TYPE( SfxSimpleHint ) ) )
614cdf0e10cSrcweir         {
615cdf0e10cSrcweir             switch ( ((SfxSimpleHint&)rHint).GetId() )
616cdf0e10cSrcweir             {
617cdf0e10cSrcweir                 case SFX_HINT_DYING:
618cdf0e10cSrcweir                 {
619cdf0e10cSrcweir                     EndListening( rBC, sal_True /* Alle abmelden */ );
620cdf0e10cSrcweir                     if ( pObjectCatalog )
621cdf0e10cSrcweir                         pObjectCatalog->UpdateEntries();
622cdf0e10cSrcweir                 }
623cdf0e10cSrcweir                 break;
624cdf0e10cSrcweir             }
625cdf0e10cSrcweir 
626cdf0e10cSrcweir             if ( rHint.IsA( TYPE( SbxHint ) ) )
627cdf0e10cSrcweir             {
628cdf0e10cSrcweir                 SbxHint& rSbxHint = (SbxHint&)rHint;
629cdf0e10cSrcweir                 sal_uLong nHintId = rSbxHint.GetId();
630cdf0e10cSrcweir                 if (	( nHintId == SBX_HINT_BASICSTART ) ||
631cdf0e10cSrcweir                         ( nHintId == SBX_HINT_BASICSTOP ) )
632cdf0e10cSrcweir                 {
633cdf0e10cSrcweir                     SfxBindings* pBindings = BasicIDE::GetBindingsPtr();
634cdf0e10cSrcweir                     if ( pBindings )
635cdf0e10cSrcweir                     {
636cdf0e10cSrcweir                         pBindings->Invalidate( SID_BASICRUN );
637cdf0e10cSrcweir                         pBindings->Update( SID_BASICRUN );
638cdf0e10cSrcweir                         pBindings->Invalidate( SID_BASICCOMPILE );
639cdf0e10cSrcweir                         pBindings->Update( SID_BASICCOMPILE );
640cdf0e10cSrcweir                         pBindings->Invalidate( SID_BASICSTEPOVER );
641cdf0e10cSrcweir                         pBindings->Update( SID_BASICSTEPOVER );
642cdf0e10cSrcweir                         pBindings->Invalidate( SID_BASICSTEPINTO );
643cdf0e10cSrcweir                         pBindings->Update( SID_BASICSTEPINTO );
644cdf0e10cSrcweir                         pBindings->Invalidate( SID_BASICSTEPOUT );
645cdf0e10cSrcweir                         pBindings->Update( SID_BASICSTEPOUT );
646cdf0e10cSrcweir                         pBindings->Invalidate( SID_BASICSTOP );
647cdf0e10cSrcweir                         pBindings->Update( SID_BASICSTOP );
648cdf0e10cSrcweir                         pBindings->Invalidate( SID_BASICIDE_TOGGLEBRKPNT );
649cdf0e10cSrcweir                         pBindings->Update( SID_BASICIDE_TOGGLEBRKPNT );
650cdf0e10cSrcweir                         pBindings->Invalidate( SID_BASICIDE_MANAGEBRKPNTS );
651cdf0e10cSrcweir                         pBindings->Update( SID_BASICIDE_MANAGEBRKPNTS );
652cdf0e10cSrcweir                         pBindings->Invalidate( SID_BASICIDE_MODULEDLG );
653cdf0e10cSrcweir                         pBindings->Update( SID_BASICIDE_MODULEDLG );
654cdf0e10cSrcweir                         pBindings->Invalidate( SID_BASICLOAD );
655cdf0e10cSrcweir                         pBindings->Update( SID_BASICLOAD );
656cdf0e10cSrcweir                     }
657cdf0e10cSrcweir 
658cdf0e10cSrcweir                     if ( nHintId == SBX_HINT_BASICSTOP )
659cdf0e10cSrcweir                     {
660cdf0e10cSrcweir                         // Nicht nur bei Error/Break oder explizitem anhalten,
661cdf0e10cSrcweir                         // falls durch einen Programmierfehler das Update abgeschaltet ist.
662cdf0e10cSrcweir                         BasicIDE::BasicStopped();
663cdf0e10cSrcweir                         UpdateModulWindowLayout( true );    // Leer machen...
664cdf0e10cSrcweir 						if( m_pCurLocalizationMgr )
665cdf0e10cSrcweir 							m_pCurLocalizationMgr->handleBasicStopped();
666cdf0e10cSrcweir                     }
667cdf0e10cSrcweir 					else if( m_pCurLocalizationMgr )
668cdf0e10cSrcweir                     {
669cdf0e10cSrcweir 						m_pCurLocalizationMgr->handleBasicStarted();
670cdf0e10cSrcweir                     }
671cdf0e10cSrcweir 
672cdf0e10cSrcweir                     IDEBaseWindow* pWin = aIDEWindowTable.First();
673cdf0e10cSrcweir                     while ( pWin )
674cdf0e10cSrcweir                     {
675cdf0e10cSrcweir                         if ( nHintId == SBX_HINT_BASICSTART )
676cdf0e10cSrcweir                             pWin->BasicStarted();
677cdf0e10cSrcweir                         else
678cdf0e10cSrcweir                             pWin->BasicStopped();
679cdf0e10cSrcweir                         pWin = aIDEWindowTable.Next();
680cdf0e10cSrcweir                     }
681cdf0e10cSrcweir                 }
682cdf0e10cSrcweir             }
683cdf0e10cSrcweir         }
684cdf0e10cSrcweir     }
685cdf0e10cSrcweir }
686cdf0e10cSrcweir 
687cdf0e10cSrcweir 
688cdf0e10cSrcweir 
689cdf0e10cSrcweir void BasicIDEShell::CheckWindows()
690cdf0e10cSrcweir {
691cdf0e10cSrcweir 	sal_Bool bSetCurWindow = sal_False;
692cdf0e10cSrcweir 	for ( sal_uLong nWin = 0; nWin < aIDEWindowTable.Count(); nWin++ )
693cdf0e10cSrcweir 	{
694cdf0e10cSrcweir 		IDEBaseWindow* pWin = aIDEWindowTable.GetObject( nWin );
695cdf0e10cSrcweir 		if ( pWin->GetStatus() & BASWIN_TOBEKILLED )
696cdf0e10cSrcweir 		{
697cdf0e10cSrcweir 			pWin->StoreData();
698cdf0e10cSrcweir 			if ( pWin == pCurWin )
699cdf0e10cSrcweir 				bSetCurWindow = sal_True;
700cdf0e10cSrcweir 			RemoveWindow( pWin, sal_True, sal_False );
701cdf0e10cSrcweir 			nWin--;
702cdf0e10cSrcweir 		}
703cdf0e10cSrcweir 	}
704cdf0e10cSrcweir 	if ( bSetCurWindow )
705cdf0e10cSrcweir 		SetCurWindow( FindApplicationWindow(), sal_True );
706cdf0e10cSrcweir }
707cdf0e10cSrcweir 
708cdf0e10cSrcweir 
709cdf0e10cSrcweir 
710cdf0e10cSrcweir void BasicIDEShell::RemoveWindows( const ScriptDocument& rDocument, const String& rLibName, sal_Bool bDestroy )
711cdf0e10cSrcweir {
712cdf0e10cSrcweir 	sal_Bool bChangeCurWindow = pCurWin ? sal_False : sal_True;
713cdf0e10cSrcweir 	for ( sal_uLong nWin = 0; nWin < aIDEWindowTable.Count(); nWin++ )
714cdf0e10cSrcweir 	{
715cdf0e10cSrcweir 		IDEBaseWindow* pWin = aIDEWindowTable.GetObject( nWin );
716cdf0e10cSrcweir         if ( pWin->IsDocument( rDocument ) && pWin->GetLibName() == rLibName )
717cdf0e10cSrcweir 		{
718cdf0e10cSrcweir 			if ( pWin == pCurWin )
719cdf0e10cSrcweir 				bChangeCurWindow = sal_True;
720cdf0e10cSrcweir 			pWin->StoreData();
721cdf0e10cSrcweir 			RemoveWindow( pWin, bDestroy, sal_False );
722cdf0e10cSrcweir 			nWin--;
723cdf0e10cSrcweir 		}
724cdf0e10cSrcweir 	}
725cdf0e10cSrcweir 	if ( bChangeCurWindow )
726cdf0e10cSrcweir 		SetCurWindow( FindApplicationWindow(), sal_True );
727cdf0e10cSrcweir }
728cdf0e10cSrcweir 
729cdf0e10cSrcweir 
730cdf0e10cSrcweir 
731cdf0e10cSrcweir void BasicIDEShell::UpdateWindows()
732cdf0e10cSrcweir {
733cdf0e10cSrcweir 	// Alle Fenster, die nicht angezeigt werden duerfen, entfernen
734cdf0e10cSrcweir 	sal_Bool bChangeCurWindow = pCurWin ? sal_False : sal_True;
735cdf0e10cSrcweir     if ( m_aCurLibName.Len() )
736cdf0e10cSrcweir 	{
737cdf0e10cSrcweir 		for ( sal_uLong nWin = 0; nWin < aIDEWindowTable.Count(); nWin++ )
738cdf0e10cSrcweir 		{
739cdf0e10cSrcweir 			IDEBaseWindow* pWin = aIDEWindowTable.GetObject( nWin );
740cdf0e10cSrcweir             if ( !pWin->IsDocument( m_aCurDocument ) || pWin->GetLibName() != m_aCurLibName )
741cdf0e10cSrcweir 			{
742cdf0e10cSrcweir 				if ( pWin == pCurWin )
743cdf0e10cSrcweir 					bChangeCurWindow = sal_True;
744cdf0e10cSrcweir 				pWin->StoreData();
745cdf0e10cSrcweir 				// Die Abfrage auf RUNNING verhindert den Absturz, wenn in Reschedule.
746cdf0e10cSrcweir 				// Fenster bleibt erstmal stehen, spaeter sowieso mal umstellen,
747cdf0e10cSrcweir 				// dass Fenster nur als Hidden markiert werden und nicht
748cdf0e10cSrcweir 				// geloescht.
749cdf0e10cSrcweir 				if ( !(pWin->GetStatus() & ( BASWIN_TOBEKILLED | BASWIN_RUNNINGBASIC | BASWIN_SUSPENDED ) ) )
750cdf0e10cSrcweir 				{
751cdf0e10cSrcweir 					RemoveWindow( pWin, sal_False, sal_False );
752cdf0e10cSrcweir 					nWin--;
753cdf0e10cSrcweir 				}
754cdf0e10cSrcweir 			}
755cdf0e10cSrcweir 		}
756cdf0e10cSrcweir 	}
757cdf0e10cSrcweir 
758cdf0e10cSrcweir 	if ( bCreatingWindow )
759cdf0e10cSrcweir 		return;
760cdf0e10cSrcweir 
761cdf0e10cSrcweir     IDEBaseWindow* pNextActiveWindow = 0;
762cdf0e10cSrcweir 
763cdf0e10cSrcweir 	// Alle anzuzeigenden Fenster anzeigen
764cdf0e10cSrcweir     ScriptDocuments aDocuments( ScriptDocument::getAllScriptDocuments( ScriptDocument::AllWithApplication ) );
765cdf0e10cSrcweir     for (   ScriptDocuments::const_iterator doc = aDocuments.begin();
766cdf0e10cSrcweir             doc != aDocuments.end();
767cdf0e10cSrcweir             ++doc
768cdf0e10cSrcweir         )
769cdf0e10cSrcweir 	{
770cdf0e10cSrcweir 		StartListening( *doc->getBasicManager(), sal_True /* Nur einmal anmelden */ );
771cdf0e10cSrcweir 
772cdf0e10cSrcweir         // libraries
773cdf0e10cSrcweir         Sequence< ::rtl::OUString > aLibNames( doc->getLibraryNames() );
774cdf0e10cSrcweir         sal_Int32 nLibCount = aLibNames.getLength();
775cdf0e10cSrcweir 	    const ::rtl::OUString* pLibNames = aLibNames.getConstArray();
776cdf0e10cSrcweir 
777cdf0e10cSrcweir         for ( sal_Int32 i = 0 ; i < nLibCount ; i++ )
778cdf0e10cSrcweir 	    {
779cdf0e10cSrcweir             String aLibName = pLibNames[ i ];
780cdf0e10cSrcweir 
781cdf0e10cSrcweir             if ( !m_aCurLibName.Len() || ( *doc == m_aCurDocument && aLibName == m_aCurLibName ) )
782cdf0e10cSrcweir             {
783cdf0e10cSrcweir                 // check, if library is password protected and not verified
784cdf0e10cSrcweir                 sal_Bool bProtected = sal_False;
785cdf0e10cSrcweir                 Reference< script::XLibraryContainer > xModLibContainer( doc->getLibraryContainer( E_SCRIPTS ) );
786cdf0e10cSrcweir                 if ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) )
787cdf0e10cSrcweir                 {
788cdf0e10cSrcweir                     Reference< script::XLibraryContainerPassword > xPasswd( xModLibContainer, UNO_QUERY );
789cdf0e10cSrcweir                     if ( xPasswd.is() && xPasswd->isLibraryPasswordProtected( aLibName ) && !xPasswd->isLibraryPasswordVerified( aLibName ) )
790cdf0e10cSrcweir                     {
791cdf0e10cSrcweir                         bProtected = sal_True;
792cdf0e10cSrcweir                     }
793cdf0e10cSrcweir                 }
794cdf0e10cSrcweir 
795cdf0e10cSrcweir                 if ( !bProtected )
796cdf0e10cSrcweir                 {
797cdf0e10cSrcweir                     LibInfoItem* pLibInfoItem = 0;
798cdf0e10cSrcweir                     BasicIDEData* pData = IDE_DLL()->GetExtraData();
799cdf0e10cSrcweir                     if ( pData )
800cdf0e10cSrcweir                         pLibInfoItem = pData->GetLibInfos().GetInfo( LibInfoKey( *doc, aLibName ) );
801cdf0e10cSrcweir 
802cdf0e10cSrcweir                     // modules
803cdf0e10cSrcweir                     if ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) )
804cdf0e10cSrcweir                     {
805cdf0e10cSrcweir                         StarBASIC* pLib = doc->getBasicManager()->GetLib( aLibName );
806cdf0e10cSrcweir                         if ( pLib )
807cdf0e10cSrcweir                             ImplStartListening( pLib );
808cdf0e10cSrcweir 
809cdf0e10cSrcweir                         try
810cdf0e10cSrcweir 					    {
811cdf0e10cSrcweir                             Sequence< ::rtl::OUString > aModNames( doc->getObjectNames( E_SCRIPTS, aLibName ) );
812cdf0e10cSrcweir                             sal_Int32 nModCount = aModNames.getLength();
813cdf0e10cSrcweir 	                        const ::rtl::OUString* pModNames = aModNames.getConstArray();
814cdf0e10cSrcweir 
815cdf0e10cSrcweir                             for ( sal_Int32 j = 0 ; j < nModCount ; j++ )
816cdf0e10cSrcweir 				            {
817cdf0e10cSrcweir 					            String aModName = pModNames[ j ];
818cdf0e10cSrcweir 						        ModulWindow* pWin = FindBasWin( *doc, aLibName, aModName, sal_False );
819cdf0e10cSrcweir                                 if ( !pWin )
820cdf0e10cSrcweir 							        pWin = CreateBasWin( *doc, aLibName, aModName );
821cdf0e10cSrcweir                                 if ( !pNextActiveWindow && pLibInfoItem && pLibInfoItem->GetCurrentName() == aModName &&
822cdf0e10cSrcweir                                         pLibInfoItem->GetCurrentType() == BASICIDE_TYPE_MODULE )
823cdf0e10cSrcweir                                 {
824cdf0e10cSrcweir                                     pNextActiveWindow = (IDEBaseWindow*)pWin;
825cdf0e10cSrcweir                                 }
826cdf0e10cSrcweir                             }
827cdf0e10cSrcweir                         }
828cdf0e10cSrcweir 					    catch ( container::NoSuchElementException& )
829cdf0e10cSrcweir 					    {
830cdf0e10cSrcweir                             DBG_UNHANDLED_EXCEPTION();
831cdf0e10cSrcweir 					    }
832cdf0e10cSrcweir                     }
833cdf0e10cSrcweir 
834cdf0e10cSrcweir                     // dialogs
835cdf0e10cSrcweir                     Reference< script::XLibraryContainer > xDlgLibContainer( doc->getLibraryContainer( E_DIALOGS ) );
836cdf0e10cSrcweir                     if ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aLibName ) )
837cdf0e10cSrcweir                     {
838cdf0e10cSrcweir                         try
839cdf0e10cSrcweir                         {
840cdf0e10cSrcweir                             Sequence< ::rtl::OUString > aDlgNames = doc->getObjectNames( E_DIALOGS, aLibName );
841cdf0e10cSrcweir                             sal_Int32 nDlgCount = aDlgNames.getLength();
842cdf0e10cSrcweir 	                        const ::rtl::OUString* pDlgNames = aDlgNames.getConstArray();
843cdf0e10cSrcweir 
844cdf0e10cSrcweir                             for ( sal_Int32 j = 0 ; j < nDlgCount ; j++ )
845cdf0e10cSrcweir 				            {
846cdf0e10cSrcweir 					            String aDlgName = pDlgNames[ j ];
847cdf0e10cSrcweir                                 // this find only looks for non-suspended windows;
848cdf0e10cSrcweir                                 // suspended windows are handled in CreateDlgWin
849cdf0e10cSrcweir                                 DialogWindow* pWin = FindDlgWin( *doc, aLibName, aDlgName, sal_False );
850cdf0e10cSrcweir                                 if ( !pWin )
851cdf0e10cSrcweir 								    pWin = CreateDlgWin( *doc, aLibName, aDlgName );
852cdf0e10cSrcweir                                 if ( !pNextActiveWindow && pLibInfoItem && pLibInfoItem->GetCurrentName() == aDlgName &&
853cdf0e10cSrcweir                                         pLibInfoItem->GetCurrentType() == BASICIDE_TYPE_DIALOG )
854cdf0e10cSrcweir                                 {
855cdf0e10cSrcweir                                     pNextActiveWindow = (IDEBaseWindow*)pWin;
856cdf0e10cSrcweir                                 }
857cdf0e10cSrcweir                             }
858cdf0e10cSrcweir                         }
859cdf0e10cSrcweir 					    catch ( container::NoSuchElementException& )
860cdf0e10cSrcweir 					    {
861cdf0e10cSrcweir 						    DBG_UNHANDLED_EXCEPTION();
862cdf0e10cSrcweir 					    }
863cdf0e10cSrcweir                     }
864cdf0e10cSrcweir 				}
865cdf0e10cSrcweir             }
866cdf0e10cSrcweir         }
867cdf0e10cSrcweir 	}
868cdf0e10cSrcweir 
869cdf0e10cSrcweir 	if ( bChangeCurWindow )
870cdf0e10cSrcweir     {
871cdf0e10cSrcweir         if ( !pNextActiveWindow )
872cdf0e10cSrcweir             pNextActiveWindow = FindApplicationWindow();
873cdf0e10cSrcweir         SetCurWindow( pNextActiveWindow, sal_True );
874cdf0e10cSrcweir     }
875cdf0e10cSrcweir }
876cdf0e10cSrcweir 
877cdf0e10cSrcweir void BasicIDEShell::RemoveWindow( IDEBaseWindow* pWindow_, sal_Bool bDestroy, sal_Bool bAllowChangeCurWindow )
878cdf0e10cSrcweir {
879cdf0e10cSrcweir 	DBG_ASSERT( pWindow_, "Kann keinen NULL-Pointer loeschen!" );
880cdf0e10cSrcweir 	sal_uLong nKey = aIDEWindowTable.GetKey( pWindow_ );
881cdf0e10cSrcweir 	pTabBar->RemovePage( (sal_uInt16)nKey );
882cdf0e10cSrcweir 	aIDEWindowTable.Remove( nKey );
883cdf0e10cSrcweir 	if ( pWindow_ == pCurWin )
884cdf0e10cSrcweir 	{
885cdf0e10cSrcweir 		if ( bAllowChangeCurWindow )
886cdf0e10cSrcweir 			SetCurWindow( FindApplicationWindow(), sal_True );
887cdf0e10cSrcweir 		else
888cdf0e10cSrcweir 			SetCurWindow( NULL, sal_False );
889cdf0e10cSrcweir 	}
890cdf0e10cSrcweir 	if ( bDestroy )
891cdf0e10cSrcweir 	{
892cdf0e10cSrcweir 		if ( !( pWindow_->GetStatus() & BASWIN_INRESCHEDULE ) )
893cdf0e10cSrcweir 		{
894cdf0e10cSrcweir 			delete pWindow_;
895cdf0e10cSrcweir 		}
896cdf0e10cSrcweir 		else
897cdf0e10cSrcweir 		{
898cdf0e10cSrcweir 			pWindow_->AddStatus( BASWIN_TOBEKILLED );
899cdf0e10cSrcweir 			pWindow_->Hide();
900cdf0e10cSrcweir             // In normal mode stop basic in windows to be deleted
901cdf0e10cSrcweir             // In VBA stop basic only if the running script is trying to delete
902cdf0e10cSrcweir             // its parent module
903cdf0e10cSrcweir             bool bStop = true;
904cdf0e10cSrcweir             if ( pWindow_->GetDocument().isInVBAMode() )
905cdf0e10cSrcweir             {
906cdf0e10cSrcweir                 SbModule* pMod = StarBASIC::GetActiveModule();
907cdf0e10cSrcweir                 if ( !pMod || ( pMod && ( pMod->GetName() != pWindow_->GetName() ) ) )
908cdf0e10cSrcweir                     bStop = false;
909cdf0e10cSrcweir             }
910cdf0e10cSrcweir             if ( bStop )
911cdf0e10cSrcweir             {
912cdf0e10cSrcweir                 StarBASIC::Stop();
913cdf0e10cSrcweir                 // Es kommt kein Notify...
914cdf0e10cSrcweir                 pWindow_->BasicStopped();
915cdf0e10cSrcweir             }
916cdf0e10cSrcweir 			aIDEWindowTable.Insert( nKey, pWindow_ );	// wieder einhaegen
917cdf0e10cSrcweir 		}
918cdf0e10cSrcweir 	}
919cdf0e10cSrcweir 	else
920cdf0e10cSrcweir 	{
921cdf0e10cSrcweir 		pWindow_->Hide();
922cdf0e10cSrcweir 		pWindow_->AddStatus( BASWIN_SUSPENDED );
923cdf0e10cSrcweir 		pWindow_->Deactivating();
924cdf0e10cSrcweir 		aIDEWindowTable.Insert( nKey, pWindow_ );	// wieder einhaegen
925cdf0e10cSrcweir 	}
926cdf0e10cSrcweir 
927cdf0e10cSrcweir }
928cdf0e10cSrcweir 
929cdf0e10cSrcweir 
930cdf0e10cSrcweir 
931cdf0e10cSrcweir sal_uInt16 BasicIDEShell::InsertWindowInTable( IDEBaseWindow* pNewWin )
932cdf0e10cSrcweir {
933cdf0e10cSrcweir 	// Eigentlich prueffen,
934cdf0e10cSrcweir 	nCurKey++;
935cdf0e10cSrcweir 	aIDEWindowTable.Insert( nCurKey, pNewWin );
936cdf0e10cSrcweir 	return nCurKey;
937cdf0e10cSrcweir }
938cdf0e10cSrcweir 
939cdf0e10cSrcweir 
940cdf0e10cSrcweir 
941cdf0e10cSrcweir void BasicIDEShell::InvalidateBasicIDESlots()
942cdf0e10cSrcweir {
943cdf0e10cSrcweir 	// Nur die, die eine optische Auswirkung haben...
944cdf0e10cSrcweir 
945cdf0e10cSrcweir 	if ( IDE_DLL()->GetShell() )
946cdf0e10cSrcweir 	{
947cdf0e10cSrcweir         SfxBindings* pBindings = BasicIDE::GetBindingsPtr();
948cdf0e10cSrcweir         if ( pBindings )
949cdf0e10cSrcweir         {
950cdf0e10cSrcweir             pBindings->Invalidate( SID_UNDO );
951cdf0e10cSrcweir             pBindings->Invalidate( SID_REDO );
952cdf0e10cSrcweir             pBindings->Invalidate( SID_SAVEDOC );
953cdf0e10cSrcweir             pBindings->Invalidate( SID_SIGNATURE );
954cdf0e10cSrcweir             pBindings->Invalidate( SID_BASICIDE_CHOOSEMACRO );
955cdf0e10cSrcweir             pBindings->Invalidate( SID_BASICIDE_MODULEDLG );
956cdf0e10cSrcweir             pBindings->Invalidate( SID_BASICIDE_OBJCAT );
957cdf0e10cSrcweir             pBindings->Invalidate( SID_BASICSTOP );
958cdf0e10cSrcweir             pBindings->Invalidate( SID_BASICRUN );
959cdf0e10cSrcweir             pBindings->Invalidate( SID_BASICCOMPILE );
960cdf0e10cSrcweir             pBindings->Invalidate( SID_BASICLOAD );
961cdf0e10cSrcweir             pBindings->Invalidate( SID_BASICSAVEAS );
962cdf0e10cSrcweir             pBindings->Invalidate( SID_BASICIDE_MATCHGROUP );
963cdf0e10cSrcweir             pBindings->Invalidate( SID_BASICSTEPINTO );
964cdf0e10cSrcweir             pBindings->Invalidate( SID_BASICSTEPOVER );
965cdf0e10cSrcweir             pBindings->Invalidate( SID_BASICSTEPOUT );
966cdf0e10cSrcweir             pBindings->Invalidate( SID_BASICIDE_TOGGLEBRKPNT );
967cdf0e10cSrcweir             pBindings->Invalidate( SID_BASICIDE_MANAGEBRKPNTS );
968cdf0e10cSrcweir             pBindings->Invalidate( SID_BASICIDE_ADDWATCH );
969cdf0e10cSrcweir             pBindings->Invalidate( SID_BASICIDE_REMOVEWATCH );
970cdf0e10cSrcweir             pBindings->Invalidate( SID_CHOOSE_CONTROLS );
971cdf0e10cSrcweir             pBindings->Invalidate( SID_PRINTDOC );
972cdf0e10cSrcweir             pBindings->Invalidate( SID_PRINTDOCDIRECT );
973cdf0e10cSrcweir             pBindings->Invalidate( SID_SETUPPRINTER );
974cdf0e10cSrcweir             pBindings->Invalidate( SID_DIALOG_TESTMODE );
975cdf0e10cSrcweir 
976cdf0e10cSrcweir             pBindings->Invalidate( SID_DOC_MODIFIED );
977cdf0e10cSrcweir             pBindings->Invalidate( SID_BASICIDE_STAT_TITLE );
978cdf0e10cSrcweir             pBindings->Invalidate( SID_BASICIDE_STAT_POS );
979cdf0e10cSrcweir             pBindings->Invalidate( SID_ATTR_INSERT );
980cdf0e10cSrcweir             pBindings->Invalidate( SID_ATTR_SIZE );
981cdf0e10cSrcweir         }
982cdf0e10cSrcweir 	}
983cdf0e10cSrcweir }
984cdf0e10cSrcweir 
985cdf0e10cSrcweir void BasicIDEShell::EnableScrollbars( sal_Bool bEnable )
986cdf0e10cSrcweir {
987cdf0e10cSrcweir 	if ( bEnable )
988cdf0e10cSrcweir 	{
989cdf0e10cSrcweir 		aHScrollBar.Enable();
990cdf0e10cSrcweir 		aVScrollBar.Enable();
991cdf0e10cSrcweir 	}
992cdf0e10cSrcweir 	else
993cdf0e10cSrcweir 	{
994cdf0e10cSrcweir 		aHScrollBar.Disable();
995cdf0e10cSrcweir 		aVScrollBar.Disable();
996cdf0e10cSrcweir 	}
997cdf0e10cSrcweir }
998cdf0e10cSrcweir 
999cdf0e10cSrcweir void BasicIDEShell::SetCurLib( const ScriptDocument& rDocument, String aLibName, bool bUpdateWindows, bool bCheck )
1000cdf0e10cSrcweir {
1001cdf0e10cSrcweir     if ( !bCheck || ( rDocument != m_aCurDocument || aLibName != m_aCurLibName ) )
1002cdf0e10cSrcweir     {
1003cdf0e10cSrcweir         ContainerListenerImpl* pListener = static_cast< ContainerListenerImpl* >( m_xLibListener.get() );
1004cdf0e10cSrcweir 
1005cdf0e10cSrcweir         if ( pListener )
1006cdf0e10cSrcweir         	pListener->removeContainerListener( m_aCurDocument, m_aCurLibName );
1007cdf0e10cSrcweir 
1008cdf0e10cSrcweir         m_aCurDocument = rDocument;
1009cdf0e10cSrcweir 
1010cdf0e10cSrcweir         pListener->addContainerListener( m_aCurDocument, aLibName );
1011cdf0e10cSrcweir 
1012cdf0e10cSrcweir         m_aCurLibName = aLibName;
1013cdf0e10cSrcweir 
1014cdf0e10cSrcweir         if ( bUpdateWindows )
1015cdf0e10cSrcweir             UpdateWindows();
1016cdf0e10cSrcweir 
1017cdf0e10cSrcweir 		SetMDITitle();
1018cdf0e10cSrcweir 
1019cdf0e10cSrcweir 		SetCurLibForLocalization( rDocument, aLibName );
1020cdf0e10cSrcweir 
1021cdf0e10cSrcweir         SfxBindings* pBindings = BasicIDE::GetBindingsPtr();
1022cdf0e10cSrcweir         if ( pBindings )
1023cdf0e10cSrcweir 		{
1024cdf0e10cSrcweir             pBindings->Invalidate( SID_BASICIDE_LIBSELECTOR );
1025cdf0e10cSrcweir 			pBindings->Invalidate( SID_BASICIDE_CURRENT_LANG );
1026cdf0e10cSrcweir 			pBindings->Invalidate( SID_BASICIDE_MANAGE_LANG );
1027cdf0e10cSrcweir 		}
1028cdf0e10cSrcweir     }
1029cdf0e10cSrcweir }
1030cdf0e10cSrcweir 
1031cdf0e10cSrcweir void BasicIDEShell::SetCurLibForLocalization( const ScriptDocument& rDocument, String aLibName )
1032cdf0e10cSrcweir {
1033cdf0e10cSrcweir     // Create LocalizationMgr
1034cdf0e10cSrcweir 	delete m_pCurLocalizationMgr;
1035cdf0e10cSrcweir 	Reference< resource::XStringResourceManager > xStringResourceManager;
1036cdf0e10cSrcweir 	try
1037cdf0e10cSrcweir 	{
1038cdf0e10cSrcweir 		if( aLibName.Len() )
1039cdf0e10cSrcweir 		{
1040cdf0e10cSrcweir 			Reference< container::XNameContainer > xDialogLib( rDocument.getLibrary( E_DIALOGS, aLibName, sal_True ) );
1041cdf0e10cSrcweir 			xStringResourceManager = LocalizationMgr::getStringResourceFromDialogLibrary( xDialogLib );
1042cdf0e10cSrcweir 	    }
1043cdf0e10cSrcweir 	}
1044cdf0e10cSrcweir     catch ( container::NoSuchElementException& )
1045cdf0e10cSrcweir 	{}
1046cdf0e10cSrcweir 	m_pCurLocalizationMgr = new LocalizationMgr
1047cdf0e10cSrcweir 		( this, rDocument, aLibName, xStringResourceManager );
1048cdf0e10cSrcweir 
1049cdf0e10cSrcweir 	m_pCurLocalizationMgr->handleTranslationbar();
1050cdf0e10cSrcweir }
1051cdf0e10cSrcweir 
1052cdf0e10cSrcweir void BasicIDEShell::ImplStartListening( StarBASIC* pBasic )
1053cdf0e10cSrcweir {
1054cdf0e10cSrcweir 	StartListening( pBasic->GetBroadcaster(), sal_True /* Nur einmal anmelden */ );
1055cdf0e10cSrcweir }
1056cdf0e10cSrcweir 
1057cdf0e10cSrcweir 
1058