diff options
Diffstat (limited to 'capplets/file-types/edit-window.c')
-rw-r--r-- | capplets/file-types/edit-window.c | 648 |
1 files changed, 0 insertions, 648 deletions
diff --git a/capplets/file-types/edit-window.c b/capplets/file-types/edit-window.c deleted file mode 100644 index 17b93c567..000000000 --- a/capplets/file-types/edit-window.c +++ /dev/null @@ -1,648 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ - -/* - * - * Copyright (C) 1998, 1999, 2000 Red Hat, Inc. - * Copyright (C) 2000 Eazel, Inc. - * - * This library 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 of the License, or (at your option) any later version. - * - * This library 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 library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Authors: Jonathan Blandford <jbr@redhat.com> - * Gene Z. Ragan <gzr@eazel.com> - * - */ - -/* edit-window.c: Mime capplet editor window */ - -#include <gtk/gtk.h> -#include <libgnomevfs/gnome-vfs-mime-handlers.h> -#include <libgnomevfs/gnome-vfs-mime-info.h> - -#include "edit-window.h" -#include "capplet-widget.h" - -extern GtkWidget *capplet; - -typedef struct { - GtkWidget *window; - GtkWidget *icon_entry; - GtkWidget *mime_type; - GtkWidget *ext_scroll; - GtkWidget *ext_clist; - GtkWidget *ext_entry; - GtkWidget *ext_add_button; - GtkWidget *ext_remove_button; - GtkWidget *application_menu; - GtkWidget *component_menu; - char *mime_string; - GList *tmp_ext[2]; - GtkFileSelection *file_selector; -} edit_window; - -static edit_window *main_win = NULL; -static gboolean changing = TRUE; - -/* Local prototypes */ -static void populate_application_menu (GtkWidget *application_menu, const char *mime_string); -static void populate_component_menu (GtkWidget *application_menu, const char *mime_string); -static void application_menu_activate (GtkMenuItem *item, gpointer user_data); -static GtkFileSelection *show_file_selector (const char *title, gpointer user_data); - -static void -destruction_handler (GtkWidget *widget, gpointer data) -{ - g_free (main_win->mime_string); - g_free (main_win); - main_win = NULL; -} - -static void -entry_changed (GtkWidget *widget, gpointer data) -{ - if (changing == FALSE) - capplet_widget_state_changed (CAPPLET_WIDGET (capplet), - TRUE); -} - -static void -ext_clist_selected (GtkWidget *clist, gint row, gint column, gpointer data) -{ - gboolean deletable; - - deletable = GPOINTER_TO_INT (gtk_clist_get_row_data (GTK_CLIST (clist), row)); - if (deletable) - gtk_widget_set_sensitive (main_win->ext_remove_button, TRUE); - else - gtk_widget_set_sensitive (main_win->ext_remove_button, FALSE); -} -static void -ext_clist_deselected (GtkWidget *clist, gint row, gint column, gpointer data) -{ - if (g_list_length (GTK_CLIST (clist)->selection) == 0) - gtk_widget_set_sensitive (main_win->ext_remove_button, FALSE); -} -static void -ext_entry_changed (GtkWidget *entry, gpointer data) -{ - gchar *text; - text = gtk_entry_get_text (GTK_ENTRY (entry)); - gtk_widget_set_sensitive (main_win->ext_add_button, (strlen (text) >0)); -} - -static void -add_extension (GtkWidget *widget, gpointer data) -{ - gchar *row[1]; - gint rownumber; - - row[0] = g_strdup (gtk_entry_get_text (GTK_ENTRY (main_win->ext_entry))); - rownumber = gtk_clist_append (GTK_CLIST (main_win->ext_clist), row); - gtk_clist_set_row_data (GTK_CLIST (main_win->ext_clist), rownumber, - GINT_TO_POINTER (TRUE)); - gtk_entry_set_text (GTK_ENTRY (main_win->ext_entry), ""); - - main_win->tmp_ext[0] = g_list_prepend (main_win->tmp_ext[0], row[0]); - if (changing == FALSE) - capplet_widget_state_changed (CAPPLET_WIDGET (capplet), - TRUE); -} - -static void -remove_extension (GtkWidget *widget, gpointer data) -{ - gint row; - gchar *text; - gchar *store; - GList *tmp; - - text = (gchar *)g_malloc (sizeof (gchar) * 1024); - gtk_clist_freeze (GTK_CLIST (main_win->ext_clist)); - row = GPOINTER_TO_INT (GTK_CLIST (main_win->ext_clist)->selection->data); - gtk_clist_get_text (GTK_CLIST (main_win->ext_clist), row, 0, &text); - store = g_strdup (text); - gtk_clist_remove (GTK_CLIST (main_win->ext_clist), row); - - gtk_clist_thaw (GTK_CLIST (main_win->ext_clist)); - - for (tmp = main_win->tmp_ext[0]; tmp; tmp = tmp->next) { - GList *found; - - if (strcmp (tmp->data, store) == 0) { - found = tmp; - - main_win->tmp_ext[0] = g_list_remove_link (main_win->tmp_ext[0], found); - g_list_free_1 (found); - break; - } - } - - if (changing == FALSE) - capplet_widget_state_changed (CAPPLET_WIDGET (capplet), - TRUE); -} - -static void -apply_changes (const char *mime_type) -{ - if (changing == FALSE) - capplet_widget_state_changed (CAPPLET_WIDGET (capplet), - TRUE); -} - -static void -initialize_main_win () -{ - GtkWidget *align, *vbox, *hbox, *vbox2, *vbox3; - GtkWidget *frame, *table, *label; - - gchar *title[2] = {"Extensions"}; - - main_win = g_new0 (edit_window, 1); - main_win->window = gnome_dialog_new ("", - GNOME_STOCK_BUTTON_OK, - GNOME_STOCK_BUTTON_CANCEL, - NULL); - - gtk_signal_connect (GTK_OBJECT (main_win->window), - "destroy", - destruction_handler, - NULL); - vbox = GNOME_DIALOG (main_win->window)->vbox; - - align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); - - /* Main vertical box */ - gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 0); - - /* Create and add mime type label */ - hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL); - gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("Mime Type: ")), FALSE, FALSE, 0); - main_win->mime_type = gtk_label_new (""); - gtk_box_pack_start (GTK_BOX (hbox), main_win->mime_type, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - - /* Main horizontal box */ - hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL); - - /* Icon Control */ - vbox2 = gtk_vbox_new (FALSE, GNOME_PAD_SMALL); - gtk_box_pack_start (GTK_BOX (vbox), vbox2, FALSE, FALSE, 0); - - main_win->icon_entry = gnome_icon_entry_new ("mime_icon_entry", _("Select an icon...")); - gtk_signal_connect (GTK_OBJECT (gnome_icon_entry_gtk_entry (GNOME_ICON_ENTRY (main_win->icon_entry))), - "changed", - entry_changed, - NULL); - gtk_box_pack_start (GTK_BOX (hbox), main_win->icon_entry, FALSE, FALSE, 0); - - /* Extension List */ - main_win->ext_clist = gtk_clist_new_with_titles (1, title); - gtk_clist_column_titles_passive (GTK_CLIST (main_win->ext_clist)); - gtk_clist_set_auto_sort (GTK_CLIST (main_win->ext_clist), TRUE); - - gtk_signal_connect (GTK_OBJECT (main_win->ext_clist), "select-row", - GTK_SIGNAL_FUNC (ext_clist_selected), NULL); - gtk_signal_connect (GTK_OBJECT (main_win->ext_clist), "unselect-row", - GTK_SIGNAL_FUNC (ext_clist_deselected), NULL); - main_win->ext_scroll = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (main_win->ext_scroll), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_container_add (GTK_CONTAINER (main_win->ext_scroll), main_win->ext_clist); - - /* Extension Buttons */ - vbox3 = gtk_vbox_new (FALSE, GNOME_PAD_SMALL); - main_win->ext_add_button = gtk_button_new_with_label (_("Add")); - gtk_signal_connect (GTK_OBJECT (main_win->ext_add_button), "clicked", - GTK_SIGNAL_FUNC (add_extension), NULL); - gtk_box_pack_start (GTK_BOX (vbox3), main_win->ext_add_button, FALSE, FALSE, 0); - gtk_widget_set_sensitive (main_win->ext_add_button, FALSE); - - main_win->ext_remove_button = gtk_button_new_with_label (_("Remove")); - gtk_signal_connect (GTK_OBJECT (main_win->ext_remove_button), "clicked", - GTK_SIGNAL_FUNC (remove_extension), NULL); - gtk_widget_set_sensitive (main_win->ext_remove_button, FALSE); - gtk_box_pack_start (GTK_BOX (vbox3), main_win->ext_remove_button, FALSE, FALSE, 0); - - gtk_box_pack_start (GTK_BOX (hbox), main_win->ext_scroll, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (hbox), vbox3, FALSE, FALSE, 0); - - gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, TRUE, 0); - - /* Extension entry box */ - main_win->ext_entry = gtk_entry_new (); - gtk_signal_connect (GTK_OBJECT (main_win->ext_entry), "changed", ext_entry_changed, NULL); - gtk_signal_connect (GTK_OBJECT (main_win->ext_entry), "activate", add_extension, NULL); - gtk_box_pack_start (GTK_BOX (vbox3), main_win->ext_entry, FALSE, FALSE, 0); - - /* Defaults box */ - frame = gtk_frame_new (NULL); - vbox2 = gtk_vbox_new (FALSE, GNOME_PAD_SMALL); - gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0); - table = gtk_table_new (3, 2, FALSE); - gtk_table_set_row_spacings (GTK_TABLE (table), GNOME_PAD_SMALL); - gtk_container_set_border_width (GTK_CONTAINER (table), GNOME_PAD_SMALL); - gtk_container_add (GTK_CONTAINER (frame), vbox2); - - /* Default application label and menu */ - label = gtk_label_new (_("Application:")); - gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 0, 1); - - main_win->application_menu = gtk_option_menu_new(); - gtk_table_attach_defaults (GTK_TABLE (table), main_win->application_menu, 1, 2, 0, 1); - - /* Default component label and menu */ - label = gtk_label_new (_("Component:")); - gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2); - - main_win->component_menu = gtk_option_menu_new(); - gtk_box_pack_start (GTK_BOX (vbox2), table, FALSE, FALSE, 0); - gtk_table_attach_defaults (GTK_TABLE (table), main_win->component_menu, 1, 2, 1, 2); -} - -void -initialize_main_win_vals (void) -{ - const char *mi; - gchar *title; - /*gboolean showext = FALSE;*/ - if (main_win == NULL) - return; - - mi = main_win->mime_string; - if (mi == NULL) - return; - - /* now we fill in the fields with the mi stuff. */ - changing = TRUE; - - populate_application_menu (main_win->application_menu, mi); - populate_component_menu (main_win->component_menu, mi); - - gtk_label_set_text (GTK_LABEL (main_win->mime_type), mi); - - gnome_icon_entry_set_icon (GNOME_ICON_ENTRY (main_win->icon_entry), - gnome_vfs_mime_get_value (mi, "icon-filename")); - - gtk_widget_show_all (GNOME_DIALOG (main_win->window)->vbox); - - /* we initialize everything */ - title = g_strdup_printf (_("Set actions for %s"), mi); - gtk_window_set_title (GTK_WINDOW (main_win->window), title); - g_free (title); - - /* not sure why this is necessary */ - gtk_clist_clear (GTK_CLIST (main_win->ext_clist)); - /* - if (mi->ext[0]) { - GList *tmp; - gchar *extension[1]; - gint row; - for (tmp = mi->ext[0]; tmp; tmp = tmp->next) { - extension[0] = g_strdup (tmp->data); - row = gtk_clist_append (GTK_CLIST (main_win->ext_clist), - extension); - gtk_clist_set_row_data (GTK_CLIST (main_win->ext_clist), - row, GINT_TO_POINTER (FALSE)); - } - showext = TRUE; - } - if (mi->ext[1]) { - GList *tmp; - gchar *extension[1]; - gint row; - for (tmp = mi->ext[1]; tmp; tmp = tmp->next) { - extension[0] = g_strdup (tmp->data); - row = gtk_clist_append (GTK_CLIST (main_win->ext_clist), - extension); - gtk_clist_set_row_data (GTK_CLIST (main_win->ext_clist), - row, GINT_TO_POINTER (FALSE)); - } - showext = TRUE; - } - - if (main_win->tmp_ext[0]) { - GList *tmp; - gchar *extension[1]; - gint row; - for (tmp = main_win->tmp_ext[0]; tmp; tmp = tmp->next) { - extension[0] = g_strdup (tmp->data); - row = gtk_clist_append (GTK_CLIST (main_win->ext_clist), - extension); - gtk_clist_set_row_data (GTK_CLIST (main_win->ext_clist), - row, GINT_TO_POINTER (TRUE)); - } - showext = TRUE; - } - if (main_win->tmp_ext[1]) { - GList *tmp; - gchar *extension[1]; - gint row; - for (tmp = main_win->tmp_ext[0]; tmp; tmp = tmp->next) { - extension[0] = g_strdup (tmp->data); - row = gtk_clist_append (GTK_CLIST (main_win->ext_clist), - extension); - gtk_clist_set_row_data (GTK_CLIST (main_win->ext_clist), - row, GINT_TO_POINTER (TRUE)); - } - showext = TRUE; - } - - if (!showext) { - gtk_widget_hide (main_win->ext_clist); - gtk_widget_hide (main_win->ext_entry); - gtk_widget_hide (main_win->ext_add_button); - gtk_widget_hide (main_win->ext_remove_button); - gtk_widget_hide (main_win->ext_scroll); - } - */ - - changing = FALSE; -} - -void -launch_edit_window (const char *mime_type) -{ - if (main_win == NULL) { - initialize_main_win (); - } - - g_free (main_win->mime_string); - main_win->mime_string = g_strdup (mime_type); - main_win->tmp_ext[0] = NULL; - main_win->tmp_ext[1] = NULL; - - initialize_main_win_vals (); - - switch(gnome_dialog_run (GNOME_DIALOG (main_win->window))) { - case 0: - apply_changes (mime_type); - /* Fall through */ - case 1: - main_win->mime_type = NULL; - gtk_widget_hide (main_win->window); - break; - } -} - -void -hide_edit_window (void) -{ - if (main_win && main_win->mime_string && main_win->window) - gtk_widget_hide (main_win->window); -} - -void -show_edit_window (void) -{ - if (main_win && main_win->mime_string && main_win->window) { - gtk_widget_show (main_win->window); - } -} - - -static void -populate_application_menu (GtkWidget *application_menu, const char *mime_type) -{ - GtkWidget *new_menu, *menu_item; - GList *app_list, *copy_list; - GnomeVFSMimeApplication *default_app, *application; - gboolean has_none, found_match; - char *mime_copy; - const char *name; - GList *children; - int index; - - has_none = TRUE; - found_match = FALSE; - - mime_copy = g_strdup (mime_type); - - new_menu = gtk_menu_new (); - - /* Get the default application */ - default_app = gnome_vfs_mime_get_default_application (mime_type); - - /* Get the application short list */ - app_list = gnome_vfs_mime_get_short_list_applications (mime_type); - for (copy_list = app_list; copy_list != NULL; copy_list = copy_list->next) { - has_none = FALSE; - - application = copy_list->data; - menu_item = gtk_menu_item_new_with_label (application->name); - - /* Store copy of application name in item; free when item destroyed. */ - gtk_object_set_data_full (GTK_OBJECT (menu_item), - "application", - g_strdup (application->name), - g_free); - - gtk_menu_append (GTK_MENU (new_menu), menu_item); - gtk_widget_show (menu_item); - } - - if (app_list != NULL) { - gnome_vfs_mime_application_list_free (app_list); - app_list = NULL; - } - - /* Find all appliactions or add a "None" item */ - if (has_none && default_app == NULL) { - /* Add all applications */ - app_list = gnome_vfs_mime_get_all_applications (mime_type); - for (copy_list = app_list; copy_list != NULL; copy_list = copy_list->next) { - has_none = FALSE; - - application = copy_list->data; - menu_item = gtk_menu_item_new_with_label (application->name); - - /* Store copy of application name in item; free when item destroyed. */ - gtk_object_set_data_full (GTK_OBJECT (menu_item), - "application", - g_strdup (application->name), - g_free); - - gtk_menu_append (GTK_MENU (new_menu), menu_item); - gtk_widget_show (menu_item); - } - - if (app_list != NULL) { - gnome_vfs_mime_application_list_free (app_list); - app_list = NULL; - } else { - menu_item = gtk_menu_item_new_with_label (_("None")); - gtk_menu_append (GTK_MENU (new_menu), menu_item); - gtk_widget_show (menu_item); - } - - } else { - /* Check and see if default is in the short list */ - if (default_app != NULL) { - /* Iterate */ - children = gtk_container_children (GTK_CONTAINER (new_menu)); - for (index = 0; children != NULL; children = children->next, ++index) { - name = (const char *)(gtk_object_get_data (GTK_OBJECT (children->data), "application")); - if (name != NULL) { - if (strcmp (default_app->name, name) == 0) { - found_match = TRUE; - break; - } - } - } - g_list_free (children); - - /* See if we have a match */ - if (found_match) { - /* Have menu appear with default application selected */ - gtk_menu_set_active (GTK_MENU (new_menu), index); - } else { - /* FIXME bugzilla.eazel.com 1221: - * What should we do in this case? - * */ - } - } - } - - /* Add default seperator and Add application menu item */ - menu_item = gtk_menu_item_new (); - gtk_widget_set_sensitive (menu_item, FALSE); - gtk_menu_append (GTK_MENU (new_menu), menu_item); - gtk_widget_show (menu_item); - - menu_item = gtk_menu_item_new_with_label (_("Add an application...")); - gtk_menu_append (GTK_MENU (new_menu), menu_item); - gtk_widget_show (menu_item); - - gtk_signal_connect (GTK_OBJECT (menu_item), "activate", - GTK_SIGNAL_FUNC (application_menu_activate), (gpointer) mime_copy); - - gtk_option_menu_set_menu (GTK_OPTION_MENU (application_menu), new_menu); -} - - -static void -populate_component_menu (GtkWidget *component_menu, const char *mime_string) -{ - GtkWidget *new_menu; - GtkWidget *menu_item; - GList *mime_list; - gboolean has_none; - - has_none = TRUE; - - new_menu = gtk_menu_new (); - - mime_list = gnome_vfs_mime_get_short_list_components (mime_string); - while (mime_list != NULL) { - has_none = FALSE; - menu_item = gtk_menu_item_new_with_label ("Test Menu Item"); - gtk_menu_append (GTK_MENU (new_menu), menu_item); - gtk_widget_show (menu_item); - mime_list = g_list_next (mime_list); - } - - /* Add None menu item */ - if (has_none) { - menu_item = gtk_menu_item_new_with_label (_("None")); - gtk_menu_append (GTK_MENU (new_menu), menu_item); - gtk_widget_show (menu_item); - } - - /* Add default seperator and Add component menu item */ - menu_item = gtk_menu_item_new (); - gtk_widget_set_sensitive (menu_item, FALSE); - gtk_menu_append (GTK_MENU (new_menu), menu_item); - gtk_widget_show (menu_item); - - menu_item = gtk_menu_item_new_with_label (_("Add a component...")); - gtk_menu_append (GTK_MENU (new_menu), menu_item); - gtk_widget_show (menu_item); - - gtk_option_menu_set_menu (GTK_OPTION_MENU (component_menu), new_menu); -} - -/* - * Display the GtkFileSelection dialog. The mime string is stored in the user data. - */ -static void -application_menu_activate (GtkMenuItem *item, gpointer user_data) -{ - main_win->file_selector = show_file_selector (_("Select an Application"), user_data); -} - -/* - * Add selected application to mime list. - */ - -static void -add_application (GtkWidget *widget, gpointer user_data) -{ - char *selected_application; - GnomeVFSMimeApplication *application; - - g_assert (user_data != NULL); - - selected_application = gtk_file_selection_get_filename (main_win->file_selector); - - if (selected_application != NULL) { - application = g_new0 (GnomeVFSMimeApplication, 1); - - application->name = g_malloc (strlen (selected_application)); - strcpy (application->name, selected_application); - - application->command = g_malloc (strlen (selected_application)); - strcpy (application->command, selected_application); - - application->can_open_multiple_files = FALSE; - application->can_open_uris = FALSE; - - gnome_vfs_mime_define_application (application); - gnome_vfs_mime_set_default_application ((const char *)user_data, application->id); - - /* Reload menu and set index to default item */ - populate_application_menu (main_win->application_menu, (const char *)user_data); - - gnome_vfs_mime_application_free (application); - g_free (user_data); - } -} - -static GtkFileSelection * -show_file_selector (const char *title, gpointer mime_string) -{ - GtkFileSelection *selector; - - selector = GTK_FILE_SELECTION (gtk_file_selection_new (title)); - - gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (selector)->ok_button), - "clicked", GTK_SIGNAL_FUNC (add_application), mime_string); - - /* Ensure that the dialog box is destroyed when the user clicks a button. */ - gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (selector)->ok_button), - "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), - (gpointer) selector); - - gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (selector)->cancel_button), - "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), - (gpointer) selector); - - - /* Set file selector parent to edit dialog */ - gtk_window_set_transient_for (GTK_WINDOW (selector), GTK_WINDOW (main_win->window)); - gtk_window_set_modal(GTK_WINDOW (selector), TRUE); - - gtk_widget_show (GTK_WIDGET (selector)); - - return selector; -} |