Files
libreoffice/basctl/source/basicide/basidesh.cxx
Tomcsik Bence 0e8eb19a53 Object Catalog pane in Basic IDE
Object Catalog was a floating window. It has been converted to a fixed
pane on the right hand side of the editor window. While it is a
BasicDockingWindow, at the moment it is not possible to undock, move,
or resize it. Also, the Object Catalog toolbar button does not show
the visibility status of the pane, ideally it should look pressed, when
the Object Catalog pane is visible. Another missing feature is that
the Object Catalog pane cannot be switched on together with the
dialog editor.
2012-03-11 21:49:13 +01:00

1037 lines
35 KiB
C++

/* -*- 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
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
// 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 <ide_pch.hxx>
#define _SOLAR__PRIVATE 1
#include <tools/diagnose_ex.h>
#include <basidesh.hrc>
#include <baside2.hxx>
#include <basdoc.hxx>
#include <basicbox.hxx>
#include <objdlg.hxx>
#include <tbxctl.hxx>
#include <iderdll2.hxx>
#include <basidectrlr.hxx>
#include <localizationmgr.hxx>
#define BasicIDEShell
#define SFX_TYPEMAP
#include <idetemp.hxx>
#include <basslots.hxx>
#include <iderdll.hxx>
#include <svx/pszctrl.hxx>
#include <svx/insctrl.hxx>
#include <svx/srchdlg.hxx>
#include <svx/tbcontrl.hxx>
#include <com/sun/star/script/XLibraryContainerPassword.hpp>
#include <com/sun/star/container/XContainer.hpp>
#include <svx/xmlsecctrl.hxx>
#include <sfx2/viewfac.hxx>
#include <vcl/msgbox.hxx>
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 ::rtl::OUString& 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 ::rtl::OUString& 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( ::rtl::OUString( 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;
bObjectCatalogDisplay = sal_True;
pTabBar = new BasicIDETabBar( &GetViewFrame()->GetWindow() );
pTabBar->SetSplitHdl( LINK( this, BasicIDEShell, TabBarSplitHdl ) );
bTabBarSplitted = sal_False;
nCurKey = 100;
InitScrollBars();
InitTabBar();
SetCurLib( ScriptDocument::getApplicationScriptDocument(), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("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);
// so that on a basic saving error, the shell doesn't pop right up again
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<ModulWindow*>(pCurWin)->SetLineNumberDisplay(SourceLinesDisplayed());
}
UpdateWindows();
}
void BasicIDEShell::onDocumentOpened( const ScriptDocument& /*_rDocument*/ )
{
if(pCurWin && pCurWin->IsA( TYPE(ModulWindow)))
{
dynamic_cast<ModulWindow*>(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(), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("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 )
{
Window *pParent = &GetViewFrame()->GetWindow();
InfoBox( pParent, ResId::toString(IDEResId(RID_STR_CANNOTCLOSE))).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.isEmpty() && ( pWin->IsDocument( m_aCurDocument ) || pWin->GetLibName() != m_aCurLibName ) )
SetCurLib( ScriptDocument::getApplicationScriptDocument(), ::rtl::OUString(), 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 ::rtl::OUString& 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.isEmpty() )
{
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++ )
{
::rtl::OUString aLibName = pLibNames[ i ];
if ( m_aCurLibName.isEmpty() || ( *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++ )
{
::rtl::OUString 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++ )
{
::rtl::OUString 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().Equals(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, ::rtl::OUString 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, ::rtl::OUString aLibName )
{
// Create LocalizationMgr
Reference< resource::XStringResourceManager > xStringResourceManager;
try
{
if( !aLibName.isEmpty() )
{
Reference< container::XNameContainer > xDialogLib( rDocument.getLibrary( E_DIALOGS, aLibName, sal_True ) );
xStringResourceManager = LocalizationMgr::getStringResourceFromDialogLibrary( xDialogLib );
}
}
catch (const container::NoSuchElementException& )
{}
m_pCurLocalizationMgr = boost::shared_ptr<LocalizationMgr>(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: */