diff options
author | Oliver-Rainer Wittmann <orw@apache.org> | 2013-04-10 08:20:16 +0000 |
---|---|---|
committer | Michael Meeks <michael.meeks@suse.com> | 2013-05-20 11:33:10 +0100 |
commit | d02f75a8c36705924ddd6a5921fe3012fafce812 (patch) | |
tree | 40da9f25714a77f5e9e17ef7bee81c33a1a11b4b /sfx2/source/sidebar/ResourceManager.cxx | |
parent | d8d55787b81cdc955b73c8befa4ab608f46e32aa (diff) |
Resolves: #i121420# merge sidebar feature
(cherry picked from commit 0a0a9b32aa5bf1ce2554ad37cbba3c7a105db2b5)
Conflicts:
chart2/source/controller/dialogs/dlg_View3D.cxx
chart2/source/controller/dialogs/tp_3D_SceneIllumination.cxx
chart2/source/controller/dialogs/tp_3D_SceneIllumination.hxx
chart2/source/controller/drawinglayer/ViewElementListProvider.cxx
chart2/source/controller/inc/ViewElementListProvider.hxx
chart2/source/controller/inc/dlg_View3D.hxx
chart2/source/controller/main/ShapeController.cxx
chart2/source/inc/chartview/DrawModelWrapper.hxx
chart2/source/view/main/DrawModelWrapper.cxx
cui/source/inc/border.hxx
cui/source/inc/cuitabarea.hxx
cui/source/inc/cuitabline.hxx
cui/source/inc/sdrcelldlg.hxx
cui/source/inc/treeopt.hxx
cui/source/options/optchart.cxx
cui/source/options/optchart.hxx
cui/source/options/optcolor.cxx
cui/source/options/treeopt.cxx
cui/source/tabpages/backgrnd.cxx
cui/source/tabpages/border.cxx
cui/source/tabpages/chardlg.cxx
cui/source/tabpages/numpages.cxx
cui/source/tabpages/tpcolor.cxx
cui/source/tabpages/tplneend.cxx
editeng/inc/editeng/outliner.hxx
extensions/source/propctrlr/standardcontrol.cxx
framework/source/register/registerservices.cxx
offapi/com/sun/star/ui/makefile.mk
officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu
officecfg/registry/data/org/openoffice/Office/UI/makefile.mk
officecfg/registry/schema/org/openoffice/Office/UI/makefile.mk
postprocess/packregistry/makefile.mk
reportdesign/source/ui/dlg/Condition.cxx
reportdesign/source/ui/misc/UITools.cxx
sc/inc/document.hxx
sc/inc/helpids.h
sc/inc/sc.hrc
sc/prj/build.lst
sc/sdi/scalc.sdi
sc/source/core/data/documen9.cxx
sc/source/core/data/drwlayer.cxx
sc/source/ui/app/scdll.cxx
sc/source/ui/app/typemap.cxx
sc/source/ui/dbgui/scendlg.cxx
sc/source/ui/docshell/docsh2.cxx
sc/source/ui/docshell/docsh4.cxx
sc/source/ui/drawfunc/chartsh.cxx
sc/source/ui/drawfunc/drawsh.cxx
sc/source/ui/drawfunc/drawsh2.cxx
sc/source/ui/drawfunc/drawsh4.cxx
sc/source/ui/drawfunc/drformsh.cxx
sc/source/ui/drawfunc/drtxtob.cxx
sc/source/ui/drawfunc/drtxtob1.cxx
sc/source/ui/drawfunc/drtxtob2.cxx
sc/source/ui/drawfunc/graphsh.cxx
sc/source/ui/drawfunc/oleobjsh.cxx
sc/source/ui/inc/chartsh.hxx
sc/source/ui/inc/formatsh.hxx
sc/source/ui/miscdlgs/tabbgcolordlg.cxx
sc/source/ui/navipi/navipi.cxx
sc/source/ui/optdlg/opredlin.cxx
sc/source/ui/optdlg/tpview.cxx
sc/source/ui/sidebar/makefile.mk
sc/source/ui/view/auditsh.cxx
sc/source/ui/view/cellsh.cxx
sc/source/ui/view/editsh.cxx
sc/source/ui/view/formatsh.cxx
sc/source/ui/view/pivotsh.cxx
sc/source/ui/view/tabvwsh.cxx
sc/util/makefile.mk
sd/inc/sdabstdlg.hxx
sd/prj/build.lst
sd/sdi/ToolPanelViewShell.sdi
sd/sdi/makefile.mk
sd/source/ui/accessibility/makefile.mk
sd/source/ui/animations/CustomAnimationDialog.cxx
sd/source/ui/dlg/PaneChildWindows.cxx
sd/source/ui/dlg/PaneShells.cxx
sd/source/ui/dlg/copydlg.cxx
sd/source/ui/dlg/navigatr.cxx
sd/source/ui/dlg/sddlgfact.cxx
sd/source/ui/dlg/sddlgfact.hxx
sd/source/ui/docshell/docshel3.cxx
sd/source/ui/framework/configuration/ConfigurationControllerResourceManager.cxx
sd/source/ui/framework/factories/TaskPanelFactory.cxx
sd/source/ui/framework/factories/TaskPanelFactory.hxx
sd/source/ui/framework/factories/ViewShellWrapper.cxx
sd/source/ui/framework/factories/makefile.mk
sd/source/ui/framework/module/ImpressModule.cxx
sd/source/ui/framework/module/ToolPanelModule.cxx
sd/source/ui/framework/tools/FrameworkHelper.cxx
sd/source/ui/func/fuolbull.cxx
sd/source/ui/inc/DrawViewShell.hxx
sd/source/ui/inc/PaneChildWindows.hxx
sd/source/ui/inc/celltempl.hxx
sd/source/ui/inc/copydlg.hxx
sd/source/ui/inc/dlgpage.hxx
sd/source/ui/inc/framework/FrameworkHelper.hxx
sd/source/ui/inc/prltempl.hxx
sd/source/ui/inc/tabtempl.hxx
sd/source/ui/inc/taskpane/ILayoutableWindow.hxx
sd/source/ui/inc/taskpane/PanelId.hxx
sd/source/ui/inc/tpaction.hxx
sd/source/ui/sidebar/AllMasterPagesSelector.cxx
sd/source/ui/sidebar/AllMasterPagesSelector.hxx
sd/source/ui/sidebar/CurrentMasterPagesSelector.cxx
sd/source/ui/sidebar/CurrentMasterPagesSelector.hxx
sd/source/ui/sidebar/DocumentHelper.cxx
sd/source/ui/sidebar/DocumentHelper.hxx
sd/source/ui/sidebar/LayoutMenu.cxx
sd/source/ui/sidebar/LayoutMenu.hxx
sd/source/ui/sidebar/MasterPageContainer.cxx
sd/source/ui/sidebar/MasterPageContainer.hxx
sd/source/ui/sidebar/MasterPageContainerFiller.cxx
sd/source/ui/sidebar/MasterPageContainerFiller.hxx
sd/source/ui/sidebar/MasterPageContainerProviders.cxx
sd/source/ui/sidebar/MasterPageContainerProviders.hxx
sd/source/ui/sidebar/MasterPageContainerQueue.cxx
sd/source/ui/sidebar/MasterPageContainerQueue.hxx
sd/source/ui/sidebar/MasterPageDescriptor.cxx
sd/source/ui/sidebar/MasterPageDescriptor.hxx
sd/source/ui/sidebar/MasterPageObserver.cxx
sd/source/ui/sidebar/MasterPagesSelector.cxx
sd/source/ui/sidebar/MasterPagesSelector.hxx
sd/source/ui/sidebar/PreviewValueSet.cxx
sd/source/ui/sidebar/PreviewValueSet.hxx
sd/source/ui/sidebar/RecentMasterPagesSelector.cxx
sd/source/ui/sidebar/RecentlyUsedMasterPages.cxx
sd/source/ui/sidebar/SidebarShellManager.cxx
sd/source/ui/sidebar/SlideTransitionPanel.hxx
sd/source/ui/sidebar/makefile.mk
sd/source/ui/slidesorter/shell/SlideSorterViewShell.cxx
sd/source/ui/table/TableDesignPane.hxx
sd/source/ui/toolpanel/ControlContainer.cxx
sd/source/ui/toolpanel/ControlContainerDescriptor.hxx
sd/source/ui/toolpanel/MethodGuard.hxx
sd/source/ui/toolpanel/ScrollPanel.cxx
sd/source/ui/toolpanel/SlideSorterCacheDisplay.cxx
sd/source/ui/toolpanel/SubToolPanel.cxx
sd/source/ui/toolpanel/TaskPaneFocusManager.cxx
sd/source/ui/toolpanel/TaskPaneTreeNode.cxx
sd/source/ui/toolpanel/TitleBar.cxx
sd/source/ui/toolpanel/TitledControl.cxx
sd/source/ui/toolpanel/ToolPanel.cxx
sd/source/ui/toolpanel/ToolPanel.hxx
sd/source/ui/toolpanel/ToolPanelFactory.cxx
sd/source/ui/toolpanel/ToolPanelUIElement.cxx
sd/source/ui/toolpanel/ToolPanelUIElement.hxx
sd/source/ui/toolpanel/ToolPanelViewShell.cxx
sd/source/ui/toolpanel/controls/CustomAnimationPanel.cxx
sd/source/ui/toolpanel/controls/CustomAnimationPanel.hxx
sd/source/ui/toolpanel/controls/MasterPagesPanel.cxx
sd/source/ui/toolpanel/controls/MasterPagesPanel.hxx
sd/source/ui/toolpanel/controls/SlideTransitionPanel.cxx
sd/source/ui/toolpanel/controls/SlideTransitionPanel.hxx
sd/source/ui/toolpanel/controls/TableDesignPanel.cxx
sd/source/ui/toolpanel/controls/TableDesignPanel.hxx
sd/source/ui/unoidl/UnoDocumentSettings.cxx
sd/source/ui/view/ViewShellBase.cxx
sd/source/ui/view/drtxtob.cxx
sd/source/ui/view/drviews3.cxx
sd/source/ui/view/drviews7.cxx
sd/source/ui/view/drviewsa.cxx
sd/source/ui/view/drviewsf.cxx
sd/source/ui/view/outlnvsh.cxx
sd/source/ui/view/sdview.cxx
sd/source/ui/view/viewshel.cxx
sd/uiconfig/sdraw/menubar/menubar.xml
sd/util/makefile.mk
sfx2/Package_inc.mk
sfx2/inc/sfx2/sfx.hrc
sfx2/inc/sfx2/sfxsids.hrc
sfx2/source/control/bindings.cxx
sfx2/source/dialog/templdlg.cxx
sfx2/source/inc/templdgi.hxx
svx/AllLangResTarget_svx.mk
svx/Package_inc.mk
svx/inc/svx/XPropertyTable.hxx
svx/inc/svx/bmpmask.hxx
svx/inc/svx/colrctrl.hxx
svx/inc/svx/dialogs.hrc
svx/inc/svx/dlgctrl.hxx
svx/inc/svx/dlgutil.hxx
svx/inc/svx/drawitem.hxx
svx/inc/svx/fontwork.hxx
svx/inc/svx/galbrws.hxx
svx/inc/svx/sdr/table/tablecontroller.hxx
svx/inc/svx/svdmodel.hxx
svx/inc/svx/svdstr.hrc
svx/inc/svx/svxids.hrc
svx/inc/svx/svxitems.hrc
svx/inc/svx/xattr.hxx
svx/inc/svx/xflgrit.hxx
svx/inc/svx/xflhtit.hxx
svx/inc/svx/xit.hxx
svx/inc/svx/xlineit.hxx
svx/inc/svx/xlndsit.hxx
svx/inc/svx/xlnedit.hxx
svx/inc/svx/xlnstit.hxx
svx/inc/svx/xtable.hxx
svx/sdi/svx.sdi
svx/source/dialog/_bmpmask.cxx
svx/source/dialog/dialcontrol.cxx
svx/source/dialog/dlgctrl.cxx
svx/source/dialog/dlgutil.cxx
svx/source/dialog/fontwork.cxx
svx/source/gallery2/galbrws.cxx
svx/source/gallery2/galbrws1.cxx
svx/source/gallery2/gallery1.cxx
svx/source/items/drawitem.cxx
svx/source/items/svxitems.src
svx/source/sdr/attribute/sdrformtextattribute.cxx
svx/source/sidebar/ColorPanel.hxx
svx/source/sidebar/EmptyPanel.hrc
svx/source/sidebar/EmptyPanel.hxx
svx/source/sidebar/gallery/GalleryPanel.hxx
svx/source/svdraw/svdedtv1.cxx
svx/source/svdraw/svdmodel.cxx
svx/source/svdraw/svdogrp.cxx
svx/source/svdraw/svdstr.src
svx/source/tbxctrls/tbcontrl.cxx
svx/source/unodraw/XPropertyTable.cxx
svx/source/unodraw/unoctabl.cxx
svx/source/xoutdev/XPropertyEntry.cxx
svx/source/xoutdev/xattr.cxx
svx/source/xoutdev/xattr2.cxx
svx/source/xoutdev/xtabbtmp.cxx
svx/source/xoutdev/xtabcolr.cxx
svx/source/xoutdev/xtabdash.cxx
svx/source/xoutdev/xtabgrdt.cxx
svx/source/xoutdev/xtabhtch.cxx
svx/source/xoutdev/xtable.cxx
svx/source/xoutdev/xtablend.cxx
svx/util/svx.component
sw/inc/cmdid.h
sw/inc/docsh.hxx
sw/inc/editsh.hxx
sw/inc/helpid.h
sw/inc/rcid.hrc
sw/inc/swabstdlg.hxx
sw/inc/swcommands.h
sw/sdi/swriter.sdi
sw/source/core/doc/docdesc.cxx
sw/source/core/draw/drawdoc.cxx
sw/source/ui/app/docsh2.cxx
sw/source/ui/app/docshdrw.cxx
sw/source/ui/app/docshini.cxx
sw/source/ui/app/docst.cxx
sw/source/ui/config/optpage.cxx
sw/source/ui/dialog/swdlgfact.cxx
sw/source/ui/dialog/swdlgfact.hxx
sw/source/ui/fmtui/tmpdlg.cxx
sw/source/ui/inc/tmpdlg.hxx
sw/source/ui/misc/pggrid.cxx
sw/source/ui/shells/annotsh.cxx
sw/source/ui/shells/basesh.cxx
sw/source/ui/shells/beziersh.cxx
sw/source/ui/shells/drawdlg.cxx
sw/source/ui/shells/drawsh.cxx
sw/source/ui/shells/drformsh.cxx
sw/source/ui/shells/drwbassh.cxx
sw/source/ui/shells/drwtxtex.cxx
sw/source/ui/shells/drwtxtsh.cxx
sw/source/ui/shells/frmsh.cxx
sw/source/ui/shells/grfsh.cxx
sw/source/ui/shells/olesh.cxx
sw/source/ui/shells/tabsh.cxx
sw/source/ui/shells/textsh.cxx
sw/source/ui/shells/textsh1.cxx
sw/source/ui/shells/txtnum.cxx
sw/source/ui/uiview/viewtab.cxx
sw/source/ui/uno/unofreg.cxx
sw/source/ui/utlui/navipi.cxx
sw/util/sw.component
vcl/inc/vcl/split.hxx
vcl/inc/vcl/window.hxx
vcl/inc/window.h
vcl/source/window/split.cxx
vcl/source/window/window.cxx
vcl/source/window/window4.cxx
Change-Id: Idebaff59f9d60e4e93290cefefdda4c5a1e9215e
Resolves: #i122194# Adapted license text in propertypanel.hrc
then renamed it to ResourceDefinitions.hrc
(cherry picked from commit e952d1401c1adc41934118ba7f542611ef9da11b)
Conflicts:
sfx2/Package_inc.mk
sfx2/source/sidebar/SidebarChildWindow.cxx
svx/source/sidebar/graphic/GraphicPropertyPanel.cxx
svx/source/sidebar/line/LinePropertyPanel.cxx
svx/source/sidebar/possize/PosSizePropertyPanel.cxx
sw/source/ui/sidebar/PagePropertyPanel.src
sw/source/ui/sidebar/WrapPropertyPanel.src
Change-Id: Ie009056a78ab108556717a501399c83b477b3548
Resolves: #i122194# finally I got the correct file name
Change-Id: If7a075af8c9a829f6f0a69f883c5c6d4ac97ba2a
More merge changes for optional sidebar:
revert toolpanel removal, restore and re-enable task pane
remove apparently un-used SidebarFactory module
add extra visibility annotation to ItemReceiverUpdate
Diffstat (limited to 'sfx2/source/sidebar/ResourceManager.cxx')
-rw-r--r-- | sfx2/source/sidebar/ResourceManager.cxx | 621 |
1 files changed, 621 insertions, 0 deletions
diff --git a/sfx2/source/sidebar/ResourceManager.cxx b/sfx2/source/sidebar/ResourceManager.cxx new file mode 100644 index 000000000000..efb1fa134820 --- /dev/null +++ b/sfx2/source/sidebar/ResourceManager.cxx @@ -0,0 +1,621 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "ResourceManager.hxx" +#include "Tools.hxx" + +#include <unotools/confignode.hxx> +#include <comphelper/componentcontext.hxx> +#include <comphelper/processfactory.hxx> +#include <comphelper/namedvaluecollection.hxx> +#include <comphelper/types.hxx> +#include <comphelper/stlunosequence.hxx> + +#include <rtl/ustrbuf.hxx> +#include <tools/diagnose_ex.h> + +#include <com/sun/star/frame/XModuleManager.hpp> + +#include <map> + + + +using ::rtl::OUString; +using namespace css; +using namespace cssu; + +namespace sfx2 { namespace sidebar { + +class ResourceManager::Deleter +{ +public: + void operator() (ResourceManager* pObject) + { + delete pObject; + } +}; + + +ResourceManager& ResourceManager::Instance (void) +{ + static ResourceManager maInstance; + return maInstance; +} + + + + +ResourceManager::ResourceManager (void) + : maDecks(), + maPanels(), + maProcessedApplications() +{ + ReadDeckList(); + ReadPanelList(); +} + + + + +ResourceManager::~ResourceManager (void) +{ + maPanels.clear(); + maDecks.clear(); +} + + + + +const DeckDescriptor* ResourceManager::GetBestMatchingDeck ( + const Context& rContext, + const Reference<frame::XFrame>& rxFrame) +{ + ReadLegacyAddons(rxFrame); + + for (DeckContainer::const_iterator iDeck(maDecks.begin()), iEnd(maDecks.end()); + iDeck!=iEnd; + ++iDeck) + { + if (iDeck->maContextList.GetMatch(rContext) != NULL) + return &*iDeck; + } + return NULL; +} + + + + +const DeckDescriptor* ResourceManager::GetDeckDescriptor ( + const ::rtl::OUString& rsDeckId) const +{ + for (DeckContainer::const_iterator + iDeck(maDecks.begin()), + iEnd(maDecks.end()); + iDeck!=iEnd; + ++iDeck) + { + if (iDeck->msId.equals(rsDeckId)) + return &*iDeck; + } + return NULL; +} + + + + +const PanelDescriptor* ResourceManager::GetPanelDescriptor ( + const ::rtl::OUString& rsPanelId) const +{ + for (PanelContainer::const_iterator + iPanel(maPanels.begin()), + iEnd(maPanels.end()); + iPanel!=iEnd; + ++iPanel) + { + if (iPanel->msId.equals(rsPanelId)) + return &*iPanel; + } + return NULL; +} + + + + +void ResourceManager::SetIsDeckEnabled ( + const ::rtl::OUString& rsDeckId, + const bool bIsEnabled) +{ + for (DeckContainer::iterator + iDeck(maDecks.begin()), + iEnd(maDecks.end()); + iDeck!=iEnd; + ++iDeck) + { + if (iDeck->msId.equals(rsDeckId)) + { + iDeck->mbIsEnabled = bIsEnabled; + return; + } + } +} + + + + +const ResourceManager::IdContainer& ResourceManager::GetMatchingDecks ( + IdContainer& rDeckIds, + const Context& rContext, + const Reference<frame::XFrame>& rxFrame) +{ + ReadLegacyAddons(rxFrame); + + ::std::multimap<sal_Int32,OUString> aOrderedIds; + for (DeckContainer::const_iterator + iDeck(maDecks.begin()), + iEnd (maDecks.end()); + iDeck!=iEnd; + ++iDeck) + { + const DeckDescriptor& rDeckDescriptor (*iDeck); + if (rDeckDescriptor.maContextList.GetMatch(rContext) != NULL) + aOrderedIds.insert(::std::multimap<sal_Int32,OUString>::value_type( + rDeckDescriptor.mnOrderIndex, + rDeckDescriptor.msId)); + } + + for (::std::multimap<sal_Int32,OUString>::const_iterator + iId(aOrderedIds.begin()), + iEnd(aOrderedIds.end()); + iId!=iEnd; + ++iId) + { + rDeckIds.push_back(iId->second); + } + + return rDeckIds; +} + + + + +const ResourceManager::PanelContextDescriptorContainer& ResourceManager::GetMatchingPanels ( + PanelContextDescriptorContainer& rPanelIds, + const Context& rContext, + const ::rtl::OUString& rsDeckId, + const Reference<frame::XFrame>& rxFrame) +{ + ReadLegacyAddons(rxFrame); + + ::std::multimap<sal_Int32,PanelContextDescriptor> aOrderedIds; + for (PanelContainer::const_iterator + iPanel(maPanels.begin()), + iEnd(maPanels.end()); + iPanel!=iEnd; + ++iPanel) + { + const PanelDescriptor& rPanelDescriptor (*iPanel); + if (rPanelDescriptor.msDeckId.equals(rsDeckId)) + { + const ContextList::Entry* pEntry = rPanelDescriptor.maContextList.GetMatch(rContext); + if (pEntry != NULL) + { + PanelContextDescriptor aPanelContextDescriptor; + aPanelContextDescriptor.msId = rPanelDescriptor.msId; + aPanelContextDescriptor.msMenuCommand = pEntry->msMenuCommand; + aPanelContextDescriptor.mbIsInitiallyVisible = pEntry->mbIsInitiallyVisible; + aOrderedIds.insert(::std::multimap<sal_Int32,PanelContextDescriptor>::value_type( + rPanelDescriptor.mnOrderIndex, + aPanelContextDescriptor)); + } + } + } + + for (::std::multimap<sal_Int32,PanelContextDescriptor>::const_iterator + iId(aOrderedIds.begin()), + iEnd(aOrderedIds.end()); + iId!=iEnd; + ++iId) + { + rPanelIds.push_back(iId->second); + } + + return rPanelIds; +} + + + + +void ResourceManager::ReadDeckList (void) +{ + const ::utl::OConfigurationTreeRoot aDeckRootNode ( + ::comphelper::getProcessComponentContext(), + A2S("org.openoffice.Office.UI.Sidebar/Content/DeckList"), + false); + if ( ! aDeckRootNode.isValid() ) + return; + + const Sequence<OUString> aDeckNodeNames (aDeckRootNode.getNodeNames()); + const sal_Int32 nCount (aDeckNodeNames.getLength()); + maDecks.resize(nCount); + sal_Int32 nWriteIndex(0); + for (sal_Int32 nReadIndex(0); nReadIndex<nCount; ++nReadIndex) + { + const ::utl::OConfigurationNode aDeckNode (aDeckRootNode.openNode(aDeckNodeNames[nReadIndex])); + if ( ! aDeckNode.isValid()) + continue; + + DeckDescriptor& rDeckDescriptor (maDecks[nWriteIndex++]); + + rDeckDescriptor.msTitle = ::comphelper::getString( + aDeckNode.getNodeValue("Title")); + rDeckDescriptor.msId = ::comphelper::getString( + aDeckNode.getNodeValue("Id")); + rDeckDescriptor.msIconURL = ::comphelper::getString( + aDeckNode.getNodeValue("IconURL")); + rDeckDescriptor.msHighContrastIconURL = ::comphelper::getString( + aDeckNode.getNodeValue("HighContrastIconURL")); + rDeckDescriptor.msHelpURL = ::comphelper::getString( + aDeckNode.getNodeValue("HelpURL")); + rDeckDescriptor.msHelpText = rDeckDescriptor.msTitle; + rDeckDescriptor.mbIsEnabled = true; + rDeckDescriptor.mnOrderIndex = ::comphelper::getINT32( + aDeckNode.getNodeValue("OrderIndex")); + + ReadContextList( + aDeckNode, + rDeckDescriptor.maContextList, + OUString()); + } + + // When there where invalid nodes then we have to adapt the size + // of the deck vector. + if (nWriteIndex<nCount) + maDecks.resize(nWriteIndex); +} + + + + +void ResourceManager::ReadPanelList (void) +{ + const ::utl::OConfigurationTreeRoot aPanelRootNode ( + ::comphelper::getProcessComponentContext(), + A2S("org.openoffice.Office.UI.Sidebar/Content/PanelList"), + false); + if ( ! aPanelRootNode.isValid() ) + return; + + const Sequence<OUString> aPanelNodeNames (aPanelRootNode.getNodeNames()); + const sal_Int32 nCount (aPanelNodeNames.getLength()); + maPanels.resize(nCount); + sal_Int32 nWriteIndex (0); + for (sal_Int32 nReadIndex(0); nReadIndex<nCount; ++nReadIndex) + { + const ::utl::OConfigurationNode aPanelNode (aPanelRootNode.openNode(aPanelNodeNames[nReadIndex])); + if ( ! aPanelNode.isValid()) + continue; + + PanelDescriptor& rPanelDescriptor (maPanels[nWriteIndex++]); + + rPanelDescriptor.msTitle = ::comphelper::getString( + aPanelNode.getNodeValue("Title")); + rPanelDescriptor.mbIsTitleBarOptional = ::comphelper::getBOOL( + aPanelNode.getNodeValue("TitleBarIsOptional")); + rPanelDescriptor.msId = ::comphelper::getString( + aPanelNode.getNodeValue("Id")); + rPanelDescriptor.msDeckId = ::comphelper::getString( + aPanelNode.getNodeValue("DeckId")); + rPanelDescriptor.msHelpURL = ::comphelper::getString( + aPanelNode.getNodeValue("HelpURL")); + rPanelDescriptor.msImplementationURL = ::comphelper::getString( + aPanelNode.getNodeValue("ImplementationURL")); + rPanelDescriptor.mnOrderIndex = ::comphelper::getINT32( + aPanelNode.getNodeValue("OrderIndex")); + rPanelDescriptor.mbWantsCanvas = ::comphelper::getBOOL( + aPanelNode.getNodeValue("WantsCanvas")); + const OUString sDefaultMenuCommand (::comphelper::getString( + aPanelNode.getNodeValue("DefaultMenuCommand"))); + + ReadContextList( + aPanelNode, + rPanelDescriptor.maContextList, + sDefaultMenuCommand); + } + + // When there where invalid nodes then we have to adapt the size + // of the deck vector. + if (nWriteIndex<nCount) + maPanels.resize(nWriteIndex); +} + + + + +void ResourceManager::ReadContextList ( + const ::utl::OConfigurationNode& rParentNode, + ContextList& rContextList, + const OUString& rsDefaultMenuCommand) const +{ + const Any aValue = rParentNode.getNodeValue("ContextList"); + Sequence<OUString> aValues; + sal_Int32 nCount; + if (aValue >>= aValues) + nCount = aValues.getLength(); + else + nCount = 0; + + for (sal_Int32 nIndex=0; nIndex<nCount; ++nIndex) + { + const OUString sValue (aValues[nIndex]); + sal_Int32 nCharacterIndex (0); + const OUString sApplicationName (sValue.getToken(0, ',', nCharacterIndex).trim()); + if (nCharacterIndex < 0) + { + if (sApplicationName.getLength() == 0) + { + // This is a valid case: in the XML file the separator + // was used as terminator. Using it in the last line + // creates an additional but empty entry. + break; + } + else + { + OSL_ASSERT("expecting three or four values per ContextList entry, separated by comma"); + continue; + } + } + + const OUString sContextName (sValue.getToken(0, ',', nCharacterIndex).trim()); + if (nCharacterIndex < 0) + { + OSL_ASSERT("expecting three or four values per ContextList entry, separated by comma"); + continue; + } + + const OUString sInitialState (sValue.getToken(0, ',', nCharacterIndex).trim()); + + // The fourth argument is optional. + const OUString sMenuCommandOverride ( + nCharacterIndex<0 + ? OUString() + : sValue.getToken(0, ',', nCharacterIndex).trim()); + const OUString sMenuCommand ( + sMenuCommandOverride.getLength()>0 + ? (sMenuCommandOverride.equalsAscii("none") + ? OUString() + : sMenuCommandOverride) + : rsDefaultMenuCommand); + + EnumContext::Application eApplication (EnumContext::GetApplicationEnum(sApplicationName)); + EnumContext::Application eApplication2 (EnumContext::Application_None); + if (eApplication == EnumContext::Application_None + && !sApplicationName.equals(EnumContext::GetApplicationName(EnumContext::Application_None))) + { + // Handle some special names: abbreviations that make + // context descriptions more readable. + if (sApplicationName.equalsAscii("Writer")) + eApplication = EnumContext::Application_Writer; + else if (sApplicationName.equalsAscii("Calc")) + eApplication = EnumContext::Application_Calc; + else if (sApplicationName.equalsAscii("Draw")) + eApplication = EnumContext::Application_Draw; + else if (sApplicationName.equalsAscii("Impress")) + eApplication = EnumContext::Application_Impress; + else if (sApplicationName.equalsAscii("DrawImpress")) + { + // A special case among the special names: it is + // common to use the same context descriptions for + // both Draw and Impress. This special case helps to + // avoid duplication in the .xcu file. + eApplication = EnumContext::Application_Draw; + eApplication2 = EnumContext::Application_Impress; + } + else if (sApplicationName.equalsAscii("WriterAndWeb")) + { + // Another special case for Writer and WriterWeb. + eApplication = EnumContext::Application_Writer; + eApplication2 = EnumContext::Application_WriterWeb; + } + else + { + OSL_ASSERT("application name not recognized"); + continue; + } + } + + const EnumContext::Context eContext (EnumContext::GetContextEnum(sContextName)); + if (eContext == EnumContext::Context_Unknown) + { + OSL_ASSERT("context name not recognized"); + continue; + } + + bool bIsInitiallyVisible; + if (sInitialState.equalsAscii("visible")) + bIsInitiallyVisible = true; + else if (sInitialState.equalsAscii("hidden")) + bIsInitiallyVisible = false; + else + { + OSL_ASSERT("unrecognized state"); + continue; + } + + if (eApplication != EnumContext::Application_None) + rContextList.AddContextDescription( + Context( + EnumContext::GetApplicationName(eApplication), + EnumContext::GetContextName(eContext)), + bIsInitiallyVisible, + sMenuCommand); + if (eApplication2 != EnumContext::Application_None) + rContextList.AddContextDescription( + Context( + EnumContext::GetApplicationName(eApplication2), + EnumContext::GetContextName(eContext)), + bIsInitiallyVisible, + sMenuCommand); + } +} + + + + +void ResourceManager::ReadLegacyAddons (const Reference<frame::XFrame>& rxFrame) +{ + // Get module name for given frame. + ::rtl::OUString sModuleName (GetModuleName(rxFrame)); + if (sModuleName.getLength() == 0) + return; + if (maProcessedApplications.find(sModuleName) != maProcessedApplications.end()) + { + // Addons for this application have already been read. + // There is nothing more to do. + return; + } + + // Mark module as processed. Even when there is an error that + // prevents the configuration data from being read, this error + // will not be triggered a second time. + maProcessedApplications.insert(sModuleName); + + // Get access to the configuration root node for the application. + ::utl::OConfigurationTreeRoot aLegacyRootNode (GetLegacyAddonRootNode(sModuleName)); + if ( ! aLegacyRootNode.isValid()) + return; + + // Process child nodes. + ::std::vector<OUString> aMatchingNodeNames; + GetToolPanelNodeNames(aMatchingNodeNames, aLegacyRootNode); + const sal_Int32 nCount (aMatchingNodeNames.size()); + size_t nDeckWriteIndex (maDecks.size()); + size_t nPanelWriteIndex (maPanels.size()); + maDecks.resize(maDecks.size() + nCount); + maPanels.resize(maPanels.size() + nCount); + for (sal_Int32 nReadIndex(0); nReadIndex<nCount; ++nReadIndex) + { + const OUString& rsNodeName (aMatchingNodeNames[nReadIndex]); + const ::utl::OConfigurationNode aChildNode (aLegacyRootNode.openNode(rsNodeName)); + if ( ! aChildNode.isValid()) + continue; + + DeckDescriptor& rDeckDescriptor (maDecks[nDeckWriteIndex++]); + rDeckDescriptor.msTitle = ::comphelper::getString(aChildNode.getNodeValue("UIName")); + rDeckDescriptor.msId = rsNodeName; + rDeckDescriptor.msIconURL = ::comphelper::getString(aChildNode.getNodeValue("ImageURL")); + rDeckDescriptor.msHighContrastIconURL = rDeckDescriptor.msIconURL; + rDeckDescriptor.msHelpURL = ::comphelper::getString(aChildNode.getNodeValue("HelpURL")); + rDeckDescriptor.msHelpText = rDeckDescriptor.msTitle; + rDeckDescriptor.maContextList.AddContextDescription(Context(sModuleName, A2S("any")), true, OUString()); + rDeckDescriptor.mbIsEnabled = true; + + PanelDescriptor& rPanelDescriptor (maPanels[nPanelWriteIndex++]); + rPanelDescriptor.msTitle = ::comphelper::getString(aChildNode.getNodeValue("UIName")); + rPanelDescriptor.mbIsTitleBarOptional = true; + rPanelDescriptor.msId = rsNodeName; + rPanelDescriptor.msDeckId = rsNodeName; + rPanelDescriptor.msHelpURL = ::comphelper::getString(aChildNode.getNodeValue("HelpURL")); + rPanelDescriptor.maContextList.AddContextDescription(Context(sModuleName, A2S("any")), true, OUString()); + rPanelDescriptor.msImplementationURL = rsNodeName; + } + + // When there where invalid nodes then we have to adapt the size + // of the deck and panel vectors. + if (nDeckWriteIndex < maDecks.size()) + maDecks.resize(nDeckWriteIndex); + if (nPanelWriteIndex < maPanels.size()) + maPanels.resize(nPanelWriteIndex); +} + + + + +::rtl::OUString ResourceManager::GetModuleName ( + const cssu::Reference<css::frame::XFrame>& rxFrame) +{ + if ( ! rxFrame.is() || ! rxFrame->getController().is()) + return OUString(); + + try + { + const ::comphelper::ComponentContext aContext (::comphelper::getProcessServiceFactory()); + const Reference<frame::XModuleManager> xModuleManager ( + aContext.createComponent("com.sun.star.frame.ModuleManager"), + UNO_QUERY_THROW); + return xModuleManager->identify(rxFrame); + } + catch (const Exception&) + { + DBG_UNHANDLED_EXCEPTION(); + } + return OUString(); +} + + + + +::utl::OConfigurationTreeRoot ResourceManager::GetLegacyAddonRootNode ( + const ::rtl::OUString& rsModuleName) const +{ + try + { + const ::comphelper::ComponentContext aContext (::comphelper::getProcessServiceFactory()); + const Reference<container::XNameAccess> xModuleAccess ( + aContext.createComponent("com.sun.star.frame.ModuleManager"), + UNO_QUERY_THROW); + const ::comphelper::NamedValueCollection aModuleProperties (xModuleAccess->getByName(rsModuleName)); + const ::rtl::OUString sWindowStateRef (aModuleProperties.getOrDefault( + "ooSetupFactoryWindowStateConfigRef", + ::rtl::OUString())); + + ::rtl::OUStringBuffer aPathComposer; + aPathComposer.appendAscii("org.openoffice.Office.UI."); + aPathComposer.append(sWindowStateRef); + aPathComposer.appendAscii("/UIElements/States"); + + return ::utl::OConfigurationTreeRoot(::comphelper::getProcessComponentContext(), + aPathComposer.makeStringAndClear(), false); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + + return ::utl::OConfigurationTreeRoot(); +} + + + + +void ResourceManager::GetToolPanelNodeNames ( + ::std::vector<OUString>& rMatchingNames, + const ::utl::OConfigurationTreeRoot aRoot) const +{ + Sequence<OUString> aChildNodeNames (aRoot.getNodeNames()); + const sal_Int32 nCount (aChildNodeNames.getLength()); + for (sal_Int32 nIndex(0); nIndex<nCount; ++nIndex) + { + if (aChildNodeNames[nIndex].matchAsciiL( + RTL_CONSTASCII_STRINGPARAM( "private:resource/toolpanel/"))) + rMatchingNames.push_back(aChildNodeNames[nIndex]); + } +} + + + +} } // end of namespace sfx2::sidebar |