From b1314f22eb8de4359b5360194c04996351e9a6c2 Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Fri, 20 Sep 2013 15:23:25 +0100 Subject: cook up a scheme to allow windows to have per-module settings Change-Id: I5fa62c3c2af2ccbbc7e8a61e5537488515b2808c --- include/sfx2/childwin.hxx | 1 + include/unotools/moduleoptions.hxx | 2 ++ sfx2/source/appl/childwin.cxx | 34 +++++++++++++++++++++++--------- sfx2/source/appl/workwin.cxx | 31 +++++++++++++++++++++++++---- unotools/source/config/moduleoptions.cxx | 19 +++++++++--------- 5 files changed, 64 insertions(+), 23 deletions(-) diff --git a/include/sfx2/childwin.hxx b/include/sfx2/childwin.hxx index 236f4bd52582..3337e71654df 100644 --- a/include/sfx2/childwin.hxx +++ b/include/sfx2/childwin.hxx @@ -55,6 +55,7 @@ struct SfxChildWinInfo Size aSize; sal_uInt16 nFlags; OUString aExtraString; + OUString aModule; OString aWinState; SfxChildWinInfo() diff --git a/include/unotools/moduleoptions.hxx b/include/unotools/moduleoptions.hxx index 75b83b1c0988..7bcb57373c03 100644 --- a/include/unotools/moduleoptions.hxx +++ b/include/unotools/moduleoptions.hxx @@ -172,6 +172,8 @@ class UNOTOOLS_DLLPUBLIC SAL_WARN_UNUSED SvtModuleOptions : public utl::detail:: */ static EFactory ClassifyFactoryByModel(const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& xModel); + static OUString GetFactoryShortName(EFactory eFactory); + OUString GetDefaultModuleName(); sal_Bool IsMath () const; diff --git a/sfx2/source/appl/childwin.cxx b/sfx2/source/appl/childwin.cxx index e43205631e9a..be63e3c7f41e 100644 --- a/sfx2/source/appl/childwin.cxx +++ b/sfx2/source/appl/childwin.cxx @@ -17,13 +17,16 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ - +#include #include #include +#include #include +#include #include #include #include +#include #include #include @@ -288,7 +291,12 @@ void SfxChildWindow::SaveStatus(const SfxChildWinInfo& rInfo) aWinData.append(rInfo.aExtraString); } - SvtViewOptions aWinOpt( E_WINDOW, OUString::number( nID ) ); + OUString sName(OUString::number(nID)); + //Try and save window state per-module, e.g. sidebar on in one application + //but off in another + if (!rInfo.aModule.isEmpty()) + sName = rInfo.aModule + "/" + sName; + SvtViewOptions aWinOpt(E_WINDOW, sName); aWinOpt.SetWindowState(OStringToOUString(rInfo.aWinState, RTL_TEXTENCODING_UTF8)); ::com::sun::star::uno::Sequence < ::com::sun::star::beans::NamedValue > aSeq(1); @@ -313,7 +321,7 @@ SfxChildWinInfo SfxChildWindow::GetInfo() const { DBG_CHKTHIS(SfxChildWindow,0); - SfxChildWinInfo aInfo; + SfxChildWinInfo aInfo(pImp->pFact->aInfo); aInfo.aPos = pWindow->GetPosPixel(); aInfo.aSize = pWindow->GetSizePixel(); if ( pWindow->IsSystemWindow() ) @@ -347,22 +355,30 @@ sal_uInt16 SfxChildWindow::GetPosition() } //------------------------------------------------------------------------- -void SfxChildWindow::InitializeChildWinFactory_Impl( sal_uInt16 nId, SfxChildWinInfo& rInfo ) +void SfxChildWindow::InitializeChildWinFactory_Impl(sal_uInt16 nId, SfxChildWinInfo& rInfo) { // load configuration - SvtViewOptions aWinOpt( E_WINDOW, OUString::number( nId ) ); - if ( aWinOpt.Exists() && aWinOpt.HasVisible() ) - rInfo.bVisible = aWinOpt.IsVisible(); // set state from configuration. Can be overwritten by UserData, see below + boost::scoped_ptr xWinOpt; + // first see if a module specific id exists + if (rInfo.aModule.getLength()) + xWinOpt.reset(new SvtViewOptions(E_WINDOW, rInfo.aModule + "/" + OUString::number(nId))); + + // if not then try the generic id + if (!xWinOpt || !xWinOpt->Exists()) + xWinOpt.reset(new SvtViewOptions(E_WINDOW, OUString::number(nId))); + + if (xWinOpt->Exists() && xWinOpt->HasVisible() ) + rInfo.bVisible = xWinOpt->IsVisible(); // set state from configuration. Can be overwritten by UserData, see below - ::com::sun::star::uno::Sequence < ::com::sun::star::beans::NamedValue > aSeq = aWinOpt.GetUserData(); + ::com::sun::star::uno::Sequence < ::com::sun::star::beans::NamedValue > aSeq = xWinOpt->GetUserData(); OUString aTmp; if ( aSeq.getLength() ) aSeq[0].Value >>= aTmp; OUString aWinData( aTmp ); - rInfo.aWinState = OUStringToOString(aWinOpt.GetWindowState(), RTL_TEXTENCODING_UTF8); + rInfo.aWinState = OUStringToOString(xWinOpt->GetWindowState(), RTL_TEXTENCODING_UTF8); if ( !aWinData.isEmpty() ) diff --git a/sfx2/source/appl/workwin.cxx b/sfx2/source/appl/workwin.cxx index a4afda3f2978..4873dafd582b 100644 --- a/sfx2/source/appl/workwin.cxx +++ b/sfx2/source/appl/workwin.cxx @@ -18,7 +18,7 @@ */ #include - +#include #include #include @@ -46,10 +46,12 @@ #include #include #include +#include #include +#include +#include #include #include -#include #include #include #include @@ -2445,6 +2447,27 @@ void SfxWorkWindow::SaveStatus_Impl(SfxChildWindow *pChild, const SfxChildWinInf void SfxWorkWindow::InitializeChild_Impl(SfxChildWin_Impl *pCW) { + SfxDispatcher *pDisp = pBindings->GetDispatcher_Impl(); + SfxViewFrame *pFrame = pDisp ? pDisp->GetFrame() :0; + SfxModule *pMod = pFrame ? SfxModule::GetActiveModule(pFrame) :0; + + OUString sModule; + if (pFrame) + { + try + { + using namespace ::com::sun::star; + uno::Reference< frame::XModuleManager2 > xModuleManager( + frame::ModuleManager::create(::comphelper::getProcessComponentContext())); + sModule = xModuleManager->identify(pFrame->GetFrame().GetFrameInterface()); + SvtModuleOptions::EFactory eFac = SvtModuleOptions::ClassifyFactoryByServiceName(sModule); + sModule = SvtModuleOptions::GetFactoryShortName(eFac); + } + catch (...) + { + } + } + SfxChildWinFactory* pFact=0; SfxApplication *pApp = SFX_APP(); { @@ -2455,6 +2478,7 @@ void SfxWorkWindow::InitializeChild_Impl(SfxChildWin_Impl *pCW) if ( pFact->nId == pCW->nSaveId ) { pCW->aInfo = pFact->aInfo; + pCW->aInfo.aModule = sModule; SfxChildWindow::InitializeChildWinFactory_Impl( pCW->nSaveId, pCW->aInfo); pCW->bCreate = pCW->aInfo.bVisible; @@ -2471,8 +2495,6 @@ void SfxWorkWindow::InitializeChild_Impl(SfxChildWin_Impl *pCW) } } - SfxDispatcher *pDisp = pBindings->GetDispatcher_Impl(); - SfxModule *pMod = pDisp ? SfxModule::GetActiveModule( pDisp->GetFrame() ) :0; if ( pMod ) { SfxChildWinFactArr_Impl *pFactories = pMod->GetChildWinFactories_Impl(); @@ -2485,6 +2507,7 @@ void SfxWorkWindow::InitializeChild_Impl(SfxChildWin_Impl *pCW) if ( pFact->nId == pCW->nSaveId ) { pCW->aInfo = pFact->aInfo; + pCW->aInfo.aModule = sModule; SfxChildWindow::InitializeChildWinFactory_Impl( pCW->nSaveId, pCW->aInfo); pCW->bCreate = pCW->aInfo.bVisible; diff --git a/unotools/source/config/moduleoptions.cxx b/unotools/source/config/moduleoptions.cxx index 45ef57c90951..1745fcc124f4 100644 --- a/unotools/source/config/moduleoptions.cxx +++ b/unotools/source/config/moduleoptions.cxx @@ -321,7 +321,6 @@ class SvtModuleOptions_Impl : public ::utl::ConfigItem sal_Bool IsModuleInstalled ( SvtModuleOptions::EModule eModule ) const; ::com::sun::star::uno::Sequence < OUString > GetAllServiceNames(); OUString GetFactoryName ( SvtModuleOptions::EFactory eFactory ) const; - OUString GetFactoryShortName ( SvtModuleOptions::EFactory eFactory ) const; OUString GetFactoryStandardTemplate( SvtModuleOptions::EFactory eFactory ) const; OUString GetFactoryEmptyDocumentURL( SvtModuleOptions::EFactory eFactory ) const; OUString GetFactoryDefaultFilter ( SvtModuleOptions::EFactory eFactory ) const; @@ -602,7 +601,7 @@ OUString SvtModuleOptions_Impl::GetFactoryName( SvtModuleOptions::EFactory eFact } //***************************************************************************************************************** -OUString SvtModuleOptions_Impl::GetFactoryShortName( SvtModuleOptions::EFactory eFactory ) const +OUString SvtModuleOptions::GetFactoryShortName(SvtModuleOptions::EFactory eFactory) { // Attention: Hard configured yet ... because it's not fine to make changes possible by xml file yet. // But it's good to plan further possibilities! @@ -1357,21 +1356,21 @@ OUString SvtModuleOptions::GetDefaultModuleName() { OUString aModule; if (m_pDataContainer->IsModuleInstalled(SvtModuleOptions::E_SWRITER)) - aModule = m_pDataContainer->GetFactoryShortName(SvtModuleOptions::E_WRITER); + aModule = GetFactoryShortName(SvtModuleOptions::E_WRITER); else if (m_pDataContainer->IsModuleInstalled(SvtModuleOptions::E_SCALC)) - aModule = m_pDataContainer->GetFactoryShortName(SvtModuleOptions::E_CALC); + aModule = GetFactoryShortName(SvtModuleOptions::E_CALC); else if (m_pDataContainer->IsModuleInstalled(SvtModuleOptions::E_SIMPRESS)) - aModule = m_pDataContainer->GetFactoryShortName(SvtModuleOptions::E_IMPRESS); + aModule = GetFactoryShortName(SvtModuleOptions::E_IMPRESS); else if (m_pDataContainer->IsModuleInstalled(SvtModuleOptions::E_SDATABASE)) - aModule = m_pDataContainer->GetFactoryShortName(SvtModuleOptions::E_DATABASE); + aModule = GetFactoryShortName(SvtModuleOptions::E_DATABASE); else if (m_pDataContainer->IsModuleInstalled(SvtModuleOptions::E_SDRAW)) - aModule = m_pDataContainer->GetFactoryShortName(SvtModuleOptions::E_DRAW); + aModule = GetFactoryShortName(SvtModuleOptions::E_DRAW); else if (m_pDataContainer->IsModuleInstalled(SvtModuleOptions::E_SWEB)) - aModule = m_pDataContainer->GetFactoryShortName(SvtModuleOptions::E_WRITERWEB); + aModule = GetFactoryShortName(SvtModuleOptions::E_WRITERWEB); else if (m_pDataContainer->IsModuleInstalled(SvtModuleOptions::E_SGLOBAL)) - aModule = m_pDataContainer->GetFactoryShortName(SvtModuleOptions::E_WRITERGLOBAL); + aModule = GetFactoryShortName(SvtModuleOptions::E_WRITERGLOBAL); else if (m_pDataContainer->IsModuleInstalled(SvtModuleOptions::E_SMATH)) - aModule = m_pDataContainer->GetFactoryShortName(SvtModuleOptions::E_MATH); + aModule = GetFactoryShortName(SvtModuleOptions::E_MATH); return aModule; } -- cgit