summaryrefslogtreecommitdiff
path: root/libnautilus-private/nautilus-program-chooser.c
diff options
context:
space:
mode:
authorJohn Sullivan <sullivan@eazel.com>2000-05-26 00:50:32 +0000
committerJohn Sullivan <sullivan@src.gnome.org>2000-05-26 00:50:32 +0000
commite52cc9902eebfa8d961e3d088139a24445ea82a4 (patch)
tree52dc51829143de0cd0c61654530a0dfcb3ef4b0f /libnautilus-private/nautilus-program-chooser.c
parent082b0a23f06e4168617e5317557c7677d0473663 (diff)
downloadnautilus-e52cc9902eebfa8d961e3d088139a24445ea82a4.tar.gz
Added a missing space.
2000-05-25 John Sullivan <sullivan@eazel.com> * src/ntl-app.c: (display_caveat): Added a missing space. More work on the "Open with Other" dialogs. Most of the UI features are present now, but they don't do anything since there's no API to call yet. * libnautilus-extensions/nautilus-gtk-extensions.h, * libnautilus-extensions/nautilus-gtk-extensions.c: (nautilus_gtk_clist_get_first_selected_row), (nautilus_gtk_clist_get_last_selected_row): Moved these functions to here from NautilusList, since they only require a GtkCList and I needed to use one of them outside of NautilusList. * libnautilus-extensions/nautilus-list.c: (nautilus_list_get_first_selected_row), (nautilus_list_get_last_selected_row), (nautilus_list_keyboard_navigation_key_press), (nautilus_list_new_with_titles): Removed get_first and get_last_selected_row, and updated callers to call new nautilus_gtk_clist versions. * libnautilus-extensions/nautilus-program-chooser.c: (populate_program_list), (nautilus_program_chooser_get_file), (nautilus_program_chooser_get_clist), (nautilus_program_chooser_get_frame), (nautilus_program_chooser_get_status_label), (nautilus_program_chooser_set_file), (nautilus_program_chooser_set_clist), (nautilus_program_chooser_set_frame), (nautilus_program_chooser_set_status_label), (is_in_short_list), (is_in_metadata_list), (update_selected_item_details), (program_list_selection_changed_callback), (pack_radio_button), (run_program_configurator_callback), (nautilus_program_chooser_new): Whole bunch of changes to push the "Open with Other" dialogs closer to reality. * src/ntl-window.c: (view_menu_choose_view_callback): Comment changes only. (nautilus_window_load_content_view_menu): Changed menu item text from "View as ..." to "View as Other..."
Diffstat (limited to 'libnautilus-private/nautilus-program-chooser.c')
-rw-r--r--libnautilus-private/nautilus-program-chooser.c350
1 files changed, 327 insertions, 23 deletions
diff --git a/libnautilus-private/nautilus-program-chooser.c b/libnautilus-private/nautilus-program-chooser.c
index 760030886..b1d8493a0 100644
--- a/libnautilus-private/nautilus-program-chooser.c
+++ b/libnautilus-private/nautilus-program-chooser.c
@@ -26,8 +26,12 @@
#include <config.h>
#include "nautilus-program-chooser.h"
-#include <gtk/gtkcheckbutton.h>
+#include "nautilus-gtk-extensions.h"
+
+#include <gtk/gtkradiobutton.h>
#include <gtk/gtkclist.h>
+#include <gtk/gtkframe.h>
+#include <gtk/gtkhbox.h>
#include <gtk/gtklabel.h>
#include <gtk/gtkscrolledwindow.h>
#include <gtk/gtkvbox.h>
@@ -50,7 +54,7 @@
* Hardwire an initial window size here, but let user resize
* bigger or smaller.
*/
-#define PROGRAM_CHOOSER_DEFAULT_HEIGHT 272
+#define PROGRAM_CHOOSER_DEFAULT_HEIGHT 303
static void
populate_program_list (NautilusProgramChooserType type,
@@ -65,7 +69,7 @@ populate_program_list (NautilusProgramChooserType type,
for (i = 0; i < 10; ++i) {
/* One extra slot so it's NULL-terminated */
text = g_new0 (char *, PROGRAM_LIST_COLUMN_COUNT+1);
- text[PROGRAM_LIST_NAME_COLUMN] = g_strdup_printf ("Viewer %d", i+1);
+ text[PROGRAM_LIST_NAME_COLUMN] = g_strdup_printf ("View as Viewer %d", i+1);
gtk_clist_append (clist, text);
g_strfreev (text);
@@ -82,16 +86,284 @@ populate_program_list (NautilusProgramChooserType type,
}
}
+}
+
+static NautilusFile *
+nautilus_program_chooser_get_file (GnomeDialog *chooser)
+{
+ return NAUTILUS_FILE (gtk_object_get_data (GTK_OBJECT (chooser), "file"));
+}
+
+static GtkCList *
+nautilus_program_chooser_get_clist (GnomeDialog *chooser)
+{
+ return GTK_CLIST (gtk_object_get_data (GTK_OBJECT (chooser), "clist"));
+}
+
+static GtkFrame *
+nautilus_program_chooser_get_frame (GnomeDialog *chooser)
+{
+ return GTK_FRAME (gtk_object_get_data (GTK_OBJECT (chooser), "frame"));
+}
+
+static GtkLabel *
+nautilus_program_chooser_get_status_label (GnomeDialog *chooser)
+{
+ return GTK_LABEL (gtk_object_get_data (GTK_OBJECT (chooser), "status_label"));
+}
+
+static void
+nautilus_program_chooser_set_file (GnomeDialog *chooser, NautilusFile *file)
+{
+ nautilus_file_ref (file);
+ gtk_object_set_data_full (GTK_OBJECT (chooser),
+ "file",
+ file,
+ (GtkDestroyNotify)nautilus_file_unref);
+}
+
+static void
+nautilus_program_chooser_set_clist (GnomeDialog *chooser, GtkCList *clist)
+{
+ gtk_object_set_data (GTK_OBJECT (chooser), "clist", clist);
+}
+
+static void
+nautilus_program_chooser_set_frame (GnomeDialog *chooser, GtkFrame *frame)
+{
+ gtk_object_set_data (GTK_OBJECT (chooser), "frame", frame);
+}
+
+static void
+nautilus_program_chooser_set_status_label (GnomeDialog *chooser, GtkLabel *status_label)
+{
+ gtk_object_set_data (GTK_OBJECT (chooser), "status_label", status_label);
+}
+
+static gboolean
+is_in_short_list (NautilusFile *file, const char *program_name) {
+ /* FIXME: This needs to use the real API when there is a
+ * real API. Passing the program name won't be good enough.
+ * For now, just return hardwired values.
+ */
+
+ g_assert (NAUTILUS_IS_FILE (file));
+ g_assert (program_name != NULL);
+
+ return FALSE;
+}
+
+static gboolean
+is_in_metadata_list (NautilusFile *file, const char *program_name) {
+ /* FIXME: This needs to use the real API when there is a
+ * real API. Passing the program name won't be good enough.
+ * For now, just return hardwired values.
+ */
+
+ g_assert (NAUTILUS_IS_FILE (file));
+ g_assert (program_name != NULL);
+
+ return TRUE;
+}
+
+static void
+update_selected_item_details (GnomeDialog *dialog)
+{
+ NautilusFile *file;
+ GtkCList *clist;
+ GtkFrame *frame;
+ GtkLabel *status_label;
+ int selected_row;
+ char *row_text;
+ char *frame_label_text, *status_label_text;
+ char *file_type, *file_name;
+
+ file = nautilus_program_chooser_get_file (dialog);
+ clist = nautilus_program_chooser_get_clist (dialog);
+ frame = nautilus_program_chooser_get_frame (dialog);
+ status_label = nautilus_program_chooser_get_status_label (dialog);
+
+ selected_row = nautilus_gtk_clist_get_first_selected_row (clist);
+
+ if (selected_row >= 0 && gtk_clist_get_text (clist,
+ selected_row,
+ PROGRAM_LIST_NAME_COLUMN,
+ &row_text)) {
+ /* row_text is now a pointer to the text in the list. */
+ frame_label_text = g_strdup (row_text);
+
+ if (is_in_short_list (file, frame_label_text)) {
+ file_type = nautilus_file_get_string_attribute (file, "type");
+ status_label_text = g_strdup_printf (_("Is in the menu for all \"%s\" items."),
+ file_type);
+ g_free (file_type);
+ } else if (is_in_metadata_list (file, frame_label_text)) {
+ file_name = nautilus_file_get_name (file);
+ status_label_text = g_strdup_printf (_("Is in the menu for \"%s\"."),
+ file_name);
+ g_free (file_name);
+ } else {
+ file_name = nautilus_file_get_name (file);
+ status_label_text = g_strdup_printf (_("Is not in the menu for \"%s\"."),
+ file_name);
+ g_free (file_name);
+ }
+ } else {
+ frame_label_text = NULL;
+ status_label_text = NULL;
+ }
+
+ gtk_frame_set_label (frame, frame_label_text);
+ gtk_label_set_text (status_label, status_label_text);
+
+ g_free (frame_label_text);
+ g_free (status_label_text);
}
+static void
+program_list_selection_changed_callback (GtkCList *clist,
+ gint row,
+ gint column,
+ GdkEventButton *event,
+ gpointer user_data)
+{
+ g_assert (GTK_IS_CLIST (clist));
+ g_assert (GNOME_IS_DIALOG (user_data));
+
+ update_selected_item_details (GNOME_DIALOG (user_data));
+}
+
+static GtkRadioButton *
+pack_radio_button (GtkBox *box, const char *label_text, GtkRadioButton *group)
+{
+ GtkWidget *radio_button;
+
+ radio_button = gtk_radio_button_new_with_label_from_widget (group, label_text);
+ gtk_widget_show (radio_button);
+ gtk_box_pack_start_defaults (box, radio_button);
+
+ return GTK_RADIO_BUTTON (radio_button);
+}
+
+static void
+run_program_configurator_callback (GtkWidget *button, gpointer callback_data)
+{
+ GnomeDialog *program_chooser;
+ NautilusFile *file;
+ GtkCList *clist;
+ GtkWidget *dialog;
+ GtkRadioButton *type_radio_button, *item_radio_button, *none_radio_button;
+ GtkRadioButton *old_active_button;
+ char *radio_button_text;
+ char *file_type, *file_name;
+ char *row_text;
+ char *title;
+ int selected_row;
+
+ g_assert (GNOME_IS_DIALOG (callback_data));
+
+ program_chooser = GNOME_DIALOG (callback_data);
+
+ file = nautilus_program_chooser_get_file (program_chooser);
+ clist = nautilus_program_chooser_get_clist (program_chooser);
+
+ selected_row = nautilus_gtk_clist_get_first_selected_row (clist);
+ if (selected_row < 0 || !gtk_clist_get_text (clist,
+ selected_row,
+ PROGRAM_LIST_NAME_COLUMN,
+ &row_text)) {
+ /* No valid selected item, don't do anything. Probably the UI
+ * should prevent this.
+ */
+ return;
+ }
+
+ title = g_strdup_printf (_("Change %s"), row_text);
+ dialog = gnome_dialog_new (title,
+ GNOME_STOCK_BUTTON_OK,
+ GNOME_STOCK_BUTTON_CANCEL,
+ NULL);
+ g_free (title);
+
+ /* Radio button for adding to short list for file type. */
+ file_type = nautilus_file_get_string_attribute (file, "type");
+ radio_button_text = g_strdup_printf ("Include %s in the menu for all \"%s\" items",
+ row_text, file_type);
+ type_radio_button = pack_radio_button (GTK_BOX (GNOME_DIALOG (dialog)->vbox),
+ radio_button_text,
+ NULL);
+ g_free (file_type);
+ g_free (radio_button_text);
+
+
+ /* Radio button for adding to short list for specific file. */
+ file_name = nautilus_file_get_name (file);
+ radio_button_text = g_strdup_printf ("Include %s in the menu just for \"%s\"",
+ row_text, file_name);
+ item_radio_button = pack_radio_button (GTK_BOX (GNOME_DIALOG (dialog)->vbox),
+ radio_button_text,
+ type_radio_button);
+ g_free (radio_button_text);
+
+ /* Radio button for not including program in short list for type or file. */
+ radio_button_text = g_strdup_printf ("Don't include %s in the menu for \"%s\"",
+ row_text, file_name);
+ none_radio_button = pack_radio_button (GTK_BOX (GNOME_DIALOG (dialog)->vbox),
+ radio_button_text,
+ item_radio_button);
+ g_free (file_name);
+ g_free (radio_button_text);
+
+ /* Activate the correct radio button. */
+ if (is_in_short_list (file, row_text)) {
+ old_active_button = type_radio_button;
+ } else if (is_in_metadata_list (file, row_text)) {
+ old_active_button = item_radio_button;
+ } else {
+ old_active_button = none_radio_button;
+ }
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (old_active_button), TRUE);
+
+ /* Buttons close this dialog. */
+ gnome_dialog_set_close (GNOME_DIALOG (dialog), TRUE);
+
+ /* Make OK button the default. */
+ gnome_dialog_set_default (GNOME_DIALOG (dialog), GNOME_OK);
+
+ gnome_dialog_set_parent (GNOME_DIALOG (dialog), GTK_WINDOW (program_chooser));
+
+ /* Don't destroy on close because callers will need
+ * to extract some information from the dialog after
+ * it closes.
+ */
+ gnome_dialog_close_hides (GNOME_DIALOG (dialog), TRUE);
+
+ if (gnome_dialog_run (GNOME_DIALOG (dialog)) == GNOME_OK) {
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (old_active_button))) {
+ g_message ("no change");
+ } else {
+ g_message ("user chose different radio button, will update when API is available");
+ update_selected_item_details (program_chooser);
+ }
+ }
+
+ gtk_widget_destroy (dialog);
+}
+
+
GnomeDialog *
nautilus_program_chooser_new (NautilusProgramChooserType type,
NautilusFile *file)
{
GtkWidget *window;
+ GtkWidget *dialog_vbox;
GtkWidget *prompt_label;
GtkWidget *list_scroller, *clist;
- GtkWidget *remember_for_type, *remember_for_file;
+ GtkWidget *frame;
+ GtkWidget *framed_hbox;
+ GtkWidget *status_label;
+ GtkWidget *change_button_holder;
+ GtkWidget *change_button;
char *file_name, *prompt;
const char *title;
@@ -101,19 +373,20 @@ nautilus_program_chooser_new (NautilusProgramChooserType type,
switch (type) {
case NAUTILUS_PROGRAM_CHOOSER_APPLICATIONS:
- title = _("Nautilus: Choose an application");
+ title = _("Nautilus: Open with Other");
prompt = g_strdup_printf (_("Choose an application with which to open \"%s\"."), file_name);
break;
case NAUTILUS_PROGRAM_CHOOSER_COMPONENTS:
default:
- title = _("Nautilus: Choose a viewer");
- prompt = g_strdup_printf (_("Choose a viewer with which to display \"%s\"."), file_name);
+ title = _("Nautilus: View as Other");
+ prompt = g_strdup_printf (_("Choose a view for \"%s\"."), file_name);
break;
}
+
g_free (file_name);
window = gnome_dialog_new (title,
- GNOME_STOCK_BUTTON_OK,
+ _("Choose"),
GNOME_STOCK_BUTTON_CANCEL,
NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), GNOME_PAD);
@@ -122,14 +395,14 @@ nautilus_program_chooser_new (NautilusProgramChooserType type,
NO_DEFAULT_MAGIC_NUMBER,
PROGRAM_CHOOSER_DEFAULT_HEIGHT);
+ dialog_vbox = GNOME_DIALOG (window)->vbox;
+
/* Prompt at top of dialog. */
prompt_label = gtk_label_new (prompt);
gtk_widget_show (prompt_label);
g_free (prompt);
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (window)->vbox),
- prompt_label,
- FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (dialog_vbox), prompt_label, FALSE, FALSE, 0);
/* Scrolling list to hold choices. */
list_scroller = gtk_scrolled_window_new (NULL, NULL);
@@ -146,24 +419,55 @@ nautilus_program_chooser_new (NautilusProgramChooserType type,
gtk_container_add (GTK_CONTAINER (list_scroller), clist);
gtk_clist_column_titles_hide (GTK_CLIST (clist));
- /* Checkboxes to remember these for later. */
- remember_for_type = gtk_check_button_new_with_label (_("Always offer this program with this document type."));
- gtk_widget_show (remember_for_type);
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (window)->vbox),
- remember_for_type,
- FALSE, FALSE, 0);
+ /* Framed area with selection-specific details */
+ frame = gtk_frame_new (NULL);
+ gtk_widget_show (frame);
+ gtk_box_pack_start (GTK_BOX (dialog_vbox), frame, FALSE, FALSE, 0);
+
+ framed_hbox = gtk_hbox_new (FALSE, GNOME_PAD);
+ gtk_widget_show (framed_hbox);
+ gtk_container_add (GTK_CONTAINER (frame), framed_hbox);
+ gtk_container_set_border_width (GTK_CONTAINER (framed_hbox), GNOME_PAD);
+
+ status_label = gtk_label_new (NULL);
+ gtk_label_set_justify (GTK_LABEL (status_label), GTK_JUSTIFY_LEFT);
+ gtk_widget_show (status_label);
+ gtk_box_pack_start (GTK_BOX (framed_hbox), status_label, FALSE, FALSE, 0);
+
+ change_button_holder = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (change_button_holder);
+ gtk_box_pack_end (GTK_BOX (framed_hbox), change_button_holder, FALSE, FALSE, 0);
- remember_for_file = gtk_check_button_new_with_label (_("Always offer this program with this document."));
- gtk_widget_show (remember_for_file);
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (window)->vbox),
- remember_for_file,
- FALSE, FALSE, 0);
+ change_button = gtk_button_new_with_label(_("Change..."));
+ gtk_widget_show (change_button);
+ gtk_box_pack_end (GTK_BOX (change_button_holder), change_button, TRUE, FALSE, 0);
+
+ gtk_signal_connect (GTK_OBJECT (change_button),
+ "clicked",
+ run_program_configurator_callback,
+ window);
/* Buttons close this dialog. */
gnome_dialog_set_close (GNOME_DIALOG (window), TRUE);
- /* Make OK button the default. */
+ /* Make confirmation button the default. */
gnome_dialog_set_default (GNOME_DIALOG (window), GNOME_OK);
+
+ /* Load up the dialog object with info other functions will need. */
+ nautilus_program_chooser_set_file (GNOME_DIALOG (window), file);
+ nautilus_program_chooser_set_clist (GNOME_DIALOG (window), GTK_CLIST (clist));
+ nautilus_program_chooser_set_frame (GNOME_DIALOG (window), GTK_FRAME (frame));
+ nautilus_program_chooser_set_status_label (GNOME_DIALOG (window), GTK_LABEL (status_label));
+
+ /* Fill in initial info about the selected item. */
+ update_selected_item_details (GNOME_DIALOG (window));
+
+ /* Update selected item info whenever selection changes. */
+ gtk_signal_connect (GTK_OBJECT (clist),
+ "select_row",
+ program_list_selection_changed_callback,
+ window);
+
return GNOME_DIALOG (window);
}