LCOV - code coverage report
Current view: top level - basctl/source/basicide - macrodlg.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 0 487 0.0 %
Date: 2015-06-13 12:38:46 Functions: 0 28 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             : 
      21             : #include <macrodlg.hxx>
      22             : #include <macrodlg.hrc>
      23             : #include <basidesh.hxx>
      24             : #include <baside2.hrc>
      25             : 
      26             : #include <iderdll.hxx>
      27             : #include <iderdll2.hxx>
      28             : 
      29             : #include <moduldlg.hxx>
      30             : #include <basic/basmgr.hxx>
      31             : #include <basic/sbmeth.hxx>
      32             : #include <basic/sbmod.hxx>
      33             : 
      34             : #include <sfx2/dispatch.hxx>
      35             : #include <sfx2/minfitem.hxx>
      36             : #include <sfx2/request.hxx>
      37             : 
      38             : 
      39             : #include <map>
      40             : 
      41             : namespace basctl
      42             : {
      43             : 
      44             : using ::std::map;
      45             : using ::std::pair;
      46             : 
      47             : using namespace ::com::sun::star;
      48             : using namespace ::com::sun::star::uno;
      49             : 
      50           0 : MacroChooser::MacroChooser( vcl::Window* pParnt, bool bCreateEntries )
      51             :     : SfxModalDialog(pParnt, "BasicMacroDialog", "modules/BasicIDE/ui/basicmacrodialog.ui")
      52             :     , bNewDelIsDel(true)
      53             :     // the Sfx doesn't aske the BasicManger whether modified or not
      54             :     // => start saving in case of a change without a into the BasicIDE.
      55             :     , bForceStoreBasic(false)
      56           0 :     , nMode(All)
      57             : {
      58           0 :     get(m_pMacroNameEdit, "macronameedit");
      59           0 :     get(m_pMacroFromTxT, "macrofromft");
      60           0 :     get(m_pMacrosSaveInTxt, "macrotoft");
      61           0 :     get(m_pBasicBox, "libraries");
      62           0 :     get(m_pMacrosInTxt, "existingmacrosft");
      63           0 :     m_aMacrosInTxtBaseStr = m_pMacrosInTxt->GetText();
      64           0 :     get(m_pMacroBox, "macros");
      65           0 :     get(m_pRunButton, "run");
      66           0 :     get(m_pCloseButton, "close");
      67           0 :     get(m_pAssignButton, "assign");
      68           0 :     get(m_pEditButton, "edit");
      69           0 :     get(m_pDelButton, "delete");
      70           0 :     get(m_pOrganizeButton, "organize");
      71           0 :     get(m_pNewLibButton, "newlibrary");
      72           0 :     get(m_pNewModButton, "newmodule");
      73             : 
      74           0 :     m_pMacroBox->SetSelectionMode( SINGLE_SELECTION );
      75           0 :     m_pMacroBox->SetHighlightRange(); // select over the whole width
      76             : 
      77           0 :     m_pRunButton->SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
      78           0 :     m_pCloseButton->SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
      79           0 :     m_pAssignButton->SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
      80           0 :     m_pEditButton->SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
      81           0 :     m_pDelButton->SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
      82           0 :     m_pOrganizeButton->SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
      83             : 
      84             :     // Buttons only for MacroChooser::Recording
      85           0 :     m_pNewLibButton->SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
      86           0 :     m_pNewModButton->SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
      87           0 :     m_pNewLibButton->Hide();       // default
      88           0 :     m_pNewModButton->Hide();       // default
      89           0 :     m_pMacrosSaveInTxt->Hide();    // default
      90             : 
      91           0 :     m_pMacrosInTxt->SetStyle( WB_NOMULTILINE | WB_PATHELLIPSIS );
      92             : 
      93           0 :     m_pMacroNameEdit->SetModifyHdl( LINK( this, MacroChooser, EditModifyHdl ) );
      94             : 
      95           0 :     m_pBasicBox->SetSelectHdl( LINK( this, MacroChooser, BasicSelectHdl ) );
      96             : 
      97           0 :     m_pMacroBox->SetDoubleClickHdl( LINK( this, MacroChooser, MacroDoubleClickHdl ) );
      98           0 :     m_pMacroBox->SetSelectHdl( LINK( this, MacroChooser, MacroSelectHdl ) );
      99             : 
     100           0 :     m_pBasicBox->SetMode( BROWSEMODE_MODULES );
     101           0 :     m_pBasicBox->SetStyle( WB_TABSTOP | WB_BORDER |
     102             :                         WB_HASLINES | WB_HASLINESATROOT |
     103             :                         WB_HASBUTTONS | WB_HASBUTTONSATROOT |
     104           0 :                         WB_HSCROLL );
     105             : 
     106           0 :     if (SfxDispatcher* pDispatcher = GetDispatcher())
     107           0 :         pDispatcher->Execute( SID_BASICIDE_STOREALLMODULESOURCES );
     108             : 
     109           0 :     if ( bCreateEntries )
     110           0 :         m_pBasicBox->ScanAllEntries();
     111           0 : }
     112             : 
     113           0 : MacroChooser::~MacroChooser()
     114             : {
     115           0 :     disposeOnce();
     116           0 : }
     117             : 
     118           0 : void MacroChooser::dispose()
     119             : {
     120           0 :     if ( bForceStoreBasic )
     121             :     {
     122           0 :         SfxGetpApp()->SaveBasicAndDialogContainer();
     123           0 :         bForceStoreBasic = false;
     124             :     }
     125           0 :     m_pMacroNameEdit.clear();
     126           0 :     m_pMacroFromTxT.clear();
     127           0 :     m_pMacrosSaveInTxt.clear();
     128           0 :     m_pBasicBox.clear();
     129           0 :     m_pMacrosInTxt.clear();
     130           0 :     m_pMacroBox.clear();
     131           0 :     m_pRunButton.clear();
     132           0 :     m_pCloseButton.clear();
     133           0 :     m_pAssignButton.clear();
     134           0 :     m_pEditButton.clear();
     135           0 :     m_pDelButton.clear();
     136           0 :     m_pOrganizeButton.clear();
     137           0 :     m_pNewLibButton.clear();
     138           0 :     m_pNewModButton.clear();
     139           0 :     SfxModalDialog::dispose();
     140           0 : }
     141             : 
     142           0 : void MacroChooser::StoreMacroDescription()
     143             : {
     144           0 :     EntryDescriptor aDesc = m_pBasicBox->GetEntryDescriptor(m_pBasicBox->FirstSelected());
     145           0 :     OUString aMethodName;
     146           0 :     SvTreeListEntry* pEntry = m_pMacroBox->FirstSelected();
     147           0 :     if ( pEntry )
     148           0 :         aMethodName = m_pMacroBox->GetEntryText( pEntry );
     149             :     else
     150           0 :         aMethodName = m_pMacroNameEdit->GetText();
     151           0 :     if ( !aMethodName.isEmpty() )
     152             :     {
     153           0 :         aDesc.SetMethodName( aMethodName );
     154           0 :         aDesc.SetType( OBJ_TYPE_METHOD );
     155             :     }
     156             : 
     157           0 :     if (ExtraData* pData = basctl::GetExtraData())
     158           0 :         pData->SetLastEntryDescriptor( aDesc );
     159           0 : }
     160             : 
     161           0 : void MacroChooser::RestoreMacroDescription()
     162             : {
     163           0 :     EntryDescriptor aDesc;
     164           0 :     if (Shell* pShell = GetShell())
     165             :     {
     166           0 :         if (BaseWindow* pCurWin = pShell->GetCurWindow())
     167           0 :             aDesc = pCurWin->CreateEntryDescriptor();
     168             :     }
     169             :     else
     170             :     {
     171           0 :         if (ExtraData* pData = basctl::GetExtraData())
     172           0 :             aDesc = pData->GetLastEntryDescriptor();
     173             :     }
     174             : 
     175           0 :     m_pBasicBox->SetCurrentEntry( aDesc );
     176             : 
     177           0 :     OUString aLastMacro( aDesc.GetMethodName() );
     178           0 :     if ( !aLastMacro.isEmpty() )
     179             :     {
     180             :         // find entry in macro box
     181           0 :         SvTreeListEntry* pEntry = 0;
     182           0 :         sal_uLong nPos = 0;
     183           0 :         SvTreeListEntry* pE = m_pMacroBox->GetEntry( nPos );
     184           0 :         while ( pE )
     185             :         {
     186           0 :             if ( m_pMacroBox->GetEntryText( pE ) == aLastMacro )
     187             :             {
     188           0 :                 pEntry = pE;
     189           0 :                 break;
     190             :             }
     191           0 :             pE = m_pMacroBox->GetEntry( ++nPos );
     192             :         }
     193             : 
     194           0 :         if ( pEntry )
     195           0 :             m_pMacroBox->SetCurEntry( pEntry );
     196             :         else
     197             :         {
     198           0 :             m_pMacroNameEdit->SetText( aLastMacro );
     199           0 :             m_pMacroNameEdit->SetSelection( Selection( 0, 0 ) );
     200             :         }
     201           0 :     }
     202           0 : }
     203             : 
     204           0 : short MacroChooser::Execute()
     205             : {
     206           0 :     RestoreMacroDescription();
     207           0 :     m_pRunButton->GrabFocus();
     208             : 
     209             :     // #104198 Check if "wrong" document is active
     210           0 :     SvTreeListEntry* pSelectedEntry = m_pBasicBox->GetCurEntry();
     211           0 :     EntryDescriptor aDesc( m_pBasicBox->GetEntryDescriptor( pSelectedEntry ) );
     212           0 :     const ScriptDocument& rSelectedDoc( aDesc.GetDocument() );
     213             : 
     214             :     // App Basic is always ok, so only check if shell was found
     215           0 :     if( rSelectedDoc.isDocument() && !rSelectedDoc.isActive() )
     216             :     {
     217             :         // Search for the right entry
     218           0 :         sal_uLong nRootPos = 0;
     219           0 :         SvTreeListEntry* pRootEntry = m_pBasicBox->GetEntry( nRootPos );
     220           0 :         while( pRootEntry )
     221             :         {
     222           0 :             EntryDescriptor aCmpDesc( m_pBasicBox->GetEntryDescriptor( pRootEntry ) );
     223           0 :             const ScriptDocument& rCmpDoc( aCmpDesc.GetDocument() );
     224           0 :             if ( rCmpDoc.isDocument() && rCmpDoc.isActive() )
     225             :             {
     226           0 :                 SvTreeListEntry* pEntry = pRootEntry;
     227           0 :                 SvTreeListEntry* pLastValid = pEntry;
     228           0 :                 while ( pEntry )
     229             :                 {
     230           0 :                     pLastValid = pEntry;
     231           0 :                     pEntry = m_pBasicBox->FirstChild( pEntry );
     232             :                 }
     233           0 :                 if( pLastValid )
     234           0 :                     m_pBasicBox->SetCurEntry( pLastValid );
     235             :             }
     236           0 :             pRootEntry = m_pBasicBox->GetEntry( ++nRootPos );
     237           0 :         }
     238             :     }
     239             : 
     240           0 :     CheckButtons();
     241           0 :     UpdateFields();
     242             : 
     243           0 :     if ( StarBASIC::IsRunning() )
     244           0 :         m_pCloseButton->GrabFocus();
     245             : 
     246           0 :     vcl::Window* pPrevDlgParent = Application::GetDefDialogParent();
     247           0 :     Application::SetDefDialogParent( this );
     248           0 :     short nRet = ModalDialog::Execute();
     249             :     // #57314# If the BasicIDE has been activated, don't reset the DefModalDialogParent to the inactive document.
     250           0 :     if ( Application::GetDefDialogParent() == this )
     251           0 :         Application::SetDefDialogParent( pPrevDlgParent );
     252           0 :     return nRet;
     253             : }
     254             : 
     255             : 
     256           0 : void MacroChooser::EnableButton( Button& rButton, bool bEnable )
     257             : {
     258           0 :     if ( bEnable )
     259             :     {
     260           0 :         if (nMode == ChooseOnly || nMode == Recording)
     261           0 :             rButton.Enable(&rButton == m_pRunButton);
     262             :         else
     263           0 :             rButton.Enable();
     264             :     }
     265             :     else
     266           0 :         rButton.Disable();
     267           0 : }
     268             : 
     269             : 
     270             : 
     271             : 
     272           0 : SbMethod* MacroChooser::GetMacro()
     273             : {
     274           0 :     SbMethod* pMethod = 0;
     275           0 :     SbModule* pModule = m_pBasicBox->FindModule( m_pBasicBox->GetCurEntry() );
     276           0 :     if ( pModule )
     277             :     {
     278           0 :         SvTreeListEntry* pEntry = m_pMacroBox->FirstSelected();
     279           0 :         if ( pEntry )
     280             :         {
     281           0 :             OUString aMacroName( m_pMacroBox->GetEntryText( pEntry ) );
     282           0 :             pMethod = static_cast<SbMethod*>(pModule->GetMethods()->Find( aMacroName, SbxCLASS_METHOD ));
     283             :         }
     284             :     }
     285           0 :     return pMethod;
     286             : }
     287             : 
     288             : 
     289             : 
     290           0 : void MacroChooser::DeleteMacro()
     291             : {
     292           0 :     SbMethod* pMethod = GetMacro();
     293             :     DBG_ASSERT( pMethod, "DeleteMacro: Kein Macro !" );
     294           0 :     if ( pMethod && QueryDelMacro( pMethod->GetName(), this ) )
     295             :     {
     296           0 :         if (SfxDispatcher* pDispatcher = GetDispatcher())
     297           0 :             pDispatcher->Execute( SID_BASICIDE_STOREALLMODULESOURCES );
     298             : 
     299             :         // mark current doc as modified:
     300           0 :         StarBASIC* pBasic = FindBasic(pMethod);
     301             :         assert(pBasic && "Basic?!");
     302           0 :         BasicManager* pBasMgr = FindBasicManager( pBasic );
     303             :         DBG_ASSERT( pBasMgr, "BasMgr?" );
     304           0 :         ScriptDocument aDocument( ScriptDocument::getDocumentForBasicManager( pBasMgr ) );
     305           0 :         if ( aDocument.isDocument() )
     306             :         {
     307           0 :             aDocument.setDocumentModified();
     308           0 :             if (SfxBindings* pBindings = GetBindingsPtr())
     309           0 :                 pBindings->Invalidate( SID_SAVEDOC );
     310             :         }
     311             : 
     312           0 :         SbModule* pModule = pMethod->GetModule();
     313             :         DBG_ASSERT( pModule, "DeleteMacro: Kein Modul?!" );
     314           0 :         OUString aSource( pModule->GetSource32() );
     315             :         sal_uInt16 nStart, nEnd;
     316           0 :         pMethod->GetLineRange( nStart, nEnd );
     317           0 :         pModule->GetMethods()->Remove( pMethod );
     318           0 :         CutLines( aSource, nStart-1, nEnd-nStart+1, true );
     319           0 :         pModule->SetSource32( aSource );
     320             : 
     321             :         // update module in library
     322           0 :         OUString aLibName = pBasic->GetName();
     323           0 :         OUString aModName = pModule->GetName();
     324           0 :         OSL_VERIFY( aDocument.updateModule( aLibName, aModName, aSource ) );
     325             : 
     326           0 :         SvTreeListEntry* pEntry = m_pMacroBox->FirstSelected();
     327             :         DBG_ASSERT( pEntry, "DeleteMacro: Entry ?!" );
     328           0 :         m_pMacroBox->GetModel()->Remove( pEntry );
     329           0 :         bForceStoreBasic = true;
     330             :     }
     331           0 : }
     332             : 
     333           0 : SbMethod* MacroChooser::CreateMacro()
     334             : {
     335           0 :     SbMethod* pMethod = 0;
     336           0 :     SvTreeListEntry* pCurEntry = m_pBasicBox->GetCurEntry();
     337           0 :     EntryDescriptor aDesc = m_pBasicBox->GetEntryDescriptor(pCurEntry);
     338           0 :     ScriptDocument aDocument( aDesc.GetDocument() );
     339             :     OSL_ENSURE( aDocument.isAlive(), "MacroChooser::CreateMacro: no document!" );
     340           0 :     if ( !aDocument.isAlive() )
     341           0 :         return NULL;
     342             : 
     343           0 :     OUString aLibName( aDesc.GetLibName() );
     344             : 
     345           0 :     if ( aLibName.isEmpty() )
     346           0 :         aLibName = "Standard" ;
     347             : 
     348           0 :     aDocument.getOrCreateLibrary( E_SCRIPTS, aLibName );
     349             : 
     350           0 :     OUString aOULibName( aLibName );
     351           0 :     Reference< script::XLibraryContainer > xModLibContainer( aDocument.getLibraryContainer( E_SCRIPTS ) );
     352           0 :     if ( xModLibContainer.is() && xModLibContainer->hasByName( aOULibName ) && !xModLibContainer->isLibraryLoaded( aOULibName ) )
     353           0 :         xModLibContainer->loadLibrary( aOULibName );
     354           0 :     Reference< script::XLibraryContainer > xDlgLibContainer( aDocument.getLibraryContainer( E_DIALOGS ) );
     355           0 :     if ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aOULibName ) && !xDlgLibContainer->isLibraryLoaded( aOULibName ) )
     356           0 :         xDlgLibContainer->loadLibrary( aOULibName );
     357             : 
     358           0 :     BasicManager* pBasMgr = aDocument.getBasicManager();
     359           0 :     StarBASIC* pBasic = pBasMgr ? pBasMgr->GetLib( aLibName ) : 0;
     360           0 :     if ( pBasic )
     361             :     {
     362           0 :         SbModule* pModule = 0;
     363           0 :         OUString aModName( aDesc.GetName() );
     364           0 :         if ( !aModName.isEmpty() )
     365             :         {
     366             :             // extract the module name from the string like "Sheet1 (Example1)"
     367           0 :             if( aDesc.GetLibSubName() == IDE_RESSTR(RID_STR_DOCUMENT_OBJECTS) )
     368             :             {
     369           0 :                 sal_Int32 nIndex = 0;
     370           0 :                 aModName = aModName.getToken( 0, ' ', nIndex );
     371             :             }
     372           0 :             pModule = pBasic->FindModule( aModName );
     373             :         }
     374           0 :         else if ( pBasic->GetModules()->Count() )
     375           0 :             pModule = static_cast<SbModule*>(pBasic->GetModules()->Get( 0 ));
     376             : 
     377           0 :         if ( !pModule )
     378             :         {
     379             :             pModule = createModImpl( static_cast<vcl::Window*>( this ),
     380           0 :                 aDocument, *m_pBasicBox, aLibName, aModName );
     381             :         }
     382             : 
     383           0 :         OUString aSubName = m_pMacroNameEdit->GetText();
     384             :         DBG_ASSERT( !pModule || !pModule->GetMethods()->Find( aSubName, SbxCLASS_METHOD ), "Macro existiert schon!" );
     385           0 :         pMethod = pModule ? basctl::CreateMacro( pModule, aSubName ) : NULL;
     386             :     }
     387             : 
     388           0 :     return pMethod;
     389             : }
     390             : 
     391           0 : void MacroChooser::SaveSetCurEntry( SvTreeListBox& rBox, SvTreeListEntry* pEntry )
     392             : {
     393             :     // the edit would be killed by the highlight otherwise:
     394             : 
     395           0 :     OUString aSaveText( m_pMacroNameEdit->GetText() );
     396           0 :     Selection aCurSel( m_pMacroNameEdit->GetSelection() );
     397             : 
     398           0 :     rBox.SetCurEntry( pEntry );
     399           0 :     m_pMacroNameEdit->SetText( aSaveText );
     400           0 :     m_pMacroNameEdit->SetSelection( aCurSel );
     401           0 : }
     402             : 
     403           0 : void MacroChooser::CheckButtons()
     404             : {
     405           0 :     SvTreeListEntry* pCurEntry = m_pBasicBox->GetCurEntry();
     406           0 :     EntryDescriptor aDesc = m_pBasicBox->GetEntryDescriptor(pCurEntry);
     407           0 :     SvTreeListEntry* pMacroEntry = m_pMacroBox->FirstSelected();
     408           0 :     SbMethod* pMethod = GetMacro();
     409             : 
     410             :     // check, if corresponding libraries are readonly
     411           0 :     bool bReadOnly = false;
     412           0 :     sal_uInt16 nDepth = pCurEntry ? m_pBasicBox->GetModel()->GetDepth( pCurEntry ) : 0;
     413           0 :     if ( nDepth == 1 || nDepth == 2 )
     414             :     {
     415           0 :         ScriptDocument aDocument( aDesc.GetDocument() );
     416           0 :         OUString aOULibName( aDesc.GetLibName() );
     417           0 :         Reference< script::XLibraryContainer2 > xModLibContainer( aDocument.getLibraryContainer( E_SCRIPTS ), UNO_QUERY );
     418           0 :         Reference< script::XLibraryContainer2 > xDlgLibContainer( aDocument.getLibraryContainer( E_DIALOGS ), UNO_QUERY );
     419           0 :         if ( ( xModLibContainer.is() && xModLibContainer->hasByName( aOULibName ) && xModLibContainer->isLibraryReadOnly( aOULibName ) ) ||
     420           0 :                 ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aOULibName ) && xDlgLibContainer->isLibraryReadOnly( aOULibName ) ) )
     421             :         {
     422           0 :             bReadOnly = true;
     423           0 :         }
     424             :     }
     425             : 
     426           0 :     if (nMode != Recording)
     427             :     {
     428             :         // Run...
     429           0 :         bool bEnable = pMethod != nullptr;
     430           0 :         if (nMode != ChooseOnly && StarBASIC::IsRunning())
     431           0 :             bEnable = false;
     432           0 :         EnableButton(*m_pRunButton, bEnable);
     433             :     }
     434             : 
     435             :     // organising still possible?
     436             : 
     437             :     // Assign...
     438           0 :     EnableButton(*m_pAssignButton, pMethod != nullptr);
     439             : 
     440             :     // Edit...
     441           0 :     EnableButton(*m_pEditButton, pMacroEntry != nullptr);
     442             : 
     443             :     // Organizer...
     444           0 :     EnableButton(*m_pOrganizeButton, !StarBASIC::IsRunning() && nMode == All);
     445             : 
     446             :     // m_pDelButton->...
     447           0 :     bool bProtected = m_pBasicBox->IsEntryProtected( pCurEntry );
     448           0 :     bool bShare = ( aDesc.GetLocation() == LIBRARY_LOCATION_SHARE );
     449           0 :     EnableButton(*m_pDelButton, !StarBASIC::IsRunning() && nMode == All && !bProtected && !bReadOnly && !bShare);
     450           0 :     bool bPrev = bNewDelIsDel;
     451           0 :     bNewDelIsDel = pMethod != nullptr;
     452           0 :     if (bPrev != bNewDelIsDel && nMode == All)
     453             :     {
     454           0 :         OUString aBtnText( bNewDelIsDel ? IDEResId(RID_STR_BTNDEL).toString() : IDEResId(RID_STR_BTNNEW).toString() );
     455           0 :         m_pDelButton->SetText( aBtnText );
     456             :     }
     457             : 
     458           0 :     if (nMode == Recording)
     459             :     {
     460             :         // save button
     461           0 :         m_pRunButton->Enable(!bProtected && !bReadOnly && !bShare);
     462             :         // new library button
     463           0 :         m_pNewLibButton->Enable(!bShare);
     464             :         // new module button
     465           0 :         m_pNewModButton->Enable(!bProtected && !bReadOnly && !bShare);
     466           0 :     }
     467           0 : }
     468             : 
     469             : 
     470             : 
     471           0 : IMPL_LINK_NOARG(MacroChooser, MacroDoubleClickHdl)
     472             : {
     473           0 :     StoreMacroDescription();
     474           0 :     if (nMode == Recording)
     475             :     {
     476           0 :         SbMethod* pMethod = GetMacro();
     477           0 :         if ( pMethod && !QueryReplaceMacro( pMethod->GetName(), this ) )
     478           0 :             return 0;
     479             :     }
     480             : 
     481           0 :     EndDialog(Macro_OkRun);
     482           0 :     return 0;
     483             : }
     484             : 
     485           0 : IMPL_LINK( MacroChooser, MacroSelectHdl, SvTreeListBox *, pBox )
     486             : {
     487             :     // Is also called if deselected!
     488             :     // Two function calls in every SelectHdl because
     489             :     // there's no separate DeselectHDL.
     490             :     // So find out if select or deselect:
     491           0 :     if ( pBox->IsSelected( pBox->GetHdlEntry() ) )
     492             :     {
     493           0 :         UpdateFields();
     494           0 :         CheckButtons();
     495             :     }
     496           0 :     return 0;
     497             : }
     498             : 
     499           0 : IMPL_LINK( MacroChooser, BasicSelectHdl, SvTreeListBox *, pBox )
     500             : {
     501             :     // Is also called if deselected!
     502             :     // Two function calls in every SelectHdl because
     503             :     // there's no separate DeselectHDL.
     504             :     // So find out if select or deselect:
     505           0 :     if ( !pBox->IsSelected( pBox->GetHdlEntry() ) )
     506           0 :         return 0;
     507             : 
     508           0 :     SbModule* pModule = m_pBasicBox->FindModule( m_pBasicBox->GetCurEntry() );
     509             : 
     510           0 :     m_pMacroBox->Clear();
     511           0 :     if ( pModule )
     512             :     {
     513           0 :         OUString aStr = m_aMacrosInTxtBaseStr;
     514           0 :         aStr += " " ;
     515           0 :         aStr += pModule->GetName();
     516             : 
     517           0 :         m_pMacrosInTxt->SetText( aStr );
     518             : 
     519             :         // The macros should be called in the same order that they
     520             :         // are written down in the module.
     521             : 
     522           0 :         map< sal_uInt16, SbMethod* > aMacros;
     523           0 :         size_t nMacroCount = pModule->GetMethods()->Count();
     524           0 :         for ( size_t iMeth = 0; iMeth  < nMacroCount; iMeth++ )
     525             :         {
     526           0 :             SbMethod* pMethod = static_cast<SbMethod*>(pModule->GetMethods()->Get( iMeth ));
     527           0 :             if( pMethod->IsHidden() )
     528           0 :                 continue;
     529             :             DBG_ASSERT( pMethod, "Methode nicht gefunden! (NULL)" );
     530             :             sal_uInt16 nStart, nEnd;
     531           0 :             pMethod->GetLineRange( nStart, nEnd );
     532           0 :             aMacros.insert( map< sal_uInt16, SbMethod*>::value_type( nStart, pMethod ) );
     533             :         }
     534             : 
     535           0 :         m_pMacroBox->SetUpdateMode(false);
     536           0 :         for ( map< sal_uInt16, SbMethod* >::iterator it = aMacros.begin(); it != aMacros.end(); ++it )
     537           0 :             m_pMacroBox->InsertEntry( (*it).second->GetName() );
     538           0 :         m_pMacroBox->SetUpdateMode(true);
     539             : 
     540           0 :         if ( m_pMacroBox->GetEntryCount() )
     541             :         {
     542           0 :             SvTreeListEntry* pEntry = m_pMacroBox->GetEntry( 0 );
     543             :             DBG_ASSERT( pEntry, "Entry ?!" );
     544           0 :             m_pMacroBox->SetCurEntry( pEntry );
     545           0 :         }
     546             :     }
     547             : 
     548           0 :     UpdateFields();
     549           0 :     CheckButtons();
     550           0 :     return 0;
     551             : }
     552             : 
     553             : 
     554             : 
     555           0 : IMPL_LINK( MacroChooser, EditModifyHdl, Edit *, pEdit )
     556             : {
     557             :     (void)pEdit;
     558             : 
     559             :     // select the module in which the macro is put at Neu (new),
     560             :     // if BasicManager or Lib is selecting
     561           0 :     SvTreeListEntry* pCurEntry = m_pBasicBox->GetCurEntry();
     562           0 :     if ( pCurEntry )
     563             :     {
     564           0 :         sal_uInt16 nDepth = m_pBasicBox->GetModel()->GetDepth( pCurEntry );
     565           0 :         if ( ( nDepth == 1 ) && ( m_pBasicBox->IsEntryProtected( pCurEntry ) ) )
     566             :         {
     567             :             // then put to the respective Std-Lib...
     568           0 :             SvTreeListEntry* pManagerEntry = m_pBasicBox->GetModel()->GetParent( pCurEntry );
     569           0 :             pCurEntry = m_pBasicBox->GetModel()->FirstChild( pManagerEntry );
     570             :         }
     571           0 :         if ( nDepth < 2 )
     572             :         {
     573           0 :             SvTreeListEntry* pNewEntry = pCurEntry;
     574           0 :             while ( pCurEntry && ( nDepth < 2 ) )
     575             :             {
     576           0 :                 pCurEntry = m_pBasicBox->FirstChild( pCurEntry );
     577           0 :                 if ( pCurEntry )
     578             :                 {
     579           0 :                     pNewEntry = pCurEntry;
     580           0 :                     nDepth = m_pBasicBox->GetModel()->GetDepth( pCurEntry );
     581             :                 }
     582             :             }
     583           0 :             SaveSetCurEntry( *m_pBasicBox, pNewEntry );
     584             :         }
     585           0 :         if ( m_pMacroBox->GetEntryCount() )
     586             :         {
     587           0 :             OUString aEdtText( m_pMacroNameEdit->GetText() );
     588           0 :             bool bFound = false;
     589           0 :             for ( sal_uLong n = 0; n < m_pMacroBox->GetEntryCount(); n++ )
     590             :             {
     591           0 :                 SvTreeListEntry* pEntry = m_pMacroBox->GetEntry( n );
     592             :                 DBG_ASSERT( pEntry, "Entry ?!" );
     593           0 :                 if ( m_pMacroBox->GetEntryText( pEntry ).equalsIgnoreAsciiCase( aEdtText ) )
     594             :                 {
     595           0 :                     SaveSetCurEntry(*m_pMacroBox, pEntry);
     596           0 :                     bFound = true;
     597           0 :                     break;
     598             :                 }
     599             :             }
     600           0 :             if ( !bFound )
     601             :             {
     602           0 :                 SvTreeListEntry* pEntry = m_pMacroBox->FirstSelected();
     603             :                 // if the entry exists ->Select ->Desription...
     604           0 :                 if ( pEntry )
     605           0 :                     m_pMacroBox->Select( pEntry, false );
     606           0 :             }
     607             :         }
     608             :     }
     609             : 
     610           0 :     CheckButtons();
     611           0 :     return 0;
     612             : }
     613             : 
     614             : 
     615             : 
     616           0 : IMPL_LINK( MacroChooser, ButtonHdl, Button *, pButton )
     617             : {
     618             :     // apart from New/Record the Description is done by LoseFocus
     619           0 :     if (pButton == m_pRunButton)
     620             :     {
     621           0 :         StoreMacroDescription();
     622             : 
     623             :         // #116444# check security settings before macro execution
     624           0 :         if (nMode == All)
     625             :         {
     626           0 :             SbMethod* pMethod = GetMacro();
     627           0 :             SbModule* pModule = pMethod ? pMethod->GetModule() : NULL;
     628           0 :             StarBASIC* pBasic = pModule ? static_cast<StarBASIC*>(pModule->GetParent()) : NULL;
     629           0 :             BasicManager* pBasMgr = pBasic ? FindBasicManager(pBasic) : NULL;
     630           0 :             if ( pBasMgr )
     631             :             {
     632           0 :                 ScriptDocument aDocument( ScriptDocument::getDocumentForBasicManager( pBasMgr ) );
     633           0 :                 if ( aDocument.isDocument() && !aDocument.allowMacros() )
     634             :                 {
     635           0 :                     ScopedVclPtrInstance<MessageDialog>::Create(this, IDEResId(RID_STR_CANNOTRUNMACRO), VCL_MESSAGE_WARNING)->Execute();
     636           0 :                     return 0;
     637           0 :                 }
     638             :             }
     639             :         }
     640           0 :         else if (nMode == Recording )
     641             :         {
     642           0 :             if ( !IsValidSbxName(m_pMacroNameEdit->GetText()) )
     643             :             {
     644           0 :                 ScopedVclPtrInstance<MessageDialog>::Create(this, IDEResId(RID_STR_BADSBXNAME))->Execute();
     645           0 :                 m_pMacroNameEdit->SetSelection( Selection( 0, m_pMacroNameEdit->GetText().getLength() ) );
     646           0 :                 m_pMacroNameEdit->GrabFocus();
     647           0 :                 return 0;
     648             :             }
     649             : 
     650           0 :             SbMethod* pMethod = GetMacro();
     651           0 :             if ( pMethod && !QueryReplaceMacro( pMethod->GetName(), this ) )
     652           0 :                 return 0;
     653             :         }
     654             : 
     655           0 :         EndDialog(Macro_OkRun);
     656             :     }
     657           0 :     else if (pButton == m_pCloseButton)
     658             :     {
     659           0 :         StoreMacroDescription();
     660           0 :         EndDialog(Macro_Close);
     661             :     }
     662           0 :     else if ((pButton == m_pEditButton) || (pButton == m_pDelButton))
     663             :     {
     664           0 :         SvTreeListEntry* pCurEntry = m_pBasicBox->GetCurEntry();
     665           0 :         EntryDescriptor aDesc = m_pBasicBox->GetEntryDescriptor(pCurEntry);
     666           0 :         ScriptDocument aDocument( aDesc.GetDocument() );
     667             :         DBG_ASSERT( aDocument.isAlive(), "MacroChooser::ButtonHdl: no document, or document is dead!" );
     668           0 :         if ( !aDocument.isAlive() )
     669           0 :             return 0;
     670           0 :         BasicManager* pBasMgr = aDocument.getBasicManager();
     671           0 :         OUString aLib( aDesc.GetLibName() );
     672           0 :         OUString aMod( aDesc.GetName() );
     673             :         // extract the module name from the string like "Sheet1 (Example1)"
     674           0 :         if( aDesc.GetLibSubName() == IDE_RESSTR(RID_STR_DOCUMENT_OBJECTS) )
     675             :         {
     676           0 :             sal_Int32 nIndex = 0;
     677           0 :             aMod = aMod.getToken( 0, ' ', nIndex );
     678             :         }
     679           0 :         OUString aSub( aDesc.GetMethodName() );
     680           0 :         SfxMacroInfoItem aInfoItem( SID_BASICIDE_ARG_MACROINFO, pBasMgr, aLib, aMod, aSub, OUString() );
     681           0 :         if (pButton == m_pEditButton)
     682             :         {
     683           0 :             SvTreeListEntry* pEntry = m_pMacroBox->FirstSelected();
     684           0 :             if ( pEntry )
     685           0 :                 aInfoItem.SetMethod( m_pMacroBox->GetEntryText( pEntry ) );
     686           0 :             StoreMacroDescription();
     687           0 :             SfxAllItemSet aArgs( SfxGetpApp()->GetPool() );
     688           0 :             SfxRequest aRequest( SID_BASICIDE_APPEAR, SfxCallMode::SYNCHRON, aArgs );
     689           0 :             SfxGetpApp()->ExecuteSlot( aRequest );
     690             : 
     691           0 :             if (SfxDispatcher* pDispatcher = GetDispatcher())
     692           0 :                 pDispatcher->Execute( SID_BASICIDE_EDITMACRO, SfxCallMode::ASYNCHRON, &aInfoItem, 0L );
     693           0 :             EndDialog(Macro_Edit);
     694             :         }
     695             :         else
     696             :         {
     697           0 :             if ( bNewDelIsDel )
     698             :             {
     699           0 :                 DeleteMacro();
     700           0 :                 if (SfxDispatcher* pDispatcher = GetDispatcher())
     701             :                     pDispatcher->Execute( SID_BASICIDE_UPDATEMODULESOURCE,
     702           0 :                                           SfxCallMode::SYNCHRON, &aInfoItem, 0L );
     703           0 :                 CheckButtons();
     704           0 :                 UpdateFields();
     705             :                 //if ( m_pMacroBox->GetCurEntry() )    // OV-Bug ?
     706             :                 //  m_pMacroBox->Select( m_pMacroBox->GetCurEntry() );
     707             :             }
     708             :             else
     709             :             {
     710           0 :                 if ( !IsValidSbxName(m_pMacroNameEdit->GetText()) )
     711             :                 {
     712           0 :                     ScopedVclPtrInstance<MessageDialog>::Create(this, IDEResId(RID_STR_BADSBXNAME))->Execute();
     713           0 :                     m_pMacroNameEdit->SetSelection( Selection( 0, m_pMacroNameEdit->GetText().getLength() ) );
     714           0 :                     m_pMacroNameEdit->GrabFocus();
     715           0 :                     return 1;
     716             :                 }
     717           0 :                 SbMethod* pMethod = CreateMacro();
     718           0 :                 if ( pMethod )
     719             :                 {
     720           0 :                     aInfoItem.SetMethod( pMethod->GetName() );
     721           0 :                     aInfoItem.SetModule( pMethod->GetModule()->GetName() );
     722           0 :                     aInfoItem.SetLib( pMethod->GetModule()->GetParent()->GetName() );
     723           0 :                     SfxAllItemSet aArgs( SfxGetpApp()->GetPool() );
     724           0 :                     SfxRequest aRequest( SID_BASICIDE_APPEAR, SfxCallMode::SYNCHRON, aArgs );
     725           0 :                     SfxGetpApp()->ExecuteSlot( aRequest );
     726             : 
     727           0 :                     if (SfxDispatcher* pDispatcher = GetDispatcher())
     728           0 :                         pDispatcher->Execute( SID_BASICIDE_EDITMACRO, SfxCallMode::ASYNCHRON, &aInfoItem, 0L );
     729           0 :                     StoreMacroDescription();
     730           0 :                     EndDialog(Macro_New);
     731             :                 }
     732             :             }
     733           0 :         }
     734             :     }
     735           0 :     else if (pButton == m_pAssignButton)
     736             :     {
     737           0 :         SvTreeListEntry* pCurEntry = m_pBasicBox->GetCurEntry();
     738           0 :         EntryDescriptor aDesc = m_pBasicBox->GetEntryDescriptor(pCurEntry);
     739           0 :         ScriptDocument aDocument( aDesc.GetDocument() );
     740             :         DBG_ASSERT( aDocument.isAlive(), "MacroChooser::ButtonHdl: no document, or document is dead!" );
     741           0 :         if ( !aDocument.isAlive() )
     742           0 :             return 0;
     743           0 :         BasicManager* pBasMgr = aDocument.getBasicManager();
     744           0 :         OUString aLib( aDesc.GetLibName() );
     745           0 :         OUString aMod( aDesc.GetName() );
     746           0 :         OUString aSub( m_pMacroNameEdit->GetText() );
     747           0 :         SbMethod* pMethod = GetMacro();
     748             :         DBG_ASSERT( pBasMgr, "BasMgr?" );
     749             :         DBG_ASSERT( pMethod, "Method?" );
     750           0 :         OUString aComment( GetInfo( pMethod ) );
     751           0 :         SfxMacroInfoItem aItem( SID_MACROINFO, pBasMgr, aLib, aMod, aSub, aComment );
     752           0 :         SfxAllItemSet Args( SfxGetpApp()->GetPool() );
     753           0 :         SfxRequest aRequest( SID_CONFIG, SfxCallMode::SYNCHRON, Args );
     754           0 :         aRequest.AppendItem( aItem );
     755           0 :         SfxGetpApp()->ExecuteSlot( aRequest );
     756             :     }
     757           0 :     else if (pButton == m_pNewLibButton)
     758             :     {
     759           0 :         SvTreeListEntry* pCurEntry = m_pBasicBox->GetCurEntry();
     760           0 :         EntryDescriptor aDesc = m_pBasicBox->GetEntryDescriptor(pCurEntry);
     761           0 :         ScriptDocument aDocument( aDesc.GetDocument() );
     762           0 :         createLibImpl( static_cast<vcl::Window*>( this ), aDocument, NULL, m_pBasicBox );
     763             :     }
     764           0 :     else if (pButton == m_pNewModButton)
     765             :     {
     766           0 :         SvTreeListEntry* pCurEntry = m_pBasicBox->GetCurEntry();
     767           0 :         EntryDescriptor aDesc = m_pBasicBox->GetEntryDescriptor(pCurEntry);
     768           0 :         ScriptDocument aDocument( aDesc.GetDocument() );
     769           0 :         OUString aLibName( aDesc.GetLibName() );
     770           0 :         OUString aModName;
     771             :         createModImpl( static_cast<vcl::Window*>( this ), aDocument,
     772           0 :             *m_pBasicBox, aLibName, aModName, true );
     773             :     }
     774           0 :     else if (pButton == m_pOrganizeButton)
     775             :     {
     776           0 :         StoreMacroDescription();
     777             : 
     778           0 :         EntryDescriptor aDesc = m_pBasicBox->GetEntryDescriptor(m_pBasicBox->FirstSelected());
     779           0 :         VclPtrInstance< OrganizeDialog > pDlg( this, 0, aDesc );
     780           0 :         sal_uInt16 nRet = pDlg->Execute();
     781           0 :         pDlg.reset();
     782             : 
     783           0 :         if ( nRet ) // not only closed
     784             :         {
     785           0 :             EndDialog(Macro_Edit);
     786           0 :             return 0;
     787             :         }
     788             : 
     789           0 :         Shell* pShell = GetShell();
     790           0 :         if ( pShell && pShell->IsAppBasicModified() )
     791           0 :             bForceStoreBasic = true;
     792             : 
     793           0 :         m_pBasicBox->UpdateEntries();
     794             :     }
     795           0 :     return 0;
     796             : }
     797             : 
     798             : 
     799             : 
     800           0 : void MacroChooser::UpdateFields()
     801             : {
     802           0 :     SvTreeListEntry*    pMacroEntry = m_pMacroBox->GetCurEntry();
     803           0 :     OUString            aEmptyStr;
     804             : 
     805           0 :     m_pMacroNameEdit->SetText( aEmptyStr );
     806           0 :     if ( pMacroEntry )
     807           0 :         m_pMacroNameEdit->SetText( m_pMacroBox->GetEntryText( pMacroEntry ) );
     808           0 : }
     809             : 
     810           0 : void MacroChooser::SetMode (Mode nM)
     811             : {
     812           0 :     nMode = nM;
     813           0 :     switch (nMode)
     814             :     {
     815             :         case All:
     816             :         {
     817           0 :             m_pRunButton->SetText(IDEResId(RID_STR_RUN).toString());
     818           0 :             EnableButton(*m_pDelButton, true);
     819           0 :             EnableButton(*m_pOrganizeButton, true);
     820           0 :             break;
     821             :         }
     822             : 
     823             :         case ChooseOnly:
     824             :         {
     825           0 :             m_pRunButton->SetText(IDEResId(RID_STR_CHOOSE).toString());
     826           0 :             EnableButton(*m_pDelButton, false);
     827           0 :             EnableButton(*m_pOrganizeButton, false);
     828           0 :             break;
     829             :         }
     830             : 
     831             :         case Recording:
     832             :         {
     833           0 :             m_pRunButton->SetText(IDEResId(RID_STR_RECORD).toString());
     834           0 :             EnableButton(*m_pDelButton, false);
     835           0 :             EnableButton(*m_pOrganizeButton, false);
     836             : 
     837           0 :             m_pAssignButton->Hide();
     838           0 :             m_pEditButton->Hide();
     839           0 :             m_pDelButton->Hide();
     840           0 :             m_pOrganizeButton->Hide();
     841           0 :             m_pMacroFromTxT->Hide();
     842             : 
     843           0 :             m_pNewLibButton->Show();
     844           0 :             m_pNewModButton->Show();
     845           0 :             m_pMacrosSaveInTxt->Show();
     846             : 
     847           0 :             break;
     848             :         }
     849             :     }
     850           0 :     CheckButtons();
     851           0 : }
     852             : 
     853           0 : OUString MacroChooser::GetInfo( SbxVariable* pVar )
     854             : {
     855           0 :     OUString aComment;
     856           0 :     SbxInfoRef xInfo = pVar->GetInfo();
     857           0 :     if ( xInfo.Is() )
     858           0 :         aComment = xInfo->GetComment();
     859           0 :     return aComment;
     860             : }
     861             : 
     862             : 
     863           0 : } // namespace basctl
     864             : 
     865             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11