sw/Library_swui.mk                          |    1 
 sw/source/ui/misc/contentcontroldlg.cxx     |   60 ++++++++++++++++
 sw/source/uibase/inc/contentcontroldlg.hxx  |    6 +
 sw/uiconfig/swriter/ui/contentcontroldlg.ui |  104 +++++++++++++++++++++++++++-
 4 files changed, 169 insertions(+), 2 deletions(-)

New commits:
commit f23b0d206e80fe740a45611d719fbd3ec81bcf57
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Thu Jun 2 08:21:14 2022 +0200
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Thu Jun 2 09:22:50 2022 +0200

    sw content controls, checkbox: add properties dialog
    
    - add a new m_xCheckboxFrame to SwContentControlDlg that contains all
      the checkbox-related widgets
    
    - hide this frame for non-checkbox content controls
    
    - load the checked & unchecked states into entries to show their current
      value
    
    - provide buttons to easily pick special characters using SvxCharacterMap
    
    Change-Id: I8f2ad862d1102bac0198360d40cfe8b653ce4ccd
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/135286
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>
    Tested-by: Jenkins

diff --git a/sw/Library_swui.mk b/sw/Library_swui.mk
index ba69e5eadaea..9187d3c209a1 100644
--- a/sw/Library_swui.mk
+++ b/sw/Library_swui.mk
@@ -56,6 +56,7 @@ $(eval $(call gb_Library_use_libraries,swui,\
     comphelper \
     cppu \
     cppuhelper \
+    cui \
     $(call gb_Helper_optional,DBCONNECTIVITY, \
         dbtools) \
     editeng \
diff --git a/sw/source/ui/misc/contentcontroldlg.cxx 
b/sw/source/ui/misc/contentcontroldlg.cxx
index 49157fdec606..2d713b0091f4 100644
--- a/sw/source/ui/misc/contentcontroldlg.cxx
+++ b/sw/source/ui/misc/contentcontroldlg.cxx
@@ -20,6 +20,7 @@
 #include <contentcontroldlg.hxx>
 
 #include <vcl/weld.hxx>
+#include <cui/cuicharmap.hxx>
 
 #include <wrtsh.hxx>
 #include <ndtxt.hxx>
@@ -34,6 +35,11 @@ SwContentControlDlg::SwContentControlDlg(weld::Window* 
pParent, SwWrtShell& rWrt
                           "ContentControlDialog")
     , m_rWrtShell(rWrtShell)
     , 
m_xShowingPlaceHolderCB(m_xBuilder->weld_check_button("showing_place_holder"))
+    , m_xCheckboxFrame(m_xBuilder->weld_frame("checkboxframe"))
+    , m_xCheckedState(m_xBuilder->weld_entry("checkboxcheckedentry"))
+    , m_xCheckedStateBtn(m_xBuilder->weld_button("btncheckboxchecked"))
+    , m_xUncheckedState(m_xBuilder->weld_entry("checkboxuncheckedentry"))
+    , m_xUncheckedStateBtn(m_xBuilder->weld_button("btncheckboxunchecked"))
     , m_xListItemsFrame(m_xBuilder->weld_frame("listitemsframe"))
     , m_xListItems(m_xBuilder->weld_tree_view("listitems"))
     , m_xListItemButtons(m_xBuilder->weld_box("listitembuttons"))
@@ -44,6 +50,8 @@ SwContentControlDlg::SwContentControlDlg(weld::Window* 
pParent, SwWrtShell& rWrt
     , m_xMoveDownBtn(m_xBuilder->weld_button("movedown"))
     , m_xOk(m_xBuilder->weld_button("ok"))
 {
+    m_xCheckedStateBtn->connect_clicked(LINK(this, SwContentControlDlg, 
SelectCharHdl));
+    m_xUncheckedStateBtn->connect_clicked(LINK(this, SwContentControlDlg, 
SelectCharHdl));
     m_xListItems->connect_changed(LINK(this, SwContentControlDlg, 
SelectionChangedHdl));
     m_xOk->connect_clicked(LINK(this, SwContentControlDlg, OkHdl));
 
@@ -81,6 +89,18 @@ SwContentControlDlg::SwContentControlDlg(weld::Window* 
pParent, SwWrtShell& rWrt
     m_xShowingPlaceHolderCB->set_state(eShowingPlaceHolder);
     m_xShowingPlaceHolderCB->save_state();
 
+    if (m_pContentControl->GetCheckbox())
+    {
+        m_xCheckedState->set_text(m_pContentControl->GetCheckedState());
+        m_xCheckedState->save_value();
+        m_xUncheckedState->set_text(m_pContentControl->GetUncheckedState());
+        m_xUncheckedState->save_value();
+    }
+    else
+    {
+        m_xCheckboxFrame->set_visible(false);
+    }
+
     if (m_pContentControl->HasListItems())
     {
         for (const auto& rListItem : m_pContentControl->GetListItems())
@@ -115,6 +135,16 @@ IMPL_LINK_NOARG(SwContentControlDlg, OkHdl, weld::Button&, 
void)
         bChanged = true;
     }
 
+    if (m_xCheckedState->get_value_changed_from_saved())
+    {
+        m_pContentControl->SetCheckedState(m_xCheckedState->get_text());
+    }
+
+    if (m_xUncheckedState->get_value_changed_from_saved())
+    {
+        m_pContentControl->SetUncheckedState(m_xUncheckedState->get_text());
+    }
+
     std::vector<SwContentControlListItem> aItems;
     for (int i = 0; i < m_xListItems->n_children(); ++i)
     {
@@ -137,6 +167,36 @@ IMPL_LINK_NOARG(SwContentControlDlg, OkHdl, weld::Button&, 
void)
     m_xDialog->response(RET_OK);
 }
 
+IMPL_LINK(SwContentControlDlg, SelectCharHdl, weld::Button&, rButton, void)
+{
+    SvxCharacterMap aMap(m_xDialog.get(), nullptr, nullptr);
+    sal_UCS4 cBullet = 0;
+    sal_Int32 nIndex = 0;
+    if (&rButton == m_xCheckedStateBtn.get())
+    {
+        cBullet = 
m_pContentControl->GetCheckedState().iterateCodePoints(&nIndex);
+    }
+    else if (&rButton == m_xUncheckedStateBtn.get())
+    {
+        cBullet = 
m_pContentControl->GetUncheckedState().iterateCodePoints(&nIndex);
+    }
+    aMap.SetChar(cBullet);
+    if (aMap.run() != RET_OK)
+    {
+        return;
+    }
+
+    cBullet = aMap.GetChar();
+    if (&rButton == m_xCheckedStateBtn.get())
+    {
+        m_xCheckedState->set_text(OUString(&cBullet, 1));
+    }
+    else if (&rButton == m_xUncheckedStateBtn.get())
+    {
+        m_xUncheckedState->set_text(OUString(&cBullet, 1));
+    }
+}
+
 IMPL_LINK_NOARG(SwContentControlDlg, InsertHdl, weld::Button&, void)
 {
     SwContentControlListItem aItem;
diff --git a/sw/source/uibase/inc/contentcontroldlg.hxx 
b/sw/source/uibase/inc/contentcontroldlg.hxx
index b6a42860e073..d4f90685ba04 100644
--- a/sw/source/uibase/inc/contentcontroldlg.hxx
+++ b/sw/source/uibase/inc/contentcontroldlg.hxx
@@ -36,6 +36,11 @@ class SwContentControlDlg final : public SfxDialogController
     std::vector<SwContentControlListItem> m_aSavedListItems;
 
     std::unique_ptr<weld::CheckButton> m_xShowingPlaceHolderCB;
+    std::unique_ptr<weld::Frame> m_xCheckboxFrame;
+    std::unique_ptr<weld::Entry> m_xCheckedState;
+    std::unique_ptr<weld::Button> m_xCheckedStateBtn;
+    std::unique_ptr<weld::Entry> m_xUncheckedState;
+    std::unique_ptr<weld::Button> m_xUncheckedStateBtn;
     std::unique_ptr<weld::Frame> m_xListItemsFrame;
     std::unique_ptr<weld::TreeView> m_xListItems;
     std::unique_ptr<weld::Box> m_xListItemButtons;
@@ -54,6 +59,7 @@ class SwContentControlDlg final : public SfxDialogController
     DECL_LINK(MoveDownHdl, weld::Button&, void);
     DECL_LINK(SelectionChangedHdl, weld::TreeView&, void);
     DECL_LINK(OkHdl, weld::Button&, void);
+    DECL_LINK(SelectCharHdl, weld::Button&, void);
 
 public:
     SwContentControlDlg(weld::Window* pParent, SwWrtShell& rSh);
diff --git a/sw/uiconfig/swriter/ui/contentcontroldlg.ui 
b/sw/uiconfig/swriter/ui/contentcontroldlg.ui
index 8190317048ca..fabfb41a5c7a 100644
--- a/sw/uiconfig/swriter/ui/contentcontroldlg.ui
+++ b/sw/uiconfig/swriter/ui/contentcontroldlg.ui
@@ -112,6 +112,106 @@
             <property name="position">0</property>
           </packing>
         </child>
+        <child>
+          <object class="GtkFrame" id="checkboxframe">
+            <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="GtkGrid">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <object class="GtkLabel" id="checkboxcheckedlabel">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes" 
context="contentcontroldlg|checkboxcheckedlabel">Checked character:</property>
+                    <property 
name="mnemonic-widget">checkboxcheckedentry</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="GtkLabel" id="checkboxuncheckedlabel">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes" 
context="contentcontroldlg|checkboxuncheckedlabel">Unchecked 
character:</property>
+                    <property 
name="mnemonic-widget">checkboxuncheckedentry</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="GtkButton" id="btncheckboxchecked">
+                    <property name="label" translatable="yes" 
context="contentcontroldlg|btncheckboxchecked">Select...</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">2</property>
+                    <property name="top_attach">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="btncheckboxunchecked">
+                    <property name="label" translatable="yes" 
context="contentcontroldlg|btncheckboxunchecked">Select...</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">2</property>
+                    <property name="top_attach">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkEntry" id="checkboxcheckedentry">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="top_attach">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkEntry" id="checkboxuncheckedentry">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="top_attach">1</property>
+                  </packing>
+                </child>
+              </object>
+            </child>
+            <child type="label">
+              <object class="GtkLabel" id="lblcheckbox">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes" 
context="contentcontroldlg|lblcheckbox">Check Box:</property>
+                <property name="use_underline">True</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
         <child>
           <object class="GtkFrame" id="listitemsframe">
             <property name="visible">True</property>
@@ -188,7 +288,7 @@
           <packing>
             <property name="expand">True</property>
             <property name="fill">True</property>
-            <property name="position">1</property>
+            <property name="position">2</property>
           </packing>
         </child>
         <child>
@@ -274,7 +374,7 @@
           <packing>
             <property name="expand">False</property>
             <property name="fill">False</property>
-            <property name="position">2</property>
+            <property name="position">3</property>
           </packing>
         </child>
       </object>

Reply via email to