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