desktop/source/lib/init.cxx      |  266 +-----------------
 include/sfx2/lokunocmdlist.hxx   |   52 +++
 sd/inc/app.hrc                   |    2 
 sd/inc/sdpage.hxx                |    3 
 sd/qa/unit/uiimpress.cxx         |  107 +++++++
 sd/sdi/_drvwsh.sdi               |    4 
 sd/sdi/sdraw.sdi                 |   17 +
 sd/source/core/sdpage.cxx        |   22 +
 sd/source/ui/inc/unomodel.hxx    |    2 
 sd/source/ui/unoidl/unomodel.cxx |  118 ++++++++
 sd/source/ui/view/drviews2.cxx   |  490 +++++++++++++++++++++++++++++++++
 sfx2/source/control/unoctitm.cxx |  572 +++++++++++++++++++++------------------
 12 files changed, 1145 insertions(+), 510 deletions(-)

New commits:
commit f3162dd1e3afbed73ed094d5745ba747fcf089cd
Author:     Attila Szűcs <attila.sz...@collabora.com>
AuthorDate: Mon Dec 9 17:31:06 2024 +0100
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Fri Feb 14 18:01:42 2025 +0100

    SD: fillapi: slide, text, uno commands
    
    Implemented extract and transform for slides.
    It can manipulate slides and some of its text content.
    
    usable commands for transform:
    
    {"JumpToSlide": 4},   //jump to slide 4 (counted from 0) "last" can be used
    {"JumpToSlideByName": "Slide 4"},jump to slide named "Slide 4"
    {"InsertMasterSlide": 10}, //insert the 10. masterSlide after the
    actual slide, and jump to this new Slide
    {"InsertMasterSlideByName": "name"}, //same as InsertMasterSlide,
    but with parameter of masterSlide name.
    {"DeleteSlide": 2},   // delete the 2. slide. It may or may not
    change the actual slide
    can be used without parameter:
    {"DeleteSlide": ""}, // it delete the actual slide.
    {"MoveSlide.2": 5}, // move the 2. slide to the 5. position, if it is
    the actual slide, then jump to the new position of this slide.
    If it is not the actual slide then it may jump, so the actual Slide
    eill remain the same.
    {"MoveSlide": 5}, // move the actual slide to the 5. position
    {"DuplicateSlide": 5}, //duplicate the 5. slide , it jumps to the
    duplicated slide
    {"DuplicateSlide": ""}, // duplicate the actual slide
    {"ChangeLayout": 18},  // change the actual page layout
    to the 18. layout. (would be good to have a better ID)
    {"ChangeLayoutByName": "AUTOLAYOUT_TITLE_2CONTENT"}, //same as
    ChangeLayout, nbut indxed by the layout name.
    {"RenameSlide": "NewNameForSlide"}, //rename the actual slide
    {"SetText.0": "first"},  //set the text of 0. sdrobject on the
    actual page to "first"
    {"MarkObject": "1"},    //mark the 1. sdrobject on the actual slide
    {"UnMarkObject": "1"},  //Unmark the 1. sdrobject on the act slide
    {"UnoCommand": ".uno:DefaultBullet"}, //run an uno command.
    This uno command toggle the default bullet type on thext marked.
    
    There are many more uno commands.
    Limited uno commands allowed to be used here, because some would
    be dangerous.
    For allowed uno commands, check lokunocmdlist.hxx.
    
    Note: Uno commands not worked on a windows system
    
    For layout names these can be used:
    "AUTOLAYOUT_TITLE_CONTENT"
    "AUTOLAYOUT_TITLE_CONTENT_OVER_CONTENT"
    "AUTOLAYOUT_TITLE_CONTENT_2CONTENT"
    "AUTOLAYOUT_TITLE_4CONTENT"
    "AUTOLAYOUT_ONLY_TEXT"
    "AUTOLAYOUT_TITLE_ONLY"
    "AUTOLAYOUT_TITLE_6CONTENT"
    "AUTOLAYOUT_TITLE"
    "AUTOLAYOUT_TITLE_2CONTENT_CONTENT"
    "AUTOLAYOUT_TITLE_2CONTENT_OVER_CONTENT"
    "AUTOLAYOUT_TITLE_2CONTENT"
    "AUTOLAYOUT_VTITLE_VCONTENT"
    "AUTOLAYOUT_VTITLE_VCONTENT_OVER_VCONTENT"
    "AUTOLAYOUT_TITLE_VCONTENT"
    "AUTOLAYOUT_TITLE_2VTEXT"
    
    Extract will:
    Extract all masterSlides name
    Extract the following for all Slides:
    Name, MatsreSlideName, LayoutId, LayoutName, ObjectCount, Objects.
    
    For all objects it will extract:
    TextCount, Texts
    
    For all texts it will extract:
    ParaCount, Paragraphs
    
    where Paragraphs is an array of strings.
    
    Change-Id: Icab5afe44acc30f8b75974240d8b39fd040ede2f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181671
    Tested-by: Jenkins
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index f828d9e2e243..bd5eb0654614 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -153,6 +153,7 @@
 #include <sfx2/lokcomponenthelpers.hxx>
 #include <sfx2/DocumentSigner.hxx>
 #include <sfx2/sidebar/Sidebar.hxx>
+#include <sfx2/lokunocmdlist.hxx>
 #include <svl/numformat.hxx>
 #include <svx/dialmgr.hxx>
 #include <svx/strings.hrc>
@@ -3264,7 +3265,9 @@ static char* 
lo_extractDocumentStructureRequest(LibreOfficeKit* /*pThis*/, const
 
                 //if it is a writer document..
                 uno::Reference<lang::XServiceInfo> xDocument(xComp, 
uno::UNO_QUERY_THROW);
-                if 
(xDocument->supportsService(u"com.sun.star.text.TextDocument"_ustr) || 
xDocument->supportsService(u"com.sun.star.text.WebDocument"_ustr))
+                if 
(xDocument->supportsService(u"com.sun.star.text.TextDocument"_ustr)
+                    || 
xDocument->supportsService(u"com.sun.star.text.WebDocument"_ustr)
+                    || 
xDocument->supportsService(u"com.sun.star.presentation.PresentationDocument"_ustr))
                 {
                     tools::JsonWriter aJson;
                     {
@@ -3826,244 +3829,6 @@ static void doc_iniUnoCommands ()
     SolarMutexGuard aGuard;
     SetLastExceptionMsg();
 
-    static constexpr OUString sUnoCommands[] =
-    {
-        u".uno:AlignLeft"_ustr,
-        u".uno:AlignHorizontalCenter"_ustr,
-        u".uno:AlignRight"_ustr,
-        u".uno:BackgroundColor"_ustr,
-        u".uno:TableCellBackgroundColor"_ustr,
-        u".uno:Bold"_ustr,
-        u".uno:CenterPara"_ustr,
-        u".uno:CharBackColor"_ustr,
-        u".uno:CharBackgroundExt"_ustr,
-        u".uno:CharFontName"_ustr,
-        u".uno:Color"_ustr,
-        u".uno:ControlCodes"_ustr,
-        u".uno:DecrementIndent"_ustr,
-        u".uno:DefaultBullet"_ustr,
-        u".uno:DefaultNumbering"_ustr,
-        u".uno:FontColor"_ustr,
-        u".uno:FontHeight"_ustr,
-        u".uno:IncrementIndent"_ustr,
-        u".uno:Italic"_ustr,
-        u".uno:JustifyPara"_ustr,
-        u".uno:JumpToMark"_ustr,
-        u".uno:OutlineFont"_ustr,
-        u".uno:LeftPara"_ustr,
-        u".uno:LanguageStatus"_ustr,
-        u".uno:RightPara"_ustr,
-        u".uno:Shadowed"_ustr,
-        u".uno:SubScript"_ustr,
-        u".uno:SuperScript"_ustr,
-        u".uno:Strikeout"_ustr,
-        u".uno:StyleApply"_ustr,
-        u".uno:Underline"_ustr,
-        u".uno:ModifiedStatus"_ustr,
-        u".uno:Undo"_ustr,
-        u".uno:Redo"_ustr,
-        u".uno:InsertPage"_ustr,
-        u".uno:DeletePage"_ustr,
-        u".uno:DuplicatePage"_ustr,
-        u".uno:InsertSlide"_ustr,
-        u".uno:DeleteSlide"_ustr,
-        u".uno:DuplicateSlide"_ustr,
-        u".uno:ChangeTheme"_ustr,
-        u".uno:Cut"_ustr,
-        u".uno:Copy"_ustr,
-        u".uno:Paste"_ustr,
-        u".uno:SelectAll"_ustr,
-        u".uno:ReplyComment"_ustr,
-        u".uno:ResolveComment"_ustr,
-        u".uno:ResolveCommentThread"_ustr,
-        u".uno:PromoteComment"_ustr,
-        u".uno:InsertRowsBefore"_ustr,
-        u".uno:InsertRowsAfter"_ustr,
-        u".uno:InsertColumnsBefore"_ustr,
-        u".uno:InsertColumnsAfter"_ustr,
-        u".uno:DeleteRows"_ustr,
-        u".uno:DeleteColumns"_ustr,
-        u".uno:DeleteTable"_ustr,
-        u".uno:SelectTable"_ustr,
-        u".uno:EntireRow"_ustr,
-        u".uno:EntireColumn"_ustr,
-        u".uno:EntireCell"_ustr,
-        u".uno:AssignLayout"_ustr,
-        u".uno:StatusDocPos"_ustr,
-        u".uno:RowColSelCount"_ustr,
-        u".uno:StatusPageStyle"_ustr,
-        u".uno:InsertMode"_ustr,
-        u".uno:SpellOnline"_ustr,
-        u".uno:StatusSelectionMode"_ustr,
-        u".uno:StateTableCell"_ustr,
-        u".uno:StatusBarFunc"_ustr,
-        u".uno:StatePageNumber"_ustr,
-        u".uno:StateWordCount"_ustr,
-        u".uno:SelectionMode"_ustr,
-        u".uno:PageStatus"_ustr,
-        u".uno:LayoutStatus"_ustr,
-        u".uno:Scale"_ustr,
-        u".uno:Context"_ustr,
-        u".uno:WrapText"_ustr,
-        u".uno:ToggleMergeCells"_ustr,
-        u".uno:NameGroup"_ustr,
-        u".uno:ObjectTitleDescription"_ustr,
-        u".uno:NumberFormatCurrency"_ustr,
-        u".uno:NumberFormatPercent"_ustr,
-        u".uno:NumberFormatDecimal"_ustr,
-        u".uno:NumberFormatIncDecimals"_ustr,
-        u".uno:NumberFormatDecDecimals"_ustr,
-        u".uno:NumberFormatDate"_ustr,
-        u".uno:EditHeaderAndFooter"_ustr,
-        u".uno:FrameLineColor"_ustr,
-        u".uno:SortAscending"_ustr,
-        u".uno:SortDescending"_ustr,
-        u".uno:TrackChanges"_ustr,
-        u".uno:ShowTrackedChanges"_ustr,
-        u".uno:NextTrackedChange"_ustr,
-        u".uno:PreviousTrackedChange"_ustr,
-        u".uno:AcceptAllTrackedChanges"_ustr,
-        u".uno:RejectAllTrackedChanges"_ustr,
-        u".uno:TableDialog"_ustr,
-        u".uno:FormatCellDialog"_ustr,
-        u".uno:FontDialog"_ustr,
-        u".uno:ParagraphDialog"_ustr,
-        u".uno:OutlineBullet"_ustr,
-        u".uno:InsertIndexesEntry"_ustr,
-        u".uno:DocumentRepair"_ustr,
-        u".uno:TransformDialog"_ustr,
-        u".uno:InsertPageHeader"_ustr,
-        u".uno:InsertPageFooter"_ustr,
-        u".uno:OnlineAutoFormat"_ustr,
-        u".uno:InsertObjectChart"_ustr,
-        u".uno:InsertSection"_ustr,
-        u".uno:InsertAnnotation"_ustr,
-        u".uno:DeleteAnnotation"_ustr,
-        u".uno:InsertPagebreak"_ustr,
-        u".uno:InsertColumnBreak"_ustr,
-        u".uno:HyperlinkDialog"_ustr,
-        u".uno:InsertSymbol"_ustr,
-        u".uno:EditRegion"_ustr,
-        u".uno:ThesaurusDialog"_ustr,
-        u".uno:FormatArea"_ustr,
-        u".uno:FormatLine"_ustr,
-        u".uno:FormatColumns"_ustr,
-        u".uno:Watermark"_ustr,
-        u".uno:ResetAttributes"_ustr,
-        u".uno:Orientation"_ustr,
-        u".uno:ObjectAlignLeft"_ustr,
-        u".uno:ObjectAlignRight"_ustr,
-        u".uno:AlignCenter"_ustr,
-        u".uno:TransformPosX"_ustr,
-        u".uno:TransformPosY"_ustr,
-        u".uno:TransformWidth"_ustr,
-        u".uno:TransformHeight"_ustr,
-        u".uno:ObjectBackOne"_ustr,
-        u".uno:SendToBack"_ustr,
-        u".uno:ObjectForwardOne"_ustr,
-        u".uno:BringToFront"_ustr,
-        u".uno:WrapRight"_ustr,
-        u".uno:WrapThrough"_ustr,
-        u".uno:WrapLeft"_ustr,
-        u".uno:WrapIdeal"_ustr,
-        u".uno:WrapOn"_ustr,
-        u".uno:WrapOff"_ustr,
-        u".uno:UpdateCurIndex"_ustr,
-        u".uno:InsertCaptionDialog"_ustr,
-        u".uno:FormatGroup"_ustr,
-        u".uno:SplitTable"_ustr,
-        u".uno:SplitCell"_ustr,
-        u".uno:MergeCells"_ustr,
-        u".uno:DeleteNote"_ustr,
-        u".uno:AcceptChanges"_ustr,
-        u".uno:FormatPaintbrush"_ustr,
-        u".uno:SetDefault"_ustr,
-        u".uno:ParaLeftToRight"_ustr,
-        u".uno:ParaRightToLeft"_ustr,
-        u".uno:ParaspaceIncrease"_ustr,
-        u".uno:ParaspaceDecrease"_ustr,
-        u".uno:AcceptTrackedChange"_ustr,
-        u".uno:RejectTrackedChange"_ustr,
-        u".uno:AcceptTrackedChangeToNext"_ustr,
-        u".uno:RejectTrackedChangeToNext"_ustr,
-        u".uno:ShowResolvedAnnotations"_ustr,
-        u".uno:InsertBreak"_ustr,
-        u".uno:InsertEndnote"_ustr,
-        u".uno:InsertFootnote"_ustr,
-        u".uno:InsertReferenceField"_ustr,
-        u".uno:InsertBookmark"_ustr,
-        u".uno:InsertAuthoritiesEntry"_ustr,
-        u".uno:InsertMultiIndex"_ustr,
-        u".uno:InsertField"_ustr,
-        u".uno:PageNumberWizard"_ustr,
-        u".uno:InsertPageNumberField"_ustr,
-        u".uno:InsertPageCountField"_ustr,
-        u".uno:InsertDateField"_ustr,
-        u".uno:InsertTitleField"_ustr,
-        u".uno:InsertFieldCtrl"_ustr,
-        u".uno:CharmapControl"_ustr,
-        u".uno:EnterGroup"_ustr,
-        u".uno:LeaveGroup"_ustr,
-        u".uno:AlignUp"_ustr,
-        u".uno:AlignMiddle"_ustr,
-        u".uno:AlignDown"_ustr,
-        u".uno:TraceChangeMode"_ustr,
-        u".uno:Combine"_ustr,
-        u".uno:Merge"_ustr,
-        u".uno:Dismantle"_ustr,
-        u".uno:Substract"_ustr,
-        u".uno:DistributeSelection"_ustr,
-        u".uno:Intersect"_ustr,
-        u".uno:BorderInner"_ustr,
-        u".uno:BorderOuter"_ustr,
-        u".uno:FreezePanes"_ustr,
-        u".uno:FreezePanesColumn"_ustr,
-        u".uno:FreezePanesRow"_ustr,
-        u".uno:Sidebar"_ustr,
-        u".uno:SheetRightToLeft"_ustr,
-        u".uno:RunMacro"_ustr,
-        u".uno:SpacePara1"_ustr,
-        u".uno:SpacePara15"_ustr,
-        u".uno:SpacePara2"_ustr,
-        u".uno:InsertSparkline"_ustr,
-        u".uno:DeleteSparkline"_ustr,
-        u".uno:DeleteSparklineGroup"_ustr,
-        u".uno:EditSparklineGroup"_ustr,
-        u".uno:EditSparkline"_ustr,
-        u".uno:GroupSparklines"_ustr,
-        u".uno:UngroupSparklines"_ustr,
-        u".uno:FormatSparklineMenu"_ustr,
-        u".uno:DataDataPilotRun"_ustr,
-        u".uno:RecalcPivotTable"_ustr,
-        u".uno:DeletePivotTable"_ustr,
-        u".uno:Protect"_ustr,
-        u".uno:UnsetCellsReadOnly"_ustr,
-        u".uno:ContentControlProperties"_ustr,
-        u".uno:DeleteContentControl"_ustr,
-        u".uno:InsertCheckboxContentControl"_ustr,
-        u".uno:InsertContentControl"_ustr,
-        u".uno:InsertDateContentControl"_ustr,
-        u".uno:InsertDropdownContentControl"_ustr,
-        u".uno:InsertPlainTextContentControl"_ustr,
-        u".uno:InsertPictureContentControl"_ustr,
-        u".uno:DataFilterAutoFilter"_ustr,
-        u".uno:CellProtection"_ustr,
-        u".uno:MoveKeepInsertMode"_ustr,
-        u".uno:ToggleSheetGrid"_ustr,
-        u".uno:ChangeBezier"_ustr,
-        u".uno:DistributeHorzCenter"_ustr,
-        u".uno:DistributeHorzDistance"_ustr,
-        u".uno:DistributeHorzLeft"_ustr,
-        u".uno:DistributeHorzRight"_ustr,
-        u".uno:DistributeVertBottom"_ustr,
-        u".uno:DistributeVertCenter"_ustr,
-        u".uno:DistributeVertDistance"_ustr,
-        u".uno:DistributeVertTop"_ustr,
-        u".uno:AnimationEffects"_ustr,
-        u".uno:ExecuteAnimationEffect"_ustr,
-        u".uno:EditDoc"_ustr,
-    };
-
     util::URL aCommandURL;
     SfxViewShell* pViewShell = SfxViewShell::Current();
     SfxViewFrame* pViewFrame = pViewShell ? &pViewShell->GetViewFrame() : 
nullptr;
@@ -4102,17 +3867,22 @@ static void doc_iniUnoCommands ()
     SfxSlotPool& rSlotPool = SfxSlotPool::GetSlotPool(pViewFrame);
     uno::Reference<util::XURLTransformer> 
xParser(util::URLTransformer::create(xContext));
 
-    for (const auto & sUnoCommand : sUnoCommands)
+    const std::map<std::u16string_view, KitUnoCommand>& rUnoCommandList = 
GetKitUnoCommandList();
+    for (const auto& aUnoCommand : rUnoCommandList)
     {
-        aCommandURL.Complete = sUnoCommand;
-        xParser->parseStrict(aCommandURL);
-
-        // when null, this command is not supported by the given component
-        // (like eg. Calc does not have ".uno:DefaultBullet" etc.)
-        if (const SfxSlot* pSlot = rSlotPool.GetUnoSlot(aCommandURL.Path))
+        if (aUnoCommand.second.initializeForStatusUpdates)
         {
-            // Initialize slot to dispatch .uno: Command.
-            pViewFrame->GetBindings().GetDispatch(pSlot, aCommandURL, false);
+            aCommandURL.Complete = u".uno:"_ustr + aUnoCommand.first;
+            xParser->parseStrict(aCommandURL);
+
+            // when null, this command is not supported by the given component
+            // (like eg. Calc does not have ".uno:DefaultBullet" etc.)
+            if (const SfxSlot* pSlot = rSlotPool.GetUnoSlot(aCommandURL.Path))
+            {
+                // Initialize slot to dispatch .uno: Command.
+                pViewFrame->GetBindings().GetDispatch(pSlot, aCommandURL, 
false);
+            }
+
         }
     }
 }
diff --git a/include/sfx2/lokunocmdlist.hxx b/include/sfx2/lokunocmdlist.hxx
new file mode 100644
index 000000000000..8472497793bd
--- /dev/null
+++ b/include/sfx2/lokunocmdlist.hxx
@@ -0,0 +1,52 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; 
fill-column: 100 -*- */
+/*
+ * 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/.
+ */
+
+#include <sfx2/dllapi.h>
+#include <map>
+
+enum class PayloadType
+{
+    None,
+    IsActivePayload,
+    FontNamePayload,
+    FontHeightPayload,
+    StyleApplyPayload,
+    ColorPayload,
+    UndoRedoPayload,
+    EnabledPayload,
+    ParaDirectionPayload,
+    Int32Payload,
+    TransformPayload,
+    StringPayload,
+    RowColSelCountPayload,
+    StateTableCellPayload,
+    BooleanPayload,
+    BooleanOrDisabledPayload,
+    PointPayload,
+    SizePayload,
+    StringOrStrSeqPayload,
+    StrSeqPayload,
+    TableSizePayload,
+};
+
+struct KitUnoCommand
+{
+    // (if != None) --> function used by libreOfficeKitViewCallback in
+    // unoctitm.cxx.
+    PayloadType payloadType;
+    // (if == true) --> command is listened to for status updates. This is used
+    // by doc_iniUnoCommands in init.cxx.
+    bool initializeForStatusUpdates;
+};
+
+// Get list of uno commands that are safe enough to be allowed to use in some 
cases
+// Parameters:
+SFX2_DLLPUBLIC const std::map<std::u16string_view, KitUnoCommand>& 
GetKitUnoCommandList();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s 
cinkeys+=0=break: */
diff --git a/sd/inc/app.hrc b/sd/inc/app.hrc
index 56cfc31ede21..34f0d368b8f9 100644
--- a/sd/inc/app.hrc
+++ b/sd/inc/app.hrc
@@ -453,4 +453,6 @@
 #define SID_PRESENTATION_MINIMIZER          (SID_SD_START+450)
 #define SID_ALIGN_PAGE                      (SID_SD_START+451)
 
+#define FN_TRANSFORM_DOCUMENT_STRUCTURE     (SID_SD_START+452)
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/sdpage.hxx b/sd/inc/sdpage.hxx
index 208c5888a69b..a1121b68b18b 100644
--- a/sd/inc/sdpage.hxx
+++ b/sd/inc/sdpage.hxx
@@ -384,6 +384,9 @@ public:
     */
     void getGraphicsForPrefetch(std::vector<Graphic*>& graphics) const;
 
+    static AutoLayout stringToAutoLayout(std::u16string_view rLayoutName);
+    static OUString autoLayoutToString(AutoLayout nLayoutId);
+
     static sal_uInt16 mnLastPageId;
 
 private:
diff --git a/sd/qa/unit/uiimpress.cxx b/sd/qa/unit/uiimpress.cxx
index 8d399f024b03..4d22a30b057c 100644
--- a/sd/qa/unit/uiimpress.cxx
+++ b/sd/qa/unit/uiimpress.cxx
@@ -172,6 +172,113 @@ void SdUiImpressTest::lcl_search(const OUString& rKey, 
bool bFindAll, bool bBack
     dispatchCommand(mxComponent, u".uno:ExecuteSearch"_ustr, aPropertyValues);
 }
 
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, 
testDocumentStructureTransformExtractSlide)
+{
+    createSdImpressDoc("odp/tdf161430.odp");
+
+    OString aJson = R"json(
+{
+    "Transforms": {
+        "SlideCommands": [
+            {"JumpToSlideByName": "Slide 3"},
+            {"MoveSlide": 0},
+            {"RenameSlide": "Slide3-Renamed"},
+            {"DeleteSlide": 2},
+            {"JumpToSlide": 2},
+            {"DeleteSlide": ""},
+            {"JumpToSlide": 1},
+            {"DuplicateSlide": ""},
+            {"RenameSlide": "Slide1-Duplicated"},
+            {"InsertMasterSlide": 1},
+            {"RenameSlide": "SlideInserted-1"},
+            {"ChangeLayout": 18},
+            {"JumpToSlide": "last"},
+            {"InsertMasterSlideByName": "Topic Separator white"},
+            {"RenameSlide": "SlideInserted-Name"},
+            {"ChangeLayoutByName": "AUTOLAYOUT_TITLE_2CONTENT"},
+            {"SetText.0": "first"},
+            {"SetText.1": "second"},
+            {"SetText.2": "third"},
+            {"DuplicateSlide": 1},
+            {"MoveSlide.2": 6}
+        ]
+    }
+}
+)json"_ostr;
+
+    //transform
+    uno::Sequence<css::beans::PropertyValue> aArgs = {
+        comphelper::makePropertyValue(u"DataJson"_ustr,
+                                      uno::Any(OStringToOUString(aJson, 
RTL_TEXTENCODING_UTF8))),
+    };
+    dispatchCommand(mxComponent, u".uno:TransformDocumentStructure"_ustr, 
aArgs);
+
+    //extract
+    tools::JsonWriter aJsonWriter;
+    std::string_view aCommand(".uno:ExtractDocumentStructure?filter=slides");
+    auto pXPresDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+    pXPresDocument->getCommandValues(aJsonWriter, aCommand);
+
+    OString aExpectedStr
+        = "{ \"DocStructure\": { \"SlideCount\": 7, \"MasterSlideCount\": 8, 
\"MasterSlides\": [ "
+          "\"MasterSlide 0\": { \"Name\": \"Topic_Separator_Purple\"}, 
\"MasterSlide 1\": { "
+          "\"Name\": \"Content_sidebar_White\"}, \"MasterSlide 2\": { 
\"Name\": \"Topic Separator "
+          "white\"}, \"MasterSlide 3\": { \"Name\": 
\"Content_sidebar_White_\"}, \"MasterSlide "
+          "4\": { \"Name\": \"Topic_Separator_Purple_\"}, \"MasterSlide 5\": { 
\"Name\": "
+          "\"Content_White_Purple_Sidebar\"}, \"MasterSlide 6\": { \"Name\": 
\"Default 1\"}, "
+          "\"MasterSlide 7\": { \"Name\": \"Default 1_\"}], \"Slides\": [ 
\"Slide 0\": { "
+          "\"SlideName\": \"Slide3-Renamed\", \"MasterSlideName\": "
+          "\"Content_White_Purple_Sidebar\", \"LayoutId\": 3, \"LayoutName\": "
+          "\"AUTOLAYOUT_TITLE_2CONTENT\", \"ObjectCount\": 4, \"Objects\": [ 
\"Objects 0\": { "
+          "\"TextCount\": 1, \"Texts\": [ \"Text 0\": { \"ParaCount\": 1, 
\"Paragraphs\": [ "
+          "\"Friendly Open Source Project\"]}]}, \"Objects 1\": { }, \"Objects 
2\": { "
+          "\"TextCount\": 1, \"Texts\": [ \"Text 0\": { \"ParaCount\": 9, 
\"Paragraphs\": [ \"Real "
+          "Open Source\", \"100% open-source code\", \"Built with LibreOffice 
technology\", "
+          "\"Built with Free Software technology stacks: primarily C++\", 
\"Runs best on Linux\", "
+          "\"Open Development\", \"Anyone can contribute & participate\", 
\"Follow commits and "
+          "tickets\", \"Public community calls - forum has details\"]}]}, 
\"Objects 3\": { "
+          "\"TextCount\": 1, \"Texts\": [ \"Text 0\": { \"ParaCount\": 5, 
\"Paragraphs\": [ "
+          "\"Focus:\", \"a non-renewable resource.\", \"Office Productivity & 
Documents\", "
+          "\"Excited about migrating your\u0001documents\", \"Grateful to our 
partners for "
+          "solving\u0001other problems.\"]}]}]}, \"Slide 1\": { \"SlideName\": 
\"Slide 2\", "
+          "\"MasterSlideName\": \"Topic_Separator_Purple\", \"LayoutId\": 3, 
\"LayoutName\": "
+          "\"AUTOLAYOUT_TITLE_2CONTENT\", \"ObjectCount\": 1, \"Objects\": [ 
\"Objects 0\": { "
+          "\"TextCount\": 1, \"Texts\": [ \"Text 0\": { \"ParaCount\": 3, 
\"Paragraphs\": [ "
+          "\"Collabora Online\", \"\", \"Powerful Online 
Collaboration\"]}]}]}, \"Slide 2\": { "
+          "\"SlideName\": \"Slide1-Duplicated\", \"MasterSlideName\": 
\"Topic_Separator_Purple\", "
+          "\"LayoutId\": 3, \"LayoutName\": \"AUTOLAYOUT_TITLE_2CONTENT\", 
\"ObjectCount\": 1, "
+          "\"Objects\": [ \"Objects 0\": { \"TextCount\": 1, \"Texts\": [ 
\"Text 0\": { "
+          "\"ParaCount\": 3, \"Paragraphs\": [ \"Collabora Online\", \"\", 
\"Powerful Online "
+          "Collaboration\"]}]}]}, \"Slide 3\": { \"SlideName\": 
\"SlideInserted-1\", "
+          "\"MasterSlideName\": \"Content_sidebar_White\", \"LayoutId\": 18, 
\"LayoutName\": "
+          "\"AUTOLAYOUT_TITLE_4CONTENT\", \"ObjectCount\": 5, \"Objects\": [ 
\"Objects 0\": { "
+          "\"TextCount\": 1, \"Texts\": [ \"Text 0\": { \"ParaCount\": 1, 
\"Paragraphs\": [ "
+          "\"Click to add Title\"]}]}, \"Objects 1\": { \"TextCount\": 1, 
\"Texts\": [ \"Text 0\": "
+          "{ \"ParaCount\": 1, \"Paragraphs\": [ \"Click to add Text\"]}]}, 
\"Objects 2\": { "
+          "\"TextCount\": 1, \"Texts\": [ \"Text 0\": { \"ParaCount\": 1, 
\"Paragraphs\": [ "
+          "\"Click to add Text\"]}]}, \"Objects 3\": { \"TextCount\": 1, 
\"Texts\": [ \"Text 0\": "
+          "{ \"ParaCount\": 1, \"Paragraphs\": [ \"Click to add Text\"]}]}, 
\"Objects 4\": { "
+          "\"TextCount\": 1, \"Texts\": [ \"Text 0\": { \"ParaCount\": 1, 
\"Paragraphs\": [ "
+          "\"Click to add Text\"]}]}]}, \"Slide 4\": { \"SlideName\": \"Slide 
6\", "
+          "\"MasterSlideName\": \"Topic_Separator_Purple\", \"LayoutId\": 3, 
\"LayoutName\": "
+          "\"AUTOLAYOUT_TITLE_2CONTENT\", \"ObjectCount\": 1, \"Objects\": [ 
\"Objects 0\": { "
+          "\"TextCount\": 1, \"Texts\": [ \"Text 0\": { \"ParaCount\": 1, 
\"Paragraphs\": [ \"With "
+          "thanks to our Partners, Customers & Community !\"]}]}]}, \"Slide 
5\": { \"SlideName\": "
+          "\"SlideInserted-Name\", \"MasterSlideName\": \"Topic Separator 
white\", \"LayoutId\": "
+          "3, \"LayoutName\": \"AUTOLAYOUT_TITLE_2CONTENT\", \"ObjectCount\": 
3, \"Objects\": [ "
+          "\"Objects 0\": { \"TextCount\": 1, \"Texts\": [ \"Text 0\": { 
\"ParaCount\": 1, "
+          "\"Paragraphs\": [ \"first\"]}]}, \"Objects 1\": { \"TextCount\": 1, 
\"Texts\": [ \"Text "
+          "0\": { \"ParaCount\": 1, \"Paragraphs\": [ \"second\"]}]}, 
\"Objects 2\": { "
+          "\"TextCount\": 1, \"Texts\": [ \"Text 0\": { \"ParaCount\": 1, 
\"Paragraphs\": [ "
+          "\"third\"]}]}]}, \"Slide 6\": { \"SlideName\": \"Slide 7\", 
\"MasterSlideName\": "
+          "\"Topic_Separator_Purple\", \"LayoutId\": 3, \"LayoutName\": "
+          "\"AUTOLAYOUT_TITLE_2CONTENT\", \"ObjectCount\": 1, \"Objects\": [ 
\"Objects 0\": { "
+          "\"TextCount\": 1, \"Texts\": [ \"Text 0\": { \"ParaCount\": 3, 
\"Paragraphs\": [ "
+          "\"Collabora Online\", \"\", \"Powerful Online 
Collaboration\"]}]}]}]}}"_ostr;
+
+    CPPUNIT_ASSERT_EQUAL(aExpectedStr, aJsonWriter.finishAndGetAsOString());
+}
+
 CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf111522)
 {
     // Load the document and create two new windows.
diff --git a/sd/sdi/_drvwsh.sdi b/sd/sdi/_drvwsh.sdi
index 5a19a4155e9c..b0c655176b1b 100644
--- a/sd/sdi/_drvwsh.sdi
+++ b/sd/sdi/_drvwsh.sdi
@@ -146,6 +146,10 @@ interface DrawView
         ExecMethod = FuTemporary ;
         StateMethod = GetMenuState ;
     ]
+    FN_TRANSFORM_DOCUMENT_STRUCTURE
+    [
+        ExecMethod = FuTemporary ;
+    ]
     SID_INSERTPAGE // ole : no, status : play rec
     [
         ExecMethod = FuTemporary ;
diff --git a/sd/sdi/sdraw.sdi b/sd/sdi/sdraw.sdi
index d98a938c1cfd..5cb4bd732c42 100644
--- a/sd/sdi/sdraw.sdi
+++ b/sd/sdi/sdraw.sdi
@@ -2195,6 +2195,23 @@ SfxVoidItem InsertLayer SID_INSERTLAYER
     GroupId = SfxGroupId::Insert;
 ]
 
+SfxVoidItem TransformDocumentStructure FN_TRANSFORM_DOCUMENT_STRUCTURE
+(SfxStringItem DataJson FN_PARAM_1)
+[
+    AutoUpdate = FALSE,
+    FastCall = FALSE,
+    ReadOnlyDoc = FALSE,
+    Toggle = FALSE,
+    Container = FALSE,
+    RecordAbsolute = FALSE,
+    RecordPerSet;
+
+    AccelConfig = TRUE,
+    MenuConfig = TRUE,
+    ToolBoxConfig = TRUE,
+    GroupId = SfxGroupId::Edit;
+]
+
 SfxVoidItem InsertPage SID_INSERTPAGE
 (SfxStringItem PageName ID_VAL_PAGENAME,SfxUInt32Item WhatLayout 
ID_VAL_WHATLAYOUT,SfxBoolItem IsPageBack ID_VAL_ISPAGEBACK,SfxBoolItem 
IsPageObj ID_VAL_ISPAGEOBJ,SfxUInt16Item InsertPos ID_INSERT_POS)
 [
diff --git a/sd/source/core/sdpage.cxx b/sd/source/core/sdpage.cxx
index dc5dfbf85aac..501c2da5b8ed 100644
--- a/sd/source/core/sdpage.cxx
+++ b/sd/source/core/sdpage.cxx
@@ -1353,6 +1353,28 @@ static OUString enumtoString(AutoLayout aut)
     return retstr;
 }
 
+AutoLayout SdPage::stringToAutoLayout(std::u16string_view rLayoutName)
+{
+    for (int i = AUTOLAYOUT_START; i < AUTOLAYOUT_END; i++)
+    {
+        AutoLayout nLId = static_cast<AutoLayout>(i);
+        if (autoLayoutToString(nLId) == rLayoutName)
+        {
+            return nLId;
+        }
+    }
+    return AUTOLAYOUT_END;
+}
+
+OUString SdPage::autoLayoutToString(AutoLayout nLayoutId)
+{
+    if (nLayoutId == AUTOLAYOUT_TITLE)
+    {
+        return "AUTOLAYOUT_TITLE";
+    }
+    return enumtoString(nLayoutId);
+}
+
 static void CalcAutoLayoutRectangles( SdPage const & rPage,::tools::Rectangle* 
rRectangle ,const OUString& sLayoutType )
 {
     ::tools::Rectangle aTitleRect;
diff --git a/sd/source/ui/inc/unomodel.hxx b/sd/source/ui/inc/unomodel.hxx
index 7a299c54c280..c4bb88802821 100644
--- a/sd/source/ui/inc/unomodel.hxx
+++ b/sd/source/ui/inc/unomodel.hxx
@@ -298,6 +298,8 @@ public:
     /// @see vcl::ITiledRenderable::getViewRenderState().
     SD_DLLPUBLIC OString getViewRenderState(SfxViewShell* pViewShell = 
nullptr) override;
 
+    SD_DLLPUBLIC virtual void getCommandValues(tools::JsonWriter& rJsonWriter, 
std::string_view rCommand) override;
+
     /// @see vcl::ITiledRenderable::getPresentationInfo().
     SD_DLLPUBLIC OString getPresentationInfo() const override;
     /// @see vcl::ITiledRenderable::createSlideRenderer().
diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx
index d778a6196611..4dded27a41b6 100644
--- a/sd/source/ui/unoidl/unomodel.cxx
+++ b/sd/source/ui/unoidl/unomodel.cxx
@@ -1455,6 +1455,110 @@ void AnimationsExporter::exportAnimate(const 
Reference<XAnimate>& xAnimate)
     }
 }
 
+void GetDocStructureSlides(::tools::JsonWriter& rJsonWriter, 
SdXImpressDocument* pDoc,
+                           const std::map<OUString, OUString>& rArguments)
+{
+    auto it = rArguments.find(u"filter"_ustr);
+    if (it != rArguments.end())
+    {
+        // If filter is present but we are filtering not to slide informations
+        if (!it->second.equals(u"slides"_ustr))
+            return;
+    }
+
+    sal_uInt16 nPageCount = pDoc->GetDoc()->GetSdPageCount(PageKind::Standard);
+    sal_uInt16 nMasterPageCount = 
pDoc->GetDoc()->GetMasterSdPageCount(PageKind::Standard);
+
+    rJsonWriter.put("SlideCount", nPageCount);
+    rJsonWriter.put("MasterSlideCount", nMasterPageCount);
+
+    // write data of every master slide
+    if (nMasterPageCount > 0)
+    {
+        auto aMasterPagesNode = rJsonWriter.startArray("MasterSlides");
+        for (int nMPId = 0; nMPId < nMasterPageCount; nMPId++)
+        {
+            auto aMasterPageNode = rJsonWriter.startNode("MasterSlide " + 
std::to_string(nMPId));
+            const OUString& aMName
+                = pDoc->GetDoc()->GetMasterSdPage(nMPId, 
PageKind::Standard)->GetName();
+            rJsonWriter.put("Name", aMName);
+        }
+    }
+
+    // write data of every slide
+    if (nPageCount > 0)
+    {
+        auto aPagesNode = rJsonWriter.startArray("Slides");
+        for (int nPId = 0; nPId < nPageCount; nPId++)
+        {
+            auto aPageNode = rJsonWriter.startNode("Slide " + 
std::to_string(nPId));
+            SdPage* pPageStandard = pDoc->GetDoc()->GetSdPage(nPId, 
PageKind::Standard);
+
+            // Slide Name
+            rJsonWriter.put("SlideName", pPageStandard->GetName());
+
+            // MatserSlide Name
+            const FmFormPage* pMasterPage
+                = dynamic_cast<const 
FmFormPage*>(&pPageStandard->TRG_GetMasterPage());
+
+            if (pMasterPage)
+            {
+                rJsonWriter.put("MasterSlideName", pMasterPage->GetName());
+            }
+
+            // Layout id, and name.
+            AutoLayout nLayout = pPageStandard->GetAutoLayout();
+            rJsonWriter.put("LayoutId", static_cast<int>(nLayout));
+            rJsonWriter.put("LayoutName", SdPage::autoLayoutToString(nLayout));
+
+            // Every Objects in the page
+            int nObjCount = pPageStandard->GetObjCount();
+            rJsonWriter.put("ObjectCount", nObjCount);
+
+            if (nObjCount > 0)
+            {
+                auto aObjectsNode = rJsonWriter.startArray("Objects");
+                for (int nOId = 0; nOId < nObjCount; nOId++)
+                {
+                    auto aObjectNode = rJsonWriter.startNode("Objects " + 
std::to_string(nOId));
+                    SdrObject* pSdrObj = pPageStandard->GetObj(nOId);
+                    SdrTextObj* pSdrTxtObj = DynCastSdrTextObj(pSdrObj);
+                    if (pSdrTxtObj && pSdrTxtObj->HasText())
+                    {
+                        sal_Int32 nTextCount = pSdrTxtObj->getTextCount();
+                        rJsonWriter.put("TextCount", nTextCount);
+                        if (nTextCount > 0)
+                        {
+                            auto aTextsNode = rJsonWriter.startArray("Texts");
+                            for (int nTId = 0; nTId < nTextCount; nTId++)
+                            {
+                                auto aTextNode
+                                    = rJsonWriter.startNode("Text " + 
std::to_string(nTId));
+                                SdrText* pSdrTxt = pSdrTxtObj->getText(nTId);
+                                OutlinerParaObject* pOutlinerParaObject
+                                    = pSdrTxt->GetOutlinerParaObject();
+
+                                sal_Int32 nParaCount
+                                    = 
pOutlinerParaObject->GetTextObject().GetParagraphCount();
+
+                                rJsonWriter.put("ParaCount", nParaCount);
+                                auto aParasNode = 
rJsonWriter.startArray("Paragraphs");
+                                for (int nParaId = 0; nParaId < nParaCount; 
nParaId++)
+                                {
+                                    OUString aParaStr(
+                                        
pOutlinerParaObject->GetTextObject().GetText(nParaId));
+
+                                    rJsonWriter.putSimpleValue(aParaStr);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
 } // end anonymous namespace
 
 SdUnoForbiddenCharsTable::SdUnoForbiddenCharsTable( SdrModel* pModel )
@@ -1752,6 +1856,20 @@ void SdXImpressDocument::Notify( SfxBroadcaster& rBC, 
const SfxHint& rHint )
     SfxBaseModel::Notify( rBC, rHint );
 }
 
+void SdXImpressDocument::getCommandValues(::tools::JsonWriter& rJsonWriter, 
std::string_view rCommand)
+{
+    static constexpr OStringLiteral 
aExtractDocStructure(".uno:ExtractDocumentStructure");
+
+    std::map<OUString, OUString> aMap
+        = SfxLokHelper::parseCommandParameters(OUString::fromUtf8(rCommand));
+
+    if (o3tl::starts_with(rCommand, aExtractDocStructure))
+    {
+        auto commentsNode = rJsonWriter.startNode("DocStructure");
+        GetDocStructureSlides(rJsonWriter, this, aMap);
+    }
+}
+
 /******************************************************************************
 *                                                                             *
 ******************************************************************************/
diff --git a/sd/source/ui/view/drviews2.cxx b/sd/source/ui/view/drviews2.cxx
index fc011865e7fa..f578bc29ea00 100644
--- a/sd/source/ui/view/drviews2.cxx
+++ b/sd/source/ui/view/drviews2.cxx
@@ -39,6 +39,10 @@
 #include <comphelper/propertysequence.hxx>
 #include <comphelper/scopeguard.hxx>
 #include <comphelper/lok.hxx>
+#include <comphelper/sequence.hxx>
+#include <comphelper/sequenceashashmap.hxx>
+#include <comphelper/dispatchcommand.hxx>
+#include <comphelper/propertyvalue.hxx>
 
 #include <editeng/contouritem.hxx>
 #include <editeng/editdata.hxx>
@@ -59,6 +63,8 @@
 #include <sfx2/request.hxx>
 #include <sfx2/viewfrm.hxx>
 #include <sfx2/zoomitem.hxx>
+#include <sfx2/lokhelper.hxx>
+#include <sfx2/lokunocmdlist.hxx>
 
 #include <svx/compressgraphicdialog.hxx>
 #include <svx/ClassificationDialog.hxx>
@@ -198,6 +204,11 @@
 #include <SelectLayerDlg.hxx>
 #include <unomodel.hxx>
 
+#include <iostream>
+#include <boost/property_tree/json_parser.hpp>
+#include <rtl/uri.hxx>
+
+
 using namespace ::com::sun::star;
 using namespace ::com::sun::star::uno;
 
@@ -245,6 +256,11 @@ OUString getWeightString(SfxItemSet const & rItemSet)
     return sWeightString;
 }
 
+void lcl_LogWarning(const std::string& rWarning)
+{
+    LOK_WARN("sd.transform", rWarning);
+}
+
 class ClassificationCommon
 {
 protected:
@@ -741,6 +757,480 @@ void DrawViewShell::FuTemporary(SfxRequest& rReq)
         }
         break;
 
+        case FN_TRANSFORM_DOCUMENT_STRUCTURE:
+        {
+            // get the parameter, what to transform
+            OUString aDataJson;
+            const SfxStringItem* pDataJson = 
rReq.GetArg<SfxStringItem>(FN_PARAM_1);
+            if (pDataJson)
+            {
+                aDataJson = pDataJson->GetValue();
+                aDataJson = rtl::Uri::decode(aDataJson, rtl_UriDecodeStrict, 
RTL_TEXTENCODING_UTF8);
+            }
+
+            // parse the JSON transform parameter
+            boost::property_tree::ptree aTree;
+            std::stringstream aStream(
+                (std::string(OUStringToOString(aDataJson, 
RTL_TEXTENCODING_UTF8))));
+            try
+            {
+                boost::property_tree::read_json(aStream, aTree);
+            }
+            catch (...)
+            {
+                lcl_LogWarning("FillApi Transform parameter, Wrong JSON 
format. ");
+                throw;
+            }
+
+            // Iterate through the JSON data loaded into a tree structure
+            for (const auto& aItem : aTree)
+            {
+                if (aItem.first == "Transforms")
+                {
+                    // Handle all transformations
+                    for (const auto& aItem2 : aItem.second)
+                    {
+                        //jump to slide
+                        if (aItem2.first == "SlideCommands")
+                        {
+                            int nActPageId = -1;
+                            int nNextPageId = 0;
+                            for (const auto& aItem3Obj : aItem2.second)
+                            {
+                                const auto& aItem3 = 
*aItem3Obj.second.ordered_begin();
+
+                                sal_uInt16 nPageCount
+                                    = 
GetDoc()->GetSdPageCount(PageKind::Standard);
+                                sal_uInt16 nMasterPageCount
+                                    = 
GetDoc()->GetMasterSdPageCount(PageKind::Standard);
+
+                                if (nActPageId != nNextPageId)
+                                {
+                                    // Make it sure it always point to a real 
page
+                                    if (nNextPageId < 0)
+                                        nNextPageId = 0;
+                                    if (nNextPageId >= nPageCount)
+                                        nNextPageId = nPageCount - 1;
+
+                                    nActPageId = nNextPageId;
+                                    // Make sure nActPageId is the current Page
+                                    maTabControl->SetCurPageId(nActPageId);
+                                    SdPage* pPageStandard
+                                        = GetDoc()->GetSdPage(nActPageId, 
PageKind::Standard);
+                                    mpDrawView->ShowSdrPage(pPageStandard);
+                                }
+
+                                if (aItem3.first == "JumpToSlide")
+                                {
+                                    std::string aIndex = 
aItem3.second.get_value<std::string>();
+                                    if (aIndex == "last")
+                                    {
+                                        nNextPageId = nPageCount - 1;
+                                    }
+                                    else
+                                    {
+                                        nNextPageId = 
aItem3.second.get_value<int>();
+                                        if (nNextPageId >= nPageCount)
+                                        {
+                                            lcl_LogWarning(
+                                                "FillApi SlideCmd: Slide idx 
>= Slide count. '"
+                                                + aItem3.first + ": " + aIndex
+                                                + "' (Slide count = " + 
std::to_string(nPageCount));
+                                            nNextPageId = nPageCount - 1;
+                                        }
+                                        else if (nNextPageId < 0)
+                                        {
+                                            lcl_LogWarning("FillApi SlideCmd: 
Slide idx < 0. '"
+                                                           + aItem3.first + ": 
" + aIndex + "'");
+                                            nNextPageId = 0;
+                                        }
+                                    }
+                                }
+                                if (aItem3.first == "JumpToSlideByName")
+                                {
+                                    std::string aPageName = 
aItem3.second.get_value<std::string>();
+                                    int nId = 0;
+                                    while (
+                                        nId < nPageCount
+                                        && GetDoc()->GetSdPage(nId, 
PageKind::Standard)->GetName()
+                                               != OStringToOUString(aPageName,
+                                                                    
RTL_TEXTENCODING_UTF8))
+                                    {
+                                        nId++;
+                                    }
+                                    if (nId < nPageCount)
+                                    {
+                                        nNextPageId = nId;
+                                    }
+                                    else
+                                    {
+                                        lcl_LogWarning(
+                                            "FillApi SlideCmd: Slide name not 
found at: '"
+                                            + aItem3.first + ": " + aPageName 
+ "'");
+                                    }
+                                }
+                                else if (aItem3.first == "InsertMasterSlide"
+                                         || aItem3.first == 
"InsertMasterSlideByName")
+                                {
+                                    int nMasterPageId = 0;
+                                    if (aItem3.first == 
"InsertMasterSlideByName")
+                                    {
+                                        int nMId = 0;
+                                        std::string aMPageName
+                                            = 
aItem3.second.get_value<std::string>();
+                                        while (
+                                            nMId < nMasterPageCount
+                                            && GetDoc()->GetMasterSdPage(nMId, 
PageKind::Standard)
+                                                       ->GetName()
+                                                   != 
OStringToOUString(aMPageName,
+                                                       RTL_TEXTENCODING_UTF8))
+                                        {
+                                            nMId++;
+                                        }
+                                        if (nMId < nMasterPageCount)
+                                        {
+                                            nMasterPageId = nMId;
+                                        }
+                                        else
+                                        {
+                                            lcl_LogWarning(
+                                                "FillApi SlideCmd: MatserSlide 
name not found at: '"
+                                                + aItem3.first + ": " + 
aMPageName + "'");
+                                        }
+                                    }
+                                    else
+                                    {
+                                        nMasterPageId = 
aItem3.second.get_value<int>();
+                                    }
+
+                                    if (nMasterPageId >= nMasterPageCount)
+                                    {
+                                        lcl_LogWarning(
+                                            "FillApi SlideCmd: Slide idx >= 
MasterSlide count. '"
+                                            + aItem3.first + ": " + 
std::to_string(nMasterPageId)
+                                            + "' (Slide count = " + 
std::to_string(nMasterPageCount));
+                                        nMasterPageId = nMasterPageCount - 1;
+                                    }
+                                    else if (nMasterPageId < 0)
+                                    {
+                                        lcl_LogWarning("FillApi SlideCmd: 
Slide idx < 0. '"
+                                                       + aItem3.first + ": "
+                                                       + 
std::to_string(nMasterPageId) + "'");
+                                        nMasterPageId = 0;
+                                    }
+
+                                    SdPage* pMPage = 
GetDoc()->GetMasterSdPage(nMasterPageId,
+                                                                               
PageKind::Standard);
+                                    SdPage* pPage
+                                        = GetDoc()->GetSdPage(nActPageId, 
PageKind::Standard);
+
+                                    // It will move to the next slide.
+                                    nNextPageId = GetDoc()->CreatePage(
+                                        pPage, PageKind::Standard, OUString(), 
OUString(),
+                                        AUTOLAYOUT_TITLE_CONTENT, 
AUTOLAYOUT_NOTES, true, true,
+                                        pPage->GetPageNum() + 2);
+
+                                    SdPage* pPageStandard
+                                        = GetDoc()->GetSdPage(nNextPageId, 
PageKind::Standard);
+                                    SdPage* pPageNote
+                                        = GetDoc()->GetSdPage(nNextPageId, 
PageKind::Notes);
+
+                                    // Change master value
+                                    pPageStandard->TRG_SetMasterPage(*pMPage);
+                                    pPageNote->TRG_SetMasterPage(*pMPage);
+                                }
+                                else if (aItem3.first == "DeleteSlide")
+                                {
+                                    int nPageIdToDel = nActPageId;
+                                    if (aItem3.second.get_value<std::string>() 
!= "")
+                                    {
+                                        nPageIdToDel = 
aItem3.second.get_value<int>();
+                                    }
+
+                                    if (nPageCount > 1)
+                                    {
+                                        if (nPageIdToDel >= nPageCount)
+                                        {
+                                            lcl_LogWarning(
+                                                "FillApi SlideCmd: Slide idx 
>= Slide count. '"
+                                                + aItem3.first + ": " + 
std::to_string(nPageIdToDel)
+                                                + "' (Slide count = " + 
std::to_string(nPageCount));
+                                            nPageIdToDel = nPageCount - 1;
+                                        }
+                                        else if (nPageIdToDel < 0)
+                                        {
+                                            lcl_LogWarning("FillApi SlideCmd: 
Slide idx < 0. '"
+                                                           + aItem3.first + ": 
"
+                                                           + 
std::to_string(nPageIdToDel) + "'");
+                                            nPageIdToDel = 0;
+                                        }
+                                        GetDoc()->RemovePage(nPageIdToDel * 2 
+ 1);
+                                        GetDoc()->RemovePage(nPageIdToDel * 2 
+ 1);
+
+                                        if (nPageIdToDel <= nActPageId)
+                                        {
+                                            nNextPageId--;
+                                        }
+                                    }
+                                    else
+                                    {
+                                        lcl_LogWarning(
+                                            "FillApi SlideCmd: Not enought 
Slide to delete 1. '"
+                                            + aItem3.first + ": " + 
std::to_string(nPageIdToDel));
+                                    }
+                                }
+                                else if (aItem3.first.starts_with("MoveSlide"))
+                                {
+                                    int nMoveFrom = nActPageId;
+                                    if (aItem3.first.starts_with("MoveSlide."))
+                                    {
+                                        nMoveFrom = 
stoi(aItem3.first.substr(10));
+                                    }
+                                    int nMoveTo = 
aItem3.second.get_value<int>();
+
+                                    if (nMoveFrom == nMoveTo)
+                                    {
+                                        lcl_LogWarning(
+                                            "FillApi SlideCmd: Move slide to 
the same position. '"
+                                            + aItem3.first + ": " + 
std::to_string(nMoveTo));
+                                    }
+                                    else if (nMoveFrom >= nPageCount || 
nMoveTo > nPageCount)
+                                    {
+                                        lcl_LogWarning(
+                                            "FillApi SlideCmd: Slide idx >= 
Slide count. '"
+                                            + aItem3.first + ": " + 
std::to_string(nMoveTo));
+                                    }
+                                    else if (nMoveFrom < 0 || nMoveTo < 0)
+                                    {
+                                        lcl_LogWarning(
+                                            "FillApi SlideCmd: Slide idx < 0. 
'"
+                                            + aItem3.first + ": " + 
std::to_string(nMoveTo));
+                                    }
+                                    else
+                                    {
+                                        // Move both the standard and the Note 
Page.
+                                        // First move the page that will not 
change
+                                        // the order of the other page.
+                                        int nFirst = 1;
+                                        if (nMoveFrom < nMoveTo)
+                                        {
+                                            nFirst = 2;
+                                        }
+                                        int nSecond = 3 - nFirst;
+
+                                        GetDoc()->MovePage(nMoveFrom * 2 + 
nFirst,
+                                                           nMoveTo * 2 + 
nFirst);
+                                        GetDoc()->MovePage(nMoveFrom * 2 + 
nSecond,
+                                                           nMoveTo * 2 + 
nSecond);
+
+                                        // If the act page is moved, then 
follow it.
+                                        if (nActPageId == nMoveFrom)
+                                        {
+                                            nNextPageId = nMoveTo;
+                                        }
+                                        else if (nMoveFrom < nActPageId && 
nMoveTo >= nActPageId)
+                                        {
+                                            nNextPageId = nActPageId - 1;
+                                        }
+                                        else if (nMoveFrom > nActPageId && 
nMoveTo <= nActPageId)
+                                        {
+                                            nNextPageId = nActPageId + 1;
+                                        }
+                                    }
+                                }
+                                else if (aItem3.first == "DuplicateSlide")
+                                {
+                                    int nDupSlideId = nActPageId;
+                                    if (aItem3.second.get_value<std::string>() 
!= "")
+                                    {
+                                        nDupSlideId = 
aItem3.second.get_value<int>();
+                                    }
+
+                                    if (nDupSlideId >= nPageCount)
+                                    {
+                                        lcl_LogWarning(
+                                            "FillApi SlideCmd: Slide idx >= 
Slide count. '"
+                                            + aItem3.first + ": " + 
std::to_string(nDupSlideId)
+                                            + "' (Slide count = " + 
std::to_string(nPageCount));
+                                        nDupSlideId = nPageCount - 1;
+                                    }
+                                    else if (nDupSlideId < 0)
+                                    {
+                                        lcl_LogWarning("FillApi SlideCmd: 
Slide idx < 0. '"
+                                                       + aItem3.first + ": "
+                                                       + 
std::to_string(nDupSlideId) + "'");
+                                        nDupSlideId = 0;
+                                    }
+                                    GetDoc()->DuplicatePage(nDupSlideId);
+                                    // Jump to the created page.
+                                    nNextPageId = nDupSlideId + 1;
+                                    // Make sure the current page will be set 
also.
+                                    nActPageId = nDupSlideId;
+                                }
+                                else if (aItem3.first == "ChangeLayout"
+                                         || aItem3.first == 
"ChangeLayoutByName")
+                                {
+                                    AutoLayout nLayoutId;
+                                    if (aItem3.first == "ChangeLayoutByName")
+                                    {
+                                        std::string aLayoutName
+                                            = 
aItem3.second.get_value<std::string>();
+
+                                        nLayoutId = SdPage::stringToAutoLayout(
+                                            OStringToOUString(aLayoutName, 
RTL_TEXTENCODING_UTF8));
+                                        if (nLayoutId == AUTOLAYOUT_END)
+                                        {
+                                            lcl_LogWarning(
+                                                "FillApi SlideCmd: Layout name 
not found at: '"
+                                                + aItem3.first + ": " + 
aLayoutName + "'");
+                                            nLayoutId = 
AUTOLAYOUT_TITLE_CONTENT;
+                                        }
+                                    }
+                                    else
+                                    {
+                                        nLayoutId = static_cast<AutoLayout>(
+                                            aItem3.second.get_value<int>());
+                                        if (nLayoutId < AUTOLAYOUT_START
+                                            || nLayoutId >= AUTOLAYOUT_END)
+                                        {
+                                            lcl_LogWarning(
+                                                "FillApi SlideCmd: Wrong 
Layout index at: '"
+                                                + aItem3.first + ": " + 
std::to_string(nLayoutId)
+                                                + "'");
+                                            nLayoutId = 
AUTOLAYOUT_TITLE_CONTENT;
+                                        }
+                                    }
+
+                                    // Todo warning:  ... if (nLayoutId >= ???)
+                                    GetDoc()
+                                        ->GetSdPage(nActPageId, 
PageKind::Standard)
+                                        ->SetAutoLayout(nLayoutId, true);
+                                }
+                                else if (aItem3.first == "RenameSlide")
+                                {
+                                    SdPage* pPageStandard
+                                        = GetDoc()->GetSdPage(nActPageId, 
PageKind::Standard);
+                                    pPageStandard->SetName(
+                                        
OStringToOUString(aItem3.second.get_value<std::string>(),
+                                                          
RTL_TEXTENCODING_UTF8));
+                                }
+                                else if (aItem3.first.starts_with("SetText."))
+                                {
+                                    int nObjId = stoi(aItem3.first.substr(8));
+
+                                    SdPage* pPageStandard
+                                        = GetDoc()->GetSdPage(nActPageId, 
PageKind::Standard);
+                                    int nObjCount = 
pPageStandard->GetObjCount();
+                                    if (nObjId < 0)
+                                    {
+                                        lcl_LogWarning("FillApi SlideCmd 
SetText: Object idx < 0. '"
+                                                       + aItem3.first + "'");
+                                    }
+                                    else if (nObjId < nObjCount)
+                                    {
+                                        SdrObject* pSdrObj = 
pPageStandard->GetObj(nObjId);
+                                        if (pSdrObj->IsSdrTextObj())
+                                        {
+                                            SdrTextObj* pSdrTxt = 
static_cast<SdrTextObj*>(pSdrObj);
+                                            pSdrTxt->SetText(OStringToOUString(
+                                                
aItem3.second.get_value<std::string>(),
+                                                RTL_TEXTENCODING_UTF8));
+
+                                            // Todo: maybe with empty string 
it should work elseway?
+                                            pSdrObj->SetEmptyPresObj(false);
+                                        }
+                                    }
+                                    else
+                                    {
+                                        lcl_LogWarning(
+                                            "FillApi SlideCmd SetText: Object 
idx >= Object Count. '"
+                                            + aItem3.first
+                                            + "' (Object Count = " + 
std::to_string(nPageCount));
+                                    }
+                                }
+                                else if (aItem3.first == "MarkObject"
+                                         || aItem3.first == "UnMarkObject")
+                                {
+                                    bool bUnMark = aItem3.first == 
"UnMarkObject";
+                                    int nObjId
+                                        = 
static_cast<AutoLayout>(aItem3.second.get_value<int>());
+
+                                    SdPage* pPageStandard
+                                        = GetDoc()->GetSdPage(nActPageId, 
PageKind::Standard);
+                                    int nObjCount = 
pPageStandard->GetObjCount();
+
+                                    // Todo: check id vs count
+                                    if (nObjId < 0)
+                                    {
+                                        lcl_LogWarning("FillApi SlideCmd: 
Object idx < 0 at: '"
+                                                       + aItem3.first + 
std::to_string(nObjId)
+                                                       + "'");
+                                    }
+                                    if (nObjId < nObjCount)
+                                    {
+                                        SdrObject* pSdrObj = 
pPageStandard->GetObj(nObjId);
+                                        mpDrawView->MarkObj(pSdrObj, 
mpDrawView->GetSdrPageView(),
+                                                            bUnMark);
+                                    }
+                                    else
+                                    {
+                                        lcl_LogWarning(
+                                            "FillApi SlideCmd: Object idx > 
Object Count. '"
+                                            + aItem3.first + 
std::to_string(nObjId)
+                                            + "' (Object Count = " + 
std::to_string(nObjId));
+                                    }
+                                }
+                                else if (aItem3.first == "UnoCommand")
+                                {
+                                    std::string aText = 
aItem3.second.get_value<std::string>();
+                                    if (aText.size() > 0)
+                                    {
+                                        OUString aCmd;
+                                        std::vector<beans::PropertyValue> aArg;
+                                        std::size_t nSpace = aText.find(' ');
+                                        if (nSpace != std::string::npos)
+                                        {
+                                            aCmd = 
OStringToOUString(aText.substr(0, nSpace),
+                                                                     
RTL_TEXTENCODING_UTF8);
+                                            std::string aArgText = 
aText.substr(nSpace + 1);
+
+                                            aArg = 
comphelper::JsonToPropertyValues(aArgText);
+                                        }
+                                        else
+                                        {
+                                            aCmd = OStringToOUString(aText, 
RTL_TEXTENCODING_UTF8);
+                                        }
+
+                                        // Check if the uno command is allowed
+                                        const std::map<std::u16string_view, 
KitUnoCommand>& rUnoCommandList = GetKitUnoCommandList();
+                                        const bool bSupportedCmd = 
rUnoCommandList.find(aCmd) != rUnoCommandList.end();
+                                        if (bSupportedCmd)
+                                        {
+                                            // Make the uno command synchron
+                                            
aArg.push_back(comphelper::makePropertyValue(
+                                                "SynchronMode", true));
+
+                                            // Todo: check why it does not 
work on my windows system
+                                            comphelper::dispatchCommand(
+                                                aCmd, 
comphelper::containerToSequence(aArg));
+                                        }
+                                        else
+                                        {
+                                            lcl_LogWarning(
+                                                "FillApi SlideCmd: uno command 
not recognized'"
+                                                + aText + "'");
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            rReq.Done();
+        }
+        break;
+
         case SID_INSERTPAGE:
         case SID_INSERTPAGE_QUICK:
         {
diff --git a/sfx2/source/control/unoctitm.cxx b/sfx2/source/control/unoctitm.cxx
index 984bd83c96c7..976cd48ce152 100644
--- a/sfx2/source/control/unoctitm.cxx
+++ b/sfx2/source/control/unoctitm.cxx
@@ -64,6 +64,7 @@
 #include <slotserv.hxx>
 #include <rtl/ustring.hxx>
 #include <sfx2/lokhelper.hxx>
+#include <sfx2/lokunocmdlist.hxx>
 
 #include <memory>
 #include <string_view>
@@ -1148,275 +1149,319 @@ OString TableSizePayload(sal_uInt16, SfxViewFrame*, 
const css::frame::FeatureSta
     return aBuffer.makeStringAndClear();
 }
 
-constexpr auto handlers = frozen::make_unordered_map<std::u16string_view, 
PayloadGetter_t>({
-    { u"Bold", IsActivePayload },
-    { u"CenterPara", IsActivePayload },
-    { u"CharBackgroundExt", IsActivePayload },
-    { u"ControlCodes", IsActivePayload },
-    { u"DefaultBullet", IsActivePayload },
-    { u"DefaultNumbering", IsActivePayload },
-    { u"Italic", IsActivePayload },
-    { u"JustifyPara", IsActivePayload },
-    { u"LeftPara", IsActivePayload },
-    { u"OutlineFont", IsActivePayload },
-    { u"RightPara", IsActivePayload },
-    { u"Shadowed", IsActivePayload },
-    { u"SpellOnline", IsActivePayload },
-    { u"OnlineAutoFormat", IsActivePayload },
-    { u"SubScript", IsActivePayload },
-    { u"SuperScript", IsActivePayload },
-    { u"Strikeout", IsActivePayload },
-    { u"Underline", IsActivePayload },
-    { u"ModifiedStatus", IsActivePayload },
-    { u"TrackChanges", IsActivePayload },
-    { u"ShowTrackedChanges", IsActivePayload },
-    { u"AlignLeft", IsActivePayload },
-    { u"AlignHorizontalCenter", IsActivePayload },
-    { u"AlignRight", IsActivePayload },
-    { u"DocumentRepair", IsActivePayload },
-    { u"ObjectAlignLeft", IsActivePayload },
-    { u"ObjectAlignRight", IsActivePayload },
-    { u"AlignCenter", IsActivePayload },
-    { u"AlignUp", IsActivePayload },
-    { u"AlignMiddle", IsActivePayload },
-    { u"AlignDown", IsActivePayload },
-    { u"TraceChangeMode", IsActivePayload },
-    { u"FormatPaintbrush", IsActivePayload },
-    { u"FreezePanes", IsActivePayload },
-    { u"Sidebar", IsActivePayload },
-    { u"SpacePara1", IsActivePayload },
-    { u"SpacePara15", IsActivePayload },
-    { u"SpacePara2", IsActivePayload },
-    { u"DataFilterAutoFilter", IsActivePayload },
-    { u"CellProtection", IsActivePayload },
-    { u"NormalMultiPaneGUI", IsActivePayload },
-    { u"NotesMode", IsActivePayload },
-    { u"SlideMasterPage", IsActivePayload },
-
-    { u"CharFontName", FontNamePayload },
-
-    { u"FontHeight", FontHeightPayload },
-
-    { u"StyleApply", StyleApplyPayload },
-
-    { u"BackColor", ColorPayload },
-    { u"BackgroundColor", ColorPayload },
-    { u"TableCellBackgroundColor", ColorPayload },
-    { u"CharBackColor", ColorPayload },
-    { u"Color", ColorPayload },
-    { u"FontColor", ColorPayload },
-    { u"FrameLineColor", ColorPayload },
-    { u"GlowColor", ColorPayload },
-
-    { u"Undo", UndoRedoPayload },
-    { u"Redo", UndoRedoPayload },
-
-    { u"Cut", EnabledPayload },
-    { u"Copy", EnabledPayload },
-    { u"Paste", EnabledPayload },
-    { u"SelectAll", EnabledPayload },
-    { u"InsertAnnotation", EnabledPayload },
-    { u"DeleteAnnotation", EnabledPayload },
-    { u"ResolveAnnotation", EnabledPayload },
-    { u"ResolveAnnotationThread", EnabledPayload },
-    { u"PromoteComment", EnabledPayload },
-    { u"InsertRowsBefore", EnabledPayload },
-    { u"InsertRowsAfter", EnabledPayload },
-    { u"InsertColumnsBefore", EnabledPayload },
-    { u"InsertColumnsAfter", EnabledPayload },
-    { u"NameGroup", EnabledPayload },
-    { u"ObjectTitleDescription", EnabledPayload },
-    { u"MergeCells", EnabledPayload },
-    { u"InsertObjectChart", EnabledPayload },
-    { u"InsertSection", EnabledPayload },
-    { u"InsertPagebreak", EnabledPayload },
-    { u"InsertColumnBreak", EnabledPayload },
-    { u"HyperlinkDialog", EnabledPayload },
-    { u"InsertSymbol", EnabledPayload },
-    { u"InsertPage", EnabledPayload },
-    { u"DeletePage", EnabledPayload },
-    { u"DuplicatePage", EnabledPayload },
-    { u"DeleteRows", EnabledPayload },
-    { u"DeleteColumns", EnabledPayload },
-    { u"DeleteTable", EnabledPayload },
-    { u"SelectTable", EnabledPayload },
-    { u"EntireRow", EnabledPayload },
-    { u"EntireColumn", EnabledPayload },
-    { u"EntireCell", EnabledPayload },
-    { u"SortAscending", EnabledPayload },
-    { u"SortDescending", EnabledPayload },
-    { u"AcceptAllTrackedChanges", EnabledPayload },
-    { u"RejectAllTrackedChanges", EnabledPayload },
-    { u"AcceptTrackedChange", EnabledPayload },
-    { u"RejectTrackedChange", EnabledPayload },
-    { u"AcceptTrackedChangeToNext", EnabledPayload },
-    { u"RejectTrackedChangeToNext", EnabledPayload },
-    { u"NextTrackedChange", EnabledPayload },
-    { u"PreviousTrackedChange", EnabledPayload },
-    { u"FormatGroup", EnabledPayload },
-    { u"ObjectBackOne", EnabledPayload },
-    { u"SendToBack", EnabledPayload },
-    { u"ObjectForwardOne", EnabledPayload },
-    { u"BringToFront", EnabledPayload },
-    { u"WrapRight", EnabledPayload },
-    { u"WrapThrough", EnabledPayload },
-    { u"WrapLeft", EnabledPayload },
-    { u"WrapIdeal", EnabledPayload },
-    { u"WrapOn", EnabledPayload },
-    { u"WrapOff", EnabledPayload },
-    { u"UpdateCurIndex", EnabledPayload },
-    { u"InsertCaptionDialog", EnabledPayload },
-    { u"SplitTable", EnabledPayload },
-    { u"SplitCell", EnabledPayload },
-    { u"DeleteNote", EnabledPayload },
-    { u"AcceptChanges", EnabledPayload },
-    { u"SetDefault", EnabledPayload },
-    { u"ParaspaceIncrease", EnabledPayload },
-    { u"ParaspaceDecrease", EnabledPayload },
-    { u"TableDialog", EnabledPayload },
-    { u"FormatCellDialog", EnabledPayload },
-    { u"FontDialog", EnabledPayload },
-    { u"ParagraphDialog", EnabledPayload },
-    { u"OutlineBullet", EnabledPayload },
-    { u"InsertIndexesEntry", EnabledPayload },
-    { u"TransformDialog", EnabledPayload },
-    { u"EditRegion", EnabledPayload },
-    { u"ThesaurusDialog", EnabledPayload },
-    { u"OutlineRight", EnabledPayload },
-    { u"OutlineLeft", EnabledPayload },
-    { u"OutlineDown", EnabledPayload },
-    { u"OutlineUp", EnabledPayload },
-    { u"FormatArea", EnabledPayload },
-    { u"FormatLine", EnabledPayload },
-    { u"FormatColumns", EnabledPayload },
-    { u"Watermark", EnabledPayload },
-    { u"InsertBreak", EnabledPayload },
-    { u"InsertEndnote", EnabledPayload },
-    { u"InsertFootnote", EnabledPayload },
-    { u"InsertReferenceField", EnabledPayload },
-    { u"InsertBookmark", EnabledPayload },
-    { u"InsertAuthoritiesEntry", EnabledPayload },
-    { u"InsertMultiIndex", EnabledPayload },
-    { u"InsertField", EnabledPayload },
-    { u"PageNumberWizard", EnabledPayload },
-    { u"InsertPageNumberField", EnabledPayload },
-    { u"InsertPageCountField", EnabledPayload },
-    { u"InsertDateField", EnabledPayload },
-    { u"InsertTitleField", EnabledPayload },
-    { u"InsertFieldCtrl", EnabledPayload },
-    { u"CharmapControl", EnabledPayload },
-    { u"EnterGroup", EnabledPayload },
-    { u"LeaveGroup", EnabledPayload },
-    { u"Combine", EnabledPayload },
-    { u"Merge", EnabledPayload },
-    { u"Dismantle", EnabledPayload },
-    { u"Substract", EnabledPayload },
-    { u"DistributeSelection", EnabledPayload },
-    { u"Intersect", EnabledPayload },
-    { u"ResetAttributes", EnabledPayload },
-    { u"IncrementIndent", EnabledPayload },
-    { u"DecrementIndent", EnabledPayload },
-    { u"EditHeaderAndFooter", EnabledPayload },
-    { u"InsertSparkline", EnabledPayload },
-    { u"DeleteSparkline", EnabledPayload },
-    { u"DeleteSparklineGroup", EnabledPayload },
-    { u"EditSparklineGroup", EnabledPayload },
-    { u"EditSparkline", EnabledPayload },
-    { u"GroupSparklines", EnabledPayload },
-    { u"UngroupSparklines", EnabledPayload },
-    { u"FormatSparklineMenu", EnabledPayload },
-    { u"DataDataPilotRun", EnabledPayload },
-    { u"RecalcPivotTable", EnabledPayload },
-    { u"DeletePivotTable", EnabledPayload },
-    { u"NumberFormatDecDecimals", EnabledPayload },
-    { u"NumberFormatIncDecimals", EnabledPayload },
-    { u"Protect", EnabledPayload },
-    { u"UnsetCellsReadOnly", EnabledPayload },
-    { u"ContentControlProperties", EnabledPayload },
-    { u"DeleteContentControl", EnabledPayload },
-    { u"InsertCheckboxContentControl", EnabledPayload },
-    { u"InsertContentControl", EnabledPayload },
-    { u"InsertDateContentControl", EnabledPayload },
-    { u"InsertDropdownContentControl", EnabledPayload },
-    { u"InsertPlainTextContentControl", EnabledPayload },
-    { u"InsertPictureContentControl", EnabledPayload },
-    { u"ChangeBezier", EnabledPayload },
-    { u"DistributeHorzCenter", EnabledPayload },
-    { u"DistributeHorzDistance", EnabledPayload },
-    { u"DistributeHorzLeft", EnabledPayload },
-    { u"DistributeHorzRight", EnabledPayload },
-    { u"DistributeVertBottom", EnabledPayload },
-    { u"DistributeVertCenter", EnabledPayload },
-    { u"DistributeVertDistance", EnabledPayload },
-    { u"DistributeVertTop", EnabledPayload },
-    { u"AnimationEffects", EnabledPayload },
-    { u"ExecuteAnimationEffect", EnabledPayload },
-
-    { u"ParaLeftToRight", ParaDirectionPayload },
-    { u"ParaRightToLeft", ParaDirectionPayload },
-
-    { u"AssignLayout", Int32Payload },
-    { u"StatusSelectionMode", Int32Payload },
-    { u"Signature", Int32Payload },
-    { u"SelectionMode", Int32Payload },
-    { u"StatusBarFunc", Int32Payload },
-
-    { u"TransformPosX", TransformPayload },
-    { u"TransformPosY", TransformPayload },
-    { u"TransformWidth", TransformPayload },
-    { u"TransformHeight", TransformPayload },
-
-    { u"StatusDocPos", StringPayload },
-    { u"StatusPageStyle", StringPayload },
-    { u"StateWordCount", StringPayload },
-    { u"PageStyleName", StringPayload },
-    { u"PageStatus", StringPayload },
-    { u"LayoutStatus", StringPayload },
-    { u"Scale", StringPayload },
-    { u"Context", StringPayload },
-
-    { u"RowColSelCount", RowColSelCountPayload },
-
-    { u"StateTableCell", StateTableCellPayload },
-
-    { u"InsertMode", BooleanPayload },
-    { u"WrapText", BooleanPayload },
-    { u"NumberFormatCurrency", BooleanPayload },
-    { u"NumberFormatPercent", BooleanPayload },
-    { u"NumberFormatDecimal", BooleanPayload },
-    { u"NumberFormatDate", BooleanPayload },
-    { u"ShowResolvedAnnotations", BooleanPayload },
-
-    { u"ToggleMergeCells", BooleanOrDisabledPayload },
-    { u"SheetRightToLeft", BooleanOrDisabledPayload },
-    { u"ToggleSheetGrid", BooleanOrDisabledPayload },
-    { u"EditDoc", BooleanOrDisabledPayload },
-
-    { u"Position", PointPayload },
-    { u"FreezePanesColumn", PointPayload },
-    { u"FreezePanesRow", PointPayload },
-
-    { u"Size", SizePayload },
-
-    { u"LanguageStatus", StringOrStrSeqPayload },
-    { u"StatePageNumber", StringOrStrSeqPayload },
-
-    { u"InsertPageHeader", StrSeqPayload },
-    { u"InsertPageFooter", StrSeqPayload },
-
-    { u"TableColumWidth", TableSizePayload },
-    { u"TableRowHeight", TableSizePayload },
+constexpr auto enumToPayload = frozen::make_unordered_map<PayloadType, 
PayloadGetter_t>({
+    { PayloadType::None, nullptr },
+    { PayloadType::IsActivePayload, IsActivePayload },
+    { PayloadType::FontNamePayload, FontNamePayload },
+    { PayloadType::FontHeightPayload, FontHeightPayload },
+    { PayloadType::StyleApplyPayload, StyleApplyPayload },
+    { PayloadType::ColorPayload, ColorPayload },
+    { PayloadType::UndoRedoPayload, UndoRedoPayload },
+    { PayloadType::EnabledPayload, EnabledPayload },
+    { PayloadType::ParaDirectionPayload, ParaDirectionPayload },
+    { PayloadType::Int32Payload, Int32Payload },
+    { PayloadType::TransformPayload, TransformPayload },
+    { PayloadType::StringPayload, StringPayload },
+    { PayloadType::RowColSelCountPayload, RowColSelCountPayload },
+    { PayloadType::StateTableCellPayload, StateTableCellPayload },
+    { PayloadType::BooleanPayload, BooleanPayload },
+    { PayloadType::BooleanOrDisabledPayload, BooleanOrDisabledPayload },
+    { PayloadType::PointPayload, PointPayload },
+    { PayloadType::SizePayload, SizePayload },
+    { PayloadType::StringOrStrSeqPayload, StringOrStrSeqPayload },
+    { PayloadType::StrSeqPayload, StrSeqPayload },
+    { PayloadType::TableSizePayload, TableSizePayload },
 });
 }
 
+const std::map<std::u16string_view, KitUnoCommand>& GetKitUnoCommandList()
+{
+    static std::map<std::u16string_view, KitUnoCommand> aUnoCommandList = {
+        { u"Bold", { PayloadType::IsActivePayload, true } },
+        { u"CenterPara", { PayloadType::IsActivePayload, true } },
+
+        { u"CharBackgroundExt", { PayloadType::IsActivePayload, true } },
+        { u"ControlCodes", { PayloadType::IsActivePayload, true } },
+        { u"DefaultBullet", { PayloadType::IsActivePayload, true } },
+        { u"DefaultNumbering", { PayloadType::IsActivePayload, true } },
+        { u"Italic", { PayloadType::IsActivePayload, true } },
+        { u"JustifyPara", { PayloadType::IsActivePayload, true } },
+        { u"LeftPara", { PayloadType::IsActivePayload, true } },
+        { u"OutlineFont", { PayloadType::IsActivePayload, true } },
+        { u"RightPara", { PayloadType::IsActivePayload, true } },
+        { u"Shadowed", { PayloadType::IsActivePayload, true } },
+        { u"SpellOnline", { PayloadType::IsActivePayload, true } },
+        { u"OnlineAutoFormat", { PayloadType::IsActivePayload, true } },
+        { u"SubScript", { PayloadType::IsActivePayload, true } },
+        { u"SuperScript", { PayloadType::IsActivePayload, true } },
+        { u"Strikeout", { PayloadType::IsActivePayload, true } },
+        { u"Underline", { PayloadType::IsActivePayload, true } },
+        { u"ModifiedStatus", { PayloadType::IsActivePayload, true } },
+        { u"TrackChanges", { PayloadType::IsActivePayload, true } },
+        { u"ShowTrackedChanges", { PayloadType::IsActivePayload, true } },
+        { u"AlignLeft", { PayloadType::IsActivePayload, true } },
+        { u"AlignHorizontalCenter", { PayloadType::IsActivePayload, true } },
+        { u"AlignRight", { PayloadType::IsActivePayload, true } },
+        { u"DocumentRepair", { PayloadType::IsActivePayload, true } },
+        { u"ObjectAlignLeft", { PayloadType::IsActivePayload, true } },
+        { u"ObjectAlignRight", { PayloadType::IsActivePayload, true } },
+        { u"AlignCenter", { PayloadType::IsActivePayload, true } },
+        { u"AlignUp", { PayloadType::IsActivePayload, true } },
+        { u"AlignMiddle", { PayloadType::IsActivePayload, true } },
+        { u"AlignDown", { PayloadType::IsActivePayload, true } },
+        { u"TraceChangeMode", { PayloadType::IsActivePayload, true } },
+        { u"FormatPaintbrush", { PayloadType::IsActivePayload, true } },
+        { u"FreezePanes", { PayloadType::IsActivePayload, true } },
+        { u"Sidebar", { PayloadType::IsActivePayload, true } },
+        { u"SpacePara1", { PayloadType::IsActivePayload, true } },
+        { u"SpacePara15", { PayloadType::IsActivePayload, true } },
+        { u"SpacePara2", { PayloadType::IsActivePayload, true } },
+        { u"DataFilterAutoFilter", { PayloadType::IsActivePayload, true } },
+        { u"CellProtection", { PayloadType::IsActivePayload, true } },
+        { u"NormalMultiPaneGUI", { PayloadType::IsActivePayload, false } },
+        { u"NotesMode", { PayloadType::IsActivePayload, false } },
+        { u"SlideMasterPage", { PayloadType::IsActivePayload, false } },
+
+        { u"CharFontName", { PayloadType::FontNamePayload, true } },
+
+        { u"FontHeight", { PayloadType::FontHeightPayload, true } },
+
+        { u"StyleApply", { PayloadType::StyleApplyPayload, true } },
+
+        { u"BackColor", { PayloadType::ColorPayload, false } },
+        { u"BackgroundColor", { PayloadType::ColorPayload, true } },
+        { u"TableCellBackgroundColor", { PayloadType::ColorPayload, true } },
+        { u"CharBackColor", { PayloadType::ColorPayload, true } },
+        { u"Color", { PayloadType::ColorPayload, true } },
+        { u"FontColor", { PayloadType::ColorPayload, true } },
+        { u"FrameLineColor", { PayloadType::ColorPayload, true } },
+        { u"GlowColor", { PayloadType::ColorPayload, false } },
+
+        { u"Undo", { PayloadType::UndoRedoPayload, true } },
+        { u"Redo", { PayloadType::UndoRedoPayload, true } },
+
+        { u"Cut", { PayloadType::EnabledPayload, true } },
+        { u"Copy", { PayloadType::EnabledPayload, true } },
+        { u"Paste", { PayloadType::EnabledPayload, true } },
+        { u"SelectAll", { PayloadType::EnabledPayload, true } },
+        { u"InsertAnnotation", { PayloadType::EnabledPayload, true } },
+        { u"DeleteAnnotation", { PayloadType::EnabledPayload, true } },
+        { u"ResolveAnnotation", { PayloadType::EnabledPayload, false } },
+        { u"ResolveAnnotationThread", { PayloadType::EnabledPayload, false } },
+        { u"PromoteComment", { PayloadType::EnabledPayload, true } },
+        { u"InsertRowsBefore", { PayloadType::EnabledPayload, true } },
+        { u"InsertRowsAfter", { PayloadType::EnabledPayload, true } },
+        { u"InsertColumnsBefore", { PayloadType::EnabledPayload, true } },
+        { u"InsertColumnsAfter", { PayloadType::EnabledPayload, true } },
+        { u"NameGroup", { PayloadType::EnabledPayload, true } },
+        { u"ObjectTitleDescription", { PayloadType::EnabledPayload, true } },
+        { u"MergeCells", { PayloadType::EnabledPayload, true } },
+        { u"InsertObjectChart", { PayloadType::EnabledPayload, true } },
+        { u"InsertSection", { PayloadType::EnabledPayload, true } },
+        { u"InsertPagebreak", { PayloadType::EnabledPayload, true } },
+        { u"InsertColumnBreak", { PayloadType::EnabledPayload, true } },
+        { u"HyperlinkDialog", { PayloadType::EnabledPayload, true } },
+        { u"InsertSymbol", { PayloadType::EnabledPayload, true } },
+        { u"InsertPage", { PayloadType::EnabledPayload, true } },
+        { u"DeletePage", { PayloadType::EnabledPayload, true } },
+        { u"DuplicatePage", { PayloadType::EnabledPayload, true } },
+        { u"DeleteRows", { PayloadType::EnabledPayload, true } },
+        { u"DeleteColumns", { PayloadType::EnabledPayload, true } },
+        { u"DeleteTable", { PayloadType::EnabledPayload, true } },
+        { u"SelectTable", { PayloadType::EnabledPayload, true } },
+        { u"EntireRow", { PayloadType::EnabledPayload, true } },
+        { u"EntireColumn", { PayloadType::EnabledPayload, true } },
+        { u"EntireCell", { PayloadType::EnabledPayload, true } },
+        { u"SortAscending", { PayloadType::EnabledPayload, true } },
+        { u"SortDescending", { PayloadType::EnabledPayload, true } },
+        { u"AcceptAllTrackedChanges", { PayloadType::EnabledPayload, true } },
+        { u"RejectAllTrackedChanges", { PayloadType::EnabledPayload, true } },
+        { u"AcceptTrackedChange", { PayloadType::EnabledPayload, true } },
+        { u"RejectTrackedChange", { PayloadType::EnabledPayload, true } },
+        { u"AcceptTrackedChangeToNext", { PayloadType::EnabledPayload, true } 
},
+        { u"RejectTrackedChangeToNext", { PayloadType::EnabledPayload, true } 
},
+        { u"NextTrackedChange", { PayloadType::EnabledPayload, true } },
+        { u"PreviousTrackedChange", { PayloadType::EnabledPayload, true } },
+        { u"FormatGroup", { PayloadType::EnabledPayload, true } },
+        { u"ObjectBackOne", { PayloadType::EnabledPayload, true } },
+        { u"SendToBack", { PayloadType::EnabledPayload, true } },
+        { u"ObjectForwardOne", { PayloadType::EnabledPayload, true } },
+        { u"BringToFront", { PayloadType::EnabledPayload, true } },
+        { u"WrapRight", { PayloadType::EnabledPayload, true } },
+        { u"WrapThrough", { PayloadType::EnabledPayload, true } },
+        { u"WrapLeft", { PayloadType::EnabledPayload, true } },
+        { u"WrapIdeal", { PayloadType::EnabledPayload, true } },
+        { u"WrapOn", { PayloadType::EnabledPayload, true } },
+        { u"WrapOff", { PayloadType::EnabledPayload, true } },
+        { u"UpdateCurIndex", { PayloadType::EnabledPayload, true } },
+        { u"InsertCaptionDialog", { PayloadType::EnabledPayload, true } },
+        { u"SplitTable", { PayloadType::EnabledPayload, true } },
+        { u"SplitCell", { PayloadType::EnabledPayload, true } },
+        { u"DeleteNote", { PayloadType::EnabledPayload, true } },
+        { u"AcceptChanges", { PayloadType::EnabledPayload, true } },
+        { u"SetDefault", { PayloadType::EnabledPayload, true } },
+        { u"ParaspaceIncrease", { PayloadType::EnabledPayload, true } },
+        { u"ParaspaceDecrease", { PayloadType::EnabledPayload, true } },
+        { u"TableDialog", { PayloadType::EnabledPayload, true } },
+        { u"FormatCellDialog", { PayloadType::EnabledPayload, true } },
+        { u"FontDialog", { PayloadType::EnabledPayload, true } },
+        { u"ParagraphDialog", { PayloadType::EnabledPayload, true } },
+        { u"OutlineBullet", { PayloadType::EnabledPayload, true } },
+        { u"InsertIndexesEntry", { PayloadType::EnabledPayload, true } },
+        { u"TransformDialog", { PayloadType::EnabledPayload, true } },
+        { u"EditRegion", { PayloadType::EnabledPayload, true } },
+        { u"ThesaurusDialog", { PayloadType::EnabledPayload, true } },
+        { u"OutlineRight", { PayloadType::EnabledPayload, false } },
+        { u"OutlineLeft", { PayloadType::EnabledPayload, false } },
+        { u"OutlineDown", { PayloadType::EnabledPayload, false } },
+        { u"OutlineUp", { PayloadType::EnabledPayload, false } },
+        { u"FormatArea", { PayloadType::EnabledPayload, true } },
+        { u"FormatLine", { PayloadType::EnabledPayload, true } },
+        { u"FormatColumns", { PayloadType::EnabledPayload, true } },
+        { u"Watermark", { PayloadType::EnabledPayload, true } },
+        { u"InsertBreak", { PayloadType::EnabledPayload, true } },
+        { u"InsertEndnote", { PayloadType::EnabledPayload, true } },
+        { u"InsertFootnote", { PayloadType::EnabledPayload, true } },
+        { u"InsertReferenceField", { PayloadType::EnabledPayload, true } },
+        { u"InsertBookmark", { PayloadType::EnabledPayload, true } },
+        { u"InsertAuthoritiesEntry", { PayloadType::EnabledPayload, true } },
+        { u"InsertMultiIndex", { PayloadType::EnabledPayload, true } },
+        { u"InsertField", { PayloadType::EnabledPayload, true } },
+        { u"PageNumberWizard", { PayloadType::EnabledPayload, true } },
+        { u"InsertPageNumberField", { PayloadType::EnabledPayload, true } },
+        { u"InsertPageCountField", { PayloadType::EnabledPayload, true } },
+        { u"InsertDateField", { PayloadType::EnabledPayload, true } },
+        { u"InsertTitleField", { PayloadType::EnabledPayload, true } },
+        { u"InsertFieldCtrl", { PayloadType::EnabledPayload, true } },
+        { u"CharmapControl", { PayloadType::EnabledPayload, true } },
+        { u"EnterGroup", { PayloadType::EnabledPayload, true } },
+        { u"LeaveGroup", { PayloadType::EnabledPayload, true } },
+        { u"Combine", { PayloadType::EnabledPayload, true } },
+        { u"Merge", { PayloadType::EnabledPayload, true } },
+        { u"Dismantle", { PayloadType::EnabledPayload, true } },
+        { u"Substract", { PayloadType::EnabledPayload, true } },
+        { u"DistributeSelection", { PayloadType::EnabledPayload, true } },
+        { u"Intersect", { PayloadType::EnabledPayload, true } },
+        { u"ResetAttributes", { PayloadType::EnabledPayload, true } },
+        { u"IncrementIndent", { PayloadType::EnabledPayload, true } },
+        { u"DecrementIndent", { PayloadType::EnabledPayload, true } },
+        { u"EditHeaderAndFooter", { PayloadType::EnabledPayload, true } },
+        { u"InsertSparkline", { PayloadType::EnabledPayload, true } },
+        { u"DeleteSparkline", { PayloadType::EnabledPayload, true } },
+        { u"DeleteSparklineGroup", { PayloadType::EnabledPayload, true } },
+        { u"EditSparklineGroup", { PayloadType::EnabledPayload, true } },
+        { u"EditSparkline", { PayloadType::EnabledPayload, true } },
+        { u"GroupSparklines", { PayloadType::EnabledPayload, true } },
+        { u"UngroupSparklines", { PayloadType::EnabledPayload, true } },
+        { u"FormatSparklineMenu", { PayloadType::EnabledPayload, true } },
+        { u"DataDataPilotRun", { PayloadType::EnabledPayload, true } },
+        { u"RecalcPivotTable", { PayloadType::EnabledPayload, true } },
+        { u"DeletePivotTable", { PayloadType::EnabledPayload, true } },
+        { u"NumberFormatDecDecimals", { PayloadType::EnabledPayload, true } },
+        { u"NumberFormatIncDecimals", { PayloadType::EnabledPayload, true } },
+        { u"Protect", { PayloadType::EnabledPayload, true } },
+        { u"UnsetCellsReadOnly", { PayloadType::EnabledPayload, true } },
+        { u"ContentControlProperties", { PayloadType::EnabledPayload, true } },
+        { u"DeleteContentControl", { PayloadType::EnabledPayload, true } },
+        { u"InsertCheckboxContentControl", { PayloadType::EnabledPayload, true 
} },
+        { u"InsertContentControl", { PayloadType::EnabledPayload, true } },
+        { u"InsertDateContentControl", { PayloadType::EnabledPayload, true } },
+        { u"InsertDropdownContentControl", { PayloadType::EnabledPayload, true 
} },
+        { u"InsertPlainTextContentControl", { PayloadType::EnabledPayload, 
true } },
+        { u"InsertPictureContentControl", { PayloadType::EnabledPayload, true 
} },
+        { u"ChangeBezier", { PayloadType::EnabledPayload, true } },
+        { u"DistributeHorzCenter", { PayloadType::EnabledPayload, true } },
+        { u"DistributeHorzDistance", { PayloadType::EnabledPayload, true } },
+        { u"DistributeHorzLeft", { PayloadType::EnabledPayload, true } },
+        { u"DistributeHorzRight", { PayloadType::EnabledPayload, true } },
+        { u"DistributeVertBottom", { PayloadType::EnabledPayload, true } },
+        { u"DistributeVertCenter", { PayloadType::EnabledPayload, true } },
+        { u"DistributeVertDistance", { PayloadType::EnabledPayload, true } },
+        { u"DistributeVertTop", { PayloadType::EnabledPayload, true } },
+        { u"AnimationEffects", { PayloadType::EnabledPayload, true } },
+        { u"ExecuteAnimationEffect", { PayloadType::EnabledPayload, true } },
+
+        { u"ParaLeftToRight", { PayloadType::ParaDirectionPayload, true } },
+        { u"ParaRightToLeft", { PayloadType::ParaDirectionPayload, true } },
+
+        { u"AssignLayout", { PayloadType::Int32Payload, true } },
+        { u"StatusSelectionMode", { PayloadType::Int32Payload, true } },
+        { u"Signature", { PayloadType::Int32Payload, false } },
+        { u"SelectionMode", { PayloadType::Int32Payload, true } },
+        { u"StatusBarFunc", { PayloadType::Int32Payload, true } },
+
+        { u"TransformPosX", { PayloadType::TransformPayload, true } },
+        { u"TransformPosY", { PayloadType::TransformPayload, true } },
+        { u"TransformWidth", { PayloadType::TransformPayload, true } },
+        { u"TransformHeight", { PayloadType::TransformPayload, true } },
+
+        { u"StatusDocPos", { PayloadType::StringPayload, true } },
+        { u"StatusPageStyle", { PayloadType::StringPayload, true } },
+        { u"StateWordCount", { PayloadType::StringPayload, true } },
+        { u"PageStyleName", { PayloadType::StringPayload, false } },
+        { u"PageStatus", { PayloadType::StringPayload, true } },
+        { u"LayoutStatus", { PayloadType::StringPayload, true } },
+        { u"Scale", { PayloadType::StringPayload, true } },
+        { u"Context", { PayloadType::StringPayload, true } },
+
+        { u"RowColSelCount", { PayloadType::RowColSelCountPayload, true } },
+
+        { u"StateTableCell", { PayloadType::StateTableCellPayload, true } },
+
+        { u"InsertMode", { PayloadType::BooleanPayload, true } },
+        { u"WrapText", { PayloadType::BooleanPayload, true } },
+        { u"NumberFormatCurrency", { PayloadType::BooleanPayload, true } },
+        { u"NumberFormatPercent", { PayloadType::BooleanPayload, true } },
+        { u"NumberFormatDecimal", { PayloadType::BooleanPayload, true } },
+        { u"NumberFormatDate", { PayloadType::BooleanPayload, true } },
+        { u"ShowResolvedAnnotations", { PayloadType::BooleanPayload, true } },
+
+        { u"ToggleMergeCells", { PayloadType::BooleanOrDisabledPayload, true } 
},
+        { u"SheetRightToLeft", { PayloadType::BooleanOrDisabledPayload, true } 
},
+        { u"ToggleSheetGrid", { PayloadType::BooleanOrDisabledPayload, true } 
},
+        { u"EditDoc", { PayloadType::BooleanOrDisabledPayload, true } },
+
+        { u"Position", { PayloadType::PointPayload, false } },
+        { u"FreezePanesColumn", { PayloadType::PointPayload, true } },
+        { u"FreezePanesRow", { PayloadType::PointPayload, true } },
+
+        { u"Size", { PayloadType::SizePayload, false } },
+
+        { u"LanguageStatus", { PayloadType::StringOrStrSeqPayload, true } },
+        { u"StatePageNumber", { PayloadType::StringOrStrSeqPayload, true } },
+
+        { u"InsertPageHeader", { PayloadType::StrSeqPayload, true } },
+        { u"InsertPageFooter", { PayloadType::StrSeqPayload, true } },
+
+        { u"TableColumWidth", { PayloadType::TableSizePayload, false } },
+        { u"TableRowHeight", { PayloadType::TableSizePayload, false } },
+
+        { u"BorderInner", { PayloadType::None, true } },
+        { u"BorderOuter", { PayloadType::None, true } },
+        { u"ChangeTheme", { PayloadType::None, true } },
+        { u"DeleteSlide", { PayloadType::None, true } },
+        { u"DuplicateSlide", { PayloadType::None, true } },
+        { u"InsertSlide", { PayloadType::None, true } },
+        { u"JumpToMark", { PayloadType::None, true } },
+        { u"MoveKeepInsertMode", { PayloadType::None, true } },
+        { u"Orientation", { PayloadType::None, true } },
+        { u"ReplyComment", { PayloadType::None, true } },
+        { u"ResolveComment", { PayloadType::None, true } },
+        { u"ResolveCommentThread", { PayloadType::None, true } },
+        { u"RunMacro", { PayloadType::None, true } },
+    };
+    return aUnoCommandList;
+}
+
 static void InterceptLOKStateChangeEvent(sal_uInt16 nSID, SfxViewFrame* 
pViewFrame, const css::frame::FeatureStateEvent& aEvent, const SfxPoolItem* 
pState)
 {
     const SfxViewShell* pViewShell = pViewFrame->GetViewShell();
     if (!comphelper::LibreOfficeKit::isActive() || !pViewShell)
         return;
 
-    auto handler = handlers.find(aEvent.FeatureURL.Path);
-    if (handler == handlers.end())
+    const std::map<std::u16string_view, KitUnoCommand>& rUnoCommandList = 
GetKitUnoCommandList();
+    auto handler = rUnoCommandList.find(aEvent.FeatureURL.Path);
+    if (handler == rUnoCommandList.end())
     {
         // Try to send JSON state version
         SfxLokHelper::sendUnoStatus(pViewShell, pState);
@@ -1424,8 +1469,11 @@ static void InterceptLOKStateChangeEvent(sal_uInt16 
nSID, SfxViewFrame* pViewFra
         return;
     }
 
-    pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_STATE_CHANGED,
-                                           handler->second(nSID, pViewFrame, 
aEvent, pState));
+    auto payloadIter = enumToPayload.find(handler->second.payloadType);
+    PayloadGetter_t pFunct = payloadIter != enumToPayload.end() ? 
payloadIter->second : nullptr;
+    if (pFunct != nullptr)
+        pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_STATE_CHANGED,
+                                               pFunct(nSID, pViewFrame, 
aEvent, pState));
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Reply via email to