Code

r16676@shi: ted | 2007-10-12 21:09:50 -0700
[inkscape.git] / src / extension / paramenum.cpp
index 85656343d8e30299d3243c80b4832369cc4d16f1..8d779d1c228c0905db1637c3bfcffe551ef51346 100644 (file)
-/** \file\r
- * extension parameter for enumerations. \r
- *\r
- * It uses a Gtk:ComboBoxText widget in the extension UI.\r
- */\r
-\r
-/*\r
- * Author:\r
- *   Johan Engelen <johan@shouraizou.nl>\r
- *\r
- * Copyright (C) 2006 Author\r
- *\r
- * Released under GNU GPL, read the file 'COPYING' for more information\r
- */\r
-\r
-#ifdef HAVE_CONFIG_H\r
-# include "config.h"\r
-#endif\r
-\r
-\r
-#include <gtkmm/box.h>\r
-#include <gtkmm/comboboxtext.h>\r
-#include <gtkmm/tooltips.h>\r
-#include <gtkmm/label.h>\r
-\r
-#include <glibmm/i18n.h>\r
-\r
-#include <xml/node.h>\r
-\r
-#include "extension.h"\r
-#include "prefs-utils.h"\r
-#include "document-private.h"\r
-#include "sp-object.h"\r
-\r
-#include "paramenum.h"\r
-\r
-/** \brief  The root directory in the preferences database for extension\r
-            related parameters. */\r
-#define PREF_DIR "extensions"\r
-\r
-namespace Inkscape {\r
-namespace Extension {\r
-\r
-ParamComboBox::ParamComboBox (const gchar * name, const gchar * guitext, const gchar * desc, const Parameter::_scope_t scope, Inkscape::Extension::Extension * ext, Inkscape::XML::Node * xml) :\r
-    Parameter(name, guitext, desc, scope, ext)\r
-{              \r
-    choices = NULL;\r
-    _value = NULL;\r
-    \r
-    // Read XML tree to add enumeration items:\r
-    // printf("Extension Constructor: ");\r
-    if (xml != NULL) {\r
-        Inkscape::XML::Node *child_repr = sp_repr_children(xml);\r
-        while (child_repr != NULL) {\r
-            char const * chname = child_repr->name();\r
-            if (!strcmp(chname, "item")) {\r
-                Glib::ustring * newitem = NULL;\r
-                const char * contents = sp_repr_children(child_repr)->content();\r
-                if (contents != NULL)\r
-                     newitem = new Glib::ustring(contents);\r
-                if (newitem != NULL) choices = g_slist_append(choices, newitem);\r
-            }\r
-            child_repr = sp_repr_next(child_repr);\r
-        }\r
-    }\r
-    \r
-    // Initialize _value with the default value from xml\r
-    // for simplicity : default to the contents of the first xml-child\r
-    const char * defaultval = NULL;\r
-    if (sp_repr_children(sp_repr_children(xml)) != NULL)\r
-        defaultval = sp_repr_children(sp_repr_children(xml))->content();\r
-    \r
-    gchar * pref_name = this->pref_name();\r
-    const gchar * paramval = prefs_get_string_attribute(PREF_DIR, pref_name);\r
-    g_free(pref_name);\r
-\r
-    if (paramval != NULL)\r
-        defaultval = paramval;\r
-    if (defaultval != NULL)\r
-        _value = g_strdup(defaultval);  // allocate space for _value\r
-        \r
-    return;\r
-}\r
-\r
-ParamComboBox::~ParamComboBox (void)\r
-{                  \r
-    //destroy choice strings\r
-    for (GSList * list = choices; list != NULL; list = g_slist_next(list)) {\r
-        Glib::ustring * text = reinterpret_cast<Glib::ustring *>(list->data);\r
-        delete text;\r
-    }\r
-    g_slist_free(choices);\r
-\r
-    g_free(_value);\r
-}\r
-\r
-\r
-/** \brief  A function to set the \c _value\r
-    \param  in   The value to set\r
-    \param  doc  A document that should be used to set the value.\r
-    \param  node The node where the value may be placed\r
-\r
-    This function sets ONLY the internal value, but it also sets the value\r
-    in the preferences structure.  To put it in the right place, \c PREF_DIR\r
-    and \c pref_name() are used.\r
-\r
-    To copy the data into _value the old memory must be free'd first.\r
-    It is important to note that \c g_free handles \c NULL just fine.  Then\r
-    the passed in value is duplicated using \c g_strdup().\r
-*/\r
-const gchar *\r
-ParamComboBox::set (const gchar * in, SPDocument * doc, Inkscape::XML::Node * node)\r
-{\r
-    if (in == NULL) return NULL; /* Can't have NULL string */\r
-\r
-    if (_value != NULL)\r
-        g_free(_value);\r
-    _value = g_strdup(in);\r
-\r
-    gchar * prefname = this->pref_name();\r
-    prefs_set_string_attribute(PREF_DIR, prefname, _value);\r
-    g_free(prefname);\r
-\r
-    return _value;\r
-}\r
-\r
-\r
-/**\r
-    \brief  A function to get the currentpage and the parameters in a string form\r
-    \return A string with the 'value' and all the parameters on all pages as command line arguments\r
-*/\r
-Glib::ustring *\r
-ParamComboBox::string (void)\r
-{\r
-    Glib::ustring * param_string = new Glib::ustring("");\r
-\r
-    *param_string += "\"";\r
-    *param_string += _value;\r
-    *param_string += "\"";\r
-\r
-    return param_string;\r
-}\r
-\r
-/** \brief  A special category of Gtk::Entry to handle string parameteres */\r
-class ParamComboBoxEntry : public Gtk::ComboBoxText {\r
-private:\r
-    ParamComboBox * _pref;\r
-    SPDocument * _doc;\r
-    Inkscape::XML::Node * _node;\r
-public:\r
-    /** \brief  Build a string preference for the given parameter\r
-        \param  pref  Where to get the string from, and where to put it\r
-                      when it changes.\r
-    */\r
-    ParamComboBoxEntry (ParamComboBox * pref, SPDocument * doc, Inkscape::XML::Node * node) :\r
-        Gtk::ComboBoxText(), _pref(pref), _doc(doc), _node(node) {\r
-        this->signal_changed().connect(sigc::mem_fun(this, &ParamComboBoxEntry::changed));\r
-    };\r
-    void changed (void);\r
-};\r
-\r
-/** \brief  Respond to the text box changing\r
-\r
-    This function responds to the box changing by grabbing the value\r
-    from the text box and putting it in the parameter.\r
-*/\r
-void\r
-ParamComboBoxEntry::changed (void)\r
-{\r
-    Glib::ustring data = this->get_active_text();\r
-    _pref->set(data.c_str(), _doc, _node);\r
-    return;\r
-}\r
-\r
-\r
-\r
-/**\r
-    \brief  Creates a combobox widget for an enumeration parameter\r
-*/\r
-Gtk::Widget *\r
-ParamComboBox::get_widget (SPDocument * doc, Inkscape::XML::Node * node)\r
-{\r
-    Gtk::HBox * hbox = Gtk::manage(new Gtk::HBox(false, 4));\r
-\r
-    Gtk::Label * label = Gtk::manage(new Gtk::Label(_(_text), Gtk::ALIGN_LEFT));\r
-    label->show();\r
-    hbox->pack_start(*label, false, false);\r
-\r
-    ParamComboBoxEntry * combo = Gtk::manage(new ParamComboBoxEntry(this, doc, node));\r
-    // add choice strings:         \r
-    for (GSList * list = choices; list != NULL; list = g_slist_next(list)) {\r
-        Glib::ustring * text = reinterpret_cast<Glib::ustring *>(list->data);\r
-        combo->append_text(*text);\r
-    }\r
-    combo->set_active_text(Glib::ustring(_value));\r
-\r
-    combo->show();\r
-    hbox->pack_start(*combo, true, true);\r
-\r
-    hbox->show();\r
-\r
-    return dynamic_cast<Gtk::Widget *>(hbox);\r
-}\r
-\r
-\r
-}  /* namespace Extension */\r
-}  /* namespace Inkscape */\r
-\r
-/*\r
-  Local Variables:\r
-  mode:c++\r
-  c-file-style:"stroustrup"\r
-  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))\r
-  indent-tabs-mode:nil\r
-  fill-column:99\r
-  End:\r
-*/\r
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :\r
+/** \file
+ * extension parameter for enumerations.
+ *
+ * It uses a Gtk:ComboBoxText widget in the extension UI.
+ */
+
+/*
+ * Author:
+ *   Johan Engelen <johan@shouraizou.nl>
+ *
+ * Copyright (C) 2006-2007 Johan Engelen
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+
+#include <gtkmm/box.h>
+#include <gtkmm/comboboxtext.h>
+#include <gtkmm/tooltips.h>
+#include <gtkmm/label.h>
+
+#include <glibmm/i18n.h>
+
+#include <xml/node.h>
+
+#include "extension.h"
+#include "prefs-utils.h"
+#include "document-private.h"
+#include "sp-object.h"
+
+#include "paramenum.h"
+
+/** \brief  The root directory in the preferences database for extension
+            related parameters. */
+#define PREF_DIR "extensions"
+
+namespace Inkscape {
+namespace Extension {
+
+/* For internal use only.
+     Note that value and guitext MUST be non-NULL. This is ensured by newing only at one location in the code where non-NULL checks are made. */
+class enumentry {
+public:
+    enumentry (Glib::ustring * val, Glib::ustring * text) {
+        value = val;
+        guitext = text;
+    }
+    ~enumentry() {
+        delete value;
+        delete guitext;
+    }
+
+    Glib::ustring * value;
+    Glib::ustring * guitext;
+};
+
+
+ParamComboBox::ParamComboBox (const gchar * name, const gchar * guitext, const gchar * desc, const Parameter::_scope_t scope, Inkscape::Extension::Extension * ext, Inkscape::XML::Node * xml) :
+    Parameter(name, guitext, desc, scope, ext)
+{
+    choices = NULL;
+    _value = NULL;
+
+    // Read XML tree to add enumeration items:
+    // printf("Extension Constructor: ");
+    if (xml != NULL) {
+        Inkscape::XML::Node *child_repr = sp_repr_children(xml);
+        while (child_repr != NULL) {
+            char const * chname = child_repr->name();
+            if (!strcmp(chname, "item")) {
+                Glib::ustring * newguitext = NULL;
+                Glib::ustring * newvalue = NULL;
+                const char * contents = sp_repr_children(child_repr)->content();
+                if (contents != NULL)
+                     newguitext = new Glib::ustring( _(contents) );
+                const char * val = child_repr->attribute("value");
+                if (val != NULL)
+                    newvalue = new Glib::ustring(val);
+                if ( (newguitext) && (newvalue) ) {
+                    choices = g_slist_append( choices, new enumentry(newvalue, newguitext) );
+                }
+            }
+            child_repr = sp_repr_next(child_repr);
+        }
+    }
+
+    // Initialize _value with the default value from xml
+    // for simplicity : default to the contents of the first xml-child
+    const char * defaultval = NULL;
+    if (sp_repr_children(sp_repr_children(xml)) != NULL)
+        defaultval = sp_repr_children(xml)->attribute("value");
+
+    gchar * pref_name = this->pref_name();
+    const gchar * paramval = prefs_get_string_attribute(PREF_DIR, pref_name);
+    g_free(pref_name);
+
+    if (paramval != NULL)
+        defaultval = paramval;
+    if (defaultval != NULL)
+        _value = g_strdup(defaultval);  // allocate space for _value
+
+    return;
+}
+
+ParamComboBox::~ParamComboBox (void)
+{
+    //destroy choice strings
+    for (GSList * list = choices; list != NULL; list = g_slist_next(list)) {
+        delete (reinterpret_cast<enumentry *>(list->data));
+    }
+    g_slist_free(choices);
+
+    g_free(_value);
+}
+
+
+/** \brief  A function to set the \c _value
+    \param  in   The value to set
+    \param  doc  A document that should be used to set the value.
+    \param  node The node where the value may be placed
+
+    This function sets ONLY the internal value, but it also sets the value
+    in the preferences structure.  To put it in the right place, \c PREF_DIR
+    and \c pref_name() are used.
+
+    To copy the data into _value the old memory must be free'd first.
+    It is important to note that \c g_free handles \c NULL just fine.  Then
+    the passed in value is duplicated using \c g_strdup().
+*/
+const gchar *
+ParamComboBox::set (const gchar * in, SPDocument * doc, Inkscape::XML::Node * node)
+{
+    if (in == NULL) return NULL; /* Can't have NULL string */
+
+    Glib::ustring * settext = NULL;
+    for (GSList * list = choices; list != NULL; list = g_slist_next(list)) {
+        enumentry * entr = reinterpret_cast<enumentry *>(list->data);
+        if ( !entr->guitext->compare(in) ) {
+            settext = entr->value;
+            break;  // break out of for loop
+        }
+    }
+    if (settext) {
+        if (_value != NULL) g_free(_value);
+        _value = g_strdup(settext->c_str());
+        gchar * prefname = this->pref_name();
+        prefs_set_string_attribute(PREF_DIR, prefname, _value);
+        g_free(prefname);
+    }
+
+    return _value;
+}
+
+void
+ParamComboBox::changed (void) {
+    
+}
+
+
+/**
+    \brief  A function to get the value of the parameter in string form
+    \return A string with the 'value' as command line argument
+*/
+Glib::ustring *
+ParamComboBox::string (void)
+{
+    Glib::ustring * param_string = new Glib::ustring("");
+    *param_string += _value;
+    return param_string;
+}
+
+
+
+
+/** \brief  A special category of Gtk::Entry to handle string parameteres */
+class ParamComboBoxEntry : public Gtk::ComboBoxText {
+private:
+    ParamComboBox * _pref;
+    SPDocument * _doc;
+    Inkscape::XML::Node * _node;
+    sigc::signal<void> * _changeSignal;
+public:
+    /** \brief  Build a string preference for the given parameter
+        \param  pref  Where to get the string from, and where to put it
+                      when it changes.
+    */
+    ParamComboBoxEntry (ParamComboBox * pref, SPDocument * doc, Inkscape::XML::Node * node, sigc::signal<void> * changeSignal) :
+        Gtk::ComboBoxText(), _pref(pref), _doc(doc), _node(node), _changeSignal(changeSignal) {
+        this->signal_changed().connect(sigc::mem_fun(this, &ParamComboBoxEntry::changed));
+    };
+    void changed (void);
+};
+
+/** \brief  Respond to the text box changing
+
+    This function responds to the box changing by grabbing the value
+    from the text box and putting it in the parameter.
+*/
+void
+ParamComboBoxEntry::changed (void)
+{
+    Glib::ustring data = this->get_active_text();
+    _pref->set(data.c_str(), _doc, _node);
+    if (_changeSignal != NULL) {
+        _changeSignal->emit();
+    }
+}
+
+/**
+    \brief  Creates a combobox widget for an enumeration parameter
+*/
+Gtk::Widget *
+ParamComboBox::get_widget (SPDocument * doc, Inkscape::XML::Node * node, sigc::signal<void> * changeSignal)
+{
+    Gtk::HBox * hbox = Gtk::manage(new Gtk::HBox(false, 4));
+
+    Gtk::Label * label = Gtk::manage(new Gtk::Label(_(_text), Gtk::ALIGN_LEFT));
+    label->show();
+    hbox->pack_start(*label, false, false);
+
+    ParamComboBoxEntry * combo = Gtk::manage(new ParamComboBoxEntry(this, doc, node, changeSignal));
+    // add choice strings:
+    Glib::ustring * settext = 0;
+    for (GSList * list = choices; list != NULL; list = g_slist_next(list)) {
+        enumentry * entr = reinterpret_cast<enumentry *>(list->data);
+        Glib::ustring * text = entr->guitext;
+        combo->append_text(*text);
+        if ( !entr->value->compare(_value) ) {
+            settext = entr->guitext;
+        }
+    }
+    if (settext) combo->set_active_text(*settext);
+
+    combo->show();
+    hbox->pack_start(*combo, true, true);
+
+    hbox->show();
+
+    return dynamic_cast<Gtk::Widget *>(hbox);
+}
+
+
+}  /* namespace Extension */
+}  /* namespace Inkscape */