diff options
| author | Markus Engel <markus.engel@tum.de> | 2013-04-13 16:13:17 +0000 |
|---|---|---|
| committer | Markus Engel <markus.engel@tum.de> | 2013-04-13 16:13:17 +0000 |
| commit | fbdc8b84ff670c684dafc7d7d403ed01e7077e70 (patch) | |
| tree | 964a82e4e94d8d6602e90893ac51ac9e2f7ec362 | |
| parent | Made factory a template. (diff) | |
| download | inkscape-fbdc8b84ff670c684dafc7d7d403ed01e7077e70.tar.gz inkscape-fbdc8b84ff670c684dafc7d7d403ed01e7077e70.zip | |
Replaced casting macros for EventContext tree; added contructors.
(bzr r11608.1.96)
53 files changed, 526 insertions, 238 deletions
diff --git a/src/arc-context.cpp b/src/arc-context.cpp index cd9adece0..21fd41a49 100644 --- a/src/arc-context.cpp +++ b/src/arc-context.cpp @@ -60,6 +60,21 @@ static void sp_arc_drag(SPArcContext *ec, Geom::Point pt, guint state); static void sp_arc_finish(SPArcContext *ec); static void sp_arc_cancel(SPArcContext *ec); + +#include "sp-factory.h" + +namespace { + SPEventContext* createArcContext() { + return new SPArcContext(); + } + + bool arcContextRegistered = ToolFactory::instance().registerObject("/tools/shapes/arc", createArcContext); +} + +const std::string& CArcContext::getPrefsPath() { + return SPArcContext::prefsPath; +} + const std::string SPArcContext::prefsPath = "/tools/shapes/arc"; G_DEFINE_TYPE(SPArcContext, sp_arc_context, SP_TYPE_EVENT_CONTEXT); @@ -87,6 +102,7 @@ SPArcContext::SPArcContext() : SPEventContext() { arc_context->carccontext = new CArcContext(arc_context); delete arc_context->ceventcontext; arc_context->ceventcontext = arc_context->carccontext; + types.insert(typeid(SPArcContext)); arc_context->_message_context = 0; diff --git a/src/arc-context.h b/src/arc-context.h index 7ab4ee884..c7ff339f4 100644 --- a/src/arc-context.h +++ b/src/arc-context.h @@ -22,10 +22,12 @@ #include "event-context.h" #define SP_TYPE_ARC_CONTEXT (sp_arc_context_get_type()) -#define SP_ARC_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_ARC_CONTEXT, SPArcContext)) +//#define SP_ARC_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_ARC_CONTEXT, SPArcContext)) #define SP_ARC_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_ARC_CONTEXT, SPArcContextClass)) -#define SP_IS_ARC_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_ARC_CONTEXT)) +//#define SP_IS_ARC_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_ARC_CONTEXT)) #define SP_IS_ARC_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_ARC_CONTEXT)) +#define SP_ARC_CONTEXT(obj) ((SPArcContext*)obj) +#define SP_IS_ARC_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPArcContext))) class CArcContext; @@ -57,6 +59,7 @@ public: virtual gint root_handler(GdkEvent* event); virtual gint item_handler(SPItem* item, GdkEvent* event); + virtual const std::string& getPrefsPath(); private: SPArcContext* sparccontext; }; diff --git a/src/box3d-context.cpp b/src/box3d-context.cpp index a5b8c6e2f..5fee83bbb 100644 --- a/src/box3d-context.cpp +++ b/src/box3d-context.cpp @@ -64,6 +64,21 @@ static gint sp_box3d_context_item_handler(SPEventContext *event_context, SPItem static void sp_box3d_drag(Box3DContext &bc, guint state); static void sp_box3d_finish(Box3DContext *bc); + +#include "sp-factory.h" + +namespace { + SPEventContext* createBox3dContext() { + return new Box3DContext(); + } + + bool box3dContextRegistered = ToolFactory::instance().registerObject("/tools/shapes/3dbox", createBox3dContext); +} + +const std::string& CBox3DContext::getPrefsPath() { + return Box3DContext::prefsPath; +} + const std::string Box3DContext::prefsPath = "/tools/shapes/3dbox"; G_DEFINE_TYPE(Box3DContext, sp_box3d_context, SP_TYPE_EVENT_CONTEXT); @@ -91,6 +106,7 @@ Box3DContext::Box3DContext() : SPEventContext() { box3d_context->cbox3dcontext = new CBox3DContext(box3d_context); delete box3d_context->ceventcontext; box3d_context->ceventcontext = box3d_context->cbox3dcontext; + types.insert(typeid(Box3DContext)); box3d_context->_message_context = 0; diff --git a/src/box3d-context.h b/src/box3d-context.h index a724736be..98446f45c 100644 --- a/src/box3d-context.h +++ b/src/box3d-context.h @@ -22,10 +22,12 @@ #include "vanishing-point.h" #define SP_TYPE_BOX3D_CONTEXT (sp_box3d_context_get_type ()) -#define SP_BOX3D_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_BOX3D_CONTEXT, Box3DContext)) +//#define SP_BOX3D_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_BOX3D_CONTEXT, Box3DContext)) #define SP_BOX3D_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SP_TYPE_BOX3D_CONTEXT, Box3DContextClass)) -#define SP_IS_BOX3D_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_BOX3D_CONTEXT)) +//#define SP_IS_BOX3D_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_BOX3D_CONTEXT)) #define SP_IS_BOX3D_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SP_TYPE_BOX3D_CONTEXT)) +#define SP_BOX3D_CONTEXT(obj) ((Box3DContext*)obj) +#define SP_IS_BOX3D_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(Box3DContext))) class CBox3DContext; @@ -78,6 +80,7 @@ public: virtual gint root_handler(GdkEvent* event); virtual gint item_handler(SPItem* item, GdkEvent* event); + virtual const std::string& getPrefsPath(); private: Box3DContext* box3dcontext; }; diff --git a/src/common-context.cpp b/src/common-context.cpp index 1feb6ee95..fb0ddb720 100644 --- a/src/common-context.cpp +++ b/src/common-context.cpp @@ -47,9 +47,11 @@ CCommonContext::CCommonContext(SPCommonContext* commoncontext) : CEventContext(c SPCommonContext::SPCommonContext() : SPEventContext() { SPCommonContext* ctx = this; - ctx->ccommoncontext = new CCommonContext(ctx); - delete ctx->ceventcontext; - ctx->ceventcontext = ctx->ccommoncontext; + //ctx->ccommoncontext = new CCommonContext(ctx); + //delete ctx->ceventcontext; + //ctx->ceventcontext = ctx->ccommoncontext; + ctx->ccommoncontext = 0; + types.insert(typeid(SPCommonContext)); ctx->_message_context = 0; ctx->tremor = 0; diff --git a/src/common-context.h b/src/common-context.h index 8ed5ba1d3..d203f1f3c 100644 --- a/src/common-context.h +++ b/src/common-context.h @@ -24,10 +24,12 @@ #include <2geom/point.h> #define SP_TYPE_COMMON_CONTEXT (sp_common_context_get_type()) -#define SP_COMMON_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_COMMON_CONTEXT, SPCommonContext)) +//#define SP_COMMON_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_COMMON_CONTEXT, SPCommonContext)) #define SP_COMMON_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), SP_TYPE_COMMON_CONTEXT, SPCommonContextClass)) -#define SP_IS_COMMON_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_COMMON_CONTEXT)) +//#define SP_IS_COMMON_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_COMMON_CONTEXT)) #define SP_IS_COMMON_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), SP_TYPE_COMMON_CONTEXT)) +#define SP_COMMON_CONTEXT(obj) ((SPCommonContext*)obj) +#define SP_IS_COMMON_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPCommonContext))) #define SAMPLING_SIZE 8 /* fixme: ?? */ diff --git a/src/connector-context.cpp b/src/connector-context.cpp index 5c7bf97c8..d5a628d46 100644 --- a/src/connector-context.cpp +++ b/src/connector-context.cpp @@ -171,6 +171,21 @@ static Inkscape::XML::NodeEventVector layer_repr_events = { NULL /* order_changed */ }; + +#include "sp-factory.h" + +namespace { + SPEventContext* createConnectorContext() { + return new SPConnectorContext(); + } + + bool connectorContextRegistered = ToolFactory::instance().registerObject("/tools/connector", createConnectorContext); +} + +const std::string& CConnectorContext::getPrefsPath() { + return SPConnectorContext::prefsPath; +} + const std::string SPConnectorContext::prefsPath = "/tools/connector"; G_DEFINE_TYPE(SPConnectorContext, sp_connector_context, SP_TYPE_EVENT_CONTEXT); @@ -200,6 +215,7 @@ SPConnectorContext::SPConnectorContext() : SPEventContext() { cc->cconnectorcontext = new CConnectorContext(cc); delete cc->ceventcontext; cc->ceventcontext = cc->cconnectorcontext; + types.insert(typeid(SPConnectorContext)); cc->red_curve = 0; cc->isOrthogonal = false; diff --git a/src/connector-context.h b/src/connector-context.h index f74903d74..6e0655c1e 100644 --- a/src/connector-context.h +++ b/src/connector-context.h @@ -21,10 +21,12 @@ #include <glibmm/i18n.h> #define SP_TYPE_CONNECTOR_CONTEXT (sp_connector_context_get_type()) -#define SP_CONNECTOR_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_CONNECTOR_CONTEXT, SPConnectorContext)) +//#define SP_CONNECTOR_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_CONNECTOR_CONTEXT, SPConnectorContext)) #define SP_CONNECTOR_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), SP_TYPE_CONNECTOR_CONTEXT, SPConnectorContextClass)) -#define SP_IS_CONNECTOR_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_CONNECTOR_CONTEXT)) +//#define SP_IS_CONNECTOR_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_CONNECTOR_CONTEXT)) #define SP_IS_CONNECTOR_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), SP_TYPE_CONNECTOR_CONTEXT)) +#define SP_CONNECTOR_CONTEXT(obj) ((SPConnectorContext*)obj) +#define SP_IS_CONNECTOR_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPConnectorContext))) struct SPKnot; class SPCurve; @@ -114,6 +116,8 @@ public: virtual gint root_handler(GdkEvent* event); virtual gint item_handler(SPItem* item, GdkEvent* event); + virtual const std::string& getPrefsPath(); + private: SPConnectorContext* spconnectorcontext; }; diff --git a/src/desktop.cpp b/src/desktop.cpp index 626576c7f..17787e912 100644 --- a/src/desktop.cpp +++ b/src/desktop.cpp @@ -690,15 +690,15 @@ SPDesktop::change_document (SPDocument *theDocument) void SPDesktop::set_event_context (GType type, const gchar *config) { - SPEventContext *ec; + //SPEventContext *ec; //while (event_context) { - ec = event_context; - sp_event_context_deactivate (ec); + //ec = event_context; + sp_event_context_deactivate (event_context); // we have to keep event_context valid during destruction - otherwise writing // destructors is next to impossible // SPEventContext *next = ec->next; - sp_event_context_finish (ec); - g_object_unref (G_OBJECT (ec)); + sp_event_context_finish (event_context); + g_object_unref (G_OBJECT (event_context)); // event_context = next; //} @@ -707,20 +707,20 @@ SPDesktop::set_event_context (GType type, const gchar *config) // LP #622350. Cutting and undoing again in the node tool resets the event // context to the node tool. In this bug the line bellow invokes GDK_LEAVE_NOTIFY // events which cannot be handled and must be discarded. - ec = sp_event_context_new (type, this, config, SP_EVENT_CONTEXT_STATIC); + event_context = sp_event_context_new (type, this, config, SP_EVENT_CONTEXT_STATIC); // ec->next = event_context; - event_context = ec; + //event_context = ec; // Now the event_context has been set again and we can process all events again - sp_event_context_activate (ec); - _event_context_changed_signal.emit (this, ec); + sp_event_context_activate (event_context); + _event_context_changed_signal.emit (this, event_context); } /** * Push event context onto desktop's context stack. */ -void -SPDesktop::push_event_context (GType type, const gchar *config, unsigned int key) -{ +//void +//SPDesktop::push_event_context (GType type, const gchar *config, unsigned int key) +//{ // SPEventContext *ref, *ec; // // if (event_context && event_context->key == key) return; @@ -739,7 +739,7 @@ SPDesktop::push_event_context (GType type, const gchar *config, unsigned int key // event_context = ec; // sp_event_context_activate (ec); // _event_context_changed_signal.emit (this, ec); -} +//} /** * Sets the coordinate status to a given point diff --git a/src/draw-context.cpp b/src/draw-context.cpp index cdb0aeeaa..7e192f7ad 100644 --- a/src/draw-context.cpp +++ b/src/draw-context.cpp @@ -99,9 +99,11 @@ CDrawContext::CDrawContext(SPDrawContext* drawcontext) : CEventContext(drawconte SPDrawContext::SPDrawContext() : SPEventContext() { SPDrawContext* dc = this; - dc->cdrawcontext = new CDrawContext(dc); - delete dc->ceventcontext; - dc->ceventcontext = dc->cdrawcontext; + //dc->cdrawcontext = new CDrawContext(dc); + //delete dc->ceventcontext; + //dc->ceventcontext = dc->cdrawcontext; + dc->cdrawcontext = 0; + types.insert(typeid(SPDrawContext)); dc->selection = 0; dc->grab = 0; diff --git a/src/draw-context.h b/src/draw-context.h index f2024a952..25165eb27 100644 --- a/src/draw-context.h +++ b/src/draw-context.h @@ -24,10 +24,12 @@ G_BEGIN_DECLS /* Freehand context */ #define SP_TYPE_DRAW_CONTEXT (sp_draw_context_get_type()) -#define SP_DRAW_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_DRAW_CONTEXT, SPDrawContext)) +//#define SP_DRAW_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_DRAW_CONTEXT, SPDrawContext)) #define SP_DRAW_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), SP_TYPE_DRAW_CONTEXT, SPDrawContextClass)) -#define SP_IS_DRAW_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_DRAW_CONTEXT)) +//#define SP_IS_DRAW_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_DRAW_CONTEXT)) #define SP_IS_DRAW_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), SP_TYPE_DRAW_CONTEXT)) +#define SP_DRAW_CONTEXT(obj) ((SPDrawContext*)obj) +#define SP_IS_DRAW_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPDrawContext))) struct SPDrawAnchor; namespace Inkscape diff --git a/src/dropper-context.cpp b/src/dropper-context.cpp index c74950139..dbc10f6c7 100644 --- a/src/dropper-context.cpp +++ b/src/dropper-context.cpp @@ -78,6 +78,20 @@ static SPEventContextClass *parent_class; static GdkCursor *cursor_dropper_fill = NULL; static GdkCursor *cursor_dropper_stroke = NULL; +#include "sp-factory.h" + +namespace { + SPEventContext* createDropperContext() { + return new SPDropperContext(); + } + + bool dropperContextRegistered = ToolFactory::instance().registerObject("/tools/dropper", createDropperContext); +} + +const std::string& CDropperContext::getPrefsPath() { + return SPDropperContext::prefsPath; +} + const std::string SPDropperContext::prefsPath = "/tools/dropper"; G_DEFINE_TYPE(SPDropperContext, sp_dropper_context, SP_TYPE_EVENT_CONTEXT); @@ -107,6 +121,7 @@ SPDropperContext::SPDropperContext() : SPEventContext() { dc->cdroppercontext = new CDropperContext(dc); delete dc->ceventcontext; dc->ceventcontext = dc->cdroppercontext; + types.insert(typeid(SPDropperContext)); SPEventContext *event_context = SP_EVENT_CONTEXT(dc); event_context->cursor_shape = cursor_dropper_f_xpm; diff --git a/src/dropper-context.h b/src/dropper-context.h index c1fb7f37f..d5686bcc0 100644 --- a/src/dropper-context.h +++ b/src/dropper-context.h @@ -17,8 +17,11 @@ G_BEGIN_DECLS #define SP_TYPE_DROPPER_CONTEXT (sp_dropper_context_get_type ()) -#define SP_DROPPER_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_DROPPER_CONTEXT, SPDropperContext)) -#define SP_IS_DROPPER_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_DROPPER_CONTEXT)) +//#define SP_DROPPER_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_DROPPER_CONTEXT, SPDropperContext)) +//#define SP_IS_DROPPER_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_DROPPER_CONTEXT)) +#define SP_DROPPER_CONTEXT(obj) ((SPDropperContext*)obj) +#define SP_IS_DROPPER_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPDropperContext))) + enum { SP_DROPPER_PICK_VISIBLE, @@ -49,6 +52,8 @@ public: virtual void finish(); virtual gint root_handler(GdkEvent* event); + virtual const std::string& getPrefsPath(); + private: SPDropperContext* spdroppercontext; }; diff --git a/src/dyna-draw-context.cpp b/src/dyna-draw-context.cpp index 1bd9d8562..048053035 100644 --- a/src/dyna-draw-context.cpp +++ b/src/dyna-draw-context.cpp @@ -99,6 +99,22 @@ static Geom::Point sp_dyna_draw_get_npoint(SPDynaDrawContext const *ddc, Geom::P static Geom::Point sp_dyna_draw_get_vpoint(SPDynaDrawContext const *ddc, Geom::Point n); static void draw_temporary_box(SPDynaDrawContext *dc); + +#include "sp-factory.h" + +namespace { + SPEventContext* createCalligraphicContext() { + return new SPDynaDrawContext(); + } + + bool calligraphicContextRegistered = ToolFactory::instance().registerObject("/tools/calligraphic", createCalligraphicContext); +} + +const std::string& CDynaDrawContext::getPrefsPath() { + return SPDynaDrawContext::prefsPath; +} + + const std::string SPDynaDrawContext::prefsPath = "/tools/calligraphic"; G_DEFINE_TYPE(SPDynaDrawContext, sp_dyna_draw_context, SP_TYPE_COMMON_CONTEXT); @@ -127,6 +143,7 @@ SPDynaDrawContext::SPDynaDrawContext() : SPCommonContext() { delete ddc->ccommoncontext; ddc->ccommoncontext = ddc->cdynadrawcontext; ddc->ceventcontext = ddc->cdynadrawcontext; + types.insert(typeid(SPDynaDrawContext)); ddc->cursor_shape = cursor_calligraphy_xpm; ddc->hot_x = 4; diff --git a/src/dyna-draw-context.h b/src/dyna-draw-context.h index 1d6992f94..960d9f055 100644 --- a/src/dyna-draw-context.h +++ b/src/dyna-draw-context.h @@ -22,10 +22,13 @@ #include "splivarot.h" #define SP_TYPE_DYNA_DRAW_CONTEXT (sp_dyna_draw_context_get_type()) -#define SP_DYNA_DRAW_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_DYNA_DRAW_CONTEXT, SPDynaDrawContext)) +//#define SP_DYNA_DRAW_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_DYNA_DRAW_CONTEXT, SPDynaDrawContext)) #define SP_DYNA_DRAW_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), SP_TYPE_DYNA_DRAW_CONTEXT, SPDynaDrawContextClass)) -#define SP_IS_DYNA_DRAW_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_DYNA_DRAW_CONTEXT)) +//#define SP_IS_DYNA_DRAW_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_DYNA_DRAW_CONTEXT)) #define SP_IS_DYNA_DRAW_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), SP_TYPE_DYNA_DRAW_CONTEXT)) +#define SP_DYNA_DRAW_CONTEXT(obj) ((SPDynaDrawContext*)obj) +#define SP_IS_DYNA_DRAW_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPDynaDrawContext))) + #define DDC_MIN_PRESSURE 0.0 #define DDC_MAX_PRESSURE 1.0 @@ -72,6 +75,8 @@ public: virtual void set(Inkscape::Preferences::Entry* val); virtual gint root_handler(GdkEvent* event); + virtual const std::string& getPrefsPath(); + private: SPDynaDrawContext* spdynadrawcontext; }; diff --git a/src/eraser-context.cpp b/src/eraser-context.cpp index 00fb41004..cf6d8021d 100644 --- a/src/eraser-context.cpp +++ b/src/eraser-context.cpp @@ -101,6 +101,20 @@ static Geom::Point sp_eraser_get_npoint(SPEraserContext const *erc, Geom::Point static Geom::Point sp_eraser_get_vpoint(SPEraserContext const *erc, Geom::Point n); static void draw_temporary_box(SPEraserContext *dc); +#include "sp-factory.h" + +namespace { + SPEventContext* createEraserContext() { + return new SPEraserContext(); + } + + bool eraserContextRegistered = ToolFactory::instance().registerObject("/tools/eraser", createEraserContext); +} + +const std::string& CEraserContext::getPrefsPath() { + return SPEraserContext::prefsPath; +} + const std::string SPEraserContext::prefsPath = "/tools/eraser"; G_DEFINE_TYPE(SPEraserContext, sp_eraser_context, SP_TYPE_COMMON_CONTEXT); @@ -129,6 +143,7 @@ SPEraserContext::SPEraserContext() : SPCommonContext() { delete erc->ccommoncontext; erc->ccommoncontext = erc->cerasercontext; erc->ceventcontext = erc->cerasercontext; + types.insert(typeid(SPEraserContext)); erc->cursor_shape = cursor_eraser_xpm; erc->hot_x = 4; diff --git a/src/eraser-context.h b/src/eraser-context.h index dff4d2db5..0400fb5b5 100644 --- a/src/eraser-context.h +++ b/src/eraser-context.h @@ -24,10 +24,12 @@ G_BEGIN_DECLS #define SP_TYPE_ERASER_CONTEXT (sp_eraser_context_get_type()) -#define SP_ERASER_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_ERASER_CONTEXT, SPEraserContext)) +//#define SP_ERASER_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_ERASER_CONTEXT, SPEraserContext)) #define SP_ERASER_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), SP_TYPE_ERASER_CONTEXT, SPEraserContextClass)) -#define SP_IS_ERASER_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_ERASER_CONTEXT)) +//#define SP_IS_ERASER_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_ERASER_CONTEXT)) #define SP_IS_ERASER_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), SP_TYPE_ERASER_CONTEXT)) +#define SP_ERASER_CONTEXT(obj) ((SPEraserContext*)obj) +#define SP_IS_ERASER_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPEraserContext))) #define ERC_MIN_PRESSURE 0.0 #define ERC_MAX_PRESSURE 1.0 @@ -57,6 +59,8 @@ public: virtual void set(Inkscape::Preferences::Entry* val); virtual gint root_handler(GdkEvent* event); + virtual const std::string& getPrefsPath(); + private: SPEraserContext* sperasercontext; }; diff --git a/src/event-context.cpp b/src/event-context.cpp index b5677a5fc..3257a2a82 100644 --- a/src/event-context.cpp +++ b/src/event-context.cpp @@ -56,12 +56,6 @@ static void sp_event_context_dispose(GObject *object); -static void sp_event_context_private_setup(SPEventContext *ec); -static gint sp_event_context_private_root_handler( - SPEventContext *event_context, GdkEvent *event); -static gint sp_event_context_private_item_handler( - SPEventContext *event_context, SPItem *item, GdkEvent *event); - static void set_event_location(SPDesktop * desktop, GdkEvent * event); // globals for temporary switching to selector by space @@ -118,7 +112,10 @@ void CEventContext::finish() { SPEventContext::SPEventContext() { SPEventContext* event_context = this; - event_context->ceventcontext = new CEventContext(event_context); + event_context->ceventcontext = 0; + //event_context->ceventcontext = new CEventContext(event_context); + new (&types) std::set<TypeInfo>(); + types.insert(typeid(SPEventContext)); event_context->hot_y = 0; event_context->xp = 0; diff --git a/src/event-context.h b/src/event-context.h index 52d16666c..9f55fd8de 100644 --- a/src/event-context.h +++ b/src/event-context.h @@ -35,9 +35,12 @@ namespace Inkscape { #define SP_TYPE_EVENT_CONTEXT (sp_event_context_get_type()) -#define SP_EVENT_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_EVENT_CONTEXT, SPEventContext)) +//#define SP_EVENT_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_EVENT_CONTEXT, SPEventContext)) #define SP_EVENT_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SP_TYPE_EVENT_CONTEXT, SPEventContextClass)) -#define SP_IS_EVENT_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_EVENT_CONTEXT)) +//#define SP_IS_EVENT_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_EVENT_CONTEXT)) +#define SP_EVENT_CONTEXT(obj) ((SPEventContext*)obj) +#define SP_IS_EVENT_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPEventContext))) + GType sp_event_context_get_type(); @@ -92,6 +95,8 @@ void sp_event_context_snap_delay_handler(SPEventContext *ec, gpointer const dse_ class CEventContext; +#include <set> +#include "type-info.h" /** * Base class for Event processors. @@ -114,6 +119,7 @@ public: SPEventContext(); CEventContext* ceventcontext; + std::set<TypeInfo> types; /// Desktop eventcontext stack //SPEventContext *next; @@ -178,6 +184,7 @@ public: virtual gint root_handler(GdkEvent* event); virtual gint item_handler(SPItem* item, GdkEvent* event); + virtual const std::string& getPrefsPath() = 0; protected: SPEventContext* speventcontext; }; diff --git a/src/flood-context.cpp b/src/flood-context.cpp index fedd51a4b..333be207e 100644 --- a/src/flood-context.cpp +++ b/src/flood-context.cpp @@ -84,6 +84,20 @@ static gint sp_flood_context_item_handler(SPEventContext *event_context, SPItem static void sp_flood_finish(SPFloodContext *rc); +#include "sp-factory.h" + +namespace { + SPEventContext* createPaintbucketContext() { + return new SPFloodContext(); + } + + bool paintbucketContextRegistered = ToolFactory::instance().registerObject("/tools/paintbucket", createPaintbucketContext); +} + +const std::string& CFloodContext::getPrefsPath() { + return SPFloodContext::prefsPath; +} + const std::string SPFloodContext::prefsPath = "/tools/paintbucket"; G_DEFINE_TYPE(SPFloodContext, sp_flood_context, SP_TYPE_EVENT_CONTEXT); @@ -110,6 +124,7 @@ SPFloodContext::SPFloodContext() : SPEventContext() { flood_context->cfloodcontext = new CFloodContext(flood_context); delete flood_context->ceventcontext; flood_context->ceventcontext = flood_context->cfloodcontext; + types.insert(typeid(SPFloodContext)); flood_context->_message_context = 0; diff --git a/src/flood-context.h b/src/flood-context.h index a93c98c73..b2f82ff60 100644 --- a/src/flood-context.h +++ b/src/flood-context.h @@ -19,10 +19,13 @@ #include "helper/units.h" #define SP_TYPE_FLOOD_CONTEXT (sp_flood_context_get_type ()) -#define SP_FLOOD_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_FLOOD_CONTEXT, SPFloodContext)) +//#define SP_FLOOD_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_FLOOD_CONTEXT, SPFloodContext)) #define SP_FLOOD_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SP_TYPE_FLOOD_CONTEXT, SPFloodContextClass)) -#define SP_IS_FLOOD_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_FLOOD_CONTEXT)) +//#define SP_IS_FLOOD_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_FLOOD_CONTEXT)) #define SP_IS_FLOOD_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SP_TYPE_FLOOD_CONTEXT)) +#define SP_FLOOD_CONTEXT(obj) ((SPFloodContext*)obj) +#define SP_IS_FLOOD_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPFloodContext))) + #define FLOOD_COLOR_CHANNEL_R 1 #define FLOOD_COLOR_CHANNEL_G 2 @@ -57,6 +60,7 @@ public: virtual gint root_handler(GdkEvent* event); virtual gint item_handler(SPItem* item, GdkEvent* event); + virtual const std::string& getPrefsPath(); private: SPFloodContext* spfloodcontext; }; diff --git a/src/gradient-context.cpp b/src/gradient-context.cpp index 3d9fa9c3f..be35de29b 100644 --- a/src/gradient-context.cpp +++ b/src/gradient-context.cpp @@ -59,6 +59,21 @@ static gint sp_gradient_context_root_handler(SPEventContext *event_context, GdkE static void sp_gradient_drag(SPGradientContext &rc, Geom::Point const pt, guint state, guint32 etime); + +#include "sp-factory.h" + +namespace { + SPEventContext* createGradientContext() { + return new SPGradientContext(); + } + + bool gradientContextRegistered = ToolFactory::instance().registerObject("/tools/gradient", createGradientContext); +} + +const std::string& CGradientContext::getPrefsPath() { + return SPGradientContext::prefsPath; +} + const std::string SPGradientContext::prefsPath = "/tools/gradient"; G_DEFINE_TYPE(SPGradientContext, sp_gradient_context, SP_TYPE_EVENT_CONTEXT); @@ -84,6 +99,7 @@ SPGradientContext::SPGradientContext() : SPEventContext() { gr_context->cgradientcontext = new CGradientContext(gr_context); delete gr_context->ceventcontext; gr_context->ceventcontext = gr_context->cgradientcontext; + types.insert(typeid(SPGradientContext)); gr_context->node_added = false; gr_context->subselcon = 0; diff --git a/src/gradient-context.h b/src/gradient-context.h index c6bbdc491..b53f2da20 100644 --- a/src/gradient-context.h +++ b/src/gradient-context.h @@ -20,10 +20,12 @@ #include "event-context.h" #define SP_TYPE_GRADIENT_CONTEXT (sp_gradient_context_get_type()) -#define SP_GRADIENT_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_GRADIENT_CONTEXT, SPGradientContext)) +//#define SP_GRADIENT_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_GRADIENT_CONTEXT, SPGradientContext)) #define SP_GRADIENT_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_GRADIENT_CONTEXT, SPGradientContextClass)) -#define SP_IS_GRADIENT_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_GRADIENT_CONTEXT)) +//#define SP_IS_GRADIENT_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_GRADIENT_CONTEXT)) #define SP_IS_GRADIENT_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_GRADIENT_CONTEXT)) +#define SP_GRADIENT_CONTEXT(obj) ((SPGradientContext*)obj) +#define SP_IS_GRADIENT_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPGradientContext))) class CGradientContext; @@ -59,6 +61,7 @@ public: virtual void setup(); virtual gint root_handler(GdkEvent* event); + virtual const std::string& getPrefsPath(); private: SPGradientContext* spgradientcontext; }; diff --git a/src/lpe-tool-context.cpp b/src/lpe-tool-context.cpp index 93a548a8e..4ad20c878 100644 --- a/src/lpe-tool-context.cpp +++ b/src/lpe-tool-context.cpp @@ -64,6 +64,21 @@ SubtoolEntry lpesubtools[] = { {Inkscape::LivePathEffect::MIRROR_SYMMETRY, "draw-geometry-mirror"} }; + +#include "sp-factory.h" + +namespace { + SPEventContext* createLPEToolContext() { + return new SPLPEToolContext(); + } + + bool lpetoolContextRegistered = ToolFactory::instance().registerObject("/tools/lpetool", createLPEToolContext); +} + +const std::string& CLPEToolContext::getPrefsPath() { + return SPLPEToolContext::prefsPath; +} + const std::string SPLPEToolContext::prefsPath = "/tools/lpetool"; G_DEFINE_TYPE(SPLPEToolContext, sp_lpetool_context, SP_TYPE_PEN_CONTEXT); @@ -94,6 +109,7 @@ SPLPEToolContext::SPLPEToolContext() : SPPenContext() { lc->cpencontext = lc->clpetoolcontext; lc->cdrawcontext = lc->clpetoolcontext; lc->ceventcontext = lc->clpetoolcontext; + types.insert(typeid(SPLPEToolContext)); lc->mode = Inkscape::LivePathEffect::BEND_PATH; lc->shape_editor = 0; diff --git a/src/lpe-tool-context.h b/src/lpe-tool-context.h index c4b507f3d..bf6e6fa01 100644 --- a/src/lpe-tool-context.h +++ b/src/lpe-tool-context.h @@ -19,10 +19,12 @@ #include "helper/units.h" #define SP_TYPE_LPETOOL_CONTEXT (sp_lpetool_context_get_type()) -#define SP_LPETOOL_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_LPETOOL_CONTEXT, SPLPEToolContext)) +//#define SP_LPETOOL_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_LPETOOL_CONTEXT, SPLPEToolContext)) #define SP_LPETOOL_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), SP_TYPE_LPETOOL_CONTEXT, SPLPEToolContextClass)) -#define SP_IS_LPETOOL_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_LPETOOL_CONTEXT)) +//#define SP_IS_LPETOOL_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_LPETOOL_CONTEXT)) #define SP_IS_LPETOOL_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), SP_TYPE_LPETOOL_CONTEXT)) +#define SP_LPETOOL_CONTEXT(obj) ((SPLPEToolContext*)obj) +#define SP_IS_LPETOOL_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPLPEToolContext))) /* This is the list of subtools from which the toolbar of the LPETool is built automatically */ extern const int num_subtools; @@ -77,6 +79,7 @@ public: virtual gint root_handler(GdkEvent* event); virtual gint item_handler(SPItem* item, GdkEvent* event); + virtual const std::string& getPrefsPath(); private: SPLPEToolContext* splpetoolcontext; }; diff --git a/src/measure-context.cpp b/src/measure-context.cpp index f56239690..8012efc8b 100644 --- a/src/measure-context.cpp +++ b/src/measure-context.cpp @@ -64,6 +64,21 @@ boost::optional<Geom::Point> lastEnd; std::vector<Inkscape::Display::TemporaryItem*> measure_tmp_items; + +#include "sp-factory.h" + +namespace { + SPEventContext* createMeasureContext() { + return new SPMeasureContext(); + } + + bool measureContextRegistered = ToolFactory::instance().registerObject("/tools/measure", createMeasureContext); +} + +const std::string& CMeasureContext::getPrefsPath() { + return SPMeasureContext::prefsPath; +} + const std::string SPMeasureContext::prefsPath = "/tools/measure"; G_DEFINE_TYPE(SPMeasureContext, sp_measure_context, SP_TYPE_EVENT_CONTEXT); @@ -254,6 +269,7 @@ SPMeasureContext::SPMeasureContext() : SPEventContext() { measure_context->cmeasurecontext = new CMeasureContext(measure_context); delete measure_context->ceventcontext; measure_context->ceventcontext = measure_context->cmeasurecontext; + types.insert(typeid(SPMeasureContext)); measure_context->grabbed = 0; diff --git a/src/measure-context.h b/src/measure-context.h index 0fcee314d..218c42177 100644 --- a/src/measure-context.h +++ b/src/measure-context.h @@ -15,8 +15,11 @@ #include "event-context.h" #define SP_TYPE_MEASURE_CONTEXT (sp_measure_context_get_type()) -#define SP_MEASURE_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_MEASURE_CONTEXT, SPMeasureContext)) -#define SP_IS_MEASURE_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_MEASURE_CONTEXT)) +//#define SP_MEASURE_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_MEASURE_CONTEXT, SPMeasureContext)) +//#define SP_IS_MEASURE_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_MEASURE_CONTEXT)) +#define SP_MEASURE_CONTEXT(obj) ((SPMeasureContext*)obj) +#define SP_IS_MEASURE_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPMeasureContext))) + class CMeasureContext; @@ -44,6 +47,7 @@ public: virtual gint root_handler(GdkEvent* event); virtual gint item_handler(SPItem* item, GdkEvent* event); + virtual const std::string& getPrefsPath(); private: SPMeasureContext* spmeasurecontext; }; diff --git a/src/mesh-context.cpp b/src/mesh-context.cpp index ecfceae20..ac26a6d23 100644 --- a/src/mesh-context.cpp +++ b/src/mesh-context.cpp @@ -61,6 +61,21 @@ static gint sp_mesh_context_root_handler(SPEventContext *event_context, GdkEvent static void sp_mesh_drag(SPMeshContext &rc, Geom::Point const pt, guint state, guint32 etime); + +#include "sp-factory.h" + +namespace { + SPEventContext* createMeshContext() { + return new SPMeshContext(); + } + + bool meshContextRegistered = ToolFactory::instance().registerObject("/tools/mesh", createMeshContext); +} + +const std::string& CMeshContext::getPrefsPath() { + return SPMeshContext::prefsPath; +} + const std::string SPMeshContext::prefsPath = "/tools/mesh"; G_DEFINE_TYPE(SPMeshContext, sp_mesh_context, SP_TYPE_EVENT_CONTEXT); @@ -86,6 +101,7 @@ SPMeshContext::SPMeshContext() : SPEventContext() { gr_context->cmeshcontext = new CMeshContext(gr_context); delete gr_context->ceventcontext; gr_context->ceventcontext = gr_context->cmeshcontext; + types.insert(typeid(SPMeshContext)); gr_context->selcon = 0; gr_context->_message_context = 0; diff --git a/src/mesh-context.h b/src/mesh-context.h index 2d207e536..c20fdee6a 100644 --- a/src/mesh-context.h +++ b/src/mesh-context.h @@ -22,10 +22,12 @@ #include "event-context.h" #define SP_TYPE_MESH_CONTEXT (sp_mesh_context_get_type()) -#define SP_MESH_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_MESH_CONTEXT, SPMeshContext)) +//#define SP_MESH_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_MESH_CONTEXT, SPMeshContext)) #define SP_MESH_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_MESH_CONTEXT, SPMeshContextClass)) -#define SP_IS_MESH_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_MESH_CONTEXT)) +//#define SP_IS_MESH_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_MESH_CONTEXT)) #define SP_IS_MESH_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_MESH_CONTEXT)) +#define SP_MESH_CONTEXT(obj) ((SPMeshContext*)obj) +#define SP_IS_MESH_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPMeshContext))) class CMeshContext; @@ -61,6 +63,8 @@ public: virtual void setup(); virtual gint root_handler(GdkEvent* event); + virtual const std::string& getPrefsPath(); + private: SPMeshContext* spmeshcontext; }; diff --git a/src/pen-context.cpp b/src/pen-context.cpp index 180152642..7e85b46af 100644 --- a/src/pen-context.cpp +++ b/src/pen-context.cpp @@ -80,6 +80,21 @@ static void pen_set_to_nearest_horiz_vert(const SPPenContext *const pc, Geom::Po static int pen_last_paraxial_dir = 0; // last used direction in horizontal/vertical mode; 0 = horizontal, 1 = vertical + +#include "sp-factory.h" + +namespace { + SPEventContext* createPenContext() { + return new SPPenContext(); + } + + bool penContextRegistered = ToolFactory::instance().registerObject("/tools/freehand/pen", createPenContext); +} + +const std::string& CPenContext::getPrefsPath() { + return SPPenContext::prefsPath; +} + const std::string SPPenContext::prefsPath = "/tools/freehand/pen"; G_DEFINE_TYPE(SPPenContext, sp_pen_context, SP_TYPE_DRAW_CONTEXT); @@ -115,6 +130,7 @@ SPPenContext::SPPenContext() : SPDrawContext() { delete pc->cdrawcontext; pc->cdrawcontext = pc->cpencontext; pc->ceventcontext = pc->cpencontext; + types.insert(typeid(SPPenContext)); pc->polylines_only = false; pc->polylines_paraxial = false; diff --git a/src/pen-context.h b/src/pen-context.h index fc5378113..0a2e41af6 100644 --- a/src/pen-context.h +++ b/src/pen-context.h @@ -9,10 +9,12 @@ #include "live_effects/effect.h" #define SP_TYPE_PEN_CONTEXT (sp_pen_context_get_type()) -#define SP_PEN_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_PEN_CONTEXT, SPPenContext)) +//#define SP_PEN_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_PEN_CONTEXT, SPPenContext)) #define SP_PEN_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), SP_TYPE_PEN_CONTEXT, SPPenContextClass)) -#define SP_IS_PEN_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_PEN_CONTEXT)) +//#define SP_IS_PEN_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_PEN_CONTEXT)) #define SP_IS_PEN_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), SP_TYPE_PEN_CONTEXT)) +#define SP_PEN_CONTEXT(obj) ((SPPenContext*)obj) +#define SP_IS_PEN_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPPenContext))) enum { SP_PEN_CONTEXT_POINT, @@ -79,6 +81,8 @@ public: virtual gint root_handler(GdkEvent* event); virtual gint item_handler(SPItem* item, GdkEvent* event); + virtual const std::string& getPrefsPath(); + private: SPPenContext* sppencontext; }; diff --git a/src/pencil-context.cpp b/src/pencil-context.cpp index 0b3955a0c..3c2269bd2 100644 --- a/src/pencil-context.cpp +++ b/src/pencil-context.cpp @@ -68,6 +68,20 @@ static bool pencil_within_tolerance = false; static bool in_svg_plane(Geom::Point const &p) { return Geom::LInfty(p) < 1e18; } +#include "sp-factory.h" + +namespace { + SPEventContext* createPencilContext() { + return new SPPencilContext(); + } + + bool pencilContextRegistered = ToolFactory::instance().registerObject("/tools/freehand/pencil", createPencilContext); +} + +const std::string& CPencilContext::getPrefsPath() { + return SPPencilContext::prefsPath; +} + const std::string SPPencilContext::prefsPath = "/tools/freehand/pencil"; G_DEFINE_TYPE(SPPencilContext, sp_pencil_context, SP_TYPE_DRAW_CONTEXT); @@ -101,6 +115,7 @@ SPPencilContext::SPPencilContext() : SPDrawContext() { delete pc->cdrawcontext; pc->cdrawcontext = pc->cpencilcontext; pc->ceventcontext = pc->cpencilcontext; + types.insert(typeid(SPPencilContext)); pc->is_drawing = false; diff --git a/src/pencil-context.h b/src/pencil-context.h index 4174e38ae..b088a1b11 100644 --- a/src/pencil-context.h +++ b/src/pencil-context.h @@ -9,10 +9,12 @@ #define SP_TYPE_PENCIL_CONTEXT (sp_pencil_context_get_type()) -#define SP_PENCIL_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_PENCIL_CONTEXT, SPPencilContext)) +//#define SP_PENCIL_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_PENCIL_CONTEXT, SPPencilContext)) #define SP_PENCIL_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), SP_TYPE_PENCIL_CONTEXT, SPPencilContextClass)) -#define SP_IS_PENCIL_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_PENCIL_CONTEXT)) +//#define SP_IS_PENCIL_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_PENCIL_CONTEXT)) #define SP_IS_PENCIL_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), SP_TYPE_PENCIL_CONTEXT)) +#define SP_PENCIL_CONTEXT(obj) ((SPPencilContext*)obj) +#define SP_IS_PENCIL_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPPencilContext))) enum PencilState { SP_PENCIL_CONTEXT_IDLE, @@ -56,6 +58,8 @@ public: virtual void setup(); virtual gint root_handler(GdkEvent* event); + virtual const std::string& getPrefsPath(); + private: SPPencilContext* sppencilcontext; }; diff --git a/src/rect-context.cpp b/src/rect-context.cpp index b5149ea22..e0c0af2c9 100644 --- a/src/rect-context.cpp +++ b/src/rect-context.cpp @@ -47,6 +47,20 @@ using Inkscape::DocumentUndo; +#include "sp-factory.h" + +namespace { + SPEventContext* createRectContext() { + return new SPRectContext(); + } + + bool rectContextRegistered = ToolFactory::instance().registerObject("/tools/shapes/rect", createRectContext); +} + +const std::string& CRectContext::getPrefsPath() { + return SPRectContext::prefsPath; +} + //static const double goldenratio = 1.61803398874989484820; // golden ratio static void sp_rect_context_dispose(GObject *object); @@ -93,6 +107,7 @@ SPRectContext::SPRectContext() : SPEventContext() { rect_context->crectcontext = new CRectContext(rect_context); delete rect_context->ceventcontext; rect_context->ceventcontext = rect_context->crectcontext; + types.insert(typeid(SPRectContext)); rect_context->_message_context = 0; diff --git a/src/rect-context.h b/src/rect-context.h index b840e1b2c..41fa64b59 100644 --- a/src/rect-context.h +++ b/src/rect-context.h @@ -20,10 +20,12 @@ #include "event-context.h" #define SP_TYPE_RECT_CONTEXT (sp_rect_context_get_type ()) -#define SP_RECT_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_RECT_CONTEXT, SPRectContext)) +//#define SP_RECT_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_RECT_CONTEXT, SPRectContext)) #define SP_RECT_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SP_TYPE_RECT_CONTEXT, SPRectContextClass)) -#define SP_IS_RECT_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_RECT_CONTEXT)) +//#define SP_IS_RECT_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_RECT_CONTEXT)) #define SP_IS_RECT_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SP_TYPE_RECT_CONTEXT)) +#define SP_RECT_CONTEXT(obj) ((SPRectContext*)obj) +#define SP_IS_RECT_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPRectContext))) class CRectContext; @@ -59,6 +61,7 @@ public: virtual gint root_handler(GdkEvent* event); virtual gint item_handler(SPItem* item, GdkEvent* event); + virtual const std::string& getPrefsPath(); protected: SPRectContext* sprectcontext; }; diff --git a/src/select-context.cpp b/src/select-context.cpp index 7b811e16e..604b4c7cc 100644 --- a/src/select-context.cpp +++ b/src/select-context.cpp @@ -69,6 +69,21 @@ static gint xp = 0, yp = 0; // where drag started static gint tolerance = 0; static bool within_tolerance = false; + +#include "sp-factory.h" + +namespace { + SPEventContext* createSelectContext() { + return new SPSelectContext(); + } + + bool selectContextRegistered = ToolFactory::instance().registerObject("/tools/select", createSelectContext); +} + +const std::string& CSelectContext::getPrefsPath() { + return SPSelectContext::prefsPath; +} + const std::string SPSelectContext::prefsPath = "/tools/select"; G_DEFINE_TYPE(SPSelectContext, sp_select_context, SP_TYPE_EVENT_CONTEXT); @@ -97,6 +112,7 @@ SPSelectContext::SPSelectContext() : SPEventContext() { sc->cselectcontext = new CSelectContext(sc); delete sc->ceventcontext; sc->ceventcontext = sc->cselectcontext; + types.insert(typeid(SPSelectContext)); sc->grabbed = 0; sc->item = 0; diff --git a/src/select-context.h b/src/select-context.h index 791569bcd..705f1ad7d 100644 --- a/src/select-context.h +++ b/src/select-context.h @@ -16,10 +16,12 @@ #include <gtk/gtk.h> #define SP_TYPE_SELECT_CONTEXT (sp_select_context_get_type ()) -#define SP_SELECT_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_SELECT_CONTEXT, SPSelectContext)) +//#define SP_SELECT_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_SELECT_CONTEXT, SPSelectContext)) #define SP_SELECT_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SP_TYPE_SELECT_CONTEXT, SPSelectContextClass)) -#define SP_IS_SELECT_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_SELECT_CONTEXT)) +//#define SP_IS_SELECT_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_SELECT_CONTEXT)) #define SP_IS_SELECT_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SP_TYPE_SELECT_CONTEXT)) +#define SP_SELECT_CONTEXT(obj) ((SPSelectContext*)obj) +#define SP_IS_SELECT_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPSelectContext))) struct SPCanvasItem; @@ -69,6 +71,7 @@ public: virtual gint root_handler(GdkEvent* event); virtual gint item_handler(SPItem* item, GdkEvent* event); + virtual const std::string& getPrefsPath(); private: SPSelectContext* spselectcontext; }; diff --git a/src/sp-factory.h b/src/sp-factory.h index 111375415..7eed7b744 100644 --- a/src/sp-factory.h +++ b/src/sp-factory.h @@ -15,12 +15,8 @@ struct Singleton { } }; -/** - * A Factory for creating objects which can be identified by strings. - */ -template<class BaseObject> -class Factory : public Singleton< Factory<BaseObject> > { -public: + +namespace FactoryExceptions { class TypeNotRegistered : public std::exception { public: TypeNotRegistered(const std::string& typeString) : std::exception(), typeString(typeString) { @@ -36,18 +32,25 @@ public: private: const std::string typeString; }; +} +/** + * A Factory for creating objects which can be identified by strings. + */ +template<class BaseObject> +class Factory { +public: typedef BaseObject* CreateFunction(); bool registerObject(const std::string& id, CreateFunction* createFunction) { return this->objectMap.insert(std::make_pair(id, createFunction)).second; } - BaseObject* createObject(const std::string& id) const { + BaseObject* createObject(const std::string& id) const throw(FactoryExceptions::TypeNotRegistered) { typename std::map<const std::string, CreateFunction*>::const_iterator it = this->objectMap.find(id); if (it == this->objectMap.end()) { - throw TypeNotRegistered(id); + throw FactoryExceptions::TypeNotRegistered(id); } return it->second(); @@ -59,10 +62,10 @@ private: class SPObject; -typedef Factory<SPObject> SPFactory; +typedef Singleton< Factory<SPObject> > SPFactory; class SPEventContext; -typedef Factory<SPEventContext> ToolFactory; +typedef Singleton< Factory<SPEventContext> > ToolFactory; diff --git a/src/sp-object.cpp b/src/sp-object.cpp index 363a05579..79c83e38d 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -637,7 +637,7 @@ void SPObject::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) sp_object_unref(ochild, NULL); ochild->invoke_build(object->document, child, object->cloned); - } catch (const SPFactory::TypeNotRegistered& e) { + } catch (const FactoryExceptions::TypeNotRegistered& e) { //log_exception(std::current_exception()); g_warning("TypeNotRegistered exception: %s", e.what()); } @@ -703,7 +703,7 @@ void SPObject::build(SPDocument *document, Inkscape::XML::Node *repr) { object->attach(child, object->lastChild()); sp_object_unref(child, NULL); child->invoke_build(document, rchild, object->cloned); - } catch (const SPFactory::TypeNotRegistered& e) { + } catch (const FactoryExceptions::TypeNotRegistered& e) { //log_exception(std::current_exception()); g_warning("TypeNotRegistered exception: %s", e.what()); } diff --git a/src/spiral-context.cpp b/src/spiral-context.cpp index 7e3aed1b9..2f171ddde 100644 --- a/src/spiral-context.cpp +++ b/src/spiral-context.cpp @@ -47,16 +47,25 @@ using Inkscape::DocumentUndo; static void sp_spiral_context_dispose(GObject *object); -static void sp_spiral_context_setup(SPEventContext *ec); -static void sp_spiral_context_finish(SPEventContext *ec); -static void sp_spiral_context_set(SPEventContext *ec, Inkscape::Preferences::Entry *val); - -static gint sp_spiral_context_root_handler(SPEventContext *event_context, GdkEvent *event); static void sp_spiral_drag(SPSpiralContext *sc, Geom::Point const &p, guint state); static void sp_spiral_finish(SPSpiralContext *sc); static void sp_spiral_cancel(SPSpiralContext *sc); +#include "sp-factory.h" + +namespace { + SPEventContext* createSpiralContext() { + return new SPSpiralContext(); + } + + bool spiralContextRegistered = ToolFactory::instance().registerObject("/tools/shapes/spiral", createSpiralContext); +} + +const std::string& CSpiralContext::getPrefsPath() { + return SPSpiralContext::prefsPath; +} + const std::string SPSpiralContext::prefsPath = "/tools/shapes/spiral"; G_DEFINE_TYPE(SPSpiralContext, sp_spiral_context, SP_TYPE_EVENT_CONTEXT); @@ -85,6 +94,7 @@ SPSpiralContext::SPSpiralContext() : SPEventContext() { spiral_context->cspiralcontext = new CSpiralContext(spiral_context); delete spiral_context->ceventcontext; spiral_context->ceventcontext = spiral_context->cspiralcontext; + types.insert(typeid(SPSpiralContext)); spiral_context->_message_context = 0; @@ -114,11 +124,6 @@ sp_spiral_context_init(SPSpiralContext *spiral_context) new (spiral_context) SPSpiralContext(); } -static void sp_spiral_context_finish(SPEventContext *ec) -{ - ec->ceventcontext->finish(); -} - void CSpiralContext::finish() { SPEventContext* ec = this->speventcontext; @@ -173,12 +178,6 @@ static void sp_spiral_context_selection_changed(Inkscape::Selection *selection, ec->shape_editor->set_item(item, SH_KNOTHOLDER); } -static void -sp_spiral_context_setup(SPEventContext *ec) -{ - ec->ceventcontext->setup(); -} - void CSpiralContext::setup() { SPEventContext* ec = this->speventcontext; @@ -214,12 +213,6 @@ void CSpiralContext::setup() { sc->_message_context = new Inkscape::MessageContext((ec->desktop)->messageStack()); } -static void -sp_spiral_context_set(SPEventContext *ec, Inkscape::Preferences::Entry *val) -{ - ec->ceventcontext->set(val); -} - void CSpiralContext::set(Inkscape::Preferences::Entry* val) { SPEventContext* ec = this->speventcontext; @@ -235,12 +228,6 @@ void CSpiralContext::set(Inkscape::Preferences::Entry* val) { } } -static gint -sp_spiral_context_root_handler(SPEventContext *event_context, GdkEvent *event) -{ - return event_context->ceventcontext->root_handler(event); -} - gint CSpiralContext::root_handler(GdkEvent* event) { SPEventContext* event_context = this->speventcontext; diff --git a/src/spiral-context.h b/src/spiral-context.h index bd111f9c9..b71135800 100644 --- a/src/spiral-context.h +++ b/src/spiral-context.h @@ -22,10 +22,12 @@ #include "event-context.h" #define SP_TYPE_SPIRAL_CONTEXT (sp_spiral_context_get_type ()) -#define SP_SPIRAL_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_SPIRAL_CONTEXT, SPSpiralContext)) +//#define SP_SPIRAL_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_SPIRAL_CONTEXT, SPSpiralContext)) #define SP_SPIRAL_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SP_TYPE_SPIRAL_CONTEXT, SPSpiralContextClass)) -#define SP_IS_SPIRAL_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_SPIRAL_CONTEXT)) +//#define SP_IS_SPIRAL_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_SPIRAL_CONTEXT)) #define SP_IS_SPIRAL_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SP_TYPE_SPIRAL_CONTEXT)) +#define SP_SPIRAL_CONTEXT(obj) ((SPSpiralContext*)obj) +#define SP_IS_SPIRAL_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPSpiralContext))) class CSpiralContext; @@ -60,6 +62,7 @@ public: virtual void set(Inkscape::Preferences::Entry* val); virtual gint root_handler(GdkEvent* event); + virtual const std::string& getPrefsPath(); private: SPSpiralContext* spspiralcontext; }; diff --git a/src/spray-context.cpp b/src/spray-context.cpp index 7d4980355..bb9f05530 100644 --- a/src/spray-context.cpp +++ b/src/spray-context.cpp @@ -80,9 +80,19 @@ using namespace std; static void sp_spray_context_dispose(GObject *object); -static void sp_spray_context_setup(SPEventContext *ec); -static void sp_spray_context_set(SPEventContext *ec, Inkscape::Preferences::Entry *val); -static gint sp_spray_context_root_handler(SPEventContext *ec, GdkEvent *event); +#include "sp-factory.h" + +namespace { + SPEventContext* createSprayContext() { + return new SPSprayContext(); + } + + bool sprayContextRegistered = ToolFactory::instance().registerObject("/tools/spray", createSprayContext); +} + +const std::string& CSprayContext::getPrefsPath() { + return SPSprayContext::prefsPath; +} const std::string SPSprayContext::prefsPath = "/tools/spray"; @@ -145,6 +155,7 @@ SPSprayContext::SPSprayContext() : SPEventContext() { tc->cspraycontext = new CSprayContext(tc); delete tc->ceventcontext; tc->ceventcontext = tc->cspraycontext; + types.insert(typeid(SPSprayContext)); tc->usetilt = 0; tc->_message_context = 0; @@ -248,11 +259,6 @@ static void sp_spray_update_cursor(SPSprayContext *tc, bool /*with_shift*/) g_free(sel_message); } -static void sp_spray_context_setup(SPEventContext *ec) -{ - ec->ceventcontext->setup(); -} - void CSprayContext::setup() { SPEventContext* ec = this->speventcontext; @@ -307,11 +313,6 @@ void CSprayContext::setup() { } } -static void sp_spray_context_set(SPEventContext *ec, Inkscape::Preferences::Entry *val) -{ - ec->ceventcontext->set(val); -} - void CSprayContext::set(Inkscape::Preferences::Entry* val) { SPEventContext* ec = this->speventcontext; @@ -648,11 +649,6 @@ static void sp_spray_switch_mode(SPSprayContext *tc, gint mode, bool with_shift) sp_spray_update_cursor(tc, with_shift); } -gint sp_spray_context_root_handler(SPEventContext *event_context, GdkEvent *event) -{ - return event_context->ceventcontext->root_handler(event); -} - gint CSprayContext::root_handler(GdkEvent* event) { SPEventContext* event_context = this->speventcontext; diff --git a/src/spray-context.h b/src/spray-context.h index 06aecb2c8..8883aa533 100644 --- a/src/spray-context.h +++ b/src/spray-context.h @@ -22,10 +22,12 @@ #include "event-context.h" #define SP_TYPE_SPRAY_CONTEXT (sp_spray_context_get_type()) -#define SP_SPRAY_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_SPRAY_CONTEXT, SPSprayContext)) +//#define SP_SPRAY_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_SPRAY_CONTEXT, SPSprayContext)) #define SP_SPRAY_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), SP_TYPE_SPRAY_CONTEXT, SPSprayContextClass)) -#define SP_IS_SPRAY_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_SPRAY_CONTEXT)) +//#define SP_IS_SPRAY_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_SPRAY_CONTEXT)) #define SP_IS_SPRAY_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), SP_TYPE_SPRAY_CONTEXT)) +#define SP_SPRAY_CONTEXT(obj) ((SPSprayContext*)obj) +#define SP_IS_SPRAY_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPSprayContext))) namespace Inkscape { namespace UI { @@ -110,6 +112,7 @@ public: virtual void set(Inkscape::Preferences::Entry* val); virtual gint root_handler(GdkEvent* event); + virtual const std::string& getPrefsPath(); private: SPSprayContext* spspraycontext; }; diff --git a/src/star-context.cpp b/src/star-context.cpp index 6979d51a2..2e1402cbb 100644 --- a/src/star-context.cpp +++ b/src/star-context.cpp @@ -52,15 +52,24 @@ using Inkscape::DocumentUndo; static void sp_star_context_dispose (GObject *object); -static void sp_star_context_setup (SPEventContext *ec); -static void sp_star_context_finish(SPEventContext *ec); -static void sp_star_context_set (SPEventContext *ec, Inkscape::Preferences::Entry *val); -static gint sp_star_context_root_handler (SPEventContext *ec, GdkEvent *event); - static void sp_star_drag (SPStarContext * sc, Geom::Point p, guint state); static void sp_star_finish (SPStarContext * sc); static void sp_star_cancel(SPStarContext * sc); +#include "sp-factory.h" + +namespace { + SPEventContext* createStarContext() { + return new SPStarContext(); + } + + bool starContextRegistered = ToolFactory::instance().registerObject("/tools/shapes/star", createStarContext); +} + +const std::string& CStarContext::getPrefsPath() { + return SPStarContext::prefsPath; +} + const std::string SPStarContext::prefsPath = "/tools/shapes/star"; G_DEFINE_TYPE(SPStarContext, sp_star_context, SP_TYPE_EVENT_CONTEXT); @@ -89,6 +98,7 @@ SPStarContext::SPStarContext() : SPEventContext() { star_context->cstarcontext = new CStarContext(star_context); delete star_context->ceventcontext; star_context->ceventcontext = star_context->cstarcontext; + types.insert(typeid(SPStarContext)); star_context->randomized = 0; star_context->_message_context = 0; @@ -121,11 +131,6 @@ sp_star_context_init (SPStarContext * star_context) new (star_context) SPStarContext(); } -static void sp_star_context_finish(SPEventContext *ec) -{ - ec->ceventcontext->finish(); -} - void CStarContext::finish() { SPEventContext* ec = this->speventcontext; @@ -185,12 +190,6 @@ static void sp_star_context_selection_changed (Inkscape::Selection * selection, ec->shape_editor->set_item(item, SH_KNOTHOLDER); } -static void -sp_star_context_setup (SPEventContext *ec) -{ - ec->ceventcontext->setup(); -} - void CStarContext::setup() { SPEventContext* ec = this->speventcontext; @@ -229,12 +228,6 @@ void CStarContext::setup() { sc->_message_context = new Inkscape::MessageContext((ec->desktop)->messageStack()); } -static void -sp_star_context_set (SPEventContext *ec, Inkscape::Preferences::Entry *val) -{ - ec->ceventcontext->set(val); -} - void CStarContext::set(Inkscape::Preferences::Entry* val) { SPEventContext* ec = this->speventcontext; @@ -254,11 +247,6 @@ void CStarContext::set(Inkscape::Preferences::Entry* val) { } } -static gint sp_star_context_root_handler(SPEventContext *event_context, GdkEvent *event) -{ - return event_context->ceventcontext->root_handler(event); -} - gint CStarContext::root_handler(GdkEvent* event) { SPEventContext* event_context = this->speventcontext; diff --git a/src/star-context.h b/src/star-context.h index ca5d3517e..989c74c5d 100644 --- a/src/star-context.h +++ b/src/star-context.h @@ -20,10 +20,12 @@ #include "event-context.h" #define SP_TYPE_STAR_CONTEXT (sp_star_context_get_type ()) -#define SP_STAR_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_STAR_CONTEXT, SPStarContext)) +//#define SP_STAR_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_STAR_CONTEXT, SPStarContext)) #define SP_STAR_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SP_TYPE_STAR_CONTEXT, SPStarContextClass)) -#define SP_IS_STAR_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_STAR_CONTEXT)) +//#define SP_IS_STAR_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_STAR_CONTEXT)) #define SP_IS_STAR_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SP_TYPE_STAR_CONTEXT)) +#define SP_STAR_CONTEXT(obj) ((SPStarContext*)obj) +#define SP_IS_STAR_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPStarContext))) class CStarContext; @@ -66,6 +68,8 @@ public: virtual void set(Inkscape::Preferences::Entry* val); virtual gint root_handler(GdkEvent* event); + virtual const std::string& getPrefsPath(); + private: SPStarContext* spstarcontext; }; diff --git a/src/text-context.cpp b/src/text-context.cpp index 1f8262e3f..5fd2960e1 100644 --- a/src/text-context.cpp +++ b/src/text-context.cpp @@ -59,11 +59,6 @@ using Inkscape::DocumentUndo; static void sp_text_context_dispose(GObject *obj); -static void sp_text_context_setup(SPEventContext *ec); -static void sp_text_context_finish(SPEventContext *ec); -static gint sp_text_context_root_handler(SPEventContext *event_context, GdkEvent *event); -static gint sp_text_context_item_handler(SPEventContext *event_context, SPItem *item, GdkEvent *event); - static void sp_text_context_selection_changed(Inkscape::Selection *selection, SPTextContext *tc); static void sp_text_context_selection_modified(Inkscape::Selection *selection, guint flags, SPTextContext *tc); static bool sp_text_context_style_set(SPCSSAttr const *css, SPTextContext *tc); @@ -79,6 +74,21 @@ static gint sptc_focus_in(GtkWidget *widget, GdkEventFocus *event, SPTextContext static gint sptc_focus_out(GtkWidget *widget, GdkEventFocus *event, SPTextContext *tc); static void sptc_commit(GtkIMContext *imc, gchar *string, SPTextContext *tc); + +#include "sp-factory.h" + +namespace { + SPEventContext* createTextContext() { + return new SPTextContext(); + } + + bool textContextRegistered = ToolFactory::instance().registerObject("/tools/text", createTextContext); +} + +const std::string& CTextContext::getPrefsPath() { + return SPTextContext::prefsPath; +} + const std::string SPTextContext::prefsPath = "/tools/text"; G_DEFINE_TYPE(SPTextContext, sp_text_context, SP_TYPE_EVENT_CONTEXT); @@ -106,6 +116,7 @@ SPTextContext::SPTextContext() : SPEventContext() { tc->ctextcontext = new CTextContext(tc); delete tc->ceventcontext; tc->ceventcontext = tc->ctextcontext; + types.insert(typeid(SPTextContext)); tc->preedit_string = 0; tc->unipos = 0; @@ -180,11 +191,6 @@ static void sp_text_context_dispose(GObject *obj) Inkscape::Rubberband::get(ec->desktop)->stop(); } -static void sp_text_context_setup(SPEventContext *ec) -{ - ec->ceventcontext->setup(); -} - void CTextContext::setup() { SPEventContext* ec = this->speventcontext; @@ -273,11 +279,6 @@ void CTextContext::setup() { } } -static void sp_text_context_finish(SPEventContext *ec) -{ - ec->ceventcontext->finish(); -} - void CTextContext::finish() { SPEventContext* ec = this->speventcontext; @@ -329,11 +330,6 @@ void CTextContext::finish() { tc->text_selection_quads.clear(); } -static gint sp_text_context_item_handler(SPEventContext *event_context, SPItem *item, GdkEvent *event) -{ - return event_context->ceventcontext->item_handler(item, event); -} - gint CTextContext::item_handler(SPItem* item, GdkEvent* event) { SPEventContext* event_context = this->speventcontext; @@ -399,7 +395,7 @@ gint CTextContext::item_handler(SPItem* item, GdkEvent* event) { } break; case GDK_MOTION_NOTIFY: - if (event->motion.state & GDK_BUTTON1_MASK && tc->dragging && !event_context->space_panning) { + if ((event->motion.state & GDK_BUTTON1_MASK) && tc->dragging && !event_context->space_panning) { Inkscape::Text::Layout const *layout = te_get_layout(tc->text); if (!layout) break; // find out click point in document coordinates @@ -592,11 +588,6 @@ static void show_curr_uni_char(SPTextContext *const tc) } } -static gint sp_text_context_root_handler(SPEventContext *const event_context, GdkEvent *const event) -{ - return event_context->ceventcontext->root_handler(event); -} - gint CTextContext::root_handler(GdkEvent* event) { SPEventContext* event_context = this->speventcontext; @@ -655,7 +646,7 @@ gint CTextContext::root_handler(GdkEvent* event) { desktop->event_context->defaultMessageContext()->clear(); } - if (tc->creating && event->motion.state & GDK_BUTTON1_MASK && !event_context->space_panning) { + if (tc->creating && (event->motion.state & GDK_BUTTON1_MASK) && !event_context->space_panning) { if ( event_context->within_tolerance && ( abs( (gint) event->motion.x - event_context->xp ) < event_context->tolerance ) && ( abs( (gint) event->motion.y - event_context->yp ) < event_context->tolerance ) ) { diff --git a/src/text-context.h b/src/text-context.h index 3214b08cd..548835dd7 100644 --- a/src/text-context.h +++ b/src/text-context.h @@ -24,10 +24,12 @@ #include "libnrtype/Layout-TNG.h" #define SP_TYPE_TEXT_CONTEXT (sp_text_context_get_type ()) -#define SP_TEXT_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_TEXT_CONTEXT, SPTextContext)) +//#define SP_TEXT_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_TEXT_CONTEXT, SPTextContext)) #define SP_TEXT_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SP_TYPE_TEXT_CONTEXT, SPTextContextClass)) -#define SP_IS_TEXT_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_TEXT_CONTEXT)) +//#define SP_IS_TEXT_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_TEXT_CONTEXT)) #define SP_IS_TEXT_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SP_TYPE_TEXT_CONTEXT)) +#define SP_TEXT_CONTEXT(obj) ((SPTextContext*)obj) +#define SP_IS_TEXT_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPTextContext))) struct SPCtrlLine; @@ -93,6 +95,7 @@ public: virtual gint root_handler(GdkEvent* event); virtual gint item_handler(SPItem* item, GdkEvent* event); + virtual const std::string& getPrefsPath(); private: SPTextContext* sptextcontext; }; diff --git a/src/tweak-context.cpp b/src/tweak-context.cpp index 9fca2183b..a287a0831 100644 --- a/src/tweak-context.cpp +++ b/src/tweak-context.cpp @@ -83,9 +83,20 @@ using Inkscape::DocumentUndo; static void sp_tweak_context_dispose(GObject *object); -static void sp_tweak_context_setup(SPEventContext *ec); -static void sp_tweak_context_set(SPEventContext *ec, Inkscape::Preferences::Entry *val); -static gint sp_tweak_context_root_handler(SPEventContext *ec, GdkEvent *event); + +#include "sp-factory.h" + +namespace { + SPEventContext* createTweakContext() { + return new SPTweakContext(); + } + + bool tweakContextRegistered = ToolFactory::instance().registerObject("/tools/tweak", createTweakContext); +} + +const std::string& CTweakContext::getPrefsPath() { + return SPTweakContext::prefsPath; +} const std::string SPTweakContext::prefsPath = "/tools/tweak"; @@ -114,6 +125,7 @@ SPTweakContext::SPTweakContext() : SPEventContext() { tc->ctweakcontext = new CTweakContext(tc); delete tc->ceventcontext; tc->ceventcontext = tc->ctweakcontext; + types.insert(typeid(SPTweakContext)); tc->_message_context = 0; tc->mode = 0; @@ -285,12 +297,6 @@ sp_tweak_context_style_set(SPCSSAttr const *css, SPTweakContext *tc) return false; } -static void -sp_tweak_context_setup(SPEventContext *ec) -{ - ec->ceventcontext->setup(); -} - void CTweakContext::setup() { SPEventContext* ec = this->speventcontext; @@ -345,12 +351,6 @@ void CTweakContext::setup() { } } -static void -sp_tweak_context_set(SPEventContext *ec, Inkscape::Preferences::Entry *val) -{ - ec->ceventcontext->set(val); -} - void CTweakContext::set(Inkscape::Preferences::Entry* val) { SPEventContext* ec = this->speventcontext; @@ -1186,13 +1186,6 @@ sp_tweak_switch_mode_temporarily (SPTweakContext *tc, gint mode, bool with_shift sp_tweak_update_cursor (tc, with_shift); } -gint -sp_tweak_context_root_handler(SPEventContext *event_context, - GdkEvent *event) -{ - return event_context->ceventcontext->root_handler(event); -} - gint CTweakContext::root_handler(GdkEvent* event) { SPEventContext* event_context = this->speventcontext; diff --git a/src/tweak-context.h b/src/tweak-context.h index e5033c0dc..2b012ab74 100644 --- a/src/tweak-context.h +++ b/src/tweak-context.h @@ -16,10 +16,12 @@ #include <2geom/point.h> #define SP_TYPE_TWEAK_CONTEXT (sp_tweak_context_get_type()) -#define SP_TWEAK_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_TWEAK_CONTEXT, SPTweakContext)) +//#define SP_TWEAK_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_TWEAK_CONTEXT, SPTweakContext)) #define SP_TWEAK_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), SP_TYPE_TWEAK_CONTEXT, SPTweakContextClass)) -#define SP_IS_TWEAK_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_TWEAK_CONTEXT)) +//#define SP_IS_TWEAK_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_TWEAK_CONTEXT)) #define SP_IS_TWEAK_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), SP_TYPE_TWEAK_CONTEXT)) +#define SP_TWEAK_CONTEXT(obj) ((SPTweakContext*)obj) +#define SP_IS_TWEAK_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPTweakContext))) #define SAMPLING_SIZE 8 /* fixme: ?? */ @@ -99,6 +101,7 @@ public: virtual void set(Inkscape::Preferences::Entry* val); virtual gint root_handler(GdkEvent* event); + virtual const std::string& getPrefsPath(); private: SPTweakContext* sptweakcontext; }; diff --git a/src/ui/tool/node-tool.cpp b/src/ui/tool/node-tool.cpp index 8887d4334..e30dde1ae 100644 --- a/src/ui/tool/node-tool.cpp +++ b/src/ui/tool/node-tool.cpp @@ -124,6 +124,21 @@ void handleControlUiStyleChange(InkNodeTool *nt); //} // anonymous namespace + +#include "sp-factory.h" + +namespace { + SPEventContext* createNodesContext() { + return new InkNodeTool(); + } + + bool nodesContextRegistered = ToolFactory::instance().registerObject("/tools/nodes", createNodesContext); +} + +const std::string& CInkNodeTool::getPrefsPath() { + return InkNodeTool::prefsPath; +} + const std::string InkNodeTool::prefsPath = "/tools/nodes"; G_DEFINE_TYPE(InkNodeTool, ink_node_tool, SP_TYPE_EVENT_CONTEXT); @@ -152,6 +167,7 @@ InkNodeTool::InkNodeTool() : SPEventContext() { nt->cinknodetool = new CInkNodeTool(nt); delete nt->ceventcontext; nt->ceventcontext = nt->cinknodetool; + types.insert(typeid(InkNodeTool)); nt->show_handles = 0; nt->single_node_transform_handles = 0; diff --git a/src/ui/tool/node-tool.h b/src/ui/tool/node-tool.h index b5ce65513..3de68d535 100644 --- a/src/ui/tool/node-tool.h +++ b/src/ui/tool/node-tool.h @@ -17,10 +17,12 @@ #include "event-context.h" #define INK_TYPE_NODE_TOOL (ink_node_tool_get_type ()) -#define INK_NODE_TOOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), INK_TYPE_NODE_TOOL, InkNodeTool)) +//#define INK_NODE_TOOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), INK_TYPE_NODE_TOOL, InkNodeTool)) #define INK_NODE_TOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), INK_TYPE_NODE_TOOL, InkNodeToolClass)) -#define INK_IS_NODE_TOOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), INK_TYPE_NODE_TOOL)) +//#define INK_IS_NODE_TOOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), INK_TYPE_NODE_TOOL)) #define INK_IS_NODE_TOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), INK_TYPE_NODE_TOOL)) +#define INK_NODE_TOOL(obj) ((InkNodeTool*)obj) +#define INK_IS_NODE_TOOL(obj) (((SPEventContext*)obj)->types.count(typeid(InkNodeTool))) namespace Inkscape { @@ -91,6 +93,7 @@ public: virtual gint root_handler(GdkEvent* event); virtual gint item_handler(SPItem* item, GdkEvent* event); + virtual const std::string& getPrefsPath(); private: InkNodeTool* inknodetool; }; diff --git a/src/zoom-context.cpp b/src/zoom-context.cpp index 92c50b148..8e5f4753d 100644 --- a/src/zoom-context.cpp +++ b/src/zoom-context.cpp @@ -26,17 +26,25 @@ #include "zoom-context.h" -static void sp_zoom_context_setup(SPEventContext *ec); -static void sp_zoom_context_finish (SPEventContext *ec); - -static gint sp_zoom_context_root_handler(SPEventContext *event_context, GdkEvent *event); -static gint sp_zoom_context_item_handler(SPEventContext *event_context, SPItem *item, GdkEvent *event); - static gint xp = 0, yp = 0; // where drag started static gint tolerance = 0; static bool within_tolerance = false; static bool escaped; +#include "sp-factory.h" + +namespace { + SPEventContext* createZoomContext() { + return new SPZoomContext(); + } + + bool zoomContextRegistered = ToolFactory::instance().registerObject("/tools/zoom", createZoomContext); +} + +const std::string& CZoomContext::getPrefsPath() { + return SPZoomContext::prefsPath; +} + const std::string SPZoomContext::prefsPath = "/tools/zoom"; G_DEFINE_TYPE(SPZoomContext, sp_zoom_context, SP_TYPE_EVENT_CONTEXT); @@ -62,6 +70,7 @@ SPZoomContext::SPZoomContext() : SPEventContext() { zoom_context->czoomcontext = new CZoomContext(zoom_context); delete zoom_context->ceventcontext; zoom_context->ceventcontext = zoom_context->czoomcontext; + types.insert(typeid(SPZoomContext)); zoom_context->grabbed = 0; @@ -77,12 +86,6 @@ static void sp_zoom_context_init (SPZoomContext *zoom_context) new (zoom_context) SPZoomContext(); } -static void -sp_zoom_context_finish (SPEventContext *ec) -{ - ec->ceventcontext->finish(); -} - void CZoomContext::finish() { SPEventContext* ec = this->speventcontext; @@ -96,11 +99,6 @@ void CZoomContext::finish() { } } -static void sp_zoom_context_setup(SPEventContext *ec) -{ - ec->ceventcontext->setup(); -} - void CZoomContext::setup() { SPEventContext* ec = this->speventcontext; @@ -118,11 +116,6 @@ void CZoomContext::setup() { CEventContext::setup(); } -static gint sp_zoom_context_item_handler(SPEventContext *event_context, SPItem *item, GdkEvent *event) -{ - return event_context->ceventcontext->item_handler(item, event); -} - gint CZoomContext::item_handler(SPItem* item, GdkEvent* event) { SPEventContext* event_context = this->speventcontext; @@ -136,11 +129,6 @@ gint CZoomContext::item_handler(SPItem* item, GdkEvent* event) { return ret; } -static gint sp_zoom_context_root_handler(SPEventContext *event_context, GdkEvent *event) -{ - return event_context->ceventcontext->root_handler(event); -} - gint CZoomContext::root_handler(GdkEvent* event) { SPEventContext* event_context = this->speventcontext; @@ -186,7 +174,7 @@ gint CZoomContext::root_handler(GdkEvent* event) { } case GDK_MOTION_NOTIFY: - if (event->motion.state & GDK_BUTTON1_MASK && !event_context->space_panning) { + if ((event->motion.state & GDK_BUTTON1_MASK) && !event_context->space_panning) { ret = TRUE; if ( within_tolerance diff --git a/src/zoom-context.h b/src/zoom-context.h index 4342cc982..36842649b 100644 --- a/src/zoom-context.h +++ b/src/zoom-context.h @@ -16,8 +16,10 @@ #include "event-context.h" #define SP_TYPE_ZOOM_CONTEXT (sp_zoom_context_get_type ()) -#define SP_ZOOM_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_ZOOM_CONTEXT, SPZoomContext)) -#define SP_IS_ZOOM_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_ZOOM_CONTEXT)) +//#define SP_ZOOM_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_ZOOM_CONTEXT, SPZoomContext)) +//#define SP_IS_ZOOM_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_ZOOM_CONTEXT)) +#define SP_ZOOM_CONTEXT(obj) ((SPZoomContext*)obj) +#define SP_IS_ZOOM_CONTEXT(obj) (((SPEventContext*)obj)->types.count(typeid(SPZoomContext))) class CZoomContext; @@ -45,6 +47,7 @@ public: virtual gint root_handler(GdkEvent* event); virtual gint item_handler(SPItem* item, GdkEvent* event); + virtual const std::string& getPrefsPath(); private: SPZoomContext* spzoomcontext; }; |
