354 lines
9.5 KiB
C
354 lines
9.5 KiB
C
/* -*- 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));
|
|
}
|