summaryrefslogtreecommitdiffstats
path: root/src/ui/dialog/document-metadata.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/dialog/document-metadata.cpp')
-rw-r--r--src/ui/dialog/document-metadata.cpp223
1 files changed, 223 insertions, 0 deletions
diff --git a/src/ui/dialog/document-metadata.cpp b/src/ui/dialog/document-metadata.cpp
new file mode 100644
index 0000000..a4c2707
--- /dev/null
+++ b/src/ui/dialog/document-metadata.cpp
@@ -0,0 +1,223 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/**
+ * @file
+ * Document metadata dialog, Gtkmm-style.
+ */
+/* Authors:
+ * bulia byak <buliabyak@users.sf.net>
+ * Bryce W. Harrington <bryce@bryceharrington.org>
+ * Lauris Kaplinski <lauris@kaplinski.com>
+ * Jon Phillips <jon@rejon.org>
+ * Ralf Stephan <ralf@ark.in-berlin.de> (Gtkmm)
+ *
+ * Copyright (C) 2000 - 2006 Authors
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "document-metadata.h"
+#include "desktop.h"
+#include "rdf.h"
+#include "verbs.h"
+
+#include "object/sp-namedview.h"
+
+#include "ui/widget/entity-entry.h"
+#include "xml/node-event-vector.h"
+
+
+namespace Inkscape {
+namespace UI {
+namespace Dialog {
+
+#define SPACE_SIZE_X 15
+#define SPACE_SIZE_Y 15
+
+//===================================================
+
+//---------------------------------------------------
+
+static void on_repr_attr_changed (Inkscape::XML::Node *, gchar const *, gchar const *, gchar const *, bool, gpointer);
+
+static Inkscape::XML::NodeEventVector const _repr_events = {
+ nullptr, /* child_added */
+ nullptr, /* child_removed */
+ on_repr_attr_changed,
+ nullptr, /* content_changed */
+ nullptr /* order_changed */
+};
+
+
+DocumentMetadata &
+DocumentMetadata::getInstance()
+{
+ DocumentMetadata &instance = *new DocumentMetadata();
+ instance.init();
+ return instance;
+}
+
+
+DocumentMetadata::DocumentMetadata()
+ : UI::Widget::Panel("/dialogs/documentmetadata", SP_VERB_DIALOG_METADATA)
+{
+ hide();
+ _getContents()->set_spacing (4);
+ _getContents()->pack_start(_notebook, true, true);
+
+ _page_metadata1.set_border_width(4);
+ _page_metadata2.set_border_width(4);
+
+ _page_metadata1.set_column_spacing(2);
+ _page_metadata2.set_column_spacing(2);
+ _page_metadata1.set_row_spacing(2);
+ _page_metadata2.set_row_spacing(2);
+
+ _notebook.append_page(_page_metadata1, _("Metadata"));
+ _notebook.append_page(_page_metadata2, _("License"));
+
+ signalDocumentReplaced().connect(sigc::mem_fun(*this, &DocumentMetadata::_handleDocumentReplaced));
+ signalActivateDesktop().connect(sigc::mem_fun(*this, &DocumentMetadata::_handleActivateDesktop));
+ signalDeactiveDesktop().connect(sigc::mem_fun(*this, &DocumentMetadata::_handleDeactivateDesktop));
+
+ build_metadata();
+}
+
+void
+DocumentMetadata::init()
+{
+ update();
+
+ Inkscape::XML::Node *repr = getDesktop()->getNamedView()->getRepr();
+ repr->addListener (&_repr_events, this);
+
+ show_all_children();
+}
+
+DocumentMetadata::~DocumentMetadata()
+{
+ Inkscape::XML::Node *repr = getDesktop()->getNamedView()->getRepr();
+ repr->removeListenerByData (this);
+
+ for (auto & it : _rdflist)
+ delete it;
+}
+
+// TODO: This duplicates code in document-properties.cpp
+void
+DocumentMetadata::build_metadata()
+{
+ using Inkscape::UI::Widget::EntityEntry;
+
+ _page_metadata1.show();
+
+ Gtk::Label *label = Gtk::manage (new Gtk::Label);
+ label->set_markup (_("<b>Dublin Core Entities</b>"));
+ label->set_halign(Gtk::ALIGN_START);
+ label->set_valign(Gtk::ALIGN_CENTER);
+
+ _page_metadata1.attach(*label, 0, 0, 2, 1);
+
+ /* add generic metadata entry areas */
+ struct rdf_work_entity_t * entity;
+ int row = 1;
+ for (entity = rdf_work_entities; entity && entity->name; entity++, row++) {
+ if ( entity->editable == RDF_EDIT_GENERIC ) {
+ EntityEntry *w = EntityEntry::create (entity, _wr);
+ _rdflist.push_back (w);
+
+ w->_label.set_halign(Gtk::ALIGN_START);
+ w->_label.set_valign(Gtk::ALIGN_CENTER);
+ _page_metadata1.attach(w->_label, 0, row, 1, 1);
+
+ w->_packable->set_hexpand();
+ w->_packable->set_valign(Gtk::ALIGN_CENTER);
+ _page_metadata1.attach(*w->_packable, 1, row, 1, 1);
+ }
+ }
+
+ _page_metadata2.show();
+
+ row = 0;
+ Gtk::Label *llabel = Gtk::manage (new Gtk::Label);
+ llabel->set_markup (_("<b>License</b>"));
+ llabel->set_halign(Gtk::ALIGN_START);
+ llabel->set_valign(Gtk::ALIGN_CENTER);
+ _page_metadata2.attach(*llabel, 0, row, 2, 1);
+
+ /* add license selector pull-down and URI */
+ ++row;
+ _licensor.init (_wr);
+
+ _licensor.set_hexpand();
+ _licensor.set_valign(Gtk::ALIGN_CENTER);
+ _page_metadata2.attach(_licensor, 1, row, 1, 1);
+}
+
+/**
+ * Update dialog widgets from desktop.
+ */
+void DocumentMetadata::update()
+{
+ if (_wr.isUpdating()) return;
+
+ _wr.setUpdating (true);
+ set_sensitive (true);
+
+ //-----------------------------------------------------------meta pages
+ /* update the RDF entities */
+ for (auto & it : _rdflist)
+ it->update (SP_ACTIVE_DOCUMENT);
+
+ _licensor.update (SP_ACTIVE_DOCUMENT);
+
+ _wr.setUpdating (false);
+}
+
+void
+DocumentMetadata::_handleDocumentReplaced(SPDesktop* desktop, SPDocument *)
+{
+ Inkscape::XML::Node *repr = desktop->getNamedView()->getRepr();
+ repr->addListener (&_repr_events, this);
+ update();
+}
+
+void
+DocumentMetadata::_handleActivateDesktop(SPDesktop *desktop)
+{
+ Inkscape::XML::Node *repr = desktop->getNamedView()->getRepr();
+ repr->addListener(&_repr_events, this);
+ update();
+}
+
+void
+DocumentMetadata::_handleDeactivateDesktop(SPDesktop *desktop)
+{
+ Inkscape::XML::Node *repr = desktop->getNamedView()->getRepr();
+ repr->removeListenerByData(this);
+}
+
+//--------------------------------------------------------------------
+
+/**
+ * Called when XML node attribute changed; updates dialog widgets.
+ */
+static void on_repr_attr_changed(Inkscape::XML::Node *, gchar const *, gchar const *, gchar const *, bool, gpointer data)
+{
+ if (DocumentMetadata *dialog = static_cast<DocumentMetadata *>(data))
+ dialog->update();
+}
+
+} // namespace Dialog
+} // namespace UI
+} // namespace Inkscape
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :