diff options
Diffstat (limited to 'capplets/mime-type/edit-window.c')
-rw-r--r-- | capplets/mime-type/edit-window.c | 262 |
1 files changed, 259 insertions, 3 deletions
diff --git a/capplets/mime-type/edit-window.c b/capplets/mime-type/edit-window.c index 1a26bba6b..85e48dc35 100644 --- a/capplets/mime-type/edit-window.c +++ b/capplets/mime-type/edit-window.c @@ -1,23 +1,279 @@ #include "edit-window.h" +#include "capplet-widget.h" + + +extern GtkWidget *capplet; + typedef struct { GtkWidget *window; + GtkWidget *icon_entry; + GtkWidget *mime_type; + GtkWidget *ext_label; + GtkWidget *regexp1_label; + GtkWidget *regexp2_label; + GtkWidget *open_entry; + GtkWidget *edit_entry; + GtkWidget *view_entry; + GtkWidget *open_cbox; + GtkWidget *edit_cbox; + GtkWidget *view_cbox; } edit_window; static edit_window *main_win = NULL; +static gboolean changing = TRUE; +static void +destruction_handler (GtkWidget *widget, gpointer data) +{ + 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 +apply_entry_change (GtkWidget *entry, gchar *key, MimeInfo *mi) +{ + gchar *buf; + gchar *text; + + /* buf is the value that existed before when we + * started the capplet */ + buf = local_mime_get_value (mi->mime_type, key); + if (buf == NULL) + buf = gnome_mime_get_value (mi->mime_type, key); + text = gtk_entry_get_text (GTK_ENTRY (entry)); + if (text && !*text) + text = NULL; + /* First we see if they've added something. */ + if (buf == NULL && text) + set_mime_key_value (mi->mime_type, key, text); + else { + /* Has the value changed? */ + if (text && strcmp (text, buf)) + set_mime_key_value (mi->mime_type, key, text); + else + /* We _REALLY_ need a way to specify in + * user.keys not to use the system defaults. + * (ie. override the system default and + * query it). + * If we could then we'd set it here. */ + ; + } +} +static void +apply_changes (MimeInfo *mi) +{ + apply_entry_change (main_win->open_entry, "open", mi); + apply_entry_change (main_win->view_entry, "view", mi); + apply_entry_change (main_win->edit_entry, "edit", mi); +} static void initialize_main_win () { + GtkWidget *align, *vbox, *hbox, *vbox2; + GtkWidget *frame, *table, *label; + GtkWidget *button; + GString *extension; + main_win = g_new (edit_window, 1); - main_win->window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + 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; -} + /* icon box */ + main_win->icon_entry = gnome_icon_entry_new ("mime_icon_entry", _("Select an icon...")); + align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); + gtk_container_add (GTK_CONTAINER (align), main_win->icon_entry); + gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 0); + 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); + gtk_box_pack_start (GTK_BOX (vbox), gtk_hseparator_new (), FALSE, FALSE, 0); + /* extension/regexp */ + vbox2 = gtk_vbox_new (FALSE, GNOME_PAD_SMALL); + gtk_box_pack_start (GTK_BOX (vbox), vbox2, FALSE, FALSE, 0); + hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL); + main_win->ext_label = gtk_label_new (""); + gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("Extension: ")), + FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), main_win->ext_label, FALSE, FALSE, 0); + + hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL); + main_win->regexp1_label = gtk_label_new (""); + gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("First Regular Expresion: ")), + FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), main_win->regexp1_label, FALSE, FALSE, 0); + + hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL); + main_win->regexp2_label = gtk_label_new (""); + gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("Second Regular Expresion: ")), + FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), main_win->regexp2_label, FALSE, FALSE, 0); + + /* Actions box */ + frame = gtk_frame_new (_("Mime-Type Actions")); + gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0); + table = gtk_table_new (8, 3, FALSE); + gtk_table_set_row_spacings (GTK_TABLE (table), GNOME_PAD_SMALL); + gtk_container_set_border_width (GTK_CONTAINER (table), GNOME_PAD_SMALL/2); + gtk_container_add (GTK_CONTAINER (frame), table); + label = gtk_label_new (_("Open")); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_misc_set_padding (GTK_MISC (label), 2, 0); + gtk_table_attach_defaults (GTK_TABLE (table), + label, + 0, 1, 0, 1); + main_win->open_entry = gtk_entry_new (); + gtk_signal_connect (GTK_OBJECT (main_win->open_entry), + "changed", + entry_changed, + NULL); + + gtk_table_attach_defaults (GTK_TABLE (table), + main_win->open_entry, + 1, 2, 0, 1); + button = gtk_button_new_with_label ("Browse..."); + gtk_table_attach_defaults (GTK_TABLE (table), + button, + 2, 3, 0, 1); + + main_win->open_cbox = gtk_check_button_new_with_label (_("Use default Open action")); +/* gtk_table_attach_defaults (GTK_TABLE (table), + main_win->open_cbox, + 0, 2, 1, 2);*/ + + label = gtk_label_new (_("View")); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_misc_set_padding (GTK_MISC (label), 2, 0); + gtk_table_attach_defaults (GTK_TABLE (table), + label, + 0, 1, 3, 4); + main_win->view_entry = gtk_entry_new (); + gtk_signal_connect (GTK_OBJECT (main_win->view_entry), + "changed", + entry_changed, + NULL); + + gtk_table_attach_defaults (GTK_TABLE (table), + main_win->view_entry, + 1, 2, 3, 4); + button = gtk_button_new_with_label ("Browse..."); + gtk_table_attach_defaults (GTK_TABLE (table), + button, + 2, 3, 3, 4); + + main_win->open_cbox = gtk_check_button_new_with_label (_("Use default View action")); +/* gtk_table_attach_defaults (GTK_TABLE (table), + main_win->open_cbox, + 0, 2, 4, 5);*/ + label = gtk_label_new (_("Edit")); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_misc_set_padding (GTK_MISC (label), 2, 0); + gtk_table_attach_defaults (GTK_TABLE (table), + label, + 0, 1, 6, 7); + main_win->edit_entry = gtk_entry_new (); + gtk_signal_connect (GTK_OBJECT (main_win->edit_entry), + "changed", + entry_changed, + NULL); + gtk_table_attach_defaults (GTK_TABLE (table), + main_win->edit_entry, + 1, 2, 6, 7); + button = gtk_button_new_with_label ("Browse..."); + gtk_table_attach_defaults (GTK_TABLE (table), + button, + 2, 3, 6, 7); + + main_win->edit_cbox = gtk_check_button_new_with_label (_("Use default Edit action")); +/* gtk_table_attach_defaults (GTK_TABLE (table), + main_win->edit_cbox, + 0, 2, 7, 8);*/ +} + +static void +setup_entry (gchar *key, GtkWidget *entry, MimeInfo *mi) +{ + gchar *buf; + buf = local_mime_get_value (mi->mime_type, key); + if (buf == NULL) + buf = gnome_mime_get_value (mi->mime_type, key); + if (buf) + gtk_entry_set_text (GTK_ENTRY (entry), buf); + else + gtk_entry_set_text (GTK_ENTRY (entry), ""); +} void launch_edit_window (MimeInfo *mi) { + gint size; + + changing = TRUE; if (main_win == NULL) initialize_main_win (); - gtk_widget_show_all (main_win->window); + /* now we fill in the fields with the mi stuff. */ + gtk_label_set_text (GTK_LABEL (main_win->mime_type), mi->mime_type); + gnome_icon_entry_set_icon (GNOME_ICON_ENTRY (main_win->icon_entry), + gnome_mime_get_value (mi->mime_type, + "icon-filename")); + + /* we initialize everything */ + if (mi->ext[0]) { + GString *extension; + extension = g_string_new (mi->ext_readable[0]); + if (mi->ext[1]) { + g_string_append (extension, ", "); + g_string_append (extension, (mi->ext_readable[1])); + } + gtk_label_set_text (GTK_LABEL (main_win->ext_label), + extension->str); + g_string_free (extension, TRUE); + } else if (mi->ext[1]) + gtk_label_set_text (GTK_LABEL (main_win->ext_label), + mi->ext_readable[1]); + else + gtk_label_set_text (GTK_LABEL (main_win->ext_label), + _("<No extention>")); + if (mi->regex_readable[0]) + gtk_label_set_text (GTK_LABEL (main_win->regexp1_label), + mi->regex_readable[0]); + else + gtk_label_set_text (GTK_LABEL (main_win->regexp1_label), + _("<No Regular Expression>")); + if (mi->regex_readable[1]) + gtk_label_set_text (GTK_LABEL (main_win->regexp2_label), + mi->regex_readable[1]); + else + gtk_label_set_text (GTK_LABEL (main_win->regexp2_label), + _("<No Regular Expression>")); + /* initialize the entries */ + setup_entry ("open", main_win->open_entry, mi); + setup_entry ("view", main_win->view_entry, mi); + setup_entry ("edit", main_win->edit_entry, mi); + + changing = FALSE; + + gtk_widget_show_all (GNOME_DIALOG (main_win->window)->vbox); + if ((gnome_dialog_run (GNOME_DIALOG (main_win->window))) == 0) { + apply_changes (mi); + } + gtk_widget_hide (main_win->window); } |