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 <boost/scoped_ptr.hpp>
21 : #include <vcl/toolbox.hxx>
22 : #include <tools/rcid.h>
23 : #include <unotools/moduleoptions.hxx>
24 : #include <unotools/viewoptions.hxx>
25 : #include <com/sun/star/frame/ModuleManager.hpp>
26 : #include <com/sun/star/frame/XController.hpp>
27 : #include <com/sun/star/frame/XFrame.hpp>
28 : #include <com/sun/star/util/XCloseable.hpp>
29 : #include <comphelper/processfactory.hxx>
30 : #include <comphelper/string.hxx>
31 : #include <cppuhelper/implbase1.hxx>
32 :
33 : #include <sfx2/childwin.hxx>
34 : #include <sfx2/app.hxx>
35 : #include "arrdecl.hxx"
36 : #include <sfx2/bindings.hxx>
37 : #include <sfx2/module.hxx>
38 : #include <sfx2/dockwin.hxx>
39 : #include <sfx2/dispatch.hxx>
40 : #include "workwin.hxx"
41 :
42 : static const sal_uInt16 nVersion = 2;
43 :
44 0 : struct SfxChildWindow_Impl
45 : {
46 : ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > xFrame;
47 : ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > xListener;
48 : SfxChildWinFactory* pFact;
49 : bool bHideNotDelete;
50 : bool bVisible;
51 : bool bHideAtToggle;
52 : bool bWantsFocus;
53 : SfxModule* pContextModule;
54 : SfxWorkWindow* pWorkWin;
55 : };
56 :
57 :
58 :
59 0 : class DisposeListener : public ::cppu::WeakImplHelper1< ::com::sun::star::lang::XEventListener >
60 : {
61 : public:
62 0 : DisposeListener( SfxChildWindow* pOwner ,
63 : SfxChildWindow_Impl* pData )
64 : : m_pOwner( pOwner )
65 0 : , m_pData ( pData )
66 0 : {}
67 :
68 0 : virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& aSource ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE
69 : {
70 0 : ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > xSelfHold( this );
71 :
72 0 : ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > xComp( aSource.Source, ::com::sun::star::uno::UNO_QUERY );
73 0 : if( xComp.is() )
74 0 : xComp->removeEventListener( this );
75 :
76 0 : if( m_pOwner && m_pData )
77 : {
78 0 : m_pData->xListener = ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >();
79 :
80 0 : if ( m_pData->pWorkWin )
81 : {
82 : // m_pOwner and m_pData will be killed
83 0 : m_pData->xFrame = ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >();
84 0 : m_pData->pWorkWin->GetBindings().Execute( m_pOwner->GetType() );
85 : }
86 : else
87 : {
88 0 : delete m_pOwner;
89 : }
90 :
91 0 : m_pOwner = NULL;
92 0 : m_pData = NULL;
93 0 : }
94 0 : }
95 :
96 : private:
97 : SfxChildWindow* m_pOwner;
98 : SfxChildWindow_Impl* m_pData ;
99 : };
100 :
101 :
102 :
103 0 : bool GetPosSizeFromString( const OUString& rStr, Point& rPos, Size& rSize )
104 : {
105 0 : if ( comphelper::string::getTokenCount(rStr, '/') != 4 )
106 0 : return false;
107 :
108 0 : sal_Int32 nIdx = 0;
109 0 : rPos.X() = rStr.getToken(0, '/', nIdx).toInt32();
110 0 : rPos.Y() = rStr.getToken(0, '/', nIdx).toInt32();
111 0 : rSize.Width() = rStr.getToken(0, '/', nIdx).toInt32();
112 0 : rSize.Height() = rStr.getToken(0, '/', nIdx).toInt32();
113 :
114 : // negative sizes are invalid
115 0 : if ( rSize.Width() < 0 || rSize.Height() < 0 )
116 0 : return false;
117 :
118 0 : return true;
119 : }
120 :
121 0 : bool GetSplitSizeFromString( const OUString& rStr, Size& rSize )
122 : {
123 0 : sal_Int32 nIndex = rStr.indexOf( ',' );
124 0 : if ( nIndex != -1 )
125 : {
126 0 : OUString aStr = rStr.copy( nIndex+1 );
127 :
128 0 : sal_Int32 nCount = comphelper::string::getTokenCount(aStr, ';');
129 0 : if ( nCount != 2 )
130 0 : return false;
131 :
132 0 : rSize.Width() = aStr.getToken(0, ';' ).toInt32();
133 0 : rSize.Height() = aStr.getToken(1, ';' ).toInt32();
134 :
135 : // negative sizes are invalid
136 0 : if ( rSize.Width() < 0 || rSize.Height() < 0 )
137 0 : return false;
138 :
139 0 : return true;
140 : }
141 :
142 0 : return false;
143 : }
144 :
145 :
146 0 : SfxChildWindow::SfxChildWindow(Window *pParentWindow, sal_uInt16 nId)
147 : : pParent(pParentWindow)
148 : , nType(nId)
149 : , eChildAlignment(SFX_ALIGN_NOALIGNMENT)
150 0 : , pWindow(0L)
151 : {
152 0 : pImp = new SfxChildWindow_Impl;
153 0 : pImp->pFact = 0L;
154 0 : pImp->bHideNotDelete = false;
155 0 : pImp->bHideAtToggle = false;
156 0 : pImp->bWantsFocus = true;
157 0 : pImp->bVisible = true;
158 0 : pImp->pContextModule = NULL;
159 0 : pImp->pWorkWin = NULL;
160 :
161 0 : pContext = 0L;
162 0 : }
163 :
164 0 : void SfxChildWindow::Destroy()
165 : {
166 0 : if ( GetFrame().is() )
167 : {
168 0 : pImp->pWorkWin = NULL;
169 : try
170 : {
171 0 : ::com::sun::star::uno::Reference < ::com::sun::star::util::XCloseable > xClose( GetFrame(), ::com::sun::star::uno::UNO_QUERY );
172 0 : if ( xClose.is() )
173 0 : xClose->close( sal_True );
174 : else
175 0 : GetFrame()->dispose();
176 : }
177 0 : catch (const com::sun::star::uno::Exception&)
178 : {
179 : }
180 : }
181 : else
182 0 : delete this;
183 0 : }
184 :
185 :
186 0 : SfxChildWindow::~SfxChildWindow()
187 : {
188 0 : delete pContext;
189 0 : delete pWindow;
190 0 : delete pImp;
191 0 : }
192 :
193 :
194 0 : SfxChildWindow* SfxChildWindow::CreateChildWindow( sal_uInt16 nId,
195 : Window *pParent, SfxBindings* pBindings, SfxChildWinInfo& rInfo)
196 : {
197 0 : SfxChildWindow *pChild=0;
198 0 : SfxChildWinFactory* pFact=0;
199 0 : sal_uInt16 nOldMode = Application::GetSystemWindowMode();
200 :
201 : // First search for ChildWindow in SDT; "Overloading has to be realized
202 : // by using ChildWindowContext
203 0 : SfxApplication *pApp = SFX_APP();
204 : {
205 0 : SfxChildWinFactArr_Impl &rFactories = pApp->GetChildWinFactories_Impl();
206 0 : for ( sal_uInt16 nFactory = 0; nFactory < rFactories.size(); ++nFactory )
207 : {
208 0 : pFact = rFactories[nFactory];
209 0 : if ( pFact->nId == nId )
210 : {
211 0 : SfxChildWinInfo& rFactInfo = pFact->aInfo;
212 0 : if ( rInfo.bVisible )
213 : {
214 0 : if ( pBindings )
215 0 : pBindings->ENTERREGISTRATIONS();
216 0 : SfxChildWinInfo aInfo = rFactInfo;
217 0 : Application::SetSystemWindowMode( SYSTEMWINDOW_MODE_NOAUTOMODE );
218 0 : pChild = pFact->pCtor( pParent, nId, pBindings, &aInfo );
219 0 : Application::SetSystemWindowMode( nOldMode );
220 0 : if ( pBindings )
221 0 : pBindings->LEAVEREGISTRATIONS();
222 : }
223 :
224 0 : break;
225 : }
226 : }
227 : }
228 :
229 0 : SfxDispatcher *pDisp = pBindings ? pBindings->GetDispatcher_Impl() : NULL;
230 0 : SfxModule *pMod = pDisp ? SfxModule::GetActiveModule( pDisp->GetFrame() ) : NULL;
231 0 : if (!pChild && pMod)
232 : {
233 0 : SfxChildWinFactArr_Impl *pFactories = pMod->GetChildWinFactories_Impl();
234 0 : if ( pFactories )
235 : {
236 0 : SfxChildWinFactArr_Impl &rFactories = *pFactories;
237 0 : for ( sal_uInt16 nFactory = 0; nFactory < rFactories.size(); ++nFactory )
238 : {
239 0 : pFact = rFactories[nFactory];
240 0 : if ( pFact->nId == nId )
241 : {
242 0 : SfxChildWinInfo& rFactInfo = pFact->aInfo;
243 0 : if ( rInfo.bVisible )
244 : {
245 0 : if ( pBindings )
246 0 : pBindings->ENTERREGISTRATIONS();
247 0 : SfxChildWinInfo aInfo = rFactInfo;
248 0 : Application::SetSystemWindowMode( SYSTEMWINDOW_MODE_NOAUTOMODE );
249 0 : pChild = pFact->pCtor( pParent, nId, pBindings, &aInfo );
250 0 : Application::SetSystemWindowMode( nOldMode );
251 0 : if ( pBindings )
252 0 : pBindings->LEAVEREGISTRATIONS();
253 : }
254 :
255 0 : break;
256 : }
257 : }
258 : }
259 : }
260 :
261 0 : if ( pChild )
262 0 : pChild->SetFactory_Impl( pFact );
263 :
264 : DBG_ASSERT(pFact && (pChild || !rInfo.bVisible), "ChildWindow-Typ not registered!");
265 :
266 0 : if ( pChild && !pChild->pWindow )
267 : {
268 0 : DELETEZ(pChild);
269 : DBG_WARNING("ChildWindow has no Window!");
270 : }
271 :
272 0 : return pChild;
273 : }
274 :
275 :
276 0 : void SfxChildWindow::SaveStatus(const SfxChildWinInfo& rInfo)
277 : {
278 0 : sal_uInt16 nID = GetType();
279 :
280 0 : OUStringBuffer aWinData;
281 0 : aWinData.append('V').append(static_cast<sal_Int32>(nVersion)).
282 0 : append(',').append(rInfo.bVisible ? 'V' : 'H').append(',').
283 0 : append(static_cast<sal_Int32>(rInfo.nFlags));
284 0 : if ( !rInfo.aExtraString.isEmpty() )
285 : {
286 0 : aWinData.append(',');
287 0 : aWinData.append(rInfo.aExtraString);
288 : }
289 :
290 0 : OUString sName(OUString::number(nID));
291 : //Try and save window state per-module, e.g. sidebar on in one application
292 : //but off in another
293 0 : if (!rInfo.aModule.isEmpty())
294 0 : sName = rInfo.aModule + "/" + sName;
295 0 : SvtViewOptions aWinOpt(E_WINDOW, sName);
296 0 : aWinOpt.SetWindowState(OStringToOUString(rInfo.aWinState, RTL_TEXTENCODING_UTF8));
297 :
298 0 : ::com::sun::star::uno::Sequence < ::com::sun::star::beans::NamedValue > aSeq(1);
299 0 : aSeq[0].Name = "Data";
300 0 : aSeq[0].Value <<= aWinData.makeStringAndClear();
301 0 : aWinOpt.SetUserData( aSeq );
302 :
303 : // ... but save status at runtime!
304 0 : pImp->pFact->aInfo = rInfo;
305 0 : }
306 :
307 :
308 0 : void SfxChildWindow::SetAlignment(SfxChildAlignment eAlign)
309 : {
310 :
311 0 : eChildAlignment = eAlign;
312 0 : }
313 :
314 :
315 0 : SfxChildWinInfo SfxChildWindow::GetInfo() const
316 : {
317 :
318 0 : SfxChildWinInfo aInfo(pImp->pFact->aInfo);
319 0 : aInfo.aPos = pWindow->GetPosPixel();
320 0 : aInfo.aSize = pWindow->GetSizePixel();
321 0 : if ( pWindow->IsSystemWindow() )
322 : {
323 0 : sal_uIntPtr nMask = WINDOWSTATE_MASK_POS | WINDOWSTATE_MASK_STATE;
324 0 : if ( pWindow->GetStyle() & WB_SIZEABLE )
325 0 : nMask |= ( WINDOWSTATE_MASK_WIDTH | WINDOWSTATE_MASK_HEIGHT );
326 0 : aInfo.aWinState = ((SystemWindow*)pWindow)->GetWindowState( nMask );
327 : }
328 0 : else if ( pWindow->GetType() == RSC_DOCKINGWINDOW )
329 : {
330 0 : if (((DockingWindow*)pWindow)->GetFloatingWindow() )
331 0 : aInfo.aWinState = ((DockingWindow*)pWindow)->GetFloatingWindow()->GetWindowState();
332 : else
333 : {
334 0 : SfxChildWinInfo aTmpInfo;
335 0 : ((SfxDockingWindow*)pWindow)->FillInfo( aTmpInfo );
336 0 : aInfo.aExtraString = aTmpInfo.aExtraString;
337 : }
338 : }
339 :
340 0 : aInfo.bVisible = pImp->bVisible;
341 0 : aInfo.nFlags = 0;
342 0 : return aInfo;
343 : }
344 :
345 :
346 0 : sal_uInt16 SfxChildWindow::GetPosition()
347 : {
348 0 : return pImp->pFact->nPos;
349 : }
350 :
351 :
352 0 : void SfxChildWindow::InitializeChildWinFactory_Impl(sal_uInt16 nId, SfxChildWinInfo& rInfo)
353 : {
354 : // load configuration
355 :
356 0 : boost::scoped_ptr<SvtViewOptions> xWinOpt;
357 : // first see if a module specific id exists
358 0 : if (rInfo.aModule.getLength())
359 0 : xWinOpt.reset(new SvtViewOptions(E_WINDOW, rInfo.aModule + "/" + OUString::number(nId)));
360 :
361 : // if not then try the generic id
362 0 : if (!xWinOpt || !xWinOpt->Exists())
363 0 : xWinOpt.reset(new SvtViewOptions(E_WINDOW, OUString::number(nId)));
364 :
365 0 : if (xWinOpt->Exists() && xWinOpt->HasVisible() )
366 0 : rInfo.bVisible = xWinOpt->IsVisible(); // set state from configuration. Can be overwritten by UserData, see below
367 :
368 0 : ::com::sun::star::uno::Sequence < ::com::sun::star::beans::NamedValue > aSeq = xWinOpt->GetUserData();
369 :
370 0 : OUString aTmp;
371 0 : if ( aSeq.getLength() )
372 0 : aSeq[0].Value >>= aTmp;
373 :
374 0 : OUString aWinData( aTmp );
375 0 : rInfo.aWinState = OUStringToOString(xWinOpt->GetWindowState(), RTL_TEXTENCODING_UTF8);
376 :
377 :
378 0 : if ( !aWinData.isEmpty() )
379 : {
380 : // Search for version ID
381 0 : if ( aWinData[0] != 0x0056 ) // 'V' = 56h
382 : // A version ID, so do not use
383 0 : return;
384 :
385 : // Delete 'V'
386 0 : aWinData = aWinData.copy(1);
387 :
388 : // Read version
389 0 : char cToken = ',';
390 0 : sal_Int32 nPos = aWinData.indexOf( cToken );
391 0 : sal_uInt16 nActVersion = (sal_uInt16)aWinData.copy( 0, nPos + 1 ).toInt32();
392 0 : if ( nActVersion != nVersion )
393 0 : return;
394 :
395 0 : aWinData = aWinData.copy(nPos+1);
396 :
397 : // Load Visibility: is coded as a char
398 0 : rInfo.bVisible = (aWinData[0] == 0x0056); // 'V' = 56h
399 0 : aWinData = aWinData.copy(1);
400 0 : nPos = aWinData.indexOf( cToken );
401 0 : if (nPos != -1)
402 : {
403 0 : sal_Int32 nNextPos = aWinData.indexOf( cToken, 2 );
404 0 : if ( nNextPos != -1 )
405 : {
406 : // there is extra information
407 0 : rInfo.nFlags = (sal_uInt16)aWinData.copy( nPos+1, nNextPos - nPos - 1 ).toInt32();
408 0 : aWinData = aWinData.replaceAt( nPos, nNextPos-nPos+1, "" );
409 0 : rInfo.aExtraString = aWinData;
410 : }
411 : else
412 0 : rInfo.nFlags = (sal_uInt16)aWinData.copy( nPos+1 ).toInt32();
413 : }
414 0 : }
415 : }
416 :
417 0 : void SfxChildWindow::CreateContext( sal_uInt16 nContextId, SfxBindings& rBindings )
418 : {
419 0 : SfxChildWindowContext *pCon = NULL;
420 0 : SfxChildWinFactory* pFact=0;
421 0 : SfxApplication *pApp = SFX_APP();
422 0 : SfxDispatcher *pDisp = rBindings.GetDispatcher_Impl();
423 0 : SfxModule *pMod = pDisp ? SfxModule::GetActiveModule( pDisp->GetFrame() ) :0;
424 0 : if ( pMod )
425 : {
426 0 : SfxChildWinFactArr_Impl *pFactories = pMod->GetChildWinFactories_Impl();
427 0 : if ( pFactories )
428 : {
429 0 : SfxChildWinFactArr_Impl &rFactories = *pFactories;
430 0 : for ( sal_uInt16 nFactory = 0; nFactory < rFactories.size(); ++nFactory )
431 : {
432 0 : pFact = rFactories[nFactory];
433 0 : if ( pFact->nId == GetType() )
434 : {
435 : DBG_ASSERT( pFact->pArr, "No context registered!" );
436 0 : if ( !pFact->pArr )
437 0 : break;
438 :
439 0 : for ( sal_uInt16 n=0; n<pFact->pArr->size(); ++n )
440 : {
441 0 : SfxChildWinContextFactory *pConFact = &(*pFact->pArr)[n];
442 0 : rBindings.ENTERREGISTRATIONS();
443 0 : if ( pConFact->nContextId == nContextId )
444 : {
445 0 : SfxChildWinInfo aInfo = pFact->aInfo;
446 0 : pCon = pConFact->pCtor( GetWindow(), &rBindings, &aInfo );
447 0 : pCon->nContextId = pConFact->nContextId;
448 0 : pImp->pContextModule = pMod;
449 : }
450 0 : rBindings.LEAVEREGISTRATIONS();
451 : }
452 0 : break;
453 : }
454 : }
455 : }
456 : }
457 :
458 0 : if ( !pCon )
459 : {
460 0 : SfxChildWinFactArr_Impl &rFactories = pApp->GetChildWinFactories_Impl();
461 0 : for ( sal_uInt16 nFactory = 0; nFactory < rFactories.size(); ++nFactory )
462 : {
463 0 : pFact = rFactories[nFactory];
464 0 : if ( pFact->nId == GetType() )
465 : {
466 : DBG_ASSERT( pFact->pArr, "No context registered!" );
467 0 : if ( !pFact->pArr )
468 0 : break;
469 :
470 0 : for ( sal_uInt16 n=0; n<pFact->pArr->size(); ++n )
471 : {
472 0 : SfxChildWinContextFactory *pConFact = &(*pFact->pArr)[n];
473 0 : rBindings.ENTERREGISTRATIONS();
474 0 : if ( pConFact->nContextId == nContextId )
475 : {
476 0 : SfxChildWinInfo aInfo = pFact->aInfo;
477 0 : pCon = pConFact->pCtor( GetWindow(), &rBindings, &aInfo );
478 0 : pCon->nContextId = pConFact->nContextId;
479 0 : pImp->pContextModule = NULL;
480 : }
481 0 : rBindings.LEAVEREGISTRATIONS();
482 : }
483 0 : break;
484 : }
485 : }
486 : }
487 :
488 0 : if ( !pCon )
489 : {
490 : OSL_FAIL( "No suitable context found! ");
491 0 : return;
492 : }
493 :
494 0 : if ( pContext )
495 0 : delete( pContext );
496 0 : pContext = pCon;
497 0 : pContext->GetWindow()->SetSizePixel( pWindow->GetOutputSizePixel() );
498 0 : pContext->GetWindow()->Show();
499 : }
500 :
501 0 : SfxChildWindowContext::SfxChildWindowContext( sal_uInt16 nId )
502 : : pWindow( NULL )
503 0 : , nContextId( nId )
504 : {
505 0 : }
506 :
507 0 : SfxChildWindowContext::~SfxChildWindowContext()
508 : {
509 0 : delete pWindow;
510 0 : }
511 :
512 0 : FloatingWindow* SfxChildWindowContext::GetFloatingWindow() const
513 : {
514 0 : Window *pParent = pWindow->GetParent();
515 0 : if ( pParent->GetType() == RSC_DOCKINGWINDOW || pParent->GetType() == RSC_TOOLBOX )
516 : {
517 0 : return ((DockingWindow*)pParent)->GetFloatingWindow();
518 : }
519 0 : else if ( pParent->GetType() == RSC_FLOATINGWINDOW )
520 : {
521 0 : return (FloatingWindow*) pParent;
522 : }
523 : else
524 : {
525 : OSL_FAIL("No FloatingWindow-Context!");
526 0 : return NULL;
527 : }
528 : }
529 :
530 0 : void SfxChildWindowContext::Resizing( Size& )
531 : {
532 0 : }
533 :
534 0 : bool SfxChildWindowContext::Close()
535 : {
536 0 : return true;
537 : }
538 :
539 0 : void SfxChildWindow::SetFactory_Impl( SfxChildWinFactory *pF )
540 : {
541 0 : pImp->pFact = pF;
542 0 : }
543 :
544 0 : void SfxChildWindow::SetHideNotDelete( bool bOn )
545 : {
546 0 : pImp->bHideNotDelete = bOn;
547 0 : }
548 :
549 0 : bool SfxChildWindow::IsHideNotDelete() const
550 : {
551 0 : return pImp->bHideNotDelete;
552 : }
553 :
554 0 : bool SfxChildWindow::IsHideAtToggle() const
555 : {
556 0 : return pImp->bHideAtToggle;
557 : }
558 :
559 0 : void SfxChildWindow::SetWantsFocus( bool bSet )
560 : {
561 0 : pImp->bWantsFocus = bSet;
562 0 : }
563 :
564 0 : bool SfxChildWindow::WantsFocus() const
565 : {
566 0 : return pImp->bWantsFocus;
567 : }
568 :
569 0 : bool SfxChildWinInfo::GetExtraData_Impl
570 : (
571 : SfxChildAlignment *pAlign,
572 : SfxChildAlignment *pLastAlign,
573 : Size *pSize,
574 : sal_uInt16 *pLine,
575 : sal_uInt16 *pPos
576 : ) const
577 : {
578 : // invalid?
579 0 : if ( aExtraString.isEmpty() )
580 0 : return false;
581 0 : OUString aStr;
582 0 : sal_Int32 nPos = aExtraString.indexOf("AL:");
583 0 : if ( nPos == -1 )
584 0 : return false;
585 :
586 : // Try to read the alignment string "ALIGN :(...)", but if
587 : // it is not present, then use an older version
588 0 : sal_Int32 n1 = aExtraString.indexOf('(', nPos);
589 0 : if ( n1 != -1 )
590 : {
591 0 : sal_Int32 n2 = aExtraString.indexOf(')', n1);
592 0 : if ( n2 != -1 )
593 : {
594 : // Cut out Alignment string
595 0 : aStr = aExtraString.copy(nPos, n2 - nPos + 1);
596 0 : aStr = aStr.replaceAt(nPos, n1-nPos+1, "");
597 : }
598 : }
599 :
600 : // First extract the Alignment
601 0 : if ( aStr.isEmpty() )
602 0 : return false;
603 0 : if ( pAlign )
604 0 : *pAlign = (SfxChildAlignment) (sal_uInt16) aStr.toInt32();
605 :
606 : // then the LastAlignment
607 0 : nPos = aStr.indexOf(',');
608 0 : if ( nPos == -1 )
609 0 : return false;
610 0 : aStr = aStr.copy(nPos+1);
611 0 : if ( pLastAlign )
612 0 : *pLastAlign = (SfxChildAlignment) (sal_uInt16) aStr.toInt32();
613 :
614 : // Then the splitting information
615 0 : nPos = aStr.indexOf(',');
616 0 : if ( nPos == -1 )
617 : // No docking in a Splitwindow
618 0 : return true;
619 0 : aStr = aStr.copy(nPos+1);
620 0 : Point aChildPos;
621 0 : Size aChildSize;
622 0 : if ( GetPosSizeFromString( aStr, aChildPos, aChildSize ) )
623 : {
624 0 : if ( pSize )
625 0 : *pSize = aChildSize;
626 0 : if ( pLine )
627 0 : *pLine = (sal_uInt16) aChildPos.X();
628 0 : if ( pPos )
629 0 : *pPos = (sal_uInt16) aChildPos.Y();
630 0 : return true;
631 : }
632 0 : return false;
633 : }
634 :
635 0 : bool SfxChildWindow::IsVisible() const
636 : {
637 0 : return pImp->bVisible;
638 : }
639 :
640 0 : void SfxChildWindow::SetVisible_Impl( bool bVis )
641 : {
642 0 : pImp->bVisible = bVis;
643 0 : }
644 :
645 0 : void SfxChildWindow::Hide()
646 : {
647 0 : switch ( pWindow->GetType() )
648 : {
649 : case RSC_DOCKINGWINDOW :
650 0 : ((DockingWindow*)pWindow)->Hide();
651 0 : break;
652 : case RSC_TOOLBOX :
653 0 : ((ToolBox*)pWindow)->Hide();
654 0 : break;
655 : default:
656 0 : pWindow->Hide();
657 0 : break;
658 : }
659 0 : }
660 :
661 0 : void SfxChildWindow::Show( sal_uInt16 nFlags )
662 : {
663 0 : switch ( pWindow->GetType() )
664 : {
665 : case RSC_DOCKINGWINDOW :
666 0 : ((DockingWindow*)pWindow)->Show( true, nFlags );
667 0 : break;
668 : case RSC_TOOLBOX :
669 0 : ((ToolBox*)pWindow)->Show( true, nFlags );
670 0 : break;
671 : default:
672 0 : pWindow->Show( true, nFlags );
673 0 : break;
674 : }
675 0 : }
676 :
677 0 : Window* SfxChildWindow::GetContextWindow( SfxModule *pModule ) const
678 : {
679 0 : return pModule == pImp->pContextModule && pContext ? pContext->GetWindow(): 0;
680 : }
681 :
682 0 : void SfxChildWindow::SetWorkWindow_Impl( SfxWorkWindow* pWin )
683 : {
684 0 : pImp->pWorkWin = pWin;
685 0 : if ( pWin && pWindow->HasChildPathFocus() )
686 0 : pImp->pWorkWin->SetActiveChild_Impl( pWindow );
687 0 : }
688 :
689 0 : void SfxChildWindow::Activate_Impl()
690 : {
691 0 : if(pImp->pWorkWin!=NULL)
692 0 : pImp->pWorkWin->SetActiveChild_Impl( pWindow );
693 0 : }
694 :
695 0 : void SfxChildWindow::Deactivate_Impl()
696 : {
697 0 : }
698 :
699 0 : bool SfxChildWindow::QueryClose()
700 : {
701 0 : bool bAllow = true;
702 :
703 0 : if ( pImp->xFrame.is() )
704 : {
705 0 : ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController > xCtrl = pImp->xFrame->getController();
706 0 : if ( xCtrl.is() )
707 0 : bAllow = xCtrl->suspend( sal_True );
708 : }
709 :
710 0 : if ( bAllow )
711 0 : bAllow = !GetWindow()->IsInModalMode();
712 :
713 0 : return bAllow;
714 : }
715 :
716 0 : ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > SfxChildWindow::GetFrame()
717 : {
718 0 : return pImp->xFrame;
719 : }
720 :
721 0 : void SfxChildWindow::SetFrame( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > & rFrame )
722 : {
723 : // Do nothing if nothing will be changed ...
724 0 : if( pImp->xFrame != rFrame )
725 : {
726 : // ... but stop listening on old frame, if connection exist!
727 0 : if( pImp->xFrame.is() )
728 0 : pImp->xFrame->removeEventListener( pImp->xListener );
729 :
730 : // If new frame isnt NULL -> we must guarantee valid listener for disposing events.
731 : // Use already existing or create new one.
732 0 : if( rFrame.is() )
733 0 : if( !pImp->xListener.is() )
734 0 : pImp->xListener = ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >( new DisposeListener( this, pImp ) );
735 :
736 : // Set new frame in data container
737 : // and build new listener connection, if necessary.
738 0 : pImp->xFrame = rFrame;
739 0 : if( pImp->xFrame.is() )
740 0 : pImp->xFrame->addEventListener( pImp->xListener );
741 : }
742 0 : }
743 :
744 0 : bool SfxChildWindow::CanGetFocus() const
745 : {
746 0 : return !(pImp->pFact->aInfo.nFlags & SFX_CHILDWIN_CANTGETFOCUS);
747 : }
748 :
749 0 : void SfxChildWindowContext::RegisterChildWindowContext(SfxModule* pMod, sal_uInt16 nId, SfxChildWinContextFactory* pFact)
750 : {
751 0 : SFX_APP()->RegisterChildWindowContext_Impl( pMod, nId, pFact );
752 0 : }
753 :
754 0 : void SfxChildWindow::RegisterChildWindow(SfxModule* pMod, SfxChildWinFactory* pFact)
755 : {
756 0 : SFX_APP()->RegisterChildWindow_Impl( pMod, pFact );
757 0 : }
758 :
759 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|