Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "basidesh.hrc"
21 : #include "helpid.hrc"
22 :
23 : #include "baside2.hxx"
24 : #include "baside3.hxx"
25 : #include "basobj.hxx"
26 : #include "docsignature.hxx"
27 : #include "iderdll.hxx"
28 : #include "iderdll2.hxx"
29 : #include "localizationmgr.hxx"
30 : #include "managelang.hxx"
31 :
32 : #include <basic/basmgr.hxx>
33 : #include <basic/sbmeth.hxx>
34 : #include <com/sun/star/frame/XLayoutManager.hpp>
35 : #include <com/sun/star/script/XLibraryContainerPassword.hpp>
36 : #include <com/sun/star/task/XStatusIndicatorFactory.hpp>
37 : #include <sfx2/childwin.hxx>
38 : #include <sfx2/docfac.hxx>
39 : #include <sfx2/dinfdlg.hxx>
40 : #include <sfx2/dispatch.hxx>
41 : #include <sfx2/minfitem.hxx>
42 : #include <sfx2/objface.hxx>
43 : #include <sfx2/printer.hxx>
44 : #include <sfx2/request.hxx>
45 : #include <svl/aeitem.hxx>
46 : #include <svl/intitem.hxx>
47 : #include <svl/srchitem.hxx>
48 : #include <svl/visitem.hxx>
49 : #include <svl/whiter.hxx>
50 : #include <vcl/xtextedt.hxx>
51 : #include <vcl/msgbox.hxx>
52 :
53 : namespace basctl
54 : {
55 :
56 : using namespace ::com::sun::star;
57 : using namespace ::com::sun::star::uno;
58 : using namespace ::com::sun::star::frame;
59 :
60 0 : void Shell::ExecuteCurrent( SfxRequest& rReq )
61 : {
62 0 : if ( !pCurWin )
63 0 : return;
64 :
65 0 : switch ( rReq.GetSlot() )
66 : {
67 : case SID_BASICIDE_HIDECURPAGE:
68 : {
69 0 : pCurWin->StoreData();
70 0 : RemoveWindow( pCurWin, false );
71 : }
72 0 : break;
73 : case SID_BASICIDE_RENAMECURRENT:
74 : {
75 0 : pTabBar->StartEditMode( pTabBar->GetCurPageId() );
76 : }
77 0 : break;
78 : case FID_SEARCH_NOW:
79 : {
80 0 : if (!pCurWin->HasActiveEditor())
81 0 : break;
82 : DBG_ASSERT( rReq.GetArgs(), "arguments expected" );
83 0 : SfxItemSet const& rArgs = *rReq.GetArgs();
84 : // unfortunately I don't know the ID:
85 0 : sal_uInt16 nWhich = rArgs.GetWhichByPos( 0 );
86 : DBG_ASSERT( nWhich, "Wich fuer SearchItem ?" );
87 0 : SfxPoolItem const& rItem = rArgs.Get(nWhich);
88 : DBG_ASSERT(dynamic_cast<SvxSearchItem const*>(&rItem), "no searchitem!");
89 0 : SvxSearchItem const& rSearchItem = static_cast<SvxSearchItem const&>(rItem);
90 : // memorize item because of the adjustments...
91 0 : GetExtraData()->SetSearchItem(rSearchItem);
92 0 : sal_Int32 nFound = 0;
93 0 : bool bCanceled = false;
94 0 : if (rSearchItem.GetCommand() == SVX_SEARCHCMD_REPLACE_ALL)
95 : {
96 0 : sal_uInt16 nActModWindows = 0;
97 0 : for (WindowTableIt it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
98 : {
99 0 : BaseWindow* pWin = it->second;
100 0 : if (pWin->HasActiveEditor())
101 0 : nActModWindows++;
102 : }
103 :
104 0 : if ( nActModWindows <= 1 || ( !rSearchItem.GetSelection() && QueryBox( pCurWin, WB_YES_NO|WB_DEF_YES, String(IDEResId(RID_STR_SEARCHALLMODULES)) ).Execute() == RET_YES ) )
105 : {
106 0 : for (WindowTableIt it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
107 : {
108 0 : BaseWindow* pWin = it->second;
109 0 : nFound += pWin->StartSearchAndReplace(rSearchItem);
110 : }
111 : }
112 : else
113 0 : nFound = pCurWin->StartSearchAndReplace(rSearchItem);
114 :
115 0 : OUString aReplStr(IDE_RESSTR(RID_STR_SEARCHREPLACES));
116 0 : aReplStr = aReplStr.replaceAll("XX", OUString::valueOf(nFound));
117 0 : InfoBox( pCurWin, aReplStr ).Execute();
118 : }
119 : else
120 : {
121 0 : nFound = pCurWin->StartSearchAndReplace(rSearchItem);
122 0 : if ( !nFound && !rSearchItem.GetSelection() )
123 : {
124 : // search other modules...
125 0 : bool bChangeCurWindow = false;
126 0 : WindowTableIt it;
127 0 : for (it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
128 0 : if (it->second == pCurWin)
129 0 : break;
130 0 : if (it != aWindowTable.end())
131 0 : ++it;
132 0 : BaseWindow* pWin = it != aWindowTable.end() ? it->second : 0;
133 :
134 0 : bool bSearchedFromStart = false;
135 0 : while ( !nFound && !bCanceled && ( pWin || !bSearchedFromStart ) )
136 : {
137 0 : if ( !pWin )
138 : {
139 0 : SfxViewFrame* pViewFrame = GetViewFrame();
140 0 : SfxChildWindow* pChildWin = pViewFrame ? pViewFrame->GetChildWindow( SID_SEARCH_DLG ) : NULL;
141 0 : Window* pParent = pChildWin ? pChildWin->GetWindow() : NULL;
142 0 : QueryBox aQuery(pParent, WB_YES_NO|WB_DEF_YES, IDE_RESSTR(RID_STR_SEARCHFROMSTART));
143 0 : if ( aQuery.Execute() == RET_YES )
144 : {
145 0 : it = aWindowTable.begin();
146 0 : if ( it != aWindowTable.end() )
147 0 : pWin = it->second;
148 0 : bSearchedFromStart = true;
149 : }
150 : else
151 0 : bCanceled = true;
152 : }
153 :
154 0 : if (pWin && pWin->HasActiveEditor())
155 : {
156 0 : if ( pWin != pCurWin )
157 : {
158 0 : if ( pCurWin )
159 0 : pWin->SetSizePixel( pCurWin->GetSizePixel() );
160 0 : nFound = pWin->StartSearchAndReplace(rSearchItem, true);
161 : }
162 0 : if ( nFound )
163 : {
164 0 : bChangeCurWindow = true;
165 0 : break;
166 : }
167 : }
168 0 : if ( pWin && ( pWin != pCurWin ) )
169 : {
170 0 : if ( it != aWindowTable.end() )
171 0 : ++it;
172 0 : pWin = it != aWindowTable.end() ? it->second : 0;
173 : }
174 : else
175 0 : pWin = 0;
176 : }
177 0 : if ( !nFound && bSearchedFromStart )
178 0 : nFound = pCurWin->StartSearchAndReplace(rSearchItem, true);
179 0 : if ( bChangeCurWindow )
180 0 : SetCurWindow( pWin, true );
181 : }
182 0 : if ( !nFound && !bCanceled )
183 0 : InfoBox( pCurWin, String(IDEResId(RID_STR_SEARCHNOTFOUND)) ).Execute();
184 : }
185 :
186 0 : rReq.Done();
187 : }
188 0 : break;
189 : case SID_UNDO:
190 : case SID_REDO:
191 0 : if ( GetUndoManager() && pCurWin->AllowUndo() )
192 0 : GetViewFrame()->ExecuteSlot( rReq );
193 0 : break;
194 : default:
195 0 : pCurWin->ExecuteCommand( rReq );
196 : }
197 : }
198 :
199 : // no matter who's at the top, influence on the shell:
200 0 : void Shell::ExecuteGlobal( SfxRequest& rReq )
201 : {
202 0 : sal_uInt16 nSlot = rReq.GetSlot();
203 0 : switch ( nSlot )
204 : {
205 : case SID_BASICSTOP:
206 : {
207 : // maybe do not simply stop if on breakpoint!
208 0 : if (ModulWindow* pMCurWin = dynamic_cast<ModulWindow*>(pCurWin))
209 0 : pMCurWin->BasicStop();
210 0 : StopBasic();
211 : }
212 0 : break;
213 :
214 : case SID_SAVEDOC:
215 : {
216 0 : if ( pCurWin )
217 : {
218 : // rewrite date into the BASIC
219 0 : StoreAllWindowData();
220 :
221 : // document basic
222 0 : ScriptDocument aDocument( pCurWin->GetDocument() );
223 0 : if ( aDocument.isDocument() )
224 : {
225 0 : uno::Reference< task::XStatusIndicator > xStatusIndicator;
226 :
227 0 : SFX_REQUEST_ARG( rReq, pStatusIndicatorItem, SfxUnoAnyItem,
228 : SID_PROGRESS_STATUSBAR_CONTROL, false );
229 0 : if ( pStatusIndicatorItem )
230 0 : OSL_VERIFY( pStatusIndicatorItem->GetValue() >>= xStatusIndicator );
231 : else
232 : {
233 : // get statusindicator
234 0 : SfxViewFrame *pFrame_ = GetFrame();
235 0 : if ( pFrame_ )
236 : {
237 : uno::Reference< task::XStatusIndicatorFactory > xStatFactory(
238 0 : pFrame_->GetFrame().GetFrameInterface(),
239 0 : uno::UNO_QUERY );
240 0 : if( xStatFactory.is() )
241 0 : xStatusIndicator = xStatFactory->createStatusIndicator();
242 : }
243 :
244 0 : if ( xStatusIndicator.is() )
245 0 : rReq.AppendItem( SfxUnoAnyItem( SID_PROGRESS_STATUSBAR_CONTROL, uno::makeAny( xStatusIndicator ) ) );
246 : }
247 :
248 0 : aDocument.saveDocument( xStatusIndicator );
249 : }
250 :
251 0 : if (SfxBindings* pBindings = GetBindingsPtr())
252 : {
253 0 : pBindings->Invalidate( SID_DOC_MODIFIED );
254 0 : pBindings->Invalidate( SID_SAVEDOC );
255 0 : pBindings->Invalidate( SID_SIGNATURE );
256 0 : }
257 : }
258 : }
259 0 : break;
260 : case SID_BASICIDE_MODULEDLG:
261 : {
262 0 : if ( rReq.GetArgs() )
263 : {
264 0 : const SfxUInt16Item &rTabId = (const SfxUInt16Item&)rReq.GetArgs()->Get(SID_BASICIDE_ARG_TABID );
265 0 : Organize( rTabId.GetValue() );
266 : }
267 : else
268 0 : Organize( 0 );
269 : }
270 0 : break;
271 : case SID_BASICIDE_CHOOSEMACRO:
272 : {
273 0 : ChooseMacro( NULL, false, OUString() );
274 : }
275 0 : break;
276 : case SID_BASICIDE_CREATEMACRO:
277 : case SID_BASICIDE_EDITMACRO:
278 : {
279 : DBG_ASSERT( rReq.GetArgs(), "arguments expected" );
280 0 : const SfxMacroInfoItem& rInfo = (const SfxMacroInfoItem&)rReq.GetArgs()->Get(SID_BASICIDE_ARG_MACROINFO );
281 0 : BasicManager* pBasMgr = (BasicManager*)rInfo.GetBasicManager();
282 : DBG_ASSERT( pBasMgr, "Nichts selektiert im Basic-Baum ?" );
283 :
284 0 : ScriptDocument aDocument( ScriptDocument::getDocumentForBasicManager( pBasMgr ) );
285 :
286 0 : StartListening( *pBasMgr, true /* log on only once */ );
287 0 : OUString aLibName( rInfo.GetLib() );
288 0 : if ( aLibName.isEmpty() )
289 0 : aLibName = "Standard" ;
290 0 : StarBASIC* pBasic = pBasMgr->GetLib( aLibName );
291 0 : if ( !pBasic )
292 : {
293 : // load module and dialog library (if not loaded)
294 0 : aDocument.loadLibraryIfExists( E_SCRIPTS, aLibName );
295 0 : aDocument.loadLibraryIfExists( E_DIALOGS, aLibName );
296 :
297 : // get Basic
298 0 : pBasic = pBasMgr->GetLib( aLibName );
299 : }
300 : DBG_ASSERT( pBasic, "No Basic!" );
301 :
302 0 : SetCurLib( aDocument, aLibName );
303 :
304 0 : if ( rReq.GetSlot() == SID_BASICIDE_CREATEMACRO )
305 : {
306 0 : SbModule* pModule = pBasic->FindModule( rInfo.GetModule() );
307 0 : if ( !pModule )
308 : {
309 0 : if ( rInfo.GetModule().Len() || !pBasic->GetModules()->Count() )
310 : {
311 0 : OUString aModName = rInfo.GetModule();
312 :
313 0 : OUString sModuleCode;
314 0 : if ( aDocument.createModule( aLibName, aModName, false, sModuleCode ) )
315 0 : pModule = pBasic->FindModule( aModName );
316 : }
317 : else
318 0 : pModule = (SbModule*) pBasic->GetModules()->Get(0);
319 : }
320 : DBG_ASSERT( pModule, "Kein Modul!" );
321 0 : if ( !pModule->GetMethods()->Find( rInfo.GetMethod(), SbxCLASS_METHOD ) )
322 0 : CreateMacro( pModule, rInfo.GetMethod() );
323 : }
324 0 : SfxViewFrame* pViewFrame = GetViewFrame();
325 0 : if ( pViewFrame )
326 0 : pViewFrame->ToTop();
327 0 : ModulWindow* pWin = FindBasWin( aDocument, aLibName, rInfo.GetModule(), true );
328 : DBG_ASSERT( pWin, "Edit/Create Macro: Fenster wurde nicht erzeugt/gefunden!" );
329 0 : SetCurWindow( pWin, true );
330 0 : pWin->EditMacro( rInfo.GetMethod() );
331 : }
332 0 : break;
333 :
334 : case SID_BASICIDE_OBJCAT:
335 : // toggling object catalog
336 0 : aObjectCatalog.Show(!aObjectCatalog.IsVisible());
337 0 : if (pLayout)
338 0 : pLayout->ArrangeWindows();
339 : // refresh the button state
340 0 : if (SfxBindings* pBindings = GetBindingsPtr())
341 0 : pBindings->Invalidate(SID_BASICIDE_OBJCAT);
342 0 : break;
343 :
344 : case SID_BASICIDE_NAMECHANGEDONTAB:
345 : {
346 : DBG_ASSERT( rReq.GetArgs(), "arguments expected" );
347 0 : const SfxUInt16Item &rTabId = (const SfxUInt16Item&)rReq.GetArgs()->Get(SID_BASICIDE_ARG_TABID );
348 0 : const SfxStringItem &rModName = (const SfxStringItem&)rReq.GetArgs()->Get(SID_BASICIDE_ARG_MODULENAME );
349 0 : if ( aWindowTable.find( rTabId.GetValue() ) != aWindowTable.end() )
350 : {
351 0 : BaseWindow* pWin = aWindowTable[ rTabId.GetValue() ];
352 0 : OUString aNewName( rModName.GetValue() );
353 0 : OUString aOldName( pWin->GetName() );
354 0 : if ( aNewName != aOldName )
355 : {
356 0 : bool bRenameOk = false;
357 0 : if (ModulWindow* pModWin = dynamic_cast<ModulWindow*>(pWin))
358 : {
359 0 : OUString aLibName = pModWin->GetLibName();
360 0 : ScriptDocument aDocument( pWin->GetDocument() );
361 :
362 0 : if (RenameModule(pModWin, aDocument, aLibName, aOldName, aNewName))
363 : {
364 0 : bRenameOk = true;
365 : // Because we listen for container events for script
366 : // modules, rename will delete the 'old' window
367 : // pWin has been invalidated, restore now
368 0 : pWin = FindBasWin( aDocument, aLibName, aNewName, true );
369 0 : }
370 :
371 : }
372 0 : else if (DialogWindow* pDlgWin = dynamic_cast<DialogWindow*>(pWin))
373 : {
374 0 : bRenameOk = pDlgWin->RenameDialog( aNewName );
375 : }
376 0 : if ( bRenameOk )
377 : {
378 0 : MarkDocumentModified( pWin->GetDocument() );
379 : }
380 : else
381 : {
382 : // set old name in TabWriter
383 0 : sal_uInt16 nId = GetWindowId( pWin );
384 : DBG_ASSERT( nId, "No entry in Tabbar!" );
385 0 : if ( nId )
386 0 : pTabBar->SetPageText( nId, aOldName );
387 : }
388 : }
389 :
390 : // set focus to current window
391 0 : pWin->GrabFocus();
392 : }
393 : }
394 0 : break;
395 : case SID_BASICIDE_STOREMODULESOURCE:
396 : case SID_BASICIDE_UPDATEMODULESOURCE:
397 : {
398 : DBG_ASSERT( rReq.GetArgs(), "arguments expected" );
399 0 : const SfxMacroInfoItem& rInfo = (const SfxMacroInfoItem&)rReq.GetArgs()->Get(SID_BASICIDE_ARG_MACROINFO );
400 0 : BasicManager* pBasMgr = (BasicManager*)rInfo.GetBasicManager();
401 : DBG_ASSERT( pBasMgr, "Store source: Kein BasMgr?" );
402 0 : ScriptDocument aDocument( ScriptDocument::getDocumentForBasicManager( pBasMgr ) );
403 0 : ModulWindow* pWin = FindBasWin( aDocument, rInfo.GetLib(), rInfo.GetModule(), false, true );
404 0 : if ( pWin )
405 : {
406 0 : if ( rReq.GetSlot() == SID_BASICIDE_STOREMODULESOURCE )
407 0 : pWin->StoreData();
408 : else
409 0 : pWin->UpdateData();
410 0 : }
411 : }
412 0 : break;
413 : case SID_BASICIDE_STOREALLMODULESOURCES:
414 : case SID_BASICIDE_UPDATEALLMODULESOURCES:
415 : {
416 0 : for (WindowTableIt it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
417 : {
418 0 : BaseWindow* pWin = it->second;
419 0 : if (!pWin->IsSuspended() && dynamic_cast<ModulWindow*>(pWin))
420 : {
421 0 : if ( rReq.GetSlot() == SID_BASICIDE_STOREALLMODULESOURCES )
422 0 : pWin->StoreData();
423 : else
424 0 : pWin->UpdateData();
425 : }
426 : }
427 : }
428 0 : break;
429 : case SID_BASICIDE_LIBSELECTED:
430 : case SID_BASICIDE_LIBREMOVED:
431 : case SID_BASICIDE_LIBLOADED:
432 : {
433 : DBG_ASSERT( rReq.GetArgs(), "arguments expected" );
434 0 : const SfxUsrAnyItem& rShellItem = (const SfxUsrAnyItem&)rReq.GetArgs()->Get( SID_BASICIDE_ARG_DOCUMENT_MODEL );
435 0 : uno::Reference< frame::XModel > xModel( rShellItem.GetValue(), UNO_QUERY );
436 0 : ScriptDocument aDocument( xModel.is() ? ScriptDocument( xModel ) : ScriptDocument::getApplicationScriptDocument() );
437 0 : const SfxStringItem& rLibNameItem = (const SfxStringItem&)rReq.GetArgs()->Get( SID_BASICIDE_ARG_LIBNAME );
438 0 : OUString aLibName( rLibNameItem.GetValue() );
439 :
440 0 : if ( nSlot == SID_BASICIDE_LIBSELECTED )
441 : {
442 : // load module and dialog library (if not loaded)
443 0 : aDocument.loadLibraryIfExists( E_SCRIPTS, aLibName );
444 0 : aDocument.loadLibraryIfExists( E_DIALOGS, aLibName );
445 :
446 : // check password, if library is password protected and not verified
447 0 : bool bOK = true;
448 0 : Reference< script::XLibraryContainer > xModLibContainer( aDocument.getLibraryContainer( E_SCRIPTS ) );
449 0 : if ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) )
450 : {
451 0 : Reference< script::XLibraryContainerPassword > xPasswd( xModLibContainer, UNO_QUERY );
452 0 : if ( xPasswd.is() && xPasswd->isLibraryPasswordProtected( aLibName ) && !xPasswd->isLibraryPasswordVerified( aLibName ) )
453 : {
454 0 : OUString aPassword;
455 0 : bOK = QueryPassword( xModLibContainer, aLibName, aPassword );
456 0 : }
457 : }
458 :
459 0 : if ( bOK )
460 : {
461 0 : SetCurLib( aDocument, aLibName, true, false );
462 : }
463 : else
464 : {
465 : // adjust old value...
466 0 : if (SfxBindings* pBindings = GetBindingsPtr())
467 0 : pBindings->Invalidate(SID_BASICIDE_LIBSELECTOR, true, false);
468 0 : }
469 : }
470 0 : else if ( nSlot == SID_BASICIDE_LIBREMOVED )
471 : {
472 0 : if ( m_aCurLibName.isEmpty() || ( aDocument == m_aCurDocument && aLibName == m_aCurLibName ) )
473 : {
474 0 : RemoveWindows( aDocument, aLibName, true );
475 0 : if ( aDocument == m_aCurDocument && aLibName == m_aCurLibName )
476 : {
477 0 : m_aCurDocument = ScriptDocument::getApplicationScriptDocument();
478 0 : m_aCurLibName = String();
479 : // no UpdateWindows!
480 0 : if (SfxBindings* pBindings = GetBindingsPtr())
481 0 : pBindings->Invalidate( SID_BASICIDE_LIBSELECTOR );
482 : }
483 : }
484 : }
485 : else // Loaded...
486 0 : UpdateWindows();
487 : }
488 0 : break;
489 : case SID_BASICIDE_NEWMODULE:
490 : {
491 0 : ModulWindow* pWin = CreateBasWin( m_aCurDocument, m_aCurLibName, String() );
492 : DBG_ASSERT( pWin, "New Module: Konnte Fenster nicht erzeugen!" );
493 0 : SetCurWindow( pWin, true );
494 : }
495 0 : break;
496 : case SID_BASICIDE_NEWDIALOG:
497 : {
498 0 : DialogWindow* pWin = CreateDlgWin( m_aCurDocument, m_aCurLibName, String() );
499 : DBG_ASSERT( pWin, "New Module: Konnte Fenster nicht erzeugen!" );
500 0 : SetCurWindow( pWin, true );
501 : }
502 0 : break;
503 : case SID_BASICIDE_SBXRENAMED:
504 : {
505 : DBG_ASSERT( rReq.GetArgs(), "arguments expected" );
506 : }
507 0 : break;
508 : case SID_BASICIDE_SBXINSERTED:
509 : {
510 : DBG_ASSERT( rReq.GetArgs(), "arguments expected" );
511 0 : const SbxItem& rSbxItem = (const SbxItem&)rReq.GetArgs()->Get(SID_BASICIDE_ARG_SBX );
512 0 : ScriptDocument aDocument( rSbxItem.GetDocument() );
513 0 : OUString aLibName( rSbxItem.GetLibName() );
514 0 : OUString aName( rSbxItem.GetName() );
515 0 : if ( m_aCurLibName.isEmpty() || ( aDocument == m_aCurDocument && aLibName == m_aCurLibName ) )
516 : {
517 0 : if ( rSbxItem.GetType() == TYPE_MODULE )
518 0 : FindBasWin( aDocument, aLibName, aName, true );
519 0 : else if ( rSbxItem.GetType() == TYPE_DIALOG )
520 0 : FindDlgWin( aDocument, aLibName, aName, true );
521 0 : }
522 : }
523 0 : break;
524 : case SID_BASICIDE_SBXDELETED:
525 : {
526 : DBG_ASSERT( rReq.GetArgs(), "arguments expected" );
527 0 : const SbxItem& rSbxItem = (const SbxItem&)rReq.GetArgs()->Get(SID_BASICIDE_ARG_SBX );
528 0 : ScriptDocument aDocument( rSbxItem.GetDocument() );
529 0 : BaseWindow* pWin = FindWindow( aDocument, rSbxItem.GetLibName(), rSbxItem.GetName(), rSbxItem.GetType(), true );
530 0 : if ( pWin )
531 0 : RemoveWindow( pWin, true );
532 : }
533 0 : break;
534 : case SID_BASICIDE_SHOWSBX:
535 : {
536 : DBG_ASSERT( rReq.GetArgs(), "arguments expected" );
537 0 : const SbxItem& rSbxItem = (const SbxItem&)rReq.GetArgs()->Get(SID_BASICIDE_ARG_SBX );
538 0 : ScriptDocument aDocument( rSbxItem.GetDocument() );
539 0 : OUString aLibName( rSbxItem.GetLibName() );
540 0 : OUString aName( rSbxItem.GetName() );
541 0 : SetCurLib( aDocument, aLibName );
542 0 : BaseWindow* pWin = 0;
543 0 : if ( rSbxItem.GetType() == TYPE_DIALOG )
544 : {
545 0 : pWin = FindDlgWin( aDocument, aLibName, aName, true );
546 : }
547 0 : else if ( rSbxItem.GetType() == TYPE_MODULE )
548 : {
549 0 : pWin = FindBasWin( aDocument, aLibName, aName, true );
550 : }
551 0 : else if ( rSbxItem.GetType() == TYPE_METHOD )
552 : {
553 0 : pWin = FindBasWin( aDocument, aLibName, aName, true );
554 0 : static_cast<ModulWindow*>(pWin)->EditMacro( rSbxItem.GetMethodName() );
555 : }
556 : DBG_ASSERT( pWin, "Fenster wurde nicht erzeugt!" );
557 0 : SetCurWindow( pWin, true );
558 0 : pTabBar->MakeVisible( pTabBar->GetCurPageId() );
559 : }
560 0 : break;
561 : case SID_BASICIDE_SHOWWINDOW:
562 : {
563 0 : ::std::auto_ptr< ScriptDocument > pDocument;
564 :
565 0 : SFX_REQUEST_ARG( rReq, pDocumentItem, SfxStringItem, SID_BASICIDE_ARG_DOCUMENT, false );
566 0 : if ( pDocumentItem )
567 : {
568 0 : OUString sDocumentCaption = pDocumentItem->GetValue();
569 0 : if ( !sDocumentCaption.isEmpty() )
570 0 : pDocument.reset( new ScriptDocument( ScriptDocument::getDocumentWithURLOrCaption( sDocumentCaption ) ) );
571 : }
572 :
573 0 : SFX_REQUEST_ARG( rReq, pDocModelItem, SfxUsrAnyItem, SID_BASICIDE_ARG_DOCUMENT_MODEL, false );
574 0 : if ( !pDocument.get() && pDocModelItem )
575 : {
576 0 : uno::Reference< frame::XModel > xModel( pDocModelItem->GetValue(), UNO_QUERY );
577 0 : if ( xModel.is() )
578 0 : pDocument.reset( new ScriptDocument( xModel ) );
579 : }
580 :
581 0 : if ( !pDocument.get() )
582 : break;
583 :
584 0 : SFX_REQUEST_ARG( rReq, pLibNameItem, SfxStringItem, SID_BASICIDE_ARG_LIBNAME, false );
585 0 : if ( !pLibNameItem )
586 : break;
587 :
588 0 : OUString aLibName( pLibNameItem->GetValue() );
589 0 : pDocument->loadLibraryIfExists( E_SCRIPTS, aLibName );
590 0 : SetCurLib( *pDocument, aLibName );
591 0 : SFX_REQUEST_ARG( rReq, pNameItem, SfxStringItem, SID_BASICIDE_ARG_NAME, false );
592 0 : if ( pNameItem )
593 : {
594 0 : OUString aName( pNameItem->GetValue() );
595 0 : OUString aModType( "Module" );
596 0 : OUString aDlgType( "Dialog" );
597 0 : OUString aType( aModType );
598 0 : SFX_REQUEST_ARG( rReq, pTypeItem, SfxStringItem, SID_BASICIDE_ARG_TYPE, false );
599 0 : if ( pTypeItem )
600 0 : aType = pTypeItem->GetValue();
601 :
602 0 : BaseWindow* pWin = 0;
603 0 : if ( aType == aModType )
604 0 : pWin = FindBasWin( *pDocument, aLibName, aName, false );
605 0 : else if ( aType == aDlgType )
606 0 : pWin = FindDlgWin( *pDocument, aLibName, aName, false );
607 :
608 0 : if ( pWin )
609 : {
610 0 : SetCurWindow( pWin, true );
611 0 : if ( pTabBar )
612 0 : pTabBar->MakeVisible( pTabBar->GetCurPageId() );
613 :
614 0 : if (ModulWindow* pModWin = dynamic_cast<ModulWindow*>(pWin))
615 : {
616 0 : SFX_REQUEST_ARG( rReq, pLineItem, SfxUInt32Item, SID_BASICIDE_ARG_LINE, false );
617 0 : if ( pLineItem )
618 : {
619 0 : pModWin->AssertValidEditEngine();
620 0 : TextView* pTextView = pModWin->GetEditView();
621 0 : if ( pTextView )
622 : {
623 0 : TextEngine* pTextEngine = pTextView->GetTextEngine();
624 0 : if ( pTextEngine )
625 : {
626 0 : sal_uInt32 nLine = pLineItem->GetValue();
627 0 : sal_uInt32 nLineCount = 0;
628 0 : for ( sal_uInt32 i = 0, nCount = pTextEngine->GetParagraphCount(); i < nCount; ++i )
629 0 : nLineCount += pTextEngine->GetLineCount( i );
630 0 : if ( nLine > nLineCount )
631 0 : nLine = nLineCount;
632 0 : if ( nLine > 0 )
633 0 : --nLine;
634 :
635 : // scroll window and set selection
636 0 : long nVisHeight = pModWin->GetOutputSizePixel().Height();
637 0 : long nTextHeight = pTextEngine->GetTextHeight();
638 0 : if ( nTextHeight > nVisHeight )
639 : {
640 0 : long nMaxY = nTextHeight - nVisHeight;
641 0 : long nOldY = pTextView->GetStartDocPos().Y();
642 0 : long nNewY = nLine * pTextEngine->GetCharHeight() - nVisHeight / 2;
643 0 : nNewY = ::std::min( nNewY, nMaxY );
644 0 : pTextView->Scroll( 0, -( nNewY - nOldY ) );
645 0 : pTextView->ShowCursor( false, true );
646 0 : pModWin->GetEditVScrollBar().SetThumbPos( pTextView->GetStartDocPos().Y() );
647 : }
648 0 : sal_uInt16 nCol1 = 0, nCol2 = 0;
649 0 : SFX_REQUEST_ARG( rReq, pCol1Item, SfxUInt16Item, SID_BASICIDE_ARG_COLUMN1, false );
650 0 : if ( pCol1Item )
651 : {
652 0 : nCol1 = pCol1Item->GetValue();
653 0 : if ( nCol1 > 0 )
654 0 : --nCol1;
655 0 : nCol2 = nCol1;
656 : }
657 0 : SFX_REQUEST_ARG( rReq, pCol2Item, SfxUInt16Item, SID_BASICIDE_ARG_COLUMN2, false );
658 0 : if ( pCol2Item )
659 : {
660 0 : nCol2 = pCol2Item->GetValue();
661 0 : if ( nCol2 > 0 )
662 0 : --nCol2;
663 : }
664 0 : TextSelection aSel( TextPaM( nLine, nCol1 ), TextPaM( nLine, nCol2 ) );
665 0 : pTextView->SetSelection( aSel );
666 0 : pTextView->ShowCursor();
667 0 : Window* pWindow_ = pTextView->GetWindow();
668 0 : if ( pWindow_ )
669 0 : pWindow_->GrabFocus();
670 : }
671 : }
672 : }
673 : }
674 0 : }
675 : }
676 0 : rReq.Done();
677 : }
678 0 : break;
679 :
680 : case SID_BASICIDE_MANAGE_LANG:
681 : {
682 0 : ManageLanguageDialog aDlg(pCurWin, m_pCurLocalizationMgr);
683 0 : aDlg.Execute();
684 0 : rReq.Done();
685 : }
686 0 : break;
687 :
688 : default:
689 0 : if (pLayout)
690 0 : pLayout->ExecuteGlobal(rReq);
691 0 : if (pCurWin)
692 0 : pCurWin->ExecuteGlobal(rReq);
693 0 : break;
694 : }
695 0 : }
696 :
697 0 : void Shell::GetState(SfxItemSet &rSet)
698 : {
699 0 : SfxWhichIter aIter(rSet);
700 0 : for ( sal_uInt16 nWh = aIter.FirstWhich(); 0 != nWh; nWh = aIter.NextWhich() )
701 : {
702 0 : switch ( nWh )
703 : {
704 : case SID_DOCINFO:
705 : {
706 0 : rSet.DisableItem( nWh );
707 : }
708 0 : break;
709 : case SID_SAVEDOC:
710 : {
711 0 : bool bDisable = false;
712 :
713 0 : if ( pCurWin )
714 : {
715 0 : if ( !pCurWin->IsModified() )
716 : {
717 0 : ScriptDocument aDocument( pCurWin->GetDocument() );
718 0 : bDisable = ( !aDocument.isAlive() )
719 0 : || ( aDocument.isDocument() ? !aDocument.isDocumentModified() : !IsAppBasicModified() );
720 : }
721 : }
722 : else
723 : {
724 0 : bDisable = true;
725 : }
726 :
727 0 : if ( bDisable )
728 0 : rSet.DisableItem( nWh );
729 : }
730 0 : break;
731 : case SID_NEWWINDOW:
732 : case SID_SAVEASDOC:
733 : {
734 0 : rSet.DisableItem( nWh );
735 : }
736 0 : break;
737 : case SID_SIGNATURE:
738 : {
739 0 : sal_uInt16 nState = 0;
740 0 : if ( pCurWin )
741 : {
742 0 : DocumentSignature aSignature( pCurWin->GetDocument() );
743 0 : nState = aSignature.getScriptingSignatureState();
744 : }
745 0 : rSet.Put( SfxUInt16Item( SID_SIGNATURE, nState ) );
746 : }
747 0 : break;
748 : case SID_BASICIDE_MODULEDLG:
749 : {
750 0 : if ( StarBASIC::IsRunning() )
751 0 : rSet.DisableItem( nWh );
752 : }
753 0 : break;
754 : case SID_BASICIDE_OBJCAT:
755 0 : if (pLayout)
756 0 : rSet.Put(SfxBoolItem(nWh, aObjectCatalog.IsVisible()));
757 : else
758 0 : rSet.Put(SfxVisibilityItem(nWh, false));
759 0 : break;
760 : case SID_BASICIDE_SHOWSBX:
761 : case SID_BASICIDE_CREATEMACRO:
762 : case SID_BASICIDE_EDITMACRO:
763 : case SID_BASICIDE_NAMECHANGEDONTAB:
764 : {
765 : ;
766 : }
767 0 : break;
768 :
769 : case SID_BASICIDE_ADDWATCH:
770 : case SID_BASICIDE_REMOVEWATCH:
771 : case SID_BASICLOAD:
772 : case SID_BASICSAVEAS:
773 : case SID_BASICIDE_MATCHGROUP:
774 : {
775 0 : if (!dynamic_cast<ModulWindow*>(pCurWin))
776 0 : rSet.DisableItem( nWh );
777 0 : else if ( ( nWh == SID_BASICLOAD ) && ( StarBASIC::IsRunning() || ( pCurWin && pCurWin->IsReadOnly() ) ) )
778 0 : rSet.DisableItem( nWh );
779 : }
780 0 : break;
781 : case SID_BASICRUN:
782 : case SID_BASICSTEPINTO:
783 : case SID_BASICSTEPOVER:
784 : case SID_BASICSTEPOUT:
785 : case SID_BASICIDE_TOGGLEBRKPNT:
786 : case SID_BASICIDE_MANAGEBRKPNTS:
787 : {
788 0 : if (ModulWindow* pMCurWin = dynamic_cast<ModulWindow*>(pCurWin))
789 : {
790 0 : if (StarBASIC::IsRunning() && !pMCurWin->GetBasicStatus().bIsInReschedule)
791 0 : rSet.DisableItem(nWh);
792 : }
793 : else
794 0 : rSet.DisableItem( nWh );
795 : }
796 0 : break;
797 : case SID_BASICCOMPILE:
798 : {
799 0 : if (StarBASIC::IsRunning() || !dynamic_cast<ModulWindow*>(pCurWin))
800 0 : rSet.DisableItem( nWh );
801 : }
802 0 : break;
803 : case SID_BASICSTOP:
804 : {
805 : // stop is always possible when some Basic is running...
806 0 : if (!StarBASIC::IsRunning())
807 0 : rSet.DisableItem( nWh );
808 : }
809 0 : break;
810 : case SID_CHOOSE_CONTROLS:
811 : case SID_DIALOG_TESTMODE:
812 : case SID_INSERT_FORM_RADIO:
813 : case SID_INSERT_FORM_CHECK:
814 : case SID_INSERT_FORM_LIST:
815 : case SID_INSERT_FORM_COMBO:
816 : case SID_INSERT_FORM_VSCROLL:
817 : case SID_INSERT_FORM_HSCROLL:
818 : case SID_INSERT_FORM_SPIN:
819 : {
820 0 : if (!dynamic_cast<DialogWindow*>(pCurWin))
821 0 : rSet.DisableItem( nWh );
822 : }
823 0 : break;
824 : case SID_SHOW_FORMS:
825 : case SID_SHOW_HIDDEN:
826 : {
827 0 : rSet.DisableItem( nWh );
828 : }
829 0 : break;
830 : case SID_SEARCH_OPTIONS:
831 : {
832 0 : sal_uInt16 nOptions = 0;
833 0 : if( pCurWin )
834 0 : nOptions = pCurWin->GetSearchOptions();
835 0 : rSet.Put( SfxUInt16Item( SID_SEARCH_OPTIONS, nOptions ) );
836 : }
837 0 : break;
838 : case SID_BASICIDE_LIBSELECTOR:
839 : {
840 0 : OUString aName;
841 0 : if ( !m_aCurLibName.isEmpty() )
842 : {
843 0 : LibraryLocation eLocation = m_aCurDocument.getLibraryLocation( m_aCurLibName );
844 0 : aName = CreateMgrAndLibStr( m_aCurDocument.getTitle( eLocation ), m_aCurLibName );
845 : }
846 0 : SfxStringItem aItem( SID_BASICIDE_LIBSELECTOR, aName );
847 0 : rSet.Put( aItem );
848 : }
849 0 : break;
850 : case SID_SEARCH_ITEM:
851 : {
852 0 : OUString aSelected = GetSelectionText(true);
853 0 : SvxSearchItem& rItem = GetExtraData()->GetSearchItem();
854 0 : rItem.SetSearchString( aSelected );
855 0 : rSet.Put( rItem );
856 : }
857 0 : break;
858 : case SID_BASICIDE_STAT_DATE:
859 : {
860 0 : OUString aDate( "Datum?!" );
861 0 : SfxStringItem aItem( SID_BASICIDE_STAT_DATE, aDate );
862 0 : rSet.Put( aItem );
863 : }
864 0 : break;
865 : case SID_DOC_MODIFIED:
866 : {
867 0 : bool bModified = false;
868 :
869 0 : if ( pCurWin )
870 : {
871 0 : if ( pCurWin->IsModified() )
872 0 : bModified = true;
873 : else
874 : {
875 0 : ScriptDocument aDocument( pCurWin->GetDocument() );
876 0 : bModified = aDocument.isDocument() ? aDocument.isDocumentModified() : IsAppBasicModified();
877 : }
878 : }
879 :
880 0 : SfxBoolItem aItem(SID_DOC_MODIFIED, bModified);
881 0 : rSet.Put( aItem );
882 : }
883 0 : break;
884 : case SID_BASICIDE_STAT_TITLE:
885 : {
886 0 : if ( pCurWin )
887 : {
888 0 : OUString aTitle = pCurWin->CreateQualifiedName();
889 0 : SfxStringItem aItem( SID_BASICIDE_STAT_TITLE, aTitle );
890 0 : rSet.Put( aItem );
891 : }
892 : }
893 0 : break;
894 : // are interpreted by the controller:
895 : case SID_ATTR_SIZE:
896 : case SID_ATTR_INSERT:
897 0 : break;
898 : case SID_UNDO:
899 : case SID_REDO:
900 : {
901 0 : if( GetUndoManager() ) // recursive GetState else
902 0 : GetViewFrame()->GetSlotState( nWh, NULL, &rSet );
903 : }
904 0 : break;
905 : case SID_BASICIDE_CURRENT_LANG:
906 : {
907 0 : if( (pCurWin && pCurWin->IsReadOnly()) || GetCurLibName().isEmpty() )
908 0 : rSet.DisableItem( nWh );
909 : else
910 : {
911 0 : OUString aItemStr;
912 0 : boost::shared_ptr<LocalizationMgr> pCurMgr(GetCurLocalizationMgr());
913 0 : if ( pCurMgr->isLibraryLocalized() )
914 : {
915 0 : Sequence< lang::Locale > aLocaleSeq = pCurMgr->getStringResourceManager()->getLocales();
916 0 : const lang::Locale* pLocale = aLocaleSeq.getConstArray();
917 0 : sal_Int32 i, nCount = aLocaleSeq.getLength();
918 :
919 : // Force different results for any combination of locales and default locale
920 0 : OUString aLangStr;
921 0 : for ( i = 0; i <= nCount; ++i )
922 : {
923 0 : lang::Locale aLocale;
924 0 : if( i < nCount )
925 0 : aLocale = pLocale[i];
926 : else
927 0 : aLocale = pCurMgr->getStringResourceManager()->getDefaultLocale();
928 :
929 0 : aLangStr += aLocale.Language;
930 0 : aLangStr += aLocale.Country;
931 0 : aLangStr += aLocale.Variant;
932 0 : }
933 0 : aItemStr = aLangStr;
934 : }
935 0 : rSet.Put( SfxStringItem( nWh, aItemStr ) );
936 : }
937 : }
938 0 : break;
939 :
940 : case SID_BASICIDE_MANAGE_LANG:
941 : {
942 0 : if( (pCurWin && pCurWin->IsReadOnly()) || GetCurLibName().isEmpty() )
943 0 : rSet.DisableItem( nWh );
944 : }
945 0 : break;
946 : case SID_GOTOLINE:
947 : {
948 : // if this is not a module window hide the
949 : // setting, doesn't make sense for example if the
950 : // dialog editor is open
951 0 : if (pCurWin && !dynamic_cast<ModulWindow*>(pCurWin))
952 : {
953 0 : rSet.DisableItem( nWh );
954 0 : rSet.Put(SfxVisibilityItem(nWh, false));
955 : }
956 0 : break;
957 : }
958 : default:
959 0 : if (pLayout)
960 0 : pLayout->GetState(rSet, nWh);
961 : }
962 : }
963 0 : if ( pCurWin )
964 0 : pCurWin->GetState( rSet );
965 0 : }
966 :
967 0 : sal_Bool Shell::HasUIFeature( sal_uInt32 nFeature )
968 : {
969 0 : bool bResult = false;
970 :
971 0 : if ( (nFeature & BASICIDE_UI_FEATURE_SHOW_BROWSER) == BASICIDE_UI_FEATURE_SHOW_BROWSER )
972 : {
973 : // fade out (in) property browser in module (dialog) windows
974 0 : if (dynamic_cast<DialogWindow*>(pCurWin) && !pCurWin->IsReadOnly())
975 0 : bResult = true;
976 : }
977 :
978 0 : return bResult;
979 : }
980 :
981 0 : void Shell::SetCurWindow( BaseWindow* pNewWin, bool bUpdateTabBar, bool bRememberAsCurrent )
982 : {
983 0 : if ( pNewWin != pCurWin )
984 : {
985 0 : pCurWin = pNewWin;
986 0 : if (pLayout)
987 0 : pLayout->Deactivating();
988 0 : if (pCurWin)
989 : {
990 0 : if (pCurWin->GetType() == TYPE_MODULE)
991 0 : pLayout = pModulLayout.get();
992 : else
993 0 : pLayout = pDialogLayout.get();
994 0 : AdjustPosSizePixel(Point(0, 0), GetViewFrame()->GetWindow().GetOutputSizePixel());
995 0 : pLayout->Activating(*pCurWin);
996 0 : GetViewFrame()->GetWindow().SetHelpId(pCurWin->GetHid());
997 0 : if (bRememberAsCurrent)
998 0 : pCurWin->InsertLibInfo();
999 0 : if (GetViewFrame()->GetWindow().IsVisible()) // SFX will do it later otherwise
1000 0 : pCurWin->Show();
1001 0 : pCurWin->Init();
1002 0 : if (!GetExtraData()->ShellInCriticalSection())
1003 : {
1004 0 : Window* pFrameWindow = &GetViewFrame()->GetWindow();
1005 0 : Window* pFocusWindow = Application::GetFocusWindow();
1006 0 : while ( pFocusWindow && ( pFocusWindow != pFrameWindow ) )
1007 0 : pFocusWindow = pFocusWindow->GetParent();
1008 0 : if ( pFocusWindow ) // Focus in BasicIDE
1009 0 : pNewWin->GrabFocus();
1010 : }
1011 : }
1012 : else
1013 0 : pLayout = 0;
1014 0 : if ( bUpdateTabBar )
1015 : {
1016 0 : sal_uLong nKey = GetWindowId( pCurWin );
1017 0 : if ( pCurWin && ( pTabBar->GetPagePos( (sal_uInt16)nKey ) == TAB_PAGE_NOTFOUND ) )
1018 0 : pTabBar->InsertPage( (sal_uInt16)nKey, pCurWin->GetTitle() ); // has just been faded in
1019 0 : pTabBar->SetCurPageId( (sal_uInt16)nKey );
1020 : }
1021 0 : if ( pCurWin && pCurWin->IsSuspended() ) // if the window is shown in the case of an error...
1022 0 : pCurWin->SetStatus( pCurWin->GetStatus() & ~BASWIN_SUSPENDED );
1023 0 : if ( pCurWin )
1024 : {
1025 0 : SetWindow( pCurWin );
1026 0 : if ( pCurWin->GetDocument().isDocument() )
1027 0 : SfxObjectShell::SetCurrentComponent( pCurWin->GetDocument().getDocument() );
1028 : }
1029 0 : else if (pLayout)
1030 : {
1031 0 : SetWindow(pLayout);
1032 0 : GetViewFrame()->GetWindow().SetHelpId( HID_BASICIDE_MODULWINDOW );
1033 0 : SfxObjectShell::SetCurrentComponent(0);
1034 : }
1035 0 : aObjectCatalog.SetCurrentEntry(pCurWin);
1036 0 : SetUndoManager( pCurWin ? pCurWin->GetUndoManager() : 0 );
1037 0 : InvalidateBasicIDESlots();
1038 0 : EnableScrollbars(pCurWin != 0);
1039 :
1040 0 : if ( m_pCurLocalizationMgr )
1041 0 : m_pCurLocalizationMgr->handleTranslationbar();
1042 :
1043 0 : ManageToolbars();
1044 :
1045 : // fade out (in) property browser in module (dialog) windows
1046 0 : UIFeatureChanged();
1047 : }
1048 0 : }
1049 :
1050 0 : void Shell::ManageToolbars()
1051 : {
1052 0 : static OUString aLayoutManagerName( "LayoutManager" );
1053 0 : static OUString aMacroBarResName( "private:resource/toolbar/macrobar" );
1054 0 : static OUString aDialogBarResName( "private:resource/toolbar/dialogbar" );
1055 0 : static OUString aInsertControlsBarResName( "private:resource/toolbar/insertcontrolsbar" );
1056 0 : static OUString aFormControlsBarResName( "private:resource/toolbar/formcontrolsbar" );
1057 : (void)aInsertControlsBarResName;
1058 :
1059 0 : if( !pCurWin )
1060 0 : return;
1061 :
1062 : Reference< beans::XPropertySet > xFrameProps
1063 0 : ( GetViewFrame()->GetFrame().GetFrameInterface(), uno::UNO_QUERY );
1064 0 : if ( xFrameProps.is() )
1065 : {
1066 0 : Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager;
1067 0 : uno::Any a = xFrameProps->getPropertyValue( aLayoutManagerName );
1068 0 : a >>= xLayoutManager;
1069 0 : if ( xLayoutManager.is() )
1070 : {
1071 0 : xLayoutManager->lock();
1072 0 : if (dynamic_cast<DialogWindow*>(pCurWin))
1073 : {
1074 0 : xLayoutManager->destroyElement( aMacroBarResName );
1075 :
1076 0 : xLayoutManager->requestElement( aDialogBarResName );
1077 0 : xLayoutManager->requestElement( aInsertControlsBarResName );
1078 0 : xLayoutManager->requestElement( aFormControlsBarResName );
1079 : }
1080 : else
1081 : {
1082 0 : xLayoutManager->destroyElement( aDialogBarResName );
1083 0 : xLayoutManager->destroyElement( aInsertControlsBarResName );
1084 0 : xLayoutManager->destroyElement( aFormControlsBarResName );
1085 :
1086 0 : xLayoutManager->requestElement( aMacroBarResName );
1087 : }
1088 0 : xLayoutManager->unlock();
1089 0 : }
1090 0 : }
1091 : }
1092 :
1093 0 : BaseWindow* Shell::FindApplicationWindow()
1094 : {
1095 0 : return FindWindow( ScriptDocument::getApplicationScriptDocument() );
1096 : }
1097 :
1098 0 : BaseWindow* Shell::FindWindow(
1099 : ScriptDocument const& rDocument,
1100 : OUString const& rLibName, OUString const& rName,
1101 : ItemType eType, bool bFindSuspended
1102 : )
1103 : {
1104 0 : for (WindowTableIt it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
1105 : {
1106 0 : BaseWindow* const pWin = it->second;
1107 0 : if (pWin->Is(rDocument, rLibName, rName, eType, bFindSuspended))
1108 0 : return pWin;
1109 : }
1110 0 : return 0;
1111 : }
1112 :
1113 0 : long Shell::CallBasicErrorHdl( StarBASIC* pBasic )
1114 : {
1115 0 : long nRet = 0;
1116 0 : ModulWindow* pModWin = ShowActiveModuleWindow( pBasic );
1117 0 : if ( pModWin )
1118 0 : nRet = pModWin->BasicErrorHdl( pBasic );
1119 0 : return nRet;
1120 : }
1121 :
1122 0 : long Shell::CallBasicBreakHdl( StarBASIC* pBasic )
1123 : {
1124 0 : long nRet = 0;
1125 0 : ModulWindow* pModWin = ShowActiveModuleWindow( pBasic );
1126 0 : if ( pModWin )
1127 : {
1128 : bool bAppWindowDisabled, bDispatcherLocked;
1129 : sal_uInt16 nWaitCount;
1130 : SfxUInt16Item *pSWActionCount, *pSWLockViewCount;
1131 : BasicStopped( &bAppWindowDisabled, &bDispatcherLocked,
1132 0 : &nWaitCount, &pSWActionCount, &pSWLockViewCount );
1133 :
1134 0 : nRet = pModWin->BasicBreakHdl( pBasic );
1135 :
1136 0 : if ( StarBASIC::IsRunning() ) // if cancelled...
1137 : {
1138 0 : if ( bAppWindowDisabled )
1139 0 : Application::GetDefDialogParent()->Enable(false);
1140 :
1141 0 : if ( nWaitCount )
1142 : {
1143 0 : Shell* pShell = GetShell();
1144 0 : for ( sal_uInt16 n = 0; n < nWaitCount; n++ )
1145 0 : pShell->GetViewFrame()->GetWindow().EnterWait();
1146 : }
1147 : }
1148 : }
1149 0 : return nRet;
1150 : }
1151 :
1152 0 : ModulWindow* Shell::ShowActiveModuleWindow( StarBASIC* pBasic )
1153 : {
1154 0 : SetCurLib( ScriptDocument::getApplicationScriptDocument(), OUString(), false );
1155 :
1156 0 : SbModule* pActiveModule = StarBASIC::GetActiveModule();
1157 0 : if (SbClassModuleObject* pCMO = dynamic_cast<SbClassModuleObject*>(pActiveModule))
1158 0 : pActiveModule = pCMO->getClassModule();
1159 :
1160 : DBG_ASSERT( pActiveModule, "Kein aktives Modul im ErrorHdl?!" );
1161 0 : if ( pActiveModule )
1162 : {
1163 0 : ModulWindow* pWin = 0;
1164 0 : SbxObject* pParent = pActiveModule->GetParent();
1165 0 : if (StarBASIC* pLib = dynamic_cast<StarBASIC*>(pParent))
1166 : {
1167 0 : if (BasicManager* pBasMgr = FindBasicManager(pLib))
1168 : {
1169 0 : ScriptDocument aDocument( ScriptDocument::getDocumentForBasicManager( pBasMgr ) );
1170 0 : OUString aLibName = pLib->GetName();
1171 0 : pWin = FindBasWin( aDocument, aLibName, pActiveModule->GetName(), true );
1172 : DBG_ASSERT( pWin, "Error/Step-Hdl: Fenster wurde nicht erzeugt/gefunden!" );
1173 0 : SetCurLib( aDocument, aLibName );
1174 0 : SetCurWindow( pWin, true );
1175 : }
1176 : }
1177 : else
1178 : DBG_ASSERT(false, "No BASIC!");
1179 0 : if (BasicManager* pBasicMgr = FindBasicManager(pBasic))
1180 0 : StartListening( *pBasicMgr, true /* log on only once */ );
1181 0 : return pWin;
1182 : }
1183 0 : return 0;
1184 : }
1185 :
1186 0 : void Shell::AdjustPosSizePixel( const Point &rPos, const Size &rSize )
1187 : {
1188 : // not if iconified because the whole text would be displaced then at restore
1189 0 : if ( GetViewFrame()->GetWindow().GetOutputSizePixel().Height() == 0 )
1190 0 : return;
1191 :
1192 0 : Size aSz( rSize );
1193 0 : Size aScrollBarBoxSz( aScrollBarBox.GetSizePixel() );
1194 0 : aSz.Height() -= aScrollBarBoxSz.Height();
1195 :
1196 0 : Size aOutSz( aSz );
1197 0 : aSz.Width() -= aScrollBarBoxSz.Width();
1198 0 : aScrollBarBox.SetPosPixel( Point( rSize.Width() - aScrollBarBoxSz.Width(), rSize.Height() - aScrollBarBoxSz.Height() ) );
1199 0 : aVScrollBar.SetPosSizePixel( Point( rPos.X()+aSz.Width(), rPos.Y() ), Size( aScrollBarBoxSz.Width(), aSz.Height() ) );
1200 0 : if ( bTabBarSplitted )
1201 : {
1202 : // SplitSize is 0 at a resize!
1203 0 : long nSplitPos = pTabBar->GetSizePixel().Width();
1204 0 : if ( nSplitPos > aSz.Width() )
1205 0 : nSplitPos = aSz.Width();
1206 0 : pTabBar->SetPosSizePixel( Point( rPos.X(), rPos.Y()+aSz.Height() ), Size( nSplitPos, aScrollBarBoxSz.Height() ) );
1207 0 : long nScrlStart = rPos.X() + nSplitPos;
1208 0 : aHScrollBar.SetPosSizePixel( Point( nScrlStart, rPos.Y()+aSz.Height() ), Size( aSz.Width() - nScrlStart + 1, aScrollBarBoxSz.Height() ) );
1209 0 : aHScrollBar.Update();
1210 : }
1211 : else
1212 : {
1213 0 : aHScrollBar.SetPosSizePixel( Point( rPos.X()+ aSz.Width()/2 - 1, rPos.Y()+aSz.Height() ), Size( aSz.Width()/2 + 2, aScrollBarBoxSz.Height() ) );
1214 0 : pTabBar->SetPosSizePixel( Point( rPos.X(), rPos.Y()+aSz.Height() ), Size( aSz.Width()/2, aScrollBarBoxSz.Height() ) );
1215 : }
1216 :
1217 0 : if (pLayout)
1218 0 : pLayout->SetPosSizePixel(rPos, dynamic_cast<DialogWindow*>(pCurWin) ? aSz : aOutSz);
1219 : }
1220 :
1221 0 : Reference< XModel > Shell::GetCurrentDocument() const
1222 : {
1223 0 : Reference< XModel > xDocument;
1224 0 : if ( pCurWin && pCurWin->GetDocument().isDocument() )
1225 0 : xDocument = pCurWin->GetDocument().getDocument();
1226 0 : return xDocument;
1227 : }
1228 :
1229 0 : void Shell::Activate( sal_Bool bMDI )
1230 : {
1231 0 : SfxViewShell::Activate( bMDI );
1232 :
1233 0 : if ( bMDI )
1234 : {
1235 0 : if (DialogWindow* pDCurWin = dynamic_cast<DialogWindow*>(pCurWin))
1236 0 : pDCurWin->UpdateBrowser();
1237 : }
1238 0 : }
1239 :
1240 0 : void Shell::Deactivate( sal_Bool bMDI )
1241 : {
1242 : // bMDI == true means that another MDI has been activated; in case of a
1243 : // deactivate due to a MessageBox bMDI is false
1244 0 : if ( bMDI )
1245 : {
1246 0 : if (DialogWindow* pXDlgWin = dynamic_cast<DialogWindow*>(pCurWin))
1247 : {
1248 0 : pXDlgWin->DisableBrowser();
1249 0 : if( pXDlgWin->IsModified() )
1250 0 : MarkDocumentModified( pXDlgWin->GetDocument() );
1251 : }
1252 :
1253 : // test CanClose to also test during deactivating the BasicIDE whether
1254 : // the sourcecode is too large in one of the modules...
1255 0 : for (WindowTableIt it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
1256 : {
1257 0 : BaseWindow* pWin = it->second;
1258 0 : if ( /* !pWin->IsSuspended() && */ !pWin->CanClose() )
1259 : {
1260 0 : if ( !m_aCurLibName.isEmpty() && ( pWin->IsDocument( m_aCurDocument ) || pWin->GetLibName() != m_aCurLibName ) )
1261 0 : SetCurLib( ScriptDocument::getApplicationScriptDocument(), OUString(), false );
1262 0 : SetCurWindow( pWin, true );
1263 0 : break;
1264 : }
1265 : }
1266 : }
1267 0 : }
1268 :
1269 0 : } // namespace basctl
1270 :
1271 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|