officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu |    8 +++
 sw/inc/cmdid.h                                                      |    3 -
 sw/inc/formatcontentcontrol.hxx                                     |    2 
 sw/inc/strings.hrc                                                  |    1 
 sw/qa/uibase/wrtsh/wrtsh.cxx                                        |   23 
++++++++++
 sw/sdi/_textsh.sdi                                                  |    6 ++
 sw/sdi/swriter.sdi                                                  |   17 
+++++++
 sw/source/core/crsr/dropdowncontentcontrolbutton.cxx                |    4 +
 sw/source/core/txtnode/attrcontentcontrol.cxx                       |   10 ++++
 sw/source/uibase/shells/textsh.cxx                                  |    5 ++
 sw/source/uibase/uiview/view.cxx                                    |    1 
 sw/source/uibase/wrtsh/wrtsh1.cxx                                   |   13 
+++++
 sw/source/uibase/wrtsh/wrtsh3.cxx                                   |    2 
 sw/uiconfig/swriter/menubar/menubar.xml                             |    1 
 sw/uiconfig/swriter/menubar/mscompatibleformsmenu.xml               |    3 +
 xmloff/source/text/txtparae.cxx                                     |    2 
 16 files changed, 96 insertions(+), 5 deletions(-)

New commits:
commit 0d8be0575f5c5301c65a8de04dd9bd310fe51c1a
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Thu May 12 08:17:02 2022 +0200
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Fri May 13 13:20:59 2022 +0200

    sw content controls, dropdown: add insert UI
    
    - introduce a SwContentControlListItem::ToString() that tries to use the
      display text of the list item, otherwise falls back to its value and use 
it
      while building the dropdown widget and when inserting selected list item
    
    - handle the dropdown case in SwWrtShell::InsertContentControl()
    
    - expose this as a new .uno:InsertDropdownContentControl command
    
    - mention the new and all previous content control commands in the
      MS-compatible forms menu as well
    
    (cherry picked from commit 9f37840b0d7778ab4fc3294c44f62198ea932e3f)
    
    Change-Id: I075f77933c1466b5258357d5a661e173c34de34f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134260
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git 
a/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu 
b/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu
index b15b1ebb6a30..0e99196e6893 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu
@@ -635,6 +635,14 @@
           <value>1</value>
         </prop>
       </node>
+      <node oor:name=".uno:InsertDropdownContentControl" oor:op="replace">
+        <prop oor:name="Label" oor:type="xs:string">
+          <value xml:lang="en-US">Insert Drop-Down List Content Control</value>
+        </prop>
+        <prop oor:name="Properties" oor:type="xs:int">
+          <value>1</value>
+        </prop>
+      </node>
       <node oor:name=".uno:InsertObjectDialog" oor:op="replace">
         <prop oor:name="Label" oor:type="xs:string">
           <value xml:lang="en-US">Insert Other Objects</value>
diff --git a/sw/inc/cmdid.h b/sw/inc/cmdid.h
index 6f3673b62811..38a965802806 100644
--- a/sw/inc/cmdid.h
+++ b/sw/inc/cmdid.h
@@ -210,10 +210,11 @@
 
 #define FN_INSERT_LINEBREAK     (FN_INSERT + 18)    /* Newline */
 #define FN_INSERT_FIELD_DATA_ONLY (FN_INSERT + 19)  /* Field dialog for mail 
merge*/
-#define FN_INSERT_CONTENT_CONTROL (FN_INSERT + 20)  /* Content control */
+#define FN_INSERT_CONTENT_CONTROL (FN_INSERT + 20)  /* Rich text content 
control */
 #define FN_INSERT_CHECKBOX_CONTENT_CONTROL (FN_INSERT + 21)  /* Checkbox 
content control */
 #define FN_INSERT_OBJECT_DLG    (FN_INSERT + 22)    /* Object */
 #define FN_INSERT_PAGEBREAK     (FN_INSERT + 23)    /* Page break*/
+#define FN_INSERT_DROPDOWN_CONTENT_CONTROL (FN_INSERT + 24)  /* Dropdown 
content control */
 #define FN_POSTIT               (FN_INSERT + 29)    /* Insert/edit PostIt */
 #define FN_INSERT_TABLE         (FN_INSERT + 30)    /* Insert Table */
 #define FN_INSERT_STRING        (FN_INSERT+31)
diff --git a/sw/inc/formatcontentcontrol.hxx b/sw/inc/formatcontentcontrol.hxx
index a7bf74681936..d544021cdd8b 100644
--- a/sw/inc/formatcontentcontrol.hxx
+++ b/sw/inc/formatcontentcontrol.hxx
@@ -83,6 +83,8 @@ public:
 
     void dumpAsXml(xmlTextWriterPtr pWriter) const;
 
+    OUString ToString() const;
+
     static void ItemsToAny(const std::vector<SwContentControlListItem>& rItems,
                            css::uno::Any& rVal);
 
diff --git a/sw/inc/strings.hrc b/sw/inc/strings.hrc
index 90a7f5b44d73..1c91a387b94b 100644
--- a/sw/inc/strings.hrc
+++ b/sw/inc/strings.hrc
@@ -1421,6 +1421,7 @@
 
 #define STR_WRAP_PANEL_CUSTOM_STR               NC_("sidebarwrap|customlabel", 
"Custom")
 #define STR_CONTENT_CONTROL_PLACEHOLDER         
NC_("STR_CONTENT_CONTROL_PLACEHOLDER", "Click here to enter text")
+#define STR_DROPDOWN_CONTENT_CONTROL_PLACEHOLDER 
NC_("STR_DROPDOWN_CONTENT_CONTROL_PLACEHOLDER", "Choose an item")
 
 #endif
 
diff --git a/sw/qa/uibase/wrtsh/wrtsh.cxx b/sw/qa/uibase/wrtsh/wrtsh.cxx
index 51a1bbb984fa..9e9cee69f9ee 100644
--- a/sw/qa/uibase/wrtsh/wrtsh.cxx
+++ b/sw/qa/uibase/wrtsh/wrtsh.cxx
@@ -216,6 +216,29 @@ CPPUNIT_TEST_FIXTURE(Test, 
testSelectDropdownContentControl)
     // i.e. the document text was unchanged instead of display text of the 
first list item.
     CPPUNIT_ASSERT_EQUAL(OUString("red"), 
pTextNode->GetExpandText(pWrtShell->GetLayout()));
 }
+
+CPPUNIT_TEST_FIXTURE(Test, testInsertDropdownContentControl)
+{
+    // Given an empty document:
+    SwDoc* pDoc = createSwDoc();
+
+    // When inserting a content control:
+    SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+    pWrtShell->InsertContentControl(SwContentControlType::DROP_DOWN_LIST);
+
+    // Then make sure that the matching text attribute is added to the 
document model:
+    SwTextNode* pTextNode = pWrtShell->GetCursor()->GetNode().GetTextNode();
+    SwTextAttr* pAttr = pTextNode->GetTextAttrForCharAt(0, 
RES_TXTATR_CONTENTCONTROL);
+    auto pTextContentControl = 
static_txtattr_cast<SwTextContentControl*>(pAttr);
+    auto& rFormatContentControl
+        = static_cast<SwFormatContentControl&>(pTextContentControl->GetAttr());
+    SwContentControl* pContentControl = 
rFormatContentControl.GetContentControl();
+    // Without the accompanying fix in place, this test would have failed:
+    // - Expected: 1
+    // - Actual  : 0
+    // i.e. the inserted content control was a default (rich text) one, not a 
dropdown.
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), 
pContentControl->GetListItems().size());
+}
 }
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/sdi/_textsh.sdi b/sw/sdi/_textsh.sdi
index 8c76493bf36b..f9ec02b66f6d 100644
--- a/sw/sdi/_textsh.sdi
+++ b/sw/sdi/_textsh.sdi
@@ -284,6 +284,12 @@ interface BaseText
         StateMethod = NoState ;
         DisableFlags="SfxDisableFlags::SwOnProtectedCursor";
     ]
+    FN_INSERT_DROPDOWN_CONTENT_CONTROL  // status(final|play)
+    [
+        ExecMethod = ExecInsert ;
+        StateMethod = NoState ;
+        DisableFlags="SfxDisableFlags::SwOnProtectedCursor";
+    ]
     FN_INSERT_COLUMN_BREAK // status(final|play)
     [
         ExecMethod = ExecInsert ;
diff --git a/sw/sdi/swriter.sdi b/sw/sdi/swriter.sdi
index 93d16693c296..aeae14479435 100644
--- a/sw/sdi/swriter.sdi
+++ b/sw/sdi/swriter.sdi
@@ -3066,6 +3066,23 @@ SfxVoidItem InsertCheckboxContentControl 
FN_INSERT_CHECKBOX_CONTENT_CONTROL
     GroupId = SfxGroupId::Insert;
 ]
 
+SfxVoidItem InsertDropdownContentControl FN_INSERT_DROPDOWN_CONTENT_CONTROL
+()
+[
+    AutoUpdate = FALSE,
+    FastCall = FALSE,
+    ReadOnlyDoc = FALSE,
+    Toggle = FALSE,
+    Container = FALSE,
+    RecordAbsolute = FALSE,
+    RecordPerSet;
+
+    AccelConfig = TRUE,
+    MenuConfig = TRUE,
+    ToolBoxConfig = TRUE,
+    GroupId = SfxGroupId::Insert;
+]
+
 SfxVoidItem InsertMultiIndex FN_INSERT_MULTI_TOX
 ()
 [
diff --git a/sw/source/core/crsr/dropdowncontentcontrolbutton.cxx 
b/sw/source/core/crsr/dropdowncontentcontrolbutton.cxx
index b7113994c0c7..a1f73dc1b522 100644
--- a/sw/source/core/crsr/dropdowncontentcontrolbutton.cxx
+++ b/sw/source/core/crsr/dropdowncontentcontrolbutton.cxx
@@ -24,7 +24,9 @@ void SwDropDownContentControlButton::InitDropdown()
     std::vector<SwContentControlListItem> aListItems = 
m_rContentControl.GetListItems();
 
     for (const auto& rListItem : aListItems)
-        m_xTreeView->append_text(rListItem.m_aDisplayText);
+    {
+        m_xTreeView->append_text(rListItem.ToString());
+    }
 
     if (aListItems.empty())
     {
diff --git a/sw/source/core/txtnode/attrcontentcontrol.cxx 
b/sw/source/core/txtnode/attrcontentcontrol.cxx
index 8704221a9a3b..fd98947e3458 100644
--- a/sw/source/core/txtnode/attrcontentcontrol.cxx
+++ b/sw/source/core/txtnode/attrcontentcontrol.cxx
@@ -246,6 +246,16 @@ void SwContentControlListItem::dumpAsXml(xmlTextWriterPtr 
pWriter) const
     (void)xmlTextWriterEndElement(pWriter);
 }
 
+OUString SwContentControlListItem::ToString() const
+{
+    if (!m_aDisplayText.isEmpty())
+    {
+        return m_aDisplayText;
+    }
+
+    return m_aValue;
+}
+
 void SwContentControlListItem::ItemsToAny(const 
std::vector<SwContentControlListItem>& rItems,
                                           uno::Any& rVal)
 {
diff --git a/sw/source/uibase/shells/textsh.cxx 
b/sw/source/uibase/shells/textsh.cxx
index e8b05efb83b2..b7e25a137cef 100644
--- a/sw/source/uibase/shells/textsh.cxx
+++ b/sw/source/uibase/shells/textsh.cxx
@@ -229,6 +229,11 @@ void SwTextShell::ExecInsert(SfxRequest &rReq)
         rReq.Done();
         break;
 
+    case FN_INSERT_DROPDOWN_CONTENT_CONTROL:
+        rSh.InsertContentControl(SwContentControlType::DROP_DOWN_LIST);
+        rReq.Done();
+        break;
+
     case FN_INSERT_COLUMN_BREAK:
         rSh.InsertColumnBreak();
         rReq.Done();
diff --git a/sw/source/uibase/uiview/view.cxx b/sw/source/uibase/uiview/view.cxx
index 2fe2ad061456..d26759e3ea4c 100644
--- a/sw/source/uibase/uiview/view.cxx
+++ b/sw/source/uibase/uiview/view.cxx
@@ -595,6 +595,7 @@ void SwView::CheckReadonlyState()
             FN_INSERT_HARDHYPHEN,       FN_INSERT_HARD_SPACE,       
FN_INSERT_NNBSP,
             FN_INSERT_BREAK,            FN_INSERT_LINEBREAK,        
FN_INSERT_COLUMN_BREAK,
             FN_INSERT_BREAK_DLG,        FN_INSERT_CONTENT_CONTROL,  
FN_INSERT_CHECKBOX_CONTENT_CONTROL,
+            FN_INSERT_DROPDOWN_CONTENT_CONTROL,
             FN_DELETE_SENT,             FN_DELETE_BACK_SENT,        
FN_DELETE_WORD,
             FN_DELETE_BACK_WORD,        FN_DELETE_LINE,             
FN_DELETE_BACK_LINE,
             FN_DELETE_PARA,             FN_DELETE_BACK_PARA,        
FN_DELETE_WHOLE_LINE,
diff --git a/sw/source/uibase/wrtsh/wrtsh1.cxx 
b/sw/source/uibase/wrtsh/wrtsh1.cxx
index 576ffdec5b5d..256115b8ddd4 100644
--- a/sw/source/uibase/wrtsh/wrtsh1.cxx
+++ b/sw/source/uibase/wrtsh/wrtsh1.cxx
@@ -1025,7 +1025,6 @@ void 
SwWrtShell::InsertContentControl(SwContentControlType eType)
     switch (eType)
     {
         case SwContentControlType::RICH_TEXT:
-        case SwContentControlType::DROP_DOWN_LIST:
         {
             pContentControl->SetShowingPlaceHolder(true);
             if (!HasSelection())
@@ -1044,6 +1043,18 @@ void 
SwWrtShell::InsertContentControl(SwContentControlType eType)
             aPlaceholder = u"\u2610";
             break;
         }
+        case SwContentControlType::DROP_DOWN_LIST:
+        {
+            pContentControl->SetShowingPlaceHolder(true);
+            if (!HasSelection())
+            {
+                aPlaceholder = 
SwResId(STR_DROPDOWN_CONTENT_CONTROL_PLACEHOLDER);
+            }
+            SwContentControlListItem aListItem;
+            aListItem.m_aValue = aPlaceholder;
+            pContentControl->SetListItems({ aListItem });
+            break;
+        }
     }
     if (aPlaceholder.getLength())
     {
diff --git a/sw/source/uibase/wrtsh/wrtsh3.cxx 
b/sw/source/uibase/wrtsh/wrtsh3.cxx
index 573ea4a9752d..5225c7278357 100644
--- a/sw/source/uibase/wrtsh/wrtsh3.cxx
+++ b/sw/source/uibase/wrtsh/wrtsh3.cxx
@@ -132,7 +132,7 @@ bool SwWrtShell::GotoContentControl(const 
SwFormatContentControl& rContentContro
         size_t nSelectedListItem = *pContentControl->GetSelectedListItem();
         LockView(/*bViewLocked=*/true);
         OUString aOldState = GetCursorDescr();
-        OUString aNewState = 
pContentControl->GetListItems()[nSelectedListItem].m_aDisplayText;
+        OUString aNewState = 
pContentControl->GetListItems()[nSelectedListItem].ToString();
         SwRewriter aRewriter;
         aRewriter.AddRule(UndoArg1, aOldState);
         aRewriter.AddRule(UndoArg2, SwResId(STR_YIELDS));
diff --git a/sw/uiconfig/swriter/menubar/menubar.xml 
b/sw/uiconfig/swriter/menubar/menubar.xml
index e40052d1384a..c5d48d6375b3 100644
--- a/sw/uiconfig/swriter/menubar/menubar.xml
+++ b/sw/uiconfig/swriter/menubar/menubar.xml
@@ -714,6 +714,7 @@
         <menu:menupopup>
           <menu:menuitem menu:id=".uno:InsertContentControl"/>
           <menu:menuitem menu:id=".uno:InsertCheckboxContentControl"/>
+          <menu:menuitem menu:id=".uno:InsertDropdownContentControl"/>
         </menu:menupopup>
       </menu:menu>
     </menu:menupopup>
diff --git a/sw/uiconfig/swriter/menubar/mscompatibleformsmenu.xml 
b/sw/uiconfig/swriter/menubar/mscompatibleformsmenu.xml
index 6be7228ded4d..83b8cd35d98a 100644
--- a/sw/uiconfig/swriter/menubar/mscompatibleformsmenu.xml
+++ b/sw/uiconfig/swriter/menubar/mscompatibleformsmenu.xml
@@ -15,6 +15,9 @@
       <menu:menuseparator/>
       <menu:menu menu:id=".uno:MSCompatContentControls">
         <menu:menupopup>
+          <menu:menuitem menu:id=".uno:InsertContentControl"/>
+          <menu:menuitem menu:id=".uno:InsertCheckboxContentControl"/>
+          <menu:menuitem menu:id=".uno:InsertDropdownContentControl"/>
           <menu:menuitem menu:id=".uno:DatePickerFormField"/>
         </menu:menupopup>
       </menu:menu>
diff --git a/xmloff/source/text/txtparae.cxx b/xmloff/source/text/txtparae.cxx
index 4ffb14ad528b..4665df3e2f1f 100644
--- a/xmloff/source/text/txtparae.cxx
+++ b/xmloff/source/text/txtparae.cxx
@@ -3920,7 +3920,7 @@ void XMLTextParagraphExport::ExportContentControl(
         comphelper::SequenceAsHashMap aMap(rListItem);
         auto it = aMap.find("DisplayText");
         OUString aValue;
-        if (it != aMap.end() && (it->second >>= aValue))
+        if (it != aMap.end() && (it->second >>= aValue) && !aValue.isEmpty())
         {
             GetExport().AddAttribute(XML_NAMESPACE_LO_EXT, XML_DISPLAY_TEXT, 
aValue);
         }

Reply via email to