diff options
-rw-r--r-- | officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu | 13 | ||||
-rw-r--r-- | sw/inc/cmdid.h | 1 | ||||
-rw-r--r-- | sw/inc/formatcontentcontrol.hxx | 6 | ||||
-rw-r--r-- | sw/qa/uibase/wrtsh/wrtsh.cxx | 23 | ||||
-rw-r--r-- | sw/sdi/_textsh.sdi | 6 | ||||
-rw-r--r-- | sw/sdi/swriter.sdi | 17 | ||||
-rw-r--r-- | sw/source/uibase/inc/wrtsh.hxx | 3 | ||||
-rw-r--r-- | sw/source/uibase/shells/textsh.cxx | 8 | ||||
-rw-r--r-- | sw/source/uibase/uiview/view.cxx | 2 | ||||
-rw-r--r-- | sw/source/uibase/wrtsh/wrtsh1.cxx | 31 | ||||
-rw-r--r-- | sw/uiconfig/swriter/menubar/menubar.xml | 7 |
11 files changed, 106 insertions, 11 deletions
diff --git a/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu b/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu index 8835deef87a7..b36802016c1d 100644 --- a/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu +++ b/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu @@ -614,6 +614,11 @@ <value>1</value> </prop> </node> + <node oor:name=".uno:ContentControlsMenu" oor:op="replace"> + <prop oor:name="Label" oor:type="xs:string"> + <value xml:lang="en-US">Content Controls</value> + </prop> + </node> <node oor:name=".uno:InsertContentControl" oor:op="replace"> <prop oor:name="Label" oor:type="xs:string"> <value xml:lang="en-US">Insert Rich Text Content Control</value> @@ -622,6 +627,14 @@ <value>1</value> </prop> </node> + <node oor:name=".uno:InsertCheckboxContentControl" oor:op="replace"> + <prop oor:name="Label" oor:type="xs:string"> + <value xml:lang="en-US">Insert Check Box 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 29adc6a580d6..355d607a5bc5 100644 --- a/sw/inc/cmdid.h +++ b/sw/inc/cmdid.h @@ -218,6 +218,7 @@ class SwUINumRuleItem; #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_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_POSTIT (FN_INSERT + 29) /* Insert/edit PostIt */ diff --git a/sw/inc/formatcontentcontrol.hxx b/sw/inc/formatcontentcontrol.hxx index 368720a0cb76..8419446f59c0 100644 --- a/sw/inc/formatcontentcontrol.hxx +++ b/sw/inc/formatcontentcontrol.hxx @@ -32,6 +32,12 @@ class SwTextContentControl; class SwTextNode; class SwXContentControl; +enum class SwContentControlType +{ + RICH_TEXT, + CHECKBOX, +}; + /// SfxPoolItem subclass that wraps an SwContentControl. class SAL_DLLPUBLIC_RTTI SwFormatContentControl final : public SfxPoolItem { diff --git a/sw/qa/uibase/wrtsh/wrtsh.cxx b/sw/qa/uibase/wrtsh/wrtsh.cxx index b4d4cca09df6..5fddff1d884f 100644 --- a/sw/qa/uibase/wrtsh/wrtsh.cxx +++ b/sw/qa/uibase/wrtsh/wrtsh.cxx @@ -136,7 +136,7 @@ CPPUNIT_TEST_FIXTURE(Test, testInsertContentControl) // When inserting a content control: SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - pWrtShell->InsertContentControl(); + pWrtShell->InsertContentControl(SwContentControlType::RICH_TEXT); // Then make sure that the matching text attribute is added to the document model: SwTextNode* pTextNode = pWrtShell->GetCursor()->GetNode().GetTextNode(); @@ -144,6 +144,27 @@ CPPUNIT_TEST_FIXTURE(Test, testInsertContentControl) // InsertContentControl(). CPPUNIT_ASSERT(pTextNode->GetTextAttrForCharAt(0, RES_TXTATR_CONTENTCONTROL)); } + +CPPUNIT_TEST_FIXTURE(Test, testInsertCheckboxContentControl) +{ + // Given an empty document: + SwDoc* pDoc = createSwDoc(); + + // When inserting a content control: + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->InsertContentControl(SwContentControlType::CHECKBOX); + + // 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, the inserted content + // control wasn't a checkbox one. + CPPUNIT_ASSERT(pContentControl->GetCheckbox()); +} } CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/sdi/_textsh.sdi b/sw/sdi/_textsh.sdi index 7610800f2cc4..21b56b6c1a60 100644 --- a/sw/sdi/_textsh.sdi +++ b/sw/sdi/_textsh.sdi @@ -278,6 +278,12 @@ interface BaseText StateMethod = NoState ; DisableFlags="SfxDisableFlags::SwOnProtectedCursor"; ] + FN_INSERT_CHECKBOX_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 274122f1cb81..0b808255e588 100644 --- a/sw/sdi/swriter.sdi +++ b/sw/sdi/swriter.sdi @@ -3049,6 +3049,23 @@ SfxVoidItem InsertContentControl FN_INSERT_CONTENT_CONTROL GroupId = SfxGroupId::Insert; ] +SfxVoidItem InsertCheckboxContentControl FN_INSERT_CHECKBOX_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/uibase/inc/wrtsh.hxx b/sw/source/uibase/inc/wrtsh.hxx index 37d82557ac03..a80f42c8315a 100644 --- a/sw/source/uibase/inc/wrtsh.hxx +++ b/sw/source/uibase/inc/wrtsh.hxx @@ -55,6 +55,7 @@ class SwFieldMgr; class SfxRequest; enum class SwLineBreakClear; class SwContentControl; +enum class SwContentControlType; namespace i18nutil { struct SearchOptions2; @@ -316,7 +317,7 @@ typedef bool (SwWrtShell::*FNSimpleMove)(); void InsertPageBreak(const OUString *pPageDesc = nullptr, const ::std::optional<sal_uInt16>& rPgNum = std::nullopt); void InsertLineBreak(std::optional<SwLineBreakClear> oClear = std::nullopt); void InsertColumnBreak(); - void InsertContentControl(); + void InsertContentControl(SwContentControlType eType); void InsertFootnote(const OUString &, bool bEndNote = false, bool bEdit = true ); void SplitNode( bool bAutoFormat = false ); bool CanInsert(); diff --git a/sw/source/uibase/shells/textsh.cxx b/sw/source/uibase/shells/textsh.cxx index 667f7503bcea..280e667eaf2c 100644 --- a/sw/source/uibase/shells/textsh.cxx +++ b/sw/source/uibase/shells/textsh.cxx @@ -91,6 +91,7 @@ using namespace ::com::sun::star; #include <com/sun/star/ui/dialogs/DialogClosedEvent.hpp> #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp> #include <IDocumentUndoRedo.hxx> +#include <formatcontentcontrol.hxx> SFX_IMPL_INTERFACE(SwTextShell, SwBaseShell) @@ -219,7 +220,12 @@ void SwTextShell::ExecInsert(SfxRequest &rReq) break; case FN_INSERT_CONTENT_CONTROL: - rSh.InsertContentControl(); + rSh.InsertContentControl(SwContentControlType::RICH_TEXT); + rReq.Done(); + break; + + case FN_INSERT_CHECKBOX_CONTENT_CONTROL: + rSh.InsertContentControl(SwContentControlType::CHECKBOX); rReq.Done(); break; diff --git a/sw/source/uibase/uiview/view.cxx b/sw/source/uibase/uiview/view.cxx index 8aa7e37b06bb..4efcfc677a7c 100644 --- a/sw/source/uibase/uiview/view.cxx +++ b/sw/source/uibase/uiview/view.cxx @@ -592,7 +592,7 @@ void SwView::CheckReadonlyState() SID_CHARMAP, SID_EMOJI_CONTROL, FN_INSERT_SOFT_HYPHEN, 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_BREAK_DLG, FN_INSERT_CONTENT_CONTROL, FN_INSERT_CHECKBOX_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 daabc4002575..a0cd400b5145 100644 --- a/sw/source/uibase/wrtsh/wrtsh1.cxx +++ b/sw/source/uibase/wrtsh/wrtsh1.cxx @@ -1012,7 +1012,7 @@ void SwWrtShell::InsertColumnBreak() EndUndo(SwUndoId::UI_INSERT_COLUMN_BREAK); } -void SwWrtShell::InsertContentControl() +void SwWrtShell::InsertContentControl(SwContentControlType eType) { if (!lcl_IsAllowed(this)) { @@ -1026,13 +1026,32 @@ void SwWrtShell::InsertContentControl() } auto pContentControl = std::make_shared<SwContentControl>(nullptr); - pContentControl->SetShowingPlaceHolder(true); - if (!HasSelection()) + OUString aPlaceholder; + switch (eType) { - OUString aPlaceholder = SwResId(STR_CONTENT_CONTROL_PLACEHOLDER); - Insert(aPlaceholder); - Left(CRSR_SKIP_CHARS, /*bSelect=*/true, aPlaceholder.getLength(), /*bBasicCall=*/false); + case SwContentControlType::RICH_TEXT: + { + pContentControl->SetShowingPlaceHolder(true); + if (!HasSelection()) + { + aPlaceholder = SwResId(STR_CONTENT_CONTROL_PLACEHOLDER); + } + break; + } + case SwContentControlType::CHECKBOX: + { + pContentControl->SetCheckbox(true); + // Ballot Box with X + pContentControl->SetCheckedState(u"\u2612"); + // Ballot Box + pContentControl->SetUncheckedState(OUString(u"\u2610")); + aPlaceholder = u"\u2610"; + break; + } } + Insert(aPlaceholder); + Left(CRSR_SKIP_CHARS, /*bSelect=*/true, aPlaceholder.getLength(), + /*bBasicCall=*/false); SwFormatContentControl aContentControl(pContentControl, RES_TXTATR_CONTENTCONTROL); SetAttrItem(aContentControl); } diff --git a/sw/uiconfig/swriter/menubar/menubar.xml b/sw/uiconfig/swriter/menubar/menubar.xml index 90c859ab6179..e5d20fa5a751 100644 --- a/sw/uiconfig/swriter/menubar/menubar.xml +++ b/sw/uiconfig/swriter/menubar/menubar.xml @@ -710,7 +710,12 @@ <menu:menuitem menu:id=".uno:OpenReadOnly"/> <menu:menuitem menu:id=".uno:AutoControlFocus"/> <menu:menuseparator/> - <menu:menuitem menu:id=".uno:InsertContentControl"/> + <menu:menu menu:id=".uno:ContentControlsMenu"> + <menu:menupopup> + <menu:menuitem menu:id=".uno:InsertContentControl"/> + <menu:menuitem menu:id=".uno:InsertCheckboxContentControl"/> + </menu:menupopup> + </menu:menu> </menu:menupopup> </menu:menu> <menu:menu menu:id=".uno:ToolsMenu"> |