summaryrefslogtreecommitdiff
path: root/svx
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2017-09-19 15:37:04 +0200
committerTomaž Vajngerl <quikee@gmail.com>2017-09-21 09:49:12 +0200
commit71ee09947d5a71105d64fd225bb3672dfa7ce834 (patch)
tree81103520450ac1742f100dcc21526a1543cf74dc /svx
parentf22ad61038d5bf10dbe9f2ce0bdf0ef996be72f6 (diff)
TSCP: add advanced classification dialog
This adds a advanced classification dialog, which enables the user to manually construct a header/footer message from classification properties in cases where the user needs more control. All the text is inserted as fields into the end document and can be changed by changing the document properties. The simple classification still functions as it did before, which is what most users will want to use in this case. The BAF policy has been extended with new xml extension elements: - loext:Marking - loext:IntellectualPropertyPart - loext:IntellectualPropertyPartNumber They are used to fill the values in the advanced classification dialog. Change-Id: Ie2d638d69b8a9b0799cff9c2b785eb789f8af1d5 Reviewed-on: https://gerrit.libreoffice.org/42474 Reviewed-by: Tomaž Vajngerl <quikee@gmail.com> Tested-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'svx')
-rw-r--r--svx/Library_svx.mk2
-rw-r--r--svx/UIConfig_svx.mk1
-rw-r--r--svx/sdi/svx.sdi17
-rw-r--r--svx/source/dialog/ClassificationDialog.cxx263
-rw-r--r--svx/source/dialog/ClassificationEditView.cxx172
-rw-r--r--svx/uiconfig/ui/classificationdialog.ui321
6 files changed, 776 insertions, 0 deletions
diff --git a/svx/Library_svx.mk b/svx/Library_svx.mk
index b24478828ff2..c04dfc8e6dc4 100644
--- a/svx/Library_svx.mk
+++ b/svx/Library_svx.mk
@@ -117,6 +117,8 @@ $(eval $(call gb_Library_add_exception_objects,svx,\
svx/source/dialog/crashreportdlg \
svx/source/dialog/crashreportui) \
svx/source/dialog/ctredlin \
+ svx/source/dialog/ClassificationDialog \
+ svx/source/dialog/ClassificationEditView \
svx/source/dialog/databaseregistrationui \
svx/source/dialog/dialcontrol \
svx/source/dialog/dlgctl3d \
diff --git a/svx/UIConfig_svx.mk b/svx/UIConfig_svx.mk
index d836697afe8b..831e1d20a27c 100644
--- a/svx/UIConfig_svx.mk
+++ b/svx/UIConfig_svx.mk
@@ -21,6 +21,7 @@ $(eval $(call gb_UIConfig_add_uifiles,svx,\
svx/uiconfig/ui/cellmenu \
svx/uiconfig/ui/chineseconversiondialog \
svx/uiconfig/ui/chinesedictionary \
+ svx/uiconfig/ui/classificationdialog \
svx/uiconfig/ui/colorwindow \
svx/uiconfig/ui/colsmenu \
svx/uiconfig/ui/compressgraphicdialog \
diff --git a/svx/sdi/svx.sdi b/svx/sdi/svx.sdi
index ead2a6047ef3..e0f3e4d378b0 100644
--- a/svx/sdi/svx.sdi
+++ b/svx/sdi/svx.sdi
@@ -4373,6 +4373,23 @@ SfxVoidItem CompressGraphic SID_COMPRESS_GRAPHIC
GroupId = SfxGroupId::Modify;
]
+SfxVoidItem ClassificationDialog SID_CLASSIFICATION_DIALOG
+()
+[
+ AutoUpdate = TRUE,
+ FastCall = TRUE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+ Asynchron;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Document;
+]
SfxBoolItem Init3D SID_3D_INIT
diff --git a/svx/source/dialog/ClassificationDialog.cxx b/svx/source/dialog/ClassificationDialog.cxx
new file mode 100644
index 000000000000..e827ebc1d112
--- /dev/null
+++ b/svx/source/dialog/ClassificationDialog.cxx
@@ -0,0 +1,263 @@
+/* -*- 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/.
+ *
+ */
+
+#include <svx/ClassificationDialog.hxx>
+#include <editeng/flditem.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/section.hxx>
+#include <editeng/editobj.hxx>
+#include <svl/itemset.hxx>
+
+namespace svx {
+
+namespace {
+
+const SvxFieldItem* findField(editeng::Section const & rSection)
+{
+ for (SfxPoolItem const * pPool: rSection.maAttributes)
+ {
+ if (pPool->Which() == EE_FEATURE_FIELD)
+ return static_cast<const SvxFieldItem*>(pPool);
+ }
+ return nullptr;
+}
+
+} // end anonymous namespace
+
+ClassificationDialog::ClassificationDialog(vcl::Window* pParent)
+ : ModalDialog(pParent, "AdvancedDocumentClassificationDialog", "svx/ui/classificationdialog.ui")
+ , maHelper(SfxObjectShell::Current()->getDocProperties())
+ , maInternationalHelper(SfxObjectShell::Current()->getDocProperties(), /*bUseLocalizedPolicy*/ false)
+{
+ get(m_pEditWindow, "classificationEditWindow");
+ get(m_pBoldButton, "boldButton");
+ get(m_pClassificationListBox, "classificationCB");
+ get(m_pInternationalClassificationListBox, "internationalClassificationCB");
+ get(m_pMarkingListBox, "markingCB");
+ get(m_pIntellectualPropertyPartNumberListBox, "intellectualPropertyPartNumberCB");
+ get(m_pIntellectualPropertyPartListBox, "intellectualPropertyPartLB");
+ get(m_pIntellectualPropertyPartAddButton, "intellectualPropertyPartAddButton");
+ get(m_pIntellectualPropertyPartEdit, "intellectualPropertyPartEntry");
+
+ m_pBoldButton->SetClickHdl(LINK(this, ClassificationDialog, ButtonClicked));
+ m_pIntellectualPropertyPartAddButton->SetClickHdl(LINK(this, ClassificationDialog, ButtonClicked));
+
+ m_pClassificationListBox->SetSelectHdl(LINK(this, ClassificationDialog, SelectClassificationHdl));
+ for (const OUString& rName : maHelper.GetBACNames())
+ m_pClassificationListBox->InsertEntry(rName);
+ m_pClassificationListBox->EnableAutoSize(true);
+
+ m_pInternationalClassificationListBox->SetSelectHdl(LINK(this, ClassificationDialog, SelectClassificationHdl));
+ for (const OUString& rName : maInternationalHelper.GetBACNames())
+ m_pInternationalClassificationListBox->InsertEntry(rName);
+ m_pInternationalClassificationListBox->EnableAutoSize(true);
+
+ m_pMarkingListBox->SetSelectHdl(LINK(this, ClassificationDialog, SelectMarkingHdl));
+ for (const OUString& rName : maHelper.GetMarkings())
+ m_pMarkingListBox->InsertEntry(rName);
+ m_pMarkingListBox->EnableAutoSize(true);
+
+ m_pIntellectualPropertyPartNumberListBox->SetSelectHdl(LINK(this, ClassificationDialog, SelectIPPartNumbersHdl));
+ for (const OUString& rName : maHelper.GetIntellectualPropertyPartNumbers())
+ m_pIntellectualPropertyPartNumberListBox->InsertEntry(rName);
+ m_pIntellectualPropertyPartNumberListBox->EnableAutoSize(true);
+
+ m_pIntellectualPropertyPartListBox->SetDoubleClickHdl(LINK(this, ClassificationDialog, DoubleClickIPPartHdl));
+ for (const OUString& rName : maHelper.GetIntellectualPropertyParts())
+ m_pIntellectualPropertyPartListBox->InsertEntry(rName);
+ m_pIntellectualPropertyPartListBox->EnableAutoSize(true);
+}
+
+ClassificationDialog::~ClassificationDialog()
+{
+ disposeOnce();
+}
+
+void ClassificationDialog::dispose()
+{
+ m_pEditWindow.clear();
+ m_pBoldButton.clear();
+ m_pClassificationListBox.clear();
+ m_pInternationalClassificationListBox.clear();
+ m_pMarkingListBox.clear();
+ m_pIntellectualPropertyPartListBox.clear();
+ m_pIntellectualPropertyPartNumberListBox.clear();
+ m_pIntellectualPropertyPartAddButton.clear();
+ m_pIntellectualPropertyPartEdit.clear();
+
+ ModalDialog::dispose();
+}
+
+void ClassificationDialog::insertField(ClassificationType eType, OUString const & rString)
+{
+ ClassificationField aField(eType, rString);
+ m_pEditWindow->InsertField(SvxFieldItem(aField, EE_FEATURE_FIELD));
+}
+
+void ClassificationDialog::setupValues(std::vector<ClassificationResult> const & rInput)
+{
+ for (ClassificationResult const & rClassificationResult : rInput)
+ {
+ switch (rClassificationResult.meType)
+ {
+ case svx::ClassificationType::TEXT:
+ {
+ m_pEditWindow->pEdView->InsertText(rClassificationResult.msString);
+ }
+ break;
+
+ case svx::ClassificationType::CATEGORY:
+ {
+ m_pClassificationListBox->SelectEntry(rClassificationResult.msString);
+ m_pInternationalClassificationListBox->SelectEntryPos(m_pClassificationListBox->GetSelectEntryPos());
+ insertField(rClassificationResult.meType, rClassificationResult.msString);
+ }
+ break;
+
+ case svx::ClassificationType::MARKING:
+ {
+ m_pMarkingListBox->SelectEntry(rClassificationResult.msString);
+ insertField(rClassificationResult.meType, rClassificationResult.msString);
+ }
+ break;
+
+ case svx::ClassificationType::INTELLECTUAL_PROPERTY_PART:
+ {
+ insertField(rClassificationResult.meType, rClassificationResult.msString);
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+std::vector<ClassificationResult> ClassificationDialog::getResult()
+{
+ std::vector<ClassificationResult> aClassificationResults;
+
+ std::unique_ptr<EditTextObject> pEditText(m_pEditWindow->pEdEngine->CreateTextObject());
+
+ std::vector<editeng::Section> aSections;
+ pEditText->GetAllSections(aSections);
+
+ for (editeng::Section const & rSection : aSections)
+ {
+ const SvxFieldItem* pFieldItem = findField(rSection);
+
+ ESelection aSelection(rSection.mnParagraph, rSection.mnStart, rSection.mnParagraph, rSection.mnEnd);
+ OUString sString = m_pEditWindow->pEdEngine->GetText(aSelection);
+
+ if (pFieldItem)
+ {
+ const ClassificationField* pClassificationField = dynamic_cast<const ClassificationField*>(pFieldItem->GetField());
+ aClassificationResults.push_back({ pClassificationField->meType , sString, rSection.mnParagraph });
+ }
+ else
+ {
+ aClassificationResults.push_back({ ClassificationType::TEXT, sString, rSection.mnParagraph });
+ }
+ }
+ return aClassificationResults;
+}
+
+IMPL_LINK(ClassificationDialog, SelectClassificationHdl, ListBox&, rBox, void)
+{
+ sal_Int32 nSelected = rBox.GetSelectEntryPos();
+ if (nSelected >= 0)
+ {
+ std::unique_ptr<EditTextObject> pEditText(m_pEditWindow->pEdEngine->CreateTextObject());
+ std::vector<editeng::Section> aSections;
+ pEditText->GetAllSections(aSections);
+
+ for (editeng::Section const & rSection : aSections)
+ {
+ const SvxFieldItem* pFieldItem = findField(rSection);
+ if (pFieldItem)
+ {
+ const ClassificationField* pClassificationField = dynamic_cast<const ClassificationField*>(pFieldItem->GetField());
+ if (pClassificationField && pClassificationField->meType == ClassificationType::CATEGORY)
+ {
+ m_pEditWindow->pEdView->SetSelection(ESelection(rSection.mnParagraph, rSection.mnStart, rSection.mnParagraph, rSection.mnEnd));
+ }
+ }
+ }
+
+ OUString aString = maHelper.GetBACNames()[nSelected];
+ insertField(ClassificationType::CATEGORY, aString);
+
+ m_pInternationalClassificationListBox->SelectEntryPos(nSelected);
+ m_pClassificationListBox->SelectEntryPos(nSelected);
+ }
+}
+
+IMPL_LINK(ClassificationDialog, SelectMarkingHdl, ListBox&, rBox, void)
+{
+ sal_Int32 nSelected = rBox.GetSelectEntryPos();
+ if (nSelected >= 0)
+ {
+ std::unique_ptr<EditTextObject> pEditText(m_pEditWindow->pEdEngine->CreateTextObject());
+ std::vector<editeng::Section> aSections;
+ pEditText->GetAllSections(aSections);
+
+ for (editeng::Section const & rSection : aSections)
+ {
+ const SvxFieldItem* pFieldItem = findField(rSection);
+ if (pFieldItem)
+ {
+ const ClassificationField* pClassificationField = dynamic_cast<const ClassificationField*>(pFieldItem->GetField());
+ if (pClassificationField && pClassificationField->meType == ClassificationType::MARKING)
+ {
+ m_pEditWindow->pEdView->SetSelection(ESelection(rSection.mnParagraph, rSection.mnStart, rSection.mnParagraph, rSection.mnEnd));
+ }
+ }
+ }
+
+ OUString aString = maHelper.GetMarkings()[nSelected];
+ insertField(ClassificationType::MARKING, aString);
+ }
+}
+
+IMPL_LINK(ClassificationDialog, SelectIPPartNumbersHdl, ListBox&, rBox, void)
+{
+ sal_Int32 nSelected = rBox.GetSelectEntryPos();
+ if (nSelected >= 0)
+ {
+ OUString sString = maHelper.GetIntellectualPropertyPartNumbers()[nSelected];
+ m_pIntellectualPropertyPartEdit->SetText(m_pIntellectualPropertyPartEdit->GetText() + sString);
+ }
+}
+
+IMPL_LINK(ClassificationDialog, DoubleClickIPPartHdl, ListBox&, rBox, void)
+{
+ sal_Int32 nSelected = rBox.GetSelectEntryPos();
+ if (nSelected >= 0)
+ {
+ OUString sString = maHelper.GetIntellectualPropertyParts()[nSelected];
+ m_pIntellectualPropertyPartEdit->SetText(m_pIntellectualPropertyPartEdit->GetText() + sString);
+ }
+}
+
+IMPL_LINK(ClassificationDialog, ButtonClicked, Button*, pButton, void)
+{
+ if (pButton == m_pBoldButton)
+ {
+ m_pEditWindow->InvertSelectionWeight();
+ }
+ else if (pButton == m_pIntellectualPropertyPartAddButton)
+ {
+ insertField(ClassificationType::INTELLECTUAL_PROPERTY_PART, m_pIntellectualPropertyPartEdit->GetText());
+ }
+}
+
+} // end sfx2
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svx/source/dialog/ClassificationEditView.cxx b/svx/source/dialog/ClassificationEditView.cxx
new file mode 100644
index 000000000000..bfb0a159dccc
--- /dev/null
+++ b/svx/source/dialog/ClassificationEditView.cxx
@@ -0,0 +1,172 @@
+/* -*- 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/.
+ *
+ */
+
+#include <svx/ClassificationEditView.hxx>
+#include <svx/ClassificationField.hxx>
+
+#include <vcl/svapp.hxx>
+#include <vcl/settings.hxx>
+#include <svl/itemset.hxx>
+#include <editeng/wghtitem.hxx>
+#include <editeng/eeitem.hxx>
+
+extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL makeClassificationEditView(VclPtr<vcl::Window> & rRet, VclPtr<vcl::Window> & pParent, VclBuilder::stringmap &)
+{
+ rRet = VclPtr<svx::ClassificationEditView>::Create(pParent, WB_BORDER|WB_TABSTOP);
+}
+
+namespace svx {
+
+ClassificationEditEngine::ClassificationEditEngine(SfxItemPool* pItemPool)
+ : EditEngine(pItemPool)
+{}
+
+OUString ClassificationEditEngine::CalcFieldValue(const SvxFieldItem& rField, sal_Int32 /*nPara*/,
+ sal_Int32 /*nPos*/, Color*& /*rTxtColor*/, Color*& /*rFldColor*/)
+{
+ OUString aString;
+ const ClassificationField* pClassificationField = dynamic_cast<const ClassificationField*>(rField.GetField());
+ if (pClassificationField)
+ aString = pClassificationField->msDescription;
+ else
+ aString = "Unknown";
+ return aString;
+}
+
+ClassificationEditView::ClassificationEditView(vcl::Window* pParent, WinBits nBits)
+ : Control(pParent, nBits)
+{
+ EnableRTL(false);
+
+ const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
+ Color aBgColor = rStyleSettings.GetWindowColor();
+
+ SetMapMode(MapUnit::MapTwip);
+ SetPointer(PointerStyle::Text);
+ SetBackground(aBgColor);
+
+ Size aSize(GetOutputSize());
+ aSize.Height() *= 4;
+
+ pEdEngine.reset(new ClassificationEditEngine(EditEngine::CreatePool()));
+ pEdEngine->SetPaperSize( aSize );
+ pEdEngine->SetRefDevice( this );
+
+ pEdEngine->SetControlWord(pEdEngine->GetControlWord() | EEControlBits::MARKFIELDS);
+
+ pEdView.reset(new EditView(pEdEngine.get(), this));
+ pEdView->SetOutputArea(tools::Rectangle(Point(0,0), GetOutputSize()));
+
+ pEdView->SetBackgroundColor(aBgColor);
+ pEdEngine->InsertView(pEdView.get());
+}
+
+ClassificationEditView::~ClassificationEditView()
+{
+ disposeOnce();
+}
+
+void ClassificationEditView::Resize()
+{
+ Size aOutputSize(GetOutputSize());
+ Size aSize(aOutputSize);
+ aSize.Height() *= 4;
+ pEdEngine->SetPaperSize(aSize);
+ pEdView->SetOutputArea(tools::Rectangle(Point(0,0), aOutputSize));
+ Control::Resize();
+}
+
+void ClassificationEditView::InsertField(const SvxFieldItem& rFieldItem)
+{
+ pEdView->InsertField(rFieldItem);
+ pEdView->Invalidate();
+}
+
+void ClassificationEditView::InvertSelectionWeight()
+{
+ std::unique_ptr<SfxItemSet> pSet(new SfxItemSet(pEdEngine->GetAttribs(pEdView->GetSelection())));
+ FontWeight eFontWeight = WEIGHT_BOLD;
+ if (const SfxPoolItem* pItem = pSet->GetItem(EE_CHAR_WEIGHT, true))
+ {
+ const SvxWeightItem* pWeightItem = dynamic_cast<const SvxWeightItem*>(pItem);
+ if (pWeightItem && pWeightItem->GetWeight() == WEIGHT_BOLD)
+ eFontWeight = WEIGHT_NORMAL;
+ }
+
+ SvxWeightItem aWeight(eFontWeight, EE_CHAR_WEIGHT);
+ pSet->Put(aWeight);
+ pEdEngine->QuickSetAttribs(*pSet, pEdView->GetSelection());
+ pEdView->Invalidate();
+}
+
+void ClassificationEditView::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect)
+{
+ const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
+ Color aBgColor = rStyleSettings.GetWindowColor();
+
+ pEdView->SetBackgroundColor(aBgColor);
+
+ SetBackground(aBgColor);
+
+ Control::Paint(rRenderContext, rRect);
+
+ pEdView->Paint(rRect);
+
+ if (HasFocus())
+ pEdView->ShowCursor();
+}
+
+void ClassificationEditView::MouseMove(const MouseEvent& rMEvt)
+{
+ pEdView->MouseMove(rMEvt);
+}
+
+void ClassificationEditView::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ if (!HasFocus())
+ GrabFocus();
+
+ pEdView->MouseButtonDown(rMEvt);
+}
+
+void ClassificationEditView::MouseButtonUp(const MouseEvent& rMEvt)
+{
+ pEdView->MouseButtonUp(rMEvt);
+}
+
+void ClassificationEditView::KeyInput(const KeyEvent& rKEvt)
+{
+ sal_uInt16 nKey = rKEvt.GetKeyCode().GetModifier() + rKEvt.GetKeyCode().GetCode();
+
+ if (nKey == KEY_TAB || nKey == KEY_TAB + KEY_SHIFT)
+ {
+ Control::KeyInput( rKEvt );
+ }
+ else if (!pEdView->PostKeyEvent(rKEvt))
+ {
+ Control::KeyInput(rKEvt);
+ }
+}
+
+void ClassificationEditView::Command(const CommandEvent& rCEvt)
+{
+ pEdView->Command(rCEvt);
+}
+
+void ClassificationEditView::GetFocus()
+{
+ pEdView->ShowCursor();
+
+ Control::GetFocus();
+}
+
+} // end sfx2
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svx/uiconfig/ui/classificationdialog.ui b/svx/uiconfig/ui/classificationdialog.ui
new file mode 100644
index 000000000000..02d2afdb644b
--- /dev/null
+++ b/svx/uiconfig/ui/classificationdialog.ui
@@ -0,0 +1,321 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.0 -->
+<interface domain="sfx">
+ <requires lib="gtk+" version="3.0"/>
+ <requires lib="LibreOffice" version="1.0"/>
+ <object class="GtkDialog" id="AdvancedDocumentClassificationDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="classificationdialog|dialogname">Classification Dialog</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="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">0</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">1</property>
+ </packing>
+ </child>
+ <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">2</property>
+ <property name="secondary">True</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="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">12</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="svxlo-ClassificationEditView" id="classificationEditWindow">
+ <property name="width_request">400</property>
+ <property name="height_request">400</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="classificationdialog|label-Content">Content</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">12</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="classificationdialog|label-Classification">Classification:</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="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="classificationdialog|label-InternationalClassification">International Classification:</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="classificationCB">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="internationalClassificationCB">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="markingCB">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="classificationdialog|label-Marking">Marking:</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">end</property>
+ <property name="vexpand">True</property>
+ <property name="spacing">6</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkButton" id="boldButton">
+ <property name="label" context="classificationdialog|boldButton" translatable="yes">Bold</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">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="height">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkExpander">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkComboBoxText" id="intellectualPropertyPartNumberCB">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="active">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="classificationdialog|label-PartNumber">Part Number:</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="intellectualPropertyPartEntry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTreeView" id="intellectualPropertyPartLB">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection"/>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="height">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="intellectualPropertyPartAddButton">
+ <property name="label" translatable="yes" context="classificationdialog|intellectualPropertyPartAddButton">Add</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="classificationdialog|label-IntellectualProperty">Intellectual Property</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">ok</action-widget>
+ <action-widget response="0">cancel</action-widget>
+ <action-widget response="0">help</action-widget>
+ </action-widgets>
+ </object>
+</interface>