/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_basctl.hxx" // CLOOKS: #define _SPIN_HXX #define _PRVWIN_HXX #define _DIALOGS_HXX #define _SVRTF_HXX #define _ISETBRW_HXX #define _VCTRLS_HXX #define SI_NOCONTROL #define SI_NOSBXCONTROLS #define ITEMID_SIZE 0 // if without PCH's: #include #define _SOLAR__PRIVATE 1 #include #include #include #include #include #include #include #include #include #include #define BasicIDEShell #define SFX_TYPEMAP #include #include #include #include #include #include #include #include #include #include #include #include using namespace ::com::sun::star::uno; using namespace ::com::sun::star; using ::rtl::OUString; static const rtl::OUString sStandardLibName( RTL_CONSTASCII_USTRINGPARAM("Standard")); typedef ::cppu::WeakImplHelper1< container::XContainerListener > ContainerListenerBASE; class ContainerListenerImpl : public ContainerListenerBASE { BasicIDEShell* mpShell; public: ContainerListenerImpl( BasicIDEShell* pShell ) : mpShell( pShell ) {} ~ContainerListenerImpl() { } void addContainerListener( const ScriptDocument& rScriptDocument, const String& aLibName ) { try { uno::Reference< container::XContainer > xContainer( rScriptDocument.getLibrary( E_SCRIPTS, aLibName, sal_False ), uno::UNO_QUERY ); if ( xContainer.is() ) { uno::Reference< container::XContainerListener > xContainerListener( this ); xContainer->addContainerListener( xContainerListener ); } } catch(const uno::Exception& ) {} } void removeContainerListener( const ScriptDocument& rScriptDocument, const String& aLibName ) { try { uno::Reference< container::XContainer > xContainer( rScriptDocument.getLibrary( E_SCRIPTS, aLibName, sal_False ), uno::UNO_QUERY ); if ( xContainer.is() ) { uno::Reference< container::XContainerListener > xContainerListener( this ); xContainer->removeContainerListener( xContainerListener ); } } catch(const uno::Exception& ) {} } // XEventListener virtual void SAL_CALL disposing( const lang::EventObject& ) throw( uno::RuntimeException ) {} // XContainerListener virtual void SAL_CALL elementInserted( const container::ContainerEvent& Event ) throw( uno::RuntimeException ) { rtl::OUString sModuleName; if( mpShell && ( Event.Accessor >>= sModuleName ) ) mpShell->FindBasWin( mpShell->m_aCurDocument, mpShell->m_aCurLibName, sModuleName, sal_True, sal_False ); } virtual void SAL_CALL elementReplaced( const container::ContainerEvent& ) throw( com::sun::star::uno::RuntimeException ) { } virtual void SAL_CALL elementRemoved( const container::ContainerEvent& Event ) throw( com::sun::star::uno::RuntimeException ) { rtl::OUString sModuleName; if( mpShell && ( Event.Accessor >>= sModuleName ) ) { IDEBaseWindow* pWin = mpShell->FindWindow( mpShell->m_aCurDocument, mpShell->m_aCurLibName, sModuleName, BASICIDE_TYPE_MODULE, sal_True ); if( pWin ) mpShell->RemoveWindow( pWin, sal_True, sal_True ); } } }; TYPEINIT1( BasicIDEShell, SfxViewShell ); SFX_IMPL_NAMED_VIEWFACTORY( BasicIDEShell, "Default" ) { SFX_VIEW_REGISTRATION( BasicDocShell ); } SFX_IMPL_INTERFACE( BasicIDEShell, SfxViewShell, IDEResId( RID_STR_IDENAME ) ) { SFX_CHILDWINDOW_REGISTRATION( SID_SEARCH_DLG ); SFX_FEATURED_CHILDWINDOW_REGISTRATION(SID_SHOW_PROPERTYBROWSER, BASICIDE_UI_FEATURE_SHOW_BROWSER); SFX_POPUPMENU_REGISTRATION( IDEResId( RID_POPUP_DLGED ) ); } #define IDE_VIEWSHELL_FLAGS SFX_VIEW_CAN_PRINT|SFX_VIEW_NO_NEWWINDOW static sal_Int32 GnBasicIDEShellCount; sal_Int32 getBasicIDEShellCount( void ) { return GnBasicIDEShellCount; } BasicIDEShell::BasicIDEShell( SfxViewFrame* pFrame_, SfxViewShell* /* pOldShell */ ) : SfxViewShell( pFrame_, IDE_VIEWSHELL_FLAGS ), m_aCurDocument( ScriptDocument::getApplicationScriptDocument() ), aHScrollBar( &GetViewFrame()->GetWindow(), WinBits( WB_HSCROLL | WB_DRAG ) ), aVScrollBar( &GetViewFrame()->GetWindow(), WinBits( WB_VSCROLL | WB_DRAG ) ), aScrollBarBox( &GetViewFrame()->GetWindow(), WinBits( WB_SIZEABLE ) ), m_bAppBasicModified( sal_False ), m_aNotifier( *this ) { m_xLibListener = new ContainerListenerImpl( this ); Init(); GnBasicIDEShellCount++; } void BasicIDEShell::Init() { TbxControls::RegisterControl( SID_CHOOSE_CONTROLS ); SvxPosSizeStatusBarControl::RegisterControl(); SvxInsertStatusBarControl::RegisterControl(); XmlSecStatusBarControl::RegisterControl( SID_SIGNATURE ); SvxSimpleUndoRedoController::RegisterControl( SID_UNDO ); SvxSimpleUndoRedoController::RegisterControl( SID_REDO ); SvxSearchDialogWrapper::RegisterChildWindow( sal_False ); BasicIDEGlobals::GetExtraData()->ShellInCriticalSection() = sal_True; SetName( String( RTL_CONSTASCII_USTRINGPARAM( "BasicIDE" ) ) ); SetHelpId( SVX_INTERFACE_BASIDE_VIEWSH ); LibBoxControl::RegisterControl( SID_BASICIDE_LIBSELECTOR ); LanguageBoxControl::RegisterControl( SID_BASICIDE_CURRENT_LANG ); CreateModulWindowLayout(); GetViewFrame()->GetWindow().SetBackground(); pCurWin = 0; m_aCurDocument = ScriptDocument::getApplicationScriptDocument(); pObjectCatalog = 0; bCreatingWindow = sal_False; m_pCurLocalizationMgr = NULL; pTabBar = new BasicIDETabBar( &GetViewFrame()->GetWindow() ); pTabBar->SetSplitHdl( LINK( this, BasicIDEShell, TabBarSplitHdl ) ); bTabBarSplitted = sal_False; nCurKey = 100; InitScrollBars(); InitTabBar(); SetCurLib( ScriptDocument::getApplicationScriptDocument(), String::CreateFromAscii( "Standard" ), false, false ); BasicIDEGlobals::ShellCreated(this); BasicIDEGlobals::GetExtraData()->ShellInCriticalSection() = sal_False; // It's enough to create the controller ... // It will be public by using magic :-) new BasicIDEController( this ); // Force updating the title ! Because it must be set to the controller // it has to be called directly after creating those controller. SetMDITitle (); UpdateWindows(); } BasicIDEShell::~BasicIDEShell() { m_aNotifier.dispose(); BasicIDEGlobals::ShellDestroyed(this); // Damit bei einem Basic-Fehler beim Speichern die Shell nicht sofort // wieder hoch kommt: BasicIDEGlobals::GetExtraData()->ShellInCriticalSection() = sal_True; SetWindow( 0 ); SetCurWindow( 0 ); IDEBaseWindow* pWin = aIDEWindowTable.First(); while ( pWin ) { // no store; does already happen when the BasicManagers are destroyed delete pWin; pWin = aIDEWindowTable.Next(); } aIDEWindowTable.Clear(); delete pTabBar; delete pObjectCatalog; DestroyModulWindowLayout(); ContainerListenerImpl* pListener = static_cast< ContainerListenerImpl* >( m_xLibListener.get() ); // Destroy all ContainerListeners for Basic Container. if ( pListener ) pListener->removeContainerListener( m_aCurDocument, m_aCurLibName ); BasicIDEGlobals::GetExtraData()->ShellInCriticalSection() = sal_False; GnBasicIDEShellCount--; } void BasicIDEShell::onDocumentCreated( const ScriptDocument& /*_rDocument*/ ) { if(pCurWin && pCurWin->IsA( TYPE(ModulWindow))) { dynamic_cast(pCurWin)->SetLineNumberDisplay(SourceLinesDisplayed()); } UpdateWindows(); } void BasicIDEShell::onDocumentOpened( const ScriptDocument& /*_rDocument*/ ) { if(pCurWin && pCurWin->IsA( TYPE(ModulWindow))) { dynamic_cast(pCurWin)->SetLineNumberDisplay(SourceLinesDisplayed()); } UpdateWindows(); } void BasicIDEShell::onDocumentSave( const ScriptDocument& /*_rDocument*/ ) { StoreAllWindowData(); } void BasicIDEShell::onDocumentSaveDone( const ScriptDocument& /*_rDocument*/ ) { // #i115671: Update SID_SAVEDOC after saving is completed SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); if ( pBindings ) pBindings->Invalidate( SID_SAVEDOC ); } void BasicIDEShell::onDocumentSaveAs( const ScriptDocument& /*_rDocument*/ ) { StoreAllWindowData(); } void BasicIDEShell::onDocumentSaveAsDone( const ScriptDocument& /*_rDocument*/ ) { // not interested in } void BasicIDEShell::onDocumentClosed( const ScriptDocument& _rDocument ) { if ( !_rDocument.isValid() ) return; bool bSetCurWindow = false; bool bSetCurLib = ( _rDocument == m_aCurDocument ); // remove all windows which belong to this document for ( sal_uLong nWin = aIDEWindowTable.Count(); nWin; ) { IDEBaseWindow* pWin = aIDEWindowTable.GetObject( --nWin ); if ( pWin->IsDocument( _rDocument ) ) { if ( pWin->GetStatus() & (BASWIN_RUNNINGBASIC|BASWIN_INRESCHEDULE) ) { pWin->AddStatus( BASWIN_TOBEKILLED ); pWin->Hide(); StarBASIC::Stop(); // there's no notify pWin->BasicStopped(); } else { pWin->StoreData(); if ( pWin == pCurWin ) bSetCurWindow = true; RemoveWindow( pWin, sal_True, sal_False ); } } } // remove lib info BasicIDEData* pData = BasicIDEGlobals::GetExtraData(); if ( pData ) pData->GetLibInfos().RemoveInfoFor( _rDocument ); if ( bSetCurLib ) SetCurLib( ScriptDocument::getApplicationScriptDocument(), String::CreateFromAscii( "Standard" ), true, false ); else if ( bSetCurWindow ) SetCurWindow( FindApplicationWindow(), sal_True ); } void BasicIDEShell::onDocumentTitleChanged( const ScriptDocument& /*_rDocument*/ ) { SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); if ( pBindings ) pBindings->Invalidate( SID_BASICIDE_LIBSELECTOR, sal_True, sal_False ); SetMDITitle(); } void BasicIDEShell::onDocumentModeChanged( const ScriptDocument& _rDocument ) { for ( sal_uLong nWin = aIDEWindowTable.Count(); nWin; ) { IDEBaseWindow* pWin = aIDEWindowTable.GetObject( --nWin ); if ( pWin->IsDocument( _rDocument ) && _rDocument.isDocument() ) pWin->SetReadOnly( _rDocument.isReadOnly() ); } } void BasicIDEShell::StoreAllWindowData( sal_Bool bPersistent ) { for ( sal_uLong nWin = 0; nWin < aIDEWindowTable.Count(); nWin++ ) { IDEBaseWindow* pWin = aIDEWindowTable.GetObject( nWin ); DBG_ASSERT( pWin, "PrepareClose: NULL-Pointer in Table?" ); if ( !pWin->IsSuspended() ) pWin->StoreData(); } if ( bPersistent ) { SFX_APP()->SaveBasicAndDialogContainer(); SetAppBasicModified( sal_False ); SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); if ( pBindings ) { pBindings->Invalidate( SID_SAVEDOC ); pBindings->Update( SID_SAVEDOC ); } } } sal_uInt16 BasicIDEShell::PrepareClose( sal_Bool bUI, sal_Bool bForBrowsing ) { (void)bForBrowsing; // reset here because it's modified after printing etc. (DocInfo) GetViewFrame()->GetObjectShell()->SetModified(sal_False); if ( StarBASIC::IsRunning() ) { if( bUI ) { String aErrorStr( IDEResId( RID_STR_CANNOTCLOSE ) ); Window *pParent = &GetViewFrame()->GetWindow(); InfoBox( pParent, aErrorStr ).Execute(); } return sal_False; } else { sal_Bool bCanClose = sal_True; for ( sal_uLong nWin = 0; bCanClose && ( nWin < aIDEWindowTable.Count() ); nWin++ ) { IDEBaseWindow* pWin = aIDEWindowTable.GetObject( nWin ); if ( !pWin->CanClose() ) { if ( m_aCurLibName.Len() && ( pWin->IsDocument( m_aCurDocument ) || pWin->GetLibName() != m_aCurLibName ) ) SetCurLib( ScriptDocument::getApplicationScriptDocument(), String(), false ); SetCurWindow( pWin, sal_True ); bCanClose = sal_False; } } if ( bCanClose ) StoreAllWindowData( sal_False ); // don't write on the disk, that will be done later automatically return bCanClose; } } void BasicIDEShell::InitScrollBars() { aVScrollBar.SetLineSize( 300 ); aVScrollBar.SetPageSize( 2000 ); aHScrollBar.SetLineSize( 300 ); aHScrollBar.SetPageSize( 2000 ); aHScrollBar.Enable(); aVScrollBar.Enable(); aVScrollBar.Show(); aHScrollBar.Show(); aScrollBarBox.Show(); } void BasicIDEShell::InitTabBar() { pTabBar->Enable(); pTabBar->Show(); pTabBar->SetSelectHdl( LINK( this, BasicIDEShell, TabBarHdl ) ); } Size BasicIDEShell::GetOptimalSizePixel() const { return Size( 400, 300 ); } void BasicIDEShell::OuterResizePixel( const Point &rPos, const Size &rSize ) { AdjustPosSizePixel( rPos, rSize ); } IMPL_LINK_INLINE_START( BasicIDEShell, TabBarSplitHdl, TabBar *, pTBar ) { (void)pTBar; bTabBarSplitted = sal_True; ArrangeTabBar(); return 0; } IMPL_LINK_INLINE_END( BasicIDEShell, TabBarSplitHdl, TabBar *, pTBar ) IMPL_LINK( BasicIDEShell, TabBarHdl, TabBar *, pCurTabBar ) { sal_uInt16 nCurId = pCurTabBar->GetCurPageId(); IDEBaseWindow* pWin = aIDEWindowTable.Get( nCurId ); DBG_ASSERT( pWin, "Eintrag in TabBar passt zu keinem Fenster!" ); SetCurWindow( pWin ); return 0; } sal_Bool BasicIDEShell::NextPage( sal_Bool bPrev ) { sal_Bool bRet = sal_False; sal_uInt16 nPos = pTabBar->GetPagePos( pTabBar->GetCurPageId() ); if ( bPrev ) --nPos; else ++nPos; if ( nPos < pTabBar->GetPageCount() ) { IDEBaseWindow* pWin = aIDEWindowTable.Get( pTabBar->GetPageId( nPos ) ); SetCurWindow( pWin, sal_True ); bRet = sal_True; } return bRet; } void BasicIDEShell::ArrangeTabBar() { Size aSz( GetViewFrame()->GetWindow().GetOutputSizePixel() ); long nBoxPos = aScrollBarBox.GetPosPixel().X() - 1; long nPos = pTabBar->GetSplitSize(); if ( nPos <= nBoxPos ) { Point aPnt( pTabBar->GetPosPixel() ); long nH = aHScrollBar.GetSizePixel().Height(); pTabBar->SetPosSizePixel( aPnt, Size( nPos, nH ) ); long nScrlStart = aPnt.X() + nPos; aHScrollBar.SetPosSizePixel( Point( nScrlStart, aPnt.Y() ), Size( nBoxPos - nScrlStart + 2, nH ) ); aHScrollBar.Update(); } } ::svl::IUndoManager* BasicIDEShell::GetUndoManager() { ::svl::IUndoManager* pMgr = NULL; if( pCurWin ) pMgr = pCurWin->GetUndoManager(); return pMgr; } void BasicIDEShell::ShowObjectDialog( sal_Bool bShow, sal_Bool bCreateOrDestroy ) { if ( bShow ) { if ( !pObjectCatalog && bCreateOrDestroy ) { pObjectCatalog = new ObjectCatalog( &GetViewFrame()->GetWindow() ); // position is memorized in BasicIDEData and adjusted by the Dlg if ( pObjectCatalog ) { pObjectCatalog->SetCancelHdl( LINK( this, BasicIDEShell, ObjectDialogCancelHdl ) ); BasicEntryDescriptor aDesc; IDEBaseWindow* pCurWin_ = GetCurWindow(); if ( pCurWin_ ) aDesc = pCurWin_->CreateEntryDescriptor(); pObjectCatalog->SetCurrentEntry( aDesc ); } } // the very last changes... if ( pCurWin ) pCurWin->StoreData(); if ( pObjectCatalog ) { pObjectCatalog->UpdateEntries(); pObjectCatalog->Show(); } } else if ( pObjectCatalog ) { pObjectCatalog->Hide(); if ( bCreateOrDestroy ) { // pObjectCatalog to NULL before the delete because of OS/2-focus-problem ObjectCatalog* pTemp = pObjectCatalog; pObjectCatalog = 0; delete pTemp; } } } void BasicIDEShell::SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId&, const SfxHint& rHint, const TypeId& ) { if ( BasicIDEGlobals::GetShell() ) { if ( rHint.IsA( TYPE( SfxSimpleHint ) ) ) { switch ( ((SfxSimpleHint&)rHint).GetId() ) { case SFX_HINT_DYING: { EndListening( rBC, sal_True /* log off all */ ); if ( pObjectCatalog ) pObjectCatalog->UpdateEntries(); } break; } if ( rHint.IsA( TYPE( SbxHint ) ) ) { SbxHint& rSbxHint = (SbxHint&)rHint; sal_uLong nHintId = rSbxHint.GetId(); if ( ( nHintId == SBX_HINT_BASICSTART ) || ( nHintId == SBX_HINT_BASICSTOP ) ) { SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); if ( pBindings ) { pBindings->Invalidate( SID_BASICRUN ); pBindings->Update( SID_BASICRUN ); pBindings->Invalidate( SID_BASICCOMPILE ); pBindings->Update( SID_BASICCOMPILE ); pBindings->Invalidate( SID_BASICSTEPOVER ); pBindings->Update( SID_BASICSTEPOVER ); pBindings->Invalidate( SID_BASICSTEPINTO ); pBindings->Update( SID_BASICSTEPINTO ); pBindings->Invalidate( SID_BASICSTEPOUT ); pBindings->Update( SID_BASICSTEPOUT ); pBindings->Invalidate( SID_BASICSTOP ); pBindings->Update( SID_BASICSTOP ); pBindings->Invalidate( SID_BASICIDE_TOGGLEBRKPNT ); pBindings->Update( SID_BASICIDE_TOGGLEBRKPNT ); pBindings->Invalidate( SID_BASICIDE_MANAGEBRKPNTS ); pBindings->Update( SID_BASICIDE_MANAGEBRKPNTS ); pBindings->Invalidate( SID_BASICIDE_MODULEDLG ); pBindings->Update( SID_BASICIDE_MODULEDLG ); pBindings->Invalidate( SID_BASICLOAD ); pBindings->Update( SID_BASICLOAD ); } if ( nHintId == SBX_HINT_BASICSTOP ) { // not only at error/break or explicit stoppage, // if the update is turned off due to a programming bug BasicIDE::BasicStopped(); UpdateModulWindowLayout( true ); // clear... if( m_pCurLocalizationMgr ) m_pCurLocalizationMgr->handleBasicStopped(); } else if( m_pCurLocalizationMgr ) { m_pCurLocalizationMgr->handleBasicStarted(); } IDEBaseWindow* pWin = aIDEWindowTable.First(); while ( pWin ) { if ( nHintId == SBX_HINT_BASICSTART ) pWin->BasicStarted(); else pWin->BasicStopped(); pWin = aIDEWindowTable.Next(); } } } } } } void BasicIDEShell::CheckWindows() { sal_Bool bSetCurWindow = sal_False; for ( sal_uLong nWin = 0; nWin < aIDEWindowTable.Count(); nWin++ ) { IDEBaseWindow* pWin = aIDEWindowTable.GetObject( nWin ); if ( pWin->GetStatus() & BASWIN_TOBEKILLED ) { pWin->StoreData(); if ( pWin == pCurWin ) bSetCurWindow = sal_True; RemoveWindow( pWin, sal_True, sal_False ); nWin--; } } if ( bSetCurWindow ) SetCurWindow( FindApplicationWindow(), sal_True ); } void BasicIDEShell::RemoveWindows( const ScriptDocument& rDocument, const String& rLibName, sal_Bool bDestroy ) { sal_Bool bChangeCurWindow = pCurWin ? sal_False : sal_True; for ( sal_uLong nWin = 0; nWin < aIDEWindowTable.Count(); nWin++ ) { IDEBaseWindow* pWin = aIDEWindowTable.GetObject( nWin ); if ( pWin->IsDocument( rDocument ) && pWin->GetLibName() == rLibName ) { if ( pWin == pCurWin ) bChangeCurWindow = sal_True; pWin->StoreData(); RemoveWindow( pWin, bDestroy, sal_False ); nWin--; } } if ( bChangeCurWindow ) SetCurWindow( FindApplicationWindow(), sal_True ); } void BasicIDEShell::UpdateWindows() { // remove all windows that may not be displayed sal_Bool bChangeCurWindow = pCurWin ? sal_False : sal_True; if ( m_aCurLibName.Len() ) { for ( sal_uLong nWin = 0; nWin < aIDEWindowTable.Count(); nWin++ ) { IDEBaseWindow* pWin = aIDEWindowTable.GetObject( nWin ); if ( !pWin->IsDocument( m_aCurDocument ) || pWin->GetLibName() != m_aCurLibName ) { if ( pWin == pCurWin ) bChangeCurWindow = sal_True; pWin->StoreData(); // The request of RUNNING prevents the crash when in reschedule. // Window is frozen at first, later the windows should be changed // anyway to be marked as hidden instead of being deleted. if ( !(pWin->GetStatus() & ( BASWIN_TOBEKILLED | BASWIN_RUNNINGBASIC | BASWIN_SUSPENDED ) ) ) { RemoveWindow( pWin, sal_False, sal_False ); nWin--; } } } } if ( bCreatingWindow ) return; IDEBaseWindow* pNextActiveWindow = 0; // show all windows that are to be shown ScriptDocuments aDocuments( ScriptDocument::getAllScriptDocuments( ScriptDocument::AllWithApplication ) ); for ( ScriptDocuments::const_iterator doc = aDocuments.begin(); doc != aDocuments.end(); ++doc ) { StartListening( *doc->getBasicManager(), sal_True /* log on only once */ ); // libraries Sequence< ::rtl::OUString > aLibNames( doc->getLibraryNames() ); sal_Int32 nLibCount = aLibNames.getLength(); const ::rtl::OUString* pLibNames = aLibNames.getConstArray(); for ( sal_Int32 i = 0 ; i < nLibCount ; i++ ) { String aLibName = pLibNames[ i ]; if ( !m_aCurLibName.Len() || ( *doc == m_aCurDocument && aLibName == m_aCurLibName ) ) { // check, if library is password protected and not verified sal_Bool bProtected = sal_False; Reference< script::XLibraryContainer > xModLibContainer( doc->getLibraryContainer( E_SCRIPTS ) ); if ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) ) { Reference< script::XLibraryContainerPassword > xPasswd( xModLibContainer, UNO_QUERY ); if ( xPasswd.is() && xPasswd->isLibraryPasswordProtected( aLibName ) && !xPasswd->isLibraryPasswordVerified( aLibName ) ) { bProtected = sal_True; } } if ( !bProtected ) { LibInfoItem* pLibInfoItem = 0; BasicIDEData* pData = BasicIDEGlobals::GetExtraData(); if ( pData ) pLibInfoItem = pData->GetLibInfos().GetInfo( LibInfoKey( *doc, aLibName ) ); // modules if ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) ) { StarBASIC* pLib = doc->getBasicManager()->GetLib( aLibName ); if ( pLib ) ImplStartListening( pLib ); try { Sequence< ::rtl::OUString > aModNames( doc->getObjectNames( E_SCRIPTS, aLibName ) ); sal_Int32 nModCount = aModNames.getLength(); const ::rtl::OUString* pModNames = aModNames.getConstArray(); for ( sal_Int32 j = 0 ; j < nModCount ; j++ ) { String aModName = pModNames[ j ]; ModulWindow* pWin = FindBasWin( *doc, aLibName, aModName, sal_False ); if ( !pWin ) pWin = CreateBasWin( *doc, aLibName, aModName ); if ( !pNextActiveWindow && pLibInfoItem && pLibInfoItem->GetCurrentName() == aModName && pLibInfoItem->GetCurrentType() == BASICIDE_TYPE_MODULE ) { pNextActiveWindow = (IDEBaseWindow*)pWin; } } } catch (const container::NoSuchElementException& ) { DBG_UNHANDLED_EXCEPTION(); } } // dialogs Reference< script::XLibraryContainer > xDlgLibContainer( doc->getLibraryContainer( E_DIALOGS ) ); if ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aLibName ) ) { try { Sequence< ::rtl::OUString > aDlgNames = doc->getObjectNames( E_DIALOGS, aLibName ); sal_Int32 nDlgCount = aDlgNames.getLength(); const ::rtl::OUString* pDlgNames = aDlgNames.getConstArray(); for ( sal_Int32 j = 0 ; j < nDlgCount ; j++ ) { String aDlgName = pDlgNames[ j ]; // this find only looks for non-suspended windows; // suspended windows are handled in CreateDlgWin DialogWindow* pWin = FindDlgWin( *doc, aLibName, aDlgName, sal_False ); if ( !pWin ) pWin = CreateDlgWin( *doc, aLibName, aDlgName ); if ( !pNextActiveWindow && pLibInfoItem && pLibInfoItem->GetCurrentName() == aDlgName && pLibInfoItem->GetCurrentType() == BASICIDE_TYPE_DIALOG ) { pNextActiveWindow = (IDEBaseWindow*)pWin; } } } catch (const container::NoSuchElementException& ) { DBG_UNHANDLED_EXCEPTION(); } } } } } } if ( bChangeCurWindow ) { if ( !pNextActiveWindow ) pNextActiveWindow = FindApplicationWindow(); SetCurWindow( pNextActiveWindow, sal_True ); } } void BasicIDEShell::RemoveWindow( IDEBaseWindow* pWindow_, sal_Bool bDestroy, sal_Bool bAllowChangeCurWindow ) { DBG_ASSERT( pWindow_, "Kann keinen NULL-Pointer loeschen!" ); sal_uLong nKey = aIDEWindowTable.GetKey( pWindow_ ); pTabBar->RemovePage( (sal_uInt16)nKey ); aIDEWindowTable.Remove( nKey ); if ( pWindow_ == pCurWin ) { if ( bAllowChangeCurWindow ) SetCurWindow( FindApplicationWindow(), sal_True ); else SetCurWindow( NULL, sal_False ); } if ( bDestroy ) { if ( !( pWindow_->GetStatus() & BASWIN_INRESCHEDULE ) ) { delete pWindow_; } else { pWindow_->AddStatus( BASWIN_TOBEKILLED ); pWindow_->Hide(); // In normal mode stop basic in windows to be deleted // In VBA stop basic only if the running script is trying to delete // its parent module bool bStop = true; if ( pWindow_->GetDocument().isInVBAMode() ) { SbModule* pMod = StarBASIC::GetActiveModule(); if ( !pMod || ( pMod && ( pMod->GetName() != pWindow_->GetName() ) ) ) bStop = false; } if ( bStop ) { StarBASIC::Stop(); // there will be no notify... pWindow_->BasicStopped(); } aIDEWindowTable.Insert( nKey, pWindow_ ); // jump in again } } else { pWindow_->Hide(); pWindow_->AddStatus( BASWIN_SUSPENDED ); pWindow_->Deactivating(); aIDEWindowTable.Insert( nKey, pWindow_ ); // jump in again } } sal_uInt16 BasicIDEShell::InsertWindowInTable( IDEBaseWindow* pNewWin ) { nCurKey++; aIDEWindowTable.Insert( nCurKey, pNewWin ); return nCurKey; } void BasicIDEShell::InvalidateBasicIDESlots() { // only those that have an optic effect... if ( BasicIDEGlobals::GetShell() ) { SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); if ( pBindings ) { pBindings->Invalidate( SID_UNDO ); pBindings->Invalidate( SID_REDO ); pBindings->Invalidate( SID_SAVEDOC ); pBindings->Invalidate( SID_SIGNATURE ); pBindings->Invalidate( SID_BASICIDE_CHOOSEMACRO ); pBindings->Invalidate( SID_BASICIDE_MODULEDLG ); pBindings->Invalidate( SID_BASICIDE_OBJCAT ); pBindings->Invalidate( SID_BASICSTOP ); pBindings->Invalidate( SID_BASICRUN ); pBindings->Invalidate( SID_BASICCOMPILE ); pBindings->Invalidate( SID_BASICLOAD ); pBindings->Invalidate( SID_BASICSAVEAS ); pBindings->Invalidate( SID_BASICIDE_MATCHGROUP ); pBindings->Invalidate( SID_BASICSTEPINTO ); pBindings->Invalidate( SID_BASICSTEPOVER ); pBindings->Invalidate( SID_BASICSTEPOUT ); pBindings->Invalidate( SID_BASICIDE_TOGGLEBRKPNT ); pBindings->Invalidate( SID_BASICIDE_MANAGEBRKPNTS ); pBindings->Invalidate( SID_BASICIDE_ADDWATCH ); pBindings->Invalidate( SID_BASICIDE_REMOVEWATCH ); pBindings->Invalidate( SID_CHOOSE_CONTROLS ); pBindings->Invalidate( SID_PRINTDOC ); pBindings->Invalidate( SID_PRINTDOCDIRECT ); pBindings->Invalidate( SID_SETUPPRINTER ); pBindings->Invalidate( SID_DIALOG_TESTMODE ); pBindings->Invalidate( SID_DOC_MODIFIED ); pBindings->Invalidate( SID_BASICIDE_STAT_TITLE ); pBindings->Invalidate( SID_BASICIDE_STAT_POS ); pBindings->Invalidate( SID_ATTR_INSERT ); pBindings->Invalidate( SID_ATTR_SIZE ); } } } void BasicIDEShell::EnableScrollbars( sal_Bool bEnable ) { if ( bEnable ) { aHScrollBar.Enable(); aVScrollBar.Enable(); } else { aHScrollBar.Disable(); aVScrollBar.Disable(); } } void BasicIDEShell::SetCurLib( const ScriptDocument& rDocument, String aLibName, bool bUpdateWindows, bool bCheck ) { if ( !bCheck || ( rDocument != m_aCurDocument || aLibName != m_aCurLibName ) ) { ContainerListenerImpl* pListener = static_cast< ContainerListenerImpl* >( m_xLibListener.get() ); m_aCurDocument = rDocument; m_aCurLibName = aLibName; if ( pListener ) { pListener->removeContainerListener( m_aCurDocument, m_aCurLibName ); pListener->addContainerListener( m_aCurDocument, aLibName ); } if ( bUpdateWindows ) UpdateWindows(); SetMDITitle(); SetCurLibForLocalization( rDocument, aLibName ); SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); if ( pBindings ) { pBindings->Invalidate( SID_BASICIDE_LIBSELECTOR ); pBindings->Invalidate( SID_BASICIDE_CURRENT_LANG ); pBindings->Invalidate( SID_BASICIDE_MANAGE_LANG ); } } } void BasicIDEShell::SetCurLibForLocalization( const ScriptDocument& rDocument, String aLibName ) { // Create LocalizationMgr delete m_pCurLocalizationMgr; Reference< resource::XStringResourceManager > xStringResourceManager; try { if( aLibName.Len() ) { Reference< container::XNameContainer > xDialogLib( rDocument.getLibrary( E_DIALOGS, aLibName, sal_True ) ); xStringResourceManager = LocalizationMgr::getStringResourceFromDialogLibrary( xDialogLib ); } } catch (const container::NoSuchElementException& ) {} m_pCurLocalizationMgr = new LocalizationMgr ( this, rDocument, aLibName, xStringResourceManager ); m_pCurLocalizationMgr->handleTranslationbar(); } void BasicIDEShell::ImplStartListening( StarBASIC* pBasic ) { StartListening( pBasic->GetBroadcaster(), sal_True /* log on only once */ ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */