summaryrefslogtreecommitdiff
path: root/framework/source/services/tabwindowservice.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'framework/source/services/tabwindowservice.cxx')
-rw-r--r--framework/source/services/tabwindowservice.cxx485
1 files changed, 485 insertions, 0 deletions
diff --git a/framework/source/services/tabwindowservice.cxx b/framework/source/services/tabwindowservice.cxx
new file mode 100644
index 000000000000..9af8581652d3
--- /dev/null
+++ b/framework/source/services/tabwindowservice.cxx
@@ -0,0 +1,485 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_framework.hxx"
+
+//_________________________________________________________________________________________________________________
+// my own includes
+//_________________________________________________________________________________________________________________
+
+#include <services/tabwindowservice.hxx>
+#include <classes/fwktabwindow.hxx>
+#include <threadhelp/resetableguard.hxx>
+#include <services.h>
+#include <properties.h>
+
+//_________________________________________________________________________________________________________________
+// interface includes
+//_________________________________________________________________________________________________________________
+
+#include <com/sun/star/awt/PosSize.hpp>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+
+//_________________________________________________________________________________________________________________
+// includes of other projects
+//_________________________________________________________________________________________________________________
+
+#include <toolkit/helper/vclunohelper.hxx>
+#include <tools/urlobj.hxx>
+#include <rtl/ustrbuf.hxx>
+#include <vcl/svapp.hxx>
+
+//_________________________________________________________________________________________________________________
+// namespace
+//_________________________________________________________________________________________________________________
+
+namespace framework{
+
+//_________________________________________________________________________________________________________________
+// non exported definitions
+//_________________________________________________________________________________________________________________
+
+//_________________________________________________________________________________________________________________
+// declarations
+//_________________________________________________________________________________________________________________
+
+//*****************************************************************************************************************
+// css::uno::XInterface, XTypeProvider, XServiceInfo
+//*****************************************************************************************************************
+
+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 )
+ )
+
+DEFINE_XTYPEPROVIDER_6 ( TabWindowService ,
+ css::lang::XTypeProvider ,
+ css::lang::XServiceInfo ,
+ css::lang::XComponent ,
+ css::awt::XSimpleTabController ,
+ css::beans::XPropertySet ,
+ css::beans::XPropertySetInfo
+ )
+
+DEFINE_XSERVICEINFO_MULTISERVICE ( TabWindowService ,
+ OWeakObject ,
+ SERVICENAME_TABWINDOWSERVICE ,
+ IMPLEMENTATIONNAME_TABWINDOWSERVICE
+ )
+
+DEFINE_INIT_SERVICE ( TabWindowService,
+ {
+ impl_initializePropInfo();
+ m_aTransactionManager.setWorkingMode( E_WORK );
+ }
+ )
+
+//*****************************************************************************************************************
+// constructor
+//*****************************************************************************************************************
+TabWindowService::TabWindowService( const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory )
+ // Init baseclasses first
+ // Attention:
+ // Don't change order of initialization!
+ // ThreadHelpBase is a struct with a mutex as member. We can't use a mutex as member, while
+ // we must garant right initialization and a valid value of this! First initialize
+ // baseclasses and then members. And we need the mutex for other baseclasses !!!
+ : ThreadHelpBase ( &Application::GetSolarMutex() )
+ , TransactionBase ( )
+ , PropertySetHelper ( xFactory ,
+ &m_aLock ,
+ &m_aTransactionManager ,
+ sal_False ) // FALSE => dont release shared mutex on calling us!
+ , OWeakObject ( )
+
+ // Init member
+ , m_xFactory ( xFactory )
+ , m_xTabWin ( )
+ , m_pTabWin ( NULL )
+ , m_lTabPageInfos ( )
+ , m_lListener ( m_aLock.getShareableOslMutex())
+ , m_nPageIndexCounter ( 1 )
+ , m_nCurrentPageIndex ( 0 )
+{
+ // Safe impossible cases.
+ // Method not defined for all incoming parameter.
+ LOG_ASSERT( xFactory.is(), "TabWindowService::TabWindowService()\nInvalid parameter detected!\n" )
+}
+
+//*****************************************************************************************************************
+// destructor
+//*****************************************************************************************************************
+TabWindowService::~TabWindowService()
+{
+ // SAFE->
+ ResetableGuard aGuard(m_aLock);
+
+ if (m_pTabWin)
+ m_pTabWin->RemoveEventListener( LINK( this, TabWindowService, EventListener ) );
+}
+
+//*****************************************************************************************************************
+// XSimpleTabController
+//*****************************************************************************************************************
+::sal_Int32 SAL_CALL TabWindowService::insertTab()
+ throw ( css::uno::RuntimeException )
+{
+ // SAFE ->
+ ResetableGuard aGuard( m_aLock );
+
+ ::sal_Int32 nID = m_nPageIndexCounter++;
+ TTabPageInfo aInfo(nID);
+
+ m_lTabPageInfos[nID] = aInfo;
+
+ return nID;
+}
+
+//*****************************************************************************************************************
+// XSimpleTabController
+//*****************************************************************************************************************
+void SAL_CALL TabWindowService::removeTab(::sal_Int32 nID)
+ throw (css::lang::IndexOutOfBoundsException,
+ css::uno::RuntimeException )
+{
+ // SAFE ->
+ ResetableGuard aGuard(m_aLock);
+
+ // throws suitable IndexOutOfBoundsException .-)
+ TTabPageInfoHash::iterator pIt = impl_getTabPageInfo (nID);
+ m_lTabPageInfos.erase(pIt);
+
+ FwkTabWindow* pTabWin = mem_TabWin ();
+ if (pTabWin)
+ pTabWin->RemovePage(nID);
+}
+
+//*****************************************************************************************************************
+// XSimpleTabController
+//*****************************************************************************************************************
+void SAL_CALL TabWindowService::setTabProps( ::sal_Int32 nID ,
+ const css::uno::Sequence< css::beans::NamedValue >& lProperties)
+ throw (css::lang::IndexOutOfBoundsException,
+ css::uno::RuntimeException )
+{
+ // SAFE ->
+ ResetableGuard aGuard(m_aLock);
+
+ // throws suitable IndexOutOfBoundsException .-)
+ TTabPageInfoHash::iterator pIt = impl_getTabPageInfo (nID);
+ TTabPageInfo& rInfo = pIt->second;
+ rInfo.m_lProperties = lProperties;
+
+ if ( ! rInfo.m_bCreated)
+ {
+ FwkTabWindow* pTabWin = mem_TabWin ();
+ if (pTabWin)
+ {
+ pTabWin->AddTabPage(rInfo.m_nIndex, rInfo.m_lProperties);
+ rInfo.m_bCreated = sal_True;
+ }
+ }
+}
+
+//*****************************************************************************************************************
+// XSimpleTabController
+//*****************************************************************************************************************
+css::uno::Sequence< css::beans::NamedValue > SAL_CALL TabWindowService::getTabProps(::sal_Int32 nID)
+ throw (css::lang::IndexOutOfBoundsException,
+ css::uno::RuntimeException )
+{
+ // SAFE ->
+ ResetableGuard aGuard(m_aLock);
+
+ // throws suitable IndexOutOfBoundsException .-)
+ TTabPageInfoHash::const_iterator pIt = impl_getTabPageInfo (nID);
+ const TTabPageInfo& rInfo = pIt->second;
+
+ return rInfo.m_lProperties;
+}
+
+//*****************************************************************************************************************
+// XSimpleTabController
+//*****************************************************************************************************************
+void SAL_CALL TabWindowService::activateTab(::sal_Int32 nID)
+ throw (css::lang::IndexOutOfBoundsException,
+ css::uno::RuntimeException )
+{
+ // SAFE ->
+ ResetableGuard aGuard(m_aLock);
+
+ // throws suitable IndexOutOfBoundsException .-)
+ impl_checkTabIndex (nID);
+ m_nCurrentPageIndex = nID;
+
+ FwkTabWindow* pTabWin = mem_TabWin ();
+ if (pTabWin)
+ pTabWin->ActivatePage(nID);
+}
+
+//*****************************************************************************************************************
+// XSimpleTabController
+//*****************************************************************************************************************
+::sal_Int32 SAL_CALL TabWindowService::getActiveTabID()
+ throw (css::uno::RuntimeException)
+{
+ // SAFE->
+ ResetableGuard aGuard( m_aLock );
+ return m_nCurrentPageIndex;
+}
+
+//*****************************************************************************************************************
+// XSimpleTabController
+//*****************************************************************************************************************
+void SAL_CALL TabWindowService::addTabListener(const css::uno::Reference< css::awt::XTabListener >& xListener)
+ throw (css::uno::RuntimeException)
+{
+ m_lListener.addInterface(::getCppuType((const css::uno::Reference< css::awt::XTabListener >*)NULL), xListener);
+}
+
+//*****************************************************************************************************************
+// XSimpleTabController
+//*****************************************************************************************************************
+void SAL_CALL TabWindowService::removeTabListener(const css::uno::Reference< css::awt::XTabListener >& xListener)
+ throw (css::uno::RuntimeException)
+{
+ m_lListener.removeInterface(::getCppuType((const css::uno::Reference< css::awt::XTabListener >*)NULL), xListener);
+}
+
+//*****************************************************************************************************************
+// XComponent
+//*****************************************************************************************************************
+void SAL_CALL TabWindowService::dispose()
+ throw (css::uno::RuntimeException)
+{
+ // SAFE->
+ ResetableGuard aGuard(m_aLock);
+
+ css::uno::Reference< css::uno::XInterface > xThis(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY);
+ css::lang::EventObject aEvent(xThis);
+
+ m_lListener.disposeAndClear (aEvent);
+
+ if (m_pTabWin)
+ m_pTabWin->RemoveEventListener( LINK( this, TabWindowService, EventListener ) );
+
+ m_pTabWin = NULL;
+ m_xTabWin.clear();
+}
+
+//*****************************************************************************************************************
+// XComponent
+//*****************************************************************************************************************
+void SAL_CALL TabWindowService::addEventListener(const css::uno::Reference< css::lang::XEventListener >& xListener)
+ throw (css::uno::RuntimeException)
+{
+ m_lListener.addInterface(::getCppuType((const css::uno::Reference< css::lang::XEventListener >*)NULL), xListener);
+}
+
+//*****************************************************************************************************************
+// XComponent
+//*****************************************************************************************************************
+void SAL_CALL TabWindowService::removeEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener)
+ throw (css::uno::RuntimeException)
+{
+ m_lListener.removeInterface(::getCppuType((const css::uno::Reference< css::lang::XEventListener >*)NULL), xListener);
+}
+
+//*****************************************************************************************************************
+void TabWindowService::impl_initializePropInfo()
+{
+ impl_setPropertyChangeBroadcaster(static_cast< css::awt::XSimpleTabController* >(this));
+
+ impl_addPropertyInfo(
+ css::beans::Property(
+ TABWINDOWSERVICE_PROPNAME_WINDOW,
+ TABWINDOWSERVICE_PROPHANDLE_WINDOW,
+ ::getCppuType((const css::uno::Reference< css::awt::XWindow >*)NULL),
+ css::beans::PropertyAttribute::TRANSIENT));
+}
+
+//*****************************************************************************************************************
+void SAL_CALL TabWindowService::impl_setPropertyValue(const ::rtl::OUString& /*sProperty*/,
+ sal_Int32 /*nHandle */,
+ const css::uno::Any& /*aValue */)
+
+{
+}
+
+//*****************************************************************************************************************
+css::uno::Any SAL_CALL TabWindowService::impl_getPropertyValue(const ::rtl::OUString& /*sProperty*/,
+ sal_Int32 nHandle )
+{
+ /* There is no need to lock any mutex here. Because we share the
+ solar mutex with our base class. And we said to our base class: "dont release it on calling us" .-)
+ see ctor of PropertySetHelper for further informations.
+ */
+ css::uno::Any aValue;
+
+ switch (nHandle)
+ {
+ case TABWINDOWSERVICE_PROPHANDLE_WINDOW:
+ {
+ mem_TabWin (); // force "creation on demand" of m_xTabWin :-)
+ aValue <<= m_xTabWin;
+ }
+ break;
+ }
+
+ return aValue;
+}
+
+//*****************************************************************************************************************
+// TabWindowService
+//*****************************************************************************************************************
+IMPL_LINK( TabWindowService, EventListener, VclSimpleEvent*, pEvent )
+{
+
+ if ( !pEvent && !pEvent->ISA(VclWindowEvent))
+ return 0;
+
+ ULONG nEventId = pEvent->GetId();
+ VclWindowEvent* pWinEvt = static_cast< VclWindowEvent* >(pEvent);
+
+ css::uno::Reference< css::uno::XInterface > xThis ( static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY );
+ css::lang::EventObject aEvent( xThis );
+
+ if (nEventId == VCLEVENT_OBJECT_DYING)
+ {
+ m_lListener.disposeAndClear (aEvent);
+
+ m_pTabWin->RemoveEventListener( LINK( this, TabWindowService, EventListener ) );
+ m_pTabWin = NULL;
+ m_xTabWin.clear();
+
+ return 0;
+ }
+
+ ::cppu::OInterfaceContainerHelper* pContainer = m_lListener.getContainer(::getCppuType((const css::uno::Reference< css::awt::XTabListener >*) NULL));
+ if ( ! pContainer)
+ return 0;
+
+ ::cppu::OInterfaceIteratorHelper pIterator(*pContainer);
+ while (pIterator.hasMoreElements())
+ {
+ try
+ {
+ css::awt::XTabListener* pListener = (css::awt::XTabListener*)pIterator.next();
+
+ switch (nEventId)
+ {
+ case VCLEVENT_TABPAGE_ACTIVATE :
+ pListener->activated( (sal_Int32)(ULONG)pWinEvt->GetData() );
+ break;
+
+ case VCLEVENT_TABPAGE_DEACTIVATE :
+ pListener->deactivated( (sal_Int32)(ULONG)pWinEvt->GetData() );
+ break;
+
+ case VCLEVENT_TABPAGE_INSERTED :
+ pListener->inserted( (sal_Int32)(ULONG)pWinEvt->GetData() );
+ break;
+
+ case VCLEVENT_TABPAGE_REMOVED :
+ pListener->removed( (sal_Int32)(ULONG)pWinEvt->GetData() );
+ break;
+
+ case VCLEVENT_TABPAGE_PAGETEXTCHANGED :
+ case VCLEVENT_TABPAGE_REMOVEDALL :
+ break;
+ }
+ }
+ catch(const css::uno::RuntimeException&)
+ {
+ pIterator.remove();
+ }
+ }
+
+ return 0;
+}
+
+//*****************************************************************************************************************
+// TabWindowService
+//*****************************************************************************************************************
+void TabWindowService::impl_checkTabIndex (::sal_Int32 nID)
+ throw (css::lang::IndexOutOfBoundsException)
+{
+ if (
+ (nID <= 0 ) ||
+ (nID > m_nPageIndexCounter)
+ )
+ {
+ throw css::lang::IndexOutOfBoundsException(
+ ::rtl::OUString::createFromAscii("Tab index out of bounds."),
+ css::uno::Reference< css::uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY ));
+ }
+}
+
+//*****************************************************************************************************************
+// TabWindowService
+//*****************************************************************************************************************
+TTabPageInfoHash::iterator TabWindowService::impl_getTabPageInfo(::sal_Int32 nID)
+ throw (css::lang::IndexOutOfBoundsException)
+{
+ TTabPageInfoHash::iterator pIt = m_lTabPageInfos.find(nID);
+ if (pIt == m_lTabPageInfos.end ())
+ throw css::lang::IndexOutOfBoundsException(
+ ::rtl::OUString::createFromAscii("Tab index out of bounds."),
+ css::uno::Reference< css::uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY ));
+ return pIt;
+}
+
+//*****************************************************************************************************************
+// TabWindowService
+//*****************************************************************************************************************
+FwkTabWindow* TabWindowService::mem_TabWin ()
+{
+ FwkTabWindow* pWin = NULL;
+
+ if ( ! m_xTabWin.is ())
+ {
+ Window* pFakeParent = dynamic_cast< Window* >(Application::GetDefaultDevice ());
+
+ m_pTabWin = new FwkTabWindow (pFakeParent);
+ m_xTabWin = VCLUnoHelper::GetInterface (m_pTabWin);
+
+ m_pTabWin->AddEventListener( LINK( this, TabWindowService, EventListener ) );
+ }
+
+ if (m_xTabWin.is ())
+ pWin = m_pTabWin;
+
+ return pWin;
+}
+
+} // namespace framework