summaryrefslogtreecommitdiff
path: root/framework/source
diff options
context:
space:
mode:
authorKurt Zenker <kz@openoffice.org>2008-04-04 13:11:30 +0000
committerKurt Zenker <kz@openoffice.org>2008-04-04 13:11:30 +0000
commitea22629abd56527f5369cda891a44ba8e55e21e0 (patch)
tree1afa77424268cc6add1e5cdb8148ee73560b2ffa /framework/source
parent6b70e0f44e1ac3e6d98a33cdfab468f185b7c14f (diff)
INTEGRATION: CWS titles02 (1.1.2); FILE ADDED
2008/04/02 09:57:56 as 1.1.2.8: support PRODUCTEXTENSION inside title 2008/04/01 08:41:45 as 1.1.2.7: make title-number-release explicit (weak references are not updated always) 2008/03/14 09:46:48 as 1.1.2.6: #116375# handle HTTP URLs better 2008/03/13 10:46:27 oj 1.1.2.5: #i45909# #i45617# #i71469# show the number only when > 1 2008/02/29 08:25:09 as 1.1.2.4: better title algorithm differ between file and other URLs 2007/12/10 14:35:18 as 1.1.2.3: #116375# use UI encoding for generating title from URL 2007/10/17 08:10:02 as 1.1.2.2: #116375# improve title generation; make autorecovery working (related to titles) 2007/10/12 12:59:14 as 1.1.2.1: #116375# new helper for updating title bar and building title values for different components
Diffstat (limited to 'framework/source')
-rw-r--r--framework/source/helper/titlehelper.cxx757
1 files changed, 757 insertions, 0 deletions
diff --git a/framework/source/helper/titlehelper.cxx b/framework/source/helper/titlehelper.cxx
new file mode 100644
index 000000000000..542d49cb6166
--- /dev/null
+++ b/framework/source/helper/titlehelper.cxx
@@ -0,0 +1,757 @@
+/*************************************************************************
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: titlehelper.cxx,v $
+ *
+ * $Revision: 1.2 $
+ *
+ * last change: $Author: kz $ $Date: 2008-04-04 14:11:30 $
+ *
+ * The Contents of this file are made available subject to
+ * the terms of GNU Lesser General Public License Version 2.1.
+ *
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2005 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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 for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_framework.hxx"
+
+//_______________________________________________
+// includes
+
+#include <helper/titlehelper.hxx>
+#include <services.h>
+#include <properties.h>
+
+#include <com/sun/star/frame/UntitledNumbersConst.hpp>
+#include <com/sun/star/frame/XStorable.hpp>
+#include <com/sun/star/frame/XModuleManager.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/document/XEventBroadcaster.hpp>
+#include <com/sun/star/beans/XMaterialHolder.hpp>
+
+#include <unotools/configmgr.hxx>
+#include <unotools/bootstrap.hxx>
+#include <comphelper/sequenceashashmap.hxx>
+#include <rtl/ustrbuf.hxx>
+#include <osl/mutex.hxx>
+#include <tools/urlobj.hxx>
+
+//_______________________________________________
+// namespace
+
+namespace framework{
+
+namespace css = ::com::sun::star;
+
+//_______________________________________________
+// definitions
+
+static const ::rtl::OUString ERRMSG_INVALID_COMPONENT_PARAM = ::rtl::OUString::createFromAscii("NULL as component reference not allowed.");
+static const ::rtl::OUString ERRMSG_INVALID_NUMBER_PARAM = ::rtl::OUString::createFromAscii("Special valkud INVALID_NUMBER not allowed as input parameter.");
+
+//-----------------------------------------------
+TitleHelper::TitleHelper(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR)
+ : ::cppu::BaseMutex ()
+ , m_xSMGR (xSMGR)
+ , m_xOwner ()
+ , m_xUntitledNumbers()
+ , m_xSubTitle ()
+ , m_bExternalTitle (sal_False)
+ , m_sTitle ()
+ , m_nLeasedNumber (css::frame::UntitledNumbersConst::INVALID_NUMBER)
+ , m_aListener (m_aMutex)
+{
+}
+
+//-----------------------------------------------
+TitleHelper::~TitleHelper()
+{
+}
+
+//-----------------------------------------------
+void TitleHelper::setOwner(const css::uno::Reference< css::uno::XInterface >& xOwner)
+{
+ // SYNCHRONIZED ->
+ ::osl::ResettableMutexGuard aLock(m_aMutex);
+
+ m_xOwner = xOwner;
+
+ aLock.clear ();
+ // <- SYNCHRONIZED
+
+ css::uno::Reference< css::frame::XModel > xModel(xOwner, css::uno::UNO_QUERY);
+ if (xModel.is ())
+ {
+ impl_startListeningForModel (xModel);
+ return;
+ }
+
+ css::uno::Reference< css::frame::XController > xController(xOwner, css::uno::UNO_QUERY);
+ if (xController.is ())
+ {
+ impl_startListeningForController (xController);
+ return;
+ }
+
+ css::uno::Reference< css::frame::XFrame > xFrame(xOwner, css::uno::UNO_QUERY);
+ if (xFrame.is ())
+ {
+ impl_startListeningForFrame (xFrame);
+ return;
+ }
+}
+
+//-----------------------------------------------
+::rtl::OUString SAL_CALL TitleHelper::getTitle()
+ throw (css::uno::RuntimeException)
+{
+ // SYNCHRONIZED ->
+ ::osl::ResettableMutexGuard aLock(m_aMutex);
+
+ // An external title will win always and disable all internal logic about
+ // creating/using a title value.
+ // Even an empty string will be accepted as valid title !
+ if (m_bExternalTitle)
+ return m_sTitle;
+
+ // Title seams to be up-to-date. Return it directly.
+ if (m_sTitle.getLength() > 0)
+ return m_sTitle;
+
+ // Title seams to be unused till now ... do bootstraping
+ impl_updateTitle ();
+
+ return m_sTitle;
+
+ // <- SYNCHRONIZED
+}
+
+//-----------------------------------------------
+void TitleHelper::connectWithUntitledNumbers (const css::uno::Reference< css::frame::XUntitledNumbers >& xNumbers)
+{
+ // SYNCHRONIZED ->
+ ::osl::ResettableMutexGuard aLock(m_aMutex);
+
+ m_xUntitledNumbers = xNumbers;
+
+ // <- SYNCHRONIZED
+}
+
+//-----------------------------------------------
+void SAL_CALL TitleHelper::setTitle(const ::rtl::OUString& sTitle)
+ throw (css::uno::RuntimeException)
+{
+ // SYNCHRONIZED ->
+ ::osl::ResettableMutexGuard aLock(m_aMutex);
+
+ m_bExternalTitle = sal_True;
+ m_sTitle = sTitle;
+
+ aLock.clear ();
+ // <- SYNCHRONIZED
+
+ impl_sendTitleChangedEvent ();
+}
+
+//-----------------------------------------------
+void SAL_CALL TitleHelper::addTitleChangeListener(const css::uno::Reference< css::frame::XTitleChangeListener >& xListener)
+ throw (css::uno::RuntimeException)
+{
+ // container is threadsafe by himself
+ m_aListener.addInterface( ::getCppuType( (const css::uno::Reference< css::frame::XTitleChangeListener >*)NULL ), xListener );
+}
+
+//-----------------------------------------------
+void SAL_CALL TitleHelper::removeTitleChangeListener(const css::uno::Reference< css::frame::XTitleChangeListener >& xListener)
+ throw (css::uno::RuntimeException)
+{
+ // container is threadsafe by himself
+ m_aListener.removeInterface( ::getCppuType( (const css::uno::Reference< css::frame::XTitleChangeListener >*)NULL ), xListener );
+}
+
+//-----------------------------------------------
+void SAL_CALL TitleHelper::titleChanged(const css::frame::TitleChangedEvent& aEvent)
+ throw (css::uno::RuntimeException)
+{
+ // SYNCHRONIZED ->
+ ::osl::ResettableMutexGuard aLock(m_aMutex);
+
+ css::uno::Reference< css::frame::XTitle > xSubTitle(m_xSubTitle.get (), css::uno::UNO_QUERY);
+
+ aLock.clear ();
+ // <- SYNCHRONIZED
+
+ if (aEvent.Source != xSubTitle)
+ return;
+
+ impl_updateTitle ();
+}
+
+//-----------------------------------------------
+void SAL_CALL TitleHelper::notifyEvent(const css::document::EventObject& aEvent)
+ throw (css::uno::RuntimeException)
+{
+ if ( ! aEvent.EventName.equalsIgnoreAsciiCaseAscii ("OnSaveAsDone"))
+ return;
+
+ // SYNCHRONIZED ->
+ ::osl::ResettableMutexGuard aLock(m_aMutex);
+
+ css::uno::Reference< css::frame::XModel > xOwner(m_xOwner.get (), css::uno::UNO_QUERY);
+
+ aLock.clear ();
+ // <- SYNCHRONIZED
+
+ if (aEvent.Source != xOwner)
+ return;
+
+ impl_updateTitle ();
+}
+
+//-----------------------------------------------
+void SAL_CALL TitleHelper::frameAction(const css::frame::FrameActionEvent& aEvent)
+ throw(css::uno::RuntimeException)
+{
+ // SYNCHRONIZED ->
+ ::osl::ResettableMutexGuard aLock(m_aMutex);
+
+ css::uno::Reference< css::frame::XFrame > xOwner(m_xOwner.get (), css::uno::UNO_QUERY);
+
+ aLock.clear ();
+ // <- SYNCHRONIZED
+
+ if (aEvent.Source != xOwner)
+ return;
+
+ // we are interested on events only, which must trigger a title bar update
+ // because component was changed.
+ if (
+ (aEvent.Action == css::frame::FrameAction_COMPONENT_ATTACHED ) ||
+ (aEvent.Action == css::frame::FrameAction_COMPONENT_REATTACHED) ||
+ (aEvent.Action == css::frame::FrameAction_COMPONENT_DETACHING )
+ )
+ {
+ impl_updateListeningForFrame (xOwner);
+ impl_updateTitle ();
+ }
+}
+
+//-----------------------------------------------
+void SAL_CALL TitleHelper::disposing(const css::lang::EventObject& aEvent)
+ throw (css::uno::RuntimeException)
+{
+ // SYNCHRONIZED ->
+ ::osl::ResettableMutexGuard aLock(m_aMutex);
+ css::uno::Reference< css::uno::XInterface > xOwner (m_xOwner.get() , css::uno::UNO_QUERY);
+ css::uno::Reference< css::frame::XUntitledNumbers > xNumbers (m_xUntitledNumbers.get(), css::uno::UNO_QUERY);
+ ::sal_Int32 nLeasedNumber = m_nLeasedNumber;
+ aLock.clear ();
+ // <- SYNCHRONIZED
+
+ if ( ! xOwner.is ())
+ return;
+
+ if (xOwner != aEvent.Source)
+ return;
+
+ if (
+ (xNumbers.is () ) &&
+ (nLeasedNumber != css::frame::UntitledNumbersConst::INVALID_NUMBER)
+ )
+ xNumbers->releaseNumber (nLeasedNumber);
+
+ // SYNCHRONIZED ->
+ aLock.reset ();
+
+ m_sTitle = ::rtl::OUString ();
+ m_nLeasedNumber = css::frame::UntitledNumbersConst::INVALID_NUMBER;
+
+ aLock.clear ();
+ // <- SYNCHRONIZED
+
+ impl_sendTitleChangedEvent ();
+}
+
+//-----------------------------------------------
+void TitleHelper::impl_sendTitleChangedEvent ()
+{
+ // SYNCHRONIZED ->
+ ::osl::ResettableMutexGuard aLock(m_aMutex);
+
+ css::frame::TitleChangedEvent aEvent(m_xOwner.get (), m_sTitle);
+
+ aLock.clear ();
+ // <- SYNCHRONIZED
+
+ ::cppu::OInterfaceContainerHelper* pContainer = m_aListener.getContainer( ::getCppuType( ( const css::uno::Reference< css::frame::XTitleChangeListener >*) NULL ) );
+ if ( ! pContainer)
+ return;
+
+ ::cppu::OInterfaceIteratorHelper pIt( *pContainer );
+ while ( pIt.hasMoreElements() )
+ {
+ try
+ {
+ ((css::frame::XTitleChangeListener*)pIt.next())->titleChanged( aEvent );
+ }
+ catch(const css::uno::Exception&)
+ {
+ pIt.remove();
+ }
+ }
+}
+
+//-----------------------------------------------
+void TitleHelper::impl_updateTitle ()
+{
+ // SYNCHRONIZED ->
+ ::osl::ResettableMutexGuard aLock(m_aMutex);
+
+ css::uno::Reference< css::frame::XModel > xModel (m_xOwner.get(), css::uno::UNO_QUERY);
+ css::uno::Reference< css::frame::XController > xController(m_xOwner.get(), css::uno::UNO_QUERY);
+ css::uno::Reference< css::frame::XFrame > xFrame (m_xOwner.get(), css::uno::UNO_QUERY);
+
+ aLock.clear ();
+ // <- SYNCHRONIZED
+
+ if (xModel.is ())
+ {
+ impl_updateTitleForModel (xModel);
+ return;
+ }
+
+ if (xController.is ())
+ {
+ impl_updateTitleForController (xController);
+ return;
+ }
+
+ if (xFrame.is ())
+ {
+ impl_updateTitleForFrame (xFrame);
+ return;
+ }
+}
+
+//-----------------------------------------------
+void TitleHelper::impl_updateTitleForModel (const css::uno::Reference< css::frame::XModel >& xModel)
+{
+ // SYNCHRONIZED ->
+ ::osl::ResettableMutexGuard aLock(m_aMutex);
+
+ // external title wont be updated internaly !
+ // It has to be set from outside new.
+ if (m_bExternalTitle)
+ return;
+
+ css::uno::Reference< css::uno::XInterface > xOwner (m_xOwner.get() , css::uno::UNO_QUERY);
+ css::uno::Reference< css::frame::XUntitledNumbers > xNumbers (m_xUntitledNumbers.get(), css::uno::UNO_QUERY);
+ ::sal_Int32 nLeasedNumber = m_nLeasedNumber;
+
+ aLock.clear ();
+ // <- SYNCHRONIZED
+
+ if (
+ ( ! xOwner.is ()) ||
+ ( ! xNumbers.is ()) ||
+ ( ! xModel.is ())
+ )
+ return;
+
+ ::rtl::OUString sTitle;
+ ::rtl::OUString sURL ;
+
+ css::uno::Reference< css::frame::XStorable > xURLProvider(xModel , css::uno::UNO_QUERY);
+ if (xURLProvider.is())
+ sURL = xURLProvider->getLocation ();
+
+ if (sURL.getLength () > 0)
+ {
+ sTitle = impl_convertURL2Title(sURL);
+ if (nLeasedNumber != css::frame::UntitledNumbersConst::INVALID_NUMBER)
+ xNumbers->releaseNumber (nLeasedNumber);
+ nLeasedNumber = css::frame::UntitledNumbersConst::INVALID_NUMBER;
+ }
+ else
+ {
+ if (nLeasedNumber == css::frame::UntitledNumbersConst::INVALID_NUMBER)
+ nLeasedNumber = xNumbers->leaseNumber (xOwner);
+
+ ::rtl::OUStringBuffer sNewTitle(256);
+ sNewTitle.append (xNumbers->getUntitledPrefix ());
+ if (nLeasedNumber != css::frame::UntitledNumbersConst::INVALID_NUMBER)
+ sNewTitle.append ((::sal_Int32)nLeasedNumber);
+ else
+ sNewTitle.appendAscii ("?");
+
+ sTitle = sNewTitle.makeStringAndClear ();
+ }
+
+ // SYNCHRONIZED ->
+ aLock.reset ();
+
+ sal_Bool bChanged = (! m_sTitle.equals(sTitle));
+ m_sTitle = sTitle;
+ m_nLeasedNumber = nLeasedNumber;
+
+ aLock.clear ();
+ // <- SYNCHRONIZED
+
+ if (bChanged)
+ impl_sendTitleChangedEvent ();
+}
+
+//-----------------------------------------------
+void TitleHelper::impl_updateTitleForController (const css::uno::Reference< css::frame::XController >& xController)
+{
+ // SYNCHRONIZED ->
+ ::osl::ResettableMutexGuard aLock(m_aMutex);
+
+ // external title wont be updated internaly !
+ // It has to be set from outside new.
+ if (m_bExternalTitle)
+ return;
+
+ css::uno::Reference< css::uno::XInterface > xOwner (m_xOwner.get() , css::uno::UNO_QUERY);
+ css::uno::Reference< css::frame::XUntitledNumbers > xNumbers (m_xUntitledNumbers.get(), css::uno::UNO_QUERY);
+ ::sal_Int32 nLeasedNumber = m_nLeasedNumber;
+
+ aLock.clear ();
+ // <- SYNCHRONIZED
+
+ if (
+ ( ! xOwner.is ()) ||
+ ( ! xNumbers.is ()) ||
+ ( ! xController.is ())
+ )
+ return;
+
+ ::rtl::OUStringBuffer sTitle(256);
+
+ if (nLeasedNumber == css::frame::UntitledNumbersConst::INVALID_NUMBER)
+ nLeasedNumber = xNumbers->leaseNumber (xOwner);
+
+ css::uno::Reference< css::frame::XTitle > xModelTitle(xController->getModel (), css::uno::UNO_QUERY);
+ if (xModelTitle.is ())
+ {
+ sTitle.append (xModelTitle->getTitle ());
+ if ( nLeasedNumber > 1 )
+ {
+ sTitle.appendAscii (" : ");
+ sTitle.append ((::sal_Int32)nLeasedNumber);
+ }
+ }
+ else
+ {
+ sTitle.append (xNumbers->getUntitledPrefix ());
+ if ( nLeasedNumber > 1 )
+ {
+ sTitle.append ((::sal_Int32)nLeasedNumber );
+ }
+ }
+
+ // SYNCHRONIZED ->
+ aLock.reset ();
+
+ ::rtl::OUString sNewTitle = sTitle.makeStringAndClear ();
+ sal_Bool bChanged = (! m_sTitle.equals(sNewTitle));
+ m_sTitle = sNewTitle;
+ m_nLeasedNumber = nLeasedNumber;
+
+ aLock.clear ();
+ // <- SYNCHRONIZED
+
+ if (bChanged)
+ impl_sendTitleChangedEvent ();
+}
+
+//-----------------------------------------------
+void TitleHelper::impl_updateTitleForFrame (const css::uno::Reference< css::frame::XFrame >& xFrame)
+{
+ if ( ! xFrame.is ())
+ return;
+
+ // SYNCHRONIZED ->
+ ::osl::ResettableMutexGuard aLock(m_aMutex);
+
+ // external title wont be updated internaly !
+ // It has to be set from outside new.
+ if (m_bExternalTitle)
+ return;
+
+ aLock.clear ();
+ // <- SYNCHRONIZED
+
+ css::uno::Reference< css::uno::XInterface > xComponent;
+ xComponent = xFrame->getController ();
+ if ( ! xComponent.is ())
+ xComponent = xFrame->getComponentWindow ();
+
+ ::rtl::OUStringBuffer sTitle (256);
+
+ impl_appendComponentTitle (sTitle, xComponent);
+ impl_appendProductName (sTitle);
+ impl_appendModuleName (sTitle);
+ impl_appendProductExtension (sTitle);
+ impl_appendEvalVersion (sTitle);
+ impl_appendDebugVersion (sTitle);
+
+ // SYNCHRONIZED ->
+ aLock.reset ();
+
+ ::rtl::OUString sNewTitle = sTitle.makeStringAndClear ();
+ sal_Bool bChanged = (! m_sTitle.equals(sNewTitle));
+ m_sTitle = sNewTitle;
+
+ aLock.clear ();
+ // <- SYNCHRONIZED
+
+ if (bChanged)
+ impl_sendTitleChangedEvent ();
+}
+
+//*****************************************************************************************************************
+void TitleHelper::impl_appendComponentTitle ( ::rtl::OUStringBuffer& sTitle ,
+ const css::uno::Reference< css::uno::XInterface >& xComponent)
+{
+ css::uno::Reference< css::frame::XTitle > xTitle(xComponent, css::uno::UNO_QUERY);
+
+ // Note: Title has to be used (even if it's empty) if the right interface is supported.
+ if (xTitle.is ())
+ sTitle.append (xTitle->getTitle ());
+}
+
+//*****************************************************************************************************************
+void TitleHelper::impl_appendProductName (::rtl::OUStringBuffer& sTitle)
+{
+ ::rtl::OUString sProductName;
+ ::utl::ConfigManager::GetDirectConfigProperty(::utl::ConfigManager::PRODUCTNAME) >>= sProductName;
+
+ if (sProductName.getLength ())
+ {
+ if (sTitle.getLength() > 0)
+ sTitle.appendAscii (" - ");
+
+ sTitle.append (sProductName);
+ }
+}
+
+//*****************************************************************************************************************
+void TitleHelper::impl_appendProductExtension (::rtl::OUStringBuffer& sTitle)
+{
+ ::rtl::OUString sProductExtension;
+ ::utl::ConfigManager::GetDirectConfigProperty(::utl::ConfigManager::PRODUCTEXTENSION) >>= sProductExtension;
+
+ if (sProductExtension.getLength ())
+ {
+ sTitle.appendAscii (" ");
+ sTitle.append (sProductExtension);
+ }
+}
+
+//*****************************************************************************************************************
+void TitleHelper::impl_appendModuleName (::rtl::OUStringBuffer& sTitle)
+{
+ // SYNCHRONIZED ->
+ ::osl::ResettableMutexGuard aLock(m_aMutex);
+
+ css::uno::Reference< css::uno::XInterface > xOwner = m_xOwner.get();
+ css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = m_xSMGR;
+
+ aLock.clear ();
+ // <- SYNCHRONIZED
+
+ try
+ {
+ css::uno::Reference< css::frame::XModuleManager > xModuleManager(
+ xSMGR->createInstance(SERVICENAME_MODULEMANAGER),
+ css::uno::UNO_QUERY_THROW);
+
+ css::uno::Reference< css::container::XNameAccess > xConfig(
+ xModuleManager,
+ css::uno::UNO_QUERY_THROW);
+
+ const ::rtl::OUString sID = xModuleManager->identify(xOwner);
+ ::comphelper::SequenceAsHashMap lProps = xConfig->getByName (sID);
+ const ::rtl::OUString sUIName = lProps.getUnpackedValueOrDefault (OFFICEFACTORY_PROPNAME_UINAME, ::rtl::OUString());
+
+ // An UIname property is an optional value !
+ // So please add it to the title in case it does realy exists only.
+ if (sUIName.getLength() > 0)
+ {
+ sTitle.appendAscii (" " );
+ sTitle.append (sUIName);
+ }
+ }
+ catch(const css::uno::Exception&)
+ {}
+}
+
+//*****************************************************************************************************************
+#ifndef PRODUCT
+void TitleHelper::impl_appendDebugVersion (::rtl::OUStringBuffer& sTitle)
+{
+ ::rtl::OUString sDefault ;
+ ::rtl::OUString sVersion = ::utl::Bootstrap::getBuildIdData( sDefault );
+
+ sTitle.appendAscii (" [" );
+ sTitle.append (sVersion);
+ sTitle.appendAscii ("]" );
+}
+#else
+void TitleHelper::impl_appendDebugVersion (::rtl::OUStringBuffer&)
+{
+}
+#endif
+
+//*****************************************************************************************************************
+void TitleHelper::impl_appendEvalVersion (::rtl::OUStringBuffer& sTitle)
+{
+ // SYNCHRONIZED ->
+ ::osl::ResettableMutexGuard aLock(m_aMutex);
+ css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = m_xSMGR ;
+ aLock.clear ();
+ // <- SYNCHRONIZED
+
+ css::uno::Reference< css::beans::XMaterialHolder > xHolder(
+ xSMGR->createInstance(SERVICENAME_TABREG),
+ css::uno::UNO_QUERY);
+
+ if ( ! xHolder.is())
+ return;
+
+ ::comphelper::SequenceAsHashMap aMaterial(xHolder->getMaterial());
+ const ::rtl::OUString sEvalTitle = aMaterial.getUnpackedValueOrDefault(TABREG_PROPNAME_TITLE, ::rtl::OUString());
+
+ if (sEvalTitle.getLength())
+ {
+ sTitle.appendAscii (" " );
+ sTitle.append (sEvalTitle);
+ }
+}
+
+//-----------------------------------------------
+void TitleHelper::impl_startListeningForModel (const css::uno::Reference< css::frame::XModel >& xModel)
+{
+ css::uno::Reference< css::document::XEventBroadcaster > xBroadcaster(xModel, css::uno::UNO_QUERY);
+ if ( ! xBroadcaster.is ())
+ return;
+
+ xBroadcaster->addEventListener (static_cast< css::document::XEventListener* >(this));
+}
+
+//-----------------------------------------------
+void TitleHelper::impl_startListeningForController (const css::uno::Reference< css::frame::XController >& xController)
+{
+ css::uno::Reference< css::frame::XTitle > xSubTitle(xController->getModel (), css::uno::UNO_QUERY);
+ impl_setSubTitle (xSubTitle);
+}
+
+//-----------------------------------------------
+void TitleHelper::impl_startListeningForFrame (const css::uno::Reference< css::frame::XFrame >& xFrame)
+{
+ xFrame->addFrameActionListener(this );
+ impl_updateListeningForFrame (xFrame);
+}
+
+//-----------------------------------------------
+void TitleHelper::impl_updateListeningForFrame (const css::uno::Reference< css::frame::XFrame >& xFrame)
+{
+ css::uno::Reference< css::frame::XTitle > xSubTitle(xFrame->getController (), css::uno::UNO_QUERY);
+ impl_setSubTitle (xSubTitle);
+}
+
+//-----------------------------------------------
+void TitleHelper::impl_setSubTitle (const css::uno::Reference< css::frame::XTitle >& xSubTitle)
+{
+ // SYNCHRONIZED ->
+ ::osl::ResettableMutexGuard aLock(m_aMutex);
+
+ // ignore duplicate calls. Makes outside using of this helper more easy :-)
+ css::uno::Reference< css::frame::XTitle > xOldSubTitle(m_xSubTitle.get(), css::uno::UNO_QUERY);
+ if (xOldSubTitle == xSubTitle)
+ return;
+
+ m_xSubTitle = xSubTitle;
+
+ aLock.clear ();
+ // <- SYNCHRONIZED
+
+ css::uno::Reference< css::frame::XTitleChangeBroadcaster > xOldBroadcaster(xOldSubTitle , css::uno::UNO_QUERY );
+ css::uno::Reference< css::frame::XTitleChangeBroadcaster > xNewBroadcaster(xSubTitle , css::uno::UNO_QUERY );
+ css::uno::Reference< css::frame::XTitleChangeListener > xThis (static_cast< css::frame::XTitleChangeListener* >(this), css::uno::UNO_QUERY_THROW);
+
+ if (xOldBroadcaster.is())
+ xOldBroadcaster->removeTitleChangeListener (xThis);
+
+ if (xNewBroadcaster.is())
+ xNewBroadcaster->addTitleChangeListener (xThis);
+}
+
+//-----------------------------------------------
+::rtl::OUString TitleHelper::impl_getSubTitle ()
+{
+ // SYNCHRONIZED ->
+ ::osl::ResettableMutexGuard aLock(m_aMutex);
+
+ css::uno::Reference< css::frame::XTitle > xSubTitle(m_xSubTitle.get (), css::uno::UNO_QUERY);
+
+ aLock.clear ();
+ // <- SYNCHRONIZED
+
+ if (xSubTitle.is ())
+ return xSubTitle->getTitle ();
+
+ return ::rtl::OUString ();
+}
+
+//-----------------------------------------------
+::rtl::OUString TitleHelper::impl_convertURL2Title(const ::rtl::OUString& sURL)
+{
+ INetURLObject aURL (sURL);
+ ::rtl::OUString sTitle;
+
+ if (aURL.GetProtocol() == INET_PROT_FILE)
+ {
+ if (aURL.HasMark())
+ aURL = INetURLObject(aURL.GetURLNoMark());
+
+ sTitle = aURL.getName(INetURLObject::LAST_SEGMENT, sal_True, INetURLObject::DECODE_WITH_CHARSET);
+ }
+ else
+ {
+ if (aURL.hasExtension(INetURLObject::LAST_SEGMENT))
+ sTitle = aURL.getName(INetURLObject::LAST_SEGMENT, sal_True, INetURLObject::DECODE_WITH_CHARSET);
+
+ if ( ! sTitle.getLength() )
+ sTitle = aURL.GetHostPort(INetURLObject::DECODE_WITH_CHARSET);
+
+ if ( ! sTitle.getLength() )
+ sTitle = aURL.GetURLNoPass(INetURLObject::DECODE_WITH_CHARSET);
+ }
+
+ return sTitle;
+}
+
+} // namespace framework