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 /sfx2 | |
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>
Diffstat (limited to 'sfx2')
-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 |
8 files changed, 566 insertions, 2 deletions
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> |