1
#define __SP_WIDGET_C__
4
* Abstract base class for dynamic control widgets
7
* Lauris Kaplinski <lauris@kaplinski.com>
8
* bulia byak <buliabyak@users.sf.net>
10
* Copyright (C) 1999-2002 Lauris Kaplinski
11
* Copyright (C) 2000-2001 Ximian, Inc.
13
* Released under GNU GPL, read the file 'COPYING' for more information
17
#include "../document.h"
18
#include "sp-widget.h"
28
static void sp_widget_class_init (SPWidgetClass *klass);
29
static void sp_widget_init (SPWidget *widget);
31
static void sp_widget_destroy (GtkObject *object);
33
static void sp_widget_show (GtkWidget *widget);
34
static void sp_widget_hide (GtkWidget *widget);
35
static gint sp_widget_expose (GtkWidget *widget, GdkEventExpose *event);
36
static void sp_widget_size_request (GtkWidget *widget, GtkRequisition *requisition);
37
static void sp_widget_size_allocate (GtkWidget *widget, GtkAllocation *allocation);
39
static void sp_widget_modify_selection (Inkscape::Application *inkscape, Inkscape::Selection *selection, guint flags, SPWidget *spw);
40
static void sp_widget_change_selection (Inkscape::Application *inkscape, Inkscape::Selection *selection, SPWidget *spw);
41
static void sp_widget_set_selection (Inkscape::Application *inkscape, Inkscape::Selection *selection, SPWidget *spw);
43
static GtkBinClass *parent_class;
44
static guint signals[LAST_SIGNAL] = {0};
47
sp_widget_get_type (void)
49
static GtkType type = 0;
51
static const GtkTypeInfo info = {
54
sizeof (SPWidgetClass),
55
(GtkClassInitFunc) sp_widget_class_init,
56
(GtkObjectInitFunc) sp_widget_init,
59
type = gtk_type_unique (GTK_TYPE_BIN, &info);
65
sp_widget_class_init (SPWidgetClass *klass)
67
GtkObjectClass *object_class;
68
GtkWidgetClass *widget_class;
70
object_class = (GtkObjectClass *) klass;
71
widget_class = (GtkWidgetClass *) klass;
73
parent_class = (GtkBinClass*)gtk_type_class (GTK_TYPE_BIN);
75
object_class->destroy = sp_widget_destroy;
77
signals[CONSTRUCT] = gtk_signal_new ("construct",
79
GTK_CLASS_TYPE(object_class),
80
GTK_SIGNAL_OFFSET (SPWidgetClass, construct),
81
gtk_marshal_NONE__NONE,
83
signals[CHANGE_SELECTION] = gtk_signal_new ("change_selection",
85
GTK_CLASS_TYPE(object_class),
86
GTK_SIGNAL_OFFSET (SPWidgetClass, change_selection),
87
gtk_marshal_NONE__POINTER,
90
signals[MODIFY_SELECTION] = gtk_signal_new ("modify_selection",
92
GTK_CLASS_TYPE(object_class),
93
GTK_SIGNAL_OFFSET (SPWidgetClass, modify_selection),
94
gtk_marshal_NONE__POINTER_UINT,
96
GTK_TYPE_POINTER, GTK_TYPE_UINT);
97
signals[SET_SELECTION] = gtk_signal_new ("set_selection",
99
GTK_CLASS_TYPE(object_class),
100
GTK_SIGNAL_OFFSET (SPWidgetClass, set_selection),
101
gtk_marshal_NONE__POINTER,
105
widget_class->show = sp_widget_show;
106
widget_class->hide = sp_widget_hide;
107
widget_class->expose_event = sp_widget_expose;
108
widget_class->size_request = sp_widget_size_request;
109
widget_class->size_allocate = sp_widget_size_allocate;
113
sp_widget_init (SPWidget *spw)
115
spw->inkscape = NULL;
119
sp_widget_destroy (GtkObject *object)
123
spw = (SPWidget *) object;
126
/* Disconnect signals */
127
// the checks are necessary because when destroy is caused by the the program shutting down,
128
// the inkscape object may already be (partly?) invalid --bb
129
if (G_IS_OBJECT(spw->inkscape) && G_OBJECT_GET_CLASS(G_OBJECT(spw->inkscape)))
130
sp_signal_disconnect_by_data (spw->inkscape, spw);
131
spw->inkscape = NULL;
134
if (((GtkObjectClass *) parent_class)->destroy)
135
(* ((GtkObjectClass *) parent_class)->destroy) (object);
139
sp_widget_show (GtkWidget *widget)
143
spw = SP_WIDGET (widget);
146
/* Connect signals */
147
g_signal_connect (G_OBJECT (spw->inkscape), "modify_selection", G_CALLBACK (sp_widget_modify_selection), spw);
148
g_signal_connect (G_OBJECT (spw->inkscape), "change_selection", G_CALLBACK (sp_widget_change_selection), spw);
149
g_signal_connect (G_OBJECT (spw->inkscape), "set_selection", G_CALLBACK (sp_widget_set_selection), spw);
152
if (((GtkWidgetClass *) parent_class)->show)
153
(* ((GtkWidgetClass *) parent_class)->show) (widget);
157
sp_widget_hide (GtkWidget *widget)
161
spw = SP_WIDGET (widget);
164
/* Disconnect signals */
165
sp_signal_disconnect_by_data (spw->inkscape, spw);
168
if (((GtkWidgetClass *) parent_class)->hide)
169
(* ((GtkWidgetClass *) parent_class)->hide) (widget);
173
sp_widget_expose (GtkWidget *widget, GdkEventExpose *event)
177
bin = GTK_BIN (widget);
179
gtk_container_propagate_expose (GTK_CONTAINER(widget), bin->child, event);
181
if ((bin->child) && (GTK_WIDGET_NO_WINDOW (bin->child))) {
184
gtk_widget_event (bin->child, (GdkEvent *) &ce);
192
sp_widget_size_request (GtkWidget *widget, GtkRequisition *requisition)
194
if (((GtkBin *) widget)->child)
195
gtk_widget_size_request (((GtkBin *) widget)->child, requisition);
199
sp_widget_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
201
widget->allocation = *allocation;
203
if (((GtkBin *) widget)->child)
204
gtk_widget_size_allocate (((GtkBin *) widget)->child, allocation);
210
sp_widget_new_global (Inkscape::Application *inkscape)
214
spw = (SPWidget*)gtk_type_new (SP_TYPE_WIDGET);
216
if (!sp_widget_construct_global (spw, inkscape)) {
217
gtk_object_unref (GTK_OBJECT (spw));
221
return (GtkWidget *) spw;
225
sp_widget_construct_global (SPWidget *spw, Inkscape::Application *inkscape)
227
g_return_val_if_fail (!spw->inkscape, NULL);
229
spw->inkscape = inkscape;
230
if (GTK_WIDGET_VISIBLE (spw)) {
231
g_signal_connect (G_OBJECT (inkscape), "modify_selection", G_CALLBACK (sp_widget_modify_selection), spw);
232
g_signal_connect (G_OBJECT (inkscape), "change_selection", G_CALLBACK (sp_widget_change_selection), spw);
233
g_signal_connect (G_OBJECT (inkscape), "set_selection", G_CALLBACK (sp_widget_set_selection), spw);
236
g_signal_emit (G_OBJECT (spw), signals[CONSTRUCT], 0);
238
return (GtkWidget *) spw;
242
sp_widget_modify_selection (Inkscape::Application *inkscape, Inkscape::Selection *selection, guint flags, SPWidget *spw)
244
g_signal_emit (G_OBJECT (spw), signals[MODIFY_SELECTION], 0, selection, flags);
248
sp_widget_change_selection (Inkscape::Application *inkscape, Inkscape::Selection *selection, SPWidget *spw)
250
g_signal_emit (G_OBJECT (spw), signals[CHANGE_SELECTION], 0, selection);
254
sp_widget_set_selection (Inkscape::Application *inkscape, Inkscape::Selection *selection, SPWidget *spw)
256
/* Emit "set_selection" signal */
257
g_signal_emit (G_OBJECT (spw), signals[SET_SELECTION], 0, selection);
258
/* Inkscape will force "change_selection" anyways */