1 #ifndef __INK_EXTENSION_H__
2 #define __INK_EXTENSION_H__
4 /** \file
5 * Frontend to certain, possibly pluggable, actions.
6 */
8 /*
9 * Authors:
10 * Ted Gould <ted@gould.cx>
11 *
12 * Copyright (C) 2002-2005 Authors
13 *
14 * Released under GNU GPL, read the file 'COPYING' for more information
15 */
17 #include <ostream>
18 #include <fstream>
19 #include <vector>
20 #include <gtkmm/widget.h>
21 #include <gtkmm/box.h>
22 #include <gtkmm/table.h>
23 #include <glibmm/ustring.h>
24 #include "xml/repr.h"
25 #include "document.h"
26 #include "extension/extension-forward.h"
28 /** The key that is used to identify that the I/O should be autodetected */
29 #define SP_MODULE_KEY_AUTODETECT "autodetect"
30 /** This is the key for the SVG input module */
31 #define SP_MODULE_KEY_INPUT_SVG "org.inkscape.input.svg"
32 #define SP_MODULE_KEY_INPUT_SVGZ "org.inkscape.input.svgz"
33 /** Specifies the input module that should be used if none are selected */
34 #define SP_MODULE_KEY_INPUT_DEFAULT SP_MODULE_KEY_AUTODETECT
35 /** The key for outputing standard W3C SVG */
36 #define SP_MODULE_KEY_OUTPUT_SVG "org.inkscape.output.svg.plain"
37 #define SP_MODULE_KEY_OUTPUT_SVGZ "org.inkscape.output.svgz.plain"
38 /** This is an output file that has SVG data with the Sodipodi namespace extensions */
39 #define SP_MODULE_KEY_OUTPUT_SVG_INKSCAPE "org.inkscape.output.svg.inkscape"
40 #define SP_MODULE_KEY_OUTPUT_SVGZ_INKSCAPE "org.inkscape.output.svgz.inkscape"
41 /** Which output module should be used? */
42 #define SP_MODULE_KEY_OUTPUT_DEFAULT SP_MODULE_KEY_AUTODETECT
44 /** Defines the key for Postscript printing */
45 #define SP_MODULE_KEY_PRINT_PS "org.inkscape.print.ps"
46 #define SP_MODULE_KEY_PRINT_CAIRO_PS "org.inkscape.print.ps.cairo"
47 /** Defines the key for PDF printing */
48 #define SP_MODULE_KEY_PRINT_PDF "org.inkscape.print.pdf"
49 #define SP_MODULE_KEY_PRINT_CAIRO_PDF "org.inkscape.print.pdf.cairo"
50 /** Defines the key for LaTeX printing */
51 #define SP_MODULE_KEY_PRINT_LATEX "org.inkscape.print.latex"
52 /** Defines the key for printing with GNOME Print */
53 #define SP_MODULE_KEY_PRINT_GNOME "org.inkscape.print.gnome"
54 /** Defines the key for printing under Win32 */
55 #define SP_MODULE_KEY_PRINT_WIN32 "org.inkscape.print.win32"
56 #ifdef WIN32
57 /** Defines the default printing to use */
58 #define SP_MODULE_KEY_PRINT_DEFAULT SP_MODULE_KEY_PRINT_WIN32
59 #else
60 #ifdef WITH_GNOME_PRINT
61 /** Defines the default printing to use */
62 #define SP_MODULE_KEY_PRINT_DEFAULT SP_MODULE_KEY_PRINT_GNOME
63 #else
64 /** Defines the default printing to use */
65 #define SP_MODULE_KEY_PRINT_DEFAULT SP_MODULE_KEY_PRINT_PS
66 #endif
67 #endif
69 /** Mime type for SVG */
70 #define MIME_SVG "image/svg+xml"
72 /** Name of the extension error file */
73 #define EXTENSION_ERROR_LOG_FILENAME "extension-errors.log"
75 namespace Inkscape {
76 namespace Extension {
78 /** The object that is the basis for the Extension system. This object
79 contains all of the information that all Extension have. The
80 individual items are detailed within. This is the interface that
81 those who want to _use_ the extensions system should use. This
82 is most likely to be those who are inside the Inkscape program. */
83 class Extension {
84 public:
85 /** An enumeration to identify if the Extension has been loaded or not. */
86 typedef enum {
87 STATE_LOADED, /**< The extension has been loaded successfully */
88 STATE_UNLOADED, /**< The extension has not been loaded */
89 STATE_DEACTIVATED /**< The extension is missing something which makes it unusable */
90 } state_t;
91 static std::vector<const gchar *> search_path; /**< A vector of paths to search for extensions */
93 private:
94 gchar *id; /**< The unique identifier for the Extension */
95 gchar *name; /**< A user friendly name for the Extension */
96 gchar *_help; /**< A string that contains a help text for the user */
97 state_t _state; /**< Which state the Extension is currently in */
98 std::vector<Dependency *> _deps; /**< Dependencies for this extension */
99 static std::ofstream error_file; /**< This is the place where errors get reported */
101 protected:
102 Inkscape::XML::Node *repr; /**< The XML description of the Extension */
103 Implementation::Implementation * imp; /**< An object that holds all the functions for making this work */
104 ExpirationTimer * timer; /**< Timeout to unload after a given time */
106 public:
107 Extension (Inkscape::XML::Node * in_repr,
108 Implementation::Implementation * in_imp);
109 virtual ~Extension (void);
111 void set_state (state_t in_state);
112 state_t get_state (void);
113 bool loaded (void);
114 virtual bool check (void);
115 Inkscape::XML::Node * get_repr (void);
116 gchar * get_id (void);
117 gchar * get_name (void);
118 /** \brief Gets the help string for this extension */
119 gchar const * get_help (void) { return _help; }
120 void deactivate (void);
121 bool deactivated (void);
122 void printFailure (Glib::ustring reason);
125 /* Parameter Stuff */
126 private:
127 GSList * parameters; /**< A table to store the parameters for this extension.
128 This only gets created if there are parameters in this
129 extension */
131 public:
132 /** An error class for when a parameter is called on a type it is not */
133 class param_wrong_type {};
135 /** An error class for when a parameter is looked for that just
136 * simply doesn't exist */
137 class param_not_exist {};
139 /** An error class for when a filename already exists, but the user
140 * doesn't want to overwrite it */
141 class no_overwrite {};
143 private:
144 void make_param (Inkscape::XML::Node * paramrepr);
145 #if 0
146 inline param_t * param_shared (const gchar * name,
147 GSList * list);
148 #endif
149 public:
150 bool get_param_bool (const gchar * name,
151 const SPDocument * doc = NULL,
152 const Inkscape::XML::Node * node = NULL);
153 int get_param_int (const gchar * name,
154 const SPDocument * doc = NULL,
155 const Inkscape::XML::Node * node = NULL);
156 float get_param_float (const gchar * name,
157 const SPDocument * doc = NULL,
158 const Inkscape::XML::Node * node = NULL);
159 const gchar * get_param_string (const gchar * name,
160 const SPDocument * doc = NULL,
161 const Inkscape::XML::Node * node = NULL);
162 bool set_param_bool (const gchar * name,
163 bool value,
164 SPDocument * doc = NULL,
165 Inkscape::XML::Node * node = NULL);
166 int set_param_int (const gchar * name,
167 int value,
168 SPDocument * doc = NULL,
169 Inkscape::XML::Node * node = NULL);
170 float set_param_float (const gchar * name,
171 float value,
172 SPDocument * doc = NULL,
173 Inkscape::XML::Node * node = NULL);
174 const gchar * set_param_string (const gchar * name,
175 const gchar * value,
176 SPDocument * doc = NULL,
177 Inkscape::XML::Node * node = NULL);
179 /* Error file handling */
180 public:
181 static void error_file_open (void);
182 static void error_file_close (void);
184 public:
185 Gtk::Widget * autogui (SPDocument * doc, Inkscape::XML::Node * node);
186 Glib::ustring * paramString (void);
188 /* Extension editor dialog stuff */
189 public:
190 Gtk::VBox * get_info_widget(void);
191 Gtk::VBox * get_help_widget(void);
192 Gtk::VBox * get_params_widget(void);
193 protected:
194 inline static void add_val(Glib::ustring labelstr, Glib::ustring valuestr, Gtk::Table * table, int * row);
196 };
200 /*
202 This is a prototype for how collections should work. Whoever gets
203 around to implementing this gets to decide what a 'folder' and an
204 'item' really is. That is the joy of implementing it, eh?
206 class Collection : public Extension {
208 public:
209 folder get_root (void);
210 int get_count (folder);
211 thumbnail get_thumbnail(item);
212 item[] get_items(folder);
213 folder[] get_folders(folder);
214 metadata get_metadata(item);
215 image get_image(item);
217 };
218 */
220 } /* namespace Extension */
221 } /* namespace Inkscape */
223 #endif /* __INK_EXTENSION_H__ */
225 /*
226 Local Variables:
227 mode:c++
228 c-file-style:"stroustrup"
229 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
230 indent-tabs-mode:nil
231 fill-column:99
232 End:
233 */
234 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :