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