diff options
author | Marco Pesenti Gritti <mpeseng@src.gnome.org> | 2002-12-31 03:29:24 +0800 |
---|---|---|
committer | Marco Pesenti Gritti <mpeseng@src.gnome.org> | 2002-12-31 03:29:24 +0800 |
commit | 6876ede98282c7db318089bfefb292aa59e55d48 (patch) | |
tree | 76b23252d04da232d0ebf22e53bfe3e022686af9 /embed/ephy-embed-utils.c | |
download | gsoc2013-epiphany-6876ede98282c7db318089bfefb292aa59e55d48.tar gsoc2013-epiphany-6876ede98282c7db318089bfefb292aa59e55d48.tar.gz gsoc2013-epiphany-6876ede98282c7db318089bfefb292aa59e55d48.tar.bz2 gsoc2013-epiphany-6876ede98282c7db318089bfefb292aa59e55d48.tar.lz gsoc2013-epiphany-6876ede98282c7db318089bfefb292aa59e55d48.tar.xz gsoc2013-epiphany-6876ede98282c7db318089bfefb292aa59e55d48.tar.zst gsoc2013-epiphany-6876ede98282c7db318089bfefb292aa59e55d48.zip |
Initial revision
Diffstat (limited to 'embed/ephy-embed-utils.c')
-rw-r--r-- | embed/ephy-embed-utils.c | 321 |
1 files changed, 321 insertions, 0 deletions
diff --git a/embed/ephy-embed-utils.c b/embed/ephy-embed-utils.c new file mode 100644 index 000000000..0d94e5374 --- /dev/null +++ b/embed/ephy-embed-utils.c @@ -0,0 +1,321 @@ +/* + * Copyright (C) 2000, 2001, 2002 Marco Pesenti Gritti + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * 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. + */ + +#include "eel-gconf-extensions.h" +#include "ephy-embed-utils.h" +#include "ephy-embed-shell.h" +#include "ephy-bonobo-extensions.h" +#include "ephy-gui.h" + +#include <gtk/gtkdialog.h> +#include <gtk/gtkmessagedialog.h> +#include <bonobo/bonobo-i18n.h> +#include <bonobo/bonobo-ui-util.h> +#include <libgnomevfs/gnome-vfs-uri.h> +#include <string.h> + +/** + * ephy_embed_utils_save: + * @window: the referrer window. Used to parent the dialogs. + * @default_dir_pref: the gconf path to persist the directory selected by the user. + * @ask_dest: ask the user the destination path + * @ask_content: show the user an option to save the content + * of the web page (images, javascript...) + * @persist: the #GaleonEmbedPersist referring to the url + * + * Download a save an url asking a location to the user when requested + **/ +void +ephy_embed_utils_save (GtkWidget *window, + const char *default_dir_pref, + gboolean ask_dest, gboolean ask_content, + EphyEmbedPersist *persist) +{ + GnomeVFSURI *uri; + char *retPath = NULL; + char *fileName = NULL; + char *dirName = NULL; + char *retDir; + char *target; + const char *source; + gresult ret; + EphyEmbed *embed; + EmbedPersistFlags flags; + gboolean content; + + g_object_ref (G_OBJECT(persist)); + + ephy_embed_persist_get_flags (persist, &flags); + + ephy_embed_persist_get_source (persist, &source); + + if (source) + { + target = g_strdup (source); + } + else + { + ephy_embed_persist_get_embed (persist, &embed); + g_return_if_fail (embed != NULL); + + ephy_embed_get_location (embed, + flags & + EMBED_PERSIST_MAINDOC, + FALSE, + &target); + } + + /* Get a filename from the target url */ + uri = gnome_vfs_uri_new (target); + if (uri) + { + fileName = gnome_vfs_uri_extract_short_name (uri); + gnome_vfs_uri_unref (uri); + } + + dirName = eel_gconf_get_string (default_dir_pref); + if (dirName && dirName[0] == '\0') + { + g_free (dirName); + dirName = NULL; + } + + if (!dirName || strcmp (dirName,"~") == 0) + { + g_free (dirName); + dirName = g_strdup(g_get_home_dir ()); + } + + /* If we aren't asking for downloading dir, check that we aren't + * overwriting anything. If we are, pop up a warning dialog and show + * the filepicker if the user doesn't want to overwrite the file. + */ + ret = G_FAILED; + if (!ask_dest) + { + retPath = g_build_filename (dirName, fileName, NULL); + if (ephy_gui_confirm_overwrite_file (window, retPath)) + { + ret = G_OK; + } + else + { + g_free (retPath); + ask_dest = TRUE; + } + } + + if (ask_dest) + { + /* show the file picker */ + ret = ephy_embed_shell_show_file_picker + (embed_shell, window, + _("Select the destination filename"), + dirName, fileName, modeSave, &retPath, + ask_content ? &content : NULL, + NULL, NULL); + } + + if (ret == G_OK) + { + uri = gnome_vfs_uri_new (retPath); + g_return_if_fail (uri != NULL); + + retDir = gnome_vfs_uri_extract_dirname (uri); + + if (ask_content && content) + { + flags |= EMBED_PERSIST_SAVE_CONTENT; + ephy_embed_persist_set_flags (persist, + flags); + } + + ephy_embed_persist_set_dest (persist, retPath); + + ephy_embed_persist_save (persist); + + /* set default save dir */ + eel_gconf_set_string (default_dir_pref, + retDir); + + g_free (retDir); + gnome_vfs_uri_unref (uri); + } + + g_object_unref (G_OBJECT(persist)); + + g_free (dirName); + g_free (fileName); + g_free (retPath); +} + +static void +build_group (GString *xml_string, const char *group, int index) +{ + char *tmp; + + tmp = g_strdup_printf ("<submenu label=\"%s\" name=\"CharsetGroup%d\">\n", + group, index); + xml_string = g_string_append (xml_string, tmp); + g_free (tmp); +} + +static void +build_charset (GString *xml_string, CharsetInfo *info, int index) +{ + char *tmp; + char *verb; + + verb = g_strdup_printf ("Charset%d", index); + tmp = g_strdup_printf ("<menuitem label=\"%s\" name=\"%s\" verb=\"%s\"/>\n", + info->title, verb, verb); + xml_string = g_string_append (xml_string, tmp); + + g_free (tmp); + g_free (verb); +} + +static void +add_verbs (BonoboUIComponent *ui_component, + BonoboUIVerbFn fn, GList *verbs) +{ + GList *l; + char verb[15]; + int charset_index = 0; + + for (l = verbs; l != NULL; l = l->next) + { + EncodingMenuData *edata = (EncodingMenuData *)l->data; + + sprintf (verb, "Charset%d", charset_index); + charset_index++; + bonobo_ui_component_add_verb_full + (ui_component, verb, + g_cclosure_new (G_CALLBACK (fn), edata, + (GClosureNotify)g_free)); + } +} + +/** + * ephy_embed_utils_build_charsets_submenu: + * @ui_component: the parent #BonoboUIComponent + * @path: the bonoboui path where to create the submenu. + * It's recommended to use a <placeholder/> + * @fn: callback to report the selected charsets + * @data: the data passed to the callback + * + * Create a charset submenu using bonobo ui. + **/ +void +ephy_embed_utils_build_charsets_submenu (BonoboUIComponent *ui_component, + const char *path, + BonoboUIVerbFn fn, + gpointer data) +{ + GList *groups; + GString *xml_string; + GList *verbs = NULL; + int group_index = 0; + int charset_index = 0; + +#ifdef DEBUG_MARCO + GTimer *timer; + gulong s; + + timer = g_timer_new (); + g_timer_start(timer); +#endif + + g_return_if_fail (ephy_embed_shell_get_charset_groups (embed_shell, &groups) == G_OK); + + xml_string = g_string_new (NULL); + g_string_append (xml_string, "<submenu name=\"Encoding\" _label=\"_Encoding\">"); + + for (; groups != NULL; groups = groups->next) + { + GList *charsets; + const char *group = (const char *)groups->data; + + build_group (xml_string, group, group_index); + + ephy_embed_shell_get_charset_titles (embed_shell, + group, + &charsets); + + for (; charsets != NULL; charsets = charsets->next) + { + CharsetInfo *info = (CharsetInfo *) charsets->data; + EncodingMenuData *edata; + + edata = g_new0 (EncodingMenuData, 1); + edata->encoding = info->name; + edata->data = data; + verbs = g_list_append (verbs, edata); + + build_charset (xml_string, info, charset_index); + charset_index++; + } + + + g_list_free (charsets); + g_string_append (xml_string, "</submenu>"); + group_index++; + } + + g_string_append (xml_string, "</submenu>"); + + bonobo_ui_component_set_translate (ui_component, path, + xml_string->str, NULL); + add_verbs (ui_component, fn, verbs); + + g_list_free (verbs); + g_list_free (groups); + g_string_free (xml_string, TRUE); + +#ifdef DEBUG_MARCO + g_timer_stop (timer); + g_timer_elapsed (timer, &s); + g_print ("Time to build charset menu: %f\n", (double)(s)/1000000); +#endif +} + +/** + * ephy_embed_utils_handlernotfound_dialog_run: + * @parent: the dialog parent window + * + * Show a dialog to warn the user that no application capable + * to open the specified file are found. Used in the downloader + * and in the mime type dialog. + **/ +void +ephy_embed_utils_nohandler_dialog_run (GtkWidget *parent) +{ + GtkWidget *dialog; + + /* FIXME mime db shortcut */ + + dialog = gtk_message_dialog_new + (GTK_WINDOW(parent), + GTK_DIALOG_MODAL, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + _("No available applications to open " + "the specified file.")); + gtk_dialog_run (GTK_DIALOG(dialog)); + gtk_widget_destroy (dialog); +} |