131598a22SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
331598a22SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
431598a22SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
531598a22SAndrew Rist  * distributed with this work for additional information
631598a22SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
731598a22SAndrew Rist  * to you under the Apache License, Version 2.0 (the
831598a22SAndrew Rist  * "License"); you may not use this file except in compliance
931598a22SAndrew Rist  * with the License.  You may obtain a copy of the License at
1031598a22SAndrew Rist  *
1131598a22SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
1231598a22SAndrew Rist  *
1331598a22SAndrew Rist  * Unless required by applicable law or agreed to in writing,
1431598a22SAndrew Rist  * software distributed under the License is distributed on an
1531598a22SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1631598a22SAndrew Rist  * KIND, either express or implied.  See the License for the
1731598a22SAndrew Rist  * specific language governing permissions and limitations
1831598a22SAndrew Rist  * under the License.
1931598a22SAndrew Rist  *
2031598a22SAndrew Rist  *************************************************************/
2131598a22SAndrew Rist 
2231598a22SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_basctl.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <memory>
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include <ide_pch.hxx>
30cdf0e10cSrcweir 
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #include <macrodlg.hxx>
33cdf0e10cSrcweir #include <macrodlg.hrc>
34cdf0e10cSrcweir #include <basidesh.hrc>
35cdf0e10cSrcweir #include <basidesh.hxx>
36cdf0e10cSrcweir #include <baside2.hrc>		// ID's fuer Imagese
37cdf0e10cSrcweir #include <basobj.hxx>
38cdf0e10cSrcweir #include <baside3.hxx>
39cdf0e10cSrcweir 
40cdf0e10cSrcweir #include <iderdll.hxx>
41cdf0e10cSrcweir #include <iderdll2.hxx>
42cdf0e10cSrcweir #include <iderid.hxx>
43cdf0e10cSrcweir 
44cdf0e10cSrcweir #include <moduldlg.hxx>
45cdf0e10cSrcweir #include <basic/sbx.hxx>
46cdf0e10cSrcweir 
47cdf0e10cSrcweir #include <bastypes.hxx>
48cdf0e10cSrcweir #include <sbxitem.hxx>
49cdf0e10cSrcweir #include <sfx2/minfitem.hxx>
50cdf0e10cSrcweir 
51cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SCRIPT_XLIBRYARYCONTAINER2_HPP_
52cdf0e10cSrcweir #include <com/sun/star/script/XLibraryContainer2.hpp>
53cdf0e10cSrcweir #endif
54cdf0e10cSrcweir #include <com/sun/star/document/MacroExecMode.hpp>
55cdf0e10cSrcweir 
56cdf0e10cSrcweir using namespace ::com::sun::star;
57cdf0e10cSrcweir using namespace ::com::sun::star::uno;
58cdf0e10cSrcweir 
59cdf0e10cSrcweir 
DECLARE_LIST(MacroList,SbMethod *)60cdf0e10cSrcweir DECLARE_LIST( MacroList, SbMethod* )
61cdf0e10cSrcweir 
62cdf0e10cSrcweir MacroChooser::MacroChooser( Window* pParnt, sal_Bool bCreateEntries ) :
63cdf0e10cSrcweir 		SfxModalDialog( 	pParnt,	IDEResId( RID_MACROCHOOSER ) ),
64cdf0e10cSrcweir 		aMacroNameTxt(		this,	IDEResId( RID_TXT_MACRONAME ) ),
65cdf0e10cSrcweir 		aMacroNameEdit(		this,	IDEResId( RID_ED_MACRONAME ) ),
66cdf0e10cSrcweir 		aMacroFromTxT(		this,	IDEResId( RID_TXT_MACROFROM ) ),
67cdf0e10cSrcweir 		aMacrosSaveInTxt(	this,	IDEResId( RID_TXT_SAVEMACRO ) ),
68cdf0e10cSrcweir 		aBasicBox(			this,	IDEResId( RID_CTRL_LIB ) ),
69cdf0e10cSrcweir         aMacrosInTxt(		this,	IDEResId( RID_TXT_MACROSIN ) ),
70cdf0e10cSrcweir 		aMacroBox(			this,	IDEResId( RID_CTRL_MACRO ) ),
71cdf0e10cSrcweir         aRunButton(			this,	IDEResId( RID_PB_RUN ) ),
72cdf0e10cSrcweir 		aCloseButton(	    this,	IDEResId( RID_PB_CLOSE ) ),
73cdf0e10cSrcweir 		aAssignButton(		this,	IDEResId( RID_PB_ASSIGN ) ),
74cdf0e10cSrcweir 		aEditButton(		this,	IDEResId( RID_PB_EDIT ) ),
75cdf0e10cSrcweir 		aNewDelButton(		this,	IDEResId( RID_PB_DEL ) ),
76cdf0e10cSrcweir 		aOrganizeButton(	this,	IDEResId( RID_PB_ORG ) ),
77cdf0e10cSrcweir 		aHelpButton(		this,	IDEResId( RID_PB_HELP ) ),
78cdf0e10cSrcweir 		aNewLibButton(	    this,	IDEResId( RID_PB_NEWLIB ) ),
79cdf0e10cSrcweir 		aNewModButton(	    this,	IDEResId( RID_PB_NEWMOD ) )
80cdf0e10cSrcweir {
81cdf0e10cSrcweir 	FreeResource();
82cdf0e10cSrcweir 
83cdf0e10cSrcweir 	nMode = MACROCHOOSER_ALL;
84cdf0e10cSrcweir 	bNewDelIsDel = sal_True;
85cdf0e10cSrcweir 
86cdf0e10cSrcweir 	// Der Sfx fragt den BasicManager nicht, ob modified
87cdf0e10cSrcweir 	// => Speichern anschmeissen, wenn Aenderung, aber kein Sprung in
88cdf0e10cSrcweir 	// die BasicIDE.
89cdf0e10cSrcweir 	bForceStoreBasic = sal_False;
90cdf0e10cSrcweir 
91cdf0e10cSrcweir 	aMacrosInTxtBaseStr = aMacrosInTxt.GetText();
92cdf0e10cSrcweir 
93cdf0e10cSrcweir 	aMacroBox.SetSelectionMode( SINGLE_SELECTION );
94cdf0e10cSrcweir 	aMacroBox.SetHighlightRange(); // ueber ganze Breite selektieren
95cdf0e10cSrcweir 
96cdf0e10cSrcweir 	aRunButton.SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
97cdf0e10cSrcweir 	aCloseButton.SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
98cdf0e10cSrcweir 	aAssignButton.SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
99cdf0e10cSrcweir 	aEditButton.SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
100cdf0e10cSrcweir 	aNewDelButton.SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
101cdf0e10cSrcweir 	aOrganizeButton.SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
102cdf0e10cSrcweir 
103cdf0e10cSrcweir 	// Buttons only for MACROCHOOSER_RECORDING
104cdf0e10cSrcweir 	aNewLibButton.SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
105cdf0e10cSrcweir 	aNewModButton.SetClickHdl( LINK( this, MacroChooser, ButtonHdl ) );
106cdf0e10cSrcweir 	aNewLibButton.Hide();		// default
107cdf0e10cSrcweir 	aNewModButton.Hide();		// default
108cdf0e10cSrcweir 	aMacrosSaveInTxt.Hide();	// default
109cdf0e10cSrcweir 
110cdf0e10cSrcweir     aMacrosInTxt.SetStyle( WB_NOMULTILINE | WB_PATHELLIPSIS );
111cdf0e10cSrcweir 
112cdf0e10cSrcweir 	aMacroNameEdit.SetModifyHdl( LINK( this, MacroChooser, EditModifyHdl ) );
113cdf0e10cSrcweir 
114cdf0e10cSrcweir 	aBasicBox.SetSelectHdl( LINK( this, MacroChooser, BasicSelectHdl ) );
115cdf0e10cSrcweir 
116cdf0e10cSrcweir 	aMacroBox.SetDoubleClickHdl( LINK( this, MacroChooser, MacroDoubleClickHdl ) );
117cdf0e10cSrcweir 	aMacroBox.SetSelectHdl( LINK( this, MacroChooser, MacroSelectHdl ) );
118cdf0e10cSrcweir 
119cdf0e10cSrcweir 	aBasicBox.SetMode( BROWSEMODE_MODULES );
120cdf0e10cSrcweir     aBasicBox.SetStyle( WB_TABSTOP | WB_BORDER |
121cdf0e10cSrcweir                         WB_HASLINES | WB_HASLINESATROOT |
122cdf0e10cSrcweir                         WB_HASBUTTONS | WB_HASBUTTONSATROOT |
123cdf0e10cSrcweir                         WB_HSCROLL );
124cdf0e10cSrcweir 
125cdf0e10cSrcweir     BasicIDEShell* pIDEShell = IDE_DLL()->GetShell();
126cdf0e10cSrcweir     SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL;
127cdf0e10cSrcweir 	SfxDispatcher* pDispatcher = pViewFrame ? pViewFrame->GetDispatcher() : NULL;
128cdf0e10cSrcweir     if( pDispatcher )
129cdf0e10cSrcweir 	{
130cdf0e10cSrcweir 		pDispatcher->Execute( SID_BASICIDE_STOREALLMODULESOURCES );
131cdf0e10cSrcweir 	}
132cdf0e10cSrcweir 
133cdf0e10cSrcweir 	if ( bCreateEntries )
134cdf0e10cSrcweir 		aBasicBox.ScanAllEntries();
135cdf0e10cSrcweir }
136cdf0e10cSrcweir 
~MacroChooser()137cdf0e10cSrcweir MacroChooser::~MacroChooser()
138cdf0e10cSrcweir {
139cdf0e10cSrcweir 	if ( bForceStoreBasic )
140cdf0e10cSrcweir         SFX_APP()->SaveBasicAndDialogContainer();
141cdf0e10cSrcweir }
142cdf0e10cSrcweir 
StoreMacroDescription()143cdf0e10cSrcweir void MacroChooser::StoreMacroDescription()
144cdf0e10cSrcweir {
145cdf0e10cSrcweir     BasicEntryDescriptor aDesc( aBasicBox.GetEntryDescriptor( aBasicBox.FirstSelected() ) );
146cdf0e10cSrcweir     String aMethodName;
147cdf0e10cSrcweir     SvLBoxEntry* pEntry = aMacroBox.FirstSelected();
148cdf0e10cSrcweir     if ( pEntry )
149cdf0e10cSrcweir         aMethodName = aMacroBox.GetEntryText( pEntry );
150cdf0e10cSrcweir     else
151cdf0e10cSrcweir         aMethodName = aMacroNameEdit.GetText();
152cdf0e10cSrcweir     if ( aMethodName.Len() )
153cdf0e10cSrcweir     {
154cdf0e10cSrcweir         aDesc.SetMethodName( aMethodName );
155cdf0e10cSrcweir         aDesc.SetType( OBJ_TYPE_METHOD );
156cdf0e10cSrcweir     }
157cdf0e10cSrcweir 
158cdf0e10cSrcweir     BasicIDEData* pData = IDE_DLL()->GetExtraData();
159cdf0e10cSrcweir     if ( pData )
160cdf0e10cSrcweir         pData->SetLastEntryDescriptor( aDesc );
161cdf0e10cSrcweir }
162cdf0e10cSrcweir 
RestoreMacroDescription()163cdf0e10cSrcweir void MacroChooser::RestoreMacroDescription()
164cdf0e10cSrcweir {
165cdf0e10cSrcweir     BasicEntryDescriptor aDesc;
166cdf0e10cSrcweir     BasicIDEShell* pIDEShell = IDE_DLL()->GetShell();
167cdf0e10cSrcweir     if ( pIDEShell )
168cdf0e10cSrcweir     {
169cdf0e10cSrcweir         IDEBaseWindow* pCurWin = pIDEShell->GetCurWindow();
170cdf0e10cSrcweir         if ( pCurWin )
171cdf0e10cSrcweir             aDesc = pCurWin->CreateEntryDescriptor();
172cdf0e10cSrcweir     }
173cdf0e10cSrcweir     else
174cdf0e10cSrcweir     {
175cdf0e10cSrcweir         BasicIDEData* pData = IDE_DLL()->GetExtraData();
176cdf0e10cSrcweir         if ( pData )
177cdf0e10cSrcweir             aDesc = pData->GetLastEntryDescriptor();
178cdf0e10cSrcweir     }
179cdf0e10cSrcweir 
180cdf0e10cSrcweir     aBasicBox.SetCurrentEntry( aDesc );
181cdf0e10cSrcweir 
182cdf0e10cSrcweir 	String aLastMacro( aDesc.GetMethodName() );
183cdf0e10cSrcweir 	if ( aLastMacro.Len() )
184cdf0e10cSrcweir 	{
185cdf0e10cSrcweir         // find entry in macro box
186cdf0e10cSrcweir         SvLBoxEntry* pEntry = 0;
187cdf0e10cSrcweir         sal_uLong nPos = 0;
188cdf0e10cSrcweir         SvLBoxEntry* pE = aMacroBox.GetEntry( nPos );
189cdf0e10cSrcweir         while ( pE )
190cdf0e10cSrcweir         {
191cdf0e10cSrcweir             if ( aMacroBox.GetEntryText( pE ) == aLastMacro )
192cdf0e10cSrcweir             {
193cdf0e10cSrcweir                 pEntry = pE;
194cdf0e10cSrcweir                 break;
195cdf0e10cSrcweir             }
196cdf0e10cSrcweir             pE = aMacroBox.GetEntry( ++nPos );
197cdf0e10cSrcweir         }
198cdf0e10cSrcweir 
199cdf0e10cSrcweir 		if ( pEntry )
200cdf0e10cSrcweir 			aMacroBox.SetCurEntry( pEntry );
201cdf0e10cSrcweir 		else
202cdf0e10cSrcweir 		{
203cdf0e10cSrcweir 			aMacroNameEdit.SetText( aLastMacro );
204cdf0e10cSrcweir 			aMacroNameEdit.SetSelection( Selection( 0, 0 ) );
205cdf0e10cSrcweir 		}
206cdf0e10cSrcweir 	}
207cdf0e10cSrcweir }
208cdf0e10cSrcweir 
Execute()209cdf0e10cSrcweir short __EXPORT MacroChooser::Execute()
210cdf0e10cSrcweir {
211cdf0e10cSrcweir     RestoreMacroDescription();
212cdf0e10cSrcweir     aRunButton.GrabFocus();
213cdf0e10cSrcweir 
214cdf0e10cSrcweir     // #104198 Check if "wrong" document is active
215cdf0e10cSrcweir 	SvLBoxEntry* pSelectedEntry = aBasicBox.GetCurEntry();
216cdf0e10cSrcweir     BasicEntryDescriptor aDesc( aBasicBox.GetEntryDescriptor( pSelectedEntry ) );
217cdf0e10cSrcweir     const ScriptDocument& rSelectedDoc( aDesc.GetDocument() );
218cdf0e10cSrcweir 
219cdf0e10cSrcweir     // App Basic is always ok, so only check if shell was found
220cdf0e10cSrcweir     if( rSelectedDoc.isDocument() && !rSelectedDoc.isActive() )
221cdf0e10cSrcweir     {
222cdf0e10cSrcweir         // Search for the right entry
223cdf0e10cSrcweir 	    sal_uLong nRootPos = 0;
224cdf0e10cSrcweir 	    SvLBoxEntry* pRootEntry = aBasicBox.GetEntry( nRootPos );
225cdf0e10cSrcweir 	    while( pRootEntry )
226cdf0e10cSrcweir 	    {
227cdf0e10cSrcweir             BasicEntryDescriptor aCmpDesc( aBasicBox.GetEntryDescriptor( pRootEntry ) );
228cdf0e10cSrcweir             const ScriptDocument& rCmpDoc( aCmpDesc.GetDocument() );
229cdf0e10cSrcweir             if ( rCmpDoc.isDocument() && rCmpDoc.isActive() )
230cdf0e10cSrcweir             {
231cdf0e10cSrcweir                 SvLBoxEntry* pEntry = pRootEntry;
232cdf0e10cSrcweir                 SvLBoxEntry* pLastValid = pEntry;
233cdf0e10cSrcweir 		        while ( pEntry )
234cdf0e10cSrcweir 		        {
235cdf0e10cSrcweir 			        pLastValid = pEntry;
236cdf0e10cSrcweir 			        pEntry = aBasicBox.FirstChild( pEntry );
237cdf0e10cSrcweir 		        }
238cdf0e10cSrcweir 		        if( pLastValid )
239cdf0e10cSrcweir         			aBasicBox.SetCurEntry( pLastValid );
240cdf0e10cSrcweir             }
241cdf0e10cSrcweir 		    pRootEntry = aBasicBox.GetEntry( ++nRootPos );
242cdf0e10cSrcweir 	    }
243cdf0e10cSrcweir     }
244cdf0e10cSrcweir 
245cdf0e10cSrcweir 	CheckButtons();
246cdf0e10cSrcweir 	UpdateFields();
247cdf0e10cSrcweir 
248cdf0e10cSrcweir 	if ( StarBASIC::IsRunning() )
249cdf0e10cSrcweir 		aCloseButton.GrabFocus();
250cdf0e10cSrcweir 
251cdf0e10cSrcweir 	Window* pPrevDlgParent = Application::GetDefDialogParent();
252cdf0e10cSrcweir 	Application::SetDefDialogParent( this );
253cdf0e10cSrcweir 	short nRet = ModalDialog::Execute();
254cdf0e10cSrcweir 	// #57314# Wenn die BasicIDE aktiviert wurde, dann nicht den DefModalDialogParent auf das inaktive Dokument zuruecksetzen.
255cdf0e10cSrcweir 	if ( Application::GetDefDialogParent() == this )
256cdf0e10cSrcweir 		Application::SetDefDialogParent( pPrevDlgParent );
257cdf0e10cSrcweir 	return nRet;
258cdf0e10cSrcweir }
259cdf0e10cSrcweir 
260cdf0e10cSrcweir 
EnableButton(Button & rButton,sal_Bool bEnable)261cdf0e10cSrcweir void MacroChooser::EnableButton( Button& rButton, sal_Bool bEnable )
262cdf0e10cSrcweir {
263cdf0e10cSrcweir 	if ( bEnable )
264cdf0e10cSrcweir 	{
265cdf0e10cSrcweir         if ( nMode == MACROCHOOSER_CHOOSEONLY || nMode == MACROCHOOSER_RECORDING )
266cdf0e10cSrcweir 		{
267cdf0e10cSrcweir 			// Nur der RunButton kann enabled werden
268cdf0e10cSrcweir 			if ( &rButton == &aRunButton )
269cdf0e10cSrcweir 				rButton.Enable();
270cdf0e10cSrcweir 			else
271cdf0e10cSrcweir 				rButton.Disable();
272cdf0e10cSrcweir 		}
273cdf0e10cSrcweir 		else
274cdf0e10cSrcweir 			rButton.Enable();
275cdf0e10cSrcweir 	}
276cdf0e10cSrcweir 	else
277cdf0e10cSrcweir 		rButton.Disable();
278cdf0e10cSrcweir }
279cdf0e10cSrcweir 
280cdf0e10cSrcweir 
281cdf0e10cSrcweir 
282cdf0e10cSrcweir 
GetMacro()283cdf0e10cSrcweir SbMethod* MacroChooser::GetMacro()
284cdf0e10cSrcweir {
285cdf0e10cSrcweir 	SbMethod* pMethod = 0;
286cdf0e10cSrcweir 	SbModule* pModule = aBasicBox.FindModule( aBasicBox.GetCurEntry() );
287cdf0e10cSrcweir 	if ( pModule )
288cdf0e10cSrcweir 	{
289cdf0e10cSrcweir 		SvLBoxEntry* pEntry = aMacroBox.FirstSelected();
290cdf0e10cSrcweir 		if ( pEntry )
291cdf0e10cSrcweir 		{
292cdf0e10cSrcweir 			String aMacroName( aMacroBox.GetEntryText( pEntry ) );
293cdf0e10cSrcweir 			pMethod = (SbMethod*)pModule->GetMethods()->Find( aMacroName, SbxCLASS_METHOD );
294cdf0e10cSrcweir 		}
295cdf0e10cSrcweir 	}
296cdf0e10cSrcweir 	return pMethod;
297cdf0e10cSrcweir }
298cdf0e10cSrcweir 
299cdf0e10cSrcweir 
300cdf0e10cSrcweir 
DeleteMacro()301cdf0e10cSrcweir void MacroChooser::DeleteMacro()
302cdf0e10cSrcweir {
303cdf0e10cSrcweir 	SbMethod* pMethod = GetMacro();
304cdf0e10cSrcweir 	DBG_ASSERT( pMethod, "DeleteMacro: Kein Macro !" );
305cdf0e10cSrcweir 	if ( pMethod && QueryDelMacro( pMethod->GetName(), this ) )
306cdf0e10cSrcweir 	{
307cdf0e10cSrcweir         BasicIDEShell* pIDEShell = IDE_DLL()->GetShell();
308cdf0e10cSrcweir         SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL;
309cdf0e10cSrcweir 	    SfxDispatcher* pDispatcher = pViewFrame ? pViewFrame->GetDispatcher() : NULL;
310cdf0e10cSrcweir         if( pDispatcher )
311cdf0e10cSrcweir 		{
312cdf0e10cSrcweir 			pDispatcher->Execute( SID_BASICIDE_STOREALLMODULESOURCES );
313cdf0e10cSrcweir 		}
314cdf0e10cSrcweir 
315cdf0e10cSrcweir 		// Aktuelles Doc als geaendert markieren:
316cdf0e10cSrcweir 		StarBASIC* pBasic = BasicIDE::FindBasic( pMethod );
317cdf0e10cSrcweir 		DBG_ASSERT( pBasic, "Basic?!" );
318cdf0e10cSrcweir 		BasicManager* pBasMgr = BasicIDE::FindBasicManager( pBasic );
319cdf0e10cSrcweir 		DBG_ASSERT( pBasMgr, "BasMgr?" );
320cdf0e10cSrcweir         ScriptDocument aDocument( ScriptDocument::getDocumentForBasicManager( pBasMgr ) );
321cdf0e10cSrcweir         if ( aDocument.isDocument() )    // Muss ja nicht aus einem Document kommen...
322cdf0e10cSrcweir 		{
323cdf0e10cSrcweir 			aDocument.setDocumentModified();
324cdf0e10cSrcweir             SfxBindings* pBindings = BasicIDE::GetBindingsPtr();
325cdf0e10cSrcweir             if ( pBindings )
326cdf0e10cSrcweir                 pBindings->Invalidate( SID_SAVEDOC );
327cdf0e10cSrcweir 		}
328cdf0e10cSrcweir 
329cdf0e10cSrcweir 		SbModule* pModule = pMethod->GetModule();
330cdf0e10cSrcweir 		DBG_ASSERT( pModule, "DeleteMacro: Kein Modul?!" );
331cdf0e10cSrcweir         ::rtl::OUString aSource( pModule->GetSource32() );
332cdf0e10cSrcweir 		sal_uInt16 nStart, nEnd;
333cdf0e10cSrcweir 		pMethod->GetLineRange( nStart, nEnd );
334cdf0e10cSrcweir 		pModule->GetMethods()->Remove( pMethod );
335cdf0e10cSrcweir 		CutLines( aSource, nStart-1, nEnd-nStart+1, sal_True );
336cdf0e10cSrcweir 		pModule->SetSource32( aSource );
337cdf0e10cSrcweir 
338cdf0e10cSrcweir         // update module in library
339cdf0e10cSrcweir         String aLibName = pBasic->GetName();
340cdf0e10cSrcweir 	    String aModName = pModule->GetName();
341cdf0e10cSrcweir         OSL_VERIFY( aDocument.updateModule( aLibName, aModName, aSource ) );
342cdf0e10cSrcweir 
343cdf0e10cSrcweir         SvLBoxEntry* pEntry = aMacroBox.FirstSelected();
344cdf0e10cSrcweir 		DBG_ASSERT( pEntry, "DeleteMacro: Entry ?!" );
345cdf0e10cSrcweir 		aMacroBox.GetModel()->Remove( pEntry );
346cdf0e10cSrcweir 		bForceStoreBasic = sal_True;
347cdf0e10cSrcweir 	}
348cdf0e10cSrcweir }
349cdf0e10cSrcweir 
CreateMacro()350cdf0e10cSrcweir SbMethod* MacroChooser::CreateMacro()
351cdf0e10cSrcweir {
352cdf0e10cSrcweir     SbMethod* pMethod = 0;
353cdf0e10cSrcweir     SvLBoxEntry* pCurEntry = aBasicBox.GetCurEntry();
354cdf0e10cSrcweir     BasicEntryDescriptor aDesc( aBasicBox.GetEntryDescriptor( pCurEntry ) );
355cdf0e10cSrcweir     ScriptDocument aDocument( aDesc.GetDocument() );
356cdf0e10cSrcweir     OSL_ENSURE( aDocument.isAlive(), "MacroChooser::CreateMacro: no document!" );
357cdf0e10cSrcweir     if ( !aDocument.isAlive() )
358cdf0e10cSrcweir         return NULL;
359cdf0e10cSrcweir 
360cdf0e10cSrcweir     String aLibName( aDesc.GetLibName() );
361cdf0e10cSrcweir 
362cdf0e10cSrcweir     if ( !aLibName.Len() )
363cdf0e10cSrcweir         aLibName = String::CreateFromAscii( "Standard" );
364cdf0e10cSrcweir 
365cdf0e10cSrcweir     aDocument.getOrCreateLibrary( E_SCRIPTS, aLibName );
366cdf0e10cSrcweir 
367cdf0e10cSrcweir     ::rtl::OUString aOULibName( aLibName );
368cdf0e10cSrcweir     Reference< script::XLibraryContainer > xModLibContainer( aDocument.getLibraryContainer( E_SCRIPTS ) );
369cdf0e10cSrcweir     if ( xModLibContainer.is() && xModLibContainer->hasByName( aOULibName ) && !xModLibContainer->isLibraryLoaded( aOULibName ) )
370cdf0e10cSrcweir         xModLibContainer->loadLibrary( aOULibName );
371cdf0e10cSrcweir     Reference< script::XLibraryContainer > xDlgLibContainer( aDocument.getLibraryContainer( E_DIALOGS ) );
372cdf0e10cSrcweir     if ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aOULibName ) && !xDlgLibContainer->isLibraryLoaded( aOULibName ) )
373cdf0e10cSrcweir         xDlgLibContainer->loadLibrary( aOULibName );
374cdf0e10cSrcweir 
375cdf0e10cSrcweir     BasicManager* pBasMgr = aDocument.getBasicManager();
376cdf0e10cSrcweir     StarBASIC* pBasic = pBasMgr ? pBasMgr->GetLib( aLibName ) : 0;
377cdf0e10cSrcweir     if ( pBasic )
378cdf0e10cSrcweir     {
379cdf0e10cSrcweir         SbModule* pModule = 0;
380cdf0e10cSrcweir         String aModName( aDesc.GetName() );
381cdf0e10cSrcweir         if ( aModName.Len() )
382cdf0e10cSrcweir         {
383cdf0e10cSrcweir             // extract the module name from the string like "Sheet1 (Example1)"
384cdf0e10cSrcweir             if( aDesc.GetLibSubName().Equals( String( IDEResId( RID_STR_DOCUMENT_OBJECTS ) ) ) )
385cdf0e10cSrcweir             {
386cdf0e10cSrcweir                 sal_uInt16 nIndex = 0;
387cdf0e10cSrcweir                 aModName = aModName.GetToken( 0, ' ', nIndex );
388cdf0e10cSrcweir             }
389cdf0e10cSrcweir 	        pModule = pBasic->FindModule( aModName );
390cdf0e10cSrcweir         }
391cdf0e10cSrcweir         else if ( pBasic->GetModules()->Count() )
392cdf0e10cSrcweir 	        pModule = (SbModule*)pBasic->GetModules()->Get( 0 );
393cdf0e10cSrcweir 
394cdf0e10cSrcweir         if ( !pModule )
395cdf0e10cSrcweir         {
396cdf0e10cSrcweir 	        pModule = createModImpl( static_cast<Window*>( this ),
397cdf0e10cSrcweir 		        aDocument, aBasicBox, aLibName, aModName );
398cdf0e10cSrcweir         }
399cdf0e10cSrcweir 
400cdf0e10cSrcweir         String aSubName = aMacroNameEdit.GetText();
401cdf0e10cSrcweir         DBG_ASSERT( !pModule || !pModule->GetMethods()->Find( aSubName, SbxCLASS_METHOD ), "Macro existiert schon!" );
402cdf0e10cSrcweir         pMethod = pModule ? BasicIDE::CreateMacro( pModule, aSubName ) : NULL;
403cdf0e10cSrcweir     }
404cdf0e10cSrcweir 
405cdf0e10cSrcweir 	return pMethod;
406cdf0e10cSrcweir }
407cdf0e10cSrcweir 
SaveSetCurEntry(SvTreeListBox & rBox,SvLBoxEntry * pEntry)408cdf0e10cSrcweir void MacroChooser::SaveSetCurEntry( SvTreeListBox& rBox, SvLBoxEntry* pEntry )
409cdf0e10cSrcweir {
410cdf0e10cSrcweir 	// Durch das Highlight wird das Edit sonst platt gemacht:
411cdf0e10cSrcweir 
412cdf0e10cSrcweir 	String aSaveText( aMacroNameEdit.GetText() );
413cdf0e10cSrcweir 	Selection aCurSel( aMacroNameEdit.GetSelection() );
414cdf0e10cSrcweir 
415cdf0e10cSrcweir 	rBox.SetCurEntry( pEntry );
416cdf0e10cSrcweir 	aMacroNameEdit.SetText( aSaveText );
417cdf0e10cSrcweir 	aMacroNameEdit.SetSelection( aCurSel );
418cdf0e10cSrcweir }
419cdf0e10cSrcweir 
CheckButtons()420cdf0e10cSrcweir void MacroChooser::CheckButtons()
421cdf0e10cSrcweir {
422cdf0e10cSrcweir 	SvLBoxEntry* pCurEntry = aBasicBox.GetCurEntry();
423cdf0e10cSrcweir     BasicEntryDescriptor aDesc( aBasicBox.GetEntryDescriptor( pCurEntry ) );
424cdf0e10cSrcweir 	SvLBoxEntry* pMacroEntry = aMacroBox.FirstSelected();
425cdf0e10cSrcweir 	SbMethod* pMethod = GetMacro();
426cdf0e10cSrcweir 
427cdf0e10cSrcweir     // check, if corresponding libraries are readonly
428cdf0e10cSrcweir     sal_Bool bReadOnly = sal_False;
429cdf0e10cSrcweir     sal_uInt16 nDepth = pCurEntry ? aBasicBox.GetModel()->GetDepth( pCurEntry ) : 0;
430cdf0e10cSrcweir     if ( nDepth == 1 || nDepth == 2 )
431cdf0e10cSrcweir     {
432cdf0e10cSrcweir         ScriptDocument aDocument( aDesc.GetDocument() );
433cdf0e10cSrcweir         ::rtl::OUString aOULibName( aDesc.GetLibName() );
434cdf0e10cSrcweir         Reference< script::XLibraryContainer2 > xModLibContainer( aDocument.getLibraryContainer( E_SCRIPTS ), UNO_QUERY );
435cdf0e10cSrcweir         Reference< script::XLibraryContainer2 > xDlgLibContainer( aDocument.getLibraryContainer( E_DIALOGS ), UNO_QUERY );
436cdf0e10cSrcweir         if ( ( xModLibContainer.is() && xModLibContainer->hasByName( aOULibName ) && xModLibContainer->isLibraryReadOnly( aOULibName ) ) ||
437cdf0e10cSrcweir                 ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aOULibName ) && xDlgLibContainer->isLibraryReadOnly( aOULibName ) ) )
438cdf0e10cSrcweir         {
439cdf0e10cSrcweir             bReadOnly = sal_True;
440cdf0e10cSrcweir         }
441cdf0e10cSrcweir     }
442cdf0e10cSrcweir 
443cdf0e10cSrcweir     if ( nMode != MACROCHOOSER_RECORDING )
444cdf0e10cSrcweir     {
445cdf0e10cSrcweir         // Run...
446cdf0e10cSrcweir         sal_Bool bEnable = pMethod ? sal_True : sal_False;
447cdf0e10cSrcweir         if ( ( nMode != MACROCHOOSER_CHOOSEONLY ) && StarBASIC::IsRunning() )
448cdf0e10cSrcweir             bEnable = sal_False;
449cdf0e10cSrcweir         EnableButton( aRunButton, bEnable );
450cdf0e10cSrcweir     }
451cdf0e10cSrcweir 
452cdf0e10cSrcweir 	// Organisieren immer moeglich ?
453cdf0e10cSrcweir 
454cdf0e10cSrcweir 	// Assign...
455cdf0e10cSrcweir 	EnableButton( aAssignButton, pMethod ? sal_True : sal_False );
456cdf0e10cSrcweir 
457cdf0e10cSrcweir 	// Edit...
458cdf0e10cSrcweir 	EnableButton( aEditButton, pMacroEntry ? sal_True : sal_False );
459cdf0e10cSrcweir 
460cdf0e10cSrcweir 	// aOrganizeButton
461cdf0e10cSrcweir 	EnableButton( aOrganizeButton, !StarBASIC::IsRunning() && ( nMode == MACROCHOOSER_ALL ));
462cdf0e10cSrcweir 
463cdf0e10cSrcweir 	// aNewDelButton....
464cdf0e10cSrcweir     bool bProtected = aBasicBox.IsEntryProtected( pCurEntry );
465cdf0e10cSrcweir     bool bShare = ( aDesc.GetLocation() == LIBRARY_LOCATION_SHARE );
466cdf0e10cSrcweir 	EnableButton( aNewDelButton,
467cdf0e10cSrcweir 		!StarBASIC::IsRunning() && ( nMode == MACROCHOOSER_ALL ) && !bProtected && !bReadOnly && !bShare );
468cdf0e10cSrcweir 	sal_Bool bPrev = bNewDelIsDel;
469cdf0e10cSrcweir 	bNewDelIsDel = pMethod ? sal_True : sal_False;
470cdf0e10cSrcweir     if ( ( bPrev != bNewDelIsDel ) && ( nMode == MACROCHOOSER_ALL ) )
471cdf0e10cSrcweir 	{
472cdf0e10cSrcweir 		String aBtnText( bNewDelIsDel ? IDEResId( RID_STR_BTNDEL) : IDEResId( RID_STR_BTNNEW ) );
473cdf0e10cSrcweir 		aNewDelButton.SetText( aBtnText );
474cdf0e10cSrcweir 	}
475cdf0e10cSrcweir 
476cdf0e10cSrcweir     if ( nMode == MACROCHOOSER_RECORDING )
477cdf0e10cSrcweir     {
478cdf0e10cSrcweir         // save button
479cdf0e10cSrcweir         if ( !bProtected && !bReadOnly && !bShare )
480cdf0e10cSrcweir             aRunButton.Enable();
481cdf0e10cSrcweir         else
482cdf0e10cSrcweir             aRunButton.Disable();
483cdf0e10cSrcweir 
484cdf0e10cSrcweir         // new library button
485cdf0e10cSrcweir         if ( !bShare )
486cdf0e10cSrcweir             aNewLibButton.Enable();
487cdf0e10cSrcweir         else
488cdf0e10cSrcweir             aNewLibButton.Disable();
489cdf0e10cSrcweir 
490cdf0e10cSrcweir         // new module button
491cdf0e10cSrcweir         if ( !bProtected && !bReadOnly && !bShare )
492cdf0e10cSrcweir             aNewModButton.Enable();
493cdf0e10cSrcweir         else
494cdf0e10cSrcweir             aNewModButton.Disable();
495cdf0e10cSrcweir     }
496cdf0e10cSrcweir }
497cdf0e10cSrcweir 
498cdf0e10cSrcweir 
499cdf0e10cSrcweir 
IMPL_LINK_INLINE_START(MacroChooser,MacroDoubleClickHdl,SvTreeListBox *,EMPTYARG)500cdf0e10cSrcweir IMPL_LINK_INLINE_START( MacroChooser, MacroDoubleClickHdl, SvTreeListBox *, EMPTYARG )
501cdf0e10cSrcweir {
502cdf0e10cSrcweir 	StoreMacroDescription();
503cdf0e10cSrcweir     if ( nMode == MACROCHOOSER_RECORDING )
504cdf0e10cSrcweir     {
505cdf0e10cSrcweir         SbMethod* pMethod = GetMacro();
506cdf0e10cSrcweir         if ( pMethod && !QueryReplaceMacro( pMethod->GetName(), this ) )
507cdf0e10cSrcweir             return 0;
508cdf0e10cSrcweir     }
509cdf0e10cSrcweir 
510cdf0e10cSrcweir 	EndDialog( MACRO_OK_RUN );
511cdf0e10cSrcweir 	return 0;
512cdf0e10cSrcweir }
IMPL_LINK_INLINE_END(MacroChooser,MacroDoubleClickHdl,SvTreeListBox *,EMPTYARG)513cdf0e10cSrcweir IMPL_LINK_INLINE_END( MacroChooser, MacroDoubleClickHdl, SvTreeListBox *, EMPTYARG )
514cdf0e10cSrcweir 
515cdf0e10cSrcweir IMPL_LINK( MacroChooser, MacroSelectHdl, SvTreeListBox *, pBox )
516cdf0e10cSrcweir {
517cdf0e10cSrcweir 	// Wird auch gerufen, wenn Deselektiert!
518cdf0e10cSrcweir 	// 2 Funktionsaufrufe in jedem SelectHdl, nur weil Olli
519cdf0e10cSrcweir 	// keinen separatren DeselctHdl einfuehren wollte:
520cdf0e10cSrcweir 	// Also: Feststellen, ob Select oder Deselect:
521cdf0e10cSrcweir 	if ( pBox->IsSelected( pBox->GetHdlEntry() ) )
522cdf0e10cSrcweir 	{
523cdf0e10cSrcweir 		UpdateFields();
524cdf0e10cSrcweir 		CheckButtons();
525cdf0e10cSrcweir 	}
526cdf0e10cSrcweir 	return 0;
527cdf0e10cSrcweir }
528cdf0e10cSrcweir 
IMPL_LINK(MacroChooser,BasicSelectHdl,SvTreeListBox *,pBox)529cdf0e10cSrcweir IMPL_LINK( MacroChooser, BasicSelectHdl, SvTreeListBox *, pBox )
530cdf0e10cSrcweir {
531cdf0e10cSrcweir 	static String aSpaceStr = String::CreateFromAscii(" ");
532cdf0e10cSrcweir 
533cdf0e10cSrcweir 	// Wird auch gerufen, wenn Deselektiert!
534cdf0e10cSrcweir 	// 2 Funktionsaufrufe in jedem SelectHdl, nur weil Olli
535cdf0e10cSrcweir 	// keinen separatren DeselctHdl einfuehren wollte:
536cdf0e10cSrcweir 	// Also: Feststellen, ob Select oder Deselect:
537cdf0e10cSrcweir 	if ( !pBox->IsSelected( pBox->GetHdlEntry() ) )
538cdf0e10cSrcweir 		return 0;
539cdf0e10cSrcweir 
540cdf0e10cSrcweir 	SbModule* pModule = aBasicBox.FindModule( aBasicBox.GetCurEntry() );
541cdf0e10cSrcweir 
542cdf0e10cSrcweir 	aMacroBox.Clear();
543cdf0e10cSrcweir 	if ( pModule )
544cdf0e10cSrcweir 	{
545cdf0e10cSrcweir 		String aStr = aMacrosInTxtBaseStr;
546cdf0e10cSrcweir 		aStr += aSpaceStr;
547cdf0e10cSrcweir 		aStr += pModule->GetName();
548cdf0e10cSrcweir 
549cdf0e10cSrcweir 		aMacrosInTxt.SetText( aStr );
550cdf0e10cSrcweir 
551cdf0e10cSrcweir 		// Die Macros sollen in der Reihenfolge angezeigt werden,
552cdf0e10cSrcweir 		// wie sie im Modul stehen.
553cdf0e10cSrcweir 		MacroList aMacros;
554cdf0e10cSrcweir 		sal_uInt16 nMacroCount = pModule->GetMethods()->Count();
555cdf0e10cSrcweir 		sal_uInt16 nRealMacroCount = 0;
556cdf0e10cSrcweir 		sal_uInt16 iMeth;
557cdf0e10cSrcweir 		for ( iMeth = 0; iMeth  < nMacroCount; iMeth++ )
558cdf0e10cSrcweir 		{
559cdf0e10cSrcweir 			SbMethod* pMethod = (SbMethod*)pModule->GetMethods()->Get( iMeth );
560cdf0e10cSrcweir 			if( pMethod->IsHidden() )
561cdf0e10cSrcweir 				continue;
562cdf0e10cSrcweir 			++nRealMacroCount;
563cdf0e10cSrcweir 			DBG_ASSERT( pMethod, "Methode nicht gefunden! (NULL)" );
564cdf0e10cSrcweir 			sal_uLong nPos = LIST_APPEND;
565cdf0e10cSrcweir 			// Eventuell weiter vorne ?
566cdf0e10cSrcweir 			sal_uInt16 nStart, nEnd;
567cdf0e10cSrcweir 			pMethod->GetLineRange( nStart, nEnd );
568cdf0e10cSrcweir 			for ( sal_uLong n = 0; n < aMacros.Count(); n++ )
569cdf0e10cSrcweir 			{
570cdf0e10cSrcweir 				sal_uInt16 nS, nE;
571cdf0e10cSrcweir 				SbMethod* pM = aMacros.GetObject( n );
572cdf0e10cSrcweir 				DBG_ASSERT( pM, "Macro nicht in Liste ?!" );
573cdf0e10cSrcweir 				pM->GetLineRange( nS, nE );
574cdf0e10cSrcweir 				if ( nS > nStart )
575cdf0e10cSrcweir 				{
576cdf0e10cSrcweir 					nPos = n;
577cdf0e10cSrcweir 					break;
578cdf0e10cSrcweir 				}
579cdf0e10cSrcweir 			}
580cdf0e10cSrcweir 			aMacros.Insert( pMethod, nPos );
581cdf0e10cSrcweir 		}
582cdf0e10cSrcweir 
583cdf0e10cSrcweir 		aMacroBox.SetUpdateMode( sal_False );
584cdf0e10cSrcweir 		for ( iMeth = 0; iMeth < nRealMacroCount; iMeth++ )
585cdf0e10cSrcweir 			aMacroBox.InsertEntry( aMacros.GetObject( iMeth )->GetName() );
586cdf0e10cSrcweir 		aMacroBox.SetUpdateMode( sal_True );
587cdf0e10cSrcweir 
588cdf0e10cSrcweir 		if ( aMacroBox.GetEntryCount() )
589cdf0e10cSrcweir 		{
590cdf0e10cSrcweir 			SvLBoxEntry* pEntry = aMacroBox.GetEntry( 0 );
591cdf0e10cSrcweir 			DBG_ASSERT( pEntry, "Entry ?!" );
592cdf0e10cSrcweir 			aMacroBox.SetCurEntry( pEntry );
593cdf0e10cSrcweir 		}
594cdf0e10cSrcweir 	}
595cdf0e10cSrcweir 
596cdf0e10cSrcweir 	UpdateFields();
597cdf0e10cSrcweir 	CheckButtons();
598cdf0e10cSrcweir 	return 0;
599cdf0e10cSrcweir }
600cdf0e10cSrcweir 
601cdf0e10cSrcweir 
602cdf0e10cSrcweir 
IMPL_LINK(MacroChooser,EditModifyHdl,Edit *,pEdit)603cdf0e10cSrcweir IMPL_LINK( MacroChooser, EditModifyHdl, Edit *, pEdit )
604cdf0e10cSrcweir {
605cdf0e10cSrcweir 	(void)pEdit;
606cdf0e10cSrcweir 
607cdf0e10cSrcweir 	// Das Modul, in dem bei Neu das Macro landet, selektieren,
608cdf0e10cSrcweir 	// wenn BasicManager oder Lib selektiert.
609cdf0e10cSrcweir 	SvLBoxEntry* pCurEntry = aBasicBox.GetCurEntry();
610cdf0e10cSrcweir 	if ( pCurEntry )
611cdf0e10cSrcweir 	{
612cdf0e10cSrcweir 		sal_uInt16 nDepth = aBasicBox.GetModel()->GetDepth( pCurEntry );
613cdf0e10cSrcweir 		if ( ( nDepth == 1 ) && ( aBasicBox.IsEntryProtected( pCurEntry ) ) )
614cdf0e10cSrcweir 		{
615cdf0e10cSrcweir 			// Dann auf die entsprechende Std-Lib stellen...
616cdf0e10cSrcweir 			SvLBoxEntry* pManagerEntry = aBasicBox.GetModel()->GetParent( pCurEntry );
617cdf0e10cSrcweir 			pCurEntry = aBasicBox.GetModel()->FirstChild( pManagerEntry );
618cdf0e10cSrcweir 		}
619cdf0e10cSrcweir 		if ( nDepth < 2 )
620cdf0e10cSrcweir 		{
621cdf0e10cSrcweir 			SvLBoxEntry* pNewEntry = pCurEntry;
622cdf0e10cSrcweir 			while ( pCurEntry && ( nDepth < 2 ) )
623cdf0e10cSrcweir 			{
624cdf0e10cSrcweir 				pCurEntry = aBasicBox.FirstChild( pCurEntry );
625cdf0e10cSrcweir 				if ( pCurEntry )
626cdf0e10cSrcweir 				{
627cdf0e10cSrcweir 					pNewEntry = pCurEntry;
628cdf0e10cSrcweir 					nDepth = aBasicBox.GetModel()->GetDepth( pCurEntry );
629cdf0e10cSrcweir 				}
630cdf0e10cSrcweir 			}
631cdf0e10cSrcweir 			SaveSetCurEntry( aBasicBox, pNewEntry );
632cdf0e10cSrcweir 		}
633cdf0e10cSrcweir 		if ( aMacroBox.GetEntryCount() )
634cdf0e10cSrcweir 		{
635cdf0e10cSrcweir 			String aEdtText( aMacroNameEdit.GetText() );
636cdf0e10cSrcweir 			sal_Bool bFound = sal_False;
637cdf0e10cSrcweir 			for ( sal_uInt16 n = 0; n < aMacroBox.GetEntryCount(); n++ )
638cdf0e10cSrcweir 			{
639cdf0e10cSrcweir 				SvLBoxEntry* pEntry = aMacroBox.GetEntry( n );
640cdf0e10cSrcweir 				DBG_ASSERT( pEntry, "Entry ?!" );
641cdf0e10cSrcweir 				if ( aMacroBox.GetEntryText( pEntry ).CompareIgnoreCaseToAscii( aEdtText ) == COMPARE_EQUAL )
642cdf0e10cSrcweir 				{
643cdf0e10cSrcweir 					SaveSetCurEntry( aMacroBox, pEntry );
644cdf0e10cSrcweir 					bFound = sal_True;
645cdf0e10cSrcweir 					break;
646cdf0e10cSrcweir 				}
647cdf0e10cSrcweir 			}
648cdf0e10cSrcweir 			if ( !bFound )
649cdf0e10cSrcweir 			{
650cdf0e10cSrcweir 				SvLBoxEntry* pEntry = aMacroBox.FirstSelected();
651*30acf5e8Spfg 				// If there is the entry ->Select ->Description...
652cdf0e10cSrcweir 				if ( pEntry )
653cdf0e10cSrcweir 					aMacroBox.Select( pEntry, sal_False );
654cdf0e10cSrcweir 			}
655cdf0e10cSrcweir 		}
656cdf0e10cSrcweir 	}
657cdf0e10cSrcweir 
658cdf0e10cSrcweir 	CheckButtons();
659cdf0e10cSrcweir 	return 0;
660cdf0e10cSrcweir }
661cdf0e10cSrcweir 
662cdf0e10cSrcweir 
663cdf0e10cSrcweir 
IMPL_LINK(MacroChooser,ButtonHdl,Button *,pButton)664cdf0e10cSrcweir IMPL_LINK( MacroChooser, ButtonHdl, Button *, pButton )
665cdf0e10cSrcweir {
666cdf0e10cSrcweir 	// ausser bei New/Record wird die Description durch LoseFocus uebernommen.
667cdf0e10cSrcweir 	if ( pButton == &aRunButton )
668cdf0e10cSrcweir 	{
669cdf0e10cSrcweir 		StoreMacroDescription();
670cdf0e10cSrcweir 
671cdf0e10cSrcweir         // #116444# check security settings before macro execution
672cdf0e10cSrcweir         if ( nMode == MACROCHOOSER_ALL )
673cdf0e10cSrcweir         {
674cdf0e10cSrcweir             SbMethod* pMethod = GetMacro();
675cdf0e10cSrcweir             SbModule* pModule = pMethod ? pMethod->GetModule() : NULL;
676cdf0e10cSrcweir             StarBASIC* pBasic = pModule ? (StarBASIC*)pModule->GetParent() : NULL;
677cdf0e10cSrcweir             BasicManager* pBasMgr = pBasic ? BasicIDE::FindBasicManager( pBasic ) : NULL;
678cdf0e10cSrcweir             if ( pBasMgr )
679cdf0e10cSrcweir             {
680cdf0e10cSrcweir                 ScriptDocument aDocument( ScriptDocument::getDocumentForBasicManager( pBasMgr ) );
681cdf0e10cSrcweir                 if ( aDocument.isDocument() && !aDocument.allowMacros() )
682cdf0e10cSrcweir                 {
683cdf0e10cSrcweir                     WarningBox( this, WB_OK, String( IDEResId( RID_STR_CANNOTRUNMACRO ) ) ).Execute();
684cdf0e10cSrcweir                     return 0;
685cdf0e10cSrcweir                 }
686cdf0e10cSrcweir             }
687cdf0e10cSrcweir         }
688cdf0e10cSrcweir         else if ( nMode == MACROCHOOSER_RECORDING )
689cdf0e10cSrcweir         {
690cdf0e10cSrcweir 			sal_Bool bValid = BasicIDE::IsValidSbxName( aMacroNameEdit.GetText() );
691cdf0e10cSrcweir 			if ( !bValid )
692cdf0e10cSrcweir 			{
693cdf0e10cSrcweir 				ErrorBox( this, WB_OK | WB_DEF_OK, String( IDEResId( RID_STR_BADSBXNAME ) ) ).Execute();
694cdf0e10cSrcweir 				aMacroNameEdit.SetSelection( Selection( 0, aMacroNameEdit.GetText().Len() ) );
695cdf0e10cSrcweir 				aMacroNameEdit.GrabFocus();
696cdf0e10cSrcweir 				return 0;
697cdf0e10cSrcweir 			}
698cdf0e10cSrcweir 
699cdf0e10cSrcweir             SbMethod* pMethod = GetMacro();
700cdf0e10cSrcweir             if ( pMethod && !QueryReplaceMacro( pMethod->GetName(), this ) )
701cdf0e10cSrcweir                 return 0;
702cdf0e10cSrcweir         }
703cdf0e10cSrcweir 
704cdf0e10cSrcweir         EndDialog( MACRO_OK_RUN );
705cdf0e10cSrcweir 	}
706cdf0e10cSrcweir 	else if ( pButton == &aCloseButton )
707cdf0e10cSrcweir 	{
708cdf0e10cSrcweir         StoreMacroDescription();
709cdf0e10cSrcweir 		EndDialog( MACRO_CLOSE );
710cdf0e10cSrcweir 	}
711cdf0e10cSrcweir 	else if ( ( pButton == &aEditButton ) || ( pButton == &aNewDelButton ) )
712cdf0e10cSrcweir 	{
713cdf0e10cSrcweir         SvLBoxEntry* pCurEntry = aBasicBox.GetCurEntry();
714cdf0e10cSrcweir         BasicEntryDescriptor aDesc( aBasicBox.GetEntryDescriptor( pCurEntry ) );
715cdf0e10cSrcweir         ScriptDocument aDocument( aDesc.GetDocument() );
716cdf0e10cSrcweir         DBG_ASSERT( aDocument.isAlive(), "MacroChooser::ButtonHdl: no document, or document is dead!" );
717cdf0e10cSrcweir         if ( !aDocument.isAlive() )
718cdf0e10cSrcweir             return 0;
719cdf0e10cSrcweir         BasicManager* pBasMgr = aDocument.getBasicManager();
720cdf0e10cSrcweir         String aLib( aDesc.GetLibName() );
721cdf0e10cSrcweir         String aMod( aDesc.GetName() );
722cdf0e10cSrcweir         // extract the module name from the string like "Sheet1 (Example1)"
723cdf0e10cSrcweir         if( aDesc.GetLibSubName().Equals( String( IDEResId( RID_STR_DOCUMENT_OBJECTS ) ) ) )
724cdf0e10cSrcweir         {
725cdf0e10cSrcweir             sal_uInt16 nIndex = 0;
726cdf0e10cSrcweir             aMod = aMod.GetToken( 0, ' ', nIndex );
727cdf0e10cSrcweir         }
728cdf0e10cSrcweir         String aSub( aDesc.GetMethodName() );
729cdf0e10cSrcweir 		SfxMacroInfoItem aInfoItem( SID_BASICIDE_ARG_MACROINFO, pBasMgr, aLib, aMod, aSub, String() );
730cdf0e10cSrcweir 		if ( pButton == &aEditButton )
731cdf0e10cSrcweir 		{
732cdf0e10cSrcweir 			SvLBoxEntry* pEntry = aMacroBox.FirstSelected();
733cdf0e10cSrcweir 			if ( pEntry )
734cdf0e10cSrcweir 				aInfoItem.SetMethod( aMacroBox.GetEntryText( pEntry ) );
735cdf0e10cSrcweir 			StoreMacroDescription();
736cdf0e10cSrcweir             SfxAllItemSet aArgs( SFX_APP()->GetPool() );
737cdf0e10cSrcweir             SfxRequest aRequest( SID_BASICIDE_APPEAR, SFX_CALLMODE_SYNCHRON, aArgs );
738cdf0e10cSrcweir             SFX_APP()->ExecuteSlot( aRequest );
739cdf0e10cSrcweir 
740cdf0e10cSrcweir             BasicIDEShell* pIDEShell = IDE_DLL()->GetShell();
741cdf0e10cSrcweir             SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL;
742cdf0e10cSrcweir             SfxDispatcher* pDispatcher = pViewFrame ? pViewFrame->GetDispatcher() : NULL;
743cdf0e10cSrcweir 			if( pDispatcher )
744cdf0e10cSrcweir                 pDispatcher->Execute( SID_BASICIDE_EDITMACRO, SFX_CALLMODE_ASYNCHRON, &aInfoItem, 0L );
745cdf0e10cSrcweir 			EndDialog( MACRO_EDIT );
746cdf0e10cSrcweir 		}
747cdf0e10cSrcweir 		else
748cdf0e10cSrcweir 		{
749cdf0e10cSrcweir 			if ( bNewDelIsDel )
750cdf0e10cSrcweir 			{
751cdf0e10cSrcweir 				DeleteMacro();
752cdf0e10cSrcweir 				BasicIDEShell* pIDEShell = IDE_DLL()->GetShell();
753cdf0e10cSrcweir 				SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL;
754cdf0e10cSrcweir                 SfxDispatcher* pDispatcher = pViewFrame ? pViewFrame->GetDispatcher() : NULL;
755cdf0e10cSrcweir 				if( pDispatcher )
756cdf0e10cSrcweir 				{
757cdf0e10cSrcweir 					pDispatcher->Execute( SID_BASICIDE_UPDATEMODULESOURCE,
758cdf0e10cSrcweir 										  SFX_CALLMODE_SYNCHRON, &aInfoItem, 0L );
759cdf0e10cSrcweir 				}
760cdf0e10cSrcweir 				CheckButtons();
761cdf0e10cSrcweir 				UpdateFields();
762cdf0e10cSrcweir                 //if ( aMacroBox.GetCurEntry() )	// OV-Bug ?
763cdf0e10cSrcweir 				//	aMacroBox.Select( aMacroBox.GetCurEntry() );
764cdf0e10cSrcweir 			}
765cdf0e10cSrcweir 			else
766cdf0e10cSrcweir 			{
767cdf0e10cSrcweir 				sal_Bool bValid = BasicIDE::IsValidSbxName( aMacroNameEdit.GetText() );
768cdf0e10cSrcweir 				if ( !bValid )
769cdf0e10cSrcweir 				{
770cdf0e10cSrcweir 					ErrorBox( this, WB_OK | WB_DEF_OK, String( IDEResId( RID_STR_BADSBXNAME ) ) ).Execute();
771cdf0e10cSrcweir 					aMacroNameEdit.SetSelection( Selection( 0, aMacroNameEdit.GetText().Len() ) );
772cdf0e10cSrcweir 					aMacroNameEdit.GrabFocus();
773cdf0e10cSrcweir 					return 1;
774cdf0e10cSrcweir 				}
775cdf0e10cSrcweir 				SbMethod* pMethod = CreateMacro();
776cdf0e10cSrcweir 				if ( pMethod )
777cdf0e10cSrcweir 				{
778cdf0e10cSrcweir 					aInfoItem.SetMethod( pMethod->GetName() );
779cdf0e10cSrcweir 					aInfoItem.SetModule( pMethod->GetModule()->GetName() );
780cdf0e10cSrcweir 					aInfoItem.SetLib( pMethod->GetModule()->GetParent()->GetName() );
781cdf0e10cSrcweir                     SfxAllItemSet aArgs( SFX_APP()->GetPool() );
782cdf0e10cSrcweir                     SfxRequest aRequest( SID_BASICIDE_APPEAR, SFX_CALLMODE_SYNCHRON, aArgs );
783cdf0e10cSrcweir                     SFX_APP()->ExecuteSlot( aRequest );
784cdf0e10cSrcweir 
785cdf0e10cSrcweir                     BasicIDEShell* pIDEShell = IDE_DLL()->GetShell();
786cdf0e10cSrcweir                     SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL;
787cdf0e10cSrcweir                     SfxDispatcher* pDispatcher = pViewFrame ? pViewFrame->GetDispatcher() : NULL;
788cdf0e10cSrcweir                     if ( pDispatcher )
789cdf0e10cSrcweir                         pDispatcher->Execute( SID_BASICIDE_EDITMACRO, SFX_CALLMODE_ASYNCHRON, &aInfoItem, 0L );
790cdf0e10cSrcweir 					StoreMacroDescription();
791cdf0e10cSrcweir 					EndDialog( MACRO_NEW );
792cdf0e10cSrcweir 				}
793cdf0e10cSrcweir 			}
794cdf0e10cSrcweir 		}
795cdf0e10cSrcweir 	}
796cdf0e10cSrcweir 
797cdf0e10cSrcweir 	else if ( pButton == &aAssignButton )
798cdf0e10cSrcweir 	{
799cdf0e10cSrcweir         SvLBoxEntry* pCurEntry = aBasicBox.GetCurEntry();
800cdf0e10cSrcweir         BasicEntryDescriptor aDesc( aBasicBox.GetEntryDescriptor( pCurEntry ) );
801cdf0e10cSrcweir         ScriptDocument aDocument( aDesc.GetDocument() );
802cdf0e10cSrcweir         DBG_ASSERT( aDocument.isAlive(), "MacroChooser::ButtonHdl: no document, or document is dead!" );
803cdf0e10cSrcweir         if ( !aDocument.isAlive() )
804cdf0e10cSrcweir             return 0;
805cdf0e10cSrcweir         BasicManager* pBasMgr = aDocument.getBasicManager();
806cdf0e10cSrcweir         String aLib( aDesc.GetLibName() );
807cdf0e10cSrcweir         String aMod( aDesc.GetName() );
808cdf0e10cSrcweir 		String aSub( aMacroNameEdit.GetText() );
809cdf0e10cSrcweir 		SbMethod* pMethod = GetMacro();
810cdf0e10cSrcweir 		DBG_ASSERT( pBasMgr, "BasMgr?" );
811cdf0e10cSrcweir 		DBG_ASSERT( pMethod, "Method?" );
812cdf0e10cSrcweir 		String aComment( GetInfo( pMethod ) );
813cdf0e10cSrcweir 		SfxMacroInfoItem aItem( SID_MACROINFO, pBasMgr, aLib, aMod, aSub, aComment );
814cdf0e10cSrcweir         SfxAllItemSet Args( SFX_APP()->GetPool() );
815cdf0e10cSrcweir         SfxRequest aRequest( SID_CONFIG, SFX_CALLMODE_SYNCHRON, Args );
816cdf0e10cSrcweir         aRequest.AppendItem( aItem );
817cdf0e10cSrcweir         SFX_APP()->ExecuteSlot( aRequest );
818cdf0e10cSrcweir 	}
819cdf0e10cSrcweir 	else if ( pButton == &aNewLibButton )
820cdf0e10cSrcweir 	{
821cdf0e10cSrcweir         SvLBoxEntry* pCurEntry = aBasicBox.GetCurEntry();
822cdf0e10cSrcweir         BasicEntryDescriptor aDesc( aBasicBox.GetEntryDescriptor( pCurEntry ) );
823cdf0e10cSrcweir         ScriptDocument aDocument( aDesc.GetDocument() );
824cdf0e10cSrcweir 		createLibImpl( static_cast<Window*>( this ), aDocument, NULL, &aBasicBox );
825cdf0e10cSrcweir 	}
826cdf0e10cSrcweir 	else if ( pButton == &aNewModButton )
827cdf0e10cSrcweir 	{
828cdf0e10cSrcweir         SvLBoxEntry* pCurEntry = aBasicBox.GetCurEntry();
829cdf0e10cSrcweir         BasicEntryDescriptor aDesc( aBasicBox.GetEntryDescriptor( pCurEntry ) );
830cdf0e10cSrcweir         ScriptDocument aDocument( aDesc.GetDocument() );
831cdf0e10cSrcweir         String aLibName( aDesc.GetLibName() );
832cdf0e10cSrcweir 		String aModName;
833cdf0e10cSrcweir 		createModImpl( static_cast<Window*>( this ), aDocument,
834cdf0e10cSrcweir 			aBasicBox, aLibName, aModName, true );
835cdf0e10cSrcweir 	}
836cdf0e10cSrcweir 	else if ( pButton == &aOrganizeButton )
837cdf0e10cSrcweir 	{
838cdf0e10cSrcweir 		StoreMacroDescription();
839cdf0e10cSrcweir 
840cdf0e10cSrcweir         BasicEntryDescriptor aDesc( aBasicBox.GetEntryDescriptor( aBasicBox.FirstSelected() ) );
841cdf0e10cSrcweir 		OrganizeDialog* pDlg = new OrganizeDialog( this, 0, aDesc );
842cdf0e10cSrcweir 		sal_uInt16 nRet = pDlg->Execute();
843cdf0e10cSrcweir 		delete pDlg;
844cdf0e10cSrcweir 
845cdf0e10cSrcweir 		if ( nRet )	// Nicht einfach nur geschlossen
846cdf0e10cSrcweir 		{
847cdf0e10cSrcweir 			EndDialog( MACRO_EDIT );
848cdf0e10cSrcweir 			return 0;
849cdf0e10cSrcweir 		}
850cdf0e10cSrcweir 
851cdf0e10cSrcweir         BasicIDEShell* pIDEShell = IDE_DLL()->GetShell();
852cdf0e10cSrcweir         if ( pIDEShell && pIDEShell->IsAppBasicModified() )
853cdf0e10cSrcweir 			bForceStoreBasic = sal_True;
854cdf0e10cSrcweir 
855cdf0e10cSrcweir         aBasicBox.UpdateEntries();
856cdf0e10cSrcweir 	}
857cdf0e10cSrcweir 	return 0;
858cdf0e10cSrcweir }
859cdf0e10cSrcweir 
860cdf0e10cSrcweir 
861cdf0e10cSrcweir 
UpdateFields()862cdf0e10cSrcweir void MacroChooser::UpdateFields()
863cdf0e10cSrcweir {
864cdf0e10cSrcweir 	SvLBoxEntry*	pMacroEntry = aMacroBox.GetCurEntry();
865cdf0e10cSrcweir 	String			aEmptyStr;
866cdf0e10cSrcweir 
867cdf0e10cSrcweir 	aMacroNameEdit.SetText( aEmptyStr );
868cdf0e10cSrcweir 	if ( pMacroEntry )
869cdf0e10cSrcweir 		aMacroNameEdit.SetText( aMacroBox.GetEntryText( pMacroEntry ) );
870cdf0e10cSrcweir }
871cdf0e10cSrcweir 
SetMode(sal_uInt16 nM)872cdf0e10cSrcweir void MacroChooser::SetMode( sal_uInt16 nM )
873cdf0e10cSrcweir {
874cdf0e10cSrcweir 	nMode = nM;
875cdf0e10cSrcweir 	if ( nMode == MACROCHOOSER_ALL )
876cdf0e10cSrcweir 	{
877cdf0e10cSrcweir 		aRunButton.SetText( String( IDEResId( RID_STR_RUN ) ) );
878cdf0e10cSrcweir 		EnableButton( aNewDelButton, sal_True );
879cdf0e10cSrcweir 		EnableButton( aOrganizeButton, sal_True );
880cdf0e10cSrcweir 	}
881cdf0e10cSrcweir 	else if ( nMode == MACROCHOOSER_CHOOSEONLY )
882cdf0e10cSrcweir 	{
883cdf0e10cSrcweir 		aRunButton.SetText( String( IDEResId( RID_STR_CHOOSE ) ) );
884cdf0e10cSrcweir 		EnableButton( aNewDelButton, sal_False );
885cdf0e10cSrcweir 		EnableButton( aOrganizeButton, sal_False );
886cdf0e10cSrcweir 	}
887cdf0e10cSrcweir     else if ( nMode == MACROCHOOSER_RECORDING )
888cdf0e10cSrcweir 	{
889cdf0e10cSrcweir         aRunButton.SetText( String( IDEResId( RID_STR_RECORD ) ) );
890cdf0e10cSrcweir 		EnableButton( aNewDelButton, sal_False );
891cdf0e10cSrcweir 		EnableButton( aOrganizeButton, sal_False );
892cdf0e10cSrcweir 
893cdf0e10cSrcweir 		aAssignButton.Hide();
894cdf0e10cSrcweir 		aEditButton.Hide();
895cdf0e10cSrcweir 		aNewDelButton.Hide();
896cdf0e10cSrcweir 		aOrganizeButton.Hide();
897cdf0e10cSrcweir 		aMacroFromTxT.Hide();
898cdf0e10cSrcweir 
899cdf0e10cSrcweir 		aNewLibButton.Show();
900cdf0e10cSrcweir 		aNewModButton.Show();
901cdf0e10cSrcweir 		aMacrosSaveInTxt.Show();
902cdf0e10cSrcweir 
903cdf0e10cSrcweir 		Point aHelpPos = aHelpButton.GetPosPixel();
904cdf0e10cSrcweir 		Point aHelpPosLogic = PixelToLogic( aHelpPos, MapMode(MAP_APPFONT) );
905cdf0e10cSrcweir 		aHelpPosLogic.Y() -= 34;
906cdf0e10cSrcweir 		aHelpPos = LogicToPixel( aHelpPosLogic, MapMode(MAP_APPFONT) );
907cdf0e10cSrcweir 		aHelpButton.SetPosPixel( aHelpPos );
908cdf0e10cSrcweir 	}
909cdf0e10cSrcweir 	CheckButtons();
910cdf0e10cSrcweir }
911cdf0e10cSrcweir 
GetInfo(SbxVariable * pVar)912cdf0e10cSrcweir String MacroChooser::GetInfo( SbxVariable* pVar )
913cdf0e10cSrcweir {
914cdf0e10cSrcweir 	String aComment;
915cdf0e10cSrcweir 	SbxInfoRef xInfo = pVar->GetInfo();
916cdf0e10cSrcweir 	if ( xInfo.Is() )
917cdf0e10cSrcweir 		aComment = xInfo->GetComment();
918cdf0e10cSrcweir 	return aComment;
919cdf0e10cSrcweir }
920cdf0e10cSrcweir 
921