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: */
|