LCOV - code coverage report
Current view: top level - basctl/source/basicide - basobj3.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 0 235 0.0 %
Date: 2015-06-13 12:38:46 Functions: 0 16 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 <vcl/layout.hxx>
      21             : #include <basic/basmgr.hxx>
      22             : #include <basic/sbmeth.hxx>
      23             : #include <unotools/moduleoptions.hxx>
      24             : 
      25             : #include <iderdll.hxx>
      26             : #include <iderdll2.hxx>
      27             : #include <basdoc.hxx>
      28             : #include <basidesh.hrc>
      29             : 
      30             : #include <baside2.hxx>
      31             : #include <baside3.hxx>
      32             : #include <localizationmgr.hxx>
      33             : #include "dlged.hxx"
      34             : #include <com/sun/star/script/XLibraryContainerPassword.hpp>
      35             : #include <sfx2/dispatch.hxx>
      36             : #include <sfx2/request.hxx>
      37             : 
      38             : namespace basctl
      39             : {
      40             : 
      41             : using namespace comphelper;
      42             : using namespace ::com::sun::star;
      43             : using namespace ::com::sun::star::uno;
      44             : using namespace ::com::sun::star::container;
      45             : 
      46             : extern "C" {
      47           0 :     SAL_DLLPUBLIC_EXPORT long basicide_handle_basic_error( void* pPtr )
      48             :     {
      49           0 :         return HandleBasicError( static_cast<StarBASIC*>(pPtr) );
      50             :     }
      51             : }
      52             : 
      53           0 : SbMethod* CreateMacro( SbModule* pModule, const OUString& rMacroName )
      54             : {
      55           0 :     SfxDispatcher* pDispatcher = GetDispatcher();
      56           0 :     if( pDispatcher )
      57             :     {
      58           0 :         pDispatcher->Execute( SID_BASICIDE_STOREALLMODULESOURCES );
      59             :     }
      60             : 
      61           0 :     if ( pModule->GetMethods()->Find( rMacroName, SbxCLASS_METHOD ) )
      62           0 :         return 0;
      63             : 
      64           0 :     OUString aMacroName( rMacroName );
      65           0 :     if ( aMacroName.isEmpty() )
      66             :     {
      67           0 :         if ( !pModule->GetMethods()->Count() )
      68           0 :             aMacroName = "Main" ;
      69             :         else
      70             :         {
      71           0 :             bool bValid = false;
      72           0 :             OUString aStdMacroText( "Macro" );
      73           0 :             sal_Int32 nMacro = 1;
      74           0 :             while ( !bValid )
      75             :             {
      76           0 :                 aMacroName = aStdMacroText;
      77           0 :                 aMacroName += OUString::number( nMacro );
      78             :                 // test whether existing...
      79           0 :                 bValid = pModule->GetMethods()->Find( aMacroName, SbxCLASS_METHOD ) == nullptr;
      80           0 :                 nMacro++;
      81           0 :             }
      82             :         }
      83             :     }
      84             : 
      85           0 :     OUString aOUSource( pModule->GetSource32() );
      86             : 
      87             :     // don't produce too many empty lines...
      88           0 :     sal_Int32 nSourceLen = aOUSource.getLength();
      89           0 :     if ( nSourceLen > 2 )
      90             :     {
      91           0 :         const sal_Unicode* pStr = aOUSource.getStr();
      92           0 :         if ( pStr[ nSourceLen - 1 ]  != LINE_SEP )
      93           0 :             aOUSource += "\n\n" ;
      94           0 :         else if ( pStr[ nSourceLen - 2 ] != LINE_SEP )
      95           0 :             aOUSource += "\n" ;
      96           0 :         else if ( pStr[ nSourceLen - 3 ] == LINE_SEP )
      97           0 :             aOUSource = aOUSource.copy( 0, nSourceLen-1 );
      98             :     }
      99             : 
     100           0 :     OUString aSubStr;
     101           0 :     aSubStr = "Sub " ;
     102           0 :     aSubStr += aMacroName;
     103           0 :     aSubStr += "\n\nEnd Sub" ;
     104             : 
     105           0 :     aOUSource += aSubStr;
     106             : 
     107             :     // update module in library
     108           0 :     ScriptDocument aDocument( ScriptDocument::NoDocument );
     109           0 :     StarBASIC* pBasic = dynamic_cast<StarBASIC*>(pModule->GetParent());
     110             :     DBG_ASSERT(pBasic, "basctl::CreateMacro: No Basic found!");
     111           0 :     if ( pBasic )
     112             :     {
     113           0 :         BasicManager* pBasMgr = FindBasicManager( pBasic );
     114             :         DBG_ASSERT(pBasMgr, "basctl::CreateMacro: No BasicManager found!");
     115           0 :         if ( pBasMgr )
     116             :         {
     117           0 :             aDocument = ScriptDocument::getDocumentForBasicManager( pBasMgr );
     118             :             OSL_ENSURE( aDocument.isValid(), "basctl::CreateMacro: no document for the given BasicManager!" );
     119           0 :             if ( aDocument.isValid() )
     120             :             {
     121           0 :                 OUString aLibName = pBasic->GetName();
     122           0 :                 OUString aModName = pModule->GetName();
     123           0 :                 OSL_VERIFY( aDocument.updateModule( aLibName, aModName, aOUSource ) );
     124             :             }
     125             :         }
     126             :     }
     127             : 
     128           0 :     SbMethod* pMethod = static_cast<SbMethod*>(pModule->GetMethods()->Find( aMacroName, SbxCLASS_METHOD ));
     129             : 
     130           0 :     if( pDispatcher )
     131             :     {
     132           0 :         pDispatcher->Execute( SID_BASICIDE_UPDATEALLMODULESOURCES );
     133             :     }
     134             : 
     135           0 :     if ( aDocument.isAlive() )
     136           0 :         MarkDocumentModified( aDocument );
     137             : 
     138           0 :     return pMethod;
     139             : }
     140             : 
     141           0 : bool RenameDialog (
     142             :     vcl::Window* pErrorParent,
     143             :     ScriptDocument const& rDocument,
     144             :     OUString const& rLibName,
     145             :     OUString const& rOldName,
     146             :     OUString const& rNewName
     147             : )
     148             :     throw (ElementExistException, NoSuchElementException, RuntimeException, std::exception)
     149             : {
     150           0 :     if ( !rDocument.hasDialog( rLibName, rOldName ) )
     151             :     {
     152             :         OSL_FAIL( "basctl::RenameDialog: old module name is invalid!" );
     153           0 :         return false;
     154             :     }
     155             : 
     156           0 :     if ( rDocument.hasDialog( rLibName, rNewName ) )
     157             :     {
     158           0 :         ScopedVclPtrInstance< MessageDialog > aError(pErrorParent, IDE_RESSTR(RID_STR_SBXNAMEALLREADYUSED2));
     159           0 :         aError->Execute();
     160           0 :         return false;
     161             :     }
     162             : 
     163             :     // #i74440
     164           0 :     if ( rNewName.isEmpty() )
     165             :     {
     166           0 :         ScopedVclPtrInstance< MessageDialog > aError(pErrorParent, IDE_RESSTR(RID_STR_BADSBXNAME));
     167           0 :         aError->Execute();
     168           0 :         return false;
     169             :     }
     170             : 
     171           0 :     Shell* pShell = GetShell();
     172           0 :     DialogWindow* pWin = pShell ? pShell->FindDlgWin(rDocument, rLibName, rOldName) : 0;
     173           0 :     Reference< XNameContainer > xExistingDialog;
     174           0 :     if ( pWin )
     175           0 :         xExistingDialog = pWin->GetEditor().GetDialog();
     176             : 
     177           0 :     if ( xExistingDialog.is() )
     178           0 :         LocalizationMgr::renameStringResourceIDs( rDocument, rLibName, rNewName, xExistingDialog );
     179             : 
     180           0 :     if ( !rDocument.renameDialog( rLibName, rOldName, rNewName, xExistingDialog ) )
     181           0 :         return false;
     182             : 
     183           0 :     if (pWin && pShell)
     184             :     {
     185             :         // set new name in window
     186           0 :         pWin->SetName( rNewName );
     187             : 
     188             :         // update property browser
     189           0 :         pWin->UpdateBrowser();
     190             : 
     191             :         // update tabwriter
     192           0 :         sal_uInt16 nId = pShell->GetWindowId( pWin );
     193             :         DBG_ASSERT( nId, "No entry in Tabbar!" );
     194           0 :         if ( nId )
     195             :         {
     196           0 :             TabBar& rTabBar = pShell->GetTabBar();
     197           0 :             rTabBar.SetPageText( nId, rNewName );
     198           0 :             rTabBar.Sort();
     199           0 :             rTabBar.MakeVisible( rTabBar.GetCurPageId() );
     200             :         }
     201             :     }
     202           0 :     return true;
     203             : }
     204             : 
     205           0 : bool RemoveDialog( const ScriptDocument& rDocument, const OUString& rLibName, const OUString& rDlgName )
     206             : {
     207           0 :     if (Shell* pShell = GetShell())
     208             :     {
     209           0 :         if (DialogWindow* pDlgWin = pShell->FindDlgWin(rDocument, rLibName, rDlgName))
     210             :         {
     211           0 :             Reference< container::XNameContainer > xDialogModel = pDlgWin->GetDialog();
     212           0 :             LocalizationMgr::removeResourceForDialog( rDocument, rLibName, rDlgName, xDialogModel );
     213             :         }
     214             :     }
     215             : 
     216           0 :     return rDocument.removeDialog( rLibName, rDlgName );
     217             : }
     218             : 
     219           0 : StarBASIC* FindBasic( const SbxVariable* pVar )
     220             : {
     221           0 :     SbxVariable const* pSbx = pVar;
     222           0 :     while (pSbx && !dynamic_cast<StarBASIC const*>(pSbx))
     223           0 :         pSbx = pSbx->GetParent();
     224           0 :     return const_cast<StarBASIC*>(static_cast<const StarBASIC*>(pSbx));
     225             : }
     226             : 
     227           0 : BasicManager* FindBasicManager( StarBASIC* pLib )
     228             : {
     229           0 :     ScriptDocuments aDocuments( ScriptDocument::getAllScriptDocuments( ScriptDocument::AllWithApplication ) );
     230           0 :     for (   ScriptDocuments::const_iterator doc = aDocuments.begin();
     231           0 :             doc != aDocuments.end();
     232             :             ++doc
     233             :         )
     234             :     {
     235           0 :         BasicManager* pBasicMgr = doc->getBasicManager();
     236             :         OSL_ENSURE( pBasicMgr, "basctl::FindBasicManager: no basic manager for the document!" );
     237           0 :         if ( !pBasicMgr )
     238           0 :             continue;
     239             : 
     240           0 :         Sequence< OUString > aLibNames( doc->getLibraryNames() );
     241           0 :         sal_Int32 nLibCount = aLibNames.getLength();
     242           0 :         const OUString* pLibNames = aLibNames.getConstArray();
     243             : 
     244           0 :         for ( sal_Int32 i = 0 ; i < nLibCount ; i++ )
     245             :         {
     246           0 :             StarBASIC* pL = pBasicMgr->GetLib( pLibNames[ i ] );
     247           0 :             if ( pL == pLib )
     248           0 :                 return pBasicMgr;
     249             :         }
     250           0 :     }
     251           0 :     return NULL;
     252             : }
     253             : 
     254           0 : void MarkDocumentModified( const ScriptDocument& rDocument )
     255             : {
     256             :     // does not have to come from a document...
     257           0 :     if ( rDocument.isApplication() )
     258             :     {
     259           0 :         if (Shell* pShell = GetShell())
     260             :         {
     261           0 :             pShell->SetAppBasicModified();
     262           0 :             pShell->UpdateObjectCatalog();
     263             :         }
     264             :     }
     265             :     else
     266             :     {
     267           0 :         rDocument.setDocumentModified();
     268             :     }
     269             : 
     270           0 :     if (SfxBindings* pBindings = GetBindingsPtr())
     271             :     {
     272           0 :         pBindings->Invalidate( SID_SIGNATURE );
     273           0 :         pBindings->Invalidate( SID_SAVEDOC );
     274           0 :         pBindings->Update( SID_SAVEDOC );
     275             :     }
     276           0 : }
     277             : 
     278           0 : void RunMethod( SbMethod* pMethod )
     279             : {
     280           0 :     SbxValues aRes;
     281           0 :     aRes.eType = SbxVOID;
     282           0 :     pMethod->Get( aRes );
     283           0 : }
     284             : 
     285           0 : void StopBasic()
     286             : {
     287           0 :     StarBASIC::Stop();
     288           0 :     if (Shell* pShell = GetShell())
     289             :     {
     290           0 :         Shell::WindowTable& rWindows = pShell->GetWindowTable();
     291           0 :         for (Shell::WindowTableIt it = rWindows.begin(); it != rWindows.end(); ++it )
     292             :         {
     293           0 :             BaseWindow* pWin = it->second;
     294             :             // call BasicStopped manually because the Stop-Notify
     295             :             // might not get through otherwise
     296           0 :             pWin->BasicStopped();
     297             :         }
     298             :     }
     299           0 :     BasicStopped();
     300           0 : }
     301             : 
     302           0 : void BasicStopped(
     303             :     bool* pbAppWindowDisabled,
     304             :     bool* pbDispatcherLocked,
     305             :     sal_uInt16* pnWaitCount,
     306             :     SfxUInt16Item** ppSWActionCount, SfxUInt16Item** ppSWLockViewCount
     307             : )
     308             : {
     309             :     // maybe there are some locks to be removed after an error
     310             :     // or an explicit cancelling of the basic...
     311           0 :     if ( pbAppWindowDisabled )
     312           0 :         *pbAppWindowDisabled = false;
     313           0 :     if ( pbDispatcherLocked )
     314           0 :         *pbDispatcherLocked = false;
     315           0 :     if ( pnWaitCount )
     316           0 :         *pnWaitCount = 0;
     317           0 :     if ( ppSWActionCount )
     318           0 :         *ppSWActionCount = 0;
     319           0 :     if ( ppSWLockViewCount )
     320           0 :         *ppSWLockViewCount = 0;
     321             : 
     322             :     // AppWait?
     323           0 :     if (Shell* pShell = GetShell())
     324             :     {
     325           0 :         sal_uInt16 nWait = 0;
     326           0 :         while ( pShell->GetViewFrame()->GetWindow().IsWait() )
     327             :         {
     328           0 :             pShell->GetViewFrame()->GetWindow().LeaveWait();
     329           0 :             nWait++;
     330             :         }
     331           0 :         if ( pnWaitCount )
     332           0 :             *pnWaitCount = nWait;
     333             :     }
     334             : 
     335           0 :     vcl::Window* pDefParent = Application::GetDefDialogParent();
     336           0 :     if ( pDefParent && !pDefParent->IsEnabled() )
     337             :     {
     338           0 :         pDefParent->Enable(true);
     339           0 :         if ( pbAppWindowDisabled )
     340           0 :             *pbAppWindowDisabled = true;
     341             :     }
     342             : 
     343           0 : }
     344             : 
     345           0 : void InvalidateDebuggerSlots()
     346             : {
     347           0 :     if (SfxBindings* pBindings = GetBindingsPtr())
     348             :     {
     349           0 :         pBindings->Invalidate( SID_BASICSTOP );
     350           0 :         pBindings->Update( SID_BASICSTOP );
     351           0 :         pBindings->Invalidate( SID_BASICRUN );
     352           0 :         pBindings->Update( SID_BASICRUN );
     353           0 :         pBindings->Invalidate( SID_BASICCOMPILE );
     354           0 :         pBindings->Update( SID_BASICCOMPILE );
     355           0 :         pBindings->Invalidate( SID_BASICSTEPOVER );
     356           0 :         pBindings->Update( SID_BASICSTEPOVER );
     357           0 :         pBindings->Invalidate( SID_BASICSTEPINTO );
     358           0 :         pBindings->Update( SID_BASICSTEPINTO );
     359           0 :         pBindings->Invalidate( SID_BASICSTEPOUT );
     360           0 :         pBindings->Update( SID_BASICSTEPOUT );
     361           0 :         pBindings->Invalidate( SID_BASICIDE_TOGGLEBRKPNT );
     362           0 :         pBindings->Update( SID_BASICIDE_TOGGLEBRKPNT );
     363           0 :         pBindings->Invalidate( SID_BASICIDE_STAT_POS );
     364           0 :         pBindings->Update( SID_BASICIDE_STAT_POS );
     365           0 :         pBindings->Invalidate( SID_BASICIDE_STAT_TITLE );
     366           0 :         pBindings->Update( SID_BASICIDE_STAT_TITLE );
     367             :     }
     368           0 : }
     369             : 
     370           0 : long HandleBasicError( StarBASIC* pBasic )
     371             : {
     372           0 :     EnsureIde();
     373           0 :     BasicStopped();
     374             : 
     375             :     // no error output during macro choosing
     376           0 :     if (GetExtraData()->ChoosingMacro())
     377           0 :         return 1;
     378           0 :     if (GetExtraData()->ShellInCriticalSection())
     379           0 :         return 2;
     380             : 
     381           0 :     long nRet = 0;
     382           0 :     Shell* pShell = 0;
     383           0 :     if ( SvtModuleOptions::IsBasicIDE() )
     384             :     {
     385           0 :         BasicManager* pBasMgr = FindBasicManager( pBasic );
     386           0 :         if ( pBasMgr )
     387             :         {
     388           0 :             bool bProtected = false;
     389           0 :             ScriptDocument aDocument( ScriptDocument::getDocumentForBasicManager( pBasMgr ) );
     390             :             OSL_ENSURE( aDocument.isValid(), "basctl::HandleBasicError: no document for the given BasicManager!" );
     391           0 :             if ( aDocument.isValid() )
     392             :             {
     393           0 :                 OUString aOULibName( pBasic->GetName() );
     394           0 :                 Reference< script::XLibraryContainer > xModLibContainer( aDocument.getLibraryContainer( E_SCRIPTS ) );
     395           0 :                 if ( xModLibContainer.is() && xModLibContainer->hasByName( aOULibName ) )
     396             :                 {
     397           0 :                     Reference< script::XLibraryContainerPassword > xPasswd( xModLibContainer, UNO_QUERY );
     398           0 :                     if ( xPasswd.is() && xPasswd->isLibraryPasswordProtected( aOULibName ) && !xPasswd->isLibraryPasswordVerified( aOULibName ) )
     399             :                     {
     400           0 :                         bProtected = true;
     401           0 :                     }
     402           0 :                 }
     403             :             }
     404             : 
     405           0 :             if ( !bProtected )
     406             :             {
     407           0 :                 pShell = GetShell();
     408           0 :                 if ( !pShell )
     409             :                 {
     410           0 :                     SfxAllItemSet aArgs( SfxGetpApp()->GetPool() );
     411           0 :                     SfxRequest aRequest( SID_BASICIDE_APPEAR, SfxCallMode::SYNCHRON, aArgs );
     412           0 :                     SfxGetpApp()->ExecuteSlot( aRequest );
     413           0 :                     pShell = GetShell();
     414             :                 }
     415           0 :             }
     416             :         }
     417             :     }
     418             : 
     419           0 :     if ( pShell )
     420           0 :         nRet = long(pShell->CallBasicErrorHdl( pBasic ));
     421             :     else
     422           0 :         ErrorHandler::HandleError( StarBASIC::GetErrorCode() );
     423             : 
     424           0 :     return nRet;
     425             : }
     426             : 
     427           0 : SfxBindings* GetBindingsPtr()
     428             : {
     429           0 :     SfxBindings* pBindings = NULL;
     430             : 
     431           0 :     SfxViewFrame* pFrame = NULL;
     432           0 :     if (Shell* pShell = GetShell())
     433             :     {
     434           0 :         pFrame = pShell->GetViewFrame();
     435             :     }
     436             :     else
     437             :     {
     438           0 :         SfxViewFrame* pView = SfxViewFrame::GetFirst();
     439           0 :         while ( pView )
     440             :         {
     441           0 :             if (dynamic_cast<DocShell*>(pView->GetObjectShell()))
     442             :             {
     443           0 :                 pFrame = pView;
     444           0 :                 break;
     445             :             }
     446           0 :             pView = SfxViewFrame::GetNext( *pView );
     447             :         }
     448             :     }
     449           0 :     if ( pFrame != NULL )
     450           0 :         pBindings = &pFrame->GetBindings();
     451             : 
     452           0 :     return pBindings;
     453             : }
     454             : 
     455           0 : SfxDispatcher* GetDispatcher ()
     456             : {
     457           0 :     if (Shell* pShell = GetShell())
     458           0 :         if (SfxViewFrame* pViewFrame = pShell->GetViewFrame())
     459           0 :             if (SfxDispatcher* pDispatcher = pViewFrame->GetDispatcher())
     460           0 :                 return pDispatcher;
     461           0 :     return 0;
     462             : }
     463           0 : } // namespace basctl
     464             : 
     465             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11