449 lines
12 KiB
C
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
|
|
}
|