summaryrefslogtreecommitdiff
path: root/capplets/mime-type/edit-window.c
diff options
context:
space:
mode:
Diffstat (limited to 'capplets/mime-type/edit-window.c')
-rw-r--r--capplets/mime-type/edit-window.c262
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);
}