summaryrefslogtreecommitdiffstats
path: root/cui/source/customize/SvxConfigPageHelper.cxx
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--cui/source/customize/SvxConfigPageHelper.cxx424
1 files changed, 424 insertions, 0 deletions
diff --git a/cui/source/customize/SvxConfigPageHelper.cxx b/cui/source/customize/SvxConfigPageHelper.cxx
new file mode 100644
index 000000000..52265ef09
--- /dev/null
+++ b/cui/source/customize/SvxConfigPageHelper.cxx
@@ -0,0 +1,424 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * 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 <SvxConfigPageHelper.hxx>
+
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
+#include <com/sun/star/ui/ImageType.hpp>
+#include <com/sun/star/ui/ItemType.hpp>
+
+#include <comphelper/propertyvalue.hxx>
+#include <comphelper/random.hxx>
+#include <svtools/imgdef.hxx>
+#include <svtools/miscopt.hxx>
+
+static sal_Int16 theImageType = css::ui::ImageType::COLOR_NORMAL | css::ui::ImageType::SIZE_DEFAULT;
+
+void SvxConfigPageHelper::RemoveEntry(SvxEntries* pEntries, SvxConfigEntry const* pChildEntry)
+{
+ SvxEntries::iterator iter = pEntries->begin();
+
+ while (iter != pEntries->end())
+ {
+ if (pChildEntry == *iter)
+ {
+ pEntries->erase(iter);
+ break;
+ }
+ ++iter;
+ }
+}
+
+OUString SvxConfigPageHelper::replaceSaveInName(const OUString& rMessage,
+ std::u16string_view rSaveInName)
+{
+ OUString name = rMessage.replaceFirst("%SAVE IN SELECTION%", rSaveInName);
+
+ return name;
+}
+
+OUString SvxConfigPageHelper::stripHotKey(const OUString& str) { return str.replaceFirst("~", ""); }
+
+OUString SvxConfigPageHelper::replaceSixteen(const OUString& str, sal_Int32 nReplacement)
+{
+ return str.replaceAll(OUString::number(16), OUString::number(nReplacement));
+}
+
+sal_Int16 SvxConfigPageHelper::GetImageType() { return theImageType; }
+
+void SvxConfigPageHelper::InitImageType()
+{
+ theImageType = css::ui::ImageType::COLOR_NORMAL | css::ui::ImageType::SIZE_DEFAULT;
+
+ if (SvtMiscOptions().GetCurrentSymbolsSize() == SFX_SYMBOLS_SIZE_LARGE)
+ {
+ theImageType |= css::ui::ImageType::SIZE_LARGE;
+ }
+ else if (SvtMiscOptions().GetCurrentSymbolsSize() == SFX_SYMBOLS_SIZE_32)
+ {
+ theImageType |= css::ui::ImageType::SIZE_32;
+ }
+}
+
+css::uno::Reference<css::graphic::XGraphic>
+SvxConfigPageHelper::GetGraphic(const css::uno::Reference<css::ui::XImageManager>& xImageManager,
+ const OUString& rCommandURL)
+{
+ css::uno::Reference<css::graphic::XGraphic> result;
+
+ if (xImageManager.is())
+ {
+ // TODO handle large graphics
+ css::uno::Sequence<css::uno::Reference<css::graphic::XGraphic>> aGraphicSeq;
+
+ css::uno::Sequence<OUString> aImageCmdSeq{ rCommandURL };
+
+ try
+ {
+ aGraphicSeq = xImageManager->getImages(GetImageType(), aImageCmdSeq);
+
+ if (aGraphicSeq.hasElements())
+ {
+ result = aGraphicSeq[0];
+ }
+ }
+ catch (css::uno::Exception&)
+ {
+ // will return empty XGraphic
+ }
+ }
+
+ return result;
+}
+
+OUString SvxConfigPageHelper::generateCustomName(const OUString& prefix, SvxEntries* entries,
+ sal_Int32 suffix /*= 1*/)
+{
+ OUString name;
+ sal_Int32 pos = 0;
+
+ // find and replace the %n placeholder in the prefix string
+ name = prefix.replaceFirst("%n", OUString::number(suffix), &pos);
+
+ if (pos == -1)
+ {
+ // no placeholder found so just append the suffix
+ name += OUString::number(suffix);
+ }
+
+ if (!entries)
+ return name;
+
+ // now check if there is an already existing entry with this name
+ bool bFoundEntry = false;
+ for (auto const& entry : *entries)
+ {
+ if (name.equals(entry->GetName()))
+ {
+ bFoundEntry = true;
+ break;
+ }
+ }
+
+ if (bFoundEntry)
+ {
+ // name already exists so try the next number up
+ return generateCustomName(prefix, entries, ++suffix);
+ }
+
+ return name;
+}
+
+OUString SvxConfigPageHelper::generateCustomMenuURL(SvxEntries* entries, sal_Int32 suffix /*= 1*/)
+{
+ OUString url = "vnd.openoffice.org:CustomMenu" + OUString::number(suffix);
+ if (!entries)
+ return url;
+
+ // now check is there is an already existing entry with this url
+ bool bFoundEntry = false;
+ for (auto const& entry : *entries)
+ {
+ if (url.equals(entry->GetCommand()))
+ {
+ bFoundEntry = true;
+ break;
+ }
+ }
+
+ if (bFoundEntry)
+ {
+ // url already exists so try the next number up
+ return generateCustomMenuURL(entries, ++suffix);
+ }
+
+ return url;
+}
+
+sal_uInt32 SvxConfigPageHelper::generateRandomValue()
+{
+ return comphelper::rng::uniform_uint_distribution(0, std::numeric_limits<unsigned int>::max());
+}
+
+OUString SvxConfigPageHelper::generateCustomURL(SvxEntries* entries)
+{
+ OUString url = OUString::Concat(ITEM_TOOLBAR_URL) + CUSTOM_TOOLBAR_STR +
+ // use a random number to minimize possible clash with existing custom toolbars
+ OUString::number(generateRandomValue(), 16);
+
+ // now check is there is an already existing entry with this url
+ bool bFoundEntry = false;
+ for (auto const& entry : *entries)
+ {
+ if (url.equals(entry->GetCommand()))
+ {
+ bFoundEntry = true;
+ break;
+ }
+ }
+
+ if (bFoundEntry)
+ {
+ // url already exists so try the next number up
+ return generateCustomURL(entries);
+ }
+
+ return url;
+}
+
+OUString SvxConfigPageHelper::GetModuleName(std::u16string_view aModuleId)
+{
+ if (aModuleId == u"com.sun.star.text.TextDocument"
+ || aModuleId == u"com.sun.star.text.GlobalDocument")
+ return "Writer";
+ else if (aModuleId == u"com.sun.star.text.WebDocument")
+ return "Writer/Web";
+ else if (aModuleId == u"com.sun.star.drawing.DrawingDocument")
+ return "Draw";
+ else if (aModuleId == u"com.sun.star.presentation.PresentationDocument")
+ return "Impress";
+ else if (aModuleId == u"com.sun.star.sheet.SpreadsheetDocument")
+ return "Calc";
+ else if (aModuleId == u"com.sun.star.script.BasicIDE")
+ return "Basic";
+ else if (aModuleId == u"com.sun.star.formula.FormulaProperties")
+ return "Math";
+ else if (aModuleId == u"com.sun.star.sdb.RelationDesign")
+ return "Relation Design";
+ else if (aModuleId == u"com.sun.star.sdb.QueryDesign")
+ return "Query Design";
+ else if (aModuleId == u"com.sun.star.sdb.TableDesign")
+ return "Table Design";
+ else if (aModuleId == u"com.sun.star.sdb.DataSourceBrowser")
+ return "Data Source Browser";
+ else if (aModuleId == u"com.sun.star.sdb.DatabaseDocument")
+ return "Database";
+
+ return OUString();
+}
+
+OUString SvxConfigPageHelper::GetUIModuleName(
+ const OUString& aModuleId,
+ const css::uno::Reference<css::frame::XModuleManager2>& rModuleManager)
+{
+ assert(rModuleManager.is());
+
+ OUString aModuleUIName;
+
+ try
+ {
+ css::uno::Any a = rModuleManager->getByName(aModuleId);
+ css::uno::Sequence<css::beans::PropertyValue> aSeq;
+
+ if (a >>= aSeq)
+ {
+ for (css::beans::PropertyValue const& rProp : std::as_const(aSeq))
+ {
+ if (rProp.Name == "ooSetupFactoryUIName")
+ {
+ rProp.Value >>= aModuleUIName;
+ break;
+ }
+ }
+ }
+ }
+ catch (css::uno::RuntimeException&)
+ {
+ throw;
+ }
+ catch (css::uno::Exception&)
+ {
+ }
+
+ if (aModuleUIName.isEmpty())
+ aModuleUIName = GetModuleName(aModuleId);
+
+ return aModuleUIName;
+}
+
+bool SvxConfigPageHelper::GetMenuItemData(
+ const css::uno::Reference<css::container::XIndexAccess>& rItemContainer, sal_Int32 nIndex,
+ OUString& rCommandURL, OUString& rLabel, sal_uInt16& rType, sal_Int32& rStyle,
+ css::uno::Reference<css::container::XIndexAccess>& rSubMenu)
+{
+ try
+ {
+ css::uno::Sequence<css::beans::PropertyValue> aProps;
+ if (rItemContainer->getByIndex(nIndex) >>= aProps)
+ {
+ for (css::beans::PropertyValue const& rProp : std::as_const(aProps))
+ {
+ if (rProp.Name == ITEM_DESCRIPTOR_COMMANDURL)
+ {
+ rProp.Value >>= rCommandURL;
+ }
+ else if (rProp.Name == ITEM_DESCRIPTOR_CONTAINER)
+ {
+ rProp.Value >>= rSubMenu;
+ }
+ else if (rProp.Name == ITEM_DESCRIPTOR_STYLE)
+ {
+ rProp.Value >>= rStyle;
+ }
+ else if (rProp.Name == ITEM_DESCRIPTOR_LABEL)
+ {
+ rProp.Value >>= rLabel;
+ }
+ else if (rProp.Name == ITEM_DESCRIPTOR_TYPE)
+ {
+ rProp.Value >>= rType;
+ }
+ }
+
+ return true;
+ }
+ }
+ catch (css::lang::IndexOutOfBoundsException&)
+ {
+ }
+
+ return false;
+}
+
+bool SvxConfigPageHelper::GetToolbarItemData(
+ const css::uno::Reference<css::container::XIndexAccess>& rItemContainer, sal_Int32 nIndex,
+ OUString& rCommandURL, OUString& rLabel, sal_uInt16& rType, bool& rIsVisible, sal_Int32& rStyle)
+{
+ try
+ {
+ css::uno::Sequence<css::beans::PropertyValue> aProps;
+ if (rItemContainer->getByIndex(nIndex) >>= aProps)
+ {
+ for (css::beans::PropertyValue const& rProp : std::as_const(aProps))
+ {
+ if (rProp.Name == ITEM_DESCRIPTOR_COMMANDURL)
+ {
+ rProp.Value >>= rCommandURL;
+ }
+ else if (rProp.Name == ITEM_DESCRIPTOR_STYLE)
+ {
+ rProp.Value >>= rStyle;
+ }
+ else if (rProp.Name == ITEM_DESCRIPTOR_LABEL)
+ {
+ rProp.Value >>= rLabel;
+ }
+ else if (rProp.Name == ITEM_DESCRIPTOR_TYPE)
+ {
+ rProp.Value >>= rType;
+ }
+ else if (rProp.Name == ITEM_DESCRIPTOR_ISVISIBLE)
+ {
+ rProp.Value >>= rIsVisible;
+ }
+ }
+
+ return true;
+ }
+ }
+ catch (css::lang::IndexOutOfBoundsException&)
+ {
+ }
+
+ return false;
+}
+
+css::uno::Sequence<css::beans::PropertyValue>
+SvxConfigPageHelper::ConvertSvxConfigEntry(const SvxConfigEntry* pEntry)
+{
+ // If the name has not been changed, then the label can be stored
+ // as an empty string.
+ // It will be initialised again later using the command to label map.
+ OUString sLabel;
+ if (pEntry->HasChangedName() || pEntry->GetCommand().isEmpty())
+ sLabel = pEntry->GetName();
+
+ css::uno::Sequence<css::beans::PropertyValue> aPropSeq{
+ comphelper::makePropertyValue(ITEM_DESCRIPTOR_COMMANDURL, pEntry->GetCommand()),
+ comphelper::makePropertyValue(ITEM_DESCRIPTOR_TYPE, css::ui::ItemType::DEFAULT),
+ comphelper::makePropertyValue(ITEM_DESCRIPTOR_LABEL, sLabel),
+ comphelper::makePropertyValue(ITEM_DESCRIPTOR_STYLE,
+ static_cast<sal_Int16>(pEntry->GetStyle()))
+ };
+
+ return aPropSeq;
+}
+
+css::uno::Sequence<css::beans::PropertyValue>
+SvxConfigPageHelper::ConvertToolbarEntry(const SvxConfigEntry* pEntry)
+{
+ // If the name has not been changed, then the label can be stored
+ // as an empty string.
+ // It will be initialised again later using the command to label map.
+ OUString sLabel;
+ if (pEntry->HasChangedName() || pEntry->GetCommand().isEmpty())
+ sLabel = pEntry->GetName();
+
+ css::uno::Sequence<css::beans::PropertyValue> aPropSeq{
+ comphelper::makePropertyValue(ITEM_DESCRIPTOR_COMMANDURL, pEntry->GetCommand()),
+ comphelper::makePropertyValue(ITEM_DESCRIPTOR_TYPE, css::ui::ItemType::DEFAULT),
+ comphelper::makePropertyValue(ITEM_DESCRIPTOR_LABEL, sLabel),
+ comphelper::makePropertyValue(ITEM_DESCRIPTOR_ISVISIBLE, pEntry->IsVisible()),
+ comphelper::makePropertyValue(ITEM_DESCRIPTOR_STYLE,
+ static_cast<sal_Int16>(pEntry->GetStyle()))
+ };
+
+ return aPropSeq;
+}
+
+bool SvxConfigPageHelper::EntrySort(SvxConfigEntry const* a, SvxConfigEntry const* b)
+{
+ return a->GetName().compareTo(b->GetName()) < 0;
+}
+
+bool SvxConfigPageHelper::SvxConfigEntryModified(SvxConfigEntry const* pEntry)
+{
+ SvxEntries* pEntries = pEntry->GetEntries();
+ if (!pEntries)
+ return false;
+
+ for (const auto& entry : *pEntries)
+ {
+ if (entry->IsModified() || SvxConfigEntryModified(entry))
+ return true;
+ }
+ return false;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */