/* * e-shell-utils.c * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser 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 Lesser General Public License * along with this program; if not, see . * * * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) * */ /** * SECTION: e-shell-utils * @short_description: high-level utilities with shell integration * @include: shell/e-shell-utils.h **/ #include "evolution-config.h" #include #include #include "e-shell-view.h" #include "e-shell-window.h" #include "e-shell-utils.h" /** * e_shell_run_open_dialog: * @shell: an #EShell * @title: file chooser dialog title * @customize_func: optional dialog customization function * @customize_data: optional data to pass to @customize_func * * Runs a #GtkFileChooserDialog in open mode with the given title and * returns the selected #GFile. If @customize_func is provided, the * function is called just prior to running the dialog (the file chooser * is the first argument, @customize data is the second). If the user * cancels the dialog the function will return %NULL. * * Returns: the #GFile to open, or %NULL **/ GFile * e_shell_run_open_dialog (EShell *shell, const gchar *title, GtkCallback customize_func, gpointer customize_data) { GtkFileChooser *file_chooser; GFile *chosen_file = NULL; GtkWidget *dialog; GtkWindow *parent; g_return_val_if_fail (E_IS_SHELL (shell), NULL); parent = e_shell_get_active_window (shell); dialog = gtk_file_chooser_dialog_new ( title, parent, GTK_FILE_CHOOSER_ACTION_OPEN, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Open"), GTK_RESPONSE_ACCEPT, NULL); file_chooser = GTK_FILE_CHOOSER (dialog); gtk_dialog_set_default_response ( GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT); gtk_file_chooser_set_local_only (file_chooser, FALSE); /* Allow further customizations before running the dialog. */ if (customize_func != NULL) customize_func (dialog, customize_data); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) chosen_file = gtk_file_chooser_get_file (file_chooser); gtk_widget_destroy (dialog); return chosen_file; } /** * e_shell_run_save_dialog: * @shell: an #EShell * @title: file chooser dialog title * @suggestion: file name suggestion, or %NULL * @filters: Possible filters for dialog, or %NULL * @customize_func: optional dialog customization function * @customize_data: optional data to pass to @customize_func * * Runs a #GtkFileChooserDialog in save mode with the given title and * returns the selected #GFile. If @customize_func is provided, the * function is called just prior to running the dialog (the file chooser * is the first argument, @customize_data is the second). If the user * cancels the dialog the function will return %NULL. * * With non-%NULL @filters will be added also file filters to the dialog. * The string format is "pat1:mt1;pat2:mt2:...", where 'pat' is a pattern * and 'mt' is a MIME type for the pattern to be used. There can be more * than one MIME type, those are separated by comma. * * Returns: the #GFile to save to, or %NULL **/ GFile * e_shell_run_save_dialog (EShell *shell, const gchar *title, const gchar *suggestion, const gchar *filters, GtkCallback customize_func, gpointer customize_data) { GtkFileChooser *file_chooser; GFile *chosen_file = NULL; GtkWidget *dialog; GtkWindow *parent; g_return_val_if_fail (E_IS_SHELL (shell), NULL); parent = e_shell_get_active_window (shell); dialog = gtk_file_chooser_dialog_new ( title, parent, GTK_FILE_CHOOSER_ACTION_SAVE, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Save"), GTK_RESPONSE_ACCEPT, NULL); file_chooser = GTK_FILE_CHOOSER (dialog); gtk_dialog_set_default_response ( GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT); gtk_file_chooser_set_local_only (file_chooser, FALSE); gtk_file_chooser_set_do_overwrite_confirmation (file_chooser, TRUE); if (suggestion != NULL) { gchar *current_name; current_name = g_strdup (suggestion); e_filename_make_safe (current_name); gtk_file_chooser_set_current_name (file_chooser, current_name); g_free (current_name); } if (filters != NULL) { gchar **flts = g_strsplit (filters, ";", -1); gint i; for (i = 0; flts && flts[i]; i++) { GtkFileFilter *filter = gtk_file_filter_new (); gchar *flt = flts[i]; gchar *delim = strchr (flt, ':'), *next = NULL; if (delim) { *delim = 0; next = strchr (delim + 1, ','); } gtk_file_filter_add_pattern (filter, flt); if (g_ascii_strcasecmp (flt, "*.mbox") == 0) gtk_file_filter_set_name ( filter, _("Berkeley Mailbox (mbox)")); else if (g_ascii_strcasecmp (flt, "*.vcf") == 0) gtk_file_filter_set_name ( filter, _("vCard (.vcf)")); else if (g_ascii_strcasecmp (flt, "*.ics") == 0) gtk_file_filter_set_name ( filter, _("iCalendar (.ics)")); while (delim) { delim++; if (next) *next = 0; gtk_file_filter_add_mime_type (filter, delim); delim = next; if (next) next = strchr (next + 1, ','); } gtk_file_chooser_add_filter (file_chooser, filter); } if (flts && flts[0]) { GtkFileFilter *filter = gtk_file_filter_new (); gtk_file_filter_add_pattern (filter, "*"); gtk_file_filter_set_name (filter, _("All Files (*)")); gtk_file_chooser_add_filter (file_chooser, filter); } g_strfreev (flts); } /* Allow further customizations before running the dialog. */ if (customize_func != NULL) customize_func (dialog, customize_data); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) chosen_file = gtk_file_chooser_get_file (file_chooser); gtk_widget_destroy (dialog); return chosen_file; } /** * e_shell_utils_import_uris: * @shell: The #EShell instance * @uris: %NULL-terminated list of URIs to import * * Imports given URIs to Evolution, giving user a choice what to import * if more than one importer can be applied, and where to import it, if * the importer itself is configurable. * * URIs should be either a filename or URI of form file://. * All others are skipped. * * Returns: the number of URIs successfully handled **/ guint e_shell_utils_import_uris (EShell *shell, const gchar * const *uris) { GtkWindow *parent; GtkWidget *assistant; g_return_val_if_fail (shell != NULL, 0); g_return_val_if_fail (uris != NULL, 0); parent = e_shell_get_active_window (shell); assistant = e_import_assistant_new_simple (parent, uris); if (assistant) { g_signal_connect_after ( assistant, "cancel", G_CALLBACK (gtk_widget_destroy), NULL); g_signal_connect_after ( assistant, "finished", G_CALLBACK (gtk_widget_destroy), NULL); gtk_application_add_window ( GTK_APPLICATION (shell), GTK_WINDOW (assistant)); gtk_widget_show (assistant); } else g_warning ("Cannot import any of the given URIs"); return g_strv_length ((gchar **) uris); } void e_shell_utils_run_preferences (EShell *shell) { GtkWidget *preferences_window; GtkWindow *window; preferences_window = e_shell_get_preferences_window (shell); e_preferences_window_setup (E_PREFERENCES_WINDOW (preferences_window)); window = e_shell_get_active_window (shell); g_return_if_fail (GTK_IS_WINDOW (window)); gtk_window_set_transient_for ( GTK_WINDOW (preferences_window), window); gtk_window_set_position ( GTK_WINDOW (preferences_window), GTK_WIN_POS_CENTER_ON_PARENT); gtk_window_present (GTK_WINDOW (preferences_window)); if (E_IS_SHELL_WINDOW (window)) { EShellView *shell_view; EShellWindow *shell_window; EShellBackend *shell_backend; EShellBackendClass *shell_backend_class; const gchar *view_name; shell_window = E_SHELL_WINDOW (window); view_name = e_shell_window_get_active_view (shell_window); shell_view = e_shell_window_get_shell_view (shell_window, view_name); shell_backend = e_shell_view_get_shell_backend (shell_view); shell_backend_class = E_SHELL_BACKEND_GET_CLASS (shell_backend); if (shell_backend_class->preferences_page != NULL) e_preferences_window_show_page ( E_PREFERENCES_WINDOW (preferences_window), shell_backend_class->preferences_page); } } static gboolean shell_utils_manage_quick_reference (EShell *shell, gboolean only_test) { const gchar * const *language_names; gboolean app_launched = FALSE; gboolean found_any = FALSE; language_names = g_get_language_names (); while (*language_names != NULL && !app_launched) { const gchar *language = *language_names++; gchar *filename; /* This must be a valid language AND a language with * no encoding suffix. The next language should have * no encoding suffix. */ if (language == NULL || strchr (language, '.') != NULL) continue; filename = g_build_filename ( EVOLUTION_HELPDIR, "quickref", language, "quickref.pdf", NULL); if (g_file_test (filename, G_FILE_TEST_EXISTS)) { found_any = TRUE; if (!only_test) { GFile *file; gchar *uri; GError *error = NULL; file = g_file_new_for_path (filename); uri = g_file_get_uri (file); app_launched = g_app_info_launch_default_for_uri ( uri, NULL, &error); if (error != NULL) { /* FIXME Show an error dialog. */ g_warning ("%s", error->message); g_error_free (error); } g_object_unref (file); g_free (uri); } } g_free (filename); } return found_any; } gboolean e_shell_utils_is_quick_reference_available (EShell *shell) { return shell_utils_manage_quick_reference (shell, TRUE); } void e_shell_utils_run_quick_reference (EShell *shell) { shell_utils_manage_quick_reference (shell, FALSE); } void e_shell_utils_run_help_about (EShell *shell) { #define EVOLUTION_COPYRIGHT \ "Copyright \xC2\xA9 1999 - 2008 Novell, Inc. and Others\n" \ "Copyright \xC2\xA9 2008 - 2014 The Evolution Team" /* Authors and Documenters * * The names below must be in UTF-8. The breaking of escaped strings * is so the hexadecimal sequences don't swallow too many characters. * * SO THAT MEANS, FOR 8-BIT CHARACTERS USE \xXX HEX ENCODING ONLY! * * Not all environments are UTF-8 and not all editors can handle it. */ static const gchar *authors[] = { "The Evolution Team", "", "Milan Crha ", "Fabiano Fid\xC3\xAAncio ", "", "and many past contributors", NULL }; static const gchar *documenters[] = { "Andre Klapper", NULL }; gchar *translator_credits; /* The translator-credits string is for translators to list * per-language credits for translation, displayed in the * about dialog. */ translator_credits = _("translator-credits"); if (strcmp (translator_credits, "translator-credits") == 0) translator_credits = NULL; gtk_show_about_dialog ( e_shell_get_active_window (shell), "program-name", "Evolution", "version", VERSION, "copyright", EVOLUTION_COPYRIGHT, "comments", _("Groupware Suite"), "website", PACKAGE_URL, "website-label", _("Evolution Website"), "authors", authors, "documenters", documenters, "translator-credits", translator_credits, "logo-icon-name", "evolution", "license-type", GTK_LICENSE_GPL_2_0, NULL); } void e_shell_utils_run_help_contents (EShell *shell) { #ifdef G_OS_WIN32 gchar *online_help_url; #endif GtkWindow *window; window = e_shell_get_active_window (shell); #ifdef G_OS_WIN32 /* On Windows, link to online help instead. * See https://bugzilla.gnome.org/show_bug.cgi?id=576478 */ online_help_url = g_strconcat ( "http://library.gnome.org/users/evolution/", BASE_VERSION, NULL); e_show_uri (window, online_help_url); g_free (online_help_url); #else e_display_help (window, NULL); #endif }