Fix bug 4811 add new function. Ultimately, I wished we could get rid of

2000-11-19  Mathieu Lacage  <mathieu@eazel.com>

	Fix bug 4811
	* libgnomevfs/gnome-vfs-mime-info.c:
	(gnome_vfs_mime_set_extensions_list): add new function.
	Ultimately, I wished we could get rid of the direct access
	to the internal hastables but this is at least a first step.
	* libgnomevfs/gnome-vfs-mime-info.h: add prototype.

	* mime-type-capplet/nautilus-mime-type-capplet-dialogs.c:
	(add_extension_clicked): implement
	(remove_extension_clicked): implement
	(extension_list_selected): grey/ungrey delete button when selecting/unselecting
	(extension_list_deselected): idem
	(get_extensions_from_gtk_list): helper function.
	(nautilus_mime_type_capplet_show_change_extension_window): implement.
	(nautilus_mime_type_capplet_show_new_extension_window): fix a number of segfaults.
	* mime-type-capplet/nautilus-mime-type-capplet-dialogs.h: change prototypes.
	* mime-type-capplet/nautilus-mime-type-capplet.c:
	(get_selected_row_number),helper function.
	(get_selected_mime_type), helper function (refactoring :)
	(really_change_icon): fix segfault.
	(update_extensions_list): update extensions when you change them.
	(change_file_extensions_clicked): create dialog.
	(init_mime_capplet): spaces.
	(nautilus_mime_type_capplet_update_info): make it use get_selected_mime_type.
This commit is contained in:
Mathieu Lacage 2000-11-20 02:31:25 +00:00 committed by Mathieu Lacage
parent 404ba40351
commit 7652cffef1
3 changed files with 278 additions and 18 deletions

View file

@ -28,6 +28,9 @@
#include <capplet-widget.h>
#include <gnome.h>
#include <gtk/gtk.h>
#include <gtk/gtklist.h>
#include <gtk/gtkbin.h>
#include <gtk/gtklistitem.h>
#include <libgnomevfs/gnome-vfs-mime-handlers.h>
#include <libgnomevfs/gnome-vfs-application-registry.h>
#include <libgnomevfs/gnome-vfs-mime-info.h>
@ -676,15 +679,204 @@ nautilus_mime_type_capplet_show_new_mime_window (void)
return mime_type;
}
void
static void
add_extension_clicked (GtkWidget *widget, gpointer data)
{
GtkList *extension_list;
char *new_extension;
GtkWidget *new_list_item;
GList *items_list;
g_assert (GTK_IS_LIST (data));
extension_list = GTK_LIST (data);
new_extension = nautilus_mime_type_capplet_show_new_extension_window ();
new_list_item = gtk_list_item_new_with_label (new_extension);
gtk_widget_show (new_list_item);
items_list = g_list_append (NULL, new_list_item);
gtk_list_append_items (GTK_LIST (extension_list), items_list);
g_free (new_extension);
/* GtkList takes ownership of the List we append. DO NOT free it. */
}
static void
remove_extension_clicked (GtkWidget *widget, gpointer data)
{
GtkList *list;
GList *selection_copy, *temp;
g_assert (GTK_IS_LIST (data));
list = GTK_LIST (data);
/* this is so fucking crapy !!! */
/* you have to make a copy of the selection list before
passing it to remove_items because before removing the
widget from the List, it modifies the list.
So, when you remove it, the list is not valid anymore */
selection_copy = NULL;
for (temp = list->selection; temp != NULL; temp = temp->next) {
selection_copy = g_list_prepend (selection_copy, temp->data);
}
if (list->selection != NULL) {
gtk_list_remove_items (GTK_LIST (list), selection_copy);
gtk_list_select_item (GTK_LIST (list), 0);
}
g_list_free (selection_copy);
}
static void
extension_list_selected (GtkWidget *list, GtkWidget *child, gpointer data)
{
GtkWidget *button;
g_assert (GTK_IS_BUTTON (data));
button = GTK_WIDGET (data);
gtk_widget_set_sensitive (GTK_WIDGET (button), TRUE);
}
static void
extension_list_deselected (GtkWidget *list, GtkWidget *child, gpointer data)
{
GtkWidget *button;
g_assert (GTK_IS_BUTTON (data));
button = GTK_WIDGET (data);
gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE);
}
static char *
get_extensions_from_gtk_list (GtkList *list)
{
GList *temp;
GtkLabel *label;
char *extension, *extensions, *temp_text;
extensions = NULL;
for (temp = list->children; temp != NULL; temp = temp->next) {
label = GTK_LABEL (GTK_BIN (temp->data)->child);
gtk_label_get (GTK_LABEL (label), &extension);
temp_text = g_strconcat (extension, " ", extensions, NULL);
g_free (extensions);
extensions = temp_text;
}
return extensions;
}
char *
nautilus_mime_type_capplet_show_change_extension_window (const char *mime_type)
{
GtkWidget *dialog;
GtkWidget *hbox;
GtkWidget *button;
GtkWidget *list;
char *extensions_list;
dialog = gnome_dialog_new (_("File Extensions "),
GNOME_STOCK_BUTTON_OK,
GNOME_STOCK_BUTTON_CANCEL,
NULL);
gnome_dialog_set_default (GNOME_DIALOG (dialog), 1);
gnome_dialog_set_close (GNOME_DIALOG (dialog), FALSE);
hbox = gtk_hbox_new (FALSE, GNOME_PAD_BIG);
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), hbox, FALSE, FALSE, 0);
list = gtk_list_new ();
/* the right buttons */
{
GtkWidget *vbox;
vbox = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
gtk_box_pack_end (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
button = gtk_button_new_with_label (_("Add..."));
gtk_signal_connect (GTK_OBJECT (button), "clicked",
add_extension_clicked, list);
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
button = gtk_button_new_with_label (_(" Remove "));
gtk_widget_set_sensitive (button, FALSE);
gtk_signal_connect (GTK_OBJECT (button), "clicked",
remove_extension_clicked, list);
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (vbox), gtk_label_new (""), FALSE, FALSE, 0);
}
/* The left list */
{
GtkWidget *viewport;
GList *extensions_list, *widget_list, *temp;
viewport = gtk_viewport_new (NULL, NULL);
gtk_box_pack_start (GTK_BOX (hbox), viewport, TRUE, TRUE, 0);
gtk_signal_connect (GTK_OBJECT (list), "select_child",
extension_list_selected, button);
gtk_signal_connect (GTK_OBJECT (list), "unselect_child",
extension_list_deselected, button);
gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_SINGLE);
gtk_container_add (GTK_CONTAINER (viewport), list);
extensions_list = gnome_vfs_mime_get_extensions_list (mime_type);
if (extensions_list != NULL) {
widget_list = NULL;
for (temp = extensions_list; temp != NULL; temp = temp->next) {
widget_list = g_list_append (widget_list,
gtk_list_item_new_with_label ((char *) temp->data));
}
gtk_list_append_items (GTK_LIST (list), widget_list);
}
gtk_list_select_item (GTK_LIST (list), 0);
}
gtk_widget_show_all (GNOME_DIALOG (dialog)->vbox);
switch (gnome_dialog_run (GNOME_DIALOG (dialog))) {
case 0:
extensions_list = get_extensions_from_gtk_list (GTK_LIST (list));
break;
case 1:
default:
extensions_list = g_strdup ("");
break;
}
gnome_dialog_close (GNOME_DIALOG (dialog));
return extensions_list;
}
char *
nautilus_mime_type_capplet_show_new_extension_window (void)
{
GtkWidget *mime_entry;
GtkWidget *label;
GtkWidget *hbox;
GtkWidget *dialog;
char *new_extension;
dialog = gnome_dialog_new (_("Add New Extension"), GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL, NULL);
dialog = gnome_dialog_new (_("Add New Extension"), GNOME_STOCK_BUTTON_OK,
GNOME_STOCK_BUTTON_CANCEL, NULL);
gnome_dialog_set_default (GNOME_DIALOG (dialog), 0);
gnome_dialog_set_close (GNOME_DIALOG (dialog), FALSE);
label = gtk_label_new (_("Type in the extensions for this mime-type.\nFor example: .html, .htm"));
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
@ -702,19 +894,20 @@ nautilus_mime_type_capplet_show_new_extension_window (void)
/* Set focus to text entry widget */
gtk_window_set_focus (GTK_WINDOW (dialog), mime_entry);
new_extension = g_strdup ("");
switch (gnome_dialog_run (GNOME_DIALOG (dialog))) {
case 0:
nautilus_mime_type_capplet_add_extension (gtk_entry_get_text
(GTK_ENTRY (mime_entry)));
new_extension = g_strdup (gtk_entry_get_text (GTK_ENTRY (mime_entry)));
case 1:
gtk_widget_destroy (dialog);
break;
default:
break;
}
gnome_dialog_close (GNOME_DIALOG (dialog));
return new_extension;
}
/* add_or_update_application

View file

@ -27,8 +27,9 @@
void show_edit_applications_dialog (const char *mime_type);
void show_edit_components_dialog (const char *mime_type);
char *name_from_oaf_server_info (OAF_ServerInfo *server);
char *nautilus_mime_type_capplet_show_new_mime_window (void);
void nautilus_mime_type_capplet_show_new_extension_window (void);
char *name_from_oaf_server_info (OAF_ServerInfo *server);
char *nautilus_mime_type_capplet_show_new_mime_window (void);
char *nautilus_mime_type_capplet_show_new_extension_window (void);
char *nautilus_mime_type_capplet_show_change_extension_window (const char *mime_type);
#endif /* NAUTILUS_MIME_TYPE_CAPPLET_DIALOGS_H */

View file

@ -383,21 +383,51 @@ viewer_button_toggled (GtkToggleButton *button, gpointer user_data)
}
}
static void
really_change_icon (gpointer user_data)
static int
get_selected_row_number (void)
{
gint row = 0;
char *filename;
const char *mime_type;
gint row;
if (GTK_CLIST (mime_list)->selection == NULL) {
return;
return -1;
}
row = GPOINTER_TO_INT ((GTK_CLIST (mime_list)->selection)->data);
return row;
}
static const char *
get_selected_mime_type (void)
{
gint row = 0;
const char *mime_type;
if (GTK_CLIST (mime_list)->selection == NULL) {
return NULL;
}
row = get_selected_row_number ();
if (row == -1) {
return NULL;
}
mime_type = (const char *) gtk_clist_get_row_data (GTK_CLIST (mime_list), row);
return mime_type;
}
static void
really_change_icon (gpointer user_data)
{
char *filename;
const char *mime_type;
mime_type = get_selected_mime_type ();
if (mime_type == NULL) {
return;
}
filename = nautilus_mime_type_icon_entry_get_relative_filename (NAUTILUS_MIME_ICON_ENTRY (user_data));
gnome_vfs_mime_set_icon (mime_type, filename);
@ -462,6 +492,41 @@ change_icon_clicked (GtkWidget *entry, gpointer user_data)
}
static void
update_extensions_list (const char *mime_type)
{
int row;
char *pretty_string;
row = get_selected_row_number ();
pretty_string = gnome_vfs_mime_get_extensions_pretty_string (mime_type);
gtk_clist_set_text (GTK_CLIST (mime_list),
row, 2, pretty_string);
g_free (pretty_string);
}
static void
change_file_extensions_clicked (GtkWidget *widget, gpointer user_data)
{
const char *mime_type;
char *new_extensions;
mime_type = get_selected_mime_type ();
if (mime_type == NULL) {
return;
}
new_extensions = nautilus_mime_type_capplet_show_change_extension_window (mime_type);
gnome_vfs_mime_set_extensions_list (mime_type, new_extensions);
update_extensions_list (mime_type);
}
static void
init_mime_capplet (void)
{
@ -540,7 +605,7 @@ init_mime_capplet (void)
gtk_box_pack_start (GTK_BOX (hbox), gtk_vbox_new (FALSE, 0), FALSE, FALSE, 10);
button = gtk_button_new_with_label (_("Change File Extensions"));
gtk_signal_connect (GTK_OBJECT (button), "clicked", change_icon_clicked, icon_entry);
gtk_signal_connect (GTK_OBJECT (button), "clicked", change_file_extensions_clicked, NULL);
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
}
@ -727,6 +792,7 @@ nautilus_mime_type_capplet_update_info (const char *mime_type) {
} else {
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (application_button), TRUE);
}
}
static void