diff options
Diffstat (limited to 'shell/e-shell-window-commands.c')
-rw-r--r-- | shell/e-shell-window-commands.c | 353 |
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)); +} |