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