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