aboutsummaryrefslogtreecommitdiffstats
path: root/shell/e-shell-window-commands.c
diff options
context:
space:
mode:
Diffstat (limited to 'shell/e-shell-window-commands.c')
-rw-r--r--shell/e-shell-window-commands.c353
1 files changed, 353 insertions, 0 deletions
diff --git a/shell/e-shell-window-commands.c b/shell/e-shell-window-commands.c
new file mode 100644
index 0000000000..b75fc998a4
--- /dev/null
+++ b/shell/e-shell-window-commands.c
@@ -0,0 +1,353 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* e-shell-window-commands.c
+ *
+ * Copyright (C) 2003 Ettore Perazzoli
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * 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, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Author: Ettore Perazzoli <ettore@ximian.com>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "e-shell-window-commands.h"
+
+#include "e-shell-about-box.h"
+#include "e-shell-window.h"
+
+#include "evolution-shell-component-utils.h"
+
+#include "e-util/e-dialog-utils.h"
+
+#include <libgnome/gnome-exec.h>
+#include <libgnome/gnome-url.h>
+#include <libgnome/gnome-i18n.h>
+
+#include <bonobo/bonobo-ui-component.h>
+
+
+/* Utility functions. */
+
+static void
+launch_pilot_settings (const char *extra_arg)
+{
+ char *args[] = {
+ "gpilotd-control-applet",
+ (char *) extra_arg,
+ NULL
+ };
+ int pid;
+
+ args[0] = g_find_program_in_path ("gpilotd-control-applet");
+ if (!args[0]) {
+ e_notice (NULL, GTK_MESSAGE_ERROR,
+ _("The GNOME Pilot tools do not appear to be installed on this system."));
+ return;
+ }
+
+ pid = gnome_execute_async (NULL, extra_arg ? 2 : 1, args);
+ g_free (args[0]);
+
+ if (pid == -1)
+ e_notice (NULL, GTK_MESSAGE_ERROR, _("Error executing %s."), args[0]);
+}
+
+
+/* Command callbacks. */
+
+static void
+command_import (BonoboUIComponent *uih,
+ EShellWindow *window,
+ const char *path)
+{
+ g_warning ("Import not implemented!");
+
+ /* e_shell_importer_start_import (); FIXME TODO */
+}
+
+static void
+command_close (BonoboUIComponent *uih,
+ EShellWindow *window,
+ const char *path)
+{
+ if (e_shell_request_close_window (e_shell_window_peek_shell (window), window))
+ gtk_widget_destroy (GTK_WIDGET (window));
+}
+
+static void
+command_quit (BonoboUIComponent *uih,
+ EShellWindow *window,
+ const char *path)
+{
+ EShell *shell = e_shell_window_peek_shell (window);
+
+ e_shell_window_save_defaults (window);
+
+ if (e_shell_prepare_for_quit (shell))
+ e_shell_close_all_windows (shell);
+}
+
+static void
+command_submit_bug (BonoboUIComponent *uih,
+ EShellWindow *window,
+ const char *path)
+{
+ int pid;
+ char *args[] = {
+ "bug-buddy",
+ "--sm-disable",
+ "--package=evolution",
+ "--package-ver="VERSION,
+ NULL
+ };
+
+ args[0] = g_find_program_in_path ("bug-buddy");
+ if (!args[0]) {
+ e_notice (NULL, GTK_MESSAGE_ERROR, _("Bug buddy is not installed."));
+ return;
+ }
+
+ pid = gnome_execute_async (NULL, 4, args);
+ g_free (args[0]);
+
+ if (pid == -1)
+ e_notice (NULL, GTK_MESSAGE_ERROR, _("Bug buddy could not be run."));
+}
+
+static int
+about_box_event_callback (GtkWidget *widget,
+ GdkEvent *event,
+ GtkWidget **widget_pointer)
+{
+ gtk_widget_destroy (GTK_WIDGET (*widget_pointer));
+ *widget_pointer = NULL;
+
+ return TRUE;
+}
+
+static void
+command_about_box (BonoboUIComponent *uih,
+ EShellWindow *window,
+ const char *path)
+{
+ static GtkWidget *about_box_window = NULL;
+ GtkWidget *about_box;
+
+ if (about_box_window != NULL) {
+ gdk_window_raise (about_box_window->window);
+ return;
+ }
+
+ about_box = e_shell_about_box_new ();
+ gtk_widget_show (about_box);
+
+ about_box_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_type_hint (GTK_WINDOW (about_box_window), GDK_WINDOW_TYPE_HINT_DIALOG);
+
+ gtk_window_set_resizable (GTK_WINDOW (about_box_window), FALSE);
+ g_signal_connect (about_box_window, "key_press_event",
+ G_CALLBACK (about_box_event_callback), &about_box_window);
+ g_signal_connect (about_box_window, "button_press_event",
+ G_CALLBACK (about_box_event_callback), &about_box_window);
+ g_signal_connect (about_box_window, "delete_event",
+ G_CALLBACK (about_box_event_callback), &about_box_window);
+
+ gtk_window_set_transient_for (GTK_WINDOW (about_box_window), GTK_WINDOW (window));
+ gtk_window_set_title (GTK_WINDOW (about_box_window), _("About Ximian Evolution"));
+ gtk_container_add (GTK_CONTAINER (about_box_window), about_box);
+ gtk_widget_show (about_box_window);
+}
+
+static void
+command_help_faq (BonoboUIComponent *uih,
+ EShellWindow *window,
+ const char *path)
+{
+ gnome_url_show ("http://www.ximian.com/apps/evolution-faq.html", NULL); /* FIXME use the error */
+}
+
+
+static void
+command_work_offline (BonoboUIComponent *uih,
+ EShellWindow *window,
+ const char *path)
+{
+ e_shell_go_offline (e_shell_window_peek_shell (window), window);
+}
+
+static void
+command_work_online (BonoboUIComponent *uih,
+ EShellWindow *window,
+ const char *path)
+{
+ e_shell_go_online (e_shell_window_peek_shell (window), window);
+}
+
+
+/* Tools menu. */
+
+static void
+command_settings (BonoboUIComponent *uih,
+ EShellWindow *window,
+ const char *path)
+{
+ e_shell_window_show_settings (window);
+}
+
+static void
+command_pilot_settings (BonoboUIComponent *uih,
+ EShellWindow *window,
+ const char *path)
+{
+ launch_pilot_settings (NULL);
+}
+
+
+static BonoboUIVerb file_verbs [] = {
+ BONOBO_UI_VERB ("FileImporter", (BonoboUIVerbFn) command_import),
+ BONOBO_UI_VERB ("FileClose", (BonoboUIVerbFn) command_close),
+ BONOBO_UI_VERB ("FileExit", (BonoboUIVerbFn) command_quit),
+
+ BONOBO_UI_VERB ("WorkOffline", (BonoboUIVerbFn) command_work_offline),
+ BONOBO_UI_VERB ("WorkOnline", (BonoboUIVerbFn) command_work_online),
+
+ BONOBO_UI_VERB_END
+};
+
+static BonoboUIVerb tools_verbs[] = {
+ BONOBO_UI_VERB ("Settings", (BonoboUIVerbFn) command_settings),
+ BONOBO_UI_VERB ("PilotSettings", (BonoboUIVerbFn) command_pilot_settings),
+
+ BONOBO_UI_VERB_END
+};
+
+static BonoboUIVerb help_verbs [] = {
+ BONOBO_UI_VERB ("HelpFAQ", (BonoboUIVerbFn) command_help_faq),
+ BONOBO_UI_VERB ("HelpSubmitBug", (BonoboUIVerbFn) command_submit_bug),
+ BONOBO_UI_VERB ("HelpAbout", (BonoboUIVerbFn) command_about_box),
+
+ BONOBO_UI_VERB_END
+};
+
+static EPixmap pixmaps [] = {
+ E_PIXMAP ("/menu/File/FileImporter", "import.xpm"),
+ E_PIXMAP ("/menu/File/ToggleOffline", "work_offline.xpm"),
+ E_PIXMAP ("/menu/Tools/Settings", "settings-16.png"),
+
+ E_PIXMAP_END
+};
+
+static EPixmap offline_pixmaps [] = {
+ E_PIXMAP ("/menu/File/ToggleOffline", "work_offline.xpm"),
+ E_PIXMAP_END
+};
+
+static EPixmap online_pixmaps [] = {
+ E_PIXMAP ("/menu/File/ToggleOffline", "work_online-16.png"),
+ E_PIXMAP_END
+};
+
+
+/* The Work Online / Work Offline menu item. */
+
+static void
+update_offline_menu_item (EShellWindow *shell_window,
+ EShellLineStatus line_status)
+{
+ BonoboUIComponent *ui_component;
+
+ ui_component = e_shell_window_peek_bonobo_ui_component (shell_window);
+
+ switch (line_status) {
+ case E_SHELL_LINE_STATUS_OFFLINE:
+ bonobo_ui_component_set_prop (ui_component,
+ "/menu/File/ToggleOffline",
+ "label", _("_Work Online"), NULL);
+ bonobo_ui_component_set_prop (ui_component,
+ "/menu/File/ToggleOffline",
+ "verb", "WorkOnline", NULL);
+ bonobo_ui_component_set_prop (ui_component,
+ "/commands/ToggleOffline",
+ "sensitive", "1", NULL);
+ e_pixmaps_update (ui_component, online_pixmaps);
+ break;
+
+ case E_SHELL_LINE_STATUS_ONLINE:
+ bonobo_ui_component_set_prop (ui_component,
+ "/menu/File/ToggleOffline",
+ "label", _("_Work Offline"), NULL);
+ bonobo_ui_component_set_prop (ui_component,
+ "/menu/File/ToggleOffline",
+ "verb", "WorkOffline", NULL);
+ bonobo_ui_component_set_prop (ui_component,
+ "/commands/ToggleOffline",
+ "sensitive", "1", NULL);
+ e_pixmaps_update (ui_component, offline_pixmaps);
+ break;
+
+ case E_SHELL_LINE_STATUS_GOING_OFFLINE:
+ bonobo_ui_component_set_prop (ui_component,
+ "/menu/File/ToggleOffline",
+ "label", _("Work Offline"), NULL);
+ bonobo_ui_component_set_prop (ui_component,
+ "/menu/File/ToggleOffline",
+ "verb", "WorkOffline", NULL);
+ bonobo_ui_component_set_prop (ui_component,
+ "/commands/ToggleOffline",
+ "sensitive", "0", NULL);
+ e_pixmaps_update (ui_component, offline_pixmaps);
+ break;
+
+ default:
+ g_assert_not_reached ();
+ }
+}
+
+static void
+shell_line_status_changed_cb (EShell *shell,
+ EShellLineStatus new_status,
+ EShellWindow *shell_window)
+{
+ update_offline_menu_item (shell_window, new_status);
+}
+
+
+/* Public API. */
+
+void
+e_shell_window_commands_setup (EShellWindow *shell_window)
+{
+ BonoboUIComponent *uic;
+ EShell *shell;
+
+ g_return_if_fail (shell_window != NULL);
+ g_return_if_fail (E_IS_SHELL_WINDOW (shell_window));
+
+ uic = e_shell_window_peek_bonobo_ui_component (shell_window);
+ shell = e_shell_window_peek_shell (shell_window);
+
+ bonobo_ui_component_add_verb_list_with_data (uic, file_verbs, shell_window);
+ bonobo_ui_component_add_verb_list_with_data (uic, tools_verbs, shell_window);
+ bonobo_ui_component_add_verb_list_with_data (uic, help_verbs, shell_window);
+
+ e_pixmaps_update (uic, pixmaps);
+
+ /* Set up the work online / work offline menu item. */
+ g_signal_connect_object (shell, "line_status_changed",
+ G_CALLBACK (shell_line_status_changed_cb), shell_window, 0);
+ update_offline_menu_item (shell_window, e_shell_get_line_status (shell));
+}