8b5ac1784ce9bd29d59b9f22147c572ea5406b5f
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 * Abhishek Sharma
9 *
10 * Copyright (C) 1999-2006 Authors
11 * Copyright (C) 2001 Ximian, Inc.
12 *
13 * Released under GNU GPL, read the file 'COPYING' for more information
14 */
16 #ifdef HAVE_CONFIG_H
17 # include "config.h"
18 #endif
19 #include <gtk/gtkvbox.h>
20 #include <gtk/gtkhbox.h>
21 #include <gtk/gtktable.h>
22 #include <gtk/gtkcheckbutton.h>
23 #include <gtk/gtk.h>
24 #include <gtk/gtklabel.h>
25 #include <gtk/gtkframe.h>
26 #include <gtk/gtkexpander.h>
27 #include <gtk/gtktextview.h>
28 #include <gtk/gtktooltips.h>
30 #include "../desktop-handles.h"
31 #include "dialog-events.h"
32 #include "../document.h"
33 #include <glibmm/i18n.h>
34 #include "../helper/window.h"
35 #include "../inkscape.h"
36 #include "../interface.h"
37 #include "../macros.h"
38 #include "../preferences.h"
39 #include "../selection.h"
40 #include "../sp-item.h"
41 #include "../verbs.h"
42 #include "../widgets/sp-attribute-widget.h"
43 #include "../widgets/sp-widget.h"
45 using Inkscape::DocumentUndo;
47 #define MIN_ONSCREEN_DISTANCE 50
49 static GtkWidget *dlg = NULL;
50 static win_data wd;
52 // impossible original values to make sure they are read from prefs
53 static gint x = -1000, y = -1000, w = 0, h = 0;
54 static Glib::ustring const prefs_path = "/dialogs/object/";
56 static void sp_item_widget_modify_selection (SPWidget *spw, Inkscape::Selection *selection, guint flags, GtkWidget *itemw);
57 static void sp_item_widget_change_selection (SPWidget *spw, Inkscape::Selection *selection, GtkWidget *itemw);
58 static void sp_item_widget_setup (SPWidget *spw, Inkscape::Selection *selection);
59 static void sp_item_widget_sensitivity_toggled (GtkWidget *widget, SPWidget *spw);
60 static void sp_item_widget_hidden_toggled (GtkWidget *widget, SPWidget *spw);
61 static void sp_item_widget_label_changed (GtkWidget *widget, SPWidget *spw);
63 static void
64 sp_item_dialog_destroy( GtkObject */*object*/, gpointer /*data*/ )
65 {
66 sp_signal_disconnect_by_data (INKSCAPE, dlg);
67 wd.win = dlg = NULL;
68 wd.stop = 0;
69 }
71 static gboolean
72 sp_item_dialog_delete( GtkObject */*object*/, GdkEvent */*event*/, gpointer /*data*/ )
73 {
74 gtk_window_get_position ((GtkWindow *) dlg, &x, &y);
75 gtk_window_get_size ((GtkWindow *) dlg, &w, &h);
77 if (x<0) x=0;
78 if (y<0) y=0;
80 Inkscape::Preferences *prefs = Inkscape::Preferences::get();
81 prefs->setInt(prefs_path + "x", x);
82 prefs->setInt(prefs_path + "y", y);
83 prefs->setInt(prefs_path + "w", w);
84 prefs->setInt(prefs_path + "h", h);
86 return FALSE; // which means, go ahead and destroy it
88 }
90 /**
91 * \brief Creates new instance of item properties widget
92 *
93 */
94 GtkWidget *
95 sp_item_widget_new (void)
96 {
98 GtkWidget *spw, *vb, *t, *cb, *l, *f, *tf, *pb, *int_expander, *int_label;
99 GtkTextBuffer *desc_buffer;
101 GtkTooltips *tt = gtk_tooltips_new();
103 /* Create container widget */
104 spw = sp_widget_new_global (INKSCAPE);
105 gtk_signal_connect ( GTK_OBJECT (spw), "modify_selection",
106 GTK_SIGNAL_FUNC (sp_item_widget_modify_selection),
107 spw );
108 gtk_signal_connect ( GTK_OBJECT (spw), "change_selection",
109 GTK_SIGNAL_FUNC (sp_item_widget_change_selection),
110 spw );
112 vb = gtk_vbox_new (FALSE, 0);
113 gtk_container_add (GTK_CONTAINER (spw), vb);
115 t = gtk_table_new (3, 4, FALSE);
116 gtk_container_set_border_width(GTK_CONTAINER(t), 4);
117 gtk_table_set_row_spacings (GTK_TABLE (t), 4);
118 gtk_table_set_col_spacings (GTK_TABLE (t), 4);
119 gtk_box_pack_start (GTK_BOX (vb), t, TRUE, TRUE, 0);
122 /* Create the label for the object id */
123 l = gtk_label_new_with_mnemonic (_("_ID:"));
124 gtk_misc_set_alignment (GTK_MISC (l), 1, 0.5);
125 gtk_table_attach ( GTK_TABLE (t), l, 0, 1, 0, 1,
126 (GtkAttachOptions)( GTK_SHRINK | GTK_FILL ),
127 (GtkAttachOptions)0, 0, 0 );
128 gtk_object_set_data (GTK_OBJECT (spw), "id_label", l);
130 /* Create the entry box for the object id */
131 tf = gtk_entry_new ();
132 gtk_tooltips_set_tip (tt, tf, _("The id= attribute (only letters, digits, and the characters .-_: allowed)"), NULL);
133 gtk_entry_set_max_length (GTK_ENTRY (tf), 64);
134 gtk_table_attach ( GTK_TABLE (t), tf, 1, 2, 0, 1,
135 (GtkAttachOptions)( GTK_EXPAND | GTK_FILL ),
136 (GtkAttachOptions)0, 0, 0 );
137 gtk_object_set_data (GTK_OBJECT (spw), "id", tf);
138 gtk_label_set_mnemonic_widget (GTK_LABEL(l), tf);
140 // pressing enter in the id field is the same as clicking Set:
141 g_signal_connect ( G_OBJECT (tf), "activate", G_CALLBACK (sp_item_widget_label_changed), spw);
142 // focus is in the id field initially:
143 gtk_widget_grab_focus (GTK_WIDGET (tf));
145 /* Button for setting the object's id, label, title and description. */
146 pb = gtk_button_new_with_mnemonic (_("_Set"));
147 gtk_table_attach ( GTK_TABLE (t), pb, 2, 3, 0, 1,
148 (GtkAttachOptions)( GTK_SHRINK | GTK_FILL ),
149 (GtkAttachOptions)0, 0, 0 );
150 gtk_signal_connect ( GTK_OBJECT (pb), "clicked",
151 GTK_SIGNAL_FUNC (sp_item_widget_label_changed),
152 spw );
154 /* Create the label for the object label */
155 l = gtk_label_new_with_mnemonic (_("_Label:"));
156 gtk_misc_set_alignment (GTK_MISC (l), 1, 0.5);
157 gtk_table_attach ( GTK_TABLE (t), l, 0, 1, 1, 2,
158 (GtkAttachOptions)( GTK_SHRINK | GTK_FILL ),
159 (GtkAttachOptions)0, 0, 0 );
160 gtk_object_set_data (GTK_OBJECT (spw), "label_label", l);
162 /* Create the entry box for the object label */
163 tf = gtk_entry_new ();
164 gtk_tooltips_set_tip (tt, tf, _("A freeform label for the object"), NULL);
165 gtk_entry_set_max_length (GTK_ENTRY (tf), 256);
166 gtk_table_attach ( GTK_TABLE (t), tf, 1, 2, 1, 2,
167 (GtkAttachOptions)( GTK_EXPAND | GTK_FILL ),
168 (GtkAttachOptions)0, 0, 0 );
169 gtk_object_set_data (GTK_OBJECT (spw), "label", tf);
170 gtk_label_set_mnemonic_widget (GTK_LABEL(l), tf);
172 // pressing enter in the label field is the same as clicking Set:
173 g_signal_connect ( G_OBJECT (tf), "activate", G_CALLBACK (sp_item_widget_label_changed), spw);
175 /* Create the label for the object title */
176 l = gtk_label_new_with_mnemonic (_("_Title:"));
177 gtk_misc_set_alignment (GTK_MISC (l), 1, 0.5);
178 gtk_table_attach ( GTK_TABLE (t), l, 0, 1, 2, 3,
179 (GtkAttachOptions)( GTK_SHRINK | GTK_FILL ),
180 (GtkAttachOptions)0, 0, 0 );
181 gtk_object_set_data (GTK_OBJECT (spw), "title_label", l);
183 /* Create the entry box for the object title */
184 tf = gtk_entry_new ();
185 gtk_widget_set_sensitive (GTK_WIDGET (tf), FALSE);
186 gtk_entry_set_max_length (GTK_ENTRY (tf), 256);
187 gtk_table_attach ( GTK_TABLE (t), tf, 1, 3, 2, 3,
188 (GtkAttachOptions)( GTK_EXPAND | GTK_FILL ),
189 (GtkAttachOptions)0, 0, 0 );
190 gtk_object_set_data (GTK_OBJECT (spw), "title", tf);
191 gtk_label_set_mnemonic_widget (GTK_LABEL(l), tf);
193 /* Create the frame for the object description */
194 l = gtk_label_new_with_mnemonic (_("_Description"));
195 f = gtk_frame_new (NULL);
196 gtk_frame_set_label_widget (GTK_FRAME (f),l);
197 gtk_table_attach ( GTK_TABLE (t), f, 0, 3, 3, 4,
198 (GtkAttachOptions)( GTK_EXPAND | GTK_FILL ),
199 (GtkAttachOptions)( GTK_EXPAND | GTK_FILL ), 0, 0 );
201 /* Create the text view box for the object description */
202 GtkWidget *textframe = gtk_frame_new(NULL);
203 gtk_container_set_border_width(GTK_CONTAINER(textframe), 4);
204 gtk_widget_set_sensitive (GTK_WIDGET (textframe), FALSE);
205 gtk_container_add (GTK_CONTAINER (f), textframe);
206 gtk_frame_set_shadow_type (GTK_FRAME (textframe), GTK_SHADOW_IN);
207 gtk_object_set_data(GTK_OBJECT(spw), "desc_frame", textframe);
209 tf = gtk_text_view_new();
210 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(tf), GTK_WRAP_WORD);
211 desc_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(tf));
212 gtk_text_buffer_set_text(desc_buffer, "", -1);
213 gtk_container_add (GTK_CONTAINER (textframe), tf);
214 gtk_object_set_data (GTK_OBJECT (spw), "desc", tf);
215 gtk_label_set_mnemonic_widget (GTK_LABEL (gtk_frame_get_label_widget (GTK_FRAME (f))), tf);
217 /* Check boxes */
218 GtkWidget *hb_cb = gtk_hbox_new (FALSE, 0);
219 gtk_box_pack_start (GTK_BOX (vb), hb_cb, FALSE, FALSE, 0);
220 t = gtk_table_new (1, 2, TRUE);
221 gtk_container_set_border_width(GTK_CONTAINER(t), 0);
222 gtk_box_pack_start (GTK_BOX (hb_cb), t, TRUE, TRUE, 10);
224 /* Hide */
225 cb = gtk_check_button_new_with_mnemonic (_("_Hide"));
226 gtk_tooltips_set_tip (tt, cb, _("Check to make the object invisible"), NULL);
227 gtk_table_attach ( GTK_TABLE (t), cb, 0, 1, 0, 1,
228 (GtkAttachOptions)( GTK_EXPAND | GTK_FILL ),
229 (GtkAttachOptions)0, 0, 0 );
230 g_signal_connect (G_OBJECT(cb), "toggled", G_CALLBACK(sp_item_widget_hidden_toggled), spw);
231 gtk_object_set_data(GTK_OBJECT(spw), "hidden", cb);
233 /* Lock */
234 // TRANSLATORS: "Lock" is a verb here
235 cb = gtk_check_button_new_with_mnemonic (_("L_ock"));
236 gtk_tooltips_set_tip (tt, cb, _("Check to make the object insensitive (not selectable by mouse)"), NULL);
237 gtk_table_attach ( GTK_TABLE (t), cb, 1, 2, 0, 1,
238 (GtkAttachOptions)( GTK_EXPAND | GTK_FILL ),
239 (GtkAttachOptions)0, 0, 0 );
240 gtk_signal_connect ( GTK_OBJECT (cb), "toggled",
241 GTK_SIGNAL_FUNC (sp_item_widget_sensitivity_toggled),
242 spw );
243 gtk_object_set_data (GTK_OBJECT (spw), "sensitive", cb);
245 /* Create the frame for interactivity options */
246 int_label = gtk_label_new_with_mnemonic (_("_Interactivity"));
247 int_expander = gtk_expander_new (NULL);
248 gtk_expander_set_label_widget (GTK_EXPANDER (int_expander),int_label);
249 gtk_object_set_data (GTK_OBJECT (spw), "interactivity", int_expander);
251 gtk_box_pack_start (GTK_BOX (vb), int_expander, FALSE, FALSE, 0);
253 gtk_widget_show_all (spw);
255 sp_item_widget_setup (SP_WIDGET (spw), sp_desktop_selection (SP_ACTIVE_DESKTOP));
257 return (GtkWidget *) spw;
259 } //end of sp_item_widget_new()
263 static void
264 sp_item_widget_modify_selection( SPWidget *spw,
265 Inkscape::Selection *selection,
266 guint /*flags*/,
267 GtkWidget */*itemw*/ )
268 {
269 sp_item_widget_setup (spw, selection);
270 }
274 static void
275 sp_item_widget_change_selection ( SPWidget *spw,
276 Inkscape::Selection *selection,
277 GtkWidget */*itemw*/ )
278 {
279 sp_item_widget_setup (spw, selection);
280 }
283 /**
284 * \param selection Selection to use; should not be NULL.
285 */
286 static void
287 sp_item_widget_setup ( SPWidget *spw, Inkscape::Selection *selection )
288 {
289 g_assert (selection != NULL);
291 if (gtk_object_get_data (GTK_OBJECT (spw), "blocked"))
292 return;
294 if (!selection->singleItem()) {
295 gtk_widget_set_sensitive (GTK_WIDGET (spw), FALSE);
296 return;
297 } else {
298 gtk_widget_set_sensitive (GTK_WIDGET (spw), TRUE);
299 }
301 gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (TRUE));
303 SPItem *item = selection->singleItem();
305 /* Sensitive */
306 GtkWidget *w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "sensitive"));
307 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), item->isLocked());
309 /* Hidden */
310 w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "hidden"));
311 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), item->isExplicitlyHidden());
313 if (SP_OBJECT_IS_CLONED (item)) {
315 /* ID */
316 w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "id"));
317 gtk_entry_set_text (GTK_ENTRY (w), "");
318 gtk_widget_set_sensitive (w, FALSE);
319 w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "id_label"));
320 gtk_label_set_text (GTK_LABEL (w), _("Ref"));
322 /* Label */
323 w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "label"));
324 gtk_entry_set_text (GTK_ENTRY (w), "");
325 gtk_widget_set_sensitive (w, FALSE);
326 w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "label_label"));
327 gtk_label_set_text (GTK_LABEL (w), _("Ref"));
329 } else {
330 SPObject *obj = (SPObject*)item;
332 /* ID */
333 w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "id"));
334 gtk_entry_set_text (GTK_ENTRY (w), obj->getId());
335 gtk_widget_set_sensitive (w, TRUE);
336 w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "id_label"));
337 gtk_label_set_markup_with_mnemonic (GTK_LABEL (w), _("_ID:"));
339 /* Label */
340 w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "label"));
341 gtk_entry_set_text (GTK_ENTRY (w), obj->defaultLabel());
342 gtk_widget_set_sensitive (w, TRUE);
344 /* Title */
345 w = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "title"));
346 gchar *title = obj->title();
347 if (title) {
348 gtk_entry_set_text(GTK_ENTRY(w), title);
349 g_free(title);
350 }
351 else gtk_entry_set_text(GTK_ENTRY(w), "");
352 gtk_widget_set_sensitive(w, TRUE);
354 /* Description */
355 w = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "desc"));
356 GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(w));
357 gchar *desc = obj->desc();
358 if (desc) {
359 gtk_text_buffer_set_text(buf, desc, -1);
360 g_free(desc);
361 } else {
362 gtk_text_buffer_set_text(buf, "", 0);
363 }
364 w = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "desc_frame"));
365 gtk_widget_set_sensitive(w, TRUE);
367 w = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "interactivity"));
369 GtkWidget* int_table = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "interactivity_table"));
370 if (int_table){
371 gtk_container_remove(GTK_CONTAINER(w), int_table);
372 }
374 const gchar* int_labels[10] = {"onclick", "onmouseover", "onmouseout", "onmousedown", "onmouseup", "onmousemove","onfocusin", "onfocusout", "onactivate", "onload"};
376 int_table = sp_attribute_table_new (obj, 10, int_labels, int_labels);
377 gtk_widget_show_all (int_table);
378 gtk_object_set_data(GTK_OBJECT(spw), "interactivity_table", int_table);
380 gtk_container_add (GTK_CONTAINER (w), int_table);
382 }
384 gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (FALSE));
387 } // end of sp_item_widget_setup()
391 static void
392 sp_item_widget_sensitivity_toggled (GtkWidget *widget, SPWidget *spw)
393 {
394 if (gtk_object_get_data (GTK_OBJECT (spw), "blocked"))
395 return;
397 SPItem *item = sp_desktop_selection(SP_ACTIVE_DESKTOP)->singleItem();
398 g_return_if_fail (item != NULL);
400 gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (TRUE));
402 item->setLocked(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
404 DocumentUndo::done(SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
405 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))? _("Lock object") : _("Unlock object"));
407 gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (FALSE));
408 }
410 void
411 sp_item_widget_hidden_toggled(GtkWidget *widget, SPWidget *spw)
412 {
413 if (gtk_object_get_data (GTK_OBJECT (spw), "blocked"))
414 return;
416 SPItem *item = sp_desktop_selection(SP_ACTIVE_DESKTOP)->singleItem();
417 g_return_if_fail (item != NULL);
419 gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (TRUE));
421 item->setExplicitlyHidden(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
423 DocumentUndo::done(SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
424 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))? _("Hide object") : _("Unhide object"));
426 gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (FALSE));
427 }
429 static void
430 sp_item_widget_label_changed( GtkWidget */*widget*/, SPWidget *spw )
431 {
432 if (gtk_object_get_data (GTK_OBJECT (spw), "blocked"))
433 return;
435 SPItem *item = sp_desktop_selection(SP_ACTIVE_DESKTOP)->singleItem();
436 g_return_if_fail (item != NULL);
438 gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (TRUE));
440 /* Retrieve the label widget for the object's id */
441 GtkWidget *id_entry = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "id"));
442 gchar *id = (gchar *) gtk_entry_get_text (GTK_ENTRY (id_entry));
443 g_strcanon (id, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.:", '_');
444 GtkWidget *id_label = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "id_label"));
445 if (!strcmp (id, item->getId())) {
446 gtk_label_set_markup_with_mnemonic (GTK_LABEL (id_label), _("_ID:"));
447 } else if (!*id || !isalnum (*id)) {
448 gtk_label_set_text (GTK_LABEL (id_label), _("Id invalid! "));
449 } else if (SP_ACTIVE_DOCUMENT->getObjectById(id) != NULL) {
450 gtk_label_set_text (GTK_LABEL (id_label), _("Id exists! "));
451 } else {
452 SPException ex;
453 gtk_label_set_markup_with_mnemonic (GTK_LABEL (id_label), _("_ID:"));
454 SP_EXCEPTION_INIT (&ex);
455 item->setAttribute("id", id, &ex);
456 DocumentUndo::done(SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
457 _("Set object ID"));
458 }
460 /* Retrieve the label widget for the object's label */
461 GtkWidget *label_entry = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "label"));
462 gchar *label = (gchar *)gtk_entry_get_text (GTK_ENTRY (label_entry));
463 g_assert(label != NULL);
465 /* Give feedback on success of setting the drawing object's label
466 * using the widget's label text
467 */
468 SPObject *obj = (SPObject*)item;
469 if (strcmp (label, obj->defaultLabel())) {
470 obj->setLabel(label);
471 DocumentUndo::done(SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
472 _("Set object label"));
473 }
475 /* Retrieve the title */
476 GtkWidget *w = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "title"));
477 gchar *title = (gchar *)gtk_entry_get_text(GTK_ENTRY (w));
478 if (obj->setTitle(title))
479 DocumentUndo::done(SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
480 _("Set object title"));
482 /* Retrieve the description */
483 GtkTextView *tv = GTK_TEXT_VIEW(gtk_object_get_data(GTK_OBJECT(spw), "desc"));
484 GtkTextBuffer *buf = gtk_text_view_get_buffer(tv);
485 GtkTextIter start, end;
486 gtk_text_buffer_get_bounds(buf, &start, &end);
487 gchar *desc = gtk_text_buffer_get_text(buf, &start, &end, TRUE);
488 if (obj->setDesc(desc))
489 DocumentUndo::done(SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
490 _("Set object description"));
491 g_free(desc);
493 gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (FALSE));
495 } // end of sp_item_widget_label_changed()
498 /**
499 * \brief Dialog
500 *
501 */
502 void
503 sp_item_dialog (void)
504 {
505 if (dlg == NULL) {
507 gchar title[500];
508 sp_ui_dialog_title_string (Inkscape::Verb::get(SP_VERB_DIALOG_ITEM), title);
509 Inkscape::Preferences *prefs = Inkscape::Preferences::get();
511 dlg = sp_window_new (title, TRUE);
512 if (x == -1000 || y == -1000) {
513 x = prefs->getInt(prefs_path + "x", -1000);
514 y = prefs->getInt(prefs_path + "y", -1000);
515 }
516 if (w ==0 || h == 0) {
517 w = prefs->getInt(prefs_path + "w", 0);
518 h = prefs->getInt(prefs_path + "h", 0);
519 }
521 // if (x<0) x=0;
522 // if (y<0) y=0;
524 if (w && h) {
525 gtk_window_resize ((GtkWindow *) dlg, w, h);
526 }
527 if (x >= 0 && y >= 0 && (x < (gdk_screen_width()-MIN_ONSCREEN_DISTANCE)) && (y < (gdk_screen_height()-MIN_ONSCREEN_DISTANCE))) {
528 gtk_window_move ((GtkWindow *) dlg, x, y);
529 } else {
530 gtk_window_set_position(GTK_WINDOW(dlg), GTK_WIN_POS_CENTER);
531 }
534 sp_transientize (dlg);
535 wd.win = dlg;
536 wd.stop = 0;
538 g_signal_connect ( G_OBJECT (INKSCAPE), "activate_desktop", G_CALLBACK (sp_transientize_callback), &wd);
539 gtk_signal_connect ( GTK_OBJECT (dlg), "event", GTK_SIGNAL_FUNC (sp_dialog_event_handler), dlg);
540 gtk_signal_connect ( GTK_OBJECT (dlg), "destroy", G_CALLBACK (sp_item_dialog_destroy), dlg);
541 gtk_signal_connect ( GTK_OBJECT (dlg), "delete_event", G_CALLBACK (sp_item_dialog_delete), dlg);
542 g_signal_connect ( G_OBJECT (INKSCAPE), "shut_down", G_CALLBACK (sp_item_dialog_delete), dlg);
543 g_signal_connect ( G_OBJECT (INKSCAPE), "dialogs_hide", G_CALLBACK (sp_dialog_hide), dlg);
544 g_signal_connect ( G_OBJECT (INKSCAPE), "dialogs_unhide", G_CALLBACK (sp_dialog_unhide), dlg);
546 // Dialog-specific stuff
547 GtkWidget *itemw = sp_item_widget_new ();
548 gtk_widget_show (itemw);
549 gtk_container_add (GTK_CONTAINER (dlg), itemw);
551 }
553 gtk_window_present ((GtkWindow *) dlg);
554 }
557 /*
558 Local Variables:
559 mode:c++
560 c-file-style:"stroustrup"
561 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
562 indent-tabs-mode:nil
563 fill-column:99
564 End:
565 */
566 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :