Code

now that selection description includes style (filtered, clipped), we need to update...
[inkscape.git] / src / dialogs / item-properties.cpp
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/gtkexpander.h>
26 #include <gtk/gtktextview.h>
27 #include <gtk/gtktooltips.h>
29 #include <glibmm/i18n.h>
30 #include "helper/window.h"
31 #include "../widgets/sp-widget.h"
32 #include "../inkscape.h"
33 #include "../document.h"
34 #include "../desktop-handles.h"
35 #include "../selection.h"
36 #include "../sp-item.h"
37 #include "../macros.h"
38 #include "../verbs.h"
39 #include "../interface.h"
40 #include "sp-attribute-widget.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, *int_expander, *int_label;
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     /* Create the frame for interactivity options */
244     int_label = gtk_label_new_with_mnemonic (_("_Interactivity"));
245     int_expander = gtk_expander_new (NULL);
246     gtk_expander_set_label_widget (GTK_EXPANDER (int_expander),int_label);
247     gtk_object_set_data (GTK_OBJECT (spw), "interactivity", int_expander);
249     gtk_box_pack_start (GTK_BOX (vb), int_expander, FALSE, FALSE, 0);
251     gtk_widget_show_all (spw);
253     sp_item_widget_setup (SP_WIDGET (spw), sp_desktop_selection (SP_ACTIVE_DESKTOP));
255     return (GtkWidget *) spw;
257 } //end of sp_item_widget_new()
261 static void
262 sp_item_widget_modify_selection( SPWidget *spw,
263                                  Inkscape::Selection *selection,
264                                  guint /*flags*/,
265                                  GtkWidget */*itemw*/ )
267     sp_item_widget_setup (spw, selection);
272 static void
273 sp_item_widget_change_selection ( SPWidget *spw,
274                                   Inkscape::Selection *selection,
275                                   GtkWidget */*itemw*/ )
277     sp_item_widget_setup (spw, selection);
281 /**
282 *  \param selection Selection to use; should not be NULL.
283 */
284 static void
285 sp_item_widget_setup ( SPWidget *spw, Inkscape::Selection *selection )
287     g_assert (selection != NULL);
289     if (gtk_object_get_data (GTK_OBJECT (spw), "blocked"))
290         return;
292     if (!selection->singleItem()) {
293         gtk_widget_set_sensitive (GTK_WIDGET (spw), FALSE);
294         return;
295     } else {
296         gtk_widget_set_sensitive (GTK_WIDGET (spw), TRUE);
297     }
299     gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (TRUE));
301     SPItem *item = selection->singleItem();
303     /* Sensitive */
304     GtkWidget *w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "sensitive"));
305     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), item->isLocked());
307     /* Hidden */
308     w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "hidden"));
309     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), item->isExplicitlyHidden());
311     if (SP_OBJECT_IS_CLONED (item)) {
313         /* ID */
314         w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "id"));
315         gtk_entry_set_text (GTK_ENTRY (w), "");
316         gtk_widget_set_sensitive (w, FALSE);
317         w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "id_label"));
318         gtk_label_set_text (GTK_LABEL (w), _("Ref"));
320         /* Label */
321         w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "label"));
322         gtk_entry_set_text (GTK_ENTRY (w), "");
323         gtk_widget_set_sensitive (w, FALSE);
324         w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "label_label"));
325         gtk_label_set_text (GTK_LABEL (w), _("Ref"));
327     } else {
328         SPObject *obj = (SPObject*)item;
330         /* ID */
331         w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "id"));
332         gtk_entry_set_text (GTK_ENTRY (w), obj->id);
333         gtk_widget_set_sensitive (w, TRUE);
334         w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "id_label"));
335         gtk_label_set_markup_with_mnemonic (GTK_LABEL (w), _("_Id"));
337         /* Label */
338         w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "label"));
339         gtk_entry_set_text (GTK_ENTRY (w), obj->defaultLabel());
340         gtk_widget_set_sensitive (w, TRUE);
342         /* Title */
343         w = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "title"));
344         gchar *title = obj->title();
345         if (title) {
346             gtk_entry_set_text(GTK_ENTRY(w), title);
347             g_free(title);
348         }
349         else gtk_entry_set_text(GTK_ENTRY(w), "");
350         gtk_widget_set_sensitive(w, TRUE);
352         /* Description */
353         w = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "desc"));
354         GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(w));
355         gchar *desc = obj->desc();
356         if (desc) {
357             gtk_text_buffer_set_text(buf, desc, -1);
358             g_free(desc);
359         } else {
360             gtk_text_buffer_set_text(buf, "", 0);
361         }
362         w = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "desc_frame"));
363         gtk_widget_set_sensitive(w, TRUE);
365         w = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "interactivity"));
367         GtkWidget* int_table = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "interactivity_table"));
368         if (int_table){
369             gtk_container_remove(GTK_CONTAINER(w), int_table);
370         }
372         const gchar* int_labels[10] = {"onclick", "onmouseover", "onmouseout", "onmousedown", "onmouseup", "onmousemove","onfocusin", "onfocusout", "onactivate", "onload"};
374         int_table = sp_attribute_table_new (obj, 10, int_labels, int_labels);
375         gtk_widget_show_all (int_table);
376         gtk_object_set_data(GTK_OBJECT(spw), "interactivity_table", int_table);
378         gtk_container_add (GTK_CONTAINER (w), int_table);
380     }
382     gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (FALSE));
385 } // end of sp_item_widget_setup()
389 static void
390 sp_item_widget_sensitivity_toggled (GtkWidget *widget, SPWidget *spw)
392     if (gtk_object_get_data (GTK_OBJECT (spw), "blocked"))
393         return;
395     SPItem *item = sp_desktop_selection(SP_ACTIVE_DESKTOP)->singleItem();
396     g_return_if_fail (item != NULL);
398     gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (TRUE));
400     item->setLocked(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
402     sp_document_done (SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
403              gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))? _("Lock object") : _("Unlock object"));
405     gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (FALSE));
408 void
409 sp_item_widget_hidden_toggled(GtkWidget *widget, SPWidget *spw)
411     if (gtk_object_get_data (GTK_OBJECT (spw), "blocked"))
412         return;
414     SPItem *item = sp_desktop_selection(SP_ACTIVE_DESKTOP)->singleItem();
415     g_return_if_fail (item != NULL);
417     gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (TRUE));
419     item->setExplicitlyHidden(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
421     sp_document_done (SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
422              gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))? _("Hide object") : _("Unhide object"));
424     gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (FALSE));
427 static void
428 sp_item_widget_label_changed( GtkWidget */*widget*/, SPWidget *spw )
430     if (gtk_object_get_data (GTK_OBJECT (spw), "blocked"))
431         return;
433     SPItem *item = sp_desktop_selection(SP_ACTIVE_DESKTOP)->singleItem();
434     g_return_if_fail (item != NULL);
436     gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (TRUE));
438     /* Retrieve the label widget for the object's id */
439     GtkWidget *id_entry = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "id"));
440     gchar *id = (gchar *) gtk_entry_get_text (GTK_ENTRY (id_entry));
441     g_strcanon (id, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.:", '_');
442     GtkWidget *id_label = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "id_label"));
443     if (!strcmp (id, SP_OBJECT_ID(item))) {
444         gtk_label_set_markup_with_mnemonic (GTK_LABEL (id_label), _("_Id"));
445     } else if (!*id || !isalnum (*id)) {
446         gtk_label_set_text (GTK_LABEL (id_label), _("Id invalid! "));
447     } else if (SP_ACTIVE_DOCUMENT->getObjectById(id) != NULL) {
448         gtk_label_set_text (GTK_LABEL (id_label), _("Id exists! "));
449     } else {
450         SPException ex;
451         gtk_label_set_markup_with_mnemonic (GTK_LABEL (id_label), _("_Id"));
452         SP_EXCEPTION_INIT (&ex);
453         sp_object_setAttribute (SP_OBJECT (item), "id", id, &ex);
454         sp_document_done (SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
455                                 _("Set object ID"));
456     }
458     /* Retrieve the label widget for the object's label */
459     GtkWidget *label_entry = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "label"));
460     gchar *label = (gchar *)gtk_entry_get_text (GTK_ENTRY (label_entry));
461     g_assert(label != NULL);
463     /* Give feedback on success of setting the drawing object's label
464      * using the widget's label text
465      */
466     SPObject *obj = (SPObject*)item;
467     if (strcmp (label, obj->defaultLabel())) {
468         obj->setLabel(label);
469         sp_document_done (SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
470                                 _("Set object label"));
471     }
473     /* Retrieve the title */
474     GtkWidget *w = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "title"));
475     gchar *title = (gchar *)gtk_entry_get_text(GTK_ENTRY (w));
476     if (obj->setTitle(title))
477         sp_document_done(SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
478                          _("Set object title"));
480     /* Retrieve the description */
481     GtkTextView *tv = GTK_TEXT_VIEW(gtk_object_get_data(GTK_OBJECT(spw), "desc"));
482     GtkTextBuffer *buf = gtk_text_view_get_buffer(tv);
483     GtkTextIter start, end;
484     gtk_text_buffer_get_bounds(buf, &start, &end);
485     gchar *desc = gtk_text_buffer_get_text(buf, &start, &end, TRUE);
486     if (obj->setDesc(desc))
487         sp_document_done(SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
488                          _("Set object description"));
489     g_free(desc);
491     gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (FALSE));
493 } // end of sp_item_widget_label_changed()
496 /**
497  * \brief  Dialog
498  *
499  */
500 void
501 sp_item_dialog (void)
503     if (dlg == NULL) {
505         gchar title[500];
506         sp_ui_dialog_title_string (Inkscape::Verb::get(SP_VERB_DIALOG_ITEM), title);
507         Inkscape::Preferences *prefs = Inkscape::Preferences::get();
509         dlg = sp_window_new (title, TRUE);
510         if (x == -1000 || y == -1000) {
511             x = prefs->getInt(prefs_path + "x", -1000);
512             y = prefs->getInt(prefs_path + "y", -1000);
513         }
514         if (w ==0 || h == 0) {
515             w = prefs->getInt(prefs_path + "w", 0);
516             h = prefs->getInt(prefs_path + "h", 0);
517         }
519 //        if (x<0) x=0;
520 //        if (y<0) y=0;
522         if (w && h) {
523             gtk_window_resize ((GtkWindow *) dlg, w, h);
524         }
525         if (x >= 0 && y >= 0 && (x < (gdk_screen_width()-MIN_ONSCREEN_DISTANCE)) && (y < (gdk_screen_height()-MIN_ONSCREEN_DISTANCE))) {
526             gtk_window_move ((GtkWindow *) dlg, x, y);
527         } else {
528             gtk_window_set_position(GTK_WINDOW(dlg), GTK_WIN_POS_CENTER);
529         }
532         sp_transientize (dlg);
533         wd.win = dlg;
534         wd.stop = 0;
536         g_signal_connect   ( G_OBJECT (INKSCAPE), "activate_desktop", G_CALLBACK (sp_transientize_callback), &wd);
537         gtk_signal_connect ( GTK_OBJECT (dlg), "event", GTK_SIGNAL_FUNC (sp_dialog_event_handler), dlg);
538         gtk_signal_connect ( GTK_OBJECT (dlg), "destroy", G_CALLBACK (sp_item_dialog_destroy), dlg);
539         gtk_signal_connect ( GTK_OBJECT (dlg), "delete_event", G_CALLBACK (sp_item_dialog_delete), dlg);
540         g_signal_connect   ( G_OBJECT (INKSCAPE), "shut_down", G_CALLBACK (sp_item_dialog_delete), dlg);
541         g_signal_connect   ( G_OBJECT (INKSCAPE), "dialogs_hide", G_CALLBACK (sp_dialog_hide), dlg);
542         g_signal_connect   ( G_OBJECT (INKSCAPE), "dialogs_unhide", G_CALLBACK (sp_dialog_unhide), dlg);
544         // Dialog-specific stuff
545         GtkWidget *itemw = sp_item_widget_new ();
546         gtk_widget_show (itemw);
547         gtk_container_add (GTK_CONTAINER (dlg), itemw);
549     }
551     gtk_window_present ((GtkWindow *) dlg);
555 /*
556   Local Variables:
557   mode:c++
558   c-file-style:"stroustrup"
559   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
560   indent-tabs-mode:nil
561   fill-column:99
562   End:
563 */
564 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :