~centralelyon2010/inkscape/imagelinks2

« back to all changes in this revision

Viewing changes to src/widgets/sp-widget.cpp

  • Committer: mental
  • Date: 2006-01-16 02:36:01 UTC
  • Revision ID: mental@users.sourceforge.net-20060116023601-wkr0h7edl5veyudq
moving trunk for module inkscape

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#define __SP_WIDGET_C__
 
2
 
 
3
/*
 
4
 * Abstract base class for dynamic control widgets
 
5
 *
 
6
 * Authors:
 
7
 *   Lauris Kaplinski <lauris@kaplinski.com>
 
8
 *   bulia byak <buliabyak@users.sf.net>
 
9
 *
 
10
 * Copyright (C) 1999-2002 Lauris Kaplinski
 
11
 * Copyright (C) 2000-2001 Ximian, Inc.
 
12
 *
 
13
 * Released under GNU GPL, read the file 'COPYING' for more information
 
14
 */
 
15
 
 
16
#include "macros.h"
 
17
#include "../document.h"
 
18
#include "sp-widget.h"
 
19
 
 
20
enum {
 
21
        CONSTRUCT,
 
22
        MODIFY_SELECTION,
 
23
        CHANGE_SELECTION,
 
24
        SET_SELECTION,
 
25
        LAST_SIGNAL
 
26
};
 
27
 
 
28
static void sp_widget_class_init (SPWidgetClass *klass);
 
29
static void sp_widget_init (SPWidget *widget);
 
30
 
 
31
static void sp_widget_destroy (GtkObject *object);
 
32
 
 
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);
 
38
 
 
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);
 
42
 
 
43
static GtkBinClass *parent_class;
 
44
static guint signals[LAST_SIGNAL] = {0};
 
45
 
 
46
GtkType
 
47
sp_widget_get_type (void)
 
48
{
 
49
        static GtkType type = 0;
 
50
        if (!type) {
 
51
                static const GtkTypeInfo info = {
 
52
                        "SPWidget",
 
53
                        sizeof (SPWidget),
 
54
                        sizeof (SPWidgetClass),
 
55
                        (GtkClassInitFunc) sp_widget_class_init,
 
56
                        (GtkObjectInitFunc) sp_widget_init,
 
57
                        NULL, NULL, NULL
 
58
                };
 
59
                type = gtk_type_unique (GTK_TYPE_BIN, &info);
 
60
        }
 
61
        return type;
 
62
}
 
63
 
 
64
static void
 
65
sp_widget_class_init (SPWidgetClass *klass)
 
66
{
 
67
        GtkObjectClass *object_class;
 
68
        GtkWidgetClass *widget_class;
 
69
 
 
70
        object_class = (GtkObjectClass *) klass;
 
71
        widget_class = (GtkWidgetClass *) klass;
 
72
 
 
73
        parent_class = (GtkBinClass*)gtk_type_class (GTK_TYPE_BIN);
 
74
 
 
75
        object_class->destroy = sp_widget_destroy;
 
76
 
 
77
        signals[CONSTRUCT] =        gtk_signal_new ("construct",
 
78
                                                    GTK_RUN_FIRST,
 
79
                                                    GTK_CLASS_TYPE(object_class),
 
80
                                                    GTK_SIGNAL_OFFSET (SPWidgetClass, construct),
 
81
                                                    gtk_marshal_NONE__NONE,
 
82
                                                    GTK_TYPE_NONE, 0);
 
83
        signals[CHANGE_SELECTION] = gtk_signal_new ("change_selection",
 
84
                                                    GTK_RUN_FIRST,
 
85
                                                    GTK_CLASS_TYPE(object_class),
 
86
                                                    GTK_SIGNAL_OFFSET (SPWidgetClass, change_selection),
 
87
                                                    gtk_marshal_NONE__POINTER,
 
88
                                                    GTK_TYPE_NONE, 1,
 
89
                                                    GTK_TYPE_POINTER);
 
90
        signals[MODIFY_SELECTION] = gtk_signal_new ("modify_selection",
 
91
                                                    GTK_RUN_FIRST,
 
92
                                                    GTK_CLASS_TYPE(object_class),
 
93
                                                    GTK_SIGNAL_OFFSET (SPWidgetClass, modify_selection),
 
94
                                                    gtk_marshal_NONE__POINTER_UINT,
 
95
                                                    GTK_TYPE_NONE, 2,
 
96
                                                    GTK_TYPE_POINTER, GTK_TYPE_UINT);
 
97
        signals[SET_SELECTION] =    gtk_signal_new ("set_selection",
 
98
                                                    GTK_RUN_FIRST,
 
99
                                                    GTK_CLASS_TYPE(object_class),
 
100
                                                    GTK_SIGNAL_OFFSET (SPWidgetClass, set_selection),
 
101
                                                    gtk_marshal_NONE__POINTER,
 
102
                                                    GTK_TYPE_NONE, 1,
 
103
                                                    GTK_TYPE_POINTER);
 
104
 
 
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;
 
110
}
 
111
 
 
112
static void
 
113
sp_widget_init (SPWidget *spw)
 
114
{
 
115
        spw->inkscape = NULL;
 
116
}
 
117
 
 
118
static void
 
119
sp_widget_destroy (GtkObject *object)
 
120
{
 
121
        SPWidget *spw;
 
122
 
 
123
        spw = (SPWidget *) object;
 
124
 
 
125
        if (spw->inkscape) {
 
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;
 
132
        }
 
133
 
 
134
        if (((GtkObjectClass *) parent_class)->destroy)
 
135
                (* ((GtkObjectClass *) parent_class)->destroy) (object);
 
136
}
 
137
 
 
138
static void
 
139
sp_widget_show (GtkWidget *widget)
 
140
{
 
141
        SPWidget *spw;
 
142
 
 
143
        spw = SP_WIDGET (widget);
 
144
 
 
145
        if (spw->inkscape) {
 
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);
 
150
        }
 
151
 
 
152
        if (((GtkWidgetClass *) parent_class)->show)
 
153
                (* ((GtkWidgetClass *) parent_class)->show) (widget);
 
154
}
 
155
 
 
156
static void
 
157
sp_widget_hide (GtkWidget *widget)
 
158
{
 
159
        SPWidget *spw;
 
160
 
 
161
        spw = SP_WIDGET (widget);
 
162
 
 
163
        if (spw->inkscape) {
 
164
                /* Disconnect signals */
 
165
                sp_signal_disconnect_by_data (spw->inkscape, spw);
 
166
        }
 
167
 
 
168
        if (((GtkWidgetClass *) parent_class)->hide)
 
169
                (* ((GtkWidgetClass *) parent_class)->hide) (widget);
 
170
}
 
171
 
 
172
static gint
 
173
sp_widget_expose (GtkWidget *widget, GdkEventExpose *event)
 
174
{
 
175
        GtkBin *bin;
 
176
 
 
177
        bin = GTK_BIN (widget);
 
178
 
 
179
        gtk_container_propagate_expose (GTK_CONTAINER(widget), bin->child, event);
 
180
        /*
 
181
        if ((bin->child) && (GTK_WIDGET_NO_WINDOW (bin->child))) {
 
182
                GdkEventExpose ce;
 
183
                ce = *event;
 
184
                gtk_widget_event (bin->child, (GdkEvent *) &ce);
 
185
        }
 
186
        */
 
187
 
 
188
        return FALSE;
 
189
}
 
190
 
 
191
static void
 
192
sp_widget_size_request (GtkWidget *widget, GtkRequisition *requisition)
 
193
{
 
194
        if (((GtkBin *) widget)->child)
 
195
                gtk_widget_size_request (((GtkBin *) widget)->child, requisition);
 
196
}
 
197
 
 
198
static void
 
199
sp_widget_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
 
200
{
 
201
        widget->allocation = *allocation;
 
202
 
 
203
        if (((GtkBin *) widget)->child)
 
204
                gtk_widget_size_allocate (((GtkBin *) widget)->child, allocation);
 
205
}
 
206
 
 
207
/* Methods */
 
208
 
 
209
GtkWidget *
 
210
sp_widget_new_global (Inkscape::Application *inkscape)
 
211
{
 
212
        SPWidget *spw;
 
213
 
 
214
        spw = (SPWidget*)gtk_type_new (SP_TYPE_WIDGET);
 
215
 
 
216
        if (!sp_widget_construct_global (spw, inkscape)) {
 
217
                gtk_object_unref (GTK_OBJECT (spw));
 
218
                return NULL;
 
219
        }
 
220
 
 
221
        return (GtkWidget *) spw;
 
222
}
 
223
 
 
224
GtkWidget *
 
225
sp_widget_construct_global (SPWidget *spw, Inkscape::Application *inkscape)
 
226
{
 
227
        g_return_val_if_fail (!spw->inkscape, NULL);
 
228
 
 
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);
 
234
        }
 
235
 
 
236
        g_signal_emit (G_OBJECT (spw), signals[CONSTRUCT], 0);
 
237
 
 
238
        return (GtkWidget *) spw;
 
239
}
 
240
 
 
241
static void
 
242
sp_widget_modify_selection (Inkscape::Application *inkscape, Inkscape::Selection *selection, guint flags, SPWidget *spw)
 
243
{
 
244
        g_signal_emit (G_OBJECT (spw), signals[MODIFY_SELECTION], 0, selection, flags);
 
245
}
 
246
 
 
247
static void
 
248
sp_widget_change_selection (Inkscape::Application *inkscape, Inkscape::Selection *selection, SPWidget *spw)
 
249
{
 
250
        g_signal_emit (G_OBJECT (spw), signals[CHANGE_SELECTION], 0, selection);
 
251
}
 
252
 
 
253
static void
 
254
sp_widget_set_selection (Inkscape::Application *inkscape, Inkscape::Selection *selection, SPWidget *spw)
 
255
{
 
256
        /* Emit "set_selection" signal */
 
257
        g_signal_emit (G_OBJECT (spw), signals[SET_SELECTION], 0, selection);
 
258
        /* Inkscape will force "change_selection" anyways */
 
259
}
 
260