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