sw/Library_swui.mk | 1 sw/UIConfig_swriter.mk | 1 sw/inc/cmdid.h | 2 sw/inc/swabstdlg.hxx | 13 ++ sw/sdi/_textsh.sdi | 5 sw/sdi/swriter.sdi | 18 +++ sw/source/ui/dialog/swdlgfact.cxx | 17 +++ sw/source/ui/dialog/swdlgfact.hxx | 15 ++ sw/source/ui/utlui/copyfielddlg.cxx | 58 +++++++++++ sw/source/uibase/docvw/romenu.cxx | 6 - sw/source/uibase/docvw/romenu.hxx | 1 sw/source/uibase/inc/copyfielddlg.hxx | 37 +++++++ sw/source/uibase/shells/textfld.cxx | 32 +++++- sw/uiconfig/swriter/ui/copyfielddialog.ui | 157 ++++++++++++++++++++++++++++++ sw/uiconfig/swriter/ui/readonlymenu.ui | 14 ++ 15 files changed, 375 insertions(+), 2 deletions(-)
New commits: commit d36dc8169e0d32d42c6f7cf1a84d161310f3c4e7 Author: Oliver Specht <oliver.spe...@cib.de> AuthorDate: Wed Jan 8 14:20:43 2025 +0100 Commit: Thorsten Behrens <thorsten.behr...@allotropia.de> CommitDate: Mon Feb 3 20:19:40 2025 +0100 Add dialog to show content of fields in readonly documents Change-Id: I0036e8c02b57dab91361213489c5a6189149b553 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180351 Reviewed-by: Thorsten Behrens <thorsten.behr...@allotropia.de> Tested-by: allotropia jenkins <jenk...@allotropia.de> diff --git a/sw/Library_swui.mk b/sw/Library_swui.mk index 2c6d8512fe44..cf025735337e 100644 --- a/sw/Library_swui.mk +++ b/sw/Library_swui.mk @@ -168,6 +168,7 @@ $(eval $(call gb_Library_add_exception_objects,swui,\ sw/source/ui/table/tabledlg \ sw/source/ui/table/tautofmt \ sw/source/ui/utlui/swrenamexnameddlg \ + sw/source/ui/utlui/copyfielddlg \ )) ifneq (,$(filter DBCONNECTIVITY,$(BUILD_TYPE))) diff --git a/sw/UIConfig_swriter.mk b/sw/UIConfig_swriter.mk index 27b7248d74e5..21fe88323a4a 100644 --- a/sw/UIConfig_swriter.mk +++ b/sw/UIConfig_swriter.mk @@ -138,6 +138,7 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/swriter,\ sw/uiconfig/swriter/ui/contentcontroldropdown \ sw/uiconfig/swriter/ui/contentcontrollistitemdlg \ sw/uiconfig/swriter/ui/converttexttable \ + sw/uiconfig/swriter/ui/copyfielddialog \ sw/uiconfig/swriter/ui/createaddresslist \ sw/uiconfig/swriter/ui/createauthorentry \ sw/uiconfig/swriter/ui/createautomarkdialog \ diff --git a/sw/inc/cmdid.h b/sw/inc/cmdid.h index 5fc521d3eddf..6f5ea775dfa0 100644 --- a/sw/inc/cmdid.h +++ b/sw/inc/cmdid.h @@ -152,6 +152,8 @@ class SwUINumRuleItem; #define FN_REDLINE_ACCEPT_TONEXT (FN_EDIT2 + 45) /* Redlining Accept and jump to next*/ #define FN_REDLINE_REJECT_TONEXT (FN_EDIT2 + 46) /* Redlining Reject and jump to next*/ +#define FN_COPY_FIELD (FN_EDIT2 + 48) /* show field content in readonly documents to copy content*/ + // Region: View #define FN_DRAW_WRAP_DLG TypedWhichId<SfxInt16Item>(FN_VIEW + 3) /* Draw wrapping dlg */ #define FN_RULER (FN_VIEW + 11) /* Horizontal ruler */ diff --git a/sw/inc/swabstdlg.hxx b/sw/inc/swabstdlg.hxx index 1d205f18624f..2426e5f25e16 100644 --- a/sw/inc/swabstdlg.hxx +++ b/sw/inc/swabstdlg.hxx @@ -367,6 +367,16 @@ public: css::uno::Reference< css::container::XNameAccess > & xThird ) = 0; }; +/** + * Interface for copy field value dialog in read only documents. It's implemented by + * AbstractCopyFieldDlg_Impl + */ +class AbstractCopyFieldDlg : public VclAbstractDialog +{ +protected: + virtual ~AbstractCopyFieldDlg() override = default; +}; + /** * Interface for e.g. the form -> content control -> properties -> add dialog. It's implemented by * AbstractSwContentControlListItemDlg_Impl, but SwContentControlDlg only knows about this interface @@ -548,6 +558,9 @@ public: virtual VclPtr<AbstractSwRenameXNamedDlg> CreateSwRenameXNamedDlg(weld::Widget* pParent, css::uno::Reference< css::container::XNamed > & xNamed, css::uno::Reference< css::container::XNameAccess > & xNameAccess) = 0; + + virtual VclPtr<VclAbstractDialog> CreateCopyFieldDlg(weld::Widget* pParent, const rtl::OUString& rFieldValue ) = 0; + virtual VclPtr<AbstractSwModalRedlineAcceptDlg> CreateSwModalRedlineAcceptDlg(weld::Window *pParent) = 0; virtual VclPtr<AbstractSwPageNumberDlg> CreateSwPageNumberDlg(weld::Window* pParent) = 0; diff --git a/sw/sdi/_textsh.sdi b/sw/sdi/_textsh.sdi index 810932876bee..9c30229795a4 100644 --- a/sw/sdi/_textsh.sdi +++ b/sw/sdi/_textsh.sdi @@ -1023,6 +1023,11 @@ interface BaseText StateMethod = StateField ; DisableFlags="SfxDisableFlags::SwOnProtectedCursor"; ] + FN_COPY_FIELD // status() + [ + ExecMethod = ExecField; + StateMethod = StateField; + ] FN_UPDATE_SEL_FIELD [ ExecMethod = ExecField ; diff --git a/sw/sdi/swriter.sdi b/sw/sdi/swriter.sdi index deee2b2ee0ae..d6e0e703fb8b 100644 --- a/sw/sdi/swriter.sdi +++ b/sw/sdi/swriter.sdi @@ -8740,3 +8740,21 @@ SfxVoidItem OutlineLevelsShown FN_OUTLINE_LEVELS_SHOWN ToolBoxConfig = TRUE, GroupId = SfxGroupId::View; ] + +SfxVoidItem CopyFieldDialog FN_COPY_FIELD +() +[ + AutoUpdate = TRUE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Asynchron; + + AccelConfig = FALSE, + MenuConfig = FALSE, + ToolBoxConfig = FALSE, + GroupId = SfxGroupId::Edit; +] diff --git a/sw/source/ui/dialog/swdlgfact.cxx b/sw/source/ui/dialog/swdlgfact.cxx index 42a46be6858f..d7ef3643318d 100644 --- a/sw/source/ui/dialog/swdlgfact.cxx +++ b/sw/source/ui/dialog/swdlgfact.cxx @@ -92,6 +92,7 @@ #include <mmresultdialogs.hxx> #include <formatlinebreak.hxx> #include <translatelangselect.hxx> +#include <copyfielddlg.hxx> using namespace ::com::sun::star; using namespace css::frame; @@ -1005,6 +1006,16 @@ std::optional<SwLanguageListItem> AbstractSwTranslateLangSelectDlg_Impl::GetSele #endif } +short AbstractCopyFieldDlg_Impl::Execute() +{ + return m_xDlg->run(); +} + +bool AbstractCopyFieldDlg_Impl::StartExecuteAsync(AsyncContext &rCtx) +{ + return weld::GenericDialogController::runAsync(m_xDlg, rCtx.maEndDialogFn); +} + short AbstractChangeDbDialog_Impl::Execute() { assert(false); @@ -1260,6 +1271,12 @@ VclPtr<AbstractSwModalRedlineAcceptDlg> SwAbstractDialogFactory_Impl::CreateSwMo return VclPtr<AbstractSwModalRedlineAcceptDlg_Impl>::Create(std::make_unique<SwModalRedlineAcceptDlg>(pParent)); } +VclPtr<VclAbstractDialog> SwAbstractDialogFactory_Impl::CreateCopyFieldDlg(weld::Widget* pParent, + const rtl::OUString& rFieldValue) +{ + return VclPtr<AbstractCopyFieldDlg_Impl>::Create(std::make_unique<CopyFieldDlg>(pParent, rFieldValue)); +} + VclPtr<AbstractSwPageNumberDlg> SwAbstractDialogFactory_Impl::CreateSwPageNumberDlg(weld::Window *pParent) { return VclPtr<AbstractSwPageNumberDlg_Impl>::Create(std::make_shared<SwPageNumberDlg>(pParent)); diff --git a/sw/source/ui/dialog/swdlgfact.hxx b/sw/source/ui/dialog/swdlgfact.hxx index ae11902beedc..a7240fe862b8 100644 --- a/sw/source/ui/dialog/swdlgfact.hxx +++ b/sw/source/ui/dialog/swdlgfact.hxx @@ -58,6 +58,7 @@ #include <o3tl/deleter.hxx> #include <pagenumberdlg.hxx> #include <changedb.hxx> +#include <copyfielddlg.hxx> class SwInsertAbstractDlg; @@ -766,6 +767,18 @@ public: }; +class AbstractCopyFieldDlg_Impl : public VclAbstractDialog +{ + std::shared_ptr<CopyFieldDlg> m_xDlg; +public: + explicit AbstractCopyFieldDlg_Impl(std::shared_ptr<CopyFieldDlg> p) + : m_xDlg(std::move(p)) + { + } + virtual short Execute() override; + virtual bool StartExecuteAsync(AsyncContext &rCtx) override; +}; + //AbstractDialogFactory_Impl implementations class SwAbstractDialogFactory_Impl : public SwAbstractDialogFactory { @@ -907,6 +920,8 @@ public: virtual GlossaryGetCurrGroup GetGlossaryCurrGroupFunc() override; virtual GlossarySetActGroup SetGlossaryActGroupFunc() override; + virtual VclPtr<VclAbstractDialog> CreateCopyFieldDlg(weld::Widget* pParent, const rtl::OUString& rFieldValue ) override; + // For TabPage virtual CreateTabPage GetTabPageCreatorFunc( sal_uInt16 nId ) override; diff --git a/sw/source/ui/utlui/copyfielddlg.cxx b/sw/source/ui/utlui/copyfielddlg.cxx new file mode 100644 index 000000000000..6625f581e451 --- /dev/null +++ b/sw/source/ui/utlui/copyfielddlg.cxx @@ -0,0 +1,58 @@ +/* -*- 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 <copyfielddlg.hxx> +#include <comphelper/string.hxx> + +using namespace ::com::sun::star; + +CopyFieldDlg::CopyFieldDlg(weld::Widget* pParent, const rtl::OUString& rFieldValue) + : GenericDialogController(pParent, u"modules/swriter/ui/copyfielddialog.ui"_ustr, + u"CopyFieldDialog"_ustr) + , m_xFieldValueED(new ConditionEdit<weld::TextView>(m_xBuilder->weld_text_view(u"value"_ustr))) + , m_xCopy(m_xBuilder->weld_button(u"copy"_ustr)) + , m_xClose(m_xBuilder->weld_button(u"cancel"_ustr)) +{ + m_xClose->connect_clicked(LINK(this, CopyFieldDlg, CloseHdl)); + m_xCopy->connect_clicked(LINK(this, CopyFieldDlg, CopyHdl)); + + m_xFieldValueED->set_text(rFieldValue); + sal_Int32 nRows{ comphelper::string::getTokenCount(rFieldValue, ' ') }; + + m_xFieldValueED->get_widget().set_size_request( + m_xFieldValueED->get_widget().get_preferred_size().Width() * 2, + m_xFieldValueED->get_widget().get_height_rows(std::min<sal_Int32>(nRows + 1, 6))); +} + +IMPL_LINK_NOARG(CopyFieldDlg, CloseHdl, weld::Button&, void) { m_xDialog->response(RET_OK); } + +IMPL_LINK_NOARG(CopyFieldDlg, CopyHdl, weld::Button&, void) +{ + int nStartPos; + int nEndPos; + m_xFieldValueED->get_widget().get_selection_bounds(nStartPos, nEndPos); + if (nStartPos == nEndPos) + m_xFieldValueED->get_widget().select_region(0, -1); + + m_xFieldValueED->get_widget().copy_clipboard(); + if (nStartPos == nEndPos) + m_xFieldValueED->get_widget().select_region(0, 0); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/uibase/docvw/romenu.cxx b/sw/source/uibase/docvw/romenu.cxx index fb8d20d0e525..e401db04bc50 100644 --- a/sw/source/uibase/docvw/romenu.cxx +++ b/sw/source/uibase/docvw/romenu.cxx @@ -96,6 +96,7 @@ SwReadOnlyPopup::SwReadOnlyPopup(const Point &rDPos, SwView &rV) , m_nReadonlyLoadGraphic(m_xMenu->GetItemId(u"loadgraphic")) , m_nReadonlyGraphicoff(m_xMenu->GetItemId(u"imagesoff")) , m_nReadonlyFullscreen(m_xMenu->GetItemId(u"fullscreen")) + , m_nReadonlyCopyField(m_xMenu->GetItemId(u"copyfield")) , m_nReadonlyCopy(m_xMenu->GetItemId(u"copy")) , m_rView(rV) , m_xBrushItem(std::make_unique<SvxBrushItem>(RES_BACKGROUND)) @@ -213,7 +214,8 @@ SwReadOnlyPopup::SwReadOnlyPopup(const Point &rDPos, SwView &rV) m_xMenu->EnableItem(m_nReadonlyCopylink, false); } Check(m_nReadonlyFullscreen, SID_WIN_FULLSCREEN, rDis); - + eState = rVFrame.GetBindings().QueryState(FN_COPY_FIELD, pState); + m_xMenu->EnableItem(m_nReadonlyCopyField, eState > SfxItemState::DISABLED); m_xMenu->RemoveDisabledEntries( true ); } @@ -284,6 +286,8 @@ void SwReadOnlyPopup::Execute( vcl::Window* pWin, sal_uInt16 nId ) nExecId = SID_BROWSE_FORWARD; else if (nId == m_nReadonlySourceview) nExecId = SID_SOURCEVIEW; + else if (nId == m_nReadonlyCopyField) + nExecId = FN_COPY_FIELD; else if (nId == m_nReadonlySaveGraphic || nId == m_nReadonlySaveBackground) SaveGraphic(nId); else if (nId == m_nReadonlyCopylink) diff --git a/sw/source/uibase/docvw/romenu.hxx b/sw/source/uibase/docvw/romenu.hxx index 1af58d3dee6d..fed747f33d18 100644 --- a/sw/source/uibase/docvw/romenu.hxx +++ b/sw/source/uibase/docvw/romenu.hxx @@ -55,6 +55,7 @@ class SwReadOnlyPopup sal_uInt16 m_nReadonlyLoadGraphic; sal_uInt16 m_nReadonlyGraphicoff; sal_uInt16 m_nReadonlyFullscreen; + sal_uInt16 m_nReadonlyCopyField; sal_uInt16 m_nReadonlyCopy; SwView & m_rView; diff --git a/sw/source/uibase/inc/copyfielddlg.hxx b/sw/source/uibase/inc/copyfielddlg.hxx new file mode 100644 index 000000000000..d255930e8ea8 --- /dev/null +++ b/sw/source/uibase/inc/copyfielddlg.hxx @@ -0,0 +1,37 @@ +/* -*- 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> +#include <condedit.hxx> + +class CopyFieldDlg final : public weld::GenericDialogController +{ + std::unique_ptr<ConditionEdit<weld::TextView>> m_xFieldValueED; + std::unique_ptr<weld::Button> m_xCopy; + std::unique_ptr<weld::Button> m_xClose; + + DECL_LINK(CloseHdl, weld::Button&, void); + DECL_LINK(CopyHdl, weld::Button&, void); + +public: + CopyFieldDlg(weld::Widget* pParent, const rtl::OUString& rFieldValue); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/uibase/shells/textfld.cxx b/sw/source/uibase/shells/textfld.cxx index 187129190133..1b07a0708693 100644 --- a/sw/source/uibase/shells/textfld.cxx +++ b/sw/source/uibase/shells/textfld.cxx @@ -178,6 +178,24 @@ void SwTextShell::ExecField(SfxRequest &rReq) } break; } + case FN_COPY_FIELD: + { + //call copy field dialog with field string - if there is any! + SwField* pField = rSh.GetCurField(true); + if( pField && pField->GetFieldName().getLength()) + { + SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); + VclPtr<VclAbstractDialog> pDlg(pFact->CreateCopyFieldDlg( + GetView().GetFrameWeld(), pField->ExpandField(true, nullptr))); + pDlg->StartExecuteAsync( + [pDlg] (sal_Int32 /*nResult*/)->void + { + pDlg->disposeOnce(); + } + ); + } + break; + } case FN_UPDATE_SEL_FIELD: { SwField *pField = rSh.GetCurField(); @@ -1504,7 +1522,19 @@ void SwTextShell::StateField( SfxItemSet &rSet ) } } break; - + case FN_COPY_FIELD: + { + if( !bGetField ) + { + pField = rSh.GetCurField(true); + bGetField = true; + } + SwFieldIds nTempWhich = pField ? pField->GetTyp()->Which() : SwFieldIds::Unknown; + if (SwFieldIds::Unknown == nTempWhich + || !pField->ExpandField(true, nullptr).getLength()) + rSet.DisableItem( nWhich ); + } + break; case FN_UPDATE_SEL_FIELD: { pField = rSh.GetCurField(); diff --git a/sw/uiconfig/swriter/ui/copyfielddialog.ui b/sw/uiconfig/swriter/ui/copyfielddialog.ui new file mode 100644 index 000000000000..f98d5c7b895a --- /dev/null +++ b/sw/uiconfig/swriter/ui/copyfielddialog.ui @@ -0,0 +1,157 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.40.0 --> +<interface domain="sw"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkDialog" id="CopyFieldDialog"> + <property name="can-focus">False</property> + <property name="border-width">6</property> + <property name="title" translatable="yes" context="copyfielddialog|CopyFieldDialog">Copy field content</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="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> + <child> + <object class="GtkButton" id="copy"> + <property name="label" translatable="yes" context="stock">_Copy</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">3</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=1 --> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can-focus">False</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="row-spacing">6</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="copyfielddialog|label2">Content: </property> + <property name="use-underline">True</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="GtkScrolledWindow" id="scrolledwindow1"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="shadow-type">in</property> + <child> + <object class="GtkTextView" id="value"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="value-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="copyfielddialog|extended_tip|value">Enter the contents to add to a user-defined field.</property> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="copyfielddialog|label1">Field content</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> + </object> + </child> + <action-widgets> + <action-widget response="-6">cancel</action-widget> + <action-widget response="-11">help</action-widget> + </action-widgets> + </object> +</interface> diff --git a/sw/uiconfig/swriter/ui/readonlymenu.ui b/sw/uiconfig/swriter/ui/readonlymenu.ui index 0c83d8a7616e..d81b0150786e 100644 --- a/sw/uiconfig/swriter/ui/readonlymenu.ui +++ b/sw/uiconfig/swriter/ui/readonlymenu.ui @@ -225,6 +225,20 @@ <property name="use_underline">True</property> </object> </child> + <child> + <object class="GtkSeparatorMenuItem" id="menuitem9"> + <property name="visible">True</property> + <property name="can-focus">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="copyfield"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="readonlymenu|copyfield">Copy _Field</property> + <property name="use-underline">True</property> + </object> + </child> <child> <object class="GtkSeparatorMenuItem" id="menuitem7"> <property name="visible">True</property>