LCOV - code coverage report
Current view: top level - basctl/source/basicide - basidesh.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 0 518 0.0 %
Date: 2015-06-13 12:38:46 Functions: 0 59 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <config_options.h>
      21             : 
      22             : #include <tools/diagnose_ex.h>
      23             : #include <basic/basmgr.hxx>
      24             : #include <basidesh.hrc>
      25             : #include "baside2.hxx"
      26             : #include "baside3.hxx"
      27             : #include <basdoc.hxx>
      28             : #include <basicbox.hxx>
      29             : #include <editeng/sizeitem.hxx>
      30             : #include <tbxctl.hxx>
      31             : #include <iderdll2.hxx>
      32             : #include <basidectrlr.hxx>
      33             : #include <localizationmgr.hxx>
      34             : #include <sfx2/app.hxx>
      35             : #include <sfx2/dinfdlg.hxx>
      36             : #include <sfx2/dispatch.hxx>
      37             : #include <sfx2/infobar.hxx>
      38             : #include <sfx2/minfitem.hxx>
      39             : #include <sfx2/objface.hxx>
      40             : #include <svl/aeitem.hxx>
      41             : #include <svl/srchitem.hxx>
      42             : 
      43             : #define basctl_Shell
      44             : #define SFX_TYPEMAP
      45             : #include <idetemp.hxx>
      46             : #include <basslots.hxx>
      47             : #include <iderdll.hxx>
      48             : #include <svx/pszctrl.hxx>
      49             : #include <svx/insctrl.hxx>
      50             : #include <svx/srchdlg.hxx>
      51             : #include <svx/tbcontrl.hxx>
      52             : #include <com/sun/star/script/XLibraryContainerPassword.hpp>
      53             : #include <com/sun/star/container/XContainer.hpp>
      54             : #include <svx/xmlsecctrl.hxx>
      55             : #include <sfx2/viewfac.hxx>
      56             : #include <vcl/msgbox.hxx>
      57             : #include <vcl/settings.hxx>
      58             : 
      59             : namespace basctl
      60             : {
      61             : 
      62             : using namespace ::com::sun::star::uno;
      63             : using namespace ::com::sun::star;
      64             : 
      65             : typedef ::cppu::WeakImplHelper1< container::XContainerListener > ContainerListenerBASE;
      66             : 
      67             : class ContainerListenerImpl : public ContainerListenerBASE
      68             : {
      69             :     Shell* mpShell;
      70             : public:
      71           0 :     explicit ContainerListenerImpl(Shell* pShell)
      72           0 :         : mpShell(pShell)
      73             :     {
      74           0 :     }
      75             : 
      76           0 :     virtual ~ContainerListenerImpl()
      77           0 :     {
      78           0 :     }
      79             : 
      80           0 :     void addContainerListener( const ScriptDocument& rScriptDocument, const OUString& aLibName )
      81             :     {
      82             :         try
      83             :         {
      84           0 :             uno::Reference< container::XContainer > xContainer( rScriptDocument.getLibrary( E_SCRIPTS, aLibName, false ), uno::UNO_QUERY );
      85           0 :             if ( xContainer.is() )
      86             :             {
      87           0 :                 uno::Reference< container::XContainerListener > xContainerListener( this );
      88           0 :                 xContainer->addContainerListener( xContainerListener );
      89           0 :             }
      90             :         }
      91           0 :         catch(const uno::Exception& ) {}
      92           0 :     }
      93           0 :     void removeContainerListener( const ScriptDocument& rScriptDocument, const OUString& aLibName )
      94             :     {
      95             :         try
      96             :         {
      97           0 :             uno::Reference< container::XContainer > xContainer( rScriptDocument.getLibrary( E_SCRIPTS, aLibName, false ), uno::UNO_QUERY );
      98           0 :             if ( xContainer.is() )
      99             :             {
     100           0 :                 uno::Reference< container::XContainerListener > xContainerListener( this );
     101           0 :                 xContainer->removeContainerListener( xContainerListener );
     102           0 :             }
     103             :         }
     104           0 :         catch(const uno::Exception& ) {}
     105           0 :     }
     106             : 
     107             :     // XEventListener
     108           0 :     virtual void SAL_CALL disposing( const lang::EventObject& ) throw( uno::RuntimeException, std::exception ) SAL_OVERRIDE {}
     109             : 
     110             :     // XContainerListener
     111           0 :     virtual void SAL_CALL elementInserted( const container::ContainerEvent& Event ) throw( uno::RuntimeException, std::exception ) SAL_OVERRIDE
     112             :     {
     113           0 :         OUString sModuleName;
     114           0 :         if( mpShell && ( Event.Accessor >>= sModuleName ) )
     115           0 :             mpShell->FindBasWin( mpShell->m_aCurDocument, mpShell->m_aCurLibName, sModuleName, true, false );
     116           0 :     }
     117           0 :     virtual void SAL_CALL elementReplaced( const container::ContainerEvent& ) throw( com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE { }
     118           0 :     virtual void SAL_CALL elementRemoved( const container::ContainerEvent& Event ) throw( com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE
     119             :     {
     120           0 :         OUString sModuleName;
     121           0 :         if( mpShell  && ( Event.Accessor >>= sModuleName ) )
     122             :         {
     123           0 :             ModulWindow* pWin = mpShell->FindBasWin(mpShell->m_aCurDocument, mpShell->m_aCurLibName, sModuleName, false, true);
     124           0 :             if( pWin )
     125           0 :                 mpShell->RemoveWindow( pWin, true, true );
     126           0 :         }
     127           0 :     }
     128             : 
     129             : };
     130             : 
     131           0 : TYPEINIT1( Shell, SfxViewShell );
     132             : 
     133           0 : SFX_IMPL_NAMED_VIEWFACTORY( Shell, "Default" )
     134             : {
     135           0 :     SFX_VIEW_REGISTRATION( DocShell );
     136           0 : }
     137             : 
     138           0 : SFX_IMPL_INTERFACE(basctl_Shell, SfxViewShell)
     139             : 
     140           0 : void basctl_Shell::InitInterface_Impl()
     141             : {
     142           0 :     GetStaticInterface()->RegisterChildWindow(SID_SEARCH_DLG);
     143           0 :     GetStaticInterface()->RegisterChildWindow(SID_SHOW_PROPERTYBROWSER, false, BASICIDE_UI_FEATURE_SHOW_BROWSER);
     144           0 :     GetStaticInterface()->RegisterChildWindow(SfxInfoBarContainerChild::GetChildWindowId());
     145             : 
     146           0 :     GetStaticInterface()->RegisterPopupMenu(IDEResId(RID_POPUP_DLGED));
     147           0 : }
     148             : 
     149             : unsigned Shell::nShellCount = 0;
     150             : 
     151           0 : Shell::Shell( SfxViewFrame* pFrame_, SfxViewShell* /* pOldShell */ ) :
     152           0 :     SfxViewShell( pFrame_, SfxViewShellFlags::CAN_PRINT | SfxViewShellFlags::NO_NEWWINDOW ),
     153           0 :     m_aCurDocument( ScriptDocument::getApplicationScriptDocument() ),
     154           0 :     aHScrollBar( VclPtr<ScrollBar>::Create(&GetViewFrame()->GetWindow(), WinBits( WB_HSCROLL | WB_DRAG )) ),
     155           0 :     aVScrollBar( VclPtr<ScrollBar>::Create(&GetViewFrame()->GetWindow(), WinBits( WB_VSCROLL | WB_DRAG )) ),
     156           0 :     aScrollBarBox( VclPtr<ScrollBarBox>::Create(&GetViewFrame()->GetWindow(), WinBits( WB_SIZEABLE )) ),
     157             :     pLayout(0),
     158           0 :     aObjectCatalog(VclPtr<ObjectCatalog>::Create(&GetViewFrame()->GetWindow())),
     159             :     m_bAppBasicModified( false ),
     160           0 :     m_aNotifier( *this )
     161             : {
     162           0 :     m_xLibListener = new ContainerListenerImpl( this );
     163           0 :     Init();
     164           0 :     nShellCount++;
     165           0 : }
     166             : 
     167           0 : void Shell::Init()
     168             : {
     169           0 :     TbxControls::RegisterControl( SID_CHOOSE_CONTROLS );
     170           0 :     SvxPosSizeStatusBarControl::RegisterControl();
     171           0 :     SvxInsertStatusBarControl::RegisterControl();
     172           0 :     XmlSecStatusBarControl::RegisterControl( SID_SIGNATURE );
     173           0 :     SvxSimpleUndoRedoController::RegisterControl( SID_UNDO );
     174           0 :     SvxSimpleUndoRedoController::RegisterControl( SID_REDO );
     175             : 
     176           0 :     SvxSearchDialogWrapper::RegisterChildWindow(false);
     177             : 
     178           0 :     GetExtraData()->ShellInCriticalSection() = true;
     179             : 
     180           0 :     SetName( OUString( "BasicIDE" ) );
     181           0 :     SetHelpId( SVX_INTERFACE_BASIDE_VIEWSH );
     182             : 
     183           0 :     LibBoxControl::RegisterControl( SID_BASICIDE_LIBSELECTOR );
     184           0 :     LanguageBoxControl::RegisterControl( SID_BASICIDE_CURRENT_LANG );
     185             : 
     186           0 :     GetViewFrame()->GetWindow().SetBackground(
     187           0 :         GetViewFrame()->GetWindow().GetSettings().GetStyleSettings().GetWindowColor()
     188           0 :     );
     189             : 
     190           0 :     pCurWin = 0;
     191           0 :     m_aCurDocument = ScriptDocument::getApplicationScriptDocument();
     192           0 :     bCreatingWindow = false;
     193             : 
     194           0 :     pTabBar.reset(VclPtr<TabBar>::Create(&GetViewFrame()->GetWindow()));
     195           0 :     pTabBar->SetSplitHdl( LINK( this, Shell, TabBarSplitHdl ) );
     196           0 :     bTabBarSplitted = false;
     197             : 
     198           0 :     nCurKey = 100;
     199           0 :     InitScrollBars();
     200           0 :     InitTabBar();
     201             : 
     202           0 :     SetCurLib( ScriptDocument::getApplicationScriptDocument(), "Standard", false, false );
     203             : 
     204           0 :     ShellCreated(this);
     205             : 
     206           0 :     GetExtraData()->ShellInCriticalSection() = false;
     207             : 
     208             :     // It's enough to create the controller ...
     209             :     // It will be public by using magic :-)
     210           0 :     new Controller(this);
     211             : 
     212             :     // Force updating the title ! Because it must be set to the controller
     213             :     // it has to be called directly after creating those controller.
     214           0 :     SetMDITitle ();
     215             : 
     216           0 :     UpdateWindows();
     217           0 : }
     218             : 
     219           0 : Shell::~Shell()
     220             : {
     221           0 :     m_aNotifier.dispose();
     222             : 
     223           0 :     ShellDestroyed(this);
     224             : 
     225             :     // so that on a basic saving error, the shell doesn't pop right up again
     226           0 :     GetExtraData()->ShellInCriticalSection() = true;
     227             : 
     228           0 :     SetWindow( 0 );
     229           0 :     SetCurWindow( 0 );
     230             : 
     231           0 :     aObjectCatalog.disposeAndClear();
     232           0 :     aScrollBarBox.disposeAndClear();
     233           0 :     aVScrollBar.disposeAndClear();
     234           0 :     aHScrollBar.disposeAndClear();
     235             : 
     236           0 :     for (WindowTable::iterator it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
     237             :     {
     238             :         // no store; does already happen when the BasicManagers are destroyed
     239           0 :         it->second.disposeAndClear();
     240             :     }
     241             : 
     242             :     // no store; does already happen when the BasicManagers are destroyed
     243           0 :     aWindowTable.clear();
     244             : 
     245             :     // Destroy all ContainerListeners for Basic Container.
     246           0 :     if (ContainerListenerImpl* pListener = static_cast<ContainerListenerImpl*>(m_xLibListener.get()))
     247           0 :         pListener->removeContainerListener(m_aCurDocument, m_aCurLibName);
     248             : 
     249           0 :     GetExtraData()->ShellInCriticalSection() = false;
     250             : 
     251           0 :     nShellCount--;
     252             : 
     253           0 :     pDialogLayout.disposeAndClear();
     254           0 :     pModulLayout.disposeAndClear();
     255           0 :     pTabBar.disposeAndClear();
     256           0 : }
     257             : 
     258           0 : void Shell::onDocumentCreated( const ScriptDocument& /*_rDocument*/ )
     259             : {
     260           0 :     if (pCurWin)
     261             :     {
     262           0 :         pCurWin->OnNewDocument();
     263             : 
     264             :         // for VBA documents, show a warning that we can save them only in ODF
     265           0 :         if (pCurWin->GetDocument().isInVBAMode())
     266           0 :             GetViewFrame()->AppendInfoBar("vba_save", IDE_RESSTR(RID_STR_CANNOTSAVEVBA));
     267             :     }
     268             : 
     269           0 :     UpdateWindows();
     270           0 : }
     271             : 
     272           0 : void Shell::onDocumentOpened( const ScriptDocument& /*_rDocument*/ )
     273             : {
     274           0 :     if (pCurWin)
     275           0 :         pCurWin->OnNewDocument();
     276           0 :     UpdateWindows();
     277           0 : }
     278             : 
     279           0 : void Shell::onDocumentSave( const ScriptDocument& /*_rDocument*/ )
     280             : {
     281           0 :     StoreAllWindowData();
     282           0 : }
     283             : 
     284           0 : void Shell::onDocumentSaveDone( const ScriptDocument& /*_rDocument*/ )
     285             : {
     286             :     // #i115671: Update SID_SAVEDOC after saving is completed
     287           0 :     if (SfxBindings* pBindings = GetBindingsPtr())
     288           0 :         pBindings->Invalidate( SID_SAVEDOC );
     289           0 : }
     290             : 
     291           0 : void Shell::onDocumentSaveAs( const ScriptDocument& /*_rDocument*/ )
     292             : {
     293           0 :     StoreAllWindowData();
     294           0 : }
     295             : 
     296           0 : void Shell::onDocumentSaveAsDone( const ScriptDocument& /*_rDocument*/ )
     297             : {
     298             :     // not interested in
     299           0 : }
     300             : 
     301           0 : void Shell::onDocumentClosed( const ScriptDocument& _rDocument )
     302             : {
     303           0 :     if ( !_rDocument.isValid() )
     304           0 :         return;
     305             : 
     306           0 :     bool bSetCurWindow = false;
     307           0 :     bool bSetCurLib = ( _rDocument == m_aCurDocument );
     308           0 :     std::vector<VclPtr<BaseWindow> > aDeleteVec;
     309             : 
     310             :     // remove all windows which belong to this document
     311           0 :     for (WindowTableIt it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
     312             :     {
     313           0 :         BaseWindow* pWin = it->second;
     314           0 :         if ( pWin->IsDocument( _rDocument ) )
     315             :         {
     316           0 :             if ( pWin->GetStatus() & (BASWIN_RUNNINGBASIC|BASWIN_INRESCHEDULE) )
     317             :             {
     318           0 :                 pWin->AddStatus( BASWIN_TOBEKILLED );
     319           0 :                 pWin->Hide();
     320           0 :                 StarBASIC::Stop();
     321             :                 // there's no notify
     322           0 :                 pWin->BasicStopped();
     323             :             }
     324             :             else
     325           0 :                 aDeleteVec.push_back( pWin );
     326             :         }
     327             :     }
     328             :     // delete windows outside main loop so we don't invalidate the original iterator
     329           0 :     for (auto it = aDeleteVec.begin(); it != aDeleteVec.end(); ++it)
     330             :     {
     331           0 :         BaseWindow* pWin = *it;
     332           0 :         pWin->StoreData();
     333           0 :         if ( pWin == pCurWin )
     334           0 :             bSetCurWindow = true;
     335           0 :         RemoveWindow( pWin, true, false );
     336             :     }
     337             : 
     338             :     // remove lib info
     339           0 :     if (ExtraData* pData = GetExtraData())
     340           0 :         pData->GetLibInfos().RemoveInfoFor( _rDocument );
     341             : 
     342           0 :     if ( bSetCurLib )
     343           0 :         SetCurLib( ScriptDocument::getApplicationScriptDocument(), "Standard", true, false );
     344           0 :     else if ( bSetCurWindow )
     345           0 :         SetCurWindow( FindApplicationWindow(), true );
     346             : }
     347             : 
     348           0 : void Shell::onDocumentTitleChanged( const ScriptDocument& /*_rDocument*/ )
     349             : {
     350           0 :     if (SfxBindings* pBindings = GetBindingsPtr())
     351           0 :         pBindings->Invalidate( SID_BASICIDE_LIBSELECTOR, true, false );
     352           0 :     SetMDITitle();
     353           0 : }
     354             : 
     355           0 : void Shell::onDocumentModeChanged( const ScriptDocument& _rDocument )
     356             : {
     357           0 :     for (WindowTableIt it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
     358             :     {
     359           0 :         BaseWindow* pWin = it->second;
     360           0 :         if ( pWin->IsDocument( _rDocument ) && _rDocument.isDocument() )
     361           0 :             pWin->SetReadOnly( _rDocument.isReadOnly() );
     362             :     }
     363           0 : }
     364             : 
     365           0 : void Shell::StoreAllWindowData( bool bPersistent )
     366             : {
     367           0 :     for (WindowTableIt it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
     368             :     {
     369           0 :         BaseWindow* pWin = it->second;
     370             :         DBG_ASSERT( pWin, "PrepareClose: NULL-Pointer in Table?" );
     371           0 :         if ( !pWin->IsSuspended() )
     372           0 :             pWin->StoreData();
     373             :     }
     374             : 
     375           0 :     if ( bPersistent  )
     376             :     {
     377           0 :         SfxGetpApp()->SaveBasicAndDialogContainer();
     378           0 :         SetAppBasicModified(false);
     379             : 
     380           0 :         if (SfxBindings* pBindings = GetBindingsPtr())
     381             :         {
     382           0 :             pBindings->Invalidate( SID_SAVEDOC );
     383           0 :             pBindings->Update( SID_SAVEDOC );
     384             :         }
     385             :     }
     386           0 : }
     387             : 
     388             : 
     389           0 : bool Shell::PrepareClose( bool bUI )
     390             : {
     391             :     // reset here because it's modified after printing etc. (DocInfo)
     392           0 :     GetViewFrame()->GetObjectShell()->SetModified(false);
     393             : 
     394           0 :     if ( StarBASIC::IsRunning() )
     395             :     {
     396           0 :         if( bUI )
     397             :         {
     398           0 :             vcl::Window *pParent = &GetViewFrame()->GetWindow();
     399           0 :             ScopedVclPtr<InfoBox>::Create( pParent, IDE_RESSTR(RID_STR_CANNOTCLOSE))->Execute();
     400             :         }
     401           0 :         return false;
     402             :     }
     403             :     else
     404             :     {
     405           0 :         bool bCanClose = true;
     406           0 :         for (WindowTableIt it = aWindowTable.begin(); bCanClose && (it != aWindowTable.end()); ++it)
     407             :         {
     408           0 :             BaseWindow* pWin = it->second;
     409           0 :             if ( !pWin->CanClose() )
     410             :             {
     411           0 :                 if ( !m_aCurLibName.isEmpty() && ( pWin->IsDocument( m_aCurDocument ) || pWin->GetLibName() != m_aCurLibName ) )
     412           0 :                     SetCurLib( ScriptDocument::getApplicationScriptDocument(), OUString(), false );
     413           0 :                 SetCurWindow( pWin, true );
     414           0 :                 bCanClose = false;
     415             :             }
     416             :         }
     417             : 
     418           0 :         if ( bCanClose )
     419           0 :             StoreAllWindowData( false );    // don't write on the disk, that will be done later automatically
     420             : 
     421           0 :         return bCanClose;
     422             :     }
     423             : }
     424             : 
     425           0 : void Shell::InitScrollBars()
     426             : {
     427           0 :     aVScrollBar->SetLineSize( 300 );
     428           0 :     aVScrollBar->SetPageSize( 2000 );
     429           0 :     aHScrollBar->SetLineSize( 300 );
     430           0 :     aHScrollBar->SetPageSize( 2000 );
     431           0 :     aHScrollBar->Enable();
     432           0 :     aVScrollBar->Enable();
     433           0 :     aVScrollBar->Show();
     434           0 :     aHScrollBar->Show();
     435           0 :     aScrollBarBox->Show();
     436           0 : }
     437             : 
     438             : 
     439             : 
     440           0 : void Shell::InitTabBar()
     441             : {
     442           0 :     pTabBar->Enable();
     443           0 :     pTabBar->Show();
     444           0 :     pTabBar->SetSelectHdl( LINK( this, Shell, TabBarHdl ) );
     445           0 : }
     446             : 
     447             : 
     448             : 
     449           0 : void Shell::OuterResizePixel( const Point &rPos, const Size &rSize )
     450             : {
     451           0 :     AdjustPosSizePixel( rPos, rSize );
     452           0 : }
     453             : 
     454             : 
     455           0 : IMPL_LINK( Shell, TabBarSplitHdl, TabBar *, pTBar )
     456             : {
     457             :     (void)pTBar;
     458           0 :     bTabBarSplitted = true;
     459           0 :     ArrangeTabBar();
     460             : 
     461           0 :     return 0;
     462             : }
     463             : 
     464           0 : IMPL_LINK( Shell, TabBarHdl, TabBar *, pCurTabBar )
     465             : {
     466           0 :     sal_uInt16 nCurId = pCurTabBar->GetCurPageId();
     467           0 :     BaseWindow* pWin = aWindowTable[ nCurId ];
     468             :     DBG_ASSERT( pWin, "Eintrag in TabBar passt zu keinem Fenster!" );
     469           0 :     SetCurWindow( pWin );
     470             : 
     471           0 :     return 0;
     472             : }
     473             : 
     474             : 
     475             : 
     476           0 : bool Shell::NextPage( bool bPrev )
     477             : {
     478           0 :     bool bRet = false;
     479           0 :     sal_uInt16 nPos = pTabBar->GetPagePos( pTabBar->GetCurPageId() );
     480             : 
     481           0 :     if ( bPrev )
     482           0 :         --nPos;
     483             :     else
     484           0 :         ++nPos;
     485             : 
     486           0 :     if ( nPos < pTabBar->GetPageCount() )
     487             :     {
     488           0 :         BaseWindow* pWin = aWindowTable[ pTabBar->GetPageId( nPos ) ];
     489           0 :         SetCurWindow( pWin, true );
     490           0 :         bRet = true;
     491             :     }
     492             : 
     493           0 :     return bRet;
     494             : }
     495             : 
     496             : 
     497             : 
     498           0 : void Shell::ArrangeTabBar()
     499             : {
     500           0 :     long nBoxPos = aScrollBarBox->GetPosPixel().X() - 1;
     501           0 :     long nPos = pTabBar->GetSplitSize();
     502           0 :     if ( nPos <= nBoxPos )
     503             :     {
     504           0 :         Point aPnt( pTabBar->GetPosPixel() );
     505           0 :         long nH = aHScrollBar->GetSizePixel().Height();
     506           0 :         pTabBar->SetPosSizePixel( aPnt, Size( nPos, nH ) );
     507           0 :         long nScrlStart = aPnt.X() + nPos;
     508           0 :         aHScrollBar->SetPosSizePixel( Point( nScrlStart, aPnt.Y() ), Size( nBoxPos - nScrlStart + 2, nH ) );
     509           0 :         aHScrollBar->Update();
     510             :     }
     511           0 : }
     512             : 
     513             : 
     514             : 
     515           0 : ::svl::IUndoManager* Shell::GetUndoManager()
     516             : {
     517           0 :     ::svl::IUndoManager* pMgr = NULL;
     518           0 :     if( pCurWin )
     519           0 :         pMgr = pCurWin->GetUndoManager();
     520             : 
     521           0 :     return pMgr;
     522             : }
     523             : 
     524             : 
     525             : 
     526           0 : void Shell::SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId&,
     527             :                                         const SfxHint& rHint, const TypeId& )
     528             : {
     529           0 :     if (GetShell())
     530             :     {
     531           0 :         if (SfxSimpleHint const* pSimpleHint = dynamic_cast<SfxSimpleHint const*>(&rHint))
     532             :         {
     533           0 :             switch (pSimpleHint->GetId())
     534             :             {
     535             :                 case SFX_HINT_DYING:
     536             :                 {
     537           0 :                     EndListening( rBC, true /* log off all */ );
     538           0 :                     aObjectCatalog->UpdateEntries();
     539             :                 }
     540           0 :                 break;
     541             :             }
     542             : 
     543           0 :             if (SbxHint const* pSbxHint = dynamic_cast<SbxHint const*>(&rHint))
     544             :             {
     545           0 :                 sal_uLong nHintId = pSbxHint->GetId();
     546           0 :                 if (    ( nHintId == SBX_HINT_BASICSTART ) ||
     547             :                         ( nHintId == SBX_HINT_BASICSTOP ) )
     548             :                 {
     549           0 :                     if (SfxBindings* pBindings = GetBindingsPtr())
     550             :                     {
     551           0 :                         pBindings->Invalidate( SID_BASICRUN );
     552           0 :                         pBindings->Update( SID_BASICRUN );
     553           0 :                         pBindings->Invalidate( SID_BASICCOMPILE );
     554           0 :                         pBindings->Update( SID_BASICCOMPILE );
     555           0 :                         pBindings->Invalidate( SID_BASICSTEPOVER );
     556           0 :                         pBindings->Update( SID_BASICSTEPOVER );
     557           0 :                         pBindings->Invalidate( SID_BASICSTEPINTO );
     558           0 :                         pBindings->Update( SID_BASICSTEPINTO );
     559           0 :                         pBindings->Invalidate( SID_BASICSTEPOUT );
     560           0 :                         pBindings->Update( SID_BASICSTEPOUT );
     561           0 :                         pBindings->Invalidate( SID_BASICSTOP );
     562           0 :                         pBindings->Update( SID_BASICSTOP );
     563           0 :                         pBindings->Invalidate( SID_BASICIDE_TOGGLEBRKPNT );
     564           0 :                         pBindings->Update( SID_BASICIDE_TOGGLEBRKPNT );
     565           0 :                         pBindings->Invalidate( SID_BASICIDE_MANAGEBRKPNTS );
     566           0 :                         pBindings->Update( SID_BASICIDE_MANAGEBRKPNTS );
     567           0 :                         pBindings->Invalidate( SID_BASICIDE_MODULEDLG );
     568           0 :                         pBindings->Update( SID_BASICIDE_MODULEDLG );
     569           0 :                         pBindings->Invalidate( SID_BASICLOAD );
     570           0 :                         pBindings->Update( SID_BASICLOAD );
     571             :                     }
     572             : 
     573           0 :                     if ( nHintId == SBX_HINT_BASICSTOP )
     574             :                     {
     575             :                         // not only at error/break or explicit stoppage,
     576             :                         // if the update is turned off due to a programming bug
     577           0 :                         BasicStopped();
     578           0 :                         if (pLayout)
     579           0 :                             pLayout->UpdateDebug(true); // clear...
     580           0 :                         if( m_pCurLocalizationMgr )
     581           0 :                             m_pCurLocalizationMgr->handleBasicStopped();
     582             :                     }
     583           0 :                     else if( m_pCurLocalizationMgr )
     584             :                     {
     585           0 :                         m_pCurLocalizationMgr->handleBasicStarted();
     586             :                     }
     587             : 
     588           0 :                     for (WindowTableIt it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
     589             :                     {
     590           0 :                         BaseWindow* pWin = it->second;
     591           0 :                         if ( nHintId == SBX_HINT_BASICSTART )
     592           0 :                             pWin->BasicStarted();
     593             :                         else
     594           0 :                             pWin->BasicStopped();
     595             :                     }
     596             :                 }
     597             :             }
     598             :         }
     599             :     }
     600           0 : }
     601             : 
     602             : 
     603             : 
     604           0 : void Shell::CheckWindows()
     605             : {
     606           0 :     bool bSetCurWindow = false;
     607           0 :     std::vector<VclPtr<BaseWindow> > aDeleteVec;
     608           0 :     for (WindowTableIt it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
     609             :     {
     610           0 :         BaseWindow* pWin = it->second;
     611           0 :         if ( pWin->GetStatus() & BASWIN_TOBEKILLED )
     612           0 :             aDeleteVec.push_back( pWin );
     613             :     }
     614           0 :     for ( auto it = aDeleteVec.begin(); it != aDeleteVec.end(); ++it )
     615             :     {
     616           0 :         BaseWindow* pWin = *it;
     617           0 :         pWin->StoreData();
     618           0 :         if ( pWin == pCurWin )
     619           0 :             bSetCurWindow = true;
     620           0 :         RemoveWindow( pWin, true, false );
     621             :     }
     622           0 :     if ( bSetCurWindow )
     623           0 :         SetCurWindow( FindApplicationWindow(), true );
     624           0 : }
     625             : 
     626             : 
     627             : 
     628           0 : void Shell::RemoveWindows( const ScriptDocument& rDocument, const OUString& rLibName, bool bDestroy )
     629             : {
     630           0 :     bool bChangeCurWindow = pCurWin;
     631           0 :     std::vector<VclPtr<BaseWindow> > aDeleteVec;
     632           0 :     for (WindowTableIt it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
     633             :     {
     634           0 :         BaseWindow* pWin = it->second;
     635           0 :         if ( pWin->IsDocument( rDocument ) && pWin->GetLibName() == rLibName )
     636           0 :             aDeleteVec.push_back( pWin );
     637             :     }
     638           0 :     for ( auto it = aDeleteVec.begin(); it != aDeleteVec.end(); ++it )
     639             :     {
     640           0 :         BaseWindow* pWin = *it;
     641           0 :         if ( pWin == pCurWin )
     642           0 :             bChangeCurWindow = true;
     643           0 :         pWin->StoreData();
     644           0 :         RemoveWindow( pWin, bDestroy, false );
     645             :     }
     646           0 :     if ( bChangeCurWindow )
     647           0 :         SetCurWindow( FindApplicationWindow(), true );
     648           0 : }
     649             : 
     650             : 
     651             : 
     652           0 : void Shell::UpdateWindows()
     653             : {
     654             :     // remove all windows that may not be displayed
     655           0 :     bool bChangeCurWindow = pCurWin == nullptr;
     656           0 :     if ( !m_aCurLibName.isEmpty() )
     657             :     {
     658           0 :         std::vector<VclPtr<BaseWindow> > aDeleteVec;
     659           0 :         for (WindowTableIt it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
     660             :         {
     661           0 :             BaseWindow* pWin = it->second;
     662           0 :             if ( !pWin->IsDocument( m_aCurDocument ) || pWin->GetLibName() != m_aCurLibName )
     663             :             {
     664           0 :                 if ( pWin == pCurWin )
     665           0 :                     bChangeCurWindow = true;
     666           0 :                 pWin->StoreData();
     667             :                 // The request of RUNNING prevents the crash when in reschedule.
     668             :                 // Window is frozen at first, later the windows should be changed
     669             :                 // anyway to be marked as hidden instead of being deleted.
     670           0 :                 if ( !(pWin->GetStatus() & ( BASWIN_TOBEKILLED | BASWIN_RUNNINGBASIC | BASWIN_SUSPENDED ) ) )
     671           0 :                     aDeleteVec.push_back( pWin );
     672             :             }
     673             :         }
     674           0 :         for ( auto it = aDeleteVec.begin(); it != aDeleteVec.end(); ++it )
     675             :         {
     676           0 :             RemoveWindow( *it, false, false );
     677           0 :         }
     678             :     }
     679             : 
     680           0 :     if ( bCreatingWindow )
     681           0 :         return;
     682             : 
     683           0 :     BaseWindow* pNextActiveWindow = 0;
     684             : 
     685             :     // show all windows that are to be shown
     686           0 :     ScriptDocuments aDocuments( ScriptDocument::getAllScriptDocuments( ScriptDocument::AllWithApplication ) );
     687           0 :     for (   ScriptDocuments::const_iterator doc = aDocuments.begin();
     688           0 :             doc != aDocuments.end();
     689             :             ++doc
     690             :         )
     691             :     {
     692           0 :         StartListening( *doc->getBasicManager(), true /* log on only once */ );
     693             : 
     694             :         // libraries
     695           0 :         Sequence< OUString > aLibNames( doc->getLibraryNames() );
     696           0 :         sal_Int32 nLibCount = aLibNames.getLength();
     697           0 :         const OUString* pLibNames = aLibNames.getConstArray();
     698             : 
     699           0 :         for ( sal_Int32 i = 0 ; i < nLibCount ; i++ )
     700             :         {
     701           0 :             OUString aLibName = pLibNames[ i ];
     702             : 
     703           0 :             if ( m_aCurLibName.isEmpty() || ( *doc == m_aCurDocument && aLibName == m_aCurLibName ) )
     704             :             {
     705             :                 // check, if library is password protected and not verified
     706           0 :                 bool bProtected = false;
     707           0 :                 Reference< script::XLibraryContainer > xModLibContainer( doc->getLibraryContainer( E_SCRIPTS ) );
     708           0 :                 if ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) )
     709             :                 {
     710           0 :                     Reference< script::XLibraryContainerPassword > xPasswd( xModLibContainer, UNO_QUERY );
     711           0 :                     if ( xPasswd.is() && xPasswd->isLibraryPasswordProtected( aLibName ) && !xPasswd->isLibraryPasswordVerified( aLibName ) )
     712             :                     {
     713           0 :                         bProtected = true;
     714           0 :                     }
     715             :                 }
     716             : 
     717           0 :                 if ( !bProtected )
     718             :                 {
     719           0 :                     LibInfos::Item const* pLibInfoItem = 0;
     720           0 :                     if (ExtraData* pData = GetExtraData())
     721           0 :                         pLibInfoItem = pData->GetLibInfos().GetInfo(*doc, aLibName);
     722             : 
     723             :                     // modules
     724           0 :                     if ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) )
     725             :                     {
     726           0 :                         StarBASIC* pLib = doc->getBasicManager()->GetLib( aLibName );
     727           0 :                         if ( pLib )
     728           0 :                             ImplStartListening( pLib );
     729             : 
     730             :                         try
     731             :                         {
     732           0 :                             Sequence< OUString > aModNames( doc->getObjectNames( E_SCRIPTS, aLibName ) );
     733           0 :                             sal_Int32 nModCount = aModNames.getLength();
     734           0 :                             const OUString* pModNames = aModNames.getConstArray();
     735             : 
     736           0 :                             for ( sal_Int32 j = 0 ; j < nModCount ; j++ )
     737             :                             {
     738           0 :                                 OUString aModName = pModNames[ j ];
     739           0 :                                 ModulWindow* pWin = FindBasWin( *doc, aLibName, aModName, false );
     740           0 :                                 if ( !pWin )
     741           0 :                                     pWin = CreateBasWin( *doc, aLibName, aModName );
     742           0 :                                 if ( !pNextActiveWindow && pLibInfoItem && pLibInfoItem->GetCurrentName() == aModName &&
     743           0 :                                      pLibInfoItem->GetCurrentType() == TYPE_MODULE )
     744             :                                 {
     745           0 :                                     pNextActiveWindow = static_cast<BaseWindow*>(pWin);
     746             :                                 }
     747           0 :                             }
     748             :                         }
     749           0 :                         catch (const container::NoSuchElementException& )
     750             :                         {
     751             :                             DBG_UNHANDLED_EXCEPTION();
     752             :                         }
     753             :                     }
     754             : 
     755             :                     // dialogs
     756           0 :                     Reference< script::XLibraryContainer > xDlgLibContainer( doc->getLibraryContainer( E_DIALOGS ) );
     757           0 :                     if ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aLibName ) )
     758             :                     {
     759             :                         try
     760             :                         {
     761           0 :                             Sequence< OUString > aDlgNames = doc->getObjectNames( E_DIALOGS, aLibName );
     762           0 :                             sal_Int32 nDlgCount = aDlgNames.getLength();
     763           0 :                             const OUString* pDlgNames = aDlgNames.getConstArray();
     764             : 
     765           0 :                             for ( sal_Int32 j = 0 ; j < nDlgCount ; j++ )
     766             :                             {
     767           0 :                                 OUString aDlgName = pDlgNames[ j ];
     768             :                                 // this find only looks for non-suspended windows;
     769             :                                 // suspended windows are handled in CreateDlgWin
     770           0 :                                 VclPtr<DialogWindow> pWin = FindDlgWin( *doc, aLibName, aDlgName, false );
     771           0 :                                 if ( !pWin )
     772           0 :                                     pWin = CreateDlgWin( *doc, aLibName, aDlgName );
     773           0 :                                 if ( !pNextActiveWindow && pLibInfoItem && pLibInfoItem->GetCurrentName() == aDlgName &&
     774           0 :                                      pLibInfoItem->GetCurrentType() == TYPE_DIALOG )
     775             :                                 {
     776           0 :                                     pNextActiveWindow = static_cast<BaseWindow*>(pWin);
     777             :                                 }
     778           0 :                             }
     779             :                         }
     780           0 :                         catch (const container::NoSuchElementException& )
     781             :                         {
     782             :                             DBG_UNHANDLED_EXCEPTION();
     783             :                         }
     784           0 :                     }
     785           0 :                 }
     786             :             }
     787           0 :         }
     788           0 :     }
     789             : 
     790           0 :     if ( bChangeCurWindow )
     791             :     {
     792           0 :         if ( !pNextActiveWindow )
     793             :         {
     794           0 :             pNextActiveWindow = FindApplicationWindow();
     795             :         }
     796           0 :         SetCurWindow( pNextActiveWindow, true );
     797           0 :     }
     798             : }
     799             : 
     800           0 : void Shell::RemoveWindow( BaseWindow* pWindow_, bool bDestroy, bool bAllowChangeCurWindow )
     801             : {
     802             :     DBG_ASSERT( pWindow_, "Kann keinen NULL-Pointer loeschen!" );
     803           0 :     sal_uLong nKey = GetWindowId( pWindow_ );
     804           0 :     pTabBar->RemovePage( (sal_uInt16)nKey );
     805           0 :     aWindowTable.erase( nKey );
     806           0 :     if ( pWindow_ == pCurWin )
     807             :     {
     808           0 :         if ( bAllowChangeCurWindow )
     809             :         {
     810           0 :             SetCurWindow( FindApplicationWindow(), true );
     811             :         }
     812             :         else
     813             :         {
     814           0 :             SetCurWindow( NULL, false );
     815             :         }
     816             :     }
     817           0 :     if ( bDestroy )
     818             :     {
     819           0 :         if ( !( pWindow_->GetStatus() & BASWIN_INRESCHEDULE ) )
     820             :         {
     821           0 :             pWindow_->disposeOnce();
     822             :         }
     823             :         else
     824             :         {
     825           0 :             pWindow_->AddStatus( BASWIN_TOBEKILLED );
     826           0 :             pWindow_->Hide();
     827             :             // In normal mode stop basic in windows to be deleted
     828             :             // In VBA stop basic only if the running script is trying to delete
     829             :             // its parent module
     830           0 :             bool bStop = true;
     831           0 :             if ( pWindow_->GetDocument().isInVBAMode() )
     832             :             {
     833           0 :                 SbModule* pMod = StarBASIC::GetActiveModule();
     834           0 :                 if ( !pMod || ( pMod && ( !pMod->GetName().equals(pWindow_->GetName()) ) ) )
     835             :                 {
     836           0 :                     bStop = false;
     837             :                 }
     838             :             }
     839           0 :             if ( bStop )
     840             :             {
     841           0 :                 StarBASIC::Stop();
     842             :                 // there will be no notify...
     843           0 :                 pWindow_->BasicStopped();
     844             :             }
     845           0 :             aWindowTable[ nKey ] = pWindow_;   // jump in again
     846             :         }
     847             :     }
     848             :     else
     849             :     {
     850           0 :         pWindow_->AddStatus( BASWIN_SUSPENDED );
     851           0 :         pWindow_->Deactivating();
     852           0 :         aWindowTable[ nKey ] = pWindow_;   // jump in again
     853             :     }
     854             : 
     855           0 : }
     856             : 
     857             : 
     858             : 
     859           0 : sal_uInt16 Shell::InsertWindowInTable( BaseWindow* pNewWin )
     860             : {
     861           0 :     nCurKey++;
     862           0 :     aWindowTable[ nCurKey ] = pNewWin;
     863           0 :     return nCurKey;
     864             : }
     865             : 
     866             : 
     867             : 
     868           0 : void Shell::InvalidateBasicIDESlots()
     869             : {
     870             :     // only those that have an optic effect...
     871             : 
     872           0 :     if (GetShell())
     873             :     {
     874           0 :         if (SfxBindings* pBindings = GetBindingsPtr())
     875             :         {
     876           0 :             pBindings->Invalidate( SID_COPY );
     877           0 :             pBindings->Invalidate( SID_CUT );
     878           0 :             pBindings->Invalidate( SID_PASTE );
     879           0 :             pBindings->Invalidate( SID_UNDO );
     880           0 :             pBindings->Invalidate( SID_REDO );
     881           0 :             pBindings->Invalidate( SID_SAVEDOC );
     882           0 :             pBindings->Invalidate( SID_SIGNATURE );
     883           0 :             pBindings->Invalidate( SID_BASICIDE_CHOOSEMACRO );
     884           0 :             pBindings->Invalidate( SID_BASICIDE_MODULEDLG );
     885           0 :             pBindings->Invalidate( SID_BASICIDE_OBJCAT );
     886           0 :             pBindings->Invalidate( SID_BASICSTOP );
     887           0 :             pBindings->Invalidate( SID_BASICRUN );
     888           0 :             pBindings->Invalidate( SID_BASICCOMPILE );
     889           0 :             pBindings->Invalidate( SID_BASICLOAD );
     890           0 :             pBindings->Invalidate( SID_BASICSAVEAS );
     891           0 :             pBindings->Invalidate( SID_BASICIDE_MATCHGROUP );
     892           0 :             pBindings->Invalidate( SID_BASICSTEPINTO );
     893           0 :             pBindings->Invalidate( SID_BASICSTEPOVER );
     894           0 :             pBindings->Invalidate( SID_BASICSTEPOUT );
     895           0 :             pBindings->Invalidate( SID_BASICIDE_TOGGLEBRKPNT );
     896           0 :             pBindings->Invalidate( SID_BASICIDE_MANAGEBRKPNTS );
     897           0 :             pBindings->Invalidate( SID_BASICIDE_ADDWATCH );
     898           0 :             pBindings->Invalidate( SID_BASICIDE_REMOVEWATCH );
     899           0 :             pBindings->Invalidate( SID_CHOOSE_CONTROLS );
     900           0 :             pBindings->Invalidate( SID_PRINTDOC );
     901           0 :             pBindings->Invalidate( SID_PRINTDOCDIRECT );
     902           0 :             pBindings->Invalidate( SID_SETUPPRINTER );
     903           0 :             pBindings->Invalidate( SID_DIALOG_TESTMODE );
     904             : 
     905           0 :             pBindings->Invalidate( SID_DOC_MODIFIED );
     906           0 :             pBindings->Invalidate( SID_BASICIDE_STAT_TITLE );
     907           0 :             pBindings->Invalidate( SID_BASICIDE_STAT_POS );
     908           0 :             pBindings->Invalidate( SID_ATTR_INSERT );
     909           0 :             pBindings->Invalidate( SID_ATTR_SIZE );
     910             :         }
     911             :     }
     912           0 : }
     913             : 
     914           0 : void Shell::EnableScrollbars( bool bEnable )
     915             : {
     916           0 :     aHScrollBar->Enable(bEnable);
     917           0 :     aVScrollBar->Enable(bEnable);
     918           0 : }
     919             : 
     920           0 : void Shell::SetCurLib( const ScriptDocument& rDocument, const OUString& aLibName, bool bUpdateWindows, bool bCheck )
     921             : {
     922           0 :     if ( !bCheck || ( rDocument != m_aCurDocument || aLibName != m_aCurLibName ) )
     923             :     {
     924           0 :         ContainerListenerImpl* pListener = static_cast< ContainerListenerImpl* >( m_xLibListener.get() );
     925             : 
     926           0 :         m_aCurDocument = rDocument;
     927           0 :         m_aCurLibName = aLibName;
     928             : 
     929           0 :         if ( pListener )
     930             :         {
     931           0 :             pListener->removeContainerListener( m_aCurDocument, m_aCurLibName );
     932           0 :             pListener->addContainerListener( m_aCurDocument, aLibName );
     933             :         }
     934             : 
     935           0 :         if ( bUpdateWindows )
     936           0 :             UpdateWindows();
     937             : 
     938           0 :         SetMDITitle();
     939             : 
     940           0 :         SetCurLibForLocalization( rDocument, aLibName );
     941             : 
     942           0 :         if (SfxBindings* pBindings = GetBindingsPtr())
     943             :         {
     944           0 :             pBindings->Invalidate( SID_BASICIDE_LIBSELECTOR );
     945           0 :             pBindings->Invalidate( SID_BASICIDE_CURRENT_LANG );
     946           0 :             pBindings->Invalidate( SID_BASICIDE_MANAGE_LANG );
     947             :         }
     948             :     }
     949           0 : }
     950             : 
     951           0 : void Shell::SetCurLibForLocalization( const ScriptDocument& rDocument, const OUString& aLibName )
     952             : {
     953             :     // Create LocalizationMgr
     954           0 :     Reference< resource::XStringResourceManager > xStringResourceManager;
     955             :     try
     956             :     {
     957           0 :         if( !aLibName.isEmpty() )
     958             :         {
     959           0 :             Reference< container::XNameContainer > xDialogLib( rDocument.getLibrary( E_DIALOGS, aLibName, true ) );
     960           0 :             xStringResourceManager = LocalizationMgr::getStringResourceFromDialogLibrary( xDialogLib );
     961             :         }
     962             :     }
     963           0 :     catch (const container::NoSuchElementException& )
     964             :     {}
     965             : 
     966           0 :     m_pCurLocalizationMgr = boost::shared_ptr<LocalizationMgr>(new LocalizationMgr(this, rDocument, aLibName, xStringResourceManager));
     967           0 :     m_pCurLocalizationMgr->handleTranslationbar();
     968           0 : }
     969             : 
     970           0 : void Shell::ImplStartListening( StarBASIC* pBasic )
     971             : {
     972           0 :     StartListening( pBasic->GetBroadcaster(), true /* log on only once */ );
     973           0 : }
     974             : 
     975           0 : } // namespace basctl
     976             : 
     977             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11