index d71c27d128a5c55e12a2221f61ab362c4bce049c..52d5f5148b540e3915a1bf1f5354ca2764dad108 100644 (file)
#include <gtkmm/label.h>
#include <gtkmm/frame.h>
#include <gtkmm/table.h>
+#include <gtkmm/tooltips.h>
#include "inkscape.h"
#include "extension/implementation/implementation.h"
#include "db.h"
#include "dependency.h"
#include "timer.h"
-#include "parameter.h"
+#include "param/parameter.h"
namespace Inkscape {
namespace Extension {
/* TODO: Handle what happens if we don't have these two */
while (child_repr != NULL) {
char const * chname = child_repr->name();
+ if (!strncmp(chname, INKSCAPE_EXTENSION_NS_NC, strlen(INKSCAPE_EXTENSION_NS_NC))) {
+ chname += strlen(INKSCAPE_EXTENSION_NS);
+ }
if (chname[0] == '_') /* Allow _ for translation of tags */
chname++;
if (!strcmp(chname, "id")) {
@@ -90,22 +94,22 @@ Extension::Extension (Inkscape::XML::Node * in_repr, Implementation::Implementat
if (!strcmp(chname, "help")) {
_help = g_strdup (sp_repr_children(child_repr)->content());
} /* name */
- if (!strcmp(chname, "param")) {
- Parameter * param;
- param = Parameter::make(child_repr, this);
- if (param != NULL)
- parameters = g_slist_append(parameters, param);
- } /* param */
+ if (!strcmp(chname, "param") || !strcmp(chname, "_param")) {
+ Parameter * param;
+ param = Parameter::make(child_repr, this);
+ if (param != NULL)
+ parameters = g_slist_append(parameters, param);
+ } /* param || _param */
if (!strcmp(chname, "dependency")) {
_deps.push_back(new Dependency(child_repr));
- } /* param */
+ } /* dependency */
child_repr = sp_repr_next(child_repr);
}
db.register_ext (this);
}
// printf("%s\n", name);
- timer = NULL;
+ timer = NULL;
return;
}
@@ -121,20 +125,28 @@ Extension::Extension (Inkscape::XML::Node * in_repr, Implementation::Implementat
*/
Extension::~Extension (void)
{
-// printf("Extension Destructor: %s\n", name);
- set_state(STATE_UNLOADED);
- db.unregister_ext(this);
+// printf("Extension Destructor: %s\n", name);
+ set_state(STATE_UNLOADED);
+ db.unregister_ext(this);
Inkscape::GC::release(repr);
g_free(id);
g_free(name);
- delete timer;
- timer = NULL;
+ delete timer;
+ timer = NULL;
/** \todo Need to do parameters here */
-
- for (unsigned int i = 0 ; i < _deps.size(); i++) {
- delete _deps[i];
- }
- _deps.clear();
+
+ // delete parameters:
+ for (GSList * list = parameters; list != NULL; list = g_slist_next(list)) {
+ Parameter * param = reinterpret_cast<Parameter *>(list->data);
+ delete param;
+ }
+ g_slist_free(parameters);
+
+
+ for (unsigned int i = 0 ; i < _deps.size(); i++) {
+ delete _deps[i];
+ }
+ _deps.clear();
return;
}
void
Extension::set_state (state_t in_state)
{
- if (_state == STATE_DEACTIVATED) return;
+ if (_state == STATE_DEACTIVATED) return;
if (in_state != _state) {
/** \todo Need some more error checking here! */
- switch (in_state) {
- case STATE_LOADED:
- if (imp->load(this))
- _state = STATE_LOADED;
-
- if (timer != NULL) {
- delete timer;
- }
- timer = new ExpirationTimer(this);
-
- break;
- case STATE_UNLOADED:
- // std::cout << "Unloading: " << name << std::endl;
- imp->unload(this);
- _state = STATE_UNLOADED;
-
- if (timer != NULL) {
- delete timer;
- timer = NULL;
- }
- break;
- case STATE_DEACTIVATED:
- _state = STATE_DEACTIVATED;
-
- if (timer != NULL) {
- delete timer;
- timer = NULL;
- }
- break;
- default:
- break;
- }
+ switch (in_state) {
+ case STATE_LOADED:
+ if (imp->load(this))
+ _state = STATE_LOADED;
+
+ if (timer != NULL) {
+ delete timer;
+ }
+ timer = new ExpirationTimer(this);
+
+ break;
+ case STATE_UNLOADED:
+ // std::cout << "Unloading: " << name << std::endl;
+ imp->unload(this);
+ _state = STATE_UNLOADED;
+
+ if (timer != NULL) {
+ delete timer;
+ timer = NULL;
+ }
+ break;
+ case STATE_DEACTIVATED:
+ _state = STATE_DEACTIVATED;
+
+ if (timer != NULL) {
+ delete timer;
+ timer = NULL;
+ }
+ break;
+ default:
+ break;
+ }
}
return;
/**
\return A boolean saying whether the extension passed the checks
- \brief A function to check the validity of the extension
-
- This function chekcs to make sure that there is an id, a name, a
- repr and an implemenation for this extension. Then it checks all
- of the dependencies to see if they pass. Finally, it asks the
- implmentation to do a check of itself.
-
- On each check, if there is a failure, it will print a message to the
- error log for that failure. It is important to note that the function
- keeps executing if it finds an error, to try and get as many of them
- into the error log as possible. This should help people debug
- installations, and figure out what they need to get for the full
- functionality of Inkscape to be available.
+ \brief A function to check the validity of the extension
+
+ This function chekcs to make sure that there is an id, a name, a
+ repr and an implemenation for this extension. Then it checks all
+ of the dependencies to see if they pass. Finally, it asks the
+ implmentation to do a check of itself.
+
+ On each check, if there is a failure, it will print a message to the
+ error log for that failure. It is important to note that the function
+ keeps executing if it finds an error, to try and get as many of them
+ into the error log as possible. This should help people debug
+ installations, and figure out what they need to get for the full
+ functionality of Inkscape to be available.
*/
bool
Extension::check (void)
{
- bool retval = true;
-
- // static int i = 0;
- // std::cout << "Checking module[" << i++ << "]: " << name << std::endl;
-
- const char * inx_failure = _(" This is caused by an improper .inx file for this extension."
- " An improper .inx file could have been caused by a faulty installation of Inkscape.");
- if (id == NULL) {
- printFailure(Glib::ustring(_("an ID was not defined for it.")) + inx_failure);
- retval = false;
- }
- if (name == NULL) {
- printFailure(Glib::ustring(_("there was no name defined for it.")) + inx_failure);
- retval = false;
- }
- if (repr == NULL) {
- printFailure(Glib::ustring(_("the XML description of it got lost.")) + inx_failure);
- retval = false;
- }
- if (imp == NULL) {
- printFailure(Glib::ustring(_("no implementation was defined for the extension.")) + inx_failure);
- retval = false;
- }
-
- for (unsigned int i = 0 ; i < _deps.size(); i++) {
- if (_deps[i]->check() == FALSE) {
- // std::cout << "Failed: " << *(_deps[i]) << std::endl;
- printFailure(Glib::ustring(_("a dependency was not met.")));
- error_file << *_deps[i] << std::endl;
- retval = false;
- }
- }
-
- if (retval)
- return imp->check(this);
- return retval;
+ bool retval = true;
+
+ // static int i = 0;
+ // std::cout << "Checking module[" << i++ << "]: " << name << std::endl;
+
+ const char * inx_failure = _(" This is caused by an improper .inx file for this extension."
+ " An improper .inx file could have been caused by a faulty installation of Inkscape.");
+ if (id == NULL) {
+ printFailure(Glib::ustring(_("an ID was not defined for it.")) + inx_failure);
+ retval = false;
+ }
+ if (name == NULL) {
+ printFailure(Glib::ustring(_("there was no name defined for it.")) + inx_failure);
+ retval = false;
+ }
+ if (repr == NULL) {
+ printFailure(Glib::ustring(_("the XML description of it got lost.")) + inx_failure);
+ retval = false;
+ }
+ if (imp == NULL) {
+ printFailure(Glib::ustring(_("no implementation was defined for the extension.")) + inx_failure);
+ retval = false;
+ }
+
+ for (unsigned int i = 0 ; i < _deps.size(); i++) {
+ if (_deps[i]->check() == FALSE) {
+ // std::cout << "Failed: " << *(_deps[i]) << std::endl;
+ printFailure(Glib::ustring(_("a dependency was not met.")));
+ error_file << *_deps[i] << std::endl;
+ retval = false;
+ }
+ }
+
+ if (retval)
+ return imp->check(this);
+ return retval;
}
/** \brief A quick function to print out a standard start of extension
errors in the log.
- \param reason A string explaining why this failed
+ \param reason A string explaining why this failed
- Real simple, just put everything into \c error_file.
+ Real simple, just put everything into \c error_file.
*/
void
Extension::printFailure (Glib::ustring reason)
{
- error_file << _("Extension \"") << name << _("\" failed to load because ");
- error_file << reason;
- error_file << std::endl;
- return;
+ error_file << _("Extension \"") << name << _("\" failed to load because ");
+ error_file << reason.raw();
+ error_file << std::endl;
+ return;
}
/**
/**
\return None
- \brief This function diactivates the extension (which makes it
- unusable, but not deleted)
+ \brief This function diactivates the extension (which makes it
+ unusable, but not deleted)
This function is used to removed an extension from functioning, but
- not delete it completely. It sets the state to \c STATE_DEACTIVATED to
- mark to the world that it has been deactivated. It also removes
- the current implementation and replaces it with a standard one. This
- makes it so that we don't have to continually check if there is an
- implementation, but we are gauranteed to have a benign one.
-
- \warning It is important to note that there is no 'activate' function.
- Running this function is irreversable.
+ not delete it completely. It sets the state to \c STATE_DEACTIVATED to
+ mark to the world that it has been deactivated. It also removes
+ the current implementation and replaces it with a standard one. This
+ makes it so that we don't have to continually check if there is an
+ implementation, but we are gauranteed to have a benign one.
+
+ \warning It is important to note that there is no 'activate' function.
+ Running this function is irreversable.
*/
void
Extension::deactivate (void)
{
- set_state(STATE_DEACTIVATED);
+ set_state(STATE_DEACTIVATED);
- /* Removing the old implementation, and making this use the default. */
- /* This should save some memory */
- delete imp;
- imp = new Implementation::Implementation();
+ /* Removing the old implementation, and making this use the default. */
+ /* This should save some memory */
+ delete imp;
+ imp = new Implementation::Implementation();
- return;
+ return;
}
/**
\return Whether the extension has been deactivated
- \brief Find out the status of the extension
+ \brief Find out the status of the extension
*/
bool
Extension::deactivated (void)
{
- return get_state() == STATE_DEACTIVATED;
+ return get_state() == STATE_DEACTIVATED;
}
/**
\brief Gets a parameter identified by name with the string placed
in value. It isn't duplicated into the value string.
\param name The name of the parameter to get
- \param doc The document to look in for document specific parameters
+ \param doc The document to look in for document specific parameters
+ \param node The node to look in for a specific parameter
- Look up in the parameters list, then execute the function on that
- found parameter.
+ Look up in the parameters list, then execute the function on that
+ found parameter.
*/
const gchar *
-Extension::get_param_string (const gchar * name, const Inkscape::XML::Document * doc)
+Extension::get_param_string (const gchar * name, const SPDocument * doc, const Inkscape::XML::Node * node)
{
Parameter * param;
param = param_shared(name, parameters);
- return param->get_string(doc);
+ return param->get_string(doc, node);
+}
+
+const gchar *
+Extension::get_param_enum (const gchar * name, const SPDocument * doc, const Inkscape::XML::Node * node)
+{
+ Parameter* param = param_shared(name, parameters);
+ return param->get_enum(doc, node);
}
/**
@@ -423,18 +443,19 @@ Extension::get_param_string (const gchar * name, const Inkscape::XML::Document *
\brief Gets a parameter identified by name with the bool placed
in value.
\param name The name of the parameter to get
- \param doc The document to look in for document specific parameters
+ \param doc The document to look in for document specific parameters
+ \param node The node to look in for a specific parameter
- Look up in the parameters list, then execute the function on that
- found parameter.
+ Look up in the parameters list, then execute the function on that
+ found parameter.
*/
bool
-Extension::get_param_bool (const gchar * name, const Inkscape::XML::Document * doc)
+Extension::get_param_bool (const gchar * name, const SPDocument * doc, const Inkscape::XML::Node * node)
{
Parameter * param;
param = param_shared(name, parameters);
- return param->get_bool(doc);
+ return param->get_bool(doc, node);
}
/**
@@ -442,18 +463,19 @@ Extension::get_param_bool (const gchar * name, const Inkscape::XML::Document * d
\brief Gets a parameter identified by name with the integer placed
in value.
\param name The name of the parameter to get
- \param doc The document to look in for document specific parameters
+ \param doc The document to look in for document specific parameters
+ \param node The node to look in for a specific parameter
- Look up in the parameters list, then execute the function on that
- found parameter.
+ Look up in the parameters list, then execute the function on that
+ found parameter.
*/
int
-Extension::get_param_int (const gchar * name, const Inkscape::XML::Document * doc)
+Extension::get_param_int (const gchar * name, const SPDocument * doc, const Inkscape::XML::Node * node)
{
Parameter * param;
param = param_shared(name, parameters);
- return param->get_int(doc);
+ return param->get_int(doc, node);
}
/**
@@ -461,17 +483,36 @@ Extension::get_param_int (const gchar * name, const Inkscape::XML::Document * do
\brief Gets a parameter identified by name with the float placed
in value.
\param name The name of the parameter to get
- \param doc The document to look in for document specific parameters
+ \param doc The document to look in for document specific parameters
+ \param node The node to look in for a specific parameter
- Look up in the parameters list, then execute the function on that
- found parameter.
+ Look up in the parameters list, then execute the function on that
+ found parameter.
*/
float
-Extension::get_param_float (const gchar * name, const Inkscape::XML::Document * doc)
+Extension::get_param_float (const gchar * name, const SPDocument * doc, const Inkscape::XML::Node * node)
{
Parameter * param;
param = param_shared(name, parameters);
- return param->get_float(doc);
+ return param->get_float(doc, node);
+}
+
+/**
+ \return The string value for the parameter specified
+ \brief Gets a parameter identified by name with the float placed
+ in value.
+ \param name The name of the parameter to get
+ \param doc The document to look in for document specific parameters
+ \param node The node to look in for a specific parameter
+
+ Look up in the parameters list, then execute the function on that
+ found parameter.
+*/
+guint32
+Extension::get_param_color (const gchar * name, const SPDocument * doc, const Inkscape::XML::Node * node)
+{
+ Parameter* param = param_shared(name, parameters);
+ return param->get_color(doc, node);
}
/**
@@ -480,17 +521,18 @@ Extension::get_param_float (const gchar * name, const Inkscape::XML::Document *
in the parameter value.
\param name The name of the parameter to set
\param value The value to set the parameter to
- \param doc The document to look in for document specific parameters
+ \param doc The document to look in for document specific parameters
+ \param node The node to look in for a specific parameter
- Look up in the parameters list, then execute the function on that
- found parameter.
+ Look up in the parameters list, then execute the function on that
+ found parameter.
*/
bool
-Extension::set_param_bool (const gchar * name, bool value, Inkscape::XML::Document * doc)
+Extension::set_param_bool (const gchar * name, bool value, SPDocument * doc, Inkscape::XML::Node * node)
{
Parameter * param;
param = param_shared(name, parameters);
- return param->set_bool(value, doc);
+ return param->set_bool(value, doc, node);
}
/**
@@ -499,17 +541,18 @@ Extension::set_param_bool (const gchar * name, bool value, Inkscape::XML::Docume
in the parameter value.
\param name The name of the parameter to set
\param value The value to set the parameter to
- \param doc The document to look in for document specific parameters
+ \param doc The document to look in for document specific parameters
+ \param node The node to look in for a specific parameter
- Look up in the parameters list, then execute the function on that
- found parameter.
+ Look up in the parameters list, then execute the function on that
+ found parameter.
*/
int
-Extension::set_param_int (const gchar * name, int value, Inkscape::XML::Document * doc)
+Extension::set_param_int (const gchar * name, int value, SPDocument * doc, Inkscape::XML::Node * node)
{
Parameter * param;
param = param_shared(name, parameters);
- return param->set_int(value, doc);
+ return param->set_int(value, doc, node);
}
/**
@@ -518,17 +561,18 @@ Extension::set_param_int (const gchar * name, int value, Inkscape::XML::Document
in the parameter value.
\param name The name of the parameter to set
\param value The value to set the parameter to
- \param doc The document to look in for document specific parameters
+ \param doc The document to look in for document specific parameters
+ \param node The node to look in for a specific parameter
- Look up in the parameters list, then execute the function on that
- found parameter.
+ Look up in the parameters list, then execute the function on that
+ found parameter.
*/
float
-Extension::set_param_float (const gchar * name, float value, Inkscape::XML::Document * doc)
+Extension::set_param_float (const gchar * name, float value, SPDocument * doc, Inkscape::XML::Node * node)
{
Parameter * param;
param = param_shared(name, parameters);
- return param->set_float(value, doc);
+ return param->set_float(value, doc, node);
}
/**
@@ -537,94 +581,129 @@ Extension::set_param_float (const gchar * name, float value, Inkscape::XML::Docu
in the parameter value.
\param name The name of the parameter to set
\param value The value to set the parameter to
- \param doc The document to look in for document specific parameters
+ \param doc The document to look in for document specific parameters
+ \param node The node to look in for a specific parameter
- Look up in the parameters list, then execute the function on that
- found parameter.
+ Look up in the parameters list, then execute the function on that
+ found parameter.
*/
const gchar *
-Extension::set_param_string (const gchar * name, const gchar * value, Inkscape::XML::Document * doc)
+Extension::set_param_string (const gchar * name, const gchar * value, SPDocument * doc, Inkscape::XML::Node * node)
{
Parameter * param;
param = param_shared(name, parameters);
- return param->set_string(value, doc);
+ return param->set_string(value, doc, node);
+}
+
+/**
+ \return The passed in value
+ \brief Sets a parameter identified by name with the string
+ in the parameter value.
+ \param name The name of the parameter to set
+ \param value The value to set the parameter to
+ \param doc The document to look in for document specific parameters
+ \param node The node to look in for a specific parameter
+
+ Look up in the parameters list, then execute the function on that
+ found parameter.
+*/
+guint32
+Extension::set_param_color (const gchar * name, guint32 color, SPDocument * doc, Inkscape::XML::Node * node)
+{
+ Parameter* param = param_shared(name, parameters);
+ return param->set_color(color, doc, node);
}
/** \brief A function to open the error log file. */
void
Extension::error_file_open (void)
{
- gchar * ext_error_file = profile_path(EXTENSION_ERROR_LOG_FILENAME);
- gchar * filename = g_filename_from_utf8( ext_error_file, -1, NULL, NULL, NULL );
- error_file.open(filename);
- if (!error_file.is_open()) {
- g_warning(_("Could not create extension error log file '%s'"),
- filename);
- }
- g_free(filename);
- g_free(ext_error_file);
+ gchar * ext_error_file = profile_path(EXTENSION_ERROR_LOG_FILENAME);
+ gchar * filename = g_filename_from_utf8( ext_error_file, -1, NULL, NULL, NULL );
+ error_file.open(filename);
+ if (!error_file.is_open()) {
+ g_warning(_("Could not create extension error log file '%s'"),
+ filename);
+ }
+ g_free(filename);
+ g_free(ext_error_file);
};
/** \brief A function to close the error log file. */
void
Extension::error_file_close (void)
{
- error_file.close();
+ error_file.close();
+};
+
+/** \brief A widget to represent the inside of an AutoGUI widget */
+class AutoGUI : public Gtk::VBox {
+ Gtk::Tooltips _tooltips;
+public:
+ /** \brief Create an AutoGUI object */
+ AutoGUI (void) : Gtk::VBox() {};
+ /** \brief Adds a widget with a tool tip into the autogui
+ \param widg Widget to add
+ \param tooltip Tooltip for the widget
+
+ If there is no widget, nothing happens. Otherwise it is just
+ added into the VBox. If there is a tooltip (non-NULL) then it
+ is placed on the widget.
+ */
+ void addWidget (Gtk::Widget * widg, gchar const * tooltip) {
+ if (widg == NULL) return;
+ this->pack_start(*widg, true, true, 2);
+ if (tooltip != NULL) {
+ _tooltips.set_tip(*widg, Glib::ustring(tooltip));
+ }
+ return;
+ };
};
/** \brief A function to automatically generate a GUI using the parameters
- \return Generated widget
+ \return Generated widget
- This function just goes through each parameter, and calls it's 'get_widget'
- function to get each widget. Then, each of those is placed into
- a Gtk::VBox, which is then returned to the calling function.
+ This function just goes through each parameter, and calls it's 'get_widget'
+ function to get each widget. Then, each of those is placed into
+ a Gtk::VBox, which is then returned to the calling function.
- If there are no parameters, this function just returns NULL.
+ If there are no visible parameters, this function just returns NULL.
+ If all parameters are gui_visible = false NULL is returned as well.
*/
Gtk::Widget *
-Extension::autogui (void)
+Extension::autogui (SPDocument * doc, Inkscape::XML::Node * node, sigc::signal<void> * changeSignal)
{
- if (g_slist_length(parameters) == 0) return NULL;
-
- Gtk::VBox * vbox = new Gtk::VBox();
- vbox = new Gtk::VBox();
-
- for (GSList * list = parameters; list != NULL; list = g_slist_next(list)) {
- Parameter * param = reinterpret_cast<Parameter *>(list->data);
- Gtk::Widget * widg = param->get_widget();
- if (widg != NULL)
- vbox->pack_start(*widg, true, true);
- }
-
- vbox->show();
- return vbox;
+ if (param_visible_count() == 0) return NULL;
+
+ AutoGUI * agui = Gtk::manage(new AutoGUI());
+
+ //go through the list of parameters to see if there are any non-hidden ones
+ for (GSList * list = parameters; list != NULL; list = g_slist_next(list)) {
+ Parameter * param = reinterpret_cast<Parameter *>(list->data);
+ if (param->get_gui_hidden()) continue; //Ignore hidden parameters
+ Gtk::Widget * widg = param->get_widget(doc, node, changeSignal);
+ gchar const * tip = param->get_tooltip();
+ agui->addWidget(widg, tip);
+ }
+
+ agui->show();
+ return agui;
};
/**
- \brief A function to get the parameters in a string form
- \return A string with all the parameters as command line arguements
-
- I don't really like this function, but it works for now.
+ \brief A function to get the parameters in a string form
+ \return An array with all the parameters in it.
- \todo Do this better.
*/
-Glib::ustring *
-Extension::paramString (void)
+void
+Extension::paramListString (std::list <std::string> &retlist)
{
- Glib::ustring * param_string = new Glib::ustring("");
-
- for (GSList * list = parameters; list != NULL; list = g_slist_next(list)) {
- Parameter * param = reinterpret_cast<Parameter *>(list->data);
-
- *param_string += " --";
- *param_string += param->name();
- *param_string += "=";
- Glib::ustring * paramstr = param->string();
- *param_string += *paramstr;
- delete paramstr;
- }
+ for (GSList * list = parameters; list != NULL; list = g_slist_next(list)) {
+ Parameter * param = reinterpret_cast<Parameter *>(list->data);
+ param->string(retlist);
+ }
- return param_string;
+ return;
}
/* Extension editor dialog stuff */
Gtk::VBox * retval = Gtk::manage(new Gtk::VBox());
if (_help == NULL) {
- Gtk::Label * content = Gtk::manage(new Gtk::Label("Currently there is no help available for this Extension. Please look on the Inkscape website or ask on the mailing lists if you have questions regarding this extension."));
+ Gtk::Label * content = Gtk::manage(new Gtk::Label(_("Currently there is no help available for this Extension. Please look on the Inkscape website or ask on the mailing lists if you have questions regarding this extension.")));
retval->pack_start(*content, true, true, 5);
content->set_line_wrap(true);
content->show();
return retval;
}
+unsigned int Extension::param_visible_count ( )
+{
+ unsigned int _visible_count = 0;
+ for (GSList * list = parameters; list != NULL; list = g_slist_next(list)) {
+ Parameter * param = reinterpret_cast<Parameter *>(list->data);
+ if (!param->get_gui_hidden()) _visible_count++;
+ }
+ return _visible_count;
+}
+
} /* namespace Extension */
} /* namespace Inkscape */