summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 48edf15)
raw | patch | inline | side by side (parent: 48edf15)
author | verbalshadow <verbalshadow@users.sourceforge.net> | |
Mon, 24 Apr 2006 04:06:25 +0000 (04:06 +0000) | ||
committer | verbalshadow <verbalshadow@users.sourceforge.net> | |
Mon, 24 Apr 2006 04:06:25 +0000 (04:06 +0000) |
ChangeLog | patch | blob | history | |
src/Makefile_insert | patch | blob | history | |
src/doxygen-main.cpp | patch | blob | history | |
src/interface.cpp | patch | blob | history | |
src/make.files | patch | blob | history | |
src/object-ui.cpp | [deleted file] | patch | blob | history |
src/object-ui.h | [deleted file] | patch | blob | history |
src/ui/context-menu.cpp | [new file with mode: 0644] | patch | blob |
src/ui/context-menu.h | [new file with mode: 0644] | patch | blob |
diff --git a/ChangeLog b/ChangeLog
index 47a6139075f07ebccb97515fd348404e37336145..920dd92f0aee23978deef085c06d87f562684c0b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
+2006-04-23 verbalshadow <verbalshadow@gmail.com>
+
+ * src/object-ui.cpp, src/object-ui.h:
+ moved to src/ui/context-menu.cpp, src/ui/context-menu.h
+ to make it easier to find
+
2006-04-20 MenTaLguY <mental@rydia.net>
* src/dyna-draw-context.cpp, src/dyna-draw-context.h:
diff --git a/src/Makefile_insert b/src/Makefile_insert
index 12b766bb3e01dafb878c17ed9fc865cd802ceadf..ce0007a1561de47750788959d5a9dbaa8247a27e 100644 (file)
--- a/src/Makefile_insert
+++ b/src/Makefile_insert
nodepath.cpp nodepath.h \
object-edit.cpp object-edit.h \
object-hierarchy.cpp object-hierarchy.h \
- object-ui.cpp object-ui.h \
+ ui/context-menu.cpp \
+ ui/context-menu.h \
path-chemistry.cpp path-chemistry.h \
path-prefix.h \
pen-context.cpp \
diff --git a/src/doxygen-main.cpp b/src/doxygen-main.cpp
index 368346386ea920b8e3a692f1d90dbe616c9e9bbc..f6d5e81f8b18832f4da43f580527dc96b0823eef 100644 (file)
--- a/src/doxygen-main.cpp
+++ b/src/doxygen-main.cpp
* [\ref help.cpp] [\ref inkscape.cpp] [\ref inkscape-stock.cpp]
* [\ref interface.cpp, \ref memeq.h] [\ref main.cpp, \ref winmain.cpp]
* [\ref menus-skeleton.h, \ref preferences-skeleton.h]
- * [\ref object-ui.cpp] [\ref select-toolbar.cpp] [\ref shortcuts.cpp]
+ * [\ref context-menu.cpp] [\ref select-toolbar.cpp] [\ref shortcuts.cpp]
* [\ref sp-cursor.cpp] [\ref text-edit.cpp] [\ref toolbox.cpp, \ref ui/widget/toolbox.cpp]
* Inkscape::Verb [\ref verbs.h]
*
diff --git a/src/interface.cpp b/src/interface.cpp
index 2a2cba4d01822a6a0fd8125649b3bb9625e5d4ef..1c7baf413e75f39e1d59cf663c8c0cdcb106c9c3 100644 (file)
--- a/src/interface.cpp
+++ b/src/interface.cpp
#include "file.h"
#include "interface.h"
#include "desktop.h"
-#include "object-ui.h"
+#include "ui/context-menu.h"
#include "selection.h"
#include "selection-chemistry.h"
#include "svg-view-widget.h"
diff --git a/src/make.files b/src/make.files
index b96325a2cbe0cad7c6a8c0fb36e4a5715b5843c6..389acad64950a06446d99e1fd1235f61b9298d83 100644 (file)
--- a/src/make.files
+++ b/src/make.files
object-hierarchy.h
object-snapper.cpp
object-snapper.h
-object-ui.cpp
-object-ui.h
path-chemistry.cpp
path-chemistry.h
path-prefix.h
ui/dialog/whiteboard-sharewithuser.h
ui/dialog/xml-editor.cpp
ui/dialog/xml-editor.h
+ui/context-menu.cpp
+ui/context-menu.h
ui/icons.cpp
ui/icons.h
ui/previewable.h
diff --git a/src/object-ui.cpp b/src/object-ui.cpp
--- a/src/object-ui.cpp
+++ /dev/null
@@ -1,351 +0,0 @@
-#define __SP_OBJECT_UI_C__
-
-/*
- * Unser-interface related object extension
- *
- * Authors:
- * Lauris Kaplinski <lauris@kaplinski.com>
- *
- * This code is in public domain
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "object-ui.h"
-#include "xml/repr.h"
-
-static void sp_object_type_menu(GType type, SPObject *object, SPDesktop *desktop, GtkMenu *menu);
-
-/* Append object-specific part to context menu */
-
-void
-sp_object_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu)
-{
- GObjectClass *klass;
- klass = G_OBJECT_GET_CLASS(object);
- while (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_OBJECT)) {
- GType type;
- type = G_TYPE_FROM_CLASS(klass);
- sp_object_type_menu(type, object, desktop, menu);
- klass = (GObjectClass*)g_type_class_peek_parent(klass);
- }
-}
-
-/* Implementation */
-
-#include <gtk/gtkmenuitem.h>
-
-#include <glibmm/i18n.h>
-
-#include "sp-anchor.h"
-#include "sp-image.h"
-
-#include "document.h"
-#include "desktop-handles.h"
-#include "selection.h"
-
-#include "dialogs/item-properties.h"
-#include "dialogs/object-attributes.h"
-#include "dialogs/object-properties.h"
-
-#include "sp-path.h"
-
-
-static void sp_item_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
-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_object_type_menu(GType type, SPObject *object, SPDesktop *desktop, GtkMenu *menu)
-{
- static GHashTable *t2m = NULL;
- void (* handler)(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
- if (!t2m) {
- t2m = g_hash_table_new(NULL, NULL);
- g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_ITEM), (void*)sp_item_menu);
- g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_GROUP), (void*)sp_group_menu);
- 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);
- }
- handler = (void (*)(SPObject*, SPDesktop*, GtkMenu*))g_hash_table_lookup(t2m, GUINT_TO_POINTER(type));
- if (handler) handler(object, desktop, menu);
-}
-
-/* SPItem */
-
-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);
-
-/* Generate context menu item section */
-
-static void
-sp_item_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
-{
- SPItem *item;
- GtkWidget *w;
-
- item = (SPItem *) object;
-
- /* Item dialog */
- 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);
- gtk_menu_append(GTK_MENU(m), w);
- /* Separator */
- w = gtk_menu_item_new();
- gtk_widget_show(w);
- gtk_menu_append(GTK_MENU(m), w);
- /* Select item */
- w = gtk_menu_item_new_with_mnemonic(_("_Select This"));
- if (sp_desktop_selection(desktop)->includes(item)) {
- gtk_widget_set_sensitive(w, FALSE);
- } else {
- gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
- gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_item_select_this), item);
- }
- gtk_widget_show(w);
- gtk_menu_append(GTK_MENU(m), w);
- /* Create link */
- w = gtk_menu_item_new_with_mnemonic(_("_Create Link"));
- gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
- gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_item_create_link), item);
- gtk_widget_set_sensitive(w, !SP_IS_ANCHOR(item));
- gtk_widget_show(w);
- gtk_menu_append(GTK_MENU(m), w);
-}
-
-static void
-sp_item_properties(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_desktop_selection(desktop)->set(item);
-
- sp_item_dialog();
-}
-
-static void
-sp_item_select_this(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_desktop_selection(desktop)->set(item);
-}
-
-static void
-sp_item_create_link(GtkMenuItem *menuitem, SPItem *item)
-{
- g_assert(SP_IS_ITEM(item));
- g_assert(!SP_IS_ANCHOR(item));
-
- SPDesktop *desktop = (SPDesktop*)gtk_object_get_data(GTK_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- Inkscape::XML::Node *repr = sp_repr_new("svg:a");
- SP_OBJECT_REPR(SP_OBJECT_PARENT(item))->addChild(repr, SP_OBJECT_REPR(item));
- SPObject *object = SP_OBJECT_DOCUMENT(item)->getObjectByRepr(repr);
- g_return_if_fail(SP_IS_ANCHOR(object));
-
- const char *id = SP_OBJECT_REPR(item)->attribute("id");
- Inkscape::XML::Node *child = SP_OBJECT_REPR(item)->duplicate();
- SP_OBJECT(item)->deleteObject(false);
- repr->addChild(child, NULL);
- child->setAttribute("id", id);
- sp_document_done(SP_OBJECT_DOCUMENT(object));
-
- sp_object_attributes_dialog(object, "SPAnchor");
-
- sp_desktop_selection(desktop)->set(SP_ITEM(object));
-}
-
-/* SPGroup */
-
-static void sp_item_group_ungroup_activate(GtkMenuItem *menuitem, SPGroup *group);
-
-static void
-sp_group_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu)
-{
- SPItem *item=SP_ITEM(object);
- GtkWidget *w;
-
- /* "Ungroup" */
- w = gtk_menu_item_new_with_mnemonic(_("_Ungroup"));
- gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
- gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_item_group_ungroup_activate), item);
- gtk_widget_show(w);
- gtk_menu_append(GTK_MENU(menu), w);
-}
-
-static void
-sp_item_group_ungroup_activate(GtkMenuItem *menuitem, SPGroup *group)
-{
- SPDesktop *desktop;
- GSList *children;
-
- g_assert(SP_IS_GROUP(group));
-
- desktop = (SPDesktop*)gtk_object_get_data(GTK_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- children = NULL;
- sp_item_group_ungroup(group, &children);
-
- sp_desktop_selection(desktop)->setList(children);
- g_slist_free(children);
-}
-
-/* SPAnchor */
-
-static void sp_anchor_link_properties(GtkMenuItem *menuitem, SPAnchor *anchor);
-static void sp_anchor_link_follow(GtkMenuItem *menuitem, SPAnchor *anchor);
-static void sp_anchor_link_remove(GtkMenuItem *menuitem, SPAnchor *anchor);
-
-static void
-sp_anchor_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
-{
- SPItem *item;
- GtkWidget *w;
-
- item = (SPItem *) object;
-
- /* Link dialog */
- 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);
- gtk_menu_append(GTK_MENU(m), w);
- /* Separator */
- w = gtk_menu_item_new();
- gtk_widget_show(w);
- gtk_menu_append(GTK_MENU(m), w);
- /* Select item */
- w = gtk_menu_item_new_with_mnemonic(_("_Follow Link"));
- gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_anchor_link_follow), item);
- gtk_widget_show(w);
- gtk_menu_append(GTK_MENU(m), w);
- /* Reset transformations */
- w = gtk_menu_item_new_with_mnemonic(_("_Remove Link"));
- gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
- gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_anchor_link_remove), item);
- gtk_widget_show(w);
- gtk_menu_append(GTK_MENU(m), w);
-}
-
-static void
-sp_anchor_link_properties(GtkMenuItem *menuitem, SPAnchor *anchor)
-{
- sp_object_attributes_dialog(SP_OBJECT(anchor), "Link");
-}
-
-static void
-sp_anchor_link_follow(GtkMenuItem *menuitem, SPAnchor *anchor)
-{
- g_return_if_fail(anchor != NULL);
- g_return_if_fail(SP_IS_ANCHOR(anchor));
-
- /* shell out to an external browser here */
-}
-
-static void
-sp_anchor_link_remove(GtkMenuItem *menuitem, SPAnchor *anchor)
-{
- GSList *children;
-
- g_return_if_fail(anchor != NULL);
- g_return_if_fail(SP_IS_ANCHOR(anchor));
-
- children = NULL;
- sp_item_group_ungroup(SP_GROUP(anchor), &children);
-
- g_slist_free(children);
-}
-
-/* Image */
-
-static void sp_image_image_properties(GtkMenuItem *menuitem, SPAnchor *anchor);
-
-static void
-sp_image_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
-{
- SPItem *item;
- GtkWidget *w;
-
- item = (SPItem *) object;
-
- /* Link dialog */
- 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);
- gtk_menu_append(GTK_MENU(m), w);
-}
-
-static void
-sp_image_image_properties(GtkMenuItem *menuitem, SPAnchor *anchor)
-{
- sp_object_attributes_dialog(SP_OBJECT(anchor), "Image");
-}
-
-/* SPShape */
-
-static void
-sp_shape_fill_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_object_properties_dialog();
-}
-
-static void
-sp_shape_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
-{
- SPItem *item;
- GtkWidget *w;
-
- item = (SPItem *) object;
-
- /* Item 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_shape_fill_settings), item);
- gtk_widget_show(w);
- gtk_menu_append(GTK_MENU(m), w);
-}
-
-
-/*
- Local Variables:
- mode:c++
- c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
- indent-tabs-mode:nil
- fill-column:99
- End:
-*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
diff --git a/src/object-ui.h b/src/object-ui.h
--- a/src/object-ui.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef __SP_OBJECT_UI_H__
-#define __SP_OBJECT_UI_H__
-
-/*
- * Unser-interface related object extension
- *
- * Authors:
- * Lauris Kaplinski <lauris@kaplinski.com>
- *
- * This code is in public domain
- */
-
-#include <gtk/gtkmenu.h>
-
-#include "forward.h"
-
-/* Append object-specific part to context menu */
-
-void sp_object_menu (SPObject *object, SPDesktop *desktop, GtkMenu *menu);
-
-#endif
-
-/*
- Local Variables:
- mode:c++
- c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
- indent-tabs-mode:nil
- fill-column:99
- End:
-*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
diff --git a/src/ui/context-menu.cpp b/src/ui/context-menu.cpp
--- /dev/null
+++ b/src/ui/context-menu.cpp
@@ -0,0 +1,351 @@
+#define __CONTEXT_MENU_C__
+
+/*
+ * Unser-interface related object extension
+ *
+ * Authors:
+ * Lauris Kaplinski <lauris@kaplinski.com>
+ *
+ * This code is in public domain
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "context-menu.h"
+#include "../xml/repr.h"
+
+static void sp_object_type_menu(GType type, SPObject *object, SPDesktop *desktop, GtkMenu *menu);
+
+/* Append object-specific part to context menu */
+
+void
+sp_object_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu)
+{
+ GObjectClass *klass;
+ klass = G_OBJECT_GET_CLASS(object);
+ while (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_OBJECT)) {
+ GType type;
+ type = G_TYPE_FROM_CLASS(klass);
+ sp_object_type_menu(type, object, desktop, menu);
+ klass = (GObjectClass*)g_type_class_peek_parent(klass);
+ }
+}
+
+/* Implementation */
+
+#include <gtk/gtkmenuitem.h>
+
+#include <glibmm/i18n.h>
+
+#include "sp-anchor.h"
+#include "sp-image.h"
+
+#include "document.h"
+#include "desktop-handles.h"
+#include "selection.h"
+
+#include "dialogs/item-properties.h"
+#include "dialogs/object-attributes.h"
+#include "dialogs/object-properties.h"
+
+#include "sp-path.h"
+
+
+static void sp_item_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
+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_object_type_menu(GType type, SPObject *object, SPDesktop *desktop, GtkMenu *menu)
+{
+ static GHashTable *t2m = NULL;
+ void (* handler)(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
+ if (!t2m) {
+ t2m = g_hash_table_new(NULL, NULL);
+ g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_ITEM), (void*)sp_item_menu);
+ g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_GROUP), (void*)sp_group_menu);
+ 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);
+ }
+ handler = (void (*)(SPObject*, SPDesktop*, GtkMenu*))g_hash_table_lookup(t2m, GUINT_TO_POINTER(type));
+ if (handler) handler(object, desktop, menu);
+}
+
+/* SPItem */
+
+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);
+
+/* Generate context menu item section */
+
+static void
+sp_item_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
+{
+ SPItem *item;
+ GtkWidget *w;
+
+ item = (SPItem *) object;
+
+ /* Item dialog */
+ 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);
+ gtk_menu_append(GTK_MENU(m), w);
+ /* Separator */
+ w = gtk_menu_item_new();
+ gtk_widget_show(w);
+ gtk_menu_append(GTK_MENU(m), w);
+ /* Select item */
+ w = gtk_menu_item_new_with_mnemonic(_("_Select This"));
+ if (sp_desktop_selection(desktop)->includes(item)) {
+ gtk_widget_set_sensitive(w, FALSE);
+ } else {
+ gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
+ gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_item_select_this), item);
+ }
+ gtk_widget_show(w);
+ gtk_menu_append(GTK_MENU(m), w);
+ /* Create link */
+ w = gtk_menu_item_new_with_mnemonic(_("_Create Link"));
+ gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
+ gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_item_create_link), item);
+ gtk_widget_set_sensitive(w, !SP_IS_ANCHOR(item));
+ gtk_widget_show(w);
+ gtk_menu_append(GTK_MENU(m), w);
+}
+
+static void
+sp_item_properties(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_desktop_selection(desktop)->set(item);
+
+ sp_item_dialog();
+}
+
+static void
+sp_item_select_this(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_desktop_selection(desktop)->set(item);
+}
+
+static void
+sp_item_create_link(GtkMenuItem *menuitem, SPItem *item)
+{
+ g_assert(SP_IS_ITEM(item));
+ g_assert(!SP_IS_ANCHOR(item));
+
+ SPDesktop *desktop = (SPDesktop*)gtk_object_get_data(GTK_OBJECT(menuitem), "desktop");
+ g_return_if_fail(desktop != NULL);
+
+ Inkscape::XML::Node *repr = sp_repr_new("svg:a");
+ SP_OBJECT_REPR(SP_OBJECT_PARENT(item))->addChild(repr, SP_OBJECT_REPR(item));
+ SPObject *object = SP_OBJECT_DOCUMENT(item)->getObjectByRepr(repr);
+ g_return_if_fail(SP_IS_ANCHOR(object));
+
+ const char *id = SP_OBJECT_REPR(item)->attribute("id");
+ Inkscape::XML::Node *child = SP_OBJECT_REPR(item)->duplicate();
+ SP_OBJECT(item)->deleteObject(false);
+ repr->addChild(child, NULL);
+ child->setAttribute("id", id);
+ sp_document_done(SP_OBJECT_DOCUMENT(object));
+
+ sp_object_attributes_dialog(object, "SPAnchor");
+
+ sp_desktop_selection(desktop)->set(SP_ITEM(object));
+}
+
+/* SPGroup */
+
+static void sp_item_group_ungroup_activate(GtkMenuItem *menuitem, SPGroup *group);
+
+static void
+sp_group_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu)
+{
+ SPItem *item=SP_ITEM(object);
+ GtkWidget *w;
+
+ /* "Ungroup" */
+ w = gtk_menu_item_new_with_mnemonic(_("_Ungroup"));
+ gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
+ gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_item_group_ungroup_activate), item);
+ gtk_widget_show(w);
+ gtk_menu_append(GTK_MENU(menu), w);
+}
+
+static void
+sp_item_group_ungroup_activate(GtkMenuItem *menuitem, SPGroup *group)
+{
+ SPDesktop *desktop;
+ GSList *children;
+
+ g_assert(SP_IS_GROUP(group));
+
+ desktop = (SPDesktop*)gtk_object_get_data(GTK_OBJECT(menuitem), "desktop");
+ g_return_if_fail(desktop != NULL);
+
+ children = NULL;
+ sp_item_group_ungroup(group, &children);
+
+ sp_desktop_selection(desktop)->setList(children);
+ g_slist_free(children);
+}
+
+/* SPAnchor */
+
+static void sp_anchor_link_properties(GtkMenuItem *menuitem, SPAnchor *anchor);
+static void sp_anchor_link_follow(GtkMenuItem *menuitem, SPAnchor *anchor);
+static void sp_anchor_link_remove(GtkMenuItem *menuitem, SPAnchor *anchor);
+
+static void
+sp_anchor_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
+{
+ SPItem *item;
+ GtkWidget *w;
+
+ item = (SPItem *) object;
+
+ /* Link dialog */
+ 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);
+ gtk_menu_append(GTK_MENU(m), w);
+ /* Separator */
+ w = gtk_menu_item_new();
+ gtk_widget_show(w);
+ gtk_menu_append(GTK_MENU(m), w);
+ /* Select item */
+ w = gtk_menu_item_new_with_mnemonic(_("_Follow Link"));
+ gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_anchor_link_follow), item);
+ gtk_widget_show(w);
+ gtk_menu_append(GTK_MENU(m), w);
+ /* Reset transformations */
+ w = gtk_menu_item_new_with_mnemonic(_("_Remove Link"));
+ gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
+ gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_anchor_link_remove), item);
+ gtk_widget_show(w);
+ gtk_menu_append(GTK_MENU(m), w);
+}
+
+static void
+sp_anchor_link_properties(GtkMenuItem *menuitem, SPAnchor *anchor)
+{
+ sp_object_attributes_dialog(SP_OBJECT(anchor), "Link");
+}
+
+static void
+sp_anchor_link_follow(GtkMenuItem *menuitem, SPAnchor *anchor)
+{
+ g_return_if_fail(anchor != NULL);
+ g_return_if_fail(SP_IS_ANCHOR(anchor));
+
+ /* shell out to an external browser here */
+}
+
+static void
+sp_anchor_link_remove(GtkMenuItem *menuitem, SPAnchor *anchor)
+{
+ GSList *children;
+
+ g_return_if_fail(anchor != NULL);
+ g_return_if_fail(SP_IS_ANCHOR(anchor));
+
+ children = NULL;
+ sp_item_group_ungroup(SP_GROUP(anchor), &children);
+
+ g_slist_free(children);
+}
+
+/* Image */
+
+static void sp_image_image_properties(GtkMenuItem *menuitem, SPAnchor *anchor);
+
+static void
+sp_image_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
+{
+ SPItem *item;
+ GtkWidget *w;
+
+ item = (SPItem *) object;
+
+ /* Link dialog */
+ 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);
+ gtk_menu_append(GTK_MENU(m), w);
+}
+
+static void
+sp_image_image_properties(GtkMenuItem *menuitem, SPAnchor *anchor)
+{
+ sp_object_attributes_dialog(SP_OBJECT(anchor), "Image");
+}
+
+/* SPShape */
+
+static void
+sp_shape_fill_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_object_properties_dialog();
+}
+
+static void
+sp_shape_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
+{
+ SPItem *item;
+ GtkWidget *w;
+
+ item = (SPItem *) object;
+
+ /* Item 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_shape_fill_settings), item);
+ gtk_widget_show(w);
+ gtk_menu_append(GTK_MENU(m), w);
+}
+
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
diff --git a/src/ui/context-menu.h b/src/ui/context-menu.h
--- /dev/null
+++ b/src/ui/context-menu.h
@@ -0,0 +1,32 @@
+#ifndef __CONTEXT_MENU_H__
+#define __CONTEXT_MENU_H__
+
+/*
+ * Unser-interface related object extension
+ *
+ * Authors:
+ * Lauris Kaplinski <lauris@kaplinski.com>
+ *
+ * This code is in public domain
+ */
+
+#include <gtk/gtkmenu.h>
+
+#include "forward.h"
+
+/* Append object-specific part to context menu */
+
+void sp_object_menu (SPObject *object, SPDesktop *desktop, GtkMenu *menu);
+
+#endif
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :