808775786b9a4fb5c6013e043ec2c3a1ffc790cc
1 #define __SP_ITEM_PROPERTIES_C__
3 /*
4 * Object properties dialog
5 *
6 * Authors:
7 * Lauris Kaplinski <lauris@kaplinski.com>
8 * bulia byak <buliabyak@users.sf.net>
9 * Johan Engelen <goejendaagh@zonnet.nl>
10 *
11 * Copyright (C) 1999-2006 Authors
12 * Copyright (C) 2001 Ximian, Inc.
13 *
14 * Released under GNU GPL, read the file 'COPYING' for more information
15 */
17 #ifdef HAVE_CONFIG_H
18 # include "config.h"
19 #endif
20 #include <gtk/gtkvbox.h>
21 #include <gtk/gtkhbox.h>
22 #include <gtk/gtktable.h>
23 #include <gtk/gtkcheckbutton.h>
24 #include <gtk/gtkspinbutton.h>
25 #include <gtk/gtklabel.h>
26 #include <gtk/gtkframe.h>
27 #include <gtk/gtktextview.h>
28 #include <gtk/gtktooltips.h>
30 #include <glibmm/i18n.h>
31 #include "helper/window.h"
32 #include "../widgets/sp-widget.h"
33 #include "../inkscape.h"
34 #include "../document.h"
35 #include "../desktop-handles.h"
36 #include "../selection.h"
37 #include "../sp-item.h"
38 #include "../macros.h"
39 #include "../verbs.h"
40 #include "../interface.h"
42 #include "dialog-events.h"
43 #include "../preferences.h"
45 #define MIN_ONSCREEN_DISTANCE 50
47 static GtkWidget *dlg = NULL;
48 static win_data wd;
50 // impossible original values to make sure they are read from prefs
51 static gint x = -1000, y = -1000, w = 0, h = 0;
52 static Glib::ustring const prefs_path = "/dialogs/object/";
54 static void sp_item_widget_modify_selection (SPWidget *spw, Inkscape::Selection *selection, guint flags, GtkWidget *itemw);
55 static void sp_item_widget_change_selection (SPWidget *spw, Inkscape::Selection *selection, GtkWidget *itemw);
56 static void sp_item_widget_setup (SPWidget *spw, Inkscape::Selection *selection);
57 static void sp_item_widget_sensitivity_toggled (GtkWidget *widget, SPWidget *spw);
58 static void sp_item_widget_hidden_toggled (GtkWidget *widget, SPWidget *spw);
59 static void sp_item_widget_label_changed (GtkWidget *widget, SPWidget *spw);
61 static void
62 sp_item_dialog_destroy( GtkObject */*object*/, gpointer /*data*/ )
63 {
64 sp_signal_disconnect_by_data (INKSCAPE, dlg);
65 wd.win = dlg = NULL;
66 wd.stop = 0;
67 }
69 static gboolean
70 sp_item_dialog_delete( GtkObject */*object*/, GdkEvent */*event*/, gpointer /*data*/ )
71 {
72 gtk_window_get_position ((GtkWindow *) dlg, &x, &y);
73 gtk_window_get_size ((GtkWindow *) dlg, &w, &h);
75 if (x<0) x=0;
76 if (y<0) y=0;
78 Inkscape::Preferences *prefs = Inkscape::Preferences::get();
79 prefs->setInt(prefs_path + "x", x);
80 prefs->setInt(prefs_path + "y", y);
81 prefs->setInt(prefs_path + "w", w);
82 prefs->setInt(prefs_path + "h", h);
84 return FALSE; // which means, go ahead and destroy it
86 }
88 /**
89 * \brief Creates new instance of item properties widget
90 *
91 */
92 GtkWidget *
93 sp_item_widget_new (void)
94 {
96 GtkWidget *spw, *vb, *t, *cb, *l, *f, *tf, *pb;
97 GtkTextBuffer *desc_buffer;
99 GtkTooltips *tt = gtk_tooltips_new();
101 /* Create container widget */
102 spw = sp_widget_new_global (INKSCAPE);
103 gtk_signal_connect ( GTK_OBJECT (spw), "modify_selection",
104 GTK_SIGNAL_FUNC (sp_item_widget_modify_selection),
105 spw );
106 gtk_signal_connect ( GTK_OBJECT (spw), "change_selection",
107 GTK_SIGNAL_FUNC (sp_item_widget_change_selection),
108 spw );
110 vb = gtk_vbox_new (FALSE, 0);
111 gtk_container_add (GTK_CONTAINER (spw), vb);
113 t = gtk_table_new (3, 4, FALSE);
114 gtk_container_set_border_width(GTK_CONTAINER(t), 4);
115 gtk_table_set_row_spacings (GTK_TABLE (t), 4);
116 gtk_table_set_col_spacings (GTK_TABLE (t), 4);
117 gtk_box_pack_start (GTK_BOX (vb), t, TRUE, TRUE, 0);
120 /* Create the label for the object id */
121 l = gtk_label_new_with_mnemonic (_("_Id"));
122 gtk_misc_set_alignment (GTK_MISC (l), 1, 0.5);
123 gtk_table_attach ( GTK_TABLE (t), l, 0, 1, 0, 1,
124 (GtkAttachOptions)( GTK_SHRINK | GTK_FILL ),
125 (GtkAttachOptions)0, 0, 0 );
126 gtk_object_set_data (GTK_OBJECT (spw), "id_label", l);
128 /* Create the entry box for the object id */
129 tf = gtk_entry_new ();
130 gtk_tooltips_set_tip (tt, tf, _("The id= attribute (only letters, digits, and the characters .-_: allowed)"), NULL);
131 gtk_entry_set_max_length (GTK_ENTRY (tf), 64);
132 gtk_table_attach ( GTK_TABLE (t), tf, 1, 2, 0, 1,
133 (GtkAttachOptions)( GTK_EXPAND | GTK_FILL ),
134 (GtkAttachOptions)0, 0, 0 );
135 gtk_object_set_data (GTK_OBJECT (spw), "id", tf);
136 gtk_label_set_mnemonic_widget (GTK_LABEL(l), tf);
138 // pressing enter in the id field is the same as clicking Set:
139 g_signal_connect ( G_OBJECT (tf), "activate", G_CALLBACK (sp_item_widget_label_changed), spw);
140 // focus is in the id field initially:
141 gtk_widget_grab_focus (GTK_WIDGET (tf));
143 /* Button for setting the object's id, label, title and description. */
144 pb = gtk_button_new_with_mnemonic (_("_Set"));
145 gtk_table_attach ( GTK_TABLE (t), pb, 2, 3, 0, 1,
146 (GtkAttachOptions)( GTK_SHRINK | GTK_FILL ),
147 (GtkAttachOptions)0, 0, 0 );
148 gtk_signal_connect ( GTK_OBJECT (pb), "clicked",
149 GTK_SIGNAL_FUNC (sp_item_widget_label_changed),
150 spw );
152 /* Create the label for the object label */
153 l = gtk_label_new_with_mnemonic (_("_Label"));
154 gtk_misc_set_alignment (GTK_MISC (l), 1, 0.5);
155 gtk_table_attach ( GTK_TABLE (t), l, 0, 1, 1, 2,
156 (GtkAttachOptions)( GTK_SHRINK | GTK_FILL ),
157 (GtkAttachOptions)0, 0, 0 );
158 gtk_object_set_data (GTK_OBJECT (spw), "label_label", l);
160 /* Create the entry box for the object label */
161 tf = gtk_entry_new ();
162 gtk_tooltips_set_tip (tt, tf, _("A freeform label for the object"), NULL);
163 gtk_entry_set_max_length (GTK_ENTRY (tf), 256);
164 gtk_table_attach ( GTK_TABLE (t), tf, 1, 2, 1, 2,
165 (GtkAttachOptions)( GTK_EXPAND | GTK_FILL ),
166 (GtkAttachOptions)0, 0, 0 );
167 gtk_object_set_data (GTK_OBJECT (spw), "label", tf);
168 gtk_label_set_mnemonic_widget (GTK_LABEL(l), tf);
170 // pressing enter in the label field is the same as clicking Set:
171 g_signal_connect ( G_OBJECT (tf), "activate", G_CALLBACK (sp_item_widget_label_changed), spw);
173 /* Create the label for the object title */
174 l = gtk_label_new_with_mnemonic (_("_Title"));
175 gtk_misc_set_alignment (GTK_MISC (l), 1, 0.5);
176 gtk_table_attach ( GTK_TABLE (t), l, 0, 1, 2, 3,
177 (GtkAttachOptions)( GTK_SHRINK | GTK_FILL ),
178 (GtkAttachOptions)0, 0, 0 );
179 gtk_object_set_data (GTK_OBJECT (spw), "title_label", l);
181 /* Create the entry box for the object title */
182 tf = gtk_entry_new ();
183 gtk_widget_set_sensitive (GTK_WIDGET (tf), FALSE);
184 gtk_entry_set_max_length (GTK_ENTRY (tf), 256);
185 gtk_table_attach ( GTK_TABLE (t), tf, 1, 3, 2, 3,
186 (GtkAttachOptions)( GTK_EXPAND | GTK_FILL ),
187 (GtkAttachOptions)0, 0, 0 );
188 gtk_object_set_data (GTK_OBJECT (spw), "title", tf);
189 gtk_label_set_mnemonic_widget (GTK_LABEL(l), tf);
191 /* Create the frame for the object description */
192 l = gtk_label_new_with_mnemonic (_("_Description"));
193 f = gtk_frame_new (NULL);
194 gtk_frame_set_label_widget (GTK_FRAME (f),l);
195 gtk_table_attach ( GTK_TABLE (t), f, 0, 3, 3, 4,
196 (GtkAttachOptions)( GTK_EXPAND | GTK_FILL ),
197 (GtkAttachOptions)( GTK_EXPAND | GTK_FILL ), 0, 0 );
199 /* Create the text view box for the object description */
200 GtkWidget *textframe = gtk_frame_new(NULL);
201 gtk_container_set_border_width(GTK_CONTAINER(textframe), 4);
202 gtk_widget_set_sensitive (GTK_WIDGET (textframe), FALSE);
203 gtk_container_add (GTK_CONTAINER (f), textframe);
204 gtk_frame_set_shadow_type (GTK_FRAME (textframe), GTK_SHADOW_IN);
205 gtk_object_set_data(GTK_OBJECT(spw), "desc_frame", textframe);
207 tf = gtk_text_view_new();
208 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(tf), GTK_WRAP_WORD);
209 desc_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(tf));
210 gtk_text_buffer_set_text(desc_buffer, "", -1);
211 gtk_container_add (GTK_CONTAINER (textframe), tf);
212 gtk_object_set_data (GTK_OBJECT (spw), "desc", tf);
213 gtk_label_set_mnemonic_widget (GTK_LABEL (gtk_frame_get_label_widget (GTK_FRAME (f))), tf);
215 /* Check boxes */
216 GtkWidget *hb_cb = gtk_hbox_new (FALSE, 0);
217 gtk_box_pack_start (GTK_BOX (vb), hb_cb, FALSE, FALSE, 0);
218 t = gtk_table_new (1, 2, TRUE);
219 gtk_container_set_border_width(GTK_CONTAINER(t), 0);
220 gtk_box_pack_start (GTK_BOX (hb_cb), t, TRUE, TRUE, 10);
222 /* Hide */
223 cb = gtk_check_button_new_with_mnemonic (_("_Hide"));
224 gtk_tooltips_set_tip (tt, cb, _("Check to make the object invisible"), NULL);
225 gtk_table_attach ( GTK_TABLE (t), cb, 0, 1, 0, 1,
226 (GtkAttachOptions)( GTK_EXPAND | GTK_FILL ),
227 (GtkAttachOptions)0, 0, 0 );
228 g_signal_connect (G_OBJECT(cb), "toggled", G_CALLBACK(sp_item_widget_hidden_toggled), spw);
229 gtk_object_set_data(GTK_OBJECT(spw), "hidden", cb);
231 /* Lock */
232 // TRANSLATORS: "Lock" is a verb here
233 cb = gtk_check_button_new_with_mnemonic (_("L_ock"));
234 gtk_tooltips_set_tip (tt, cb, _("Check to make the object insensitive (not selectable by mouse)"), NULL);
235 gtk_table_attach ( GTK_TABLE (t), cb, 1, 2, 0, 1,
236 (GtkAttachOptions)( GTK_EXPAND | GTK_FILL ),
237 (GtkAttachOptions)0, 0, 0 );
238 gtk_signal_connect ( GTK_OBJECT (cb), "toggled",
239 GTK_SIGNAL_FUNC (sp_item_widget_sensitivity_toggled),
240 spw );
241 gtk_object_set_data (GTK_OBJECT (spw), "sensitive", cb);
243 gtk_widget_show_all (spw);
245 sp_item_widget_setup (SP_WIDGET (spw), sp_desktop_selection (SP_ACTIVE_DESKTOP));
247 return (GtkWidget *) spw;
249 } //end of sp_item_widget_new()
253 static void
254 sp_item_widget_modify_selection( SPWidget *spw,
255 Inkscape::Selection *selection,
256 guint /*flags*/,
257 GtkWidget */*itemw*/ )
258 {
259 sp_item_widget_setup (spw, selection);
260 }
264 static void
265 sp_item_widget_change_selection ( SPWidget *spw,
266 Inkscape::Selection *selection,
267 GtkWidget */*itemw*/ )
268 {
269 sp_item_widget_setup (spw, selection);
270 }
273 /**
274 * \param selection Selection to use; should not be NULL.
275 */
276 static void
277 sp_item_widget_setup ( SPWidget *spw, Inkscape::Selection *selection )
278 {
279 g_assert (selection != NULL);
281 if (gtk_object_get_data (GTK_OBJECT (spw), "blocked"))
282 return;
284 if (!selection->singleItem()) {
285 gtk_widget_set_sensitive (GTK_WIDGET (spw), FALSE);
286 return;
287 } else {
288 gtk_widget_set_sensitive (GTK_WIDGET (spw), TRUE);
289 }
291 gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (TRUE));
293 SPItem *item = selection->singleItem();
295 /* Sensitive */
296 GtkWidget *w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "sensitive"));
297 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), item->isLocked());
299 /* Hidden */
300 w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "hidden"));
301 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), item->isExplicitlyHidden());
303 if (SP_OBJECT_IS_CLONED (item)) {
305 /* ID */
306 w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "id"));
307 gtk_entry_set_text (GTK_ENTRY (w), "");
308 gtk_widget_set_sensitive (w, FALSE);
309 w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "id_label"));
310 gtk_label_set_text (GTK_LABEL (w), _("Ref"));
312 /* Label */
313 w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "label"));
314 gtk_entry_set_text (GTK_ENTRY (w), "");
315 gtk_widget_set_sensitive (w, FALSE);
316 w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "label_label"));
317 gtk_label_set_text (GTK_LABEL (w), _("Ref"));
319 } else {
320 SPObject *obj = (SPObject*)item;
322 /* ID */
323 w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "id"));
324 gtk_entry_set_text (GTK_ENTRY (w), obj->id);
325 gtk_widget_set_sensitive (w, TRUE);
326 w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "id_label"));
327 gtk_label_set_markup_with_mnemonic (GTK_LABEL (w), _("_Id"));
329 /* Label */
330 w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "label"));
331 gtk_entry_set_text (GTK_ENTRY (w), obj->defaultLabel());
332 gtk_widget_set_sensitive (w, TRUE);
334 /* Title */
335 w = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "title"));
336 gchar *title = obj->title();
337 if (title) {
338 gtk_entry_set_text(GTK_ENTRY(w), title);
339 g_free(title);
340 }
341 else gtk_entry_set_text(GTK_ENTRY(w), "");
342 gtk_widget_set_sensitive(w, TRUE);
344 /* Description */
345 w = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "desc"));
346 GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(w));
347 gchar *desc = obj->desc();
348 if (desc) {
349 gtk_text_buffer_set_text(buf, desc, -1);
350 g_free(desc);
351 } else {
352 gtk_text_buffer_set_text(buf, "", 0);
353 }
354 w = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "desc_frame"));
355 gtk_widget_set_sensitive(w, TRUE);
356 }
358 gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (FALSE));
361 } // end of sp_item_widget_setup()
365 static void
366 sp_item_widget_sensitivity_toggled (GtkWidget *widget, SPWidget *spw)
367 {
368 if (gtk_object_get_data (GTK_OBJECT (spw), "blocked"))
369 return;
371 SPItem *item = sp_desktop_selection(SP_ACTIVE_DESKTOP)->singleItem();
372 g_return_if_fail (item != NULL);
374 gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (TRUE));
376 item->setLocked(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
378 sp_document_done (SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
379 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))? _("Lock object") : _("Unlock object"));
381 gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (FALSE));
382 }
384 void
385 sp_item_widget_hidden_toggled(GtkWidget *widget, SPWidget *spw)
386 {
387 if (gtk_object_get_data (GTK_OBJECT (spw), "blocked"))
388 return;
390 SPItem *item = sp_desktop_selection(SP_ACTIVE_DESKTOP)->singleItem();
391 g_return_if_fail (item != NULL);
393 gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (TRUE));
395 item->setExplicitlyHidden(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
397 sp_document_done (SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
398 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))? _("Hide object") : _("Unhide object"));
400 gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (FALSE));
401 }
403 static void
404 sp_item_widget_label_changed( GtkWidget */*widget*/, SPWidget *spw )
405 {
406 if (gtk_object_get_data (GTK_OBJECT (spw), "blocked"))
407 return;
409 SPItem *item = sp_desktop_selection(SP_ACTIVE_DESKTOP)->singleItem();
410 g_return_if_fail (item != NULL);
412 gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (TRUE));
414 /* Retrieve the label widget for the object's id */
415 GtkWidget *id_entry = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "id"));
416 gchar *id = (gchar *) gtk_entry_get_text (GTK_ENTRY (id_entry));
417 g_strcanon (id, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.:", '_');
418 GtkWidget *id_label = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "id_label"));
419 if (!strcmp (id, SP_OBJECT_ID(item))) {
420 gtk_label_set_markup_with_mnemonic (GTK_LABEL (id_label), _("_Id"));
421 } else if (!*id || !isalnum (*id)) {
422 gtk_label_set_text (GTK_LABEL (id_label), _("Id invalid! "));
423 } else if (SP_ACTIVE_DOCUMENT->getObjectById(id) != NULL) {
424 gtk_label_set_text (GTK_LABEL (id_label), _("Id exists! "));
425 } else {
426 SPException ex;
427 gtk_label_set_markup_with_mnemonic (GTK_LABEL (id_label), _("_Id"));
428 SP_EXCEPTION_INIT (&ex);
429 sp_object_setAttribute (SP_OBJECT (item), "id", id, &ex);
430 sp_document_done (SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
431 _("Set object ID"));
432 }
434 /* Retrieve the label widget for the object's label */
435 GtkWidget *label_entry = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "label"));
436 gchar *label = (gchar *)gtk_entry_get_text (GTK_ENTRY (label_entry));
437 g_assert(label != NULL);
439 /* Give feedback on success of setting the drawing object's label
440 * using the widget's label text
441 */
442 SPObject *obj = (SPObject*)item;
443 if (strcmp (label, obj->defaultLabel())) {
444 obj->setLabel(label);
445 sp_document_done (SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
446 _("Set object label"));
447 }
449 /* Retrieve the title */
450 GtkWidget *w = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "title"));
451 gchar *title = (gchar *)gtk_entry_get_text(GTK_ENTRY (w));
452 if (obj->setTitle(title))
453 sp_document_done(SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
454 _("Set object title"));
456 /* Retrieve the description */
457 GtkTextView *tv = GTK_TEXT_VIEW(gtk_object_get_data(GTK_OBJECT(spw), "desc"));
458 GtkTextBuffer *buf = gtk_text_view_get_buffer(tv);
459 GtkTextIter start, end;
460 gtk_text_buffer_get_bounds(buf, &start, &end);
461 gchar *desc = gtk_text_buffer_get_text(buf, &start, &end, TRUE);
462 if (obj->setDesc(desc))
463 sp_document_done(SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
464 _("Set object description"));
465 g_free(desc);
467 gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (FALSE));
469 } // end of sp_item_widget_label_changed()
472 /**
473 * \brief Dialog
474 *
475 */
476 void
477 sp_item_dialog (void)
478 {
479 if (dlg == NULL) {
481 gchar title[500];
482 sp_ui_dialog_title_string (Inkscape::Verb::get(SP_VERB_DIALOG_ITEM), title);
483 Inkscape::Preferences *prefs = Inkscape::Preferences::get();
485 dlg = sp_window_new (title, TRUE);
486 if (x == -1000 || y == -1000) {
487 x = prefs->getInt(prefs_path + "x", -1000);
488 y = prefs->getInt(prefs_path + "y", -1000);
489 }
490 if (w ==0 || h == 0) {
491 w = prefs->getInt(prefs_path + "w", 0);
492 h = prefs->getInt(prefs_path + "h", 0);
493 }
495 // if (x<0) x=0;
496 // if (y<0) y=0;
498 if (w && h) {
499 gtk_window_resize ((GtkWindow *) dlg, w, h);
500 }
501 if (x >= 0 && y >= 0 && (x < (gdk_screen_width()-MIN_ONSCREEN_DISTANCE)) && (y < (gdk_screen_height()-MIN_ONSCREEN_DISTANCE))) {
502 gtk_window_move ((GtkWindow *) dlg, x, y);
503 } else {
504 gtk_window_set_position(GTK_WINDOW(dlg), GTK_WIN_POS_CENTER);
505 }
508 sp_transientize (dlg);
509 wd.win = dlg;
510 wd.stop = 0;
512 g_signal_connect ( G_OBJECT (INKSCAPE), "activate_desktop", G_CALLBACK (sp_transientize_callback), &wd);
513 gtk_signal_connect ( GTK_OBJECT (dlg), "event", GTK_SIGNAL_FUNC (sp_dialog_event_handler), dlg);
514 gtk_signal_connect ( GTK_OBJECT (dlg), "destroy", G_CALLBACK (sp_item_dialog_destroy), dlg);
515 gtk_signal_connect ( GTK_OBJECT (dlg), "delete_event", G_CALLBACK (sp_item_dialog_delete), dlg);
516 g_signal_connect ( G_OBJECT (INKSCAPE), "shut_down", G_CALLBACK (sp_item_dialog_delete), dlg);
517 g_signal_connect ( G_OBJECT (INKSCAPE), "dialogs_hide", G_CALLBACK (sp_dialog_hide), dlg);
518 g_signal_connect ( G_OBJECT (INKSCAPE), "dialogs_unhide", G_CALLBACK (sp_dialog_unhide), dlg);
520 // Dialog-specific stuff
521 GtkWidget *itemw = sp_item_widget_new ();
522 gtk_widget_show (itemw);
523 gtk_container_add (GTK_CONTAINER (dlg), itemw);
525 }
527 gtk_window_present ((GtkWindow *) dlg);
528 }
531 /*
532 Local Variables:
533 mode:c++
534 c-file-style:"stroustrup"
535 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
536 indent-tabs-mode:nil
537 fill-column:99
538 End:
539 */
540 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :