1*6d739b60SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*6d739b60SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*6d739b60SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*6d739b60SAndrew Rist  * distributed with this work for additional information
6*6d739b60SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*6d739b60SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*6d739b60SAndrew Rist  * "License"); you may not use this file except in compliance
9*6d739b60SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*6d739b60SAndrew Rist  *
11*6d739b60SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*6d739b60SAndrew Rist  *
13*6d739b60SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*6d739b60SAndrew Rist  * software distributed under the License is distributed on an
15*6d739b60SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*6d739b60SAndrew Rist  * KIND, either express or implied.  See the License for the
17*6d739b60SAndrew Rist  * specific language governing permissions and limitations
18*6d739b60SAndrew Rist  * under the License.
19*6d739b60SAndrew Rist  *
20*6d739b60SAndrew Rist  *************************************************************/
21*6d739b60SAndrew Rist 
22*6d739b60SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_framework.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir //_________________________________________________________________________________________________________________
28cdf0e10cSrcweir //	my own includes
29cdf0e10cSrcweir //_________________________________________________________________________________________________________________
30cdf0e10cSrcweir 
31cdf0e10cSrcweir #include <services/tabwindowservice.hxx>
32cdf0e10cSrcweir #include <classes/fwktabwindow.hxx>
33cdf0e10cSrcweir #include <threadhelp/resetableguard.hxx>
34cdf0e10cSrcweir #include <services.h>
35cdf0e10cSrcweir #include <properties.h>
36cdf0e10cSrcweir 
37cdf0e10cSrcweir //_________________________________________________________________________________________________________________
38cdf0e10cSrcweir //	interface includes
39cdf0e10cSrcweir //_________________________________________________________________________________________________________________
40cdf0e10cSrcweir 
41cdf0e10cSrcweir #include <com/sun/star/awt/PosSize.hpp>
42cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp>
43cdf0e10cSrcweir 
44cdf0e10cSrcweir //_________________________________________________________________________________________________________________
45cdf0e10cSrcweir //	includes of other projects
46cdf0e10cSrcweir //_________________________________________________________________________________________________________________
47cdf0e10cSrcweir 
48cdf0e10cSrcweir #include <toolkit/helper/vclunohelper.hxx>
49cdf0e10cSrcweir #include <tools/urlobj.hxx>
50cdf0e10cSrcweir #include <rtl/ustrbuf.hxx>
51cdf0e10cSrcweir #include <vcl/svapp.hxx>
52cdf0e10cSrcweir 
53cdf0e10cSrcweir //_________________________________________________________________________________________________________________
54cdf0e10cSrcweir //	namespace
55cdf0e10cSrcweir //_________________________________________________________________________________________________________________
56cdf0e10cSrcweir 
57cdf0e10cSrcweir namespace framework{
58cdf0e10cSrcweir 
59cdf0e10cSrcweir //_________________________________________________________________________________________________________________
60cdf0e10cSrcweir //	non exported definitions
61cdf0e10cSrcweir //_________________________________________________________________________________________________________________
62cdf0e10cSrcweir 
63cdf0e10cSrcweir //_________________________________________________________________________________________________________________
64cdf0e10cSrcweir //	declarations
65cdf0e10cSrcweir //_________________________________________________________________________________________________________________
66cdf0e10cSrcweir 
67cdf0e10cSrcweir //*****************************************************************************************************************
68cdf0e10cSrcweir //	css::uno::XInterface, XTypeProvider, XServiceInfo
69cdf0e10cSrcweir //*****************************************************************************************************************
70cdf0e10cSrcweir 
DEFINE_XINTERFACE_6(TabWindowService,OWeakObject,DIRECT_INTERFACE (css::lang::XTypeProvider),DIRECT_INTERFACE (css::lang::XServiceInfo),DIRECT_INTERFACE (css::lang::XComponent),DIRECT_INTERFACE (css::awt::XSimpleTabController),DIRECT_INTERFACE (css::beans::XPropertySet),DIRECT_INTERFACE (css::beans::XPropertySetInfo))71cdf0e10cSrcweir DEFINE_XINTERFACE_6                 (   TabWindowService                                ,
72cdf0e10cSrcweir                                         OWeakObject                                     ,
73cdf0e10cSrcweir                                         DIRECT_INTERFACE(css::lang::XTypeProvider      ),
74cdf0e10cSrcweir                                         DIRECT_INTERFACE(css::lang::XServiceInfo       ),
75cdf0e10cSrcweir                                         DIRECT_INTERFACE(css::lang::XComponent),
76cdf0e10cSrcweir                                         DIRECT_INTERFACE(css::awt::XSimpleTabController),
77cdf0e10cSrcweir                                         DIRECT_INTERFACE(css::beans::XPropertySet      ),
78cdf0e10cSrcweir                                         DIRECT_INTERFACE(css::beans::XPropertySetInfo  )
79cdf0e10cSrcweir 									)
80cdf0e10cSrcweir 
81cdf0e10cSrcweir DEFINE_XTYPEPROVIDER_6              (   TabWindowService               ,
82cdf0e10cSrcweir                                         css::lang::XTypeProvider       ,
83cdf0e10cSrcweir                                         css::lang::XServiceInfo        ,
84cdf0e10cSrcweir                                         css::lang::XComponent          ,
85cdf0e10cSrcweir                                         css::awt::XSimpleTabController ,
86cdf0e10cSrcweir                                         css::beans::XPropertySet       ,
87cdf0e10cSrcweir                                         css::beans::XPropertySetInfo
88cdf0e10cSrcweir 									)
89cdf0e10cSrcweir 
90cdf0e10cSrcweir DEFINE_XSERVICEINFO_MULTISERVICE    (   TabWindowService                   ,
91cdf0e10cSrcweir                                         OWeakObject                        ,
92cdf0e10cSrcweir                                         SERVICENAME_TABWINDOWSERVICE       ,
93cdf0e10cSrcweir                                         IMPLEMENTATIONNAME_TABWINDOWSERVICE
94cdf0e10cSrcweir 									)
95cdf0e10cSrcweir 
96cdf0e10cSrcweir DEFINE_INIT_SERVICE                 (   TabWindowService,
97cdf0e10cSrcweir                                         {
98cdf0e10cSrcweir                                             impl_initializePropInfo();
99cdf0e10cSrcweir                                             m_aTransactionManager.setWorkingMode( E_WORK );
100cdf0e10cSrcweir                                         }
101cdf0e10cSrcweir                                     )
102cdf0e10cSrcweir 
103cdf0e10cSrcweir //*****************************************************************************************************************
104cdf0e10cSrcweir //	constructor
105cdf0e10cSrcweir //*****************************************************************************************************************
106cdf0e10cSrcweir TabWindowService::TabWindowService( const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory )
107cdf0e10cSrcweir 		//	Init baseclasses first
108cdf0e10cSrcweir 		//	Attention:
109cdf0e10cSrcweir 		//		Don't change order of initialization!
110cdf0e10cSrcweir 		//      ThreadHelpBase is a struct with a mutex as member. We can't use a mutex as member, while
111cdf0e10cSrcweir 		//		we must garant right initialization and a valid value of this! First initialize
112cdf0e10cSrcweir 		//		baseclasses and then members. And we need the mutex for other baseclasses !!!
113cdf0e10cSrcweir         :   ThreadHelpBase          ( &Application::GetSolarMutex() )
114cdf0e10cSrcweir         ,   TransactionBase         (                               )
115cdf0e10cSrcweir         ,   PropertySetHelper       ( xFactory                      ,
116cdf0e10cSrcweir                                       &m_aLock                      ,
117cdf0e10cSrcweir                                       &m_aTransactionManager        ,
118cdf0e10cSrcweir                                       sal_False                     ) // sal_False => dont release shared mutex on calling us!
119cdf0e10cSrcweir         ,   OWeakObject             (                               )
120cdf0e10cSrcweir 
121cdf0e10cSrcweir 		// Init member
122cdf0e10cSrcweir         ,   m_xFactory              ( xFactory                      )
123cdf0e10cSrcweir         ,   m_xTabWin               (                               )
124cdf0e10cSrcweir         ,   m_pTabWin               ( NULL                          )
125cdf0e10cSrcweir         ,   m_lTabPageInfos         (                               )
126cdf0e10cSrcweir         ,   m_lListener             ( m_aLock.getShareableOslMutex())
127cdf0e10cSrcweir         ,   m_nPageIndexCounter     ( 1                             )
128cdf0e10cSrcweir         ,   m_nCurrentPageIndex     ( 0                             )
129cdf0e10cSrcweir {
130cdf0e10cSrcweir 	// Safe impossible cases.
131cdf0e10cSrcweir 	// Method not defined for all incoming parameter.
132cdf0e10cSrcweir     LOG_ASSERT( xFactory.is(), "TabWindowService::TabWindowService()\nInvalid parameter detected!\n" )
133cdf0e10cSrcweir }
134cdf0e10cSrcweir 
135cdf0e10cSrcweir //*****************************************************************************************************************
136cdf0e10cSrcweir //	destructor
137cdf0e10cSrcweir //*****************************************************************************************************************
~TabWindowService()138cdf0e10cSrcweir TabWindowService::~TabWindowService()
139cdf0e10cSrcweir {
140cdf0e10cSrcweir     // SAFE->
141cdf0e10cSrcweir     ResetableGuard aGuard(m_aLock);
142cdf0e10cSrcweir 
143cdf0e10cSrcweir     if (m_pTabWin)
144cdf0e10cSrcweir         m_pTabWin->RemoveEventListener( LINK( this, TabWindowService, EventListener ) );
145cdf0e10cSrcweir }
146cdf0e10cSrcweir 
147cdf0e10cSrcweir //*****************************************************************************************************************
148cdf0e10cSrcweir //  XSimpleTabController
149cdf0e10cSrcweir //*****************************************************************************************************************
insertTab()150cdf0e10cSrcweir ::sal_Int32 SAL_CALL TabWindowService::insertTab()
151cdf0e10cSrcweir     throw ( css::uno::RuntimeException )
152cdf0e10cSrcweir {
153cdf0e10cSrcweir     // SAFE ->
154cdf0e10cSrcweir     ResetableGuard aGuard( m_aLock );
155cdf0e10cSrcweir 
156cdf0e10cSrcweir     ::sal_Int32  nID  = m_nPageIndexCounter++;
157cdf0e10cSrcweir     TTabPageInfo aInfo(nID);
158cdf0e10cSrcweir 
159cdf0e10cSrcweir     m_lTabPageInfos[nID] = aInfo;
160cdf0e10cSrcweir 
161cdf0e10cSrcweir     return nID;
162cdf0e10cSrcweir }
163cdf0e10cSrcweir 
164cdf0e10cSrcweir //*****************************************************************************************************************
165cdf0e10cSrcweir //  XSimpleTabController
166cdf0e10cSrcweir //*****************************************************************************************************************
removeTab(::sal_Int32 nID)167cdf0e10cSrcweir void SAL_CALL TabWindowService::removeTab(::sal_Int32 nID)
168cdf0e10cSrcweir     throw (css::lang::IndexOutOfBoundsException,
169cdf0e10cSrcweir            css::uno::RuntimeException          )
170cdf0e10cSrcweir {
171cdf0e10cSrcweir     // SAFE ->
172cdf0e10cSrcweir     ResetableGuard aGuard(m_aLock);
173cdf0e10cSrcweir 
174cdf0e10cSrcweir     // throws suitable IndexOutOfBoundsException .-)
175cdf0e10cSrcweir     TTabPageInfoHash::iterator pIt = impl_getTabPageInfo (nID);
176cdf0e10cSrcweir     m_lTabPageInfos.erase(pIt);
177cdf0e10cSrcweir 
178cdf0e10cSrcweir     FwkTabWindow* pTabWin = mem_TabWin ();
179cdf0e10cSrcweir     if (pTabWin)
180cdf0e10cSrcweir         pTabWin->RemovePage(nID);
181cdf0e10cSrcweir }
182cdf0e10cSrcweir 
183cdf0e10cSrcweir //*****************************************************************************************************************
184cdf0e10cSrcweir //  XSimpleTabController
185cdf0e10cSrcweir //*****************************************************************************************************************
setTabProps(::sal_Int32 nID,const css::uno::Sequence<css::beans::NamedValue> & lProperties)186cdf0e10cSrcweir void SAL_CALL TabWindowService::setTabProps(      ::sal_Int32                                   nID        ,
187cdf0e10cSrcweir                                               const css::uno::Sequence< css::beans::NamedValue >& lProperties)
188cdf0e10cSrcweir     throw (css::lang::IndexOutOfBoundsException,
189cdf0e10cSrcweir            css::uno::RuntimeException          )
190cdf0e10cSrcweir {
191cdf0e10cSrcweir     // SAFE ->
192cdf0e10cSrcweir     ResetableGuard aGuard(m_aLock);
193cdf0e10cSrcweir 
194cdf0e10cSrcweir     // throws suitable IndexOutOfBoundsException .-)
195cdf0e10cSrcweir     TTabPageInfoHash::iterator pIt   = impl_getTabPageInfo (nID);
196cdf0e10cSrcweir     TTabPageInfo&              rInfo = pIt->second;
197cdf0e10cSrcweir     rInfo.m_lProperties = lProperties;
198cdf0e10cSrcweir 
199cdf0e10cSrcweir     if ( ! rInfo.m_bCreated)
200cdf0e10cSrcweir     {
201cdf0e10cSrcweir         FwkTabWindow* pTabWin = mem_TabWin ();
202cdf0e10cSrcweir         if (pTabWin)
203cdf0e10cSrcweir         {
204cdf0e10cSrcweir             pTabWin->AddTabPage(rInfo.m_nIndex, rInfo.m_lProperties);
205cdf0e10cSrcweir 			rInfo.m_bCreated = sal_True;
206cdf0e10cSrcweir         }
207cdf0e10cSrcweir     }
208cdf0e10cSrcweir }
209cdf0e10cSrcweir 
210cdf0e10cSrcweir //*****************************************************************************************************************
211cdf0e10cSrcweir //  XSimpleTabController
212cdf0e10cSrcweir //*****************************************************************************************************************
getTabProps(::sal_Int32 nID)213cdf0e10cSrcweir css::uno::Sequence< css::beans::NamedValue > SAL_CALL TabWindowService::getTabProps(::sal_Int32 nID)
214cdf0e10cSrcweir     throw (css::lang::IndexOutOfBoundsException,
215cdf0e10cSrcweir            css::uno::RuntimeException          )
216cdf0e10cSrcweir {
217cdf0e10cSrcweir     // SAFE ->
218cdf0e10cSrcweir     ResetableGuard aGuard(m_aLock);
219cdf0e10cSrcweir 
220cdf0e10cSrcweir     // throws suitable IndexOutOfBoundsException .-)
221cdf0e10cSrcweir     TTabPageInfoHash::const_iterator pIt   = impl_getTabPageInfo (nID);
222cdf0e10cSrcweir     const TTabPageInfo&              rInfo = pIt->second;
223cdf0e10cSrcweir 
224cdf0e10cSrcweir     return rInfo.m_lProperties;
225cdf0e10cSrcweir }
226cdf0e10cSrcweir 
227cdf0e10cSrcweir //*****************************************************************************************************************
228cdf0e10cSrcweir //  XSimpleTabController
229cdf0e10cSrcweir //*****************************************************************************************************************
activateTab(::sal_Int32 nID)230cdf0e10cSrcweir void SAL_CALL TabWindowService::activateTab(::sal_Int32 nID)
231cdf0e10cSrcweir     throw (css::lang::IndexOutOfBoundsException,
232cdf0e10cSrcweir            css::uno::RuntimeException          )
233cdf0e10cSrcweir {
234cdf0e10cSrcweir     // SAFE ->
235cdf0e10cSrcweir     ResetableGuard aGuard(m_aLock);
236cdf0e10cSrcweir 
237cdf0e10cSrcweir     // throws suitable IndexOutOfBoundsException .-)
238cdf0e10cSrcweir     impl_checkTabIndex (nID);
239cdf0e10cSrcweir     m_nCurrentPageIndex = nID;
240cdf0e10cSrcweir 
241cdf0e10cSrcweir     FwkTabWindow* pTabWin = mem_TabWin ();
242cdf0e10cSrcweir     if (pTabWin)
243cdf0e10cSrcweir         pTabWin->ActivatePage(nID);
244cdf0e10cSrcweir }
245cdf0e10cSrcweir 
246cdf0e10cSrcweir //*****************************************************************************************************************
247cdf0e10cSrcweir //  XSimpleTabController
248cdf0e10cSrcweir //*****************************************************************************************************************
getActiveTabID()249cdf0e10cSrcweir ::sal_Int32 SAL_CALL TabWindowService::getActiveTabID()
250cdf0e10cSrcweir     throw (css::uno::RuntimeException)
251cdf0e10cSrcweir {
252cdf0e10cSrcweir     // SAFE->
253cdf0e10cSrcweir     ResetableGuard aGuard( m_aLock );
254cdf0e10cSrcweir     return m_nCurrentPageIndex;
255cdf0e10cSrcweir }
256cdf0e10cSrcweir 
257cdf0e10cSrcweir //*****************************************************************************************************************
258cdf0e10cSrcweir //  XSimpleTabController
259cdf0e10cSrcweir //*****************************************************************************************************************
addTabListener(const css::uno::Reference<css::awt::XTabListener> & xListener)260cdf0e10cSrcweir void SAL_CALL TabWindowService::addTabListener(const css::uno::Reference< css::awt::XTabListener >& xListener)
261cdf0e10cSrcweir     throw (css::uno::RuntimeException)
262cdf0e10cSrcweir {
263cdf0e10cSrcweir     m_lListener.addInterface(::getCppuType((const css::uno::Reference< css::awt::XTabListener >*)NULL), xListener);
264cdf0e10cSrcweir }
265cdf0e10cSrcweir 
266cdf0e10cSrcweir //*****************************************************************************************************************
267cdf0e10cSrcweir //  XSimpleTabController
268cdf0e10cSrcweir //*****************************************************************************************************************
removeTabListener(const css::uno::Reference<css::awt::XTabListener> & xListener)269cdf0e10cSrcweir void SAL_CALL TabWindowService::removeTabListener(const css::uno::Reference< css::awt::XTabListener >& xListener)
270cdf0e10cSrcweir     throw (css::uno::RuntimeException)
271cdf0e10cSrcweir {
272cdf0e10cSrcweir     m_lListener.removeInterface(::getCppuType((const css::uno::Reference< css::awt::XTabListener >*)NULL), xListener);
273cdf0e10cSrcweir }
274cdf0e10cSrcweir 
275cdf0e10cSrcweir //*****************************************************************************************************************
276cdf0e10cSrcweir //  XComponent
277cdf0e10cSrcweir //*****************************************************************************************************************
dispose()278cdf0e10cSrcweir void SAL_CALL TabWindowService::dispose()
279cdf0e10cSrcweir     throw (css::uno::RuntimeException)
280cdf0e10cSrcweir {
281cdf0e10cSrcweir     // SAFE->
282cdf0e10cSrcweir     ResetableGuard aGuard(m_aLock);
283cdf0e10cSrcweir 
284cdf0e10cSrcweir     css::uno::Reference< css::uno::XInterface > xThis(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY);
285cdf0e10cSrcweir     css::lang::EventObject aEvent(xThis);
286cdf0e10cSrcweir 
287cdf0e10cSrcweir     m_lListener.disposeAndClear (aEvent);
288cdf0e10cSrcweir 
289cdf0e10cSrcweir 	if (m_pTabWin)
290cdf0e10cSrcweir 	    m_pTabWin->RemoveEventListener( LINK( this, TabWindowService, EventListener ) );
291cdf0e10cSrcweir 
292cdf0e10cSrcweir     m_pTabWin = NULL;
293cdf0e10cSrcweir     m_xTabWin.clear();
294cdf0e10cSrcweir }
295cdf0e10cSrcweir 
296cdf0e10cSrcweir //*****************************************************************************************************************
297cdf0e10cSrcweir //  XComponent
298cdf0e10cSrcweir //*****************************************************************************************************************
addEventListener(const css::uno::Reference<css::lang::XEventListener> & xListener)299cdf0e10cSrcweir void SAL_CALL TabWindowService::addEventListener(const css::uno::Reference< css::lang::XEventListener >& xListener)
300cdf0e10cSrcweir     throw (css::uno::RuntimeException)
301cdf0e10cSrcweir {
302cdf0e10cSrcweir     m_lListener.addInterface(::getCppuType((const css::uno::Reference< css::lang::XEventListener >*)NULL), xListener);
303cdf0e10cSrcweir }
304cdf0e10cSrcweir 
305cdf0e10cSrcweir //*****************************************************************************************************************
306cdf0e10cSrcweir //  XComponent
307cdf0e10cSrcweir //*****************************************************************************************************************
removeEventListener(const css::uno::Reference<css::lang::XEventListener> & xListener)308cdf0e10cSrcweir void SAL_CALL TabWindowService::removeEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener)
309cdf0e10cSrcweir     throw (css::uno::RuntimeException)
310cdf0e10cSrcweir {
311cdf0e10cSrcweir     m_lListener.removeInterface(::getCppuType((const css::uno::Reference< css::lang::XEventListener >*)NULL), xListener);
312cdf0e10cSrcweir }
313cdf0e10cSrcweir 
314cdf0e10cSrcweir //*****************************************************************************************************************
impl_initializePropInfo()315cdf0e10cSrcweir void TabWindowService::impl_initializePropInfo()
316cdf0e10cSrcweir {
317cdf0e10cSrcweir     impl_setPropertyChangeBroadcaster(static_cast< css::awt::XSimpleTabController* >(this));
318cdf0e10cSrcweir 
319cdf0e10cSrcweir     impl_addPropertyInfo(
320cdf0e10cSrcweir         css::beans::Property(
321cdf0e10cSrcweir             TABWINDOWSERVICE_PROPNAME_WINDOW,
322cdf0e10cSrcweir             TABWINDOWSERVICE_PROPHANDLE_WINDOW,
323cdf0e10cSrcweir             ::getCppuType((const css::uno::Reference< css::awt::XWindow >*)NULL),
324cdf0e10cSrcweir             css::beans::PropertyAttribute::TRANSIENT));
325cdf0e10cSrcweir }
326cdf0e10cSrcweir 
327cdf0e10cSrcweir //*****************************************************************************************************************
impl_setPropertyValue(const::rtl::OUString &,sal_Int32,const css::uno::Any &)328cdf0e10cSrcweir void SAL_CALL TabWindowService::impl_setPropertyValue(const ::rtl::OUString& /*sProperty*/,
329cdf0e10cSrcweir                                                               sal_Int32        /*nHandle  */,
330cdf0e10cSrcweir                                                         const css::uno::Any&   /*aValue   */)
331cdf0e10cSrcweir 
332cdf0e10cSrcweir {
333cdf0e10cSrcweir }
334cdf0e10cSrcweir 
335cdf0e10cSrcweir //*****************************************************************************************************************
impl_getPropertyValue(const::rtl::OUString &,sal_Int32 nHandle)336cdf0e10cSrcweir css::uno::Any SAL_CALL TabWindowService::impl_getPropertyValue(const ::rtl::OUString& /*sProperty*/,
337cdf0e10cSrcweir                                                                        sal_Int32        nHandle      )
338cdf0e10cSrcweir {
339cdf0e10cSrcweir     /* There is no need to lock any mutex here. Because we share the
340cdf0e10cSrcweir        solar mutex with our base class. And we said to our base class: "dont release it on calling us" .-)
341cdf0e10cSrcweir        see ctor of PropertySetHelper for further informations.
342cdf0e10cSrcweir     */
343cdf0e10cSrcweir     css::uno::Any aValue;
344cdf0e10cSrcweir 
345cdf0e10cSrcweir     switch (nHandle)
346cdf0e10cSrcweir     {
347cdf0e10cSrcweir         case TABWINDOWSERVICE_PROPHANDLE_WINDOW:
348cdf0e10cSrcweir             {
349cdf0e10cSrcweir                 mem_TabWin (); // force "creation on demand" of m_xTabWin :-)
350cdf0e10cSrcweir                 aValue <<= m_xTabWin;
351cdf0e10cSrcweir             }
352cdf0e10cSrcweir             break;
353cdf0e10cSrcweir     }
354cdf0e10cSrcweir 
355cdf0e10cSrcweir     return aValue;
356cdf0e10cSrcweir }
357cdf0e10cSrcweir 
358cdf0e10cSrcweir //*****************************************************************************************************************
359cdf0e10cSrcweir //  TabWindowService
360cdf0e10cSrcweir //*****************************************************************************************************************
IMPL_LINK(TabWindowService,EventListener,VclSimpleEvent *,pEvent)361cdf0e10cSrcweir IMPL_LINK( TabWindowService, EventListener, VclSimpleEvent*, pEvent )
362cdf0e10cSrcweir {
363cdf0e10cSrcweir 
364cdf0e10cSrcweir     if ( !pEvent && !pEvent->ISA(VclWindowEvent))
365cdf0e10cSrcweir         return 0;
366cdf0e10cSrcweir 
367cdf0e10cSrcweir     sal_uLong           nEventId = pEvent->GetId();
368cdf0e10cSrcweir     VclWindowEvent* pWinEvt  = static_cast< VclWindowEvent* >(pEvent);
369cdf0e10cSrcweir 
370cdf0e10cSrcweir     css::uno::Reference< css::uno::XInterface > xThis ( static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY );
371cdf0e10cSrcweir     css::lang::EventObject aEvent( xThis );
372cdf0e10cSrcweir 
373cdf0e10cSrcweir     if (nEventId == VCLEVENT_OBJECT_DYING)
374cdf0e10cSrcweir     {
375cdf0e10cSrcweir         m_lListener.disposeAndClear (aEvent);
376cdf0e10cSrcweir 
377cdf0e10cSrcweir 		m_pTabWin->RemoveEventListener( LINK( this, TabWindowService, EventListener ) );
378cdf0e10cSrcweir 		m_pTabWin = NULL;
379cdf0e10cSrcweir 		m_xTabWin.clear();
380cdf0e10cSrcweir 
381cdf0e10cSrcweir         return 0;
382cdf0e10cSrcweir     }
383cdf0e10cSrcweir 
384cdf0e10cSrcweir     ::cppu::OInterfaceContainerHelper* pContainer = m_lListener.getContainer(::getCppuType((const css::uno::Reference< css::awt::XTabListener >*) NULL));
385cdf0e10cSrcweir     if ( ! pContainer)
386cdf0e10cSrcweir         return 0;
387cdf0e10cSrcweir 
388cdf0e10cSrcweir     ::cppu::OInterfaceIteratorHelper pIterator(*pContainer);
389cdf0e10cSrcweir     while (pIterator.hasMoreElements())
390cdf0e10cSrcweir     {
391cdf0e10cSrcweir         try
392cdf0e10cSrcweir         {
393cdf0e10cSrcweir             css::awt::XTabListener* pListener = (css::awt::XTabListener*)pIterator.next();
394cdf0e10cSrcweir 
395cdf0e10cSrcweir             switch (nEventId)
396cdf0e10cSrcweir             {
397cdf0e10cSrcweir                 case VCLEVENT_TABPAGE_ACTIVATE :
398cdf0e10cSrcweir                     pListener->activated( (sal_Int32)(sal_uLong)pWinEvt->GetData() );
399cdf0e10cSrcweir                     break;
400cdf0e10cSrcweir 
401cdf0e10cSrcweir                 case VCLEVENT_TABPAGE_DEACTIVATE :
402cdf0e10cSrcweir                     pListener->deactivated( (sal_Int32)(sal_uLong)pWinEvt->GetData() );
403cdf0e10cSrcweir                     break;
404cdf0e10cSrcweir 
405cdf0e10cSrcweir                 case VCLEVENT_TABPAGE_INSERTED :
406cdf0e10cSrcweir                     pListener->inserted( (sal_Int32)(sal_uLong)pWinEvt->GetData() );
407cdf0e10cSrcweir                     break;
408cdf0e10cSrcweir 
409cdf0e10cSrcweir                 case VCLEVENT_TABPAGE_REMOVED :
410cdf0e10cSrcweir                     pListener->removed( (sal_Int32)(sal_uLong)pWinEvt->GetData() );
411cdf0e10cSrcweir                     break;
412cdf0e10cSrcweir 
413cdf0e10cSrcweir                 case VCLEVENT_TABPAGE_PAGETEXTCHANGED :
414cdf0e10cSrcweir                 case VCLEVENT_TABPAGE_REMOVEDALL :
415cdf0e10cSrcweir                     break;
416cdf0e10cSrcweir             }
417cdf0e10cSrcweir         }
418cdf0e10cSrcweir         catch(const css::uno::RuntimeException&)
419cdf0e10cSrcweir         {
420cdf0e10cSrcweir             pIterator.remove();
421cdf0e10cSrcweir         }
422cdf0e10cSrcweir     }
423cdf0e10cSrcweir 
424cdf0e10cSrcweir     return 0;
425cdf0e10cSrcweir }
426cdf0e10cSrcweir 
427cdf0e10cSrcweir //*****************************************************************************************************************
428cdf0e10cSrcweir //  TabWindowService
429cdf0e10cSrcweir //*****************************************************************************************************************
impl_checkTabIndex(::sal_Int32 nID)430cdf0e10cSrcweir void TabWindowService::impl_checkTabIndex (::sal_Int32 nID)
431cdf0e10cSrcweir     throw (css::lang::IndexOutOfBoundsException)
432cdf0e10cSrcweir {
433cdf0e10cSrcweir     if (
434cdf0e10cSrcweir         (nID <= 0                  ) ||
435cdf0e10cSrcweir         (nID >  m_nPageIndexCounter)
436cdf0e10cSrcweir        )
437cdf0e10cSrcweir     {
438cdf0e10cSrcweir         throw css::lang::IndexOutOfBoundsException(
439cdf0e10cSrcweir                 ::rtl::OUString::createFromAscii("Tab index out of bounds."),
440cdf0e10cSrcweir                 css::uno::Reference< css::uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY ));
441cdf0e10cSrcweir     }
442cdf0e10cSrcweir }
443cdf0e10cSrcweir 
444cdf0e10cSrcweir //*****************************************************************************************************************
445cdf0e10cSrcweir //  TabWindowService
446cdf0e10cSrcweir //*****************************************************************************************************************
impl_getTabPageInfo(::sal_Int32 nID)447cdf0e10cSrcweir TTabPageInfoHash::iterator TabWindowService::impl_getTabPageInfo(::sal_Int32 nID)
448cdf0e10cSrcweir     throw (css::lang::IndexOutOfBoundsException)
449cdf0e10cSrcweir {
450cdf0e10cSrcweir     TTabPageInfoHash::iterator pIt = m_lTabPageInfos.find(nID);
451cdf0e10cSrcweir     if (pIt == m_lTabPageInfos.end ())
452cdf0e10cSrcweir         throw css::lang::IndexOutOfBoundsException(
453cdf0e10cSrcweir                 ::rtl::OUString::createFromAscii("Tab index out of bounds."),
454cdf0e10cSrcweir                 css::uno::Reference< css::uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY ));
455cdf0e10cSrcweir     return pIt;
456cdf0e10cSrcweir }
457cdf0e10cSrcweir 
458cdf0e10cSrcweir //*****************************************************************************************************************
459cdf0e10cSrcweir //  TabWindowService
460cdf0e10cSrcweir //*****************************************************************************************************************
mem_TabWin()461cdf0e10cSrcweir FwkTabWindow* TabWindowService::mem_TabWin ()
462cdf0e10cSrcweir {
463cdf0e10cSrcweir     FwkTabWindow* pWin = NULL;
464cdf0e10cSrcweir 
465cdf0e10cSrcweir     if ( ! m_xTabWin.is ())
466cdf0e10cSrcweir     {
467cdf0e10cSrcweir         Window* pFakeParent = dynamic_cast< Window* >(Application::GetDefaultDevice ());
468cdf0e10cSrcweir 
469cdf0e10cSrcweir         m_pTabWin = new FwkTabWindow (pFakeParent);
470cdf0e10cSrcweir         m_xTabWin = VCLUnoHelper::GetInterface (m_pTabWin);
471cdf0e10cSrcweir 
472cdf0e10cSrcweir         m_pTabWin->AddEventListener( LINK( this, TabWindowService, EventListener ) );
473cdf0e10cSrcweir     }
474cdf0e10cSrcweir 
475cdf0e10cSrcweir     if (m_xTabWin.is ())
476cdf0e10cSrcweir         pWin = m_pTabWin;
477cdf0e10cSrcweir 
478cdf0e10cSrcweir     return pWin;
479cdf0e10cSrcweir }
480cdf0e10cSrcweir 
481cdf0e10cSrcweir } //	namespace framework
482