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