sc/UIConfig_scalc.mk                       |    1 
 sc/inc/scabstdlg.hxx                       |    5 
 sc/inc/styleuno.hxx                        |    2 
 sc/inc/unonames.hxx                        |    1 
 sc/source/ui/attrdlg/scdlgfact.cxx         |    7 
 sc/source/ui/attrdlg/scdlgfact.hxx         |    4 
 sc/source/ui/inc/styledlg.hxx              |   16 
 sc/source/ui/styleui/styledlg.cxx          |  102 +++
 sc/source/ui/unoobj/shapeuno.cxx           |   33 +
 sc/source/ui/view/tabvwsha.cxx             |    7 
 sc/uiconfig/scalc/ui/drawtemplatedialog.ui |  847 +++++++++++++++++++++++++++++
 11 files changed, 1023 insertions(+), 2 deletions(-)

New commits:
commit ca487e3f4c0f97c14bcff3a5372717d47f32ee94
Author:     Maxim Monastirsky <momonas...@gmail.com>
AuthorDate: Fri Mar 17 14:42:20 2023 +0200
Commit:     Maxim Monastirsky <momonas...@gmail.com>
CommitDate: Wed Mar 22 10:16:12 2023 +0000

    sc drawstyles: Add a dialog for style editing
    
    Change-Id: I7e62251024df8f24bd6fe318f5c0262bbd6a1a11
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/149279
    Tested-by: Jenkins
    Reviewed-by: Maxim Monastirsky <momonas...@gmail.com>

diff --git a/sc/UIConfig_scalc.mk b/sc/UIConfig_scalc.mk
index 13a4b98a6c7c..d83aa96dbaa1 100644
--- a/sc/UIConfig_scalc.mk
+++ b/sc/UIConfig_scalc.mk
@@ -121,6 +121,7 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/scalc,\
        sc/uiconfig/scalc/ui/deletecolumnentry \
        sc/uiconfig/scalc/ui/deletecontents \
        sc/uiconfig/scalc/ui/descriptivestatisticsdialog \
+       sc/uiconfig/scalc/ui/drawtemplatedialog \
        sc/uiconfig/scalc/ui/dropmenu \
        sc/uiconfig/scalc/ui/doubledialog \
        sc/uiconfig/scalc/ui/erroralerttabpage \
diff --git a/sc/inc/scabstdlg.hxx b/sc/inc/scabstdlg.hxx
index 9901d48bd610..1868964e9bd0 100644
--- a/sc/inc/scabstdlg.hxx
+++ b/sc/inc/scabstdlg.hxx
@@ -43,6 +43,7 @@ class ScTabViewShell;
 class ScConditionalFormat;
 class ScConditionalFormatList;
 class Date;
+class SdrView;
 enum class CreateNameFlags;
 enum class CellShiftDisabledFlags;
 
@@ -551,6 +552,10 @@ public:
                                                           SfxStyleSheetBase&  
rStyleBase,
                                                           bool bPage /*true : 
page, false: para*/) = 0;
 
+    virtual VclPtr<SfxAbstractTabDialog> CreateScDrawStyleDlg(weld::Window* 
pParent,
+                                                              
SfxStyleSheetBase& rStyleBase,
+                                                              SdrView* pView) 
= 0;
+
     virtual VclPtr<SfxAbstractTabDialog> CreateScSubTotalDlg(weld::Window* 
pParent,
                                                              const SfxItemSet& 
rArgSet) = 0;
 
diff --git a/sc/source/ui/attrdlg/scdlgfact.cxx 
b/sc/source/ui/attrdlg/scdlgfact.cxx
index 0eca6bafb8a7..d0db6f84505a 100644
--- a/sc/source/ui/attrdlg/scdlgfact.cxx
+++ b/sc/source/ui/attrdlg/scdlgfact.cxx
@@ -1328,6 +1328,13 @@ VclPtr<SfxAbstractTabDialog> 
ScAbstractDialogFactory_Impl::CreateScStyleDlg(weld
     return 
VclPtr<ScAbstractTabController_Impl>::Create(std::make_shared<ScStyleDlg>(pParent,
 rStyleBase, bPage));
 }
 
+VclPtr<SfxAbstractTabDialog> 
ScAbstractDialogFactory_Impl::CreateScDrawStyleDlg(weld::Window* pParent,
+                                                                               
 SfxStyleSheetBase& rStyleBase,
+                                                                               
 SdrView* pView)
+{
+    return 
VclPtr<ScAbstractTabController_Impl>::Create(std::make_shared<ScDrawStyleDlg>(pParent,
 rStyleBase, pView));
+}
+
 VclPtr<SfxAbstractTabDialog> 
ScAbstractDialogFactory_Impl::CreateScSubTotalDlg(weld::Window* pParent, const 
SfxItemSet& rArgSet)
 {
     return 
VclPtr<ScAbstractTabController_Impl>::Create(std::make_shared<ScSubTotalDlg>(pParent,
 rArgSet));
diff --git a/sc/source/ui/attrdlg/scdlgfact.hxx 
b/sc/source/ui/attrdlg/scdlgfact.hxx
index e39428018287..855abeecf1c8 100644
--- a/sc/source/ui/attrdlg/scdlgfact.hxx
+++ b/sc/source/ui/attrdlg/scdlgfact.hxx
@@ -791,6 +791,10 @@ public:
                                                           SfxStyleSheetBase& 
rStyleBase,
                                                           bool bPage) override;
 
+    virtual VclPtr<SfxAbstractTabDialog> CreateScDrawStyleDlg(weld::Window* 
pParent,
+                                                              
SfxStyleSheetBase& rStyleBase,
+                                                              SdrView* pView) 
override;
+
     virtual VclPtr<SfxAbstractTabDialog> CreateScSubTotalDlg(weld::Window* 
pParent,
                                                              const SfxItemSet& 
rArgSet) override;
     virtual VclPtr<SfxAbstractTabDialog> CreateScCharDlg(weld::Window* pParent,
diff --git a/sc/source/ui/inc/styledlg.hxx b/sc/source/ui/inc/styledlg.hxx
index 2f43e04745a6..736849ef963d 100644
--- a/sc/source/ui/inc/styledlg.hxx
+++ b/sc/source/ui/inc/styledlg.hxx
@@ -22,6 +22,7 @@
 #include <sfx2/styledlg.hxx>
 
 class SfxStyleSheetBase;
+class SdrView;
 
 class ScStyleDlg : public SfxStyleDialogController
 {
@@ -38,4 +39,19 @@ private:
     bool m_bPage;
 };
 
+class ScDrawStyleDlg : public SfxStyleDialogController
+{
+public:
+    ScDrawStyleDlg(weld::Window* pParent,
+                   SfxStyleSheetBase& rStyleBase,
+                   SdrView* pView);
+
+protected:
+    virtual void PageCreated(const OString& rPageId, SfxTabPage& rTabPage) 
override;
+    virtual void RefreshInputSet() override;
+
+private:
+    SdrView* mpView;
+};
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/styleui/styledlg.cxx 
b/sc/source/ui/styleui/styledlg.cxx
index d814654e5008..206d852cf46a 100644
--- a/sc/source/ui/styleui/styledlg.cxx
+++ b/sc/source/ui/styleui/styledlg.cxx
@@ -19,6 +19,9 @@
 
 #undef SC_DLLIMPLEMENTATION
 
+#include <svx/drawitem.hxx>
+#include <svx/ofaitem.hxx>
+#include <svx/svdview.hxx>
 #include <svx/numinf.hxx>
 #include <sfx2/objsh.hxx>
 #include <sfx2/sfxdlg.hxx>
@@ -136,4 +139,103 @@ void ScStyleDlg::RefreshInputSet()
     pItemSet->SetParent( GetStyleSheet().GetItemSet().GetParent() );
 }
 
+ScDrawStyleDlg::ScDrawStyleDlg(weld::Window* pParent, SfxStyleSheetBase& 
rStyleBase, SdrView* pView)
+    : SfxStyleDialogController(pParent, 
"modules/scalc/ui/drawtemplatedialog.ui", "DrawTemplateDialog", rStyleBase)
+    , mpView(pView)
+{
+    AddTabPage("line", RID_SVXPAGE_LINE);
+    AddTabPage("area", RID_SVXPAGE_AREA);
+    AddTabPage("shadowing", RID_SVXPAGE_SHADOW);
+    AddTabPage("transparency", RID_SVXPAGE_TRANSPARENCE);
+    AddTabPage("font", RID_SVXPAGE_CHAR_NAME);
+    AddTabPage("fonteffect", RID_SVXPAGE_CHAR_EFFECTS);
+    AddTabPage("background", RID_SVXPAGE_BKG);
+    AddTabPage("indents", RID_SVXPAGE_STD_PARAGRAPH);
+    AddTabPage("text", RID_SVXPAGE_TEXTATTR);
+    AddTabPage("animation", RID_SVXPAGE_TEXTANIMATION);
+    AddTabPage("dimensioning", RID_SVXPAGE_MEASURE);
+    AddTabPage("alignment", RID_SVXPAGE_ALIGN_PARAGRAPH);
+    AddTabPage("tabs", RID_SVXPAGE_TABULATOR);
+    if (SvtCJKOptions::IsAsianTypographyEnabled())
+        AddTabPage("asiantypo", RID_SVXPAGE_PARA_ASIAN);
+    else
+        RemoveTabPage("asiantypo");
+}
+
+void ScDrawStyleDlg::PageCreated(const OString& rPageId, SfxTabPage& rTabPage)
+{
+    SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool()));
+    SdrModel& rModel = mpView->GetModel();
+
+    if (rPageId == "line")
+    {
+        aSet.Put(SvxColorListItem(rModel.GetColorList(), SID_COLOR_TABLE));
+        aSet.Put(SvxDashListItem(rModel.GetDashList(), SID_DASH_LIST));
+        aSet.Put(SvxLineEndListItem(rModel.GetLineEndList(), 
SID_LINEEND_LIST));
+        aSet.Put(SfxUInt16Item(SID_DLG_TYPE, 1));
+        rTabPage.PageCreated(aSet);
+    }
+    else if (rPageId == "area")
+    {
+        aSet.Put(SvxColorListItem(rModel.GetColorList(), SID_COLOR_TABLE));
+        aSet.Put(SvxGradientListItem(rModel.GetGradientList(), 
SID_GRADIENT_LIST));
+        aSet.Put(SvxHatchListItem(rModel.GetHatchList(), SID_HATCH_LIST));
+        aSet.Put(SvxBitmapListItem(rModel.GetBitmapList(), SID_BITMAP_LIST));
+        aSet.Put(SvxPatternListItem(rModel.GetPatternList(), 
SID_PATTERN_LIST));
+        aSet.Put(SfxUInt16Item(SID_PAGE_TYPE, 0));
+        aSet.Put(SfxUInt16Item(SID_DLG_TYPE, 1));
+        aSet.Put(SfxUInt16Item(SID_TABPAGE_POS, 0));
+        rTabPage.PageCreated(aSet);
+    }
+    else if (rPageId == "shadowing")
+    {
+        aSet.Put(SvxColorListItem(rModel.GetColorList(), SID_COLOR_TABLE));
+        aSet.Put(SfxUInt16Item(SID_PAGE_TYPE, 0));
+        aSet.Put(SfxUInt16Item(SID_DLG_TYPE, 1));
+        rTabPage.PageCreated(aSet);
+    }
+    else if (rPageId == "transparency")
+    {
+        aSet.Put (SfxUInt16Item(SID_PAGE_TYPE, 0));
+        aSet.Put (SfxUInt16Item(SID_DLG_TYPE, 1));
+        rTabPage.PageCreated(aSet);
+    }
+    else if (rPageId == "font")
+    {
+        if (SfxObjectShell* pDocSh = SfxObjectShell::Current())
+        {
+            SvxFontListItem aItem(*static_cast<const SvxFontListItem*>(
+                pDocSh->GetItem(SID_ATTR_CHAR_FONTLIST)));
+
+            aSet.Put(SvxFontListItem(aItem.GetFontList(), 
SID_ATTR_CHAR_FONTLIST));
+        }
+        rTabPage.PageCreated(aSet);
+    }
+    else if (rPageId == "fonteffect")
+    {
+        rTabPage.PageCreated(aSet);
+    }
+    else if (rPageId == "background")
+    {
+        aSet.Put(SfxUInt32Item(SID_FLAG_TYPE, 
static_cast<sal_uInt32>(SvxBackgroundTabFlags::SHOW_CHAR_BKGCOLOR)));
+        rTabPage.PageCreated(aSet);
+    }
+    else if (rPageId == "text")
+    {
+        rTabPage.PageCreated(aSet);
+    }
+    else if (rPageId == "dimensioning")
+    {
+        aSet.Put(OfaPtrItem(SID_OBJECT_LIST, mpView));
+        rTabPage.PageCreated(aSet);
+    }
+}
+
+void ScDrawStyleDlg::RefreshInputSet()
+{
+    SfxItemSet* pItemSet = GetInputSetImpl();
+    pItemSet->ClearItem();
+    pItemSet->SetParent( GetStyleSheet().GetItemSet().GetParent() );
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/view/tabvwsha.cxx b/sc/source/ui/view/tabvwsha.cxx
index 62bfe8835b7e..9bcf40828ba6 100644
--- a/sc/source/ui/view/tabvwsha.cxx
+++ b/sc/source/ui/view/tabvwsha.cxx
@@ -1522,7 +1522,12 @@ void ScTabViewShell::ExecStyle( SfxRequest& rReq )
             weld::Window* pDialogParent = rReq.GetFrameWeld();
             if (!pDialogParent)
                 pDialogParent = GetFrameWeld();
-            pDlg.disposeAndReset(pFact->CreateScStyleDlg(pDialogParent, 
*pStyleSheet, bPage));
+
+            if (eFam == SfxStyleFamily::Frame)
+                
pDlg.disposeAndReset(pFact->CreateScDrawStyleDlg(pDialogParent, *pStyleSheet, 
GetDrawView()));
+            else
+                pDlg.disposeAndReset(pFact->CreateScStyleDlg(pDialogParent, 
*pStyleSheet, bPage));
+
             short nResult = pDlg->Execute();
             SetInFormatDialog(false);
 
diff --git a/sc/uiconfig/scalc/ui/drawtemplatedialog.ui 
b/sc/uiconfig/scalc/ui/drawtemplatedialog.ui
new file mode 100644
index 000000000000..2a2ca1f3e632
--- /dev/null
+++ b/sc/uiconfig/scalc/ui/drawtemplatedialog.ui
@@ -0,0 +1,847 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sc">
+  <requires lib="gtk+" version="3.20"/>
+  <object class="GtkDialog" id="DrawTemplateDialog">
+    <property name="can_focus">False</property>
+    <property name="border_width">6</property>
+    <property name="title" translatable="yes" 
context="drawtemplatedialog|DrawTemplateDialog">Drawing Style</property>
+    <property name="modal">True</property>
+    <property name="default_width">0</property>
+    <property name="default_height">0</property>
+    <property name="type_hint">dialog</property>
+    <child>
+      <placeholder/>
+    </child>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="dialog-vbox1">
+        <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">12</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox" id="dialog-action_area1">
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="reset">
+                <property name="label" translatable="yes" 
context="stock">_Reset</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use-underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="standard">
+                <property name="label" translatable="yes" 
context="drawtemplatedialog|standard">_Standard</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="ok">
+                <property name="label" translatable="yes" 
context="stock">_OK</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="use-underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="cancel">
+                <property name="label" translatable="yes" 
context="stock">_Cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use-underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">3</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="help">
+                <property name="label" translatable="yes" 
context="stock">_Help</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use-underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">4</property>
+                <property name="secondary">True</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkNotebook" id="tabcontrol">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="hexpand">True</property>
+            <property name="vexpand">True</property>
+            <property name="scrollable">True</property>
+            <property name="enable_popup">True</property>
+            <child>
+              <!-- n-columns=1 n-rows=1 -->
+              <object class="GtkGrid">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="organizer">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes" 
context="drawtemplatedialog|organizer">Organizer</property>
+              </object>
+              <packing>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <!-- n-columns=1 n-rows=1 -->
+              <object class="GtkGrid">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="line">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="label" translatable="yes" 
context="drawtemplatedialog|line">Line</property>
+              </object>
+              <packing>
+                <property name="position">1</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <!-- n-columns=1 n-rows=1 -->
+              <object class="GtkGrid">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="area">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes" 
context="drawtemplatedialog|area">Area</property>
+              </object>
+              <packing>
+                <property name="position">2</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <!-- n-columns=1 n-rows=1 -->
+              <object class="GtkGrid">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="position">3</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="shadowing">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="label" translatable="yes" 
context="drawtemplatedialog|shadowing">Shadowing</property>
+              </object>
+              <packing>
+                <property name="position">3</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <!-- n-columns=1 n-rows=1 -->
+              <object class="GtkGrid">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="position">4</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="transparency">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes" 
context="drawtemplatedialog|transparency">Transparency</property>
+              </object>
+              <packing>
+                <property name="position">4</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <!-- n-columns=1 n-rows=1 -->
+              <object class="GtkGrid">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="position">5</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="font">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes" 
context="drawtemplatedialog|font">Font</property>
+              </object>
+              <packing>
+                <property name="position">5</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <!-- n-columns=1 n-rows=1 -->
+              <object class="GtkGrid">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="position">6</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="fonteffect">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes" 
context="drawtemplatedialog|fonteffect">Font Effects</property>
+              </object>
+              <packing>
+                <property name="position">6</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <!-- n-columns=1 n-rows=1 -->
+              <object class="GtkGrid">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="position">7</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="indents">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes" 
context="drawtemplatedialog|indents">Indents &amp; Spacing</property>
+              </object>
+              <packing>
+                <property name="position">7</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <!-- n-columns=1 n-rows=1 -->
+              <object class="GtkGrid">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="position">8</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="text">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes" 
context="drawtemplatedialog|text">Text</property>
+              </object>
+              <packing>
+                <property name="position">8</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <!-- n-columns=1 n-rows=1 -->
+              <object class="GtkGrid">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="position">9</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="animation">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes" 
context="drawtemplatedialog|animation">Text Animation</property>
+              </object>
+              <packing>
+                <property name="position">9</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <!-- n-columns=1 n-rows=1 -->
+              <object class="GtkGrid">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="position">10</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="dimensioning">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes" 
context="drawtemplatedialog|dimensioning">Dimensioning</property>
+              </object>
+              <packing>
+                <property name="position">10</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <!-- n-columns=1 n-rows=1 -->
+              <object class="GtkGrid">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="position">11</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="alignment">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes" 
context="drawtemplatedialog|alignment">Alignment</property>
+              </object>
+              <packing>
+                <property name="position">11</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <!-- n-columns=1 n-rows=1 -->
+              <object class="GtkGrid">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="position">12</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="asiantypo">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes" 
context="drawtemplatedialog|asiantypo">Asian Typography</property>
+              </object>
+              <packing>
+                <property name="position">12</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <!-- n-columns=1 n-rows=1 -->
+              <object class="GtkGrid">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="position">13</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="tabs">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes" 
context="drawtemplatedialog|tabs">Tabs</property>
+              </object>
+              <packing>
+                <property name="position">13</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <!-- n-columns=1 n-rows=1 -->
+              <object class="GtkGrid">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="position">14</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="background">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes" 
context="drawtemplatedialog|background">Highlighting</property>
+              </object>
+              <packing>
+                <property name="position">14</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="101">reset</action-widget>
+      <action-widget response="102">standard</action-widget>
+      <action-widget response="-5">ok</action-widget>
+      <action-widget response="-6">cancel</action-widget>
+      <action-widget response="-11">help</action-widget>
+    </action-widgets>
+  </object>
+</interface>
commit debf3e06bc5330b227dc9dd55e49930cb3da522a
Author:     Maxim Monastirsky <momonas...@gmail.com>
AuthorDate: Fri Mar 17 14:51:25 2023 +0200
Commit:     Maxim Monastirsky <momonas...@gmail.com>
CommitDate: Wed Mar 22 10:16:03 2023 +0000

    sc drawstyles: Add a style UNO property to shapes
    
    Change-Id: I5c8eb3c3e182d9efefc385020b97d768e615a20a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/149278
    Tested-by: Jenkins
    Reviewed-by: Maxim Monastirsky <momonas...@gmail.com>

diff --git a/sc/inc/styleuno.hxx b/sc/inc/styleuno.hxx
index d19feed3563a..07bf2cb7b12d 100644
--- a/sc/inc/styleuno.hxx
+++ b/sc/inc/styleuno.hxx
@@ -170,7 +170,6 @@ private:
     OUString                aStyleName;
     SfxStyleSheetBase*      pStyle_cached;
 
-    SfxStyleSheetBase*      GetStyle_Impl( bool bUseCachedValue = false );
     const SfxItemSet*       GetStyleItemSet_Impl( std::u16string_view 
rPropName, const SfxItemPropertyMapEntry*& rpEntry );
     /// @throws css::beans::UnknownPropertyException
     /// @throws css::uno::RuntimeException
@@ -198,6 +197,7 @@ public:
     bool                    IsInserted() const      { return pDocShell != 
nullptr; }
     SfxStyleFamily          GetFamily() const       { return eFamily; }
     void                    InitDoc( ScDocShell* pNewDocSh, const OUString& 
rNewName );
+    SfxStyleSheetBase*      GetStyle_Impl( bool bUseCachedValue = false );
 
     virtual void            Notify( SfxBroadcaster& rBC, const SfxHint& rHint 
) override;
 
diff --git a/sc/inc/unonames.hxx b/sc/inc/unonames.hxx
index abb09c334c10..4617bcf46700 100644
--- a/sc/inc/unonames.hxx
+++ b/sc/inc/unonames.hxx
@@ -198,6 +198,7 @@ inline constexpr OUStringLiteral SC_UNONAME_HORIPOS         
 = u"HoriOrientPosit
 inline constexpr OUStringLiteral SC_UNONAME_VERTPOS          = 
u"VertOrientPosition";
 inline constexpr OUStringLiteral SC_UNONAME_HYPERLINK        = u"Hyperlink";
 inline constexpr OUStringLiteral SC_UNONAME_MOVEPROTECT      = u"MoveProtect";
+inline constexpr OUStringLiteral SC_UNONAME_STYLE            = u"Style";
 
 //  other cell properties
 inline constexpr OUStringLiteral SC_UNONAME_CHCOLHDR         = 
u"ChartColumnAsLabel";
diff --git a/sc/source/ui/unoobj/shapeuno.cxx b/sc/source/ui/unoobj/shapeuno.cxx
index 2dfd6ca10701..67931eab9a83 100644
--- a/sc/source/ui/unoobj/shapeuno.cxx
+++ b/sc/source/ui/unoobj/shapeuno.cxx
@@ -33,6 +33,7 @@
 #include <cppuhelper/supportsservice.hxx>
 #include <comphelper/diagnose_ex.hxx>
 
+#include <com/sun/star/beans/PropertyAttribute.hpp>
 #include <com/sun/star/drawing/XShape.hpp>
 #include <com/sun/star/lang/NoSupportException.hpp>
 
@@ -44,6 +45,7 @@
 #include <drwlayer.hxx>
 #include <userdat.hxx>
 #include <unonames.hxx>
+#include <styleuno.hxx>
 
 using namespace ::com::sun::star;
 
@@ -59,6 +61,7 @@ static o3tl::span<const SfxItemPropertyMapEntry> 
lcl_GetShapeMap()
         { SC_UNONAME_MOVEPROTECT, 0, cppu::UnoType<sal_Bool>::get(), 0, 0 },
         { SC_UNONAME_HYPERLINK, 0, cppu::UnoType<OUString>::get(), 0, 0 },
         { SC_UNONAME_URL, 0, cppu::UnoType<OUString>::get(), 0, 0 },
+        { SC_UNONAME_STYLE, 0, cppu::UnoType<style::XStyle>::get(), 
css::beans::PropertyAttribute::MAYBEVOID, 0 },
     };
     return aShapeMap_Impl;
 }
@@ -649,6 +652,22 @@ void SAL_CALL ScShapeObj::setPropertyValue(const OUString& 
aPropertyName, const
                 pObj->SetMoveProtect( aProt );
         }
     }
+    else if ( aPropertyName == SC_UNONAME_STYLE )
+    {
+        if (SdrObject* pObj = GetSdrObject())
+        {
+            uno::Reference<style::XStyle> xStyle(aValue, uno::UNO_QUERY);
+            auto pStyleSheetObj = dynamic_cast<ScStyleObj*>(xStyle.get());
+            if (!pStyleSheetObj)
+                throw lang::IllegalArgumentException();
+
+            auto pStyleSheet = pStyleSheetObj->GetStyle_Impl();
+            auto pOldStyleSheet = pObj->GetStyleSheet();
+
+            if (pStyleSheet != pOldStyleSheet)
+                pObj->SetStyleSheet(static_cast<SfxStyleSheet*>(pStyleSheet), 
false);
+        }
+    }
     else
     {
         GetShapePropertySet();
@@ -843,6 +862,20 @@ uno::Any SAL_CALL ScShapeObj::getPropertyValue( const 
OUString& aPropertyName )
             aProt = pObj->IsMoveProtect();
         aAny <<= aProt;
     }
+    else if ( aPropertyName == SC_UNONAME_STYLE )
+    {
+        if (SdrObject* pObj = GetSdrObject())
+        {
+            if (auto pStyleSheet = pObj->GetStyleSheet())
+            {
+                ScDrawLayer& rModel(static_cast< ScDrawLayer& 
>(pObj->getSdrModelFromSdrObject()));
+                ScDocument* pDoc = rModel.GetDocument();
+                aAny <<= uno::Reference<style::XStyle>(new ScStyleObj(
+                    static_cast<ScDocShell*>(pDoc ? pDoc->GetDocumentShell() : 
nullptr),
+                    SfxStyleFamily::Frame, pStyleSheet->GetName()));
+            }
+        }
+    }
     else
     {
         if(!pShapePropertySet) //performance consideration

Reply via email to