xref: /aoo41x/main/sfx2/source/appl/childwin.cxx (revision d119d52d)
1*d119d52dSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*d119d52dSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*d119d52dSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*d119d52dSAndrew Rist  * distributed with this work for additional information
6*d119d52dSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*d119d52dSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*d119d52dSAndrew Rist  * "License"); you may not use this file except in compliance
9*d119d52dSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*d119d52dSAndrew Rist  *
11*d119d52dSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*d119d52dSAndrew Rist  *
13*d119d52dSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*d119d52dSAndrew Rist  * software distributed under the License is distributed on an
15*d119d52dSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*d119d52dSAndrew Rist  * KIND, either express or implied.  See the License for the
17*d119d52dSAndrew Rist  * specific language governing permissions and limitations
18*d119d52dSAndrew Rist  * under the License.
19*d119d52dSAndrew Rist  *
20*d119d52dSAndrew Rist  *************************************************************/
21*d119d52dSAndrew Rist 
22*d119d52dSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sfx2.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #ifndef _TOOLBOX_HXX //autogen
28cdf0e10cSrcweir #include <vcl/toolbox.hxx>
29cdf0e10cSrcweir #endif
30cdf0e10cSrcweir #ifndef _RCID_H
31cdf0e10cSrcweir #include <tools/rcid.h>
32cdf0e10cSrcweir #endif
33cdf0e10cSrcweir #include <unotools/viewoptions.hxx>
34cdf0e10cSrcweir #include <com/sun/star/frame/XController.hpp>
35cdf0e10cSrcweir #include <com/sun/star/frame/XFrame.hpp>
36cdf0e10cSrcweir #include <com/sun/star/util/XCloseable.hpp>
37cdf0e10cSrcweir #include <cppuhelper/implbase1.hxx>
38cdf0e10cSrcweir 
39cdf0e10cSrcweir #ifndef GCC
40cdf0e10cSrcweir #endif
41cdf0e10cSrcweir 
42cdf0e10cSrcweir #include <sfx2/childwin.hxx>
43cdf0e10cSrcweir #include <sfx2/app.hxx>
44cdf0e10cSrcweir #include "arrdecl.hxx"
45cdf0e10cSrcweir #include <sfx2/bindings.hxx>
46cdf0e10cSrcweir #include <sfx2/module.hxx>
47cdf0e10cSrcweir #include <sfx2/dockwin.hxx>
48cdf0e10cSrcweir #include <sfx2/dispatch.hxx>
49cdf0e10cSrcweir #include "workwin.hxx"
50cdf0e10cSrcweir 
51cdf0e10cSrcweir static const sal_uInt16 nVersion = 2;
52cdf0e10cSrcweir 
53cdf0e10cSrcweir DBG_NAME(SfxChildWindow)
54cdf0e10cSrcweir 
55cdf0e10cSrcweir SV_IMPL_PTRARR( SfxChildWinContextArr_Impl, SfxChildWinContextFactory* );
56cdf0e10cSrcweir 
57cdf0e10cSrcweir struct SfxChildWindow_Impl
58cdf0e10cSrcweir {
59cdf0e10cSrcweir 	::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > 			xFrame;
60cdf0e10cSrcweir     ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >      xListener;
61cdf0e10cSrcweir 	SfxChildWinFactory* pFact;
62cdf0e10cSrcweir 	sal_Bool				bHideNotDelete;
63cdf0e10cSrcweir 	sal_Bool				bVisible;
64cdf0e10cSrcweir 	sal_Bool				bHideAtToggle;
65cdf0e10cSrcweir 	sal_Bool				bWantsFocus;
66cdf0e10cSrcweir 	SfxModule*			pContextModule;
67cdf0e10cSrcweir 	SfxWorkWindow*		pWorkWin;
68cdf0e10cSrcweir };
69cdf0e10cSrcweir 
70cdf0e10cSrcweir // -----------------------------------------------------------------------
71cdf0e10cSrcweir 
72cdf0e10cSrcweir class DisposeListener : public ::cppu::WeakImplHelper1< ::com::sun::star::lang::XEventListener >
73cdf0e10cSrcweir {
74cdf0e10cSrcweir     public:
DisposeListener(SfxChildWindow * pOwner,SfxChildWindow_Impl * pData)75cdf0e10cSrcweir         DisposeListener( SfxChildWindow*      pOwner ,
76cdf0e10cSrcweir                          SfxChildWindow_Impl* pData  )
77cdf0e10cSrcweir             :   m_pOwner( pOwner )
78cdf0e10cSrcweir             ,   m_pData ( pData  )
79cdf0e10cSrcweir         {}
80cdf0e10cSrcweir 
disposing(const::com::sun::star::lang::EventObject & aSource)81cdf0e10cSrcweir         virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& aSource ) throw (::com::sun::star::uno::RuntimeException)
82cdf0e10cSrcweir         {
83cdf0e10cSrcweir             ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > xSelfHold( this );
84cdf0e10cSrcweir 
85cdf0e10cSrcweir             ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > xComp( aSource.Source, ::com::sun::star::uno::UNO_QUERY );
86cdf0e10cSrcweir             if( xComp.is() )
87cdf0e10cSrcweir                 xComp->removeEventListener( this );
88cdf0e10cSrcweir 
89cdf0e10cSrcweir             if( m_pOwner && m_pData )
90cdf0e10cSrcweir             {
91cdf0e10cSrcweir 	            m_pData->xListener = ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >();
92cdf0e10cSrcweir 
93cdf0e10cSrcweir 				if ( m_pData->pWorkWin )
94cdf0e10cSrcweir 				{
95cdf0e10cSrcweir 					// m_pOwner and m_pData will be killed
96cdf0e10cSrcweir 		            m_pData->xFrame    = ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >();
97cdf0e10cSrcweir 	                m_pData->pWorkWin->GetBindings().Execute( m_pOwner->GetType() );
98cdf0e10cSrcweir 				}
99cdf0e10cSrcweir 				else
100cdf0e10cSrcweir 				{
101cdf0e10cSrcweir 					delete m_pOwner;
102cdf0e10cSrcweir 				}
103cdf0e10cSrcweir 
104cdf0e10cSrcweir                 m_pOwner = NULL;
105cdf0e10cSrcweir                 m_pData  = NULL;
106cdf0e10cSrcweir             }
107cdf0e10cSrcweir         }
108cdf0e10cSrcweir 
109cdf0e10cSrcweir     private:
110cdf0e10cSrcweir         SfxChildWindow*      m_pOwner;
111cdf0e10cSrcweir         SfxChildWindow_Impl* m_pData ;
112cdf0e10cSrcweir };
113cdf0e10cSrcweir 
114cdf0e10cSrcweir // -----------------------------------------------------------------------
115cdf0e10cSrcweir 
GetPosSizeFromString(const String & rStr,Point & rPos,Size & rSize)116cdf0e10cSrcweir sal_Bool GetPosSizeFromString( const String& rStr, Point& rPos, Size& rSize )
117cdf0e10cSrcweir {
118cdf0e10cSrcweir 	if ( rStr.GetTokenCount('/') != 4 )
119cdf0e10cSrcweir 		return sal_False;
120cdf0e10cSrcweir 
121cdf0e10cSrcweir 	xub_StrLen nIdx = 0;
122cdf0e10cSrcweir 	rPos.X() = rStr.GetToken(0, '/', nIdx).ToInt32();
123cdf0e10cSrcweir 	rPos.Y() = rStr.GetToken(0, '/', nIdx).ToInt32();
124cdf0e10cSrcweir 	rSize.Width() = rStr.GetToken(0, '/', nIdx).ToInt32();
125cdf0e10cSrcweir 	rSize.Height() = rStr.GetToken(0, '/', nIdx).ToInt32();
126cdf0e10cSrcweir 
127cdf0e10cSrcweir 	// negative sizes are invalid
128cdf0e10cSrcweir 	if ( rSize.Width() < 0 || rSize.Height() < 0 )
129cdf0e10cSrcweir 		return sal_False;
130cdf0e10cSrcweir 
131cdf0e10cSrcweir 	return sal_True;
132cdf0e10cSrcweir }
133cdf0e10cSrcweir 
GetSplitSizeFromString(const String & rStr,Size & rSize)134cdf0e10cSrcweir sal_Bool GetSplitSizeFromString( const String& rStr, Size& rSize )
135cdf0e10cSrcweir {
136cdf0e10cSrcweir     xub_StrLen nIndex = rStr.Search( ',' );
137cdf0e10cSrcweir     if ( nIndex != STRING_NOTFOUND )
138cdf0e10cSrcweir     {
139cdf0e10cSrcweir         String aStr = rStr.Copy( nIndex+1 );
140cdf0e10cSrcweir 
141cdf0e10cSrcweir         sal_Int32 nCount = aStr.GetTokenCount(';');
142cdf0e10cSrcweir         if ( nCount != 2 )
143cdf0e10cSrcweir             return sal_False;
144cdf0e10cSrcweir 
145cdf0e10cSrcweir 	    rSize.Width() = aStr.GetToken(0, ';' ).ToInt32();
146cdf0e10cSrcweir 	    rSize.Height() = aStr.GetToken(1, ';' ).ToInt32();
147cdf0e10cSrcweir 
148cdf0e10cSrcweir 	    // negative sizes are invalid
149cdf0e10cSrcweir 	    if ( rSize.Width() < 0 || rSize.Height() < 0 )
150cdf0e10cSrcweir 		    return sal_False;
151cdf0e10cSrcweir 
152cdf0e10cSrcweir 	    return sal_True;
153cdf0e10cSrcweir     }
154cdf0e10cSrcweir 
155cdf0e10cSrcweir     return sal_False;
156cdf0e10cSrcweir }
157cdf0e10cSrcweir 
158cdf0e10cSrcweir //=========================================================================
SfxChildWindow(Window * pParentWindow,sal_uInt16 nId)159cdf0e10cSrcweir SfxChildWindow::SfxChildWindow(Window *pParentWindow, sal_uInt16 nId)
160cdf0e10cSrcweir 	: pParent(pParentWindow)
161cdf0e10cSrcweir 	, nType(nId)
162cdf0e10cSrcweir 	, eChildAlignment(SFX_ALIGN_NOALIGNMENT)
163cdf0e10cSrcweir 	, pWindow(0L)
164cdf0e10cSrcweir {
165cdf0e10cSrcweir 	pImp = new SfxChildWindow_Impl;
166cdf0e10cSrcweir 	pImp->pFact = 0L;
167cdf0e10cSrcweir 	pImp->bHideNotDelete = sal_False;
168cdf0e10cSrcweir 	pImp->bHideAtToggle = sal_False;
169cdf0e10cSrcweir 	pImp->bWantsFocus = sal_True;
170cdf0e10cSrcweir 	pImp->bVisible = sal_True;
171cdf0e10cSrcweir 	pImp->pContextModule = NULL;
172cdf0e10cSrcweir 	pImp->pWorkWin = NULL;
173cdf0e10cSrcweir 
174cdf0e10cSrcweir 	pContext = 0L;
175cdf0e10cSrcweir 	DBG_CTOR(SfxChildWindow,0);
176cdf0e10cSrcweir }
177cdf0e10cSrcweir 
Destroy()178cdf0e10cSrcweir void SfxChildWindow::Destroy()
179cdf0e10cSrcweir {
180cdf0e10cSrcweir 	if ( GetFrame().is() )
181cdf0e10cSrcweir 	{
182cdf0e10cSrcweir 		pImp->pWorkWin = NULL;
183cdf0e10cSrcweir 		try
184cdf0e10cSrcweir 		{
185cdf0e10cSrcweir 			::com::sun::star::uno::Reference < ::com::sun::star::util::XCloseable > xClose( GetFrame(), ::com::sun::star::uno::UNO_QUERY );
186cdf0e10cSrcweir 			if ( xClose.is() )
187cdf0e10cSrcweir 				xClose->close( sal_True );
188cdf0e10cSrcweir 			else
189cdf0e10cSrcweir 				GetFrame()->dispose();
190cdf0e10cSrcweir 		}
191cdf0e10cSrcweir 		catch ( com::sun::star::uno::Exception& )
192cdf0e10cSrcweir 		{
193cdf0e10cSrcweir 		}
194cdf0e10cSrcweir 	}
195cdf0e10cSrcweir 	else
196cdf0e10cSrcweir 		delete this;
197cdf0e10cSrcweir }
198cdf0e10cSrcweir 
199cdf0e10cSrcweir //-------------------------------------------------------------------------
~SfxChildWindow()200cdf0e10cSrcweir SfxChildWindow::~SfxChildWindow()
201cdf0e10cSrcweir {
202cdf0e10cSrcweir 	DBG_DTOR(SfxChildWindow,0);
203cdf0e10cSrcweir 	if ( pContext )
204cdf0e10cSrcweir 		delete pContext;
205cdf0e10cSrcweir 	if ( pWindow )
206cdf0e10cSrcweir 	    delete pWindow;
207cdf0e10cSrcweir 	delete pImp;
208cdf0e10cSrcweir }
209cdf0e10cSrcweir 
210cdf0e10cSrcweir //-------------------------------------------------------------------------
CreateChildWindow(sal_uInt16 nId,Window * pParent,SfxBindings * pBindings,SfxChildWinInfo & rInfo)211cdf0e10cSrcweir SfxChildWindow* SfxChildWindow::CreateChildWindow( sal_uInt16 nId,
212cdf0e10cSrcweir 		Window *pParent, SfxBindings* pBindings, SfxChildWinInfo& rInfo)
213cdf0e10cSrcweir {
214cdf0e10cSrcweir 	SfxChildWindow *pChild=0;
215cdf0e10cSrcweir 	SfxChildWinFactory* pFact=0;
216cdf0e10cSrcweir     sal_uInt16 nOldMode = Application::GetSystemWindowMode();
217cdf0e10cSrcweir 
218cdf0e10cSrcweir 	// Zuerst ChildWindow im SDT suchen; "Uberlagerungen m"ussen mit einem
219cdf0e10cSrcweir 	// ChildWindowContext realisiert werden
220cdf0e10cSrcweir 	SfxApplication *pApp = SFX_APP();
221cdf0e10cSrcweir     {
222cdf0e10cSrcweir 	    SfxChildWinFactArr_Impl &rFactories = pApp->GetChildWinFactories_Impl();
223cdf0e10cSrcweir 	    for ( sal_uInt16 nFactory = 0; nFactory < rFactories.Count(); ++nFactory )
224cdf0e10cSrcweir 	    {
225cdf0e10cSrcweir 		    pFact = rFactories[nFactory];
226cdf0e10cSrcweir 		    if ( pFact->nId == nId )
227cdf0e10cSrcweir 		    {
228cdf0e10cSrcweir 			    SfxChildWinInfo& rFactInfo = pFact->aInfo;
229cdf0e10cSrcweir 			    if ( rInfo.bVisible )
230cdf0e10cSrcweir 			    {
231cdf0e10cSrcweir 				    if ( pBindings )
232cdf0e10cSrcweir 					    pBindings->ENTERREGISTRATIONS();
233cdf0e10cSrcweir 				    SfxChildWinInfo aInfo = rFactInfo;
234cdf0e10cSrcweir                     Application::SetSystemWindowMode( SYSTEMWINDOW_MODE_NOAUTOMODE );
235cdf0e10cSrcweir 				    pChild = pFact->pCtor( pParent, nId, pBindings, &aInfo );
236cdf0e10cSrcweir                     Application::SetSystemWindowMode( nOldMode );
237cdf0e10cSrcweir 				    if ( pBindings )
238cdf0e10cSrcweir 					    pBindings->LEAVEREGISTRATIONS();
239cdf0e10cSrcweir 			    }
240cdf0e10cSrcweir 
241cdf0e10cSrcweir 			    break;
242cdf0e10cSrcweir 		    }
243cdf0e10cSrcweir 	    }
244cdf0e10cSrcweir     }
245cdf0e10cSrcweir 
246cdf0e10cSrcweir 	SfxDispatcher *pDisp = pBindings->GetDispatcher_Impl();
247cdf0e10cSrcweir     SfxModule *pMod = pDisp ? SfxModule::GetActiveModule( pDisp->GetFrame() ) :0;
248cdf0e10cSrcweir 	if ( !pChild &&  pMod )
249cdf0e10cSrcweir 	{
250cdf0e10cSrcweir 		SfxChildWinFactArr_Impl *pFactories = pMod->GetChildWinFactories_Impl();
251cdf0e10cSrcweir 		if ( pFactories )
252cdf0e10cSrcweir 		{
253cdf0e10cSrcweir 			SfxChildWinFactArr_Impl &rFactories = *pFactories;
254cdf0e10cSrcweir 			for ( sal_uInt16 nFactory = 0; nFactory < rFactories.Count(); ++nFactory )
255cdf0e10cSrcweir 			{
256cdf0e10cSrcweir 				pFact = rFactories[nFactory];
257cdf0e10cSrcweir 				if ( pFact->nId == nId )
258cdf0e10cSrcweir 				{
259cdf0e10cSrcweir 					SfxChildWinInfo& rFactInfo = pFact->aInfo;
260cdf0e10cSrcweir 					if ( rInfo.bVisible )
261cdf0e10cSrcweir 					{
262cdf0e10cSrcweir 						if ( pBindings )
263cdf0e10cSrcweir 							pBindings->ENTERREGISTRATIONS();
264cdf0e10cSrcweir 						SfxChildWinInfo aInfo = rFactInfo;
265cdf0e10cSrcweir                         Application::SetSystemWindowMode( SYSTEMWINDOW_MODE_NOAUTOMODE );
266cdf0e10cSrcweir 						pChild = pFact->pCtor( pParent, nId, pBindings, &aInfo );
267cdf0e10cSrcweir                         Application::SetSystemWindowMode( nOldMode );
268cdf0e10cSrcweir 						if ( pBindings )
269cdf0e10cSrcweir 							pBindings->LEAVEREGISTRATIONS();
270cdf0e10cSrcweir 					}
271cdf0e10cSrcweir 
272cdf0e10cSrcweir 					break;
273cdf0e10cSrcweir 				}
274cdf0e10cSrcweir 			}
275cdf0e10cSrcweir 		}
276cdf0e10cSrcweir 	}
277cdf0e10cSrcweir 
278cdf0e10cSrcweir 	if ( pChild )
279cdf0e10cSrcweir 		pChild->SetFactory_Impl( pFact );
280cdf0e10cSrcweir 
281cdf0e10cSrcweir 	DBG_ASSERT(pFact && (pChild || !rInfo.bVisible), "ChildWindow-Typ nicht registriert!");
282cdf0e10cSrcweir 
283cdf0e10cSrcweir 	if ( pChild && !pChild->pWindow )
284cdf0e10cSrcweir 	{
285cdf0e10cSrcweir 		DELETEZ(pChild);
286cdf0e10cSrcweir 		DBG_WARNING("ChildWindow hat kein Fenster!");
287cdf0e10cSrcweir 	}
288cdf0e10cSrcweir 
289cdf0e10cSrcweir 	return pChild;
290cdf0e10cSrcweir }
291cdf0e10cSrcweir 
292cdf0e10cSrcweir //-------------------------------------------------------------------------
SaveStatus(const SfxChildWinInfo & rInfo)293cdf0e10cSrcweir void SfxChildWindow::SaveStatus(const SfxChildWinInfo& rInfo)
294cdf0e10cSrcweir {
295cdf0e10cSrcweir     sal_uInt16 nID = GetType();
296cdf0e10cSrcweir 
297cdf0e10cSrcweir     String aWinData( 'V' );
298cdf0e10cSrcweir     aWinData += String::CreateFromInt32( nVersion );
299cdf0e10cSrcweir     aWinData += ',';
300cdf0e10cSrcweir     aWinData += rInfo.bVisible ? 'V' : 'H';
301cdf0e10cSrcweir     aWinData += ',';
302cdf0e10cSrcweir     aWinData += String::CreateFromInt32( rInfo.nFlags );
303cdf0e10cSrcweir     if ( rInfo.aExtraString.Len() )
304cdf0e10cSrcweir     {
305cdf0e10cSrcweir         aWinData += ',';
306cdf0e10cSrcweir         aWinData += rInfo.aExtraString;
307cdf0e10cSrcweir     }
308cdf0e10cSrcweir 
309cdf0e10cSrcweir     SvtViewOptions aWinOpt( E_WINDOW, String::CreateFromInt32( nID ) );
310cdf0e10cSrcweir     // aWinOpt.SetPosition( rInfo.aPos.X(), rInfo.aPos.Y() );
311cdf0e10cSrcweir     // aWinOpt.SetSize( rInfo.aSize.Width(), rInfo.aSize.Height() );
312cdf0e10cSrcweir     aWinOpt.SetWindowState( String( rInfo.aWinState, RTL_TEXTENCODING_UTF8 ) );
313cdf0e10cSrcweir 
314cdf0e10cSrcweir     ::com::sun::star::uno::Sequence < ::com::sun::star::beans::NamedValue > aSeq(1);
315cdf0e10cSrcweir     aSeq[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Data") );
316cdf0e10cSrcweir     aSeq[0].Value <<= ::rtl::OUString( aWinData );
317cdf0e10cSrcweir     aWinOpt.SetUserData( aSeq );
318cdf0e10cSrcweir 
319cdf0e10cSrcweir     // ... but save status at runtime!
320cdf0e10cSrcweir     pImp->pFact->aInfo = rInfo;
321cdf0e10cSrcweir }
322cdf0e10cSrcweir 
323cdf0e10cSrcweir //-------------------------------------------------------------------------
SetAlignment(SfxChildAlignment eAlign)324cdf0e10cSrcweir void SfxChildWindow::SetAlignment(SfxChildAlignment eAlign)
325cdf0e10cSrcweir {
326cdf0e10cSrcweir 	DBG_CHKTHIS(SfxChildWindow,0);
327cdf0e10cSrcweir 
328cdf0e10cSrcweir 	eChildAlignment = eAlign;
329cdf0e10cSrcweir }
330cdf0e10cSrcweir 
331cdf0e10cSrcweir //-------------------------------------------------------------------------
SetPosSizePixel(const Point & rPoint,Size & rSize)332cdf0e10cSrcweir void SfxChildWindow::SetPosSizePixel(const Point& rPoint, Size& rSize)
333cdf0e10cSrcweir {
334cdf0e10cSrcweir 	DBG_CHKTHIS(SfxChildWindow,0);
335cdf0e10cSrcweir 
336cdf0e10cSrcweir 	pWindow->SetPosSizePixel(rPoint, rSize);
337cdf0e10cSrcweir }
338cdf0e10cSrcweir 
339cdf0e10cSrcweir //-------------------------------------------------------------------------
GetInfo() const340cdf0e10cSrcweir SfxChildWinInfo SfxChildWindow::GetInfo() const
341cdf0e10cSrcweir {
342cdf0e10cSrcweir 	DBG_CHKTHIS(SfxChildWindow,0);
343cdf0e10cSrcweir 
344cdf0e10cSrcweir 	SfxChildWinInfo aInfo;
345cdf0e10cSrcweir 	aInfo.aPos	= pWindow->GetPosPixel();
346cdf0e10cSrcweir 	aInfo.aSize = pWindow->GetSizePixel();
347cdf0e10cSrcweir     if ( pWindow->IsSystemWindow() )
348cdf0e10cSrcweir     {
349cdf0e10cSrcweir         sal_uIntPtr nMask = WINDOWSTATE_MASK_POS | WINDOWSTATE_MASK_STATE;
350cdf0e10cSrcweir         if ( pWindow->GetStyle() & WB_SIZEABLE )
351cdf0e10cSrcweir             nMask |= ( WINDOWSTATE_MASK_WIDTH | WINDOWSTATE_MASK_HEIGHT );
352cdf0e10cSrcweir         aInfo.aWinState = ((SystemWindow*)pWindow)->GetWindowState( nMask );
353cdf0e10cSrcweir     }
354cdf0e10cSrcweir     else if ( pWindow->GetType() == RSC_DOCKINGWINDOW )
355cdf0e10cSrcweir     {
356cdf0e10cSrcweir         if (((DockingWindow*)pWindow)->GetFloatingWindow() )
357cdf0e10cSrcweir             aInfo.aWinState = ((DockingWindow*)pWindow)->GetFloatingWindow()->GetWindowState();
358cdf0e10cSrcweir         else
359cdf0e10cSrcweir         {
360cdf0e10cSrcweir             SfxChildWinInfo aTmpInfo;
361cdf0e10cSrcweir             ((SfxDockingWindow*)pWindow)->FillInfo( aTmpInfo );
362cdf0e10cSrcweir             aInfo.aExtraString = aTmpInfo.aExtraString;
363cdf0e10cSrcweir         }
364cdf0e10cSrcweir     }
365cdf0e10cSrcweir 
366cdf0e10cSrcweir 	aInfo.bVisible = pImp->bVisible;
367cdf0e10cSrcweir 	aInfo.nFlags = 0;
368cdf0e10cSrcweir 	return aInfo;
369cdf0e10cSrcweir }
370cdf0e10cSrcweir 
371cdf0e10cSrcweir //-------------------------------------------------------------------------
GetPosition()372cdf0e10cSrcweir sal_uInt16 SfxChildWindow::GetPosition()
373cdf0e10cSrcweir {
374cdf0e10cSrcweir 	return pImp->pFact->nPos;
375cdf0e10cSrcweir }
376cdf0e10cSrcweir 
377cdf0e10cSrcweir #if 0
378cdf0e10cSrcweir static void ImplWindowStateFromStr( Point rPos, Size rSize, const ByteString& rStr )
379cdf0e10cSrcweir {
380cdf0e10cSrcweir     sal_uIntPtr       nValidMask  = 0;
381cdf0e10cSrcweir     xub_StrLen  nIndex      = 0;
382cdf0e10cSrcweir     ByteString  aTokenStr;
383cdf0e10cSrcweir 
384cdf0e10cSrcweir     aTokenStr = rStr.GetToken( 0, ',', nIndex );
385cdf0e10cSrcweir     if ( aTokenStr.Len() )
386cdf0e10cSrcweir     {
387cdf0e10cSrcweir         rPos.X() = aTokenStr.ToInt32();
388cdf0e10cSrcweir         nValidMask |= WINDOWSTATE_MASK_X;
389cdf0e10cSrcweir     }
390cdf0e10cSrcweir 
391cdf0e10cSrcweir     aTokenStr = rStr.GetToken( 0, ',', nIndex );
392cdf0e10cSrcweir     if ( aTokenStr.Len() )
393cdf0e10cSrcweir     {
394cdf0e10cSrcweir         rPos.Y() = aTokenStr.ToInt32();
395cdf0e10cSrcweir         nValidMask |= WINDOWSTATE_MASK_Y;
396cdf0e10cSrcweir     }
397cdf0e10cSrcweir 
398cdf0e10cSrcweir     aTokenStr = rStr.GetToken( 0, ',', nIndex );
399cdf0e10cSrcweir     if ( aTokenStr.Len() )
400cdf0e10cSrcweir     {
401cdf0e10cSrcweir         rSize.Width() = aTokenStr.ToInt32();
402cdf0e10cSrcweir         nValidMask |= WINDOWSTATE_MASK_WIDTH;
403cdf0e10cSrcweir     }
404cdf0e10cSrcweir 
405cdf0e10cSrcweir     aTokenStr = rStr.GetToken( 0, ';', nIndex );
406cdf0e10cSrcweir     if ( aTokenStr.Len() )
407cdf0e10cSrcweir     {
408cdf0e10cSrcweir         rSize.Height() = aTokenStr.ToInt32();
409cdf0e10cSrcweir         nValidMask |= WINDOWSTATE_MASK_HEIGHT;
410cdf0e10cSrcweir     }
411cdf0e10cSrcweir }
412cdf0e10cSrcweir #endif
413cdf0e10cSrcweir 
414cdf0e10cSrcweir //-------------------------------------------------------------------------
InitializeChildWinFactory_Impl(sal_uInt16 nId,SfxChildWinInfo & rInfo)415cdf0e10cSrcweir void SfxChildWindow::InitializeChildWinFactory_Impl( sal_uInt16 nId, SfxChildWinInfo& rInfo )
416cdf0e10cSrcweir {
417cdf0e10cSrcweir 	// load configuration
418cdf0e10cSrcweir 	SvtViewOptions aWinOpt( E_WINDOW, String::CreateFromInt32( nId ) );
419cdf0e10cSrcweir 
420cdf0e10cSrcweir     if ( aWinOpt.Exists() )
421cdf0e10cSrcweir         rInfo.bVisible  = aWinOpt.IsVisible(); // set state from configuration. Can be overwritten by UserData, see below
422cdf0e10cSrcweir 
423cdf0e10cSrcweir     ::com::sun::star::uno::Sequence < ::com::sun::star::beans::NamedValue > aSeq = aWinOpt.GetUserData();
424cdf0e10cSrcweir 
425cdf0e10cSrcweir     ::rtl::OUString aTmp;
426cdf0e10cSrcweir     if ( aSeq.getLength() )
427cdf0e10cSrcweir         aSeq[0].Value >>= aTmp;
428cdf0e10cSrcweir 
429cdf0e10cSrcweir     String aWinData( aTmp );
430cdf0e10cSrcweir     rInfo.aWinState = ByteString( String(aWinOpt.GetWindowState()), RTL_TEXTENCODING_UTF8 );
431cdf0e10cSrcweir 
432cdf0e10cSrcweir     //ImplWindowStateFromStr( rInfo.aPos, rInfo.aSize, ByteString( aWinState, RTL_TEXTENCODING_UTF8 ) );
433cdf0e10cSrcweir 
434cdf0e10cSrcweir     if ( aWinData.Len() )
435cdf0e10cSrcweir 	{
436cdf0e10cSrcweir 		// Nach Versionskennung suchen
437cdf0e10cSrcweir 		if ( aWinData.GetChar((sal_uInt16)0) != 0x0056 ) // 'V' = 56h
438cdf0e10cSrcweir 			// Keine Versionskennung, daher nicht verwenden
439cdf0e10cSrcweir 			return;
440cdf0e10cSrcweir 
441cdf0e10cSrcweir 		// 'V' l"oschen
442cdf0e10cSrcweir 		aWinData.Erase(0,1);
443cdf0e10cSrcweir 
444cdf0e10cSrcweir 		// Version lesen
445cdf0e10cSrcweir 		char cToken = ',';
446cdf0e10cSrcweir 		sal_uInt16 nPos = aWinData.Search( cToken );
447cdf0e10cSrcweir         sal_uInt16 nActVersion = (sal_uInt16)aWinData.Copy( 0, nPos + 1 ).ToInt32();
448cdf0e10cSrcweir         if ( nActVersion != nVersion )
449cdf0e10cSrcweir             return;
450cdf0e10cSrcweir 
451cdf0e10cSrcweir 		aWinData.Erase(0,nPos+1);
452cdf0e10cSrcweir 
453cdf0e10cSrcweir         //aWinOpt.GetPosition( rInfo.aPos.X(), rInfo.aPos.Y() );
454cdf0e10cSrcweir         //aWinOpt.GetSize( rInfo.aSize.Width(), rInfo.aSize.Height() );
455cdf0e10cSrcweir 
456cdf0e10cSrcweir 		// Sichtbarkeit laden: ist als ein char codiert
457cdf0e10cSrcweir         rInfo.bVisible = (aWinData.GetChar(0) == 0x0056); // 'V' = 56h
458cdf0e10cSrcweir         aWinData.Erase(0,1);
459cdf0e10cSrcweir         nPos = aWinData.Search( cToken );
460cdf0e10cSrcweir 		if (nPos != STRING_NOTFOUND)
461cdf0e10cSrcweir 		{
462cdf0e10cSrcweir             sal_uInt16 nNextPos = aWinData.Search( cToken, 2 );
463cdf0e10cSrcweir             if ( nNextPos != STRING_NOTFOUND )
464cdf0e10cSrcweir             {
465cdf0e10cSrcweir                 // es gibt noch Extra-Information
466cdf0e10cSrcweir                 rInfo.nFlags = (sal_uInt16)aWinData.Copy( nPos+1, nNextPos - nPos - 1 ).ToInt32();
467cdf0e10cSrcweir                 aWinData.Erase( nPos, nNextPos-nPos+1 );
468cdf0e10cSrcweir                 rInfo.aExtraString = aWinData;
469cdf0e10cSrcweir             }
470cdf0e10cSrcweir             else
471cdf0e10cSrcweir                 rInfo.nFlags = (sal_uInt16)aWinData.Copy( nPos+1 ).ToInt32();
472cdf0e10cSrcweir 		}
473cdf0e10cSrcweir 	}
474cdf0e10cSrcweir }
475cdf0e10cSrcweir 
CreateContext(sal_uInt16 nContextId,SfxBindings & rBindings)476cdf0e10cSrcweir void SfxChildWindow::CreateContext( sal_uInt16 nContextId, SfxBindings& rBindings )
477cdf0e10cSrcweir {
478cdf0e10cSrcweir 	SfxChildWindowContext *pCon = NULL;
479cdf0e10cSrcweir 	SfxChildWinFactory* pFact=0;
480cdf0e10cSrcweir 	SfxApplication *pApp = SFX_APP();
481cdf0e10cSrcweir 	SfxDispatcher *pDisp = rBindings.GetDispatcher_Impl();
482cdf0e10cSrcweir     SfxModule *pMod = pDisp ? SfxModule::GetActiveModule( pDisp->GetFrame() ) :0;
483cdf0e10cSrcweir 	if ( pMod )
484cdf0e10cSrcweir 	{
485cdf0e10cSrcweir 		SfxChildWinFactArr_Impl *pFactories = pMod->GetChildWinFactories_Impl();
486cdf0e10cSrcweir 		if ( pFactories )
487cdf0e10cSrcweir 		{
488cdf0e10cSrcweir 			SfxChildWinFactArr_Impl &rFactories = *pFactories;
489cdf0e10cSrcweir 			for ( sal_uInt16 nFactory = 0; nFactory < rFactories.Count(); ++nFactory )
490cdf0e10cSrcweir 			{
491cdf0e10cSrcweir 				pFact = rFactories[nFactory];
492cdf0e10cSrcweir 				if ( pFact->nId == GetType() )
493cdf0e10cSrcweir 				{
494cdf0e10cSrcweir 					DBG_ASSERT( pFact->pArr, "Kein Kontext angemeldet!" );
495cdf0e10cSrcweir 					if ( !pFact->pArr )
496cdf0e10cSrcweir 						break;
497cdf0e10cSrcweir 
498cdf0e10cSrcweir 					SfxChildWinContextFactory *pConFact=0;
499cdf0e10cSrcweir 					for ( sal_uInt16 n=0; n<pFact->pArr->Count(); ++n )
500cdf0e10cSrcweir 					{
501cdf0e10cSrcweir 						pConFact = (*pFact->pArr)[n];
502cdf0e10cSrcweir 						rBindings.ENTERREGISTRATIONS();
503cdf0e10cSrcweir 						if ( pConFact->nContextId == nContextId )
504cdf0e10cSrcweir 						{
505cdf0e10cSrcweir 							SfxChildWinInfo aInfo = pFact->aInfo;
506cdf0e10cSrcweir 							pCon = pConFact->pCtor( GetWindow(), &rBindings, &aInfo );
507cdf0e10cSrcweir 							pCon->nContextId = pConFact->nContextId;
508cdf0e10cSrcweir 							pImp->pContextModule = pMod;
509cdf0e10cSrcweir 						}
510cdf0e10cSrcweir 						rBindings.LEAVEREGISTRATIONS();
511cdf0e10cSrcweir 					}
512cdf0e10cSrcweir 					break;
513cdf0e10cSrcweir 				}
514cdf0e10cSrcweir 			}
515cdf0e10cSrcweir 		}
516cdf0e10cSrcweir 	}
517cdf0e10cSrcweir 
518cdf0e10cSrcweir 	if ( !pCon )
519cdf0e10cSrcweir 	{
520cdf0e10cSrcweir 		SfxChildWinFactArr_Impl &rFactories = pApp->GetChildWinFactories_Impl();
521cdf0e10cSrcweir 		for ( sal_uInt16 nFactory = 0; nFactory < rFactories.Count(); ++nFactory )
522cdf0e10cSrcweir 		{
523cdf0e10cSrcweir 			pFact = rFactories[nFactory];
524cdf0e10cSrcweir 			if ( pFact->nId == GetType() )
525cdf0e10cSrcweir 			{
526cdf0e10cSrcweir 				DBG_ASSERT( pFact->pArr, "Kein Kontext angemeldet!" );
527cdf0e10cSrcweir 				if ( !pFact->pArr )
528cdf0e10cSrcweir 					break;
529cdf0e10cSrcweir 
530cdf0e10cSrcweir 				SfxChildWinContextFactory *pConFact=0;
531cdf0e10cSrcweir 				for ( sal_uInt16 n=0; n<pFact->pArr->Count(); ++n )
532cdf0e10cSrcweir 				{
533cdf0e10cSrcweir 					pConFact = (*pFact->pArr)[n];
534cdf0e10cSrcweir 					rBindings.ENTERREGISTRATIONS();
535cdf0e10cSrcweir 					if ( pConFact->nContextId == nContextId )
536cdf0e10cSrcweir 					{
537cdf0e10cSrcweir 						SfxChildWinInfo aInfo = pFact->aInfo;
538cdf0e10cSrcweir 						pCon = pConFact->pCtor( GetWindow(), &rBindings, &aInfo );
539cdf0e10cSrcweir 						pCon->nContextId = pConFact->nContextId;
540cdf0e10cSrcweir 						pImp->pContextModule = NULL;
541cdf0e10cSrcweir 					}
542cdf0e10cSrcweir 					rBindings.LEAVEREGISTRATIONS();
543cdf0e10cSrcweir 				}
544cdf0e10cSrcweir 				break;
545cdf0e10cSrcweir 			}
546cdf0e10cSrcweir 		}
547cdf0e10cSrcweir 	}
548cdf0e10cSrcweir 
549cdf0e10cSrcweir 	if ( !pCon )
550cdf0e10cSrcweir 	{
551cdf0e10cSrcweir 		DBG_ERROR( "Kein geeigneter Context gefunden!" );
552cdf0e10cSrcweir 		return;
553cdf0e10cSrcweir 	}
554cdf0e10cSrcweir 
555cdf0e10cSrcweir 	if ( pContext )
556cdf0e10cSrcweir 		delete( pContext );
557cdf0e10cSrcweir 	pContext = pCon;
558cdf0e10cSrcweir 	pContext->GetWindow()->SetSizePixel( pWindow->GetOutputSizePixel() );
559cdf0e10cSrcweir 	pContext->GetWindow()->Show();
560cdf0e10cSrcweir }
561cdf0e10cSrcweir 
SfxChildWindowContext(sal_uInt16 nId)562cdf0e10cSrcweir SfxChildWindowContext::SfxChildWindowContext( sal_uInt16 nId )
563cdf0e10cSrcweir 	: pWindow( NULL )
564cdf0e10cSrcweir 	, nContextId( nId )
565cdf0e10cSrcweir {
566cdf0e10cSrcweir }
567cdf0e10cSrcweir 
~SfxChildWindowContext()568cdf0e10cSrcweir SfxChildWindowContext::~SfxChildWindowContext()
569cdf0e10cSrcweir {
570cdf0e10cSrcweir 	delete pWindow;
571cdf0e10cSrcweir }
572cdf0e10cSrcweir 
GetFloatingWindow() const573cdf0e10cSrcweir FloatingWindow*	SfxChildWindowContext::GetFloatingWindow() const
574cdf0e10cSrcweir {
575cdf0e10cSrcweir 	Window *pParent = pWindow->GetParent();
576cdf0e10cSrcweir 	if ( pParent->GetType() == RSC_DOCKINGWINDOW || pParent->GetType() == RSC_TOOLBOX )
577cdf0e10cSrcweir 	{
578cdf0e10cSrcweir 		return ((DockingWindow*)pParent)->GetFloatingWindow();
579cdf0e10cSrcweir 	}
580cdf0e10cSrcweir 	else if ( pParent->GetType() == RSC_FLOATINGWINDOW )
581cdf0e10cSrcweir 	{
582cdf0e10cSrcweir 		return (FloatingWindow*) pParent;
583cdf0e10cSrcweir 	}
584cdf0e10cSrcweir 	else
585cdf0e10cSrcweir 	{
586cdf0e10cSrcweir 		DBG_ERROR("Kein FloatingWindow-Context!");
587cdf0e10cSrcweir 		return NULL;
588cdf0e10cSrcweir 	}
589cdf0e10cSrcweir }
590cdf0e10cSrcweir 
GetAlignment() const591cdf0e10cSrcweir SfxChildAlignment SfxChildWindowContext::GetAlignment() const
592cdf0e10cSrcweir {
593cdf0e10cSrcweir 	Window *pParent = pWindow->GetParent();
594cdf0e10cSrcweir 	if ( pParent->GetType() == RSC_DOCKINGWINDOW )
595cdf0e10cSrcweir 	{
596cdf0e10cSrcweir 		return ((SfxDockingWindow*)pParent)->GetAlignment();
597cdf0e10cSrcweir 	}
598cdf0e10cSrcweir 	else if ( pParent->GetType() == RSC_TOOLBOX )
599cdf0e10cSrcweir 	{
600cdf0e10cSrcweir 		HACK(noch nicht verwendet und noch nicht implementiert);
601cdf0e10cSrcweir 		return SFX_ALIGN_NOALIGNMENT;
602cdf0e10cSrcweir 	}
603cdf0e10cSrcweir 	else
604cdf0e10cSrcweir 		return SFX_ALIGN_NOALIGNMENT;
605cdf0e10cSrcweir }
606cdf0e10cSrcweir 
Resizing(Size &)607cdf0e10cSrcweir void SfxChildWindowContext::Resizing( Size& )
608cdf0e10cSrcweir {
609cdf0e10cSrcweir }
610cdf0e10cSrcweir 
Close()611cdf0e10cSrcweir sal_Bool SfxChildWindowContext::Close()
612cdf0e10cSrcweir {
613cdf0e10cSrcweir 	return sal_True;
614cdf0e10cSrcweir }
615cdf0e10cSrcweir 
SetFactory_Impl(SfxChildWinFactory * pF)616cdf0e10cSrcweir void SfxChildWindow::SetFactory_Impl( SfxChildWinFactory *pF )
617cdf0e10cSrcweir {
618cdf0e10cSrcweir 	pImp->pFact = pF;
619cdf0e10cSrcweir }
620cdf0e10cSrcweir 
SetHideNotDelete(sal_Bool bOn)621cdf0e10cSrcweir void SfxChildWindow::SetHideNotDelete( sal_Bool bOn )
622cdf0e10cSrcweir {
623cdf0e10cSrcweir 	pImp->bHideNotDelete = bOn;
624cdf0e10cSrcweir }
625cdf0e10cSrcweir 
IsHideNotDelete() const626cdf0e10cSrcweir sal_Bool SfxChildWindow::IsHideNotDelete() const
627cdf0e10cSrcweir {
628cdf0e10cSrcweir 	return pImp->bHideNotDelete;
629cdf0e10cSrcweir }
630cdf0e10cSrcweir 
SetHideAtToggle(sal_Bool bOn)631cdf0e10cSrcweir void SfxChildWindow::SetHideAtToggle( sal_Bool bOn )
632cdf0e10cSrcweir {
633cdf0e10cSrcweir 	pImp->bHideAtToggle = bOn;
634cdf0e10cSrcweir }
635cdf0e10cSrcweir 
IsHideAtToggle() const636cdf0e10cSrcweir sal_Bool SfxChildWindow::IsHideAtToggle() const
637cdf0e10cSrcweir {
638cdf0e10cSrcweir 	return pImp->bHideAtToggle;
639cdf0e10cSrcweir }
640cdf0e10cSrcweir 
SetWantsFocus(sal_Bool bSet)641cdf0e10cSrcweir void SfxChildWindow::SetWantsFocus( sal_Bool bSet )
642cdf0e10cSrcweir {
643cdf0e10cSrcweir 	pImp->bWantsFocus = bSet;
644cdf0e10cSrcweir }
645cdf0e10cSrcweir 
WantsFocus() const646cdf0e10cSrcweir sal_Bool SfxChildWindow::WantsFocus() const
647cdf0e10cSrcweir {
648cdf0e10cSrcweir 	return pImp->bWantsFocus;
649cdf0e10cSrcweir }
650cdf0e10cSrcweir 
GetExtraData_Impl(SfxChildAlignment * pAlign,SfxChildAlignment * pLastAlign,Size * pSize,sal_uInt16 * pLine,sal_uInt16 * pPos) const651cdf0e10cSrcweir sal_Bool SfxChildWinInfo::GetExtraData_Impl
652cdf0e10cSrcweir (
653cdf0e10cSrcweir 	SfxChildAlignment	*pAlign,
654cdf0e10cSrcweir 	SfxChildAlignment	*pLastAlign,
655cdf0e10cSrcweir 	Size				*pSize,
656cdf0e10cSrcweir 	sal_uInt16			*pLine,
657cdf0e10cSrcweir 	sal_uInt16			*pPos
658cdf0e10cSrcweir )   const
659cdf0e10cSrcweir {
660cdf0e10cSrcweir 	// ung"ultig?
661cdf0e10cSrcweir 	if ( !aExtraString.Len() )
662cdf0e10cSrcweir 		return sal_False;
663cdf0e10cSrcweir 	String aStr;
664cdf0e10cSrcweir 	sal_uInt16 nPos = aExtraString.SearchAscii("AL:");
665cdf0e10cSrcweir 	if ( nPos == STRING_NOTFOUND )
666cdf0e10cSrcweir 		return sal_False;
667cdf0e10cSrcweir 
668cdf0e10cSrcweir 	// Versuche, den Alignment-String "ALIGN:(...)" einzulesen; wenn
669cdf0e10cSrcweir 	// er nicht vorhanden ist, liegt eine "altere Version vor
670cdf0e10cSrcweir 	if ( nPos != STRING_NOTFOUND )
671cdf0e10cSrcweir 	{
672cdf0e10cSrcweir 		sal_uInt16 n1 = aExtraString.Search('(', nPos);
673cdf0e10cSrcweir 		if ( n1 != STRING_NOTFOUND )
674cdf0e10cSrcweir 		{
675cdf0e10cSrcweir 			sal_uInt16 n2 = aExtraString.Search(')', n1);
676cdf0e10cSrcweir 			if ( n2 != STRING_NOTFOUND )
677cdf0e10cSrcweir 			{
678cdf0e10cSrcweir 				// Alignment-String herausschneiden
679cdf0e10cSrcweir 				aStr = aExtraString.Copy(nPos, n2 - nPos + 1);
680cdf0e10cSrcweir 				aStr.Erase(nPos, n1-nPos+1);
681cdf0e10cSrcweir 			}
682cdf0e10cSrcweir 		}
683cdf0e10cSrcweir 	}
684cdf0e10cSrcweir 
685cdf0e10cSrcweir 	// Zuerst das Alignment extrahieren
686cdf0e10cSrcweir 	if ( !aStr.Len() )
687cdf0e10cSrcweir 		return sal_False;
688cdf0e10cSrcweir 	if ( pAlign )
689cdf0e10cSrcweir 		*pAlign = (SfxChildAlignment) (sal_uInt16) aStr.ToInt32();
690cdf0e10cSrcweir 
691cdf0e10cSrcweir 	// Dann das LastAlignment
692cdf0e10cSrcweir 	nPos = aStr.Search(',');
693cdf0e10cSrcweir 	if ( nPos == STRING_NOTFOUND )
694cdf0e10cSrcweir 		return sal_False;
695cdf0e10cSrcweir 	aStr.Erase(0, nPos+1);
696cdf0e10cSrcweir 	if ( pLastAlign )
697cdf0e10cSrcweir 		*pLastAlign = (SfxChildAlignment) (sal_uInt16) aStr.ToInt32();
698cdf0e10cSrcweir 
699cdf0e10cSrcweir 	// Dann die Splitting-Informationen
700cdf0e10cSrcweir 	nPos = aStr.Search(',');
701cdf0e10cSrcweir 	if ( nPos == STRING_NOTFOUND )
702cdf0e10cSrcweir 		// Dockt nicht in einem Splitwindow
703cdf0e10cSrcweir 		return sal_True;
704cdf0e10cSrcweir 	aStr.Erase(0, nPos+1);
705cdf0e10cSrcweir 	Point aChildPos;
706cdf0e10cSrcweir 	Size aChildSize;
707cdf0e10cSrcweir 	if ( GetPosSizeFromString( aStr, aChildPos, aChildSize ) )
708cdf0e10cSrcweir 	{
709cdf0e10cSrcweir 		if ( pSize )
710cdf0e10cSrcweir 			*pSize = aChildSize;
711cdf0e10cSrcweir 		if ( pLine )
712cdf0e10cSrcweir 			*pLine = (sal_uInt16) aChildPos.X();
713cdf0e10cSrcweir 		if ( pPos )
714cdf0e10cSrcweir 			*pPos = (sal_uInt16) aChildPos.Y();
715cdf0e10cSrcweir 		return sal_True;
716cdf0e10cSrcweir 	}
717cdf0e10cSrcweir 	return sal_False;
718cdf0e10cSrcweir }
719cdf0e10cSrcweir 
IsVisible() const720cdf0e10cSrcweir sal_Bool SfxChildWindow::IsVisible() const
721cdf0e10cSrcweir {
722cdf0e10cSrcweir 	return pImp->bVisible;
723cdf0e10cSrcweir }
724cdf0e10cSrcweir 
SetVisible_Impl(sal_Bool bVis)725cdf0e10cSrcweir void SfxChildWindow::SetVisible_Impl( sal_Bool bVis )
726cdf0e10cSrcweir {
727cdf0e10cSrcweir 	pImp->bVisible = bVis;
728cdf0e10cSrcweir }
729cdf0e10cSrcweir 
Hide()730cdf0e10cSrcweir void SfxChildWindow::Hide()
731cdf0e10cSrcweir {
732cdf0e10cSrcweir 	switch ( pWindow->GetType() )
733cdf0e10cSrcweir 	{
734cdf0e10cSrcweir 		case RSC_DOCKINGWINDOW :
735cdf0e10cSrcweir 			((DockingWindow*)pWindow)->Hide();
736cdf0e10cSrcweir 			break;
737cdf0e10cSrcweir 		case RSC_TOOLBOX :
738cdf0e10cSrcweir 			((ToolBox*)pWindow)->Hide();
739cdf0e10cSrcweir 			break;
740cdf0e10cSrcweir 		default:
741cdf0e10cSrcweir 			pWindow->Hide();
742cdf0e10cSrcweir 			break;
743cdf0e10cSrcweir 	}
744cdf0e10cSrcweir }
745cdf0e10cSrcweir 
746cdf0e10cSrcweir 
747cdf0e10cSrcweir 
Show(sal_uInt16 nFlags)748cdf0e10cSrcweir void SfxChildWindow::Show( sal_uInt16 nFlags )
749cdf0e10cSrcweir {
750cdf0e10cSrcweir 	switch ( pWindow->GetType() )
751cdf0e10cSrcweir 	{
752cdf0e10cSrcweir 		case RSC_DOCKINGWINDOW :
753cdf0e10cSrcweir             ((DockingWindow*)pWindow)->Show( sal_True, nFlags );
754cdf0e10cSrcweir 			break;
755cdf0e10cSrcweir 		case RSC_TOOLBOX :
756cdf0e10cSrcweir             ((ToolBox*)pWindow)->Show( sal_True, nFlags );
757cdf0e10cSrcweir 			break;
758cdf0e10cSrcweir 		default:
759cdf0e10cSrcweir             pWindow->Show( sal_True, nFlags );
760cdf0e10cSrcweir 			break;
761cdf0e10cSrcweir 	}
762cdf0e10cSrcweir }
763cdf0e10cSrcweir 
GetContextWindow(SfxModule * pModule) const764cdf0e10cSrcweir Window*	SfxChildWindow::GetContextWindow( SfxModule *pModule ) const
765cdf0e10cSrcweir {
766cdf0e10cSrcweir 	return pModule == pImp->pContextModule && pContext ? pContext->GetWindow(): 0;
767cdf0e10cSrcweir }
768cdf0e10cSrcweir 
SetWorkWindow_Impl(SfxWorkWindow * pWin)769cdf0e10cSrcweir void SfxChildWindow::SetWorkWindow_Impl( SfxWorkWindow* pWin )
770cdf0e10cSrcweir {
771cdf0e10cSrcweir 	pImp->pWorkWin = pWin;
772cdf0e10cSrcweir 	if ( pWin && pWindow->HasChildPathFocus() )
773cdf0e10cSrcweir 		pImp->pWorkWin->SetActiveChild_Impl( pWindow );
774cdf0e10cSrcweir }
775cdf0e10cSrcweir 
776cdf0e10cSrcweir //SfxWorkWindow* SfxChildWindow::GetWorkWindow_Impl() const
777cdf0e10cSrcweir //{
778cdf0e10cSrcweir //	return pImp->pWorkWin;
779cdf0e10cSrcweir //}
780cdf0e10cSrcweir 
Activate_Impl()781cdf0e10cSrcweir void SfxChildWindow::Activate_Impl()
782cdf0e10cSrcweir {
783cdf0e10cSrcweir 	if(pImp->pWorkWin!=NULL) //@#60568#
784cdf0e10cSrcweir 		pImp->pWorkWin->SetActiveChild_Impl( pWindow );
785cdf0e10cSrcweir }
786cdf0e10cSrcweir 
Deactivate_Impl()787cdf0e10cSrcweir void SfxChildWindow::Deactivate_Impl()
788cdf0e10cSrcweir {
789cdf0e10cSrcweir //	pImp->pWorkWin->SetActiveChild_Impl( NULL );
790cdf0e10cSrcweir }
791cdf0e10cSrcweir 
QueryClose()792cdf0e10cSrcweir sal_Bool SfxChildWindow::QueryClose()
793cdf0e10cSrcweir {
794cdf0e10cSrcweir     sal_Bool bAllow = sal_True;
795cdf0e10cSrcweir 
796cdf0e10cSrcweir 	if ( pImp->xFrame.is() )
797cdf0e10cSrcweir 	{
798cdf0e10cSrcweir 		::com::sun::star::uno::Reference< ::com::sun::star::frame::XController >  xCtrl = pImp->xFrame->getController();
799cdf0e10cSrcweir 		if ( xCtrl.is() )
800cdf0e10cSrcweir 			bAllow = xCtrl->suspend( sal_True );
801cdf0e10cSrcweir 	}
802cdf0e10cSrcweir 
803cdf0e10cSrcweir 	if ( bAllow )
804cdf0e10cSrcweir 		bAllow = !GetWindow()->IsInModalMode();
805cdf0e10cSrcweir 
806cdf0e10cSrcweir 	return bAllow;
807cdf0e10cSrcweir }
808cdf0e10cSrcweir 
GetFrame()809cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >  SfxChildWindow::GetFrame()
810cdf0e10cSrcweir {
811cdf0e10cSrcweir 	return pImp->xFrame;
812cdf0e10cSrcweir }
813cdf0e10cSrcweir 
SetFrame(const::com::sun::star::uno::Reference<::com::sun::star::frame::XFrame> & rFrame)814cdf0e10cSrcweir void SfxChildWindow::SetFrame( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > & rFrame )
815cdf0e10cSrcweir {
816cdf0e10cSrcweir     // Do nothing if nothing will be changed ...
817cdf0e10cSrcweir     if( pImp->xFrame != rFrame )
818cdf0e10cSrcweir     {
819cdf0e10cSrcweir         // ... but stop listening on old frame, if connection exist!
820cdf0e10cSrcweir         if( pImp->xFrame.is() )
821cdf0e10cSrcweir             pImp->xFrame->removeEventListener( pImp->xListener );
822cdf0e10cSrcweir 
823cdf0e10cSrcweir         // If new frame isnt NULL -> we must guarantee valid listener for disposing events.
824cdf0e10cSrcweir         // Use already existing or create new one.
825cdf0e10cSrcweir         if( rFrame.is() )
826cdf0e10cSrcweir             if( !pImp->xListener.is() )
827cdf0e10cSrcweir                 pImp->xListener = ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >( new DisposeListener( this, pImp ) );
828cdf0e10cSrcweir 
829cdf0e10cSrcweir         // Set new frame in data container
830cdf0e10cSrcweir         // and build new listener connection, if neccessary.
831cdf0e10cSrcweir         pImp->xFrame = rFrame;
832cdf0e10cSrcweir         if( pImp->xFrame.is() )
833cdf0e10cSrcweir             pImp->xFrame->addEventListener( pImp->xListener );
834cdf0e10cSrcweir     }
835cdf0e10cSrcweir }
836cdf0e10cSrcweir 
CanGetFocus() const837cdf0e10cSrcweir sal_Bool SfxChildWindow::CanGetFocus() const
838cdf0e10cSrcweir {
839cdf0e10cSrcweir 	return !(pImp->pFact->aInfo.nFlags & SFX_CHILDWIN_CANTGETFOCUS);
840cdf0e10cSrcweir }
841cdf0e10cSrcweir 
RegisterChildWindowContext(SfxModule * pMod,sal_uInt16 nId,SfxChildWinContextFactory * pFact)842cdf0e10cSrcweir void SfxChildWindowContext::RegisterChildWindowContext(SfxModule* pMod, sal_uInt16 nId, SfxChildWinContextFactory* pFact)
843cdf0e10cSrcweir {
844cdf0e10cSrcweir     SFX_APP()->RegisterChildWindowContext_Impl( pMod, nId, pFact );
845cdf0e10cSrcweir }
846cdf0e10cSrcweir 
RegisterChildWindow(SfxModule * pMod,SfxChildWinFactory * pFact)847cdf0e10cSrcweir void SfxChildWindow::RegisterChildWindow(SfxModule* pMod, SfxChildWinFactory* pFact)
848cdf0e10cSrcweir {
849cdf0e10cSrcweir     SFX_APP()->RegisterChildWindow_Impl( pMod, pFact );
850cdf0e10cSrcweir }
851cdf0e10cSrcweir 
852