diff options
author | Kurt Zenker <kz@openoffice.org> | 2008-04-04 13:11:30 +0000 |
---|---|---|
committer | Kurt Zenker <kz@openoffice.org> | 2008-04-04 13:11:30 +0000 |
commit | ea22629abd56527f5369cda891a44ba8e55e21e0 (patch) | |
tree | 1afa77424268cc6add1e5cdb8148ee73560b2ffa /framework | |
parent | 6b70e0f44e1ac3e6d98a33cdfab468f185b7c14f (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')
-rw-r--r-- | framework/source/helper/titlehelper.cxx | 757 |
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 |