summaryrefslogtreecommitdiff
path: root/tikzit-old/src/gtk/Menu.m
diff options
context:
space:
mode:
Diffstat (limited to 'tikzit-old/src/gtk/Menu.m')
-rw-r--r--tikzit-old/src/gtk/Menu.m737
1 files changed, 737 insertions, 0 deletions
diff --git a/tikzit-old/src/gtk/Menu.m b/tikzit-old/src/gtk/Menu.m
new file mode 100644
index 0000000..04c9c31
--- /dev/null
+++ b/tikzit-old/src/gtk/Menu.m
@@ -0,0 +1,737 @@
+/*
+ * Copyright 2011 Alex Merry <alex.merry@kdemail.net>
+ *
+ * Stuff stolen from glade-window.c in Glade:
+ * Copyright (C) 2001 Ximian, Inc.
+ * Copyright (C) 2007 Vincent Geddes.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#import "Menu.h"
+
+#import "Application.h"
+#import "Window.h"
+#import "Configuration.h"
+#import "PickSupport.h"
+#import "Shape.h"
+#import "Tool.h"
+#import "TikzDocument.h"
+
+#import <glib.h>
+#ifdef _
+#undef _
+#endif
+#import <glib/gi18n.h>
+#import <gtk/gtk.h>
+
+#import "gtkhelpers.h"
+
+#import "logo.h"
+
+// {{{ Application actions
+static void new_cb (GtkAction *action, Application *appl) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [appl newWindow];
+ [pool drain];
+}
+
+static void refresh_shapes_cb (GtkAction *action, Application *appl) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [Shape refreshShapeDictionary];
+ [pool drain];
+}
+
+static void show_preferences_cb (GtkAction *action, Application *appl) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [appl presentSettingsDialog];
+ [pool drain];
+}
+
+#ifdef HAVE_POPPLER
+static void show_preamble_cb (GtkAction *action, Application *appl) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [appl presentPreamblesEditor];
+ [pool drain];
+}
+#endif
+
+static void show_context_window_cb (GtkAction *action, Application *appl) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [appl presentContextWindow];
+ [pool drain];
+}
+
+static void quit_cb (GtkAction *action, Application *appl) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [appl quit];
+ [pool drain];
+}
+
+static void help_cb (GtkAction *action, Application *appl) {
+ GError *gerror = NULL;
+ gtk_show_uri (NULL, "http://tikzit.sourceforge.net/manual.html", GDK_CURRENT_TIME, &gerror);
+ if (gerror != NULL) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ logGError (gerror, @"Could not show help");
+ [pool drain];
+ }
+}
+
+static void about_cb (GtkAction *action, Application *appl) {
+ static const gchar * const authors[] =
+ { "Aleks Kissinger <aleks0@gmail.com>",
+ "Chris Heunen <chrisheunen@gmail.com>",
+ "Alex Merry <dev@randomguy3.me.uk>",
+ NULL };
+
+ static const gchar license[] =
+ N_("TikZiT is free software; you can redistribute it and/or modify "
+ "it under the terms of the GNU General Public License as "
+ "published by the Free Software Foundation; either version 2 of the "
+ "License, or (at your option) any later version."
+ "\n\n"
+ "TikZiT is distributed in the hope that it will be useful, "
+ "but WITHOUT ANY WARRANTY; without even the implied warranty of "
+ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the "
+ "GNU General Public License for more details."
+ "\n\n"
+ "You should have received a copy of the GNU General Public License "
+ "along with TikZiT; if not, write to the Free Software "
+ "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, "
+ "MA 02110-1301, USA.");
+
+ static const gchar copyright[] =
+ "Copyright \xc2\xa9 2010-2011 Aleks Kissinger, Chris Heunen and Alex Merry.";
+
+ GdkPixbuf *logo = get_logo (LOGO_SIZE_128);
+ gtk_show_about_dialog (NULL,
+ "program-name", PACKAGE_NAME,
+ "logo", logo,
+ "authors", authors,
+ "translator-credits", _("translator-credits"),
+ "comments", _("A graph manipulation program for pgf/tikz graphs"),
+ "license", _(license),
+ "wrap-license", TRUE,
+ "copyright", copyright,
+ "version", PACKAGE_VERSION,
+ "website", "http://tikzit.sourceforge.net",
+ NULL);
+ g_object_unref (logo);
+}
+
+static GtkActionEntry app_action_entries[] = {
+ /*
+ Fields:
+ * action name
+ * stock id or name of icon for action
+ * label for action (mark for translation with N_)
+ * accelerator (as understood by gtk_accelerator_parse())
+ * tooltip (mark for translation with N_)
+ * callback
+ */
+ { "New", GTK_STOCK_NEW, NULL, "<control>N",
+ N_("Create a new graph"), G_CALLBACK (new_cb) },
+
+ { "RefreshShapes", NULL, N_("_Refresh shapes"), NULL,
+ N_(""), G_CALLBACK (refresh_shapes_cb) },
+
+ { "Quit", GTK_STOCK_QUIT, NULL, "<control>Q",
+ N_("Quit the program"), G_CALLBACK (quit_cb) },
+
+ { "Tool", NULL, N_("_Tool") },
+
+ { "ShowPreferences", GTK_STOCK_PREFERENCES, N_("Configure TikZiT..."), NULL,
+ N_("Edit the TikZiT configuration"), G_CALLBACK (show_preferences_cb) },
+
+#ifdef HAVE_POPPLER
+ { "ShowPreamble", NULL, N_("_Edit Preambles..."), NULL,
+ N_("Edit the preambles used to generate the preview"), G_CALLBACK (show_preamble_cb) },
+#endif
+
+ { "ShowContextWindow", NULL, N_("_Context Window"), NULL,
+ N_("Show the contextual tools window"), G_CALLBACK (show_context_window_cb) },
+
+ /* HelpMenu */
+ { "HelpManual", GTK_STOCK_HELP, N_("_Online manual"), "F1",
+ N_("TikZiT manual (online)"), G_CALLBACK (help_cb) },
+
+ { "About", GTK_STOCK_ABOUT, NULL, NULL,
+ N_("About this application"), G_CALLBACK (about_cb) },
+};
+static guint n_app_action_entries = G_N_ELEMENTS (app_action_entries);
+// }}}
+// {{{ Window actions
+
+static void open_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [window openFile];
+ [pool drain];
+}
+
+static void close_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [window close];
+ [pool drain];
+}
+
+static void save_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [window saveActiveDocument];
+ [pool drain];
+}
+
+static void save_as_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [window saveActiveDocumentAs];
+ [pool drain];
+}
+
+static void save_as_shape_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [window saveActiveDocumentAsShape];
+ [pool drain];
+}
+
+static void undo_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ TikzDocument *document = [window document];
+ if ([document canUndo]) {
+ [document undo];
+ } else {
+ g_warning ("Can't undo!\n");
+ gtk_action_set_sensitive (action, FALSE);
+ }
+
+ [pool drain];
+}
+
+static void redo_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ TikzDocument *document = [window document];
+ if ([document canRedo]) {
+ [document redo];
+ } else {
+ g_warning ("Can't redo!\n");
+ gtk_action_set_sensitive (action, FALSE);
+ }
+
+ [pool drain];
+}
+
+static void cut_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [window selectionCutToClipboard];
+ [pool drain];
+}
+
+static void copy_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [window selectionCopyToClipboard];
+ [pool drain];
+}
+
+static void paste_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [window pasteFromClipboard];
+ [pool drain];
+}
+
+static void delete_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [[window document] removeSelected];
+ [pool drain];
+}
+
+static void select_all_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ TikzDocument *document = [window document];
+ [[document pickSupport] selectAllNodes:[NSSet setWithArray:[[document graph] nodes]]];
+ [pool drain];
+}
+
+static void deselect_all_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ TikzDocument *document = [window document];
+ [[document pickSupport] deselectAllNodes];
+ [[document pickSupport] deselectAllEdges];
+ [pool drain];
+}
+
+static void flip_horiz_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [[window document] flipSelectedNodesHorizontally];
+ [pool drain];
+}
+
+static void flip_vert_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [[window document] flipSelectedNodesVertically];
+ [pool drain];
+}
+
+static void reverse_edges_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [[window document] reverseSelectedEdges];
+ [pool drain];
+}
+
+static void bring_forward_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [[window document] bringSelectionForward];
+ [pool drain];
+}
+
+static void send_backward_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [[window document] sendSelectionBackward];
+ [pool drain];
+}
+
+static void bring_to_front_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [[window document] bringSelectionToFront];
+ [pool drain];
+}
+
+static void send_to_back_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [[window document] sendSelectionToBack];
+ [pool drain];
+}
+
+#ifdef HAVE_POPPLER
+static void show_preview_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [window presentPreview];
+ [pool drain];
+}
+#endif
+
+static void zoom_in_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [window zoomIn];
+ [pool drain];
+}
+
+static void zoom_out_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [window zoomOut];
+ [pool drain];
+}
+
+static void zoom_reset_cb (GtkAction *action, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [window zoomReset];
+ [pool drain];
+}
+
+static void recent_chooser_item_activated_cb (GtkRecentChooser *chooser, Window *window) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ gchar *uri, *path;
+ GError *error = NULL;
+
+ uri = gtk_recent_chooser_get_current_uri (chooser);
+
+ path = g_filename_from_uri (uri, NULL, NULL);
+ if (error) {
+ g_warning ("Could not convert uri \"%s\" to a local path: %s", uri, error->message);
+ g_error_free (error);
+ return;
+ }
+
+ [window openFileAtPath:[NSString stringWithGlibFilename:path]];
+
+ g_free (uri);
+ g_free (path);
+
+ [pool drain];
+}
+
+
+static GtkActionEntry window_action_entries[] = {
+ /*
+ Fields:
+ * action name
+ * stock id or name of icon for action
+ * label for action (mark for translation with N_)
+ * accelerator (as understood by gtk_accelerator_parse())
+ * tooltip (mark for translation with N_)
+ * callback
+ */
+ { "FileMenu", NULL, N_("_File") },
+ { "EditMenu", NULL, N_("_Edit") },
+ { "ViewMenu", NULL, N_("_View") },
+ { "HelpMenu", NULL, N_("_Help") },
+
+ { "Arrange", NULL, N_("_Arrange") },
+ { "Zoom", NULL, N_("_Zoom") },
+
+ { "Open", GTK_STOCK_OPEN, N_("_Open\342\200\246") ,"<control>O",
+ N_("Open a graph"), G_CALLBACK (open_cb) },
+
+ { "Close", GTK_STOCK_CLOSE, NULL, "<control>W",
+ N_("Close the current graph"), G_CALLBACK (close_cb) },
+
+ { "ZoomIn", GTK_STOCK_ZOOM_IN, NULL, "<control>plus",
+ NULL, G_CALLBACK (zoom_in_cb) },
+
+ { "ZoomOut", GTK_STOCK_ZOOM_OUT, NULL, "<control>minus",
+ NULL, G_CALLBACK (zoom_out_cb) },
+
+ { "ZoomReset", GTK_STOCK_ZOOM_100, N_("_Reset zoom"), "<control>0",
+ NULL, G_CALLBACK (zoom_reset_cb) },
+
+ { "Save", GTK_STOCK_SAVE, NULL, "<control>S",
+ N_("Save the current graph"), G_CALLBACK (save_cb) },
+
+ { "SaveAs", GTK_STOCK_SAVE_AS, N_("Save _As\342\200\246"), NULL,
+ N_("Save the current graph with a different name"), G_CALLBACK (save_as_cb) },
+
+ { "SaveAsShape", NULL, N_("Save As S_hape\342\200\246"), NULL,
+ N_("Save the current graph as a shape for use in styles"), G_CALLBACK (save_as_shape_cb) },
+
+ { "Undo", GTK_STOCK_UNDO, NULL, "<control>Z",
+ N_("Undo the last action"), G_CALLBACK (undo_cb) },
+
+ { "Redo", GTK_STOCK_REDO, NULL, "<shift><control>Z",
+ N_("Redo the last action"), G_CALLBACK (redo_cb) },
+
+ { "Cut", GTK_STOCK_CUT, NULL, NULL,
+ N_("Cut the selection"), G_CALLBACK (cut_cb) },
+
+ { "Copy", GTK_STOCK_COPY, NULL, NULL,
+ N_("Copy the selection"), G_CALLBACK (copy_cb) },
+
+ { "Paste", GTK_STOCK_PASTE, NULL, NULL,
+ N_("Paste the clipboard"), G_CALLBACK (paste_cb) },
+
+ { "Delete", GTK_STOCK_DELETE, NULL, "Delete",
+ N_("Delete the selection"), G_CALLBACK (delete_cb) },
+
+ { "SelectAll", GTK_STOCK_SELECT_ALL, NULL, "<control>A",
+ N_("Select all nodes on the graph"), G_CALLBACK (select_all_cb) },
+
+ { "DeselectAll", NULL, N_("D_eselect all"), "<shift><control>A",
+ N_("Deselect everything"), G_CALLBACK (deselect_all_cb) },
+
+ { "FlipHoriz", NULL, N_("Flip nodes _horizonally"), NULL,
+ N_("Flip the selected nodes horizontally"), G_CALLBACK (flip_horiz_cb) },
+
+ { "FlipVert", NULL, N_("Flip nodes _vertically"), NULL,
+ N_("Flip the selected nodes vertically"), G_CALLBACK (flip_vert_cb) },
+
+ { "ReverseEdges", NULL, N_("Rever_se edges"), NULL,
+ N_("Reverse the selected edges"), G_CALLBACK (reverse_edges_cb) },
+
+ { "SendToBack", NULL, N_("Send to _back"), NULL,
+ N_("Send the selected nodes and edges to the back of the graph"), G_CALLBACK (send_to_back_cb) },
+
+ { "SendBackward", NULL, N_("Send b_ackward"), NULL,
+ N_("Send the selected nodes and edges backward"), G_CALLBACK (send_backward_cb) },
+
+ { "BringForward", NULL, N_("Bring f_orward"), NULL,
+ N_("Bring the selected nodes and edges forward"), G_CALLBACK (bring_forward_cb) },
+
+ { "BringToFront", NULL, N_("Bring to _front"), NULL,
+ N_("Bring the selected nodes and edges to the front of the graph"), G_CALLBACK (bring_to_front_cb) },
+
+ /* ViewMenu */
+#ifdef HAVE_POPPLER
+ { "ShowPreview", NULL, N_("_Preview"), "<control>L",
+ N_("See the graph as it will look when rendered in LaTeX"), G_CALLBACK (show_preview_cb) },
+#endif
+};
+static guint n_window_action_entries = G_N_ELEMENTS (window_action_entries);
+
+// }}}
+// {{{ UI XML
+
+static const gchar ui_info[] =
+"<ui>"
+" <menubar name='MenuBar'>"
+" <menu action='FileMenu'>"
+" <menuitem action='New'/>"
+" <menuitem action='Open'/>"
+" <menuitem action='OpenRecent'/>"
+" <separator/>"
+" <menuitem action='Save'/>"
+" <menuitem action='SaveAs'/>"
+" <separator/>"
+" <menuitem action='SaveAsShape'/>"
+" <menuitem action='RefreshShapes'/>"
+" <separator/>"
+" <menuitem action='Close'/>"
+" <menuitem action='Quit'/>"
+" </menu>"
+" <menu action='EditMenu'>"
+" <menu action='Tool'>"
+" </menu>"
+" <separator/>"
+" <menuitem action='Undo'/>"
+" <menuitem action='Redo'/>"
+" <separator/>"
+" <menuitem action='Cut'/>"
+" <menuitem action='Copy'/>"
+" <menuitem action='Paste'/>"
+" <menuitem action='Delete'/>"
+" <separator/>"
+" <menuitem action='SelectAll'/>"
+" <menuitem action='DeselectAll'/>"
+" <separator/>"
+" <menuitem action='FlipVert'/>"
+" <menuitem action='FlipHoriz'/>"
+" <menuitem action='ReverseEdges'/>"
+" <separator/>"
+" <menu action='Arrange'>"
+" <menuitem action='SendToBack'/>"
+" <menuitem action='SendBackward'/>"
+" <menuitem action='BringForward'/>"
+" <menuitem action='BringToFront'/>"
+" </menu>"
+" <separator/>"
+" <menuitem action='ShowPreferences'/>"
+" </menu>"
+" <menu action='ViewMenu'>"
+" <menuitem action='ShowContextWindow'/>"
+#ifdef HAVE_POPPLER
+" <menuitem action='ShowPreamble'/>"
+" <menuitem action='ShowPreview'/>"
+#endif
+" <menu action='Zoom'>"
+" <menuitem action='ZoomIn'/>"
+" <menuitem action='ZoomOut'/>"
+" <menuitem action='ZoomReset'/>"
+" </menu>"
+" </menu>"
+" <menu action='HelpMenu'>"
+" <menuitem action='HelpManual'/>"
+" <separator/>"
+" <menuitem action='About'/>"
+" </menu>"
+" </menubar>"
+/*
+" <toolbar name='ToolBar'>"
+" <toolitem action='New'/>"
+" <toolitem action='Open'/>"
+" <toolitem action='Save'/>"
+" <separator/>"
+" <toolitem action='Cut'/>"
+" <toolitem action='Copy'/>"
+" <toolitem action='Paste'/>"
+" <separator/>"
+" <toolitem action='SelectMode'/>"
+" <toolitem action='CreateNodeMode'/>"
+" <toolitem action='DrawEdgeMode'/>"
+" <toolitem action='BoundingBoxMode'/>"
+" <toolitem action='HandMode'/>"
+" </toolbar>"
+*/
+"</ui>";
+
+
+
+// }}}
+// {{{ Helper methods
+
+static void configure_recent_chooser (GtkRecentChooser *chooser)
+{
+ gtk_recent_chooser_set_local_only (chooser, TRUE);
+ gtk_recent_chooser_set_show_icons (chooser, FALSE);
+ gtk_recent_chooser_set_sort_type (chooser, GTK_RECENT_SORT_MRU);
+
+ GtkRecentFilter *filter = gtk_recent_filter_new ();
+ gtk_recent_filter_add_application (filter, g_get_application_name());
+ gtk_recent_chooser_set_filter (chooser, filter);
+}
+
+static void tool_cb (GtkAction *action, id<Tool> tool) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [app setActiveTool:tool];
+ [pool drain];
+}
+
+
+
+// }}}
+// {{{ API
+
+@implementation Menu
+
+- (id) init {
+ [self release];
+ return nil;
+}
+
+- (id) initForWindow:(Window*)window {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ GError *error = NULL;
+
+ appActions = gtk_action_group_new ("TZApp");
+ //gtk_action_group_set_translation_domain (actions, GETTEXT_PACKAGE);
+ gtk_action_group_add_actions (appActions,
+ app_action_entries,
+ n_app_action_entries,
+ app);
+ for (id<Tool> tool in [app tools]) {
+ NSString *tooltip = [NSString stringWithFormat:
+ @"%@: %@ (%@)", [tool name], [tool helpText], [tool shortcut]];
+ GtkAction *action = gtk_action_new (
+ [[tool name] UTF8String],
+ [[tool name] UTF8String],
+ [tooltip UTF8String],
+ [tool stockId]);
+ gtk_action_group_add_action_with_accel (
+ appActions,
+ action,
+ NULL);
+ g_signal_connect (
+ G_OBJECT (action),
+ "activate",
+ G_CALLBACK (tool_cb),
+ tool);
+ g_object_unref (action);
+ }
+
+ windowActions = gtk_action_group_new ("TZWindow");
+ //gtk_action_group_set_translation_domain (windowActions, GETTEXT_PACKAGE);
+
+ gtk_action_group_add_actions (windowActions,
+ window_action_entries,
+ n_window_action_entries,
+ window);
+
+ GtkAction *action = gtk_recent_action_new ("OpenRecent", N_("Open _Recent"), NULL, NULL);
+ g_signal_connect (G_OBJECT (action),
+ "item-activated",
+ G_CALLBACK (recent_chooser_item_activated_cb),
+ window);
+ configure_recent_chooser (GTK_RECENT_CHOOSER (action));
+ gtk_action_group_add_action_with_accel (windowActions, action, NULL);
+ g_object_unref (action);
+
+ /* Save refs to actions that will need to be updated */
+ undoAction = gtk_action_group_get_action (windowActions, "Undo");
+ redoAction = gtk_action_group_get_action (windowActions, "Redo");
+ pasteAction = gtk_action_group_get_action (windowActions, "Paste");
+
+ nodeSelBasedActionCount = 4;
+ nodeSelBasedActions = g_new (GtkAction*, nodeSelBasedActionCount);
+ nodeSelBasedActions[0] = gtk_action_group_get_action (windowActions, "Cut");
+ nodeSelBasedActions[1] = gtk_action_group_get_action (windowActions, "Copy");
+ nodeSelBasedActions[2] = gtk_action_group_get_action (windowActions, "FlipHoriz");
+ nodeSelBasedActions[3] = gtk_action_group_get_action (windowActions, "FlipVert");
+ edgeSelBasedActionCount = 1;
+ edgeSelBasedActions = g_new (GtkAction*, edgeSelBasedActionCount);
+ edgeSelBasedActions[0] = gtk_action_group_get_action (windowActions, "ReverseEdges");
+ selBasedActionCount = 2;
+ selBasedActions = g_new (GtkAction*, selBasedActionCount);
+ selBasedActions[0] = gtk_action_group_get_action (windowActions, "Delete");
+ selBasedActions[1] = gtk_action_group_get_action (windowActions, "DeselectAll");
+
+
+ GtkUIManager *ui = gtk_ui_manager_new ();
+ gtk_ui_manager_insert_action_group (ui, windowActions, 0);
+ gtk_ui_manager_insert_action_group (ui, appActions, 1);
+ gtk_window_add_accel_group ([window gtkWindow], gtk_ui_manager_get_accel_group (ui));
+ if (!gtk_ui_manager_add_ui_from_string (ui, ui_info, -1, &error))
+ {
+ g_message ("Building menus failed: %s", error->message);
+ g_error_free (error);
+ g_object_unref (ui);
+ [self release];
+ return nil;
+ }
+ guint tool_merge_id = gtk_ui_manager_new_merge_id (ui);
+ for (id<Tool> tool in [app tools]) {
+ gtk_ui_manager_add_ui (ui,
+ tool_merge_id,
+ "/ui/MenuBar/EditMenu/Tool",
+ [[tool name] UTF8String],
+ [[tool name] UTF8String],
+ GTK_UI_MANAGER_AUTO,
+ FALSE);
+ }
+ menubar = gtk_ui_manager_get_widget (ui, "/MenuBar");
+ g_object_ref_sink (menubar);
+ g_object_unref (ui);
+
+ return self;
+}
+
+- (void) dealloc {
+ g_free (nodeSelBasedActions);
+ g_free (edgeSelBasedActions);
+ g_free (selBasedActions);
+ g_object_unref (menubar);
+ g_object_unref (appActions);
+ g_object_unref (windowActions);
+
+ [super dealloc];
+}
+
+@synthesize menubar;
+
+- (void) setUndoActionEnabled:(BOOL)enabled {
+ gtk_action_set_sensitive (undoAction, enabled);
+}
+
+- (void) setUndoActionDetail:(NSString*)detail {
+ gtk_action_set_detailed_label (undoAction, "_Undo", [detail UTF8String]);
+}
+
+- (void) setRedoActionEnabled:(BOOL)enabled {
+ gtk_action_set_sensitive (redoAction, enabled);
+}
+
+- (void) setRedoActionDetail:(NSString*)detail {
+ gtk_action_set_detailed_label (redoAction, "_Redo", [detail UTF8String]);
+}
+
+- (GtkAction*) pasteAction {
+ return pasteAction;
+}
+
+- (void) notifySelectionChanged:(PickSupport*)pickSupport {
+ BOOL hasSelectedNodes = [[pickSupport selectedNodes] count] > 0;
+ BOOL hasSelectedEdges = [[pickSupport selectedEdges] count] > 0;
+ for (int i = 0; i < nodeSelBasedActionCount; ++i) {
+ if (nodeSelBasedActions[i]) {
+ gtk_action_set_sensitive (nodeSelBasedActions[i], hasSelectedNodes);
+ }
+ }
+ for (int i = 0; i < edgeSelBasedActionCount; ++i) {
+ if (edgeSelBasedActions[i]) {
+ gtk_action_set_sensitive (edgeSelBasedActions[i], hasSelectedEdges);
+ }
+ }
+ for (int i = 0; i < selBasedActionCount; ++i) {
+ if (selBasedActions[i]) {
+ gtk_action_set_sensitive (selBasedActions[i], hasSelectedNodes || hasSelectedEdges);
+ }
+ }
+}
+
+@end
+
+// }}}
+
+// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker