Code

Merge and cleanup of GSoC C++-ification project.
[inkscape.git] / src / ui / context-menu.cpp
index aa93ffed9da47b9857f20f55b8918a914b0b59b3..c544d1999491ad4b599803618baca6d241e9d11a 100644 (file)
@@ -1,10 +1,10 @@
-#define __CONTEXT_MENU_C__
-
 /*
  * Unser-interface related object extension
  *
  * Authors:
  *   Lauris Kaplinski <lauris@kaplinski.com>
+ *   Jon A. Cruz <jon@joncruz.org>
+ *   Abhishek Sharma
  *
  * This code is in public domain
  */
@@ -21,6 +21,8 @@
 #include "preferences.h"
 #include "ui/dialog/dialog-manager.h"
 
+using Inkscape::DocumentUndo;
+
 static void sp_object_type_menu(GType type, SPObject *object, SPDesktop *desktop, GtkMenu *menu);
 
 /* Append object-specific part to context menu */
@@ -46,15 +48,20 @@ sp_object_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu)
 
 #include "sp-anchor.h"
 #include "sp-image.h"
+#include "sp-text.h"
 
 #include "document.h"
 #include "desktop-handles.h"
 #include "selection.h"
-
+#include "selection-chemistry.h"
 #include "dialogs/item-properties.h"
 #include "dialogs/object-attributes.h"
+#include "dialogs/text-edit.h"
+#include "dialogs/spellcheck.h"
 
 #include "sp-path.h"
+#include "sp-clippath.h"
+#include "sp-mask.h"
 
 
 static void sp_item_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
@@ -62,6 +69,7 @@ static void sp_group_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
 static void sp_anchor_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
 static void sp_image_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
 static void sp_shape_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
+static void sp_text_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
 
 static void
 sp_object_type_menu(GType type, SPObject *object, SPDesktop *desktop, GtkMenu *menu)
@@ -75,6 +83,7 @@ sp_object_type_menu(GType type, SPObject *object, SPDesktop *desktop, GtkMenu *m
         g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_ANCHOR), (void*)sp_anchor_menu);
         g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_IMAGE), (void*)sp_image_menu);
         g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_SHAPE), (void*)sp_shape_menu);
+        g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_TEXT), (void*)sp_text_menu);
     }
     handler = (void (*)(SPObject*, SPDesktop*, GtkMenu*))g_hash_table_lookup(t2m, GUINT_TO_POINTER(type));
     if (handler) handler(object, desktop, menu);
@@ -85,7 +94,10 @@ sp_object_type_menu(GType type, SPObject *object, SPDesktop *desktop, GtkMenu *m
 static void sp_item_properties(GtkMenuItem *menuitem, SPItem *item);
 static void sp_item_select_this(GtkMenuItem *menuitem, SPItem *item);
 static void sp_item_create_link(GtkMenuItem *menuitem, SPItem *item);
-
+static void sp_set_mask(GtkMenuItem *menuitem, SPItem *item);
+static void sp_release_mask(GtkMenuItem *menuitem, SPItem *item);
+static void sp_set_clip(GtkMenuItem *menuitem, SPItem *item);
+static void sp_release_clip(GtkMenuItem *menuitem, SPItem *item);
 /* Generate context menu item section */
 
 static void
@@ -97,7 +109,7 @@ sp_item_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
     item = (SPItem *) object;
 
     /* Item dialog */
-    w = gtk_menu_item_new_with_mnemonic(_("Object _Properties"));
+    w = gtk_menu_item_new_with_mnemonic(_("_Object Properties..."));
     gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
     gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_item_properties), item);
     gtk_widget_show(w);
@@ -123,6 +135,51 @@ sp_item_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
     gtk_widget_set_sensitive(w, !SP_IS_ANCHOR(item));
     gtk_widget_show(w);
     gtk_menu_append(GTK_MENU(m), w);
+    /* Set mask */
+    w = gtk_menu_item_new_with_mnemonic(_("Set Mask"));
+    gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
+    gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_set_mask), item);
+    if ((item && item->mask_ref && item->mask_ref->getObject()) || (item->clip_ref && item->clip_ref->getObject())) {
+        gtk_widget_set_sensitive(w, FALSE);
+    } else {
+        gtk_widget_set_sensitive(w, TRUE);
+    }
+    gtk_widget_show(w);
+    gtk_menu_append(GTK_MENU(m), w);
+    /* Release mask */
+    w = gtk_menu_item_new_with_mnemonic(_("Release Mask"));
+    gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
+    gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_release_mask), item);
+    if (item && item->mask_ref && item->mask_ref->getObject()) {
+        gtk_widget_set_sensitive(w, TRUE);
+    } else {
+        gtk_widget_set_sensitive(w, FALSE);
+    }
+    gtk_widget_show(w);
+    gtk_menu_append(GTK_MENU(m), w);
+    /* Set Clip */
+    w = gtk_menu_item_new_with_mnemonic(_("Set _Clip"));
+    gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
+    gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_set_clip), item);
+    if ((item && item->mask_ref && item->mask_ref->getObject()) || (item->clip_ref && item->clip_ref->getObject())) {
+        gtk_widget_set_sensitive(w, FALSE);
+    } else {
+        gtk_widget_set_sensitive(w, TRUE);
+    }
+    gtk_widget_show(w);
+    gtk_menu_append(GTK_MENU(m), w);
+    /* Release Clip */
+    w = gtk_menu_item_new_with_mnemonic(_("Release C_lip"));
+    gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
+    gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_release_clip), item);
+    if (item && item->clip_ref && item->clip_ref->getObject()) {
+        gtk_widget_set_sensitive(w, TRUE);
+    } else {
+        gtk_widget_set_sensitive(w, FALSE);
+    }
+    gtk_widget_show(w);
+    gtk_menu_append(GTK_MENU(m), w);
+
 }
 
 static void
@@ -140,6 +197,63 @@ sp_item_properties(GtkMenuItem *menuitem, SPItem *item)
     sp_item_dialog();
 }
 
+
+static void
+sp_set_mask(GtkMenuItem *menuitem, SPItem *item)
+{
+    SPDesktop *desktop;
+
+    g_assert(SP_IS_ITEM(item));
+
+    desktop = (SPDesktop*)gtk_object_get_data(GTK_OBJECT(menuitem), "desktop");
+    g_return_if_fail(desktop != NULL);
+
+       sp_selection_set_mask(desktop, false, false);
+}
+
+
+static void
+sp_release_mask(GtkMenuItem *menuitem, SPItem *item)
+{
+    SPDesktop *desktop;
+
+    g_assert(SP_IS_ITEM(item));
+
+    desktop = (SPDesktop*)gtk_object_get_data(GTK_OBJECT(menuitem), "desktop");
+    g_return_if_fail(desktop != NULL);
+
+    sp_selection_unset_mask(desktop, false);
+}
+
+
+static void
+sp_set_clip(GtkMenuItem *menuitem, SPItem *item)
+{
+    SPDesktop *desktop;
+
+    g_assert(SP_IS_ITEM(item));
+
+    desktop = (SPDesktop*)gtk_object_get_data(GTK_OBJECT(menuitem), "desktop");
+    g_return_if_fail(desktop != NULL);
+
+       sp_selection_set_mask(desktop, true, false);
+}
+
+
+static void
+sp_release_clip(GtkMenuItem *menuitem, SPItem *item)
+{
+    SPDesktop *desktop;
+
+    g_assert(SP_IS_ITEM(item));
+
+    desktop = (SPDesktop*)gtk_object_get_data(GTK_OBJECT(menuitem), "desktop");
+    g_return_if_fail(desktop != NULL);
+
+    sp_selection_unset_mask(desktop, true);
+}
+
+
 static void
 sp_item_select_this(GtkMenuItem *menuitem, SPItem *item)
 {
@@ -162,7 +276,7 @@ sp_item_create_link(GtkMenuItem *menuitem, SPItem *item)
     SPDesktop *desktop = (SPDesktop*)gtk_object_get_data(GTK_OBJECT(menuitem), "desktop");
     g_return_if_fail(desktop != NULL);
 
-    Inkscape::XML::Document *xml_doc = sp_document_repr_doc(desktop->doc());
+    Inkscape::XML::Document *xml_doc = desktop->doc()->getReprDoc();
     Inkscape::XML::Node *repr = xml_doc->createElement("svg:a");
     SP_OBJECT_REPR(SP_OBJECT_PARENT(item))->addChild(repr, SP_OBJECT_REPR(item));
     SPObject *object = SP_OBJECT_DOCUMENT(item)->getObjectByRepr(repr);
@@ -177,8 +291,8 @@ sp_item_create_link(GtkMenuItem *menuitem, SPItem *item)
     Inkscape::GC::release(repr);
     Inkscape::GC::release(child);
 
-    sp_document_done(SP_OBJECT_DOCUMENT(object), SP_VERB_NONE,
-                     _("Create link"));
+    DocumentUndo::done(SP_OBJECT_DOCUMENT(object), SP_VERB_NONE,
+                       _("Create link"));
 
     sp_object_attributes_dialog(object, "SPAnchor");
 
@@ -236,7 +350,7 @@ sp_anchor_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
     item = (SPItem *) object;
 
     /* Link dialog */
-    w = gtk_menu_item_new_with_mnemonic(_("Link _Properties"));
+    w = gtk_menu_item_new_with_mnemonic(_("Link _Properties..."));
     gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
     gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_anchor_link_properties), item);
     gtk_widget_show(w);
@@ -295,7 +409,7 @@ sp_image_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
     GtkWidget *w;
 
     /* Link dialog */
-    w = gtk_menu_item_new_with_mnemonic(_("Image _Properties"));
+    w = gtk_menu_item_new_with_mnemonic(_("Image _Properties..."));
     gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
     gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_image_image_properties), item);
     gtk_widget_show(w);
@@ -322,12 +436,12 @@ sp_image_image_properties(GtkMenuItem */*menuitem*/, SPAnchor *anchor)
 static gchar* getImageEditorName() {
     Inkscape::Preferences *prefs = Inkscape::Preferences::get();
     gchar* value = 0;
-    Glib::ustring choices = prefs->getString("options.bitmapeditor", "choices");
+    Glib::ustring choices = prefs->getString("/options/bitmapeditor/choices");
     if (!choices.empty()) {
         gchar** splits = g_strsplit(choices.data(), ",", 0);
         gint numIems = g_strv_length(splits);
 
-        int setting = prefs->getIntLimited("options.bitmapeditor", "value", 0, 0, numIems);
+        int setting = prefs->getIntLimited("/options/bitmapeditor/value", 0, 0, numIems);
         value = g_strdup(splits[setting]);
 
         g_strfreev(splits);
@@ -366,10 +480,10 @@ static void sp_image_image_edit(GtkMenuItem *menuitem, SPAnchor *anchor)
     g_free(editorBin);
 }
 
-/* SPShape */
+/* Fill and Stroke entry */
 
 static void
-sp_shape_fill_settings(GtkMenuItem *menuitem, SPItem *item)
+sp_fill_settings(GtkMenuItem *menuitem, SPItem *item)
 {
     SPDesktop *desktop;
 
@@ -385,6 +499,8 @@ sp_shape_fill_settings(GtkMenuItem *menuitem, SPItem *item)
     desktop->_dlg_mgr->showDialog("FillAndStroke");
 }
 
+/* SPShape */
+
 static void
 sp_shape_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
 {
@@ -394,14 +510,82 @@ sp_shape_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
     item = (SPItem *) object;
 
     /* Item dialog */
-    w = gtk_menu_item_new_with_mnemonic(_("_Fill and Stroke"));
+    w = gtk_menu_item_new_with_mnemonic(_("_Fill and Stroke..."));
     gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
-    gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_shape_fill_settings), item);
+    gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_fill_settings), item);
     gtk_widget_show(w);
     gtk_menu_append(GTK_MENU(m), w);
 }
 
+/* Edit Text entry */
 
+static void
+sp_text_settings(GtkMenuItem *menuitem, SPItem *item)
+{
+    SPDesktop *desktop;
+
+    g_assert(SP_IS_ITEM(item));
+
+    desktop = (SPDesktop*)gtk_object_get_data(GTK_OBJECT(menuitem), "desktop");
+    g_return_if_fail(desktop != NULL);
+
+    if (sp_desktop_selection(desktop)->isEmpty()) {
+        sp_desktop_selection(desktop)->set(item);
+    }
+
+    sp_text_edit_dialog();
+}
+
+/* Spellcheck entry */
+
+static void
+sp_spellcheck_settings(GtkMenuItem *menuitem, SPItem *item)
+{
+    SPDesktop *desktop;
+
+    g_assert(SP_IS_ITEM(item));
+
+    desktop = (SPDesktop*)gtk_object_get_data(GTK_OBJECT(menuitem), "desktop");
+    g_return_if_fail(desktop != NULL);
+
+    if (sp_desktop_selection(desktop)->isEmpty()) {
+        sp_desktop_selection(desktop)->set(item);
+    }
+
+    sp_spellcheck_dialog();
+}
+
+/* SPText */
+
+static void
+sp_text_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
+{
+    SPItem *item;
+    GtkWidget *w;
+
+    item = (SPItem *) object;
+
+    /* Fill and Stroke dialog */
+    w = gtk_menu_item_new_with_mnemonic(_("_Fill and Stroke..."));
+    gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
+    gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_fill_settings), item);
+    gtk_widget_show(w);
+    gtk_menu_append(GTK_MENU(m), w);
+    
+    /* Edit Text dialog */
+    w = gtk_menu_item_new_with_mnemonic(_("_Text and Font..."));
+    gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
+    gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_text_settings), item);
+    gtk_widget_show(w);
+    gtk_menu_append(GTK_MENU(m), w);
+
+    /* Spellcheck dialog */
+    w = gtk_menu_item_new_with_mnemonic(_("Check Spellin_g..."));
+    gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
+    gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_spellcheck_settings), item);
+    gtk_widget_show(w);
+    gtk_menu_append(GTK_MENU(m), w);
+}
 /*
   Local Variables:
   mode:c++
@@ -411,4 +595,4 @@ sp_shape_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
   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 :