diff options
author | Shivam Kumar Singh <shivamhere247@gmail.com> | 2020-05-29 13:10:52 +0530 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2020-06-25 10:17:07 +0200 |
commit | 006c65bbd472cb1d7d44e095714e28190b76be0d (patch) | |
tree | d00ce5bea53f78464804c2b50ce0f105aa5b9494 /sw | |
parent | 01e37e3e5626551b6e8d261e357afcea1ba7c758 (diff) |
Get the property dump of the text at the cursor
We need the property dump consisting of
1) Character Properties
2) Paragraph Properties
3) Character Style Properties
4) Paragraph Style Properties
This patch gives all the properties related to 'Character Styles'
at the cursor.
This patch manages inheritance features, which means, it lists
any property only at that level in which the property has been
redefined for the last time.
Change-Id: Ice2ae9ac92aec4af9d395885e06602753e636457
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/95094
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/source/uibase/sidebar/SwPanelFactory.cxx | 2 | ||||
-rw-r--r-- | sw/source/uibase/sidebar/WriterInspectorTextPanel.cxx | 182 | ||||
-rw-r--r-- | sw/source/uibase/sidebar/WriterInspectorTextPanel.hxx | 25 |
3 files changed, 196 insertions, 13 deletions
diff --git a/sw/source/uibase/sidebar/SwPanelFactory.cxx b/sw/source/uibase/sidebar/SwPanelFactory.cxx index b073b2801733..b3d1bbf6932f 100644 --- a/sw/source/uibase/sidebar/SwPanelFactory.cxx +++ b/sw/source/uibase/sidebar/SwPanelFactory.cxx @@ -172,7 +172,7 @@ Reference<ui::XUIElement> SAL_CALL SwPanelFactory::createUIElement ( } else if (rsResourceURL.endsWith("/WriterInspectorTextPanel")) { - VclPtr<vcl::Window> pPanel = sw::sidebar::WriterInspectorTextPanel::Create( pParentWindow, xFrame); + VclPtr<vcl::Window> pPanel = sw::sidebar::WriterInspectorTextPanel::Create( pParentWindow, xFrame, pBindings); xElement = sfx2::sidebar::SidebarPanelBase::Create( rsResourceURL, xFrame, diff --git a/sw/source/uibase/sidebar/WriterInspectorTextPanel.cxx b/sw/source/uibase/sidebar/WriterInspectorTextPanel.cxx index c0fc42be0ac4..10277c7eabe4 100644 --- a/sw/source/uibase/sidebar/WriterInspectorTextPanel.cxx +++ b/sw/source/uibase/sidebar/WriterInspectorTextPanel.cxx @@ -18,16 +18,24 @@ */ #include "WriterInspectorTextPanel.hxx" - +#include <svx/svxids.hrc> +#include <doc.hxx> +#include <docsh.hxx> +#include <wrtsh.hxx> +#include <com/sun/star/text/XTextRange.hpp> +#include <com/sun/star/text/XTextCursor.hpp> +#include <com/sun/star/awt/FontSlant.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/style/XStyleFamiliesSupplier.hpp> #include <com/sun/star/lang/IllegalArgumentException.hpp> -using namespace css; +#include <unotextrange.hxx> namespace sw::sidebar { -VclPtr<vcl::Window> -WriterInspectorTextPanel::Create(vcl::Window* pParent, - const css::uno::Reference<css::frame::XFrame>& rxFrame) +VclPtr<vcl::Window> WriterInspectorTextPanel::Create(vcl::Window* pParent, + const uno::Reference<frame::XFrame>& rxFrame, + SfxBindings* pBindings) { if (pParent == nullptr) throw lang::IllegalArgumentException( @@ -35,17 +43,175 @@ WriterInspectorTextPanel::Create(vcl::Window* pParent, if (!rxFrame.is()) throw lang::IllegalArgumentException("no XFrame given to WriterInspectorTextPanel::Create", nullptr, 1); + if (pBindings == nullptr) + throw lang::IllegalArgumentException( + "no SfxBindings given to WriterInspectorTextPanel::Create", nullptr, 2); - return VclPtr<WriterInspectorTextPanel>::Create(pParent, rxFrame); + return VclPtr<WriterInspectorTextPanel>::Create(pParent, rxFrame, pBindings); } -WriterInspectorTextPanel::WriterInspectorTextPanel( - vcl::Window* pParent, const css::uno::Reference<css::frame::XFrame>& rxFrame) + +WriterInspectorTextPanel::WriterInspectorTextPanel(vcl::Window* pParent, + const uno::Reference<frame::XFrame>& rxFrame, + SfxBindings* pBindings) : InspectorTextPanel(pParent, rxFrame) + , maCharStyle(SID_STYLE_FAMILY1, *pBindings, *this) +{ +} + +void WriterInspectorTextPanel::NotifyItemUpdate(const sal_uInt16 nSId, + const SfxItemState /*eState*/, + const SfxPoolItem* /*pState*/) { + SwDocShell* pDocSh = static_cast<SwDocShell*>(SfxObjectShell::Current()); std::vector<OUString> store; + switch (nSId) + { + case SID_STYLE_FAMILY1: + { + if (pDocSh) + { + SwDoc* pDoc = pDocSh->GetDoc(); + SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); + + uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier( + pDocSh->GetBaseModel(), uno::UNO_QUERY); + uno::Reference<container::XNameAccess> xStyleFamilies + = xStyleFamiliesSupplier->getStyleFamilies(); + uno::Reference<container::XNameAccess> xStyleFamily( + xStyleFamilies->getByName("CharacterStyles"), uno::UNO_QUERY); + + uno::Reference<text::XTextCursor> xCursor + = dynamic_cast<text::XTextCursor*>(pCursor); + uno::Reference<text::XTextRange> xRange( + SwXTextRange::CreateXTextRange(*pDoc, *pCursor->GetPoint(), nullptr)); + uno::Reference<beans::XPropertySet> properties(xRange, uno::UNO_QUERY_THROW); + + OUString aCurrentStyleName, aDisplayName; + properties->getPropertyValue("CharStyleName") >>= aCurrentStyleName; + std::vector<OUString> aStyleNames; + std::unordered_map<OUString, bool> maRedefined; + if (aCurrentStyleName.isEmpty()) + aCurrentStyleName = "Standard"; + + while (true) + { + const uno::Reference<style::XStyle> xProp1( + xStyleFamily->getByName(aCurrentStyleName), uno::UNO_QUERY); + const uno::Reference<beans::XPropertySet> xProp1Set( + xStyleFamily->getByName(aCurrentStyleName), uno::UNO_QUERY); + OUString aParentCharStyle = xProp1->getParentStyle(); + xProp1Set->getPropertyValue("DisplayName") >>= aDisplayName; + if (aParentCharStyle.isEmpty()) + { + break; // when current style is "Standard" + } + const uno::Sequence<beans::Property> xProp1SetInfo + = xProp1Set->getPropertySetInfo()->getProperties(); + const uno::Reference<beans::XPropertySet> xProp2Set( + xStyleFamily->getByName(aParentCharStyle), uno::UNO_QUERY); + + try + { + for (const beans::Property& rProperty : xProp1SetInfo) + { + if (maRedefined[rProperty.Name]) + continue; + if (xProp1Set->getPropertyValue(rProperty.Name) + != xProp2Set->getPropertyValue(rProperty.Name)) + { + OUString aPropertyValuePair; + const uno::Any aAny = xProp1Set->getPropertyValue(rProperty.Name); + maRedefined[rProperty.Name] = true; + WriterInspectorTextPanel::GetPropertyValues(rProperty, aAny, + aPropertyValuePair); + if (!aPropertyValuePair.isEmpty()) + aStyleNames.push_back(" " + aPropertyValuePair); + } + } + } + catch (const uno::Exception&) + { + //do nothing + } + + aStyleNames.push_back(aDisplayName); + aCurrentStyleName = aParentCharStyle; + } + + const uno::Reference<beans::XPropertySet> xStyleProps( + xStyleFamily->getByName(aDisplayName), uno::UNO_QUERY); + const uno::Sequence<beans::Property> xPropVal + = xStyleProps->getPropertySetInfo()->getProperties(); + for (const beans::Property& rProperty : xPropVal) + { + OUString aPropertyValuePair; + const uno::Any aAny = xStyleProps->getPropertyValue(rProperty.Name); + if (maRedefined[rProperty.Name]) + continue; + WriterInspectorTextPanel::GetPropertyValues(rProperty, aAny, + aPropertyValuePair); + if (!aPropertyValuePair.isEmpty()) + aStyleNames.push_back(" " + aPropertyValuePair); + } + aStyleNames.push_back(" " + aDisplayName); + + // Top Parent goes first, then its properties, then child styles...current style goes last + for (auto itr = aStyleNames.rbegin(); itr != aStyleNames.rend(); ++itr) + { + store.push_back(*itr); + } + } + } + break; + } InspectorTextPanel::updateEntries(store); } +void WriterInspectorTextPanel::GetPropertyValues(const beans::Property rProperty, + const uno::Any& rAny, OUString& rString) +{ + OUString aValue; + double fValue; + bool bValue; + short sValue; + long lValue; + awt::FontSlant iValue; + + rString = rProperty.Name + " "; + + if (rAny >>= bValue) + { + rString += OUString::boolean(bValue); + } + else if ((rAny >>= aValue) && !(aValue.isEmpty())) + { + rString += aValue; + } + else if (rAny >>= iValue) + { + rString += (iValue == awt::FontSlant_ITALIC) ? OUStringLiteral("italic") + : OUStringLiteral("normal"); + } + else if ((rAny >>= fValue) || fValue) + { + if (rString == "CharWeight ") + rString += (fValue > 100) ? OUStringLiteral("bold") : OUStringLiteral("normal"); + else + rString += OUString::number((round(fValue * 100)) / 100.00); + } + else if ((rAny >>= sValue) || sValue) + { + rString += OUString::number(sValue); + } + else if ((rAny >>= lValue) || lValue) + { + if (rString == "CharColor ") + rString += OUString::number(sal_Int16(lValue)); + else + rString += OUString::number(lValue); + } +} + } // end of namespace svx::sidebar /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/uibase/sidebar/WriterInspectorTextPanel.hxx b/sw/source/uibase/sidebar/WriterInspectorTextPanel.hxx index 85b8dc7a9f2f..d99b6c5a6f0f 100644 --- a/sw/source/uibase/sidebar/WriterInspectorTextPanel.hxx +++ b/sw/source/uibase/sidebar/WriterInspectorTextPanel.hxx @@ -19,22 +19,39 @@ #pragma once #include <sfx2/weldutils.hxx> -#include <svx/sidebar/InspectorTextPanel.hxx> +#include <sfx2/sidebar/ControllerItem.hxx> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <svx/sidebar/InspectorTextPanel.hxx> namespace sw { namespace sidebar { -class WriterInspectorTextPanel final : public svx::sidebar::InspectorTextPanel +class WriterInspectorTextPanel final + : public svx::sidebar::InspectorTextPanel, + public sfx2::sidebar::ControllerItem::ItemUpdateReceiverInterface { public: static VclPtr<vcl::Window> Create(vcl::Window* pParent, - const css::uno::Reference<css::frame::XFrame>& rxFrame); + const css::uno::Reference<css::frame::XFrame>& rxFrame, + SfxBindings* pBindings); WriterInspectorTextPanel(vcl::Window* pParent, - const css::uno::Reference<css::frame::XFrame>& rxFrame); + const css::uno::Reference<css::frame::XFrame>& rxFrame, + SfxBindings* pBindings); // virtual ~WriterInspectorTextPanel(); + virtual void NotifyItemUpdate(const sal_uInt16 nSId, const SfxItemState eState, + const SfxPoolItem* pState) override; + + virtual void GetControlState(const sal_uInt16 /*nSId*/, + boost::property_tree::ptree& /*rState*/) override{}; + +private: + sfx2::sidebar::ControllerItem maCharStyle; + + static void GetPropertyValues(const css::beans::Property rProperty, const css::uno::Any& rAny, + OUString& rString); }; } } // end of namespace svx::sidebar |