Code

Super duper mega (fun!) commit: replaced encoding=utf-8 with fileencoding=utf-8 in...
[inkscape.git] / src / dialogs / item-properties.cpp
index 7a9b37dcf3acbeb1ad55c98ac3de9f54fe9ea231..40665e08ea5de165c092c9a29a241c4f25f8b59f 100644 (file)
@@ -1,13 +1,12 @@
-#define __SP_ITEM_PROPERTIES_C__
-
-/*
- * Object properties dialog
- *
- * Authors:
+/** @file
+ * @brief Object properties dialog
+ */
+/* Authors:
  *   Lauris Kaplinski <lauris@kaplinski.com>
  *   bulia byak <buliabyak@users.sf.net>
+ *   Johan Engelen <goejendaagh@zonnet.nl>
  *
- * Copyright (C) 1999-2005 Authors
+ * Copyright (C) 1999-2006 Authors
  * Copyright (C) 2001 Ximian, Inc.
  *
  * Released under GNU GPL, read the file 'COPYING' for more information
 #include <gtk/gtkhbox.h>
 #include <gtk/gtktable.h>
 #include <gtk/gtkcheckbutton.h>
-#include <gtk/gtkspinbutton.h>
+#include <gtk/gtk.h>
 #include <gtk/gtklabel.h>
 #include <gtk/gtkframe.h>
+#include <gtk/gtkexpander.h>
 #include <gtk/gtktextview.h>
 #include <gtk/gtktooltips.h>
 
+#include "../desktop-handles.h"
+#include "dialog-events.h"
+#include "../document.h"
 #include <glibmm/i18n.h>
-#include "helper/window.h"
-#include "../widgets/sp-widget.h"
+#include "../helper/window.h"
 #include "../inkscape.h"
-#include "../document.h"
-#include "../desktop-handles.h"
+#include "../interface.h"
+#include "../macros.h"
+#include "../preferences.h"
 #include "../selection.h"
 #include "../sp-item.h"
-#include "../macros.h"
 #include "../verbs.h"
-#include "../interface.h"
-
-#include "dialog-events.h"
-#include "../prefs-utils.h"
+#include "../widgets/sp-attribute-widget.h"
+#include "../widgets/sp-widget.h"
 
+#define MIN_ONSCREEN_DISTANCE 50
 
 static GtkWidget *dlg = NULL;
 static win_data wd;
 
 // impossible original values to make sure they are read from prefs
 static gint x = -1000, y = -1000, w = 0, h = 0;
-static gchar *prefs_path = "dialogs.object";
+static Glib::ustring const prefs_path = "/dialogs/object/";
 
 static void sp_item_widget_modify_selection (SPWidget *spw, Inkscape::Selection *selection, guint flags, GtkWidget *itemw);
 static void sp_item_widget_change_selection (SPWidget *spw, Inkscape::Selection *selection, GtkWidget *itemw);
@@ -57,7 +58,7 @@ static void sp_item_widget_hidden_toggled (GtkWidget *widget, SPWidget *spw);
 static void sp_item_widget_label_changed (GtkWidget *widget, SPWidget *spw);
 
 static void
-sp_item_dialog_destroy (GtkObject *object, gpointer data)
+sp_item_dialog_destroy( GtkObject */*object*/, gpointer /*data*/ )
 {
     sp_signal_disconnect_by_data (INKSCAPE, dlg);
     wd.win = dlg = NULL;
@@ -65,29 +66,33 @@ sp_item_dialog_destroy (GtkObject *object, gpointer data)
 }
 
 static gboolean
-sp_item_dialog_delete (GtkObject *object, GdkEvent *event, gpointer data)
+sp_item_dialog_delete( GtkObject */*object*/, GdkEvent */*event*/, gpointer /*data*/ )
 {
     gtk_window_get_position ((GtkWindow *) dlg, &x, &y);
     gtk_window_get_size ((GtkWindow *) dlg, &w, &h);
 
-    prefs_set_int_attribute (prefs_path, "x", x);
-    prefs_set_int_attribute (prefs_path, "y", y);
-    prefs_set_int_attribute (prefs_path, "w", w);
-    prefs_set_int_attribute (prefs_path, "h", h);
+    if (x<0) x=0;
+    if (y<0) y=0;
+
+    Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+    prefs->setInt(prefs_path + "x", x);
+    prefs->setInt(prefs_path + "y", y);
+    prefs->setInt(prefs_path + "w", w);
+    prefs->setInt(prefs_path + "h", h);
 
     return FALSE; // which means, go ahead and destroy it
 
-} 
+}
 
 /**
- * \brief  Creates new instance of item properties widget 
+ * \brief  Creates new instance of item properties widget
  *
  */
 GtkWidget *
 sp_item_widget_new (void)
 {
 
-    GtkWidget *spw, *vb, *t, *cb, *l, *f, *tf, *pb;
+    GtkWidget *spw, *vb, *t, *cb, *l, *f, *tf, *pb, *int_expander, *int_label;
     GtkTextBuffer *desc_buffer;
 
     GtkTooltips *tt = gtk_tooltips_new();
@@ -112,7 +117,7 @@ sp_item_widget_new (void)
 
 
     /* Create the label for the object id */
-    l = gtk_label_new_with_mnemonic (_("_Id"));
+    l = gtk_label_new_with_mnemonic (_("_ID:"));
     gtk_misc_set_alignment (GTK_MISC (l), 1, 0.5);
     gtk_table_attach ( GTK_TABLE (t), l, 0, 1, 0, 1,
                        (GtkAttachOptions)( GTK_SHRINK | GTK_FILL ),
@@ -144,7 +149,7 @@ sp_item_widget_new (void)
                          spw );
 
     /* Create the label for the object label */
-    l = gtk_label_new_with_mnemonic (_("_Label"));
+    l = gtk_label_new_with_mnemonic (_("_Label:"));
     gtk_misc_set_alignment (GTK_MISC (l), 1, 0.5);
     gtk_table_attach ( GTK_TABLE (t), l, 0, 1, 1, 2,
                        (GtkAttachOptions)( GTK_SHRINK | GTK_FILL ),
@@ -165,7 +170,7 @@ sp_item_widget_new (void)
     g_signal_connect ( G_OBJECT (tf), "activate", G_CALLBACK (sp_item_widget_label_changed), spw);
 
     /* Create the label for the object title */
-    l = gtk_label_new (_("Title"));
+    l = gtk_label_new_with_mnemonic (_("_Title:"));
     gtk_misc_set_alignment (GTK_MISC (l), 1, 0.5);
     gtk_table_attach ( GTK_TABLE (t), l, 0, 1, 2, 3,
                        (GtkAttachOptions)( GTK_SHRINK | GTK_FILL ),
@@ -180,13 +185,15 @@ sp_item_widget_new (void)
                        (GtkAttachOptions)( GTK_EXPAND | GTK_FILL ),
                        (GtkAttachOptions)0, 0, 0 );
     gtk_object_set_data (GTK_OBJECT (spw), "title", tf);
+    gtk_label_set_mnemonic_widget (GTK_LABEL(l), tf);
 
     /* Create the frame for the object description */
-    f = gtk_frame_new (_("Description"));
+    l = gtk_label_new_with_mnemonic (_("_Description"));
+    f = gtk_frame_new (NULL);
+    gtk_frame_set_label_widget (GTK_FRAME (f),l);
     gtk_table_attach ( GTK_TABLE (t), f, 0, 3, 3, 4,
                        (GtkAttachOptions)( GTK_EXPAND | GTK_FILL ),
                        (GtkAttachOptions)( GTK_EXPAND | GTK_FILL ), 0, 0 );
-    gtk_object_set_data (GTK_OBJECT (spw), "desc_frame", l);
 
     /* Create the text view box for the object description */
     GtkWidget *textframe = gtk_frame_new(NULL);
@@ -194,12 +201,15 @@ sp_item_widget_new (void)
     gtk_widget_set_sensitive (GTK_WIDGET (textframe), FALSE);
     gtk_container_add (GTK_CONTAINER (f), textframe);
     gtk_frame_set_shadow_type (GTK_FRAME (textframe), GTK_SHADOW_IN);
+    gtk_object_set_data(GTK_OBJECT(spw), "desc_frame", textframe);
 
     tf = gtk_text_view_new();
+    gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(tf), GTK_WRAP_WORD);
     desc_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(tf));
     gtk_text_buffer_set_text(desc_buffer, "", -1);
     gtk_container_add (GTK_CONTAINER (textframe), tf);
     gtk_object_set_data (GTK_OBJECT (spw), "desc", tf);
+    gtk_label_set_mnemonic_widget (GTK_LABEL (gtk_frame_get_label_widget (GTK_FRAME (f))), tf);
 
     /* Check boxes */
     GtkWidget *hb_cb = gtk_hbox_new (FALSE, 0);
@@ -229,9 +239,17 @@ sp_item_widget_new (void)
                          spw );
     gtk_object_set_data (GTK_OBJECT (spw), "sensitive", cb);
 
+    /* Create the frame for interactivity options */
+    int_label = gtk_label_new_with_mnemonic (_("_Interactivity"));
+    int_expander = gtk_expander_new (NULL);
+    gtk_expander_set_label_widget (GTK_EXPANDER (int_expander),int_label);
+    gtk_object_set_data (GTK_OBJECT (spw), "interactivity", int_expander);
+
+    gtk_box_pack_start (GTK_BOX (vb), int_expander, FALSE, FALSE, 0);
+
     gtk_widget_show_all (spw);
 
-    sp_item_widget_setup (SP_WIDGET (spw), SP_DT_SELECTION (SP_ACTIVE_DESKTOP));
+    sp_item_widget_setup (SP_WIDGET (spw), sp_desktop_selection (SP_ACTIVE_DESKTOP));
 
     return (GtkWidget *) spw;
 
@@ -240,10 +258,10 @@ sp_item_widget_new (void)
 
 
 static void
-sp_item_widget_modify_selection ( SPWidget *spw,
-                                  Inkscape::Selection *selection,
-                                  guint flags,
-                                  GtkWidget *itemw )
+sp_item_widget_modify_selection( SPWidget *spw,
+                                 Inkscape::Selection *selection,
+                                 guint /*flags*/,
+                                 GtkWidget */*itemw*/ )
 {
     sp_item_widget_setup (spw, selection);
 }
@@ -253,7 +271,7 @@ sp_item_widget_modify_selection ( SPWidget *spw,
 static void
 sp_item_widget_change_selection ( SPWidget *spw,
                                   Inkscape::Selection *selection,
-                                  GtkWidget *itemw )
+                                  GtkWidget */*itemw*/ )
 {
     sp_item_widget_setup (spw, selection);
 }
@@ -310,16 +328,54 @@ sp_item_widget_setup ( SPWidget *spw, Inkscape::Selection *selection )
 
         /* ID */
         w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "id"));
-        gtk_entry_set_text (GTK_ENTRY (w), obj->id);
+        gtk_entry_set_text (GTK_ENTRY (w), obj->getId());
         gtk_widget_set_sensitive (w, TRUE);
         w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "id_label"));
-        gtk_label_set_markup_with_mnemonic (GTK_LABEL (w), _("_Id"));
+        gtk_label_set_markup_with_mnemonic (GTK_LABEL (w), _("_ID:"));
 
         /* Label */
         w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "label"));
         gtk_entry_set_text (GTK_ENTRY (w), obj->defaultLabel());
         gtk_widget_set_sensitive (w, TRUE);
-        w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "label_label"));
+
+        /* Title */
+        w = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "title"));
+        gchar *title = obj->title();
+        if (title) {
+            gtk_entry_set_text(GTK_ENTRY(w), title);
+            g_free(title);
+        }
+        else gtk_entry_set_text(GTK_ENTRY(w), "");
+        gtk_widget_set_sensitive(w, TRUE);
+
+        /* Description */
+        w = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "desc"));
+        GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(w));
+        gchar *desc = obj->desc();
+        if (desc) {
+            gtk_text_buffer_set_text(buf, desc, -1);
+            g_free(desc);
+        } else {
+            gtk_text_buffer_set_text(buf, "", 0);
+        }
+        w = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "desc_frame"));
+        gtk_widget_set_sensitive(w, TRUE);
+
+        w = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "interactivity"));
+
+        GtkWidget* int_table = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "interactivity_table"));
+        if (int_table){
+            gtk_container_remove(GTK_CONTAINER(w), int_table);
+        }
+
+        const gchar* int_labels[10] = {"onclick", "onmouseover", "onmouseout", "onmousedown", "onmouseup", "onmousemove","onfocusin", "onfocusout", "onactivate", "onload"};
+
+        int_table = sp_attribute_table_new (obj, 10, int_labels, int_labels);
+        gtk_widget_show_all (int_table);
+        gtk_object_set_data(GTK_OBJECT(spw), "interactivity_table", int_table);
+
+        gtk_container_add (GTK_CONTAINER (w), int_table);
+
     }
 
     gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (FALSE));
@@ -335,14 +391,15 @@ sp_item_widget_sensitivity_toggled (GtkWidget *widget, SPWidget *spw)
     if (gtk_object_get_data (GTK_OBJECT (spw), "blocked"))
         return;
 
-    SPItem *item = SP_DT_SELECTION(SP_ACTIVE_DESKTOP)->singleItem();
+    SPItem *item = sp_desktop_selection(SP_ACTIVE_DESKTOP)->singleItem();
     g_return_if_fail (item != NULL);
 
     gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (TRUE));
 
     item->setLocked(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
 
-    sp_document_maybe_done (SP_ACTIVE_DOCUMENT,  "ItemDialog:insensitive");
+    sp_document_done (SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
+             gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))? _("Lock object") : _("Unlock object"));
 
     gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (FALSE));
 }
@@ -353,25 +410,26 @@ sp_item_widget_hidden_toggled(GtkWidget *widget, SPWidget *spw)
     if (gtk_object_get_data (GTK_OBJECT (spw), "blocked"))
         return;
 
-    SPItem *item = SP_DT_SELECTION(SP_ACTIVE_DESKTOP)->singleItem();
+    SPItem *item = sp_desktop_selection(SP_ACTIVE_DESKTOP)->singleItem();
     g_return_if_fail (item != NULL);
 
     gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (TRUE));
 
     item->setExplicitlyHidden(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
 
-    sp_document_maybe_done (SP_ACTIVE_DOCUMENT,  "ItemDialog:visiblity");
+    sp_document_done (SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
+             gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))? _("Hide object") : _("Unhide object"));
 
     gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (FALSE));
 }
 
 static void
-sp_item_widget_label_changed (GtkWidget *widget, SPWidget *spw)
+sp_item_widget_label_changed( GtkWidget */*widget*/, SPWidget *spw )
 {
     if (gtk_object_get_data (GTK_OBJECT (spw), "blocked"))
         return;
 
-    SPItem *item = SP_DT_SELECTION(SP_ACTIVE_DESKTOP)->singleItem();
+    SPItem *item = sp_desktop_selection(SP_ACTIVE_DESKTOP)->singleItem();
     g_return_if_fail (item != NULL);
 
     gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (TRUE));
@@ -381,18 +439,19 @@ sp_item_widget_label_changed (GtkWidget *widget, SPWidget *spw)
     gchar *id = (gchar *) gtk_entry_get_text (GTK_ENTRY (id_entry));
     g_strcanon (id, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.:", '_');
     GtkWidget *id_label = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "id_label"));
-    if (!strcmp (id, SP_OBJECT_ID(item))) {
-        gtk_label_set_markup_with_mnemonic (GTK_LABEL (id_label), _("_Id"));
+    if (!strcmp (id, item->getId())) {
+        gtk_label_set_markup_with_mnemonic (GTK_LABEL (id_label), _("_ID:"));
     } else if (!*id || !isalnum (*id)) {
         gtk_label_set_text (GTK_LABEL (id_label), _("Id invalid! "));
     } else if (SP_ACTIVE_DOCUMENT->getObjectById(id) != NULL) {
         gtk_label_set_text (GTK_LABEL (id_label), _("Id exists! "));
     } else {
         SPException ex;
-        gtk_label_set_markup_with_mnemonic (GTK_LABEL (id_label), _("_Id"));
+        gtk_label_set_markup_with_mnemonic (GTK_LABEL (id_label), _("_ID:"));
         SP_EXCEPTION_INIT (&ex);
         sp_object_setAttribute (SP_OBJECT (item), "id", id, &ex);
-        sp_document_maybe_done (SP_ACTIVE_DOCUMENT, "ItemDialog:id");
+        sp_document_done (SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
+                                _("Set object ID"));
     }
 
     /* Retrieve the label widget for the object's label */
@@ -406,23 +465,27 @@ sp_item_widget_label_changed (GtkWidget *widget, SPWidget *spw)
     SPObject *obj = (SPObject*)item;
     if (strcmp (label, obj->defaultLabel())) {
         obj->setLabel(label);
-        sp_document_maybe_done (SP_ACTIVE_DOCUMENT, "inkscape:label");
+        sp_document_done (SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
+                                _("Set object label"));
     }
 
     /* Retrieve the title */
-    GtkWidget *w = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (spw), "title"));
-    gchar *title = (gchar *)gtk_entry_get_text (GTK_ENTRY (w));
-    if (title != NULL) {
-        obj->setTitle(title);
-        sp_document_maybe_done (SP_ACTIVE_DOCUMENT, "title");
-    }
+    GtkWidget *w = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(spw), "title"));
+    gchar *title = (gchar *)gtk_entry_get_text(GTK_ENTRY (w));
+    if (obj->setTitle(title))
+        sp_document_done(SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
+                         _("Set object title"));
 
     /* Retrieve the description */
-    gchar *desc = NULL; /* TODO:  get text from text buffer */
-    if (desc != NULL) {
-        obj->setDesc(desc);
-        sp_document_maybe_done (SP_ACTIVE_DOCUMENT, "desc");
-    }
+    GtkTextView *tv = GTK_TEXT_VIEW(gtk_object_get_data(GTK_OBJECT(spw), "desc"));
+    GtkTextBuffer *buf = gtk_text_view_get_buffer(tv);
+    GtkTextIter start, end;
+    gtk_text_buffer_get_bounds(buf, &start, &end);
+    gchar *desc = gtk_text_buffer_get_text(buf, &start, &end, TRUE);
+    if (obj->setDesc(desc))
+        sp_document_done(SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM,
+                         _("Set object description"));
+    g_free(desc);
 
     gtk_object_set_data (GTK_OBJECT (spw), "blocked", GUINT_TO_POINTER (FALSE));
 
@@ -440,27 +503,30 @@ sp_item_dialog (void)
 
         gchar title[500];
         sp_ui_dialog_title_string (Inkscape::Verb::get(SP_VERB_DIALOG_ITEM), title);
+        Inkscape::Preferences *prefs = Inkscape::Preferences::get();
 
         dlg = sp_window_new (title, TRUE);
         if (x == -1000 || y == -1000) {
-            x = prefs_get_int_attribute (prefs_path, "x", 0);
-            y = prefs_get_int_attribute (prefs_path, "y", 0);
+            x = prefs->getInt(prefs_path + "x", -1000);
+            y = prefs->getInt(prefs_path + "y", -1000);
         }
-
         if (w ==0 || h == 0) {
-            w = prefs_get_int_attribute (prefs_path, "w", 0);
-            h = prefs_get_int_attribute (prefs_path, "h", 0);
+            w = prefs->getInt(prefs_path + "w", 0);
+            h = prefs->getInt(prefs_path + "h", 0);
         }
 
-        if (x != 0 || y != 0) {
+//        if (x<0) x=0;
+//        if (y<0) y=0;
+
+        if (w && h) {
+            gtk_window_resize ((GtkWindow *) dlg, w, h);
+        }
+        if (x >= 0 && y >= 0 && (x < (gdk_screen_width()-MIN_ONSCREEN_DISTANCE)) && (y < (gdk_screen_height()-MIN_ONSCREEN_DISTANCE))) {
             gtk_window_move ((GtkWindow *) dlg, x, y);
         } else {
             gtk_window_set_position(GTK_WINDOW(dlg), GTK_WIN_POS_CENTER);
         }
 
-        if (w && h) {
-            gtk_window_resize ((GtkWindow *) dlg, w, h);
-        }
 
         sp_transientize (dlg);
         wd.win = dlg;
@@ -494,4 +560,4 @@ sp_item_dialog (void)
   fill-column:99
   End:
 */
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :