diff options
author | Muhammet Kara <muhammet.kara@collabora.com> | 2019-05-27 17:44:10 +0300 |
---|---|---|
committer | Muhammet Kara <muhammet.kara@collabora.com> | 2019-06-08 11:10:14 +0200 |
commit | 82bba7e4c044e54fc678ab108c662473d3a471a8 (patch) | |
tree | 51f7fae2905ffa7878c1d03558c5c23577b6ea96 | |
parent | 4195323c05244688a093e95bd75c1e4d504a1a60 (diff) |
Auto redaction dialog first iteration
* Add the uno command .uno:AutoRedact with the name 'Auto-Redact'
* Add the dialog SfxAutoRedactDialog
* Implement the basic functionality to show up when clicked on the
menu/toolbar item.
* Add the class TargetsTable to control the weld::TreeView
which is used to list the targets
* Add the struct RedactionTarget to keep info for individual targets
Change-Id: Ic02dfb009590c0928a2ea7b0f8b19b4febca221a
Reviewed-on: https://gerrit.libreoffice.org/72254
Tested-by: Jenkins
Reviewed-by: Muhammet Kara <muhammet.kara@collabora.com>
-rw-r--r-- | include/sfx2/autoredactdialog.hxx | 104 | ||||
-rw-r--r-- | include/sfx2/sfxsids.hrc | 3 | ||||
-rw-r--r-- | officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu | 14 | ||||
-rw-r--r-- | sfx2/Library_sfx.mk | 1 | ||||
-rw-r--r-- | sfx2/UIConfig_sfx.mk | 1 | ||||
-rw-r--r-- | sfx2/sdi/docslots.sdi | 5 | ||||
-rw-r--r-- | sfx2/sdi/sfx.sdi | 17 | ||||
-rw-r--r-- | sfx2/source/appl/appuno.cxx | 5 | ||||
-rw-r--r-- | sfx2/source/doc/autoredactdialog.cxx | 181 | ||||
-rw-r--r-- | sfx2/source/doc/objserv.cxx | 19 | ||||
-rw-r--r-- | sfx2/uiconfig/ui/autoredactdialog.ui | 339 | ||||
-rw-r--r-- | solenv/sanitizers/ui/sfx.suppr | 2 |
12 files changed, 688 insertions, 3 deletions
diff --git a/include/sfx2/autoredactdialog.hxx b/include/sfx2/autoredactdialog.hxx new file mode 100644 index 000000000000..8de264871154 --- /dev/null +++ b/include/sfx2/autoredactdialog.hxx @@ -0,0 +1,104 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * 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/. + */ + +#ifndef INCLUDED_SFX2_AUTOREDACTDIALOG_HXX +#define INCLUDED_SFX2_AUTOREDACTDIALOG_HXX + +#include <memory> +#include <sal/config.h> +#include <sfx2/dllapi.h> +#include <sfx2/basedlgs.hxx> +#include <sfx2/objsh.hxx> + +#include <vcl/idle.hxx> +#include <o3tl/typed_flags_set.hxx> + +namespace weld +{ +class Button; +} +namespace weld +{ +class Label; +} +namespace weld +{ +class Window; +} +namespace weld +{ +class TreeView; +} + +struct RedactionTarget +{ + sal_uInt32 nID; + OUString sName; + OUString sType; + bool bCaseSensitive; + bool bWholeWords; + OUString sDescription; +}; + +class TargetsTable +{ + std::unique_ptr<weld::TreeView> m_xControl; + int GetRowByTargetName(const OUString& sName); + +public: + TargetsTable(std::unique_ptr<weld::TreeView> xControl); + void InsertTarget(RedactionTarget* pTarget); + void SelectByName(const OUString& sName); + RedactionTarget* GetTargetByName(const OUString& sName); + OUString GetNameProposal(); + + void unselect_all() { m_xControl->unselect_all(); } + bool has_focus() const { return m_xControl->has_focus(); } + int n_children() const { return m_xControl->n_children(); } + int get_selected_index() const { return m_xControl->get_selected_index(); } + std::vector<int> get_selected_rows() const { return m_xControl->get_selected_rows(); } + void clear() { m_xControl->clear(); } + void remove(int nRow) { m_xControl->remove(nRow); } + void select(int nRow) { m_xControl->select(nRow); } + OUString get_id(int nRow) const { return m_xControl->get_id(nRow); } + + //void connect_changed(const Link<weld::TreeView&, void>& rLink) { m_xControl->connect_changed(rLink); } + //void connect_row_activated(const Link<weld::TreeView&, void>& rLink) { m_xControl->connect_row_activated(rLink); } +}; + +class SFX2_DLLPUBLIC SfxAutoRedactDialog : public SfxDialogController +{ + SfxObjectShellLock m_xDocShell; + std::vector<std::pair<TargetsTable*, OUString>> m_aTableTargets; + + std::unique_ptr<weld::Label> m_xRedactionTargetsLabel; + std::unique_ptr<TargetsTable> m_xTargetsBox; + std::unique_ptr<weld::Button> m_xLoadBtn; + std::unique_ptr<weld::Button> m_xSaveBtn; + std::unique_ptr<weld::Button> m_xAddBtn; + std::unique_ptr<weld::Button> m_xEditBtn; + std::unique_ptr<weld::Button> m_xDeleteBtn; + +public: + SfxAutoRedactDialog(weld::Window* pParent); + virtual ~SfxAutoRedactDialog() override; + + /* + * Check if the dialog has any valid redaction targets. + */ + bool hasTargets() const; + + // TODO: Some method(s) to check emptiness/validity + // TODO: Some method(s) to get the search params/objects + // TODO: Some method(s) to load/save redaction target sets +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/include/sfx2/sfxsids.hrc b/include/sfx2/sfxsids.hrc index ca2349b0196c..20c9e4db5c94 100644 --- a/include/sfx2/sfxsids.hrc +++ b/include/sfx2/sfxsids.hrc @@ -138,6 +138,7 @@ class SvxSearchItem; #define SID_EXPORTDOCASEPUB (SID_SFX_START + 1677) #define SID_DIRECTEXPORTDOCASEPUB (SID_SFX_START + 1678) #define SID_REDACTDOC (SID_SFX_START + 1732) +#define SID_AUTOREDACTDOC (SID_SFX_START + 1736) #define SID_UPDATEDOCMODE (SID_SFX_START + 1668) #define SID_CHECKOUT (SID_SFX_START + 512) #define SID_CANCELCHECKOUT (SID_SFX_START + 513) @@ -263,7 +264,7 @@ class SvxSearchItem; #define SID_REDACTION_STYLE (SID_SFX_START + 1734) #define SID_DIALOG_PARENT (SID_SFX_START + 1735) -// SID_SFX_free_START (SID_SFX_START + 1736) +// SID_SFX_free_START (SID_SFX_START + 1737) // SID_SFX_free_END (SID_SFX_START + 3999) #define SID_OPEN_NEW_VIEW (SID_SFX_START + 520) diff --git a/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu b/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu index af45ccfc01a9..da7027430cbe 100644 --- a/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu +++ b/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu @@ -5089,6 +5089,20 @@ <value>1</value> </prop> </node> + <node oor:name=".uno:AutoRedactDoc" oor:op="replace"> + <prop oor:name="Label" oor:type="xs:string"> + <value xml:lang="en-US">Auto-Redact</value> + </prop> + <prop oor:name="ContextLabel" oor:type="xs:string"> + <value xml:lang="en-US">Auto-Redact</value> + </prop> + <prop oor:name="TooltipLabel" oor:type="xs:string"> + <value xml:lang="en-US">Auto-Redact Document</value> + </prop> + <prop oor:name="Properties" oor:type="xs:int"> + <value>1</value> + </prop> + </node> <node oor:name=".uno:ConfigureDialog" oor:op="replace"> <prop oor:name="Label" oor:type="xs:string"> <value xml:lang="en-US">~Customize...</value> diff --git a/sfx2/Library_sfx.mk b/sfx2/Library_sfx.mk index 3f911e6b088d..6abba0617c7f 100644 --- a/sfx2/Library_sfx.mk +++ b/sfx2/Library_sfx.mk @@ -198,6 +198,7 @@ $(eval $(call gb_Library_add_exception_objects,sfx,\ sfx2/source/doc/Metadatable \ sfx2/source/doc/QuerySaveDocument \ sfx2/source/doc/SfxDocumentMetaData \ + sfx2/source/doc/autoredactdialog \ sfx2/source/doc/docfac \ sfx2/source/doc/docfile \ sfx2/source/doc/docfilt \ diff --git a/sfx2/UIConfig_sfx.mk b/sfx2/UIConfig_sfx.mk index f476c66ebe03..a7154213d128 100644 --- a/sfx2/UIConfig_sfx.mk +++ b/sfx2/UIConfig_sfx.mk @@ -11,6 +11,7 @@ $(eval $(call gb_UIConfig_UIConfig,sfx)) $(eval $(call gb_UIConfig_add_uifiles,sfx,\ sfx2/uiconfig/ui/alienwarndialog \ + sfx2/uiconfig/ui/autoredactdialog \ sfx2/uiconfig/ui/bookmarkdialog \ sfx2/uiconfig/ui/bookmarkmenu \ sfx2/uiconfig/ui/charmapcontrol \ diff --git a/sfx2/sdi/docslots.sdi b/sfx2/sdi/docslots.sdi index 5b878b8ff051..082baef0f5d5 100644 --- a/sfx2/sdi/docslots.sdi +++ b/sfx2/sdi/docslots.sdi @@ -253,6 +253,11 @@ shell SfxObjectShell ExecMethod = ExecFile_Impl ; StateMethod = GetState_Impl ; ] + SID_AUTOREDACTDOC + [ + ExecMethod = ExecFile_Impl ; + StateMethod = GetState_Impl ; + ] SID_SIGNATURE [ ExecMethod = ExecFile_Impl; diff --git a/sfx2/sdi/sfx.sdi b/sfx2/sdi/sfx.sdi index 3d8cade70309..29bef29d5f74 100644 --- a/sfx2/sdi/sfx.sdi +++ b/sfx2/sdi/sfx.sdi @@ -4832,6 +4832,23 @@ SfxVoidItem RedactDoc SID_REDACTDOC GroupId = SfxGroupId::Document; ] +SfxVoidItem AutoRedactDoc SID_AUTOREDACTDOC +(SfxStringItem URL SID_FILE_NAME, SfxStringItem FilterName SID_FILTER_NAME) +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = TRUE, + Toggle = FALSE, + Container = TRUE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Document; +] + SfxImageItem ImageOrientation SID_IMAGE_ORIENTATION [ diff --git a/sfx2/source/appl/appuno.cxx b/sfx2/source/appl/appuno.cxx index f272a938775d..1528f231ca39 100644 --- a/sfx2/source/appl/appuno.cxx +++ b/sfx2/source/appl/appuno.cxx @@ -177,7 +177,8 @@ static bool isMediaDescriptor( sal_uInt16 nSlotId ) nSlotId == SID_SAVETO || nSlotId == SID_SAVEACOPY || nSlotId == SID_EXPORTDOCASPDF || nSlotId == SID_DIRECTEXPORTDOCASPDF || nSlotId == SID_EXPORTDOCASEPUB || nSlotId == SID_DIRECTEXPORTDOCASEPUB || - nSlotId == SID_REDACTDOC || nSlotId == SID_SAVEACOPYITEM); + nSlotId == SID_REDACTDOC || nSlotId == SID_AUTOREDACTDOC || + nSlotId == SID_SAVEACOPYITEM); } void TransformParameters( sal_uInt16 nSlotId, const uno::Sequence<beans::PropertyValue>& rArgs, SfxAllItemSet& rSet, const SfxSlot* pSlot ) @@ -1340,7 +1341,7 @@ void TransformItems( sal_uInt16 nSlotId, const SfxItemSet& rSet, uno::Sequence<b if ( nSlotId == SID_OPENDOC || nSlotId == SID_EXPORTDOC || nSlotId == SID_SAVEASDOC || nSlotId == SID_SAVEDOC || nSlotId == SID_SAVETO || nSlotId == SID_EXPORTDOCASPDF || nSlotId == SID_DIRECTEXPORTDOCASPDF || nSlotId == SID_EXPORTDOCASEPUB || nSlotId == SID_DIRECTEXPORTDOCASEPUB || - nSlotId == SID_REDACTDOC || nSlotId == SID_SAVEACOPY ) + nSlotId == SID_REDACTDOC || nSlotId == SID_AUTOREDACTDOC || nSlotId == SID_SAVEACOPY ) { const SfxPoolItem *pItem=nullptr; if ( rSet.GetItemState( SID_COMPONENTDATA, false, &pItem ) == SfxItemState::SET ) diff --git a/sfx2/source/doc/autoredactdialog.cxx b/sfx2/source/doc/autoredactdialog.cxx new file mode 100644 index 000000000000..0974a4f03b27 --- /dev/null +++ b/sfx2/source/doc/autoredactdialog.cxx @@ -0,0 +1,181 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * 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/. + */ + +#include <osl/file.hxx> +#include <sfx2/autoredactdialog.hxx> +#include <vcl/layout.hxx> +#include <vcl/idle.hxx> +#include <vcl/gdimtf.hxx> +#include <svl/itemset.hxx> +#include <svl/eitem.hxx> +#include <svtools/sfxecode.hxx> +#include <svtools/ehdl.hxx> +#include <tools/urlobj.hxx> +#include <tools/debug.hxx> + +#include <sfx2/strings.hrc> +#include <sfx2/sfxsids.hrc> +#include <sfx2/app.hxx> +#include <sfx2/objsh.hxx> +#include <sfx2/sfxresid.hxx> +#include <sfx2/docfile.hxx> +#include <preview.hxx> +#include <sfx2/printer.hxx> +#include <unotools/viewoptions.hxx> +#include <vcl/waitobj.hxx> +#include <vcl/weld.hxx> + +#include <sal/log.hxx> + +int TargetsTable::GetRowByTargetName(const OUString& sName) +{ + for (int i = 0, nCount = m_xControl->n_children(); i < nCount; ++i) + { + RedactionTarget* pTarget + = reinterpret_cast<RedactionTarget*>(m_xControl->get_id(i).toInt64()); + if (pTarget->sName == sName) + { + return i; + } + } + return -1; +} + +TargetsTable::TargetsTable(std::unique_ptr<weld::TreeView> xControl) + : m_xControl(std::move(xControl)) +{ + m_xControl->set_size_request(550, 250); + std::vector<int> aWidths; + aWidths.push_back(100); + aWidths.push_back(45); + aWidths.push_back(110); + aWidths.push_back(105); + aWidths.push_back(150); + m_xControl->set_column_fixed_widths(aWidths); + m_xControl->set_selection_mode(SelectionMode::Multiple); +} + +void TargetsTable::InsertTarget(RedactionTarget* pTarget) +{ + if (!pTarget) + { + SAL_WARN("sfx.doc", "pTarget is null in TargetsTable::InsertTarget()"); + return; + } + + // Check if the name is empty or invalid (clashing with another entry's name) + if (pTarget->sName.isEmpty() || GetRowByTargetName(pTarget->sName) != -1) + { + pTarget->sName = GetNameProposal(); + } + + // Add to the end + int nRow = m_xControl->n_children(); + m_xControl->append(OUString::number(reinterpret_cast<sal_Int64>(pTarget)), pTarget->sName); + m_xControl->set_text(nRow, pTarget->sType, 1); + m_xControl->set_text(nRow, pTarget->bCaseSensitive ? OUString("Yes") : OUString("No"), 2); + m_xControl->set_text(nRow, pTarget->bWholeWords ? OUString("Yes") : OUString("No"), 3); + m_xControl->set_text(nRow, pTarget->sDescription, 4); +} + +void TargetsTable::SelectByName(const OUString& sName) +{ + int nEntry = GetRowByTargetName(sName); + if (nEntry == -1) + return; + select(nEntry); +} + +RedactionTarget* TargetsTable::GetTargetByName(const OUString& sName) +{ + int nEntry = GetRowByTargetName(sName); + if (nEntry == -1) + return nullptr; + + return reinterpret_cast<RedactionTarget*>(m_xControl->get_id(nEntry).toInt64()); +} + +OUString TargetsTable::GetNameProposal() +{ + //TODO: Define a translatable string + OUString sDefaultTargetName("Target"); + sal_Int32 nHighestTargetId = 0; + for (int i = 0, nCount = m_xControl->n_children(); i < nCount; ++i) + { + RedactionTarget* pTarget + = reinterpret_cast<RedactionTarget*>(m_xControl->get_id(i).toInt64()); + const OUString& sName = pTarget->sName; + sal_Int32 nIndex = 0; + if (sName.getToken(0, ' ', nIndex) == sDefaultTargetName) + { + sal_Int32 nCurrTargetId = sName.getToken(0, ' ', nIndex).toInt32(); + nHighestTargetId = std::max<sal_Int32>(nHighestTargetId, nCurrTargetId); + } + } + return sDefaultTargetName + " " + OUString::number(nHighestTargetId + 1); +} + +SfxAutoRedactDialog::SfxAutoRedactDialog(weld::Window* pParent) + : SfxDialogController(pParent, "sfx/ui/autoredactdialog.ui", "AutoRedactDialog") + , m_xRedactionTargetsLabel(m_xBuilder->weld_label("labelRedactionTargets")) + , m_xTargetsBox(new TargetsTable(m_xBuilder->weld_tree_view("targets"))) + , m_xLoadBtn(m_xBuilder->weld_button("btnLoadTargets")) + , m_xSaveBtn(m_xBuilder->weld_button("btnSaveTargets")) + , m_xAddBtn(m_xBuilder->weld_button("add")) + , m_xEditBtn(m_xBuilder->weld_button("edit")) + , m_xDeleteBtn(m_xBuilder->weld_button("delete")) +{ + // Can be used to remmeber the last set of redaction targets? + OUString sExtraData; + SvtViewOptions aDlgOpt(EViewType::Dialog, + OStringToOUString(m_xDialog->get_help_id(), RTL_TEXTENCODING_UTF8)); + if (aDlgOpt.Exists()) + { + css::uno::Any aUserItem = aDlgOpt.GetUserItem("UserItem"); + aUserItem >>= sExtraData; + } + + // update the targets configuration if necessary + { + weld::WaitObject aWaitCursor(m_xDialog.get()); + //m_aTargets.Update(); + } + + // fill the targets box + /*const sal_uInt16 nCount = m_aTemplates.GetRegionCount(); + if (nCount) + { + for(sal_uInt16 i = 0; i < nCount; ++i) + m_xRegionLb->append_text(m_aTemplates.GetFullRegionName(i)); + m_xRegionLb->connect_changed(LINK(this, SfxNewFileDialog, RegionSelect)); + }*/ + + /*RedactionTarget* redactiontarget + = new RedactionTarget({ 0, "Target 1", "String", true, false, "Some description" }); + + m_xTargetsBox->InsertTarget(redactiontarget);*/ +} + +SfxAutoRedactDialog::~SfxAutoRedactDialog() +{ + // Store the view options + /*SvtViewOptions aDlgOpt(EViewType::Dialog, OStringToOUString(m_xDialog->get_help_id(), RTL_TEXTENCODING_UTF8)); + aDlgOpt.SetUserItem("UserItem", css::uno::makeAny(m_xMoreBt->get_expanded() ? OUString("Y") : OUString("N")));*/ +} + +bool SfxAutoRedactDialog::hasTargets() const +{ + //TODO: Add also some validity checks? + if (m_aTableTargets.empty()) + return false; + + return true; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/sfx2/source/doc/objserv.cxx b/sfx2/source/doc/objserv.cxx index 8df1c3e0fecf..feb8952f4c23 100644 --- a/sfx2/source/doc/objserv.cxx +++ b/sfx2/source/doc/objserv.cxx @@ -125,6 +125,8 @@ #include <svx/unoshape.hxx> #include <com/sun/star/util/Color.hpp> +#include <sfx2/autoredactdialog.hxx> + using namespace ::com::sun::star; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::uno; @@ -542,6 +544,22 @@ void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq) return; } + case SID_AUTOREDACTDOC: + { + //TODO: Implement + SfxAutoRedactDialog aDlg(pDialogParent); + sal_uInt16 nResult = aDlg.run(); + + if (nResult != RET_OK || !aDlg.hasTargets()) + { + //Do nothing + return; + } + + // else continue with normal redaction + [[fallthrough]]; + } + case SID_REDACTDOC: { css::uno::Reference<css::frame::XModel> xModel = GetModel(); @@ -1232,6 +1250,7 @@ void SfxObjectShell::GetState_Impl(SfxItemSet &rSet) case SID_EXPORTDOCASEPUB: case SID_DIRECTEXPORTDOCASEPUB: case SID_REDACTDOC: + case SID_AUTOREDACTDOC: { break; } diff --git a/sfx2/uiconfig/ui/autoredactdialog.ui b/sfx2/uiconfig/ui/autoredactdialog.ui new file mode 100644 index 000000000000..01c0dc6e9592 --- /dev/null +++ b/sfx2/uiconfig/ui/autoredactdialog.ui @@ -0,0 +1,339 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sfx"> + <requires lib="gtk+" version="3.18"/> + <object class="GtkTreeStore" id="liststore1"> + <columns> + <!-- column-name sTargetName --> + <column type="gchararray"/> + <!-- column-name sType --> + <column type="gchararray"/> + <!-- column-name bIsCaseSensitive --> + <column type="gchararray"/> + <!-- column-name bWholeWords --> + <column type="gchararray"/> + <!-- column-name sDescription --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gchararray"/> + </columns> + </object> + <object class="GtkDialog" id="AutoRedactDialog"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="insertbookmark|InsertBookmarkDialog">Automatic Redaction</property> + <property name="modal">True</property> + <property name="type_hint">dialog</property> + <child> + <placeholder/> + </child> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox"> + <property name="can_focus">False</property> + <child> + <object class="GtkButton" id="help"> + <property name="label">gtk-help</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + <property name="secondary">True</property> + </packing> + </child> + <child> + <object class="GtkButton" id="ok"> + <property name="label">gtk-ok</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_stock">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="cancel"> + <property name="label">gtk-cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkScrolledWindow"> + <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="GtkTreeView" id="targets"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="margin_right">5</property> + <property name="margin_bottom">5</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" id="Macro Library List-selection2"/> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn0"> + <property name="resizable">True</property> + <property name="spacing">6</property> + <property name="title" translatable="yes" context="autoredactdialog|target">Target Name</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="autoredactdialog|description">Type</property> + <child> + <object class="GtkCellRendererText" id="cellrenderer1"/> + <attributes> + <attribute name="text">1</attribute> + </attributes> + </child> + </object> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn2"> + <property name="resizable">True</property> + <property name="spacing">6</property> + <property name="title" translatable="yes" context="autoredactdialog|target">Case Sensitive</property> + <child> + <object class="GtkCellRendererText" id="cellrenderer2"/> + <attributes> + <attribute name="text">2</attribute> + </attributes> + </child> + </object> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn3"> + <property name="resizable">True</property> + <property name="spacing">6</property> + <property name="title" translatable="yes" context="autoredactdialog|target">Whole Words</property> + <child> + <object class="GtkCellRendererText" id="cellrenderer3"/> + <attributes> + <attribute name="text">3</attribute> + </attributes> + </child> + </object> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn4"> + <property name="resizable">True</property> + <property name="spacing">6</property> + <property name="title" translatable="yes" context="autoredactdialog|target">Description</property> + <child> + <object class="GtkCellRendererText" id="cellrenderer4"/> + <attributes> + <attribute name="text">4</attribute> + </attributes> + </child> + </object> + </child> + <accessibility> + <relation type="labelled-by" target="labelRedactionTargets"/> + </accessibility> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="labelRedactionTargets"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="valign">center</property> + <property name="margin_right">1</property> + <property name="margin_bottom">1</property> + <property name="label" translatable="yes" context="menuassignpage|contentslabel">_Redaction Targets</property> + <property name="use_underline">True</property> + <accessibility> + <relation type="label-for" target="targets"/> + </accessibility> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkButtonBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="layout_style">start</property> + <child> + <object class="GtkButton" id="btnLoadTargets"> + <property name="label" translatable="yes" context="autoredactdialog|btnLoadTargets">Load Targets</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="margin_bottom">3</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="btnSaveTargets"> + <property name="label" translatable="yes" context="autoredactdialog|btnSaveTargets">Save Targets</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="margin_top">3</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box2"> + <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="autoredactdialog|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="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="edit"> + <property name="label" translatable="yes" context="autoredactdialog|edit">Edit</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="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="delete"> + <property name="label" translatable="yes" context="autoredactdialog|delete">Delete</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="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">4</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="-11">help</action-widget> + <action-widget response="-5">ok</action-widget> + <action-widget response="-6">cancel</action-widget> + </action-widgets> + </object> + <object class="GtkSizeGroup" id="TargetButtons"> + <property name="mode">both</property> + <widgets> + <widget name="btnLoadTargets"/> + <widget name="btnSaveTargets"/> + </widgets> + </object> + <object class="GtkSizeGroup" id="otherbuttons"> + <widgets> + <widget name="add"/> + <widget name="edit"/> + <widget name="delete"/> + <widget name="ok"/> + <widget name="cancel"/> + <widget name="help"/> + </widgets> + </object> +</interface> diff --git a/solenv/sanitizers/ui/sfx.suppr b/solenv/sanitizers/ui/sfx.suppr index b049b23291ae..1eb1f4f1bcff 100644 --- a/solenv/sanitizers/ui/sfx.suppr +++ b/solenv/sanitizers/ui/sfx.suppr @@ -62,6 +62,8 @@ sfx2/uiconfig/ui/documentinfopage.ui://GtkLabel[@id='nameed'] orphan-label sfx2/uiconfig/ui/licensedialog.ui://GtkLabel[@id='label'] orphan-label sfx2/uiconfig/ui/loadtemplatedialog.ui://GtkLabel[@id='alttitle'] orphan-label sfx2/uiconfig/ui/loadtemplatedialog.ui://GtkDrawingArea[@id='image'] no-labelled-by +sfx2/uiconfig/ui/autoredactdialog.ui://GtkLabel[@id='alttitle'] orphan-label +sfx2/uiconfig/ui/autoredactdialog.ui://GtkDrawingArea[@id='image'] no-labelled-by sfx2/uiconfig/ui/managestylepage.ui://GtkLabel[@id='desc'] orphan-label sfx2/uiconfig/ui/newstyle.ui://GtkEntry[@id='entry'] no-labelled-by sfx2/uiconfig/ui/optprintpage.ui://GtkSpinButton[@id='reducegradstep'] no-labelled-by |