desktop/source/lib/init.cxx         |  302 +++----------------
 include/sfx2/lokunocmdlist.hxx      |   52 +++
 sd/inc/app.hrc                      |    2 
 sd/inc/sdpage.hxx                   |    3 
 sd/qa/unit/uiimpress.cxx            |  108 ++++++
 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      |  489 ++++++++++++++++++++++++++++++
 sfx2/source/control/unoctitm.cxx    |  572 +++++++++++++++++++-----------------
 sw/qa/uibase/shells/shells.cxx      |  115 +++++++
 sw/source/uibase/shells/textsh1.cxx |  321 ++++++++++++++++++++
 sw/source/uibase/uno/loktxdoc.cxx   |  207 +++++++++++++
 15 files changed, 1823 insertions(+), 511 deletions(-)

New commits:
commit 97f7423697550eb2c4b9b0655aabd02270dface8
Author:     Attila Szűcs <attila.sz...@collabora.com>
AuthorDate: Mon Dec 9 17:31:06 2024 +0100
Commit:     Andras Timar <andras.ti...@collabora.com>
CommitDate: Mon Feb 10 17:03:39 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/+/178167
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index f2d651db2e71..fa273ea8de8d 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>
@@ -3256,7 +3257,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;
                     {
@@ -3818,244 +3821,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;
@@ -4094,17 +3859,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 69c7e422af0d..394ee760e7fa 100644
--- a/sd/inc/sdpage.hxx
+++ b/sd/inc/sdpage.hxx
@@ -380,6 +380,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 a66c008f4db4..f0613c45a223 100644
--- a/sd/qa/unit/uiimpress.cxx
+++ b/sd/qa/unit/uiimpress.cxx
@@ -48,6 +48,7 @@
 #include <docmodel/uno/UnoTheme.hxx>
 #include <docmodel/theme/Theme.hxx>
 #include <docmodel/color/ComplexColorJSON.hxx>
+#include <tools/json_writer.hxx>
 
 #include <drawdoc.hxx>
 #include <DrawDocShell.hxx>
@@ -167,6 +168,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 76fde4080010..23767a837e9f 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 fcfa8a10ed54..d97613ad0db8 100644
--- a/sd/source/core/sdpage.cxx
+++ b/sd/source/core/sdpage.cxx
@@ -1351,6 +1351,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 13a2635c781a..6928f7237fab 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;
 
+    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 4c5fe32caf70..db5c5ce45a4e 100644
--- a/sd/source/ui/unoidl/unomodel.cxx
+++ b/sd/source/ui/unoidl/unomodel.cxx
@@ -1504,6 +1504,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 )
@@ -1801,6 +1905,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..40810cd90a4c 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,10 @@
 #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 +255,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 +756,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: */
commit 819d71d8b0e122453b9583b8496f47906f1fb2e8
Author:     Attila Szűcs <attila.sz...@collabora.com>
AuthorDate: Wed Nov 13 05:39:27 2024 +0100
Commit:     Andras Timar <andras.ti...@collabora.com>
CommitDate: Mon Feb 10 16:48:14 2025 +0100

    LOK: added .uno:UndoCount and .uno:RedoCount
    
    Added new commands for doc_getCommandValues
    to get actual undo and redo count.
    
    They get undo/redo count directly from SfxUndoManager.
    
    Change-Id: I2f7b7fc487eada7c5b1b161dfd4086c54094d747
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180553
    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 1b729d019273..f2d651db2e71 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -6629,6 +6629,34 @@ static char* getUndoOrRedo(LibreOfficeKitDocument* 
pThis, UndoOrRedo eCommand)
     return pJson;
 }
 
+/// Returns only the number of the undo or redo elements
+static char* getUndoOrRedoCount(LibreOfficeKitDocument* pThis, UndoOrRedo 
eCommand)
+{
+    LibLODocument_Impl* pDocument = static_cast<LibLODocument_Impl*>(pThis);
+
+    auto pBaseModel = 
dynamic_cast<SfxBaseModel*>(pDocument->mxComponent.get());
+    if (!pBaseModel)
+        return nullptr;
+
+    SfxObjectShell* pObjectShell = pBaseModel->GetObjectShell();
+    if (!pObjectShell)
+        return nullptr;
+
+    SfxUndoManager* pUndoManager = pObjectShell->GetUndoManager();
+    if (!pUndoManager)
+        return nullptr;
+
+    size_t nCount;
+    if (eCommand == UndoOrRedo::UNDO)
+        nCount = pUndoManager->GetUndoActionCount();
+    else
+        nCount = pUndoManager->GetRedoActionCount();
+
+    OUString aString = OUString::number(nCount);
+    char* pCountStr = convertOUString(aString);
+    return pCountStr;
+}
+
 /// Returns the JSON representation of the redline stack.
 static char* getTrackedChanges(LibreOfficeKitDocument* pThis)
 {
@@ -6743,6 +6771,14 @@ static char* 
doc_getCommandValues(LibreOfficeKitDocument* pThis, const char* pCo
     {
         return getUndoOrRedo(pThis, UndoOrRedo::REDO);
     }
+    else if (aCommand == ".uno:UndoCount")
+    {
+        return getUndoOrRedoCount(pThis, UndoOrRedo::UNDO);
+    }
+    else if (aCommand == ".uno:RedoCount")
+    {
+        return getUndoOrRedoCount(pThis, UndoOrRedo::REDO);
+    }
     else if (aCommand == ".uno:AcceptTrackedChanges")
     {
         return getTrackedChanges(pThis);
commit 04f4bd914279a8a40f961c6446e4434448370f08
Author:     Attila Szűcs <attila.sz...@collabora.com>
AuthorDate: Wed Oct 2 16:04:56 2024 +0200
Commit:     Andras Timar <andras.ti...@collabora.com>
CommitDate: Mon Feb 10 16:47:53 2025 +0100

    SW: extract transform DocProperties
    
    Implemented Document Properties extraction, and transformation.
    
    For UserDefinedProperties Properties you can use add, and delete commands.
    If the property already exist, "add" will delete that,
    before adding the new UserDefinedProperty
    
    see the unittest for an example.
    
    Change-Id: I036b73bf1539bc25f454aea64c319241177e167a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178918
    Tested-by: Jenkins
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/sw/qa/uibase/shells/shells.cxx b/sw/qa/uibase/shells/shells.cxx
index f48ab0a35337..218cf47ff11b 100644
--- a/sw/qa/uibase/shells/shells.cxx
+++ b/sw/qa/uibase/shells/shells.cxx
@@ -753,7 +753,7 @@ CPPUNIT_TEST_FIXTURE(SwUibaseShellsTest, 
testDocumentStructureExtractChart)
 
     //extract
     tools::JsonWriter aJsonWriter;
-e 
... etc. - the rest is truncated

Reply via email to