Code

r16616@tres: ted | 2007-09-18 20:59:55 -0700
[inkscape.git] / src / extension / extension.h
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 /** Defines the default printing to use */
61 #define SP_MODULE_KEY_PRINT_DEFAULT  SP_MODULE_KEY_PRINT_PS
62 #endif
64 /** Mime type for SVG */
65 #define MIME_SVG "image/svg+xml"
67 /** Name of the extension error file */
68 #define EXTENSION_ERROR_LOG_FILENAME  "extension-errors.log"
70 namespace Inkscape {
71 namespace Extension {
73 /** The object that is the basis for the Extension system.  This object
74     contains all of the information that all Extension have.  The
75     individual items are detailed within. This is the interface that
76     those who want to _use_ the extensions system should use.  This
77     is most likely to be those who are inside the Inkscape program. */
78 class Extension {
79 public:
80     /** An enumeration to identify if the Extension has been loaded or not. */
81     typedef enum {
82         STATE_LOADED,      /**< The extension has been loaded successfully */
83         STATE_UNLOADED,    /**< The extension has not been loaded */
84         STATE_DEACTIVATED  /**< The extension is missing something which makes it unusable */
85     } state_t;
86     static std::vector<const gchar *> search_path; /**< A vector of paths to search for extensions */
88 private:
89     gchar     *id;                        /**< The unique identifier for the Extension */
90     gchar     *name;                      /**< A user friendly name for the Extension */
91     gchar     *_help;                     /**< A string that contains a help text for the user */
92     state_t    _state;                    /**< Which state the Extension is currently in */
93     std::vector<Dependency *>  _deps;     /**< Dependencies for this extension */
94     static std::ofstream error_file;      /**< This is the place where errors get reported */
96 protected:
97     Inkscape::XML::Node *repr;                         /**< The XML description of the Extension */
98     Implementation::Implementation * imp; /**< An object that holds all the functions for making this work */
99     ExpirationTimer * timer;              /**< Timeout to unload after a given time */
101 public:
102                   Extension    (Inkscape::XML::Node * in_repr,
103                                 Implementation::Implementation * in_imp);
104     virtual      ~Extension    (void);
106     void          set_state    (state_t in_state);
107     state_t       get_state    (void);
108     bool          loaded       (void);
109     virtual bool  check        (void);
110     Inkscape::XML::Node *      get_repr     (void);
111     gchar *       get_id       (void);
112     gchar *       get_name     (void);
113     /** \brief  Gets the help string for this extension */
114     gchar const * get_help     (void) { return _help; }
115     void          deactivate   (void);
116     bool          deactivated  (void);
117     void          printFailure (Glib::ustring reason);
118     Implementation::Implementation * get_imp (void) { return imp; };
120 /* Parameter Stuff */
121 private:
122     GSList * parameters; /**< A table to store the parameters for this extension.
123                               This only gets created if there are parameters in this
124                               extension */
126 public:
127     /** An error class for when a parameter is called on a type it is not */
128     class param_wrong_type {};
129     class param_not_color_param {};
130     class param_not_enum_param {};
131     class param_not_string_param {};
132     class param_not_float_param {};
133     class param_not_int_param {};
134     class param_not_bool_param {};
135     
136     /** An error class for when a parameter is looked for that just 
137      * simply doesn't exist */
138     class param_not_exist {};
139     
140     /** An error class for when a filename already exists, but the user 
141      * doesn't want to overwrite it */
142     class no_overwrite {};
144 private:
145     void             make_param       (Inkscape::XML::Node * paramrepr);
146 #if 0
147     inline param_t * param_shared     (const gchar * name,
148                                        GSList * list);
149 #endif
150 public:
151     bool             get_param_bool   (const gchar * name,
152                                        const SPDocument *   doc = NULL,
153                                        const Inkscape::XML::Node * node = NULL);
154     int              get_param_int    (const gchar * name,
155                                        const SPDocument *   doc = NULL,
156                                        const Inkscape::XML::Node * node = NULL);
157     float            get_param_float  (const gchar * name,
158                                        const SPDocument *   doc = NULL,
159                                        const Inkscape::XML::Node * node = NULL);
160     const gchar *    get_param_string (const gchar * name,
161                                        const SPDocument *   doc = NULL,
162                                        const Inkscape::XML::Node * node = NULL);
163     guint32          get_param_color  (const gchar * name,
164                                        const SPDocument *   doc = NULL,
165                                        const Inkscape::XML::Node * node = NULL);
166     const gchar *    get_param_enum   (const gchar * name,
167                                        const SPDocument *   doc = NULL,
168                                        const Inkscape::XML::Node * node = NULL);
169     bool             set_param_bool   (const gchar * name,
170                                        bool          value,
171                                        SPDocument *   doc = NULL,
172                                        Inkscape::XML::Node *       node = NULL);
173     int              set_param_int    (const gchar * name,
174                                        int           value,
175                                        SPDocument *   doc = NULL,
176                                        Inkscape::XML::Node *       node = NULL);
177     float            set_param_float  (const gchar * name,
178                                        float         value,
179                                        SPDocument *   doc = NULL,
180                                        Inkscape::XML::Node *       node = NULL);
181     const gchar *    set_param_string (const gchar * name,
182                                        const gchar * value,
183                                        SPDocument *   doc = NULL,
184                                        Inkscape::XML::Node *       node = NULL);
185     guint32          set_param_color  (const gchar * name,
186                                        guint32 color,
187                                        SPDocument *   doc = NULL,
188                                        Inkscape::XML::Node *       node = NULL);
190     /* Error file handling */
191 public:
192     static void      error_file_open  (void);
193     static void      error_file_close (void);
195 public:
196     Gtk::Widget *    autogui (SPDocument * doc, Inkscape::XML::Node * node, sigc::signal<void> * changeSignal = NULL);
197     void paramListString (std::list <std::string> & retlist);
199     /* Extension editor dialog stuff */
200 public:
201     Gtk::VBox *    get_info_widget(void);
202     Gtk::VBox *    get_help_widget(void);
203     Gtk::VBox *    get_params_widget(void);
204 protected:
205     inline static void add_val(Glib::ustring labelstr, Glib::ustring valuestr, Gtk::Table * table, int * row);
207 };
211 /*
213 This is a prototype for how collections should work.  Whoever gets
214 around to implementing this gets to decide what a 'folder' and an
215 'item' really is.  That is the joy of implementing it, eh?
217 class Collection : public Extension {
219 public:
220     folder  get_root (void);
221     int     get_count (folder);
222     thumbnail get_thumbnail(item);
223     item[]  get_items(folder);
224     folder[]  get_folders(folder);
225     metadata get_metadata(item);
226     image   get_image(item);
228 };
229 */
231 }  /* namespace Extension */
232 }  /* namespace Inkscape */
234 #endif /* __INK_EXTENSION_H__ */
236 /*
237   Local Variables:
238   mode:c++
239   c-file-style:"stroustrup"
240   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
241   indent-tabs-mode:nil
242   fill-column:99
243   End:
244 */
245 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :