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 <config_options.h>
21 :
22 : #include <tools/diagnose_ex.h>
23 : #include <basic/basmgr.hxx>
24 : #include <basidesh.hrc>
25 : #include "baside2.hxx"
26 : #include "baside3.hxx"
27 : #include <basdoc.hxx>
28 : #include <basicbox.hxx>
29 : #include <editeng/sizeitem.hxx>
30 : #include <tbxctl.hxx>
31 : #include <iderdll2.hxx>
32 : #include <basidectrlr.hxx>
33 : #include <localizationmgr.hxx>
34 : #include <sfx2/app.hxx>
35 : #include <sfx2/dinfdlg.hxx>
36 : #include <sfx2/dispatch.hxx>
37 : #include <sfx2/infobar.hxx>
38 : #include <sfx2/minfitem.hxx>
39 : #include <sfx2/objface.hxx>
40 : #include <svl/aeitem.hxx>
41 : #include <svl/srchitem.hxx>
42 :
43 : #define basctl_Shell
44 : #define SFX_TYPEMAP
45 : #include <idetemp.hxx>
46 : #include <basslots.hxx>
47 : #include <iderdll.hxx>
48 : #include <svx/pszctrl.hxx>
49 : #include <svx/insctrl.hxx>
50 : #include <svx/srchdlg.hxx>
51 : #include <svx/tbcontrl.hxx>
52 : #include <com/sun/star/script/XLibraryContainerPassword.hpp>
53 : #include <com/sun/star/container/XContainer.hpp>
54 : #include <svx/xmlsecctrl.hxx>
55 : #include <sfx2/viewfac.hxx>
56 : #include <vcl/msgbox.hxx>
57 : #include <vcl/settings.hxx>
58 :
59 : namespace basctl
60 : {
61 :
62 : using namespace ::com::sun::star::uno;
63 : using namespace ::com::sun::star;
64 :
65 : typedef ::cppu::WeakImplHelper1< container::XContainerListener > ContainerListenerBASE;
66 :
67 : class ContainerListenerImpl : public ContainerListenerBASE
68 : {
69 : Shell* mpShell;
70 : public:
71 0 : explicit ContainerListenerImpl(Shell* pShell)
72 0 : : mpShell(pShell)
73 : {
74 0 : }
75 :
76 0 : virtual ~ContainerListenerImpl()
77 0 : {
78 0 : }
79 :
80 0 : void addContainerListener( const ScriptDocument& rScriptDocument, const OUString& aLibName )
81 : {
82 : try
83 : {
84 0 : uno::Reference< container::XContainer > xContainer( rScriptDocument.getLibrary( E_SCRIPTS, aLibName, false ), uno::UNO_QUERY );
85 0 : if ( xContainer.is() )
86 : {
87 0 : uno::Reference< container::XContainerListener > xContainerListener( this );
88 0 : xContainer->addContainerListener( xContainerListener );
89 0 : }
90 : }
91 0 : catch(const uno::Exception& ) {}
92 0 : }
93 0 : void removeContainerListener( const ScriptDocument& rScriptDocument, const OUString& aLibName )
94 : {
95 : try
96 : {
97 0 : uno::Reference< container::XContainer > xContainer( rScriptDocument.getLibrary( E_SCRIPTS, aLibName, false ), uno::UNO_QUERY );
98 0 : if ( xContainer.is() )
99 : {
100 0 : uno::Reference< container::XContainerListener > xContainerListener( this );
101 0 : xContainer->removeContainerListener( xContainerListener );
102 0 : }
103 : }
104 0 : catch(const uno::Exception& ) {}
105 0 : }
106 :
107 : // XEventListener
108 0 : virtual void SAL_CALL disposing( const lang::EventObject& ) throw( uno::RuntimeException, std::exception ) SAL_OVERRIDE {}
109 :
110 : // XContainerListener
111 0 : virtual void SAL_CALL elementInserted( const container::ContainerEvent& Event ) throw( uno::RuntimeException, std::exception ) SAL_OVERRIDE
112 : {
113 0 : OUString sModuleName;
114 0 : if( mpShell && ( Event.Accessor >>= sModuleName ) )
115 0 : mpShell->FindBasWin( mpShell->m_aCurDocument, mpShell->m_aCurLibName, sModuleName, true, false );
116 0 : }
117 0 : virtual void SAL_CALL elementReplaced( const container::ContainerEvent& ) throw( com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE { }
118 0 : virtual void SAL_CALL elementRemoved( const container::ContainerEvent& Event ) throw( com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE
119 : {
120 0 : OUString sModuleName;
121 0 : if( mpShell && ( Event.Accessor >>= sModuleName ) )
122 : {
123 0 : ModulWindow* pWin = mpShell->FindBasWin(mpShell->m_aCurDocument, mpShell->m_aCurLibName, sModuleName, false, true);
124 0 : if( pWin )
125 0 : mpShell->RemoveWindow( pWin, true, true );
126 0 : }
127 0 : }
128 :
129 : };
130 :
131 0 : TYPEINIT1( Shell, SfxViewShell );
132 :
133 0 : SFX_IMPL_NAMED_VIEWFACTORY( Shell, "Default" )
134 : {
135 0 : SFX_VIEW_REGISTRATION( DocShell );
136 0 : }
137 :
138 0 : SFX_IMPL_INTERFACE(basctl_Shell, SfxViewShell)
139 :
140 0 : void basctl_Shell::InitInterface_Impl()
141 : {
142 0 : GetStaticInterface()->RegisterChildWindow(SID_SEARCH_DLG);
143 0 : GetStaticInterface()->RegisterChildWindow(SID_SHOW_PROPERTYBROWSER, false, BASICIDE_UI_FEATURE_SHOW_BROWSER);
144 0 : GetStaticInterface()->RegisterChildWindow(SfxInfoBarContainerChild::GetChildWindowId());
145 :
146 0 : GetStaticInterface()->RegisterPopupMenu(IDEResId(RID_POPUP_DLGED));
147 0 : }
148 :
149 : unsigned Shell::nShellCount = 0;
150 :
151 0 : Shell::Shell( SfxViewFrame* pFrame_, SfxViewShell* /* pOldShell */ ) :
152 0 : SfxViewShell( pFrame_, SfxViewShellFlags::CAN_PRINT | SfxViewShellFlags::NO_NEWWINDOW ),
153 0 : m_aCurDocument( ScriptDocument::getApplicationScriptDocument() ),
154 0 : aHScrollBar( VclPtr<ScrollBar>::Create(&GetViewFrame()->GetWindow(), WinBits( WB_HSCROLL | WB_DRAG )) ),
155 0 : aVScrollBar( VclPtr<ScrollBar>::Create(&GetViewFrame()->GetWindow(), WinBits( WB_VSCROLL | WB_DRAG )) ),
156 0 : aScrollBarBox( VclPtr<ScrollBarBox>::Create(&GetViewFrame()->GetWindow(), WinBits( WB_SIZEABLE )) ),
157 : pLayout(0),
158 0 : aObjectCatalog(VclPtr<ObjectCatalog>::Create(&GetViewFrame()->GetWindow())),
159 : m_bAppBasicModified( false ),
160 0 : m_aNotifier( *this )
161 : {
162 0 : m_xLibListener = new ContainerListenerImpl( this );
163 0 : Init();
164 0 : nShellCount++;
165 0 : }
166 :
167 0 : void Shell::Init()
168 : {
169 0 : TbxControls::RegisterControl( SID_CHOOSE_CONTROLS );
170 0 : SvxPosSizeStatusBarControl::RegisterControl();
171 0 : SvxInsertStatusBarControl::RegisterControl();
172 0 : XmlSecStatusBarControl::RegisterControl( SID_SIGNATURE );
173 0 : SvxSimpleUndoRedoController::RegisterControl( SID_UNDO );
174 0 : SvxSimpleUndoRedoController::RegisterControl( SID_REDO );
175 :
176 0 : SvxSearchDialogWrapper::RegisterChildWindow(false);
177 :
178 0 : GetExtraData()->ShellInCriticalSection() = true;
179 :
180 0 : SetName( OUString( "BasicIDE" ) );
181 0 : SetHelpId( SVX_INTERFACE_BASIDE_VIEWSH );
182 :
183 0 : LibBoxControl::RegisterControl( SID_BASICIDE_LIBSELECTOR );
184 0 : LanguageBoxControl::RegisterControl( SID_BASICIDE_CURRENT_LANG );
185 :
186 0 : GetViewFrame()->GetWindow().SetBackground(
187 0 : GetViewFrame()->GetWindow().GetSettings().GetStyleSettings().GetWindowColor()
188 0 : );
189 :
190 0 : pCurWin = 0;
191 0 : m_aCurDocument = ScriptDocument::getApplicationScriptDocument();
192 0 : bCreatingWindow = false;
193 :
194 0 : pTabBar.reset(VclPtr<TabBar>::Create(&GetViewFrame()->GetWindow()));
195 0 : pTabBar->SetSplitHdl( LINK( this, Shell, TabBarSplitHdl ) );
196 0 : bTabBarSplitted = false;
197 :
198 0 : nCurKey = 100;
199 0 : InitScrollBars();
200 0 : InitTabBar();
201 :
202 0 : SetCurLib( ScriptDocument::getApplicationScriptDocument(), "Standard", false, false );
203 :
204 0 : ShellCreated(this);
205 :
206 0 : GetExtraData()->ShellInCriticalSection() = false;
207 :
208 : // It's enough to create the controller ...
209 : // It will be public by using magic :-)
210 0 : new Controller(this);
211 :
212 : // Force updating the title ! Because it must be set to the controller
213 : // it has to be called directly after creating those controller.
214 0 : SetMDITitle ();
215 :
216 0 : UpdateWindows();
217 0 : }
218 :
219 0 : Shell::~Shell()
220 : {
221 0 : m_aNotifier.dispose();
222 :
223 0 : ShellDestroyed(this);
224 :
225 : // so that on a basic saving error, the shell doesn't pop right up again
226 0 : GetExtraData()->ShellInCriticalSection() = true;
227 :
228 0 : SetWindow( 0 );
229 0 : SetCurWindow( 0 );
230 :
231 0 : aObjectCatalog.disposeAndClear();
232 0 : aScrollBarBox.disposeAndClear();
233 0 : aVScrollBar.disposeAndClear();
234 0 : aHScrollBar.disposeAndClear();
235 :
236 0 : for (WindowTable::iterator it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
237 : {
238 : // no store; does already happen when the BasicManagers are destroyed
239 0 : it->second.disposeAndClear();
240 : }
241 :
242 : // no store; does already happen when the BasicManagers are destroyed
243 0 : aWindowTable.clear();
244 :
245 : // Destroy all ContainerListeners for Basic Container.
246 0 : if (ContainerListenerImpl* pListener = static_cast<ContainerListenerImpl*>(m_xLibListener.get()))
247 0 : pListener->removeContainerListener(m_aCurDocument, m_aCurLibName);
248 :
249 0 : GetExtraData()->ShellInCriticalSection() = false;
250 :
251 0 : nShellCount--;
252 :
253 0 : pDialogLayout.disposeAndClear();
254 0 : pModulLayout.disposeAndClear();
255 0 : pTabBar.disposeAndClear();
256 0 : }
257 :
258 0 : void Shell::onDocumentCreated( const ScriptDocument& /*_rDocument*/ )
259 : {
260 0 : if (pCurWin)
261 : {
262 0 : pCurWin->OnNewDocument();
263 :
264 : // for VBA documents, show a warning that we can save them only in ODF
265 0 : if (pCurWin->GetDocument().isInVBAMode())
266 0 : GetViewFrame()->AppendInfoBar("vba_save", IDE_RESSTR(RID_STR_CANNOTSAVEVBA));
267 : }
268 :
269 0 : UpdateWindows();
270 0 : }
271 :
272 0 : void Shell::onDocumentOpened( const ScriptDocument& /*_rDocument*/ )
273 : {
274 0 : if (pCurWin)
275 0 : pCurWin->OnNewDocument();
276 0 : UpdateWindows();
277 0 : }
278 :
279 0 : void Shell::onDocumentSave( const ScriptDocument& /*_rDocument*/ )
280 : {
281 0 : StoreAllWindowData();
282 0 : }
283 :
284 0 : void Shell::onDocumentSaveDone( const ScriptDocument& /*_rDocument*/ )
285 : {
286 : // #i115671: Update SID_SAVEDOC after saving is completed
287 0 : if (SfxBindings* pBindings = GetBindingsPtr())
288 0 : pBindings->Invalidate( SID_SAVEDOC );
289 0 : }
290 :
291 0 : void Shell::onDocumentSaveAs( const ScriptDocument& /*_rDocument*/ )
292 : {
293 0 : StoreAllWindowData();
294 0 : }
295 :
296 0 : void Shell::onDocumentSaveAsDone( const ScriptDocument& /*_rDocument*/ )
297 : {
298 : // not interested in
299 0 : }
300 :
301 0 : void Shell::onDocumentClosed( const ScriptDocument& _rDocument )
302 : {
303 0 : if ( !_rDocument.isValid() )
304 0 : return;
305 :
306 0 : bool bSetCurWindow = false;
307 0 : bool bSetCurLib = ( _rDocument == m_aCurDocument );
308 0 : std::vector<VclPtr<BaseWindow> > aDeleteVec;
309 :
310 : // remove all windows which belong to this document
311 0 : for (WindowTableIt it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
312 : {
313 0 : BaseWindow* pWin = it->second;
314 0 : if ( pWin->IsDocument( _rDocument ) )
315 : {
316 0 : if ( pWin->GetStatus() & (BASWIN_RUNNINGBASIC|BASWIN_INRESCHEDULE) )
317 : {
318 0 : pWin->AddStatus( BASWIN_TOBEKILLED );
319 0 : pWin->Hide();
320 0 : StarBASIC::Stop();
321 : // there's no notify
322 0 : pWin->BasicStopped();
323 : }
324 : else
325 0 : aDeleteVec.push_back( pWin );
326 : }
327 : }
328 : // delete windows outside main loop so we don't invalidate the original iterator
329 0 : for (auto it = aDeleteVec.begin(); it != aDeleteVec.end(); ++it)
330 : {
331 0 : BaseWindow* pWin = *it;
332 0 : pWin->StoreData();
333 0 : if ( pWin == pCurWin )
334 0 : bSetCurWindow = true;
335 0 : RemoveWindow( pWin, true, false );
336 : }
337 :
338 : // remove lib info
339 0 : if (ExtraData* pData = GetExtraData())
340 0 : pData->GetLibInfos().RemoveInfoFor( _rDocument );
341 :
342 0 : if ( bSetCurLib )
343 0 : SetCurLib( ScriptDocument::getApplicationScriptDocument(), "Standard", true, false );
344 0 : else if ( bSetCurWindow )
345 0 : SetCurWindow( FindApplicationWindow(), true );
346 : }
347 :
348 0 : void Shell::onDocumentTitleChanged( const ScriptDocument& /*_rDocument*/ )
349 : {
350 0 : if (SfxBindings* pBindings = GetBindingsPtr())
351 0 : pBindings->Invalidate( SID_BASICIDE_LIBSELECTOR, true, false );
352 0 : SetMDITitle();
353 0 : }
354 :
355 0 : void Shell::onDocumentModeChanged( const ScriptDocument& _rDocument )
356 : {
357 0 : for (WindowTableIt it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
358 : {
359 0 : BaseWindow* pWin = it->second;
360 0 : if ( pWin->IsDocument( _rDocument ) && _rDocument.isDocument() )
361 0 : pWin->SetReadOnly( _rDocument.isReadOnly() );
362 : }
363 0 : }
364 :
365 0 : void Shell::StoreAllWindowData( bool bPersistent )
366 : {
367 0 : for (WindowTableIt it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
368 : {
369 0 : BaseWindow* pWin = it->second;
370 : DBG_ASSERT( pWin, "PrepareClose: NULL-Pointer in Table?" );
371 0 : if ( !pWin->IsSuspended() )
372 0 : pWin->StoreData();
373 : }
374 :
375 0 : if ( bPersistent )
376 : {
377 0 : SfxGetpApp()->SaveBasicAndDialogContainer();
378 0 : SetAppBasicModified(false);
379 :
380 0 : if (SfxBindings* pBindings = GetBindingsPtr())
381 : {
382 0 : pBindings->Invalidate( SID_SAVEDOC );
383 0 : pBindings->Update( SID_SAVEDOC );
384 : }
385 : }
386 0 : }
387 :
388 :
389 0 : bool Shell::PrepareClose( bool bUI )
390 : {
391 : // reset here because it's modified after printing etc. (DocInfo)
392 0 : GetViewFrame()->GetObjectShell()->SetModified(false);
393 :
394 0 : if ( StarBASIC::IsRunning() )
395 : {
396 0 : if( bUI )
397 : {
398 0 : vcl::Window *pParent = &GetViewFrame()->GetWindow();
399 0 : ScopedVclPtr<InfoBox>::Create( pParent, IDE_RESSTR(RID_STR_CANNOTCLOSE))->Execute();
400 : }
401 0 : return false;
402 : }
403 : else
404 : {
405 0 : bool bCanClose = true;
406 0 : for (WindowTableIt it = aWindowTable.begin(); bCanClose && (it != aWindowTable.end()); ++it)
407 : {
408 0 : BaseWindow* pWin = it->second;
409 0 : if ( !pWin->CanClose() )
410 : {
411 0 : if ( !m_aCurLibName.isEmpty() && ( pWin->IsDocument( m_aCurDocument ) || pWin->GetLibName() != m_aCurLibName ) )
412 0 : SetCurLib( ScriptDocument::getApplicationScriptDocument(), OUString(), false );
413 0 : SetCurWindow( pWin, true );
414 0 : bCanClose = false;
415 : }
416 : }
417 :
418 0 : if ( bCanClose )
419 0 : StoreAllWindowData( false ); // don't write on the disk, that will be done later automatically
420 :
421 0 : return bCanClose;
422 : }
423 : }
424 :
425 0 : void Shell::InitScrollBars()
426 : {
427 0 : aVScrollBar->SetLineSize( 300 );
428 0 : aVScrollBar->SetPageSize( 2000 );
429 0 : aHScrollBar->SetLineSize( 300 );
430 0 : aHScrollBar->SetPageSize( 2000 );
431 0 : aHScrollBar->Enable();
432 0 : aVScrollBar->Enable();
433 0 : aVScrollBar->Show();
434 0 : aHScrollBar->Show();
435 0 : aScrollBarBox->Show();
436 0 : }
437 :
438 :
439 :
440 0 : void Shell::InitTabBar()
441 : {
442 0 : pTabBar->Enable();
443 0 : pTabBar->Show();
444 0 : pTabBar->SetSelectHdl( LINK( this, Shell, TabBarHdl ) );
445 0 : }
446 :
447 :
448 :
449 0 : void Shell::OuterResizePixel( const Point &rPos, const Size &rSize )
450 : {
451 0 : AdjustPosSizePixel( rPos, rSize );
452 0 : }
453 :
454 :
455 0 : IMPL_LINK( Shell, TabBarSplitHdl, TabBar *, pTBar )
456 : {
457 : (void)pTBar;
458 0 : bTabBarSplitted = true;
459 0 : ArrangeTabBar();
460 :
461 0 : return 0;
462 : }
463 :
464 0 : IMPL_LINK( Shell, TabBarHdl, TabBar *, pCurTabBar )
465 : {
466 0 : sal_uInt16 nCurId = pCurTabBar->GetCurPageId();
467 0 : BaseWindow* pWin = aWindowTable[ nCurId ];
468 : DBG_ASSERT( pWin, "Eintrag in TabBar passt zu keinem Fenster!" );
469 0 : SetCurWindow( pWin );
470 :
471 0 : return 0;
472 : }
473 :
474 :
475 :
476 0 : bool Shell::NextPage( bool bPrev )
477 : {
478 0 : bool bRet = false;
479 0 : sal_uInt16 nPos = pTabBar->GetPagePos( pTabBar->GetCurPageId() );
480 :
481 0 : if ( bPrev )
482 0 : --nPos;
483 : else
484 0 : ++nPos;
485 :
486 0 : if ( nPos < pTabBar->GetPageCount() )
487 : {
488 0 : BaseWindow* pWin = aWindowTable[ pTabBar->GetPageId( nPos ) ];
489 0 : SetCurWindow( pWin, true );
490 0 : bRet = true;
491 : }
492 :
493 0 : return bRet;
494 : }
495 :
496 :
497 :
498 0 : void Shell::ArrangeTabBar()
499 : {
500 0 : long nBoxPos = aScrollBarBox->GetPosPixel().X() - 1;
501 0 : long nPos = pTabBar->GetSplitSize();
502 0 : if ( nPos <= nBoxPos )
503 : {
504 0 : Point aPnt( pTabBar->GetPosPixel() );
505 0 : long nH = aHScrollBar->GetSizePixel().Height();
506 0 : pTabBar->SetPosSizePixel( aPnt, Size( nPos, nH ) );
507 0 : long nScrlStart = aPnt.X() + nPos;
508 0 : aHScrollBar->SetPosSizePixel( Point( nScrlStart, aPnt.Y() ), Size( nBoxPos - nScrlStart + 2, nH ) );
509 0 : aHScrollBar->Update();
510 : }
511 0 : }
512 :
513 :
514 :
515 0 : ::svl::IUndoManager* Shell::GetUndoManager()
516 : {
517 0 : ::svl::IUndoManager* pMgr = NULL;
518 0 : if( pCurWin )
519 0 : pMgr = pCurWin->GetUndoManager();
520 :
521 0 : return pMgr;
522 : }
523 :
524 :
525 :
526 0 : void Shell::SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId&,
527 : const SfxHint& rHint, const TypeId& )
528 : {
529 0 : if (GetShell())
530 : {
531 0 : if (SfxSimpleHint const* pSimpleHint = dynamic_cast<SfxSimpleHint const*>(&rHint))
532 : {
533 0 : switch (pSimpleHint->GetId())
534 : {
535 : case SFX_HINT_DYING:
536 : {
537 0 : EndListening( rBC, true /* log off all */ );
538 0 : aObjectCatalog->UpdateEntries();
539 : }
540 0 : break;
541 : }
542 :
543 0 : if (SbxHint const* pSbxHint = dynamic_cast<SbxHint const*>(&rHint))
544 : {
545 0 : sal_uLong nHintId = pSbxHint->GetId();
546 0 : if ( ( nHintId == SBX_HINT_BASICSTART ) ||
547 : ( nHintId == SBX_HINT_BASICSTOP ) )
548 : {
549 0 : if (SfxBindings* pBindings = GetBindingsPtr())
550 : {
551 0 : pBindings->Invalidate( SID_BASICRUN );
552 0 : pBindings->Update( SID_BASICRUN );
553 0 : pBindings->Invalidate( SID_BASICCOMPILE );
554 0 : pBindings->Update( SID_BASICCOMPILE );
555 0 : pBindings->Invalidate( SID_BASICSTEPOVER );
556 0 : pBindings->Update( SID_BASICSTEPOVER );
557 0 : pBindings->Invalidate( SID_BASICSTEPINTO );
558 0 : pBindings->Update( SID_BASICSTEPINTO );
559 0 : pBindings->Invalidate( SID_BASICSTEPOUT );
560 0 : pBindings->Update( SID_BASICSTEPOUT );
561 0 : pBindings->Invalidate( SID_BASICSTOP );
562 0 : pBindings->Update( SID_BASICSTOP );
563 0 : pBindings->Invalidate( SID_BASICIDE_TOGGLEBRKPNT );
564 0 : pBindings->Update( SID_BASICIDE_TOGGLEBRKPNT );
565 0 : pBindings->Invalidate( SID_BASICIDE_MANAGEBRKPNTS );
566 0 : pBindings->Update( SID_BASICIDE_MANAGEBRKPNTS );
567 0 : pBindings->Invalidate( SID_BASICIDE_MODULEDLG );
568 0 : pBindings->Update( SID_BASICIDE_MODULEDLG );
569 0 : pBindings->Invalidate( SID_BASICLOAD );
570 0 : pBindings->Update( SID_BASICLOAD );
571 : }
572 :
573 0 : if ( nHintId == SBX_HINT_BASICSTOP )
574 : {
575 : // not only at error/break or explicit stoppage,
576 : // if the update is turned off due to a programming bug
577 0 : BasicStopped();
578 0 : if (pLayout)
579 0 : pLayout->UpdateDebug(true); // clear...
580 0 : if( m_pCurLocalizationMgr )
581 0 : m_pCurLocalizationMgr->handleBasicStopped();
582 : }
583 0 : else if( m_pCurLocalizationMgr )
584 : {
585 0 : m_pCurLocalizationMgr->handleBasicStarted();
586 : }
587 :
588 0 : for (WindowTableIt it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
589 : {
590 0 : BaseWindow* pWin = it->second;
591 0 : if ( nHintId == SBX_HINT_BASICSTART )
592 0 : pWin->BasicStarted();
593 : else
594 0 : pWin->BasicStopped();
595 : }
596 : }
597 : }
598 : }
599 : }
600 0 : }
601 :
602 :
603 :
604 0 : void Shell::CheckWindows()
605 : {
606 0 : bool bSetCurWindow = false;
607 0 : std::vector<VclPtr<BaseWindow> > aDeleteVec;
608 0 : for (WindowTableIt it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
609 : {
610 0 : BaseWindow* pWin = it->second;
611 0 : if ( pWin->GetStatus() & BASWIN_TOBEKILLED )
612 0 : aDeleteVec.push_back( pWin );
613 : }
614 0 : for ( auto it = aDeleteVec.begin(); it != aDeleteVec.end(); ++it )
615 : {
616 0 : BaseWindow* pWin = *it;
617 0 : pWin->StoreData();
618 0 : if ( pWin == pCurWin )
619 0 : bSetCurWindow = true;
620 0 : RemoveWindow( pWin, true, false );
621 : }
622 0 : if ( bSetCurWindow )
623 0 : SetCurWindow( FindApplicationWindow(), true );
624 0 : }
625 :
626 :
627 :
628 0 : void Shell::RemoveWindows( const ScriptDocument& rDocument, const OUString& rLibName, bool bDestroy )
629 : {
630 0 : bool bChangeCurWindow = pCurWin;
631 0 : std::vector<VclPtr<BaseWindow> > aDeleteVec;
632 0 : for (WindowTableIt it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
633 : {
634 0 : BaseWindow* pWin = it->second;
635 0 : if ( pWin->IsDocument( rDocument ) && pWin->GetLibName() == rLibName )
636 0 : aDeleteVec.push_back( pWin );
637 : }
638 0 : for ( auto it = aDeleteVec.begin(); it != aDeleteVec.end(); ++it )
639 : {
640 0 : BaseWindow* pWin = *it;
641 0 : if ( pWin == pCurWin )
642 0 : bChangeCurWindow = true;
643 0 : pWin->StoreData();
644 0 : RemoveWindow( pWin, bDestroy, false );
645 : }
646 0 : if ( bChangeCurWindow )
647 0 : SetCurWindow( FindApplicationWindow(), true );
648 0 : }
649 :
650 :
651 :
652 0 : void Shell::UpdateWindows()
653 : {
654 : // remove all windows that may not be displayed
655 0 : bool bChangeCurWindow = pCurWin == nullptr;
656 0 : if ( !m_aCurLibName.isEmpty() )
657 : {
658 0 : std::vector<VclPtr<BaseWindow> > aDeleteVec;
659 0 : for (WindowTableIt it = aWindowTable.begin(); it != aWindowTable.end(); ++it)
660 : {
661 0 : BaseWindow* pWin = it->second;
662 0 : if ( !pWin->IsDocument( m_aCurDocument ) || pWin->GetLibName() != m_aCurLibName )
663 : {
664 0 : if ( pWin == pCurWin )
665 0 : bChangeCurWindow = true;
666 0 : pWin->StoreData();
667 : // The request of RUNNING prevents the crash when in reschedule.
668 : // Window is frozen at first, later the windows should be changed
669 : // anyway to be marked as hidden instead of being deleted.
670 0 : if ( !(pWin->GetStatus() & ( BASWIN_TOBEKILLED | BASWIN_RUNNINGBASIC | BASWIN_SUSPENDED ) ) )
671 0 : aDeleteVec.push_back( pWin );
672 : }
673 : }
674 0 : for ( auto it = aDeleteVec.begin(); it != aDeleteVec.end(); ++it )
675 : {
676 0 : RemoveWindow( *it, false, false );
677 0 : }
678 : }
679 :
680 0 : if ( bCreatingWindow )
681 0 : return;
682 :
683 0 : BaseWindow* pNextActiveWindow = 0;
684 :
685 : // show all windows that are to be shown
686 0 : ScriptDocuments aDocuments( ScriptDocument::getAllScriptDocuments( ScriptDocument::AllWithApplication ) );
687 0 : for ( ScriptDocuments::const_iterator doc = aDocuments.begin();
688 0 : doc != aDocuments.end();
689 : ++doc
690 : )
691 : {
692 0 : StartListening( *doc->getBasicManager(), true /* log on only once */ );
693 :
694 : // libraries
695 0 : Sequence< OUString > aLibNames( doc->getLibraryNames() );
696 0 : sal_Int32 nLibCount = aLibNames.getLength();
697 0 : const OUString* pLibNames = aLibNames.getConstArray();
698 :
699 0 : for ( sal_Int32 i = 0 ; i < nLibCount ; i++ )
700 : {
701 0 : OUString aLibName = pLibNames[ i ];
702 :
703 0 : if ( m_aCurLibName.isEmpty() || ( *doc == m_aCurDocument && aLibName == m_aCurLibName ) )
704 : {
705 : // check, if library is password protected and not verified
706 0 : bool bProtected = false;
707 0 : Reference< script::XLibraryContainer > xModLibContainer( doc->getLibraryContainer( E_SCRIPTS ) );
708 0 : if ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) )
709 : {
710 0 : Reference< script::XLibraryContainerPassword > xPasswd( xModLibContainer, UNO_QUERY );
711 0 : if ( xPasswd.is() && xPasswd->isLibraryPasswordProtected( aLibName ) && !xPasswd->isLibraryPasswordVerified( aLibName ) )
712 : {
713 0 : bProtected = true;
714 0 : }
715 : }
716 :
717 0 : if ( !bProtected )
718 : {
719 0 : LibInfos::Item const* pLibInfoItem = 0;
720 0 : if (ExtraData* pData = GetExtraData())
721 0 : pLibInfoItem = pData->GetLibInfos().GetInfo(*doc, aLibName);
722 :
723 : // modules
724 0 : if ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) )
725 : {
726 0 : StarBASIC* pLib = doc->getBasicManager()->GetLib( aLibName );
727 0 : if ( pLib )
728 0 : ImplStartListening( pLib );
729 :
730 : try
731 : {
732 0 : Sequence< OUString > aModNames( doc->getObjectNames( E_SCRIPTS, aLibName ) );
733 0 : sal_Int32 nModCount = aModNames.getLength();
734 0 : const OUString* pModNames = aModNames.getConstArray();
735 :
736 0 : for ( sal_Int32 j = 0 ; j < nModCount ; j++ )
737 : {
738 0 : OUString aModName = pModNames[ j ];
739 0 : ModulWindow* pWin = FindBasWin( *doc, aLibName, aModName, false );
740 0 : if ( !pWin )
741 0 : pWin = CreateBasWin( *doc, aLibName, aModName );
742 0 : if ( !pNextActiveWindow && pLibInfoItem && pLibInfoItem->GetCurrentName() == aModName &&
743 0 : pLibInfoItem->GetCurrentType() == TYPE_MODULE )
744 : {
745 0 : pNextActiveWindow = static_cast<BaseWindow*>(pWin);
746 : }
747 0 : }
748 : }
749 0 : catch (const container::NoSuchElementException& )
750 : {
751 : DBG_UNHANDLED_EXCEPTION();
752 : }
753 : }
754 :
755 : // dialogs
756 0 : Reference< script::XLibraryContainer > xDlgLibContainer( doc->getLibraryContainer( E_DIALOGS ) );
757 0 : if ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aLibName ) )
758 : {
759 : try
760 : {
761 0 : Sequence< OUString > aDlgNames = doc->getObjectNames( E_DIALOGS, aLibName );
762 0 : sal_Int32 nDlgCount = aDlgNames.getLength();
763 0 : const OUString* pDlgNames = aDlgNames.getConstArray();
764 :
765 0 : for ( sal_Int32 j = 0 ; j < nDlgCount ; j++ )
766 : {
767 0 : OUString aDlgName = pDlgNames[ j ];
768 : // this find only looks for non-suspended windows;
769 : // suspended windows are handled in CreateDlgWin
770 0 : VclPtr<DialogWindow> pWin = FindDlgWin( *doc, aLibName, aDlgName, false );
771 0 : if ( !pWin )
772 0 : pWin = CreateDlgWin( *doc, aLibName, aDlgName );
773 0 : if ( !pNextActiveWindow && pLibInfoItem && pLibInfoItem->GetCurrentName() == aDlgName &&
774 0 : pLibInfoItem->GetCurrentType() == TYPE_DIALOG )
775 : {
776 0 : pNextActiveWindow = static_cast<BaseWindow*>(pWin);
777 : }
778 0 : }
779 : }
780 0 : catch (const container::NoSuchElementException& )
781 : {
782 : DBG_UNHANDLED_EXCEPTION();
783 : }
784 0 : }
785 0 : }
786 : }
787 0 : }
788 0 : }
789 :
790 0 : if ( bChangeCurWindow )
791 : {
792 0 : if ( !pNextActiveWindow )
793 : {
794 0 : pNextActiveWindow = FindApplicationWindow();
795 : }
796 0 : SetCurWindow( pNextActiveWindow, true );
797 0 : }
798 : }
799 :
800 0 : void Shell::RemoveWindow( BaseWindow* pWindow_, bool bDestroy, bool bAllowChangeCurWindow )
801 : {
802 : DBG_ASSERT( pWindow_, "Kann keinen NULL-Pointer loeschen!" );
803 0 : sal_uLong nKey = GetWindowId( pWindow_ );
804 0 : pTabBar->RemovePage( (sal_uInt16)nKey );
805 0 : aWindowTable.erase( nKey );
806 0 : if ( pWindow_ == pCurWin )
807 : {
808 0 : if ( bAllowChangeCurWindow )
809 : {
810 0 : SetCurWindow( FindApplicationWindow(), true );
811 : }
812 : else
813 : {
814 0 : SetCurWindow( NULL, false );
815 : }
816 : }
817 0 : if ( bDestroy )
818 : {
819 0 : if ( !( pWindow_->GetStatus() & BASWIN_INRESCHEDULE ) )
820 : {
821 0 : pWindow_->disposeOnce();
822 : }
823 : else
824 : {
825 0 : pWindow_->AddStatus( BASWIN_TOBEKILLED );
826 0 : pWindow_->Hide();
827 : // In normal mode stop basic in windows to be deleted
828 : // In VBA stop basic only if the running script is trying to delete
829 : // its parent module
830 0 : bool bStop = true;
831 0 : if ( pWindow_->GetDocument().isInVBAMode() )
832 : {
833 0 : SbModule* pMod = StarBASIC::GetActiveModule();
834 0 : if ( !pMod || ( pMod && ( !pMod->GetName().equals(pWindow_->GetName()) ) ) )
835 : {
836 0 : bStop = false;
837 : }
838 : }
839 0 : if ( bStop )
840 : {
841 0 : StarBASIC::Stop();
842 : // there will be no notify...
843 0 : pWindow_->BasicStopped();
844 : }
845 0 : aWindowTable[ nKey ] = pWindow_; // jump in again
846 : }
847 : }
848 : else
849 : {
850 0 : pWindow_->AddStatus( BASWIN_SUSPENDED );
851 0 : pWindow_->Deactivating();
852 0 : aWindowTable[ nKey ] = pWindow_; // jump in again
853 : }
854 :
855 0 : }
856 :
857 :
858 :
859 0 : sal_uInt16 Shell::InsertWindowInTable( BaseWindow* pNewWin )
860 : {
861 0 : nCurKey++;
862 0 : aWindowTable[ nCurKey ] = pNewWin;
863 0 : return nCurKey;
864 : }
865 :
866 :
867 :
868 0 : void Shell::InvalidateBasicIDESlots()
869 : {
870 : // only those that have an optic effect...
871 :
872 0 : if (GetShell())
873 : {
874 0 : if (SfxBindings* pBindings = GetBindingsPtr())
875 : {
876 0 : pBindings->Invalidate( SID_COPY );
877 0 : pBindings->Invalidate( SID_CUT );
878 0 : pBindings->Invalidate( SID_PASTE );
879 0 : pBindings->Invalidate( SID_UNDO );
880 0 : pBindings->Invalidate( SID_REDO );
881 0 : pBindings->Invalidate( SID_SAVEDOC );
882 0 : pBindings->Invalidate( SID_SIGNATURE );
883 0 : pBindings->Invalidate( SID_BASICIDE_CHOOSEMACRO );
884 0 : pBindings->Invalidate( SID_BASICIDE_MODULEDLG );
885 0 : pBindings->Invalidate( SID_BASICIDE_OBJCAT );
886 0 : pBindings->Invalidate( SID_BASICSTOP );
887 0 : pBindings->Invalidate( SID_BASICRUN );
888 0 : pBindings->Invalidate( SID_BASICCOMPILE );
889 0 : pBindings->Invalidate( SID_BASICLOAD );
890 0 : pBindings->Invalidate( SID_BASICSAVEAS );
891 0 : pBindings->Invalidate( SID_BASICIDE_MATCHGROUP );
892 0 : pBindings->Invalidate( SID_BASICSTEPINTO );
893 0 : pBindings->Invalidate( SID_BASICSTEPOVER );
894 0 : pBindings->Invalidate( SID_BASICSTEPOUT );
895 0 : pBindings->Invalidate( SID_BASICIDE_TOGGLEBRKPNT );
896 0 : pBindings->Invalidate( SID_BASICIDE_MANAGEBRKPNTS );
897 0 : pBindings->Invalidate( SID_BASICIDE_ADDWATCH );
898 0 : pBindings->Invalidate( SID_BASICIDE_REMOVEWATCH );
899 0 : pBindings->Invalidate( SID_CHOOSE_CONTROLS );
900 0 : pBindings->Invalidate( SID_PRINTDOC );
901 0 : pBindings->Invalidate( SID_PRINTDOCDIRECT );
902 0 : pBindings->Invalidate( SID_SETUPPRINTER );
903 0 : pBindings->Invalidate( SID_DIALOG_TESTMODE );
904 :
905 0 : pBindings->Invalidate( SID_DOC_MODIFIED );
906 0 : pBindings->Invalidate( SID_BASICIDE_STAT_TITLE );
907 0 : pBindings->Invalidate( SID_BASICIDE_STAT_POS );
908 0 : pBindings->Invalidate( SID_ATTR_INSERT );
909 0 : pBindings->Invalidate( SID_ATTR_SIZE );
910 : }
911 : }
912 0 : }
913 :
914 0 : void Shell::EnableScrollbars( bool bEnable )
915 : {
916 0 : aHScrollBar->Enable(bEnable);
917 0 : aVScrollBar->Enable(bEnable);
918 0 : }
919 :
920 0 : void Shell::SetCurLib( const ScriptDocument& rDocument, const OUString& aLibName, bool bUpdateWindows, bool bCheck )
921 : {
922 0 : if ( !bCheck || ( rDocument != m_aCurDocument || aLibName != m_aCurLibName ) )
923 : {
924 0 : ContainerListenerImpl* pListener = static_cast< ContainerListenerImpl* >( m_xLibListener.get() );
925 :
926 0 : m_aCurDocument = rDocument;
927 0 : m_aCurLibName = aLibName;
928 :
929 0 : if ( pListener )
930 : {
931 0 : pListener->removeContainerListener( m_aCurDocument, m_aCurLibName );
932 0 : pListener->addContainerListener( m_aCurDocument, aLibName );
933 : }
934 :
935 0 : if ( bUpdateWindows )
936 0 : UpdateWindows();
937 :
938 0 : SetMDITitle();
939 :
940 0 : SetCurLibForLocalization( rDocument, aLibName );
941 :
942 0 : if (SfxBindings* pBindings = GetBindingsPtr())
943 : {
944 0 : pBindings->Invalidate( SID_BASICIDE_LIBSELECTOR );
945 0 : pBindings->Invalidate( SID_BASICIDE_CURRENT_LANG );
946 0 : pBindings->Invalidate( SID_BASICIDE_MANAGE_LANG );
947 : }
948 : }
949 0 : }
950 :
951 0 : void Shell::SetCurLibForLocalization( const ScriptDocument& rDocument, const OUString& aLibName )
952 : {
953 : // Create LocalizationMgr
954 0 : Reference< resource::XStringResourceManager > xStringResourceManager;
955 : try
956 : {
957 0 : if( !aLibName.isEmpty() )
958 : {
959 0 : Reference< container::XNameContainer > xDialogLib( rDocument.getLibrary( E_DIALOGS, aLibName, true ) );
960 0 : xStringResourceManager = LocalizationMgr::getStringResourceFromDialogLibrary( xDialogLib );
961 : }
962 : }
963 0 : catch (const container::NoSuchElementException& )
964 : {}
965 :
966 0 : m_pCurLocalizationMgr = boost::shared_ptr<LocalizationMgr>(new LocalizationMgr(this, rDocument, aLibName, xStringResourceManager));
967 0 : m_pCurLocalizationMgr->handleTranslationbar();
968 0 : }
969 :
970 0 : void Shell::ImplStartListening( StarBASIC* pBasic )
971 : {
972 0 : StartListening( pBasic->GetBroadcaster(), true /* log on only once */ );
973 0 : }
974 :
975 0 : } // namespace basctl
976 :
977 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|