Files
evolution/shell/e-shell-utils.c
2016-10-10 14:46:59 +02:00

449 lines
12 KiB
C

/*
* 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 <http://www.gnu.org/licenses/>.
*
*
* 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 <glib/gi18n-lib.h>
#include <libedataserver/libedataserver.h>
#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 <mcrha@redhat.com>",
"Fabiano Fid\xC3\xAAncio <fabiano@fidencio.org>",
"",
"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
}