sw/Library_swui.mk                                  |    1 
 sw/UIConfig_swriter.mk                              |    3 
 sw/inc/formatcontentcontrol.hxx                     |   11 -
 sw/inc/swabstdlg.hxx                                |   16 +
 sw/source/core/txtnode/attrcontentcontrol.cxx       |    5 
 sw/source/ui/dialog/swdlgfact.cxx                   |   14 +
 sw/source/ui/dialog/swdlgfact.hxx                   |   24 ++
 sw/source/ui/misc/contentcontroldlg.cxx             |   72 ++++++++
 sw/source/ui/misc/contentcontrollistitemdlg.cxx     |   46 +++++
 sw/source/uibase/inc/contentcontroldlg.hxx          |    7 
 sw/source/uibase/inc/contentcontrollistitemdlg.hxx  |   40 ++++
 sw/uiconfig/swriter/ui/contentcontroldlg.ui         |  145 +++++++++++++++++
 sw/uiconfig/swriter/ui/contentcontrollistitemdlg.ui |  168 ++++++++++++++++++++
 13 files changed, 547 insertions(+), 5 deletions(-)

New commits:
commit b68eba7189379241136c14a9f72880f752492fa9
Author:     Miklos Vajna <[email protected]>
AuthorDate: Mon May 16 08:19:55 2022 +0200
Commit:     Miklos Vajna <[email protected]>
CommitDate: Tue May 17 16:32:51 2022 +0200

    sw content controls, dropdown: edit list items in the properties dialog
    
    - add a weld::TreeView to show existing display name - value pairs
    
    - add a button to add a new list item, together with a new
      SwContentControlListItemDlg to specify the list item properties +
      write the changed list back to the doc model
    
    (cherry picked from commit 92254b0a2feeb6326796e3f93c289db829eed896)
    
    Conflicts:
            sw/inc/formatcontentcontrol.hxx
    
    Change-Id: I9243be84eb0af65437eccfb48c6780787609bc68
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134469
    Tested-by: Miklos Vajna <[email protected]>
    Reviewed-by: Miklos Vajna <[email protected]>

diff --git a/sw/Library_swui.mk b/sw/Library_swui.mk
index 75a4242b854d..61bd7537cd76 100644
--- a/sw/Library_swui.mk
+++ b/sw/Library_swui.mk
@@ -138,6 +138,7 @@ $(eval $(call gb_Library_add_exception_objects,swui,\
     sw/source/ui/index/swuiidxmrk \
     sw/source/ui/misc/bookmark \
     sw/source/ui/misc/contentcontroldlg \
+    sw/source/ui/misc/contentcontrollistitemdlg \
     sw/source/ui/misc/docfnote \
     sw/source/ui/misc/glosbib \
     sw/source/ui/misc/glossary \
diff --git a/sw/UIConfig_swriter.mk b/sw/UIConfig_swriter.mk
index db135a854595..0a558ebd7381 100644
--- a/sw/UIConfig_swriter.mk
+++ b/sw/UIConfig_swriter.mk
@@ -118,11 +118,12 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/swriter,\
        sw/uiconfig/swriter/ui/columndialog \
        sw/uiconfig/swriter/ui/columnpage \
        sw/uiconfig/swriter/ui/columnwidth \
-       sw/uiconfig/swriter/ui/contentcontroldlg \
        sw/uiconfig/swriter/ui/combobox \
        sw/uiconfig/swriter/ui/comboboxfragment \
        sw/uiconfig/swriter/ui/conditionpage \
+       sw/uiconfig/swriter/ui/contentcontroldlg \
        sw/uiconfig/swriter/ui/contentcontroldropdown \
+       sw/uiconfig/swriter/ui/contentcontrollistitemdlg \
        sw/uiconfig/swriter/ui/converttexttable \
        sw/uiconfig/swriter/ui/createaddresslist \
        sw/uiconfig/swriter/ui/createauthorentry \
diff --git a/sw/inc/formatcontentcontrol.hxx b/sw/inc/formatcontentcontrol.hxx
index c99382340025..7304a48214a9 100644
--- a/sw/inc/formatcontentcontrol.hxx
+++ b/sw/inc/formatcontentcontrol.hxx
@@ -26,6 +26,7 @@
 #include <svl/poolitem.hxx>
 
 #include "calbck.hxx"
+#include "swdllapi.h"
 
 class SwContentControl;
 class SwTextContentControl;
@@ -40,7 +41,7 @@ enum class SwContentControlType
 };
 
 /// SfxPoolItem subclass that wraps an SwContentControl.
-class SwFormatContentControl final : public SfxPoolItem
+class SW_DLLPUBLIC SwFormatContentControl final : public SfxPoolItem
 {
     std::shared_ptr<SwContentControl> m_pContentControl;
     SwTextContentControl* m_pTextAttr;
@@ -75,16 +76,20 @@ public:
 };
 
 /// Represents one list item in a content control dropdown list.
-class SwContentControlListItem
+class SW_DLLPUBLIC SwContentControlListItem
 {
 public:
+    /// This may be empty, ToString() falls back to m_aValue.
     OUString m_aDisplayText;
+    /// This must not be empty.
     OUString m_aValue;
 
     void dumpAsXml(xmlTextWriterPtr pWriter) const;
 
     OUString ToString() const;
 
+    bool operator==(const SwContentControlListItem& rOther) const;
+
     static void ItemsToAny(const std::vector<SwContentControlListItem>& rItems,
                            css::uno::Any& rVal);
 
@@ -92,7 +97,7 @@ public:
 };
 
 /// Stores the properties of a content control.
-class SwContentControl : public sw::BroadcastingModify
+class SW_DLLPUBLIC SwContentControl : public sw::BroadcastingModify
 {
     css::uno::WeakReference<css::text::XTextContent> m_wXContentControl;
 
diff --git a/sw/inc/swabstdlg.hxx b/sw/inc/swabstdlg.hxx
index 8661310d8d38..0963de35da21 100644
--- a/sw/inc/swabstdlg.hxx
+++ b/sw/inc/swabstdlg.hxx
@@ -61,6 +61,7 @@ enum class SwBorderModes;
 enum class SwCharDlgMode;
 enum class SfxStyleFamily;
 enum class SwLineBreakClear;
+class SwContentControlListItem;
 
 namespace com::sun::star{
     namespace frame{
@@ -329,6 +330,18 @@ public:
              css::uno::Reference< css::container::XNameAccess > & xThird ) = 0;
 };
 
+/**
+ * Interface for e.g. the form -> content control -> properties -> add dialog. 
It's implemented by
+ * AbstractSwContentControlListItemDlg_Impl, but SwContentControlDlg only 
knows about this interface
+ * and the SwAbstractDialogFactory::CreateSwContentControlListItemDlg() 
factory.
+ */
+class AbstractSwContentControlListItemDlg  : public VclAbstractDialog
+{
+protected:
+    virtual ~AbstractSwContentControlListItemDlg() override = default;
+public:
+};
+
 class AbstractSwModalRedlineAcceptDlg : public VclAbstractDialog
 {
 protected:
@@ -381,6 +394,9 @@ public:
     virtual VclPtr<VclAbstractDialog> CreateSwInsertBookmarkDlg(weld::Window 
*pParent, SwWrtShell &rSh) = 0;
     virtual VclPtr<VclAbstractDialog> CreateSwContentControlDlg(weld::Window 
*pParent, SwWrtShell &rSh) = 0;
 
+    virtual VclPtr<AbstractSwContentControlListItemDlg>
+    CreateSwContentControlListItemDlg(weld::Window* pParent, 
SwContentControlListItem& rItem) = 0;
+
     virtual std::shared_ptr<AbstractSwBreakDlg> CreateSwBreakDlg(weld::Window 
*pParent, SwWrtShell &rSh) = 0;
     virtual VclPtr<VclAbstractDialog> CreateSwChangeDBDlg(SwView& rVw) = 0;
     virtual VclPtr<SfxAbstractTabDialog>  CreateSwCharDlg(weld::Window* 
pParent, SwView& pVw, const SfxItemSet& rCoreSet,
diff --git a/sw/source/core/txtnode/attrcontentcontrol.cxx 
b/sw/source/core/txtnode/attrcontentcontrol.cxx
index fd98947e3458..c249adffd819 100644
--- a/sw/source/core/txtnode/attrcontentcontrol.cxx
+++ b/sw/source/core/txtnode/attrcontentcontrol.cxx
@@ -256,6 +256,11 @@ OUString SwContentControlListItem::ToString() const
     return m_aValue;
 }
 
+bool SwContentControlListItem::operator==(const SwContentControlListItem& 
rOther) const
+{
+    return m_aDisplayText == rOther.m_aDisplayText && m_aValue == 
rOther.m_aValue;
+}
+
 void SwContentControlListItem::ItemsToAny(const 
std::vector<SwContentControlListItem>& rItems,
                                           uno::Any& rVal)
 {
diff --git a/sw/source/ui/dialog/swdlgfact.cxx 
b/sw/source/ui/dialog/swdlgfact.cxx
index 62697ffe2953..17f0ed1d3a03 100644
--- a/sw/source/ui/dialog/swdlgfact.cxx
+++ b/sw/source/ui/dialog/swdlgfact.cxx
@@ -34,6 +34,7 @@
 #include <chrdlg.hxx>
 #include <colwd.hxx>
 #include <contentcontroldlg.hxx>
+#include <contentcontrollistitemdlg.hxx>
 #include <convert.hxx>
 #include <cption.hxx>
 #include <dbinsdlg.hxx>
@@ -209,6 +210,11 @@ short AbstractSwRenameXNamedDlg_Impl::Execute()
     return m_xDlg->run();
 }
 
+short AbstractSwContentControlListItemDlg_Impl::Execute()
+{
+    return m_xDlg->run();
+}
+
 short AbstractSwModalRedlineAcceptDlg_Impl::Execute()
 {
     return m_xDlg->run();
@@ -842,6 +848,14 @@ VclPtr<VclAbstractDialog> 
SwAbstractDialogFactory_Impl::CreateSwContentControlDl
     return 
VclPtr<AbstractGenericDialog_Impl>::Create(std::make_shared<SwContentControlDlg>(pParent,
 rSh));
 }
 
+VclPtr<AbstractSwContentControlListItemDlg>
+SwAbstractDialogFactory_Impl::CreateSwContentControlListItemDlg(weld::Window* 
pParent,
+                                                                
SwContentControlListItem& rItem)
+{
+    return VclPtr<AbstractSwContentControlListItemDlg_Impl>::Create(
+        std::make_unique<SwContentControlListItemDlg>(pParent, rItem));
+}
+
 std::shared_ptr<AbstractSwBreakDlg> 
SwAbstractDialogFactory_Impl::CreateSwBreakDlg(weld::Window* pParent, 
SwWrtShell &rSh)
 {
     return 
std::make_shared<AbstractSwBreakDlg_Impl>(std::make_unique<SwBreakDlg>(pParent, 
rSh));
diff --git a/sw/source/ui/dialog/swdlgfact.hxx 
b/sw/source/ui/dialog/swdlgfact.hxx
index 6eb68355762c..8690d9db8129 100644
--- a/sw/source/ui/dialog/swdlgfact.hxx
+++ b/sw/source/ui/dialog/swdlgfact.hxx
@@ -25,6 +25,7 @@
 #include <ascfldlg.hxx>
 #include <cnttab.hxx>
 #include <colwd.hxx>
+#include <contentcontrollistitemdlg.hxx>
 #include <convert.hxx>
 #include <DateFormFieldDialog.hxx>
 #include <dbinsdlg.hxx>
@@ -409,6 +410,24 @@ public:
              css::uno::Reference< css::container::XNameAccess > & xThird ) 
override;
 };
 
+/**
+ * Implementation of AbstractSwContentControlListItemDlg, that is only visible 
to
+ * SwAbstractDialogFactory_Impl::CreateSwContentControlListItemDlg().
+ */
+class AbstractSwContentControlListItemDlg_Impl : public 
AbstractSwContentControlListItemDlg
+{
+    std::unique_ptr<SwContentControlListItemDlg> m_xDlg;
+
+public:
+    explicit AbstractSwContentControlListItemDlg_Impl(
+        std::unique_ptr<SwContentControlListItemDlg> xDlg)
+        : m_xDlg(std::move(xDlg))
+    {
+    }
+
+    short Execute() override;
+};
+
 class AbstractSwModalRedlineAcceptDlg_Impl : public 
AbstractSwModalRedlineAcceptDlg
 {
     std::unique_ptr<SwModalRedlineAcceptDlg> m_xDlg;
@@ -659,6 +678,11 @@ public:
                                                                 SvStream* 
pStream) override;
     virtual VclPtr<VclAbstractDialog> CreateSwInsertBookmarkDlg(weld::Window 
*pParent, SwWrtShell &rSh) override;
     virtual VclPtr<VclAbstractDialog> CreateSwContentControlDlg(weld::Window 
*pParent, SwWrtShell &rSh) override;
+
+    VclPtr<AbstractSwContentControlListItemDlg>
+    CreateSwContentControlListItemDlg(weld::Window* pParent,
+                                      SwContentControlListItem& rItem) 
override;
+
     virtual std::shared_ptr<AbstractSwBreakDlg> CreateSwBreakDlg(weld::Window 
*pParent, SwWrtShell &rSh) override;
     virtual VclPtr<VclAbstractDialog> CreateSwChangeDBDlg(SwView& rVw) 
override;
     virtual VclPtr<SfxAbstractTabDialog>  CreateSwCharDlg(weld::Window* 
pParent, SwView& pVw, const SfxItemSet& rCoreSet,
diff --git a/sw/source/ui/misc/contentcontroldlg.cxx 
b/sw/source/ui/misc/contentcontroldlg.cxx
index d18c3077f24d..7a066fb80d22 100644
--- a/sw/source/ui/misc/contentcontroldlg.cxx
+++ b/sw/source/ui/misc/contentcontroldlg.cxx
@@ -25,6 +25,7 @@
 #include <ndtxt.hxx>
 #include <textcontentcontrol.hxx>
 #include <IDocumentState.hxx>
+#include <swuiexp.hxx>
 
 using namespace com::sun::star;
 
@@ -33,10 +34,19 @@ SwContentControlDlg::SwContentControlDlg(weld::Window* 
pParent, SwWrtShell& rWrt
                           "ContentControlDialog")
     , m_rWrtShell(rWrtShell)
     , 
m_xShowingPlaceHolderCB(m_xBuilder->weld_check_button("showing_place_holder"))
+    , m_xListItemsFrame(m_xBuilder->weld_frame("listitemsframe"))
+    , m_xListItems(m_xBuilder->weld_tree_view("listitems"))
+    , m_xListItemButtons(m_xBuilder->weld_box("listitembuttons"))
+    , m_xInsertBtn(m_xBuilder->weld_button("add"))
     , m_xOk(m_xBuilder->weld_button("ok"))
 {
     m_xOk->connect_clicked(LINK(this, SwContentControlDlg, OkHdl));
 
+    // Only 2 items would be visible by default.
+    m_xListItems->set_size_request(-1, m_xListItems->get_height_rows(8));
+
+    m_xInsertBtn->connect_clicked(LINK(this, SwContentControlDlg, InsertHdl));
+
     const SwPosition* pStart = rWrtShell.GetCursor()->Start();
     SwTextNode* pTextNode = pStart->nNode.GetNode().GetTextNode();
     if (!pTextNode)
@@ -59,12 +69,33 @@ SwContentControlDlg::SwContentControlDlg(weld::Window* 
pParent, SwWrtShell& rWrt
     TriState eShowingPlaceHolder = bShowingPlaceHolder ? TRISTATE_TRUE : 
TRISTATE_FALSE;
     m_xShowingPlaceHolderCB->set_state(eShowingPlaceHolder);
     m_xShowingPlaceHolderCB->save_state();
+
+    if (m_pContentControl->HasListItems())
+    {
+        for (const auto& rListItem : m_pContentControl->GetListItems())
+        {
+            int nRow = m_xListItems->n_children();
+            m_xListItems->append_text(rListItem.m_aDisplayText);
+            m_xListItems->set_text(nRow, rListItem.m_aValue, 1);
+        }
+        m_aSavedListItems = m_pContentControl->GetListItems();
+    }
+    else
+    {
+        m_xListItemsFrame->set_visible(false);
+        m_xListItemButtons->set_visible(false);
+    }
 }
 
 SwContentControlDlg::~SwContentControlDlg() {}
 
 IMPL_LINK_NOARG(SwContentControlDlg, OkHdl, weld::Button&, void)
 {
+    if (!m_pContentControl)
+    {
+        return;
+    }
+
     bool bChanged = false;
     if (m_xShowingPlaceHolderCB->get_state_changed_from_saved())
     {
@@ -73,6 +104,20 @@ IMPL_LINK_NOARG(SwContentControlDlg, OkHdl, weld::Button&, 
void)
         bChanged = true;
     }
 
+    std::vector<SwContentControlListItem> aItems;
+    for (int i = 0; i < m_xListItems->n_children(); ++i)
+    {
+        SwContentControlListItem aItem;
+        aItem.m_aDisplayText = m_xListItems->get_text(i, 0);
+        aItem.m_aValue = m_xListItems->get_text(i, 1);
+        aItems.push_back(aItem);
+    }
+    if (aItems != m_aSavedListItems)
+    {
+        m_pContentControl->SetListItems(aItems);
+        bChanged = true;
+    }
+
     if (bChanged)
     {
         m_rWrtShell.GetDoc()->getIDocumentState().SetModified();
@@ -81,4 +126,31 @@ IMPL_LINK_NOARG(SwContentControlDlg, OkHdl, weld::Button&, 
void)
     m_xDialog->response(RET_OK);
 }
 
+IMPL_LINK_NOARG(SwContentControlDlg, InsertHdl, weld::Button&, void)
+{
+    SwContentControlListItem aItem;
+    SwAbstractDialogFactory& rFact = swui::GetFactory();
+    ScopedVclPtr<VclAbstractDialog> pDlg(
+        rFact.CreateSwContentControlListItemDlg(m_xDialog.get(), aItem));
+    if (!pDlg->Execute())
+    {
+        return;
+    }
+
+    if (aItem.m_aDisplayText.isEmpty() && aItem.m_aValue.isEmpty())
+    {
+        // Maintain the invariant that value can't be empty.
+        return;
+    }
+
+    if (aItem.m_aValue.isEmpty())
+    {
+        aItem.m_aValue = aItem.m_aDisplayText;
+    }
+
+    int nRow = m_xListItems->n_children();
+    m_xListItems->append_text(aItem.m_aDisplayText);
+    m_xListItems->set_text(nRow, aItem.m_aValue, 1);
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/ui/misc/contentcontrollistitemdlg.cxx 
b/sw/source/ui/misc/contentcontrollistitemdlg.cxx
new file mode 100644
index 000000000000..ca6716b7b770
--- /dev/null
+++ b/sw/source/ui/misc/contentcontrollistitemdlg.cxx
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <contentcontrollistitemdlg.hxx>
+
+#include <formatcontentcontrol.hxx>
+
+using namespace com::sun::star;
+
+SwContentControlListItemDlg::SwContentControlListItemDlg(weld::Widget* pParent,
+                                                         
SwContentControlListItem& rItem)
+    : GenericDialogController(pParent, 
"modules/swriter/ui/contentcontrollistitemdlg.ui",
+                              "ContentControlListItemDialog")
+    , m_rItem(rItem)
+    , m_xDisplayNameED(m_xBuilder->weld_entry("displayname"))
+    , m_xValueED(m_xBuilder->weld_entry("value"))
+    , m_xOk(m_xBuilder->weld_button("ok"))
+{
+    m_xOk->connect_clicked(LINK(this, SwContentControlListItemDlg, OkHdl));
+}
+
+IMPL_LINK_NOARG(SwContentControlListItemDlg, OkHdl, weld::Button&, void)
+{
+    m_rItem.m_aDisplayText = m_xDisplayNameED->get_text();
+    m_rItem.m_aValue = m_xValueED->get_text();
+
+    m_xDialog->response(RET_OK);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/inc/contentcontroldlg.hxx 
b/sw/source/uibase/inc/contentcontroldlg.hxx
index 6b354a39e7c4..45a6659b4fbf 100644
--- a/sw/source/uibase/inc/contentcontroldlg.hxx
+++ b/sw/source/uibase/inc/contentcontroldlg.hxx
@@ -23,6 +23,7 @@
 
 class SwWrtShell;
 class SwContentControl;
+class SwContentControlListItem;
 
 /**
  * The content control dialog allows editing the properties of the content 
control under the
@@ -32,10 +33,16 @@ class SwContentControlDlg final : public SfxDialogController
 {
     SwWrtShell& m_rWrtShell;
     std::shared_ptr<SwContentControl> m_pContentControl;
+    std::vector<SwContentControlListItem> m_aSavedListItems;
 
     std::unique_ptr<weld::CheckButton> m_xShowingPlaceHolderCB;
+    std::unique_ptr<weld::Frame> m_xListItemsFrame;
+    std::unique_ptr<weld::TreeView> m_xListItems;
+    std::unique_ptr<weld::Box> m_xListItemButtons;
+    std::unique_ptr<weld::Button> m_xInsertBtn;
     std::unique_ptr<weld::Button> m_xOk;
 
+    DECL_LINK(InsertHdl, weld::Button&, void);
     DECL_LINK(OkHdl, weld::Button&, void);
 
 public:
diff --git a/sw/source/uibase/inc/contentcontrollistitemdlg.hxx 
b/sw/source/uibase/inc/contentcontrollistitemdlg.hxx
new file mode 100644
index 000000000000..2367de4847b4
--- /dev/null
+++ b/sw/source/uibase/inc/contentcontrollistitemdlg.hxx
@@ -0,0 +1,40 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+#pragma once
+
+#include <vcl/weld.hxx>
+
+class SwContentControlListItem;
+
+/// Edits the properties of a sing list item in a (drop-down) content control.
+class SwContentControlListItemDlg final : public weld::GenericDialogController
+{
+    SwContentControlListItem& m_rItem;
+
+    std::unique_ptr<weld::Entry> m_xDisplayNameED;
+    std::unique_ptr<weld::Entry> m_xValueED;
+    std::unique_ptr<weld::Button> m_xOk;
+
+    DECL_LINK(OkHdl, weld::Button&, void);
+
+public:
+    SwContentControlListItemDlg(weld::Widget* pParent, 
SwContentControlListItem& rItem);
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/uiconfig/swriter/ui/contentcontroldlg.ui 
b/sw/uiconfig/swriter/ui/contentcontroldlg.ui
index 5ac95091d71c..4a1eb810a75c 100644
--- a/sw/uiconfig/swriter/ui/contentcontroldlg.ui
+++ b/sw/uiconfig/swriter/ui/contentcontroldlg.ui
@@ -2,6 +2,16 @@
 <!-- Generated with glade 3.38.2 -->
 <interface domain="sw">
   <requires lib="gtk+" version="3.20"/>
+  <object class="GtkTreeStore" id="liststore1">
+    <columns>
+      <!-- column-name text -->
+      <column type="gchararray"/>
+      <!-- column-name text2 -->
+      <column type="gchararray"/>
+      <!-- column-name id -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
   <object class="GtkDialog" id="ContentControlDialog">
     <property name="can-focus">False</property>
     <property name="border-width">6</property>
@@ -69,7 +79,7 @@
           <packing>
             <property name="expand">False</property>
             <property name="fill">False</property>
-            <property name="position">1</property>
+            <property name="position">3</property>
           </packing>
         </child>
         <child>
@@ -102,6 +112,139 @@
             <property name="position">0</property>
           </packing>
         </child>
+        <child>
+          <object class="GtkFrame" id="listitemsframe">
+            <property name="visible">True</property>
+            <property name="can-focus">False</property>
+            <property name="label-xalign">0</property>
+            <property name="shadow-type">none</property>
+            <child>
+              <object class="GtkScrolledWindow">
+                <property name="visible">True</property>
+                <property name="can-focus">True</property>
+                <property name="margin-start">12</property>
+                <property name="margin-top">6</property>
+                <property name="hexpand">True</property>
+                <property name="vexpand">True</property>
+                <property name="shadow-type">in</property>
+                <child>
+                  <object class="GtkTreeView" id="listitems">
+                    <property name="visible">True</property>
+                    <property name="can-focus">True</property>
+                    <property name="receives-default">True</property>
+                    <property name="hexpand">True</property>
+                    <property name="vexpand">True</property>
+                    <property name="model">liststore1</property>
+                    <property name="search-column">0</property>
+                    <property name="show-expanders">False</property>
+                    <child internal-child="selection">
+                      <object class="GtkTreeSelection"/>
+                    </child>
+                    <child>
+                      <object class="GtkTreeViewColumn" id="treeviewcolumn0">
+                        <property name="resizable">True</property>
+                        <property name="spacing">6</property>
+                        <property name="title" translatable="yes" 
context="contentcontroldlg|displayname">Display Name</property>
+                        <property name="clickable">False</property>
+                        <child>
+                          <object class="GtkCellRendererText" 
id="cellrenderer0"/>
+                          <attributes>
+                            <attribute name="text">0</attribute>
+                          </attributes>
+                        </child>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkTreeViewColumn" id="treeviewcolumn1">
+                        <property name="resizable">True</property>
+                        <property name="spacing">6</property>
+                        <property name="title" translatable="yes" 
context="contentcontroldlg|value">Value</property>
+                        <property name="clickable">False</property>
+                        <child>
+                          <object class="GtkCellRendererText" 
id="cellrenderer1"/>
+                          <attributes>
+                            <attribute name="text">1</attribute>
+                          </attributes>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child type="label">
+              <object class="GtkLabel" id="lblistitems">
+                <property name="visible">True</property>
+                <property name="can-focus">False</property>
+                <property name="label" translatable="yes" 
context="contentcontordlg|listitems">List Items:</property>
+                <property name="use-underline">True</property>
+                <property name="mnemonic-widget">listitems</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkBox" id="listitembuttons">
+            <property name="visible">True</property>
+            <property name="can-focus">False</property>
+            <property name="spacing">6</property>
+            <child>
+              <object class="GtkButton" id="add">
+                <property name="label" translatable="yes" 
context="contentcontordlg|add">Add</property>
+                <property name="visible">True</property>
+                <property name="can-focus">True</property>
+                <property name="receives-default">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="pack-type">end</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="remove">
+                <property name="label" translatable="yes" 
context="contentcontordlg|remove">Remove</property>
+                <property name="visible">True</property>
+                <property name="can-focus">True</property>
+                <property name="receives-default">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="pack-type">end</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="modify">
+                <property name="label" translatable="yes" 
context="contentcontordlg|modify">Modify</property>
+                <property name="visible">True</property>
+                <property name="can-focus">True</property>
+                <property name="receives-default">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="pack-type">end</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
       </object>
     </child>
     <action-widgets>
diff --git a/sw/uiconfig/swriter/ui/contentcontrollistitemdlg.ui 
b/sw/uiconfig/swriter/ui/contentcontrollistitemdlg.ui
new file mode 100644
index 000000000000..8d580179be50
--- /dev/null
+++ b/sw/uiconfig/swriter/ui/contentcontrollistitemdlg.ui
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sw">
+  <requires lib="gtk+" version="3.20"/>
+  <object class="GtkDialog" id="ContentControlListItemDialog">
+    <property name="can_focus">False</property>
+    <property name="border_width">6</property>
+    <property name="title" translatable="yes" 
context="contentcontrollistitemdlg|ContentControlListItemDialog">Content 
Control List Item Properties</property>
+    <property name="modal">True</property>
+    <property name="default_width">0</property>
+    <property name="default_height">0</property>
+    <property name="type_hint">dialog</property>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="dialog-vbox1">
+        <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">12</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox" id="dialog-action_area1">
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="ok">
+                <property name="label" translatable="yes" 
context="stock">_OK</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="use-underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="cancel">
+                <property name="label" translatable="yes" 
context="stock">_Cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use-underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="help">
+                <property name="label" translatable="yes" 
context="stock">_Help</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use-underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">2</property>
+                <property name="secondary">True</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkFrame" id="frame1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="hexpand">True</property>
+            <property name="vexpand">True</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">none</property>
+            <child>
+              <!-- n-columns=2 n-rows=2 -->
+              <object class="GtkGrid" id="grid1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="hexpand">True</property>
+                <property name="vexpand">True</property>
+                <property name="row_spacing">6</property>
+                <property name="column_spacing">12</property>
+                <property name="margin-start">12</property>
+                <property name="margin-top">6</property>
+                <child>
+                  <object class="GtkLabel" id="lbdisplayname">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes" 
context="contentcontrollistitemdlg|lbdisplayname">Display name:</property>
+                    <property name="use_underline">True</property>
+                    <property name="mnemonic_widget">displayname</property>
+                    <property name="xalign">0</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">0</property>
+                    <property name="top_attach">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkEntry" id="displayname">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hexpand">True</property>
+                    <property name="truncate-multiline">True</property>
+                    <property name="activates_default">True</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="top_attach">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="lbvalue">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes" 
context="contentcontrollistitemdlg|lbvalue">Value:</property>
+                    <property name="use_underline">True</property>
+                    <property name="mnemonic_widget">value</property>
+                    <property name="xalign">0</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">0</property>
+                    <property name="top_attach">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkEntry" id="value">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hexpand">True</property>
+                    <property name="truncate-multiline">True</property>
+                    <property name="activates_default">True</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="top_attach">1</property>
+                  </packing>
+                </child>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="-5">ok</action-widget>
+      <action-widget response="-6">cancel</action-widget>
+      <action-widget response="-11">help</action-widget>
+    </action-widgets>
+    <child type="titlebar">
+      <placeholder/>
+    </child>
+  </object>
+</interface>

Reply via email to