diff --git a/ChangeLog b/ChangeLog index 45b6af0754..eabd7bf370 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2005-05-19 Michael Natterer + + * plug-ins/dbbrowser/Makefile.am + * plug-ins/dbbrowser/gimpprocbox.[ch]: removed. + + * plug-ins/dbbrowser/gimpbrowser.[ch]: new widget derived from + GtkHPaned. Contains lots of common code from the procedure and + plug-in browsers. + + * plug-ins/dbbrowser/gimpprocbrowser.c + * plug-ins/dbbrowser/plugin-browser.c: use a GimpBrowser, lots of + cleanups. + + * plug-ins/dbbrowser/gimpprocbrowser.c: support all possible search + types. Addresses bug #301201. + 2005-05-18 Sven Neumann * app/actions/file-commands.c (file_open_dialog_show): set the diff --git a/libgimp/gimpprocbrowserdialog.c b/libgimp/gimpprocbrowserdialog.c index 7fd12e91b4..7c79dc3ea9 100644 --- a/libgimp/gimpprocbrowserdialog.c +++ b/libgimp/gimpprocbrowserdialog.c @@ -32,7 +32,7 @@ #include #include -#include "gimpprocbox.h" +#include "gimpbrowser.h" #include "gimpprocbrowser.h" #include "gimpprocview.h" @@ -48,7 +48,12 @@ typedef enum { SEARCH_TYPE_ALL, SEARCH_TYPE_NAME, - SEARCH_TYPE_BLURB + SEARCH_TYPE_BLURB, + SEARCH_TYPE_HELP, + SEARCH_TYPE_AUTHOR, + SEARCH_TYPE_COPYRIGHT, + SEARCH_TYPE_DATE, + SEARCH_TYPE_PROC_TYPE } SearchType; enum @@ -62,17 +67,10 @@ typedef struct { GtkWidget *dialog; - GtkWidget *search_entry; - SearchType search_type; - - GtkWidget *count_label; - GtkWidget *proc_box; + GtkWidget *browser; GtkListStore *store; - GtkWidget *tv; - GtkTreeSelection *sel; - - guint search_timeout_id; + GtkTreeView *tree_view; /* the currently selected procedure */ gchar *proc_name; @@ -95,8 +93,6 @@ typedef struct /* local function prototypes */ -static void browser_entry_changed (GtkEditable *editable, - GimpDBBrowser *browser); static void browser_selection_changed (GtkTreeSelection *sel, GimpDBBrowser *browser); static void browser_row_activated (GtkTreeView *treeview, @@ -105,9 +101,9 @@ static void browser_row_activated (GtkTreeView *treeview, GimpDBBrowser *browser); static void browser_show_procedure (GimpDBBrowser *browser, gchar *proc_name); -static gboolean browser_search_timeout (gpointer data); -static void browser_search (GimpDBBrowser *browser, - SearchType search_type); +static void browser_search (GimpBrowser *browser, + gint search_type, + GimpDBBrowser *db_browser); static void browser_response (GtkWidget *widget, gint response_id, GimpDBBrowser *browser); @@ -121,18 +117,13 @@ gimp_proc_browser_dialog_new (gboolean scheme_names, GimpProcBrowserApplyCallback apply_callback, gpointer user_data) { - GimpDBBrowser *browser; - GtkWidget *paned; - GtkWidget *hbox; - GtkWidget *vbox; - GtkWidget *combo; - GtkWidget *label; - GtkWidget *scrolled_window; - GtkCellRenderer *renderer; + GimpDBBrowser *browser; + GtkWidget *scrolled_window; + GtkCellRenderer *renderer; + GtkTreeSelection *selection; browser = g_new0 (GimpDBBrowser, 1); - browser->search_type = SEARCH_TYPE_NAME; browser->scheme_names = scheme_names ? TRUE : FALSE; browser->apply_callback = apply_callback; browser->user_data = user_data; @@ -158,53 +149,23 @@ gimp_proc_browser_dialog_new (gboolean scheme_names, G_CALLBACK (browser_response), browser); - /* paned : left=list ; right=description */ - - paned = gtk_hpaned_new (); - gtk_container_set_border_width (GTK_CONTAINER (paned), 12); + browser->browser = gimp_browser_new (); + gimp_browser_add_search_types (GIMP_BROWSER (browser->browser), + _("by name"), SEARCH_TYPE_NAME, + _("by description"), SEARCH_TYPE_BLURB, + _("by help"), SEARCH_TYPE_HELP, + _("by author"), SEARCH_TYPE_AUTHOR, + _("by copyright"), SEARCH_TYPE_COPYRIGHT, + _("by date"), SEARCH_TYPE_DATE, + _("by type"), SEARCH_TYPE_PROC_TYPE, + NULL); + gtk_container_set_border_width (GTK_CONTAINER (browser->browser), 12); gtk_container_add (GTK_CONTAINER (GTK_DIALOG (browser->dialog)->vbox), - paned); - gtk_widget_show (paned); + browser->browser); + gtk_widget_show (browser->browser); - /* left = vbox : the list and the search entry */ - - vbox = gtk_vbox_new (FALSE, 6); - gtk_paned_pack1 (GTK_PANED (paned), vbox, FALSE, TRUE); - gtk_widget_show (vbox); - - /* search entry */ - - hbox = gtk_hbox_new (FALSE, 6); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - gtk_widget_show (hbox); - - label = gtk_label_new_with_mnemonic (_("_Search:")); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - gtk_widget_show (label); - - browser->search_entry = gtk_entry_new (); - gtk_box_pack_start (GTK_BOX (hbox), browser->search_entry, TRUE, TRUE, 0); - gtk_widget_show (browser->search_entry); - - gtk_label_set_mnemonic_widget (GTK_LABEL (label), browser->search_entry); - - g_signal_connect (browser->search_entry, "changed", - G_CALLBACK (browser_entry_changed), - browser); - - combo = gimp_int_combo_box_new (_("by name"), SEARCH_TYPE_NAME, - _("by description"), SEARCH_TYPE_BLURB, - NULL); - gtk_box_pack_end (GTK_BOX (hbox), combo, FALSE, FALSE, 0); - gtk_widget_show (combo); - - gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (combo), - browser->search_type, - G_CALLBACK (gimp_int_combo_box_get_active), - &browser->search_type); - - g_signal_connect (combo, "changed", - G_CALLBACK (browser_entry_changed), + g_signal_connect (browser->browser, "search", + G_CALLBACK (browser_search), browser); /* list : list in a scrolled_win */ @@ -215,50 +176,41 @@ gimp_proc_browser_dialog_new (gboolean scheme_names, gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); - gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (GIMP_BROWSER (browser->browser)->left_vbox), + scrolled_window, TRUE, TRUE, 0); gtk_widget_show (scrolled_window); - browser->tv = gtk_tree_view_new (); + browser->tree_view = GTK_TREE_VIEW (gtk_tree_view_new ()); renderer = gtk_cell_renderer_text_new (); gtk_cell_renderer_text_set_fixed_height_from_font (GTK_CELL_RENDERER_TEXT (renderer), 1); - gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (browser->tv), + gtk_tree_view_insert_column_with_attributes (browser->tree_view, -1, NULL, renderer, "text", 0, NULL); - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (browser->tv), FALSE); + gtk_tree_view_set_headers_visible (browser->tree_view, FALSE); - g_signal_connect (browser->tv, "row_activated", + g_signal_connect (browser->tree_view, "row_activated", G_CALLBACK (browser_row_activated), browser); - gtk_widget_set_size_request (browser->tv, DBL_LIST_WIDTH, DBL_HEIGHT); - gtk_container_add (GTK_CONTAINER (scrolled_window), browser->tv); - gtk_widget_show (browser->tv); + gtk_widget_set_size_request (GTK_WIDGET (browser->tree_view), + DBL_LIST_WIDTH, DBL_HEIGHT); + gtk_container_add (GTK_CONTAINER (scrolled_window), + GTK_WIDGET (browser->tree_view)); + gtk_widget_show (GTK_WIDGET (browser->tree_view)); - browser->sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (browser->tv)); + selection = gtk_tree_view_get_selection (browser->tree_view); - g_signal_connect (browser->sel, "changed", + g_signal_connect (selection, "changed", G_CALLBACK (browser_selection_changed), browser); - /* number of matches */ - - browser->count_label = gtk_label_new ("0 Procedures"); - gtk_misc_set_alignment (GTK_MISC (browser->count_label), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (vbox), browser->count_label, FALSE, FALSE, 0); - gtk_widget_show (browser->count_label); - - /* right = description */ - - browser->proc_box = gimp_proc_box_new (); - gtk_widget_set_size_request (browser->proc_box, + gtk_widget_set_size_request (GIMP_BROWSER (browser->browser)->right_vbox->parent->parent, DBL_WIDTH - DBL_LIST_WIDTH, -1); - gtk_paned_pack2 (GTK_PANED (paned), browser->proc_box, TRUE, TRUE); - gtk_widget_show (browser->proc_box); /* now build the list */ @@ -266,22 +218,20 @@ gimp_proc_browser_dialog_new (gboolean scheme_names, /* initialize the "return" value (for "apply") */ - browser->proc_name = NULL; - browser->proc_blurb = NULL; - browser->proc_help = NULL; - browser->proc_author = NULL; - browser->proc_copyright = NULL; - browser->proc_date = NULL; - browser->proc_type = 0; - browser->n_params = 0; - browser->n_return_vals = 0; - browser->params = NULL; - browser->return_vals = NULL; + browser->proc_name = NULL; + browser->proc_blurb = NULL; + browser->proc_help = NULL; + browser->proc_author = NULL; + browser->proc_copyright = NULL; + browser->proc_date = NULL; + browser->proc_type = 0; + browser->n_params = 0; + browser->n_return_vals = 0; + browser->params = NULL; + browser->return_vals = NULL; /* first search (all procedures) */ - browser_search (browser, SEARCH_TYPE_ALL); - - gtk_widget_grab_focus (browser->search_entry); + browser_search (GIMP_BROWSER (browser->browser), SEARCH_TYPE_ALL, browser); return browser->dialog; } @@ -289,17 +239,6 @@ gimp_proc_browser_dialog_new (gboolean scheme_names, /* private functions */ -static void -browser_entry_changed (GtkEditable *editable, - GimpDBBrowser *browser) -{ - if (browser->search_timeout_id) - g_source_remove (browser->search_timeout_id); - - browser->search_timeout_id = - g_timeout_add (100, browser_search_timeout, browser); -} - static void browser_selection_changed (GtkTreeSelection *sel, GimpDBBrowser *browser) @@ -358,50 +297,39 @@ browser_show_procedure (GimpDBBrowser *browser, &browser->params, &browser->return_vals); - gimp_proc_box_set_widget (browser->proc_box, - gimp_proc_view_new (browser->proc_name, - NULL, - browser->proc_blurb, - browser->proc_help, - browser->proc_author, - browser->proc_copyright, - browser->proc_date, - browser->proc_type, - browser->n_params, - browser->n_return_vals, - browser->params, - browser->return_vals)); -} - -static gboolean -browser_search_timeout (gpointer data) -{ - GimpDBBrowser *browser = data; - - browser_search (browser, browser->search_type); - - browser->search_timeout_id = 0; - - return FALSE; + gimp_browser_set_widget (GIMP_BROWSER (browser->browser), + gimp_proc_view_new (browser->proc_name, + NULL, + browser->proc_blurb, + browser->proc_help, + browser->proc_author, + browser->proc_copyright, + browser->proc_date, + browser->proc_type, + browser->n_params, + browser->n_return_vals, + browser->params, + browser->return_vals)); } static void -browser_search (GimpDBBrowser *browser, - SearchType search_type) +browser_search (GimpBrowser *gimp_browser, + gint search_type, + GimpDBBrowser *browser) { const gchar *query_text; gchar **proc_list; gint num_procs; gchar *str; - query_text = gtk_entry_get_text (GTK_ENTRY (browser->search_entry)); + query_text = gtk_entry_get_text (GTK_ENTRY (gimp_browser->search_entry)); if (search_type == SEARCH_TYPE_NAME) { GString *query; - gimp_proc_box_show_message (browser->proc_box, - _("Searching by name - please wait")); + gimp_browser_show_message (GIMP_BROWSER (browser->browser), + _("Searching by name - please wait")); query = g_string_new (""); @@ -415,25 +343,55 @@ browser_search (GimpDBBrowser *browser, query_text++; } - gimp_procedural_db_query (query->str, - ".*", ".*", ".*", ".*", ".*", ".*", + gimp_procedural_db_query (query->str, ".*", ".*", ".*", ".*", ".*", ".*", &num_procs, &proc_list); g_string_free (query, TRUE); } else if (search_type == SEARCH_TYPE_BLURB) { - gimp_proc_box_show_message (browser->proc_box, - _("Searching by description - please wait")); + gimp_browser_show_message (GIMP_BROWSER (browser->browser), + _("Searching by description - please wait")); - gimp_procedural_db_query (".*", query_text, - ".*", ".*", ".*", ".*", ".*", + gimp_procedural_db_query (".*", query_text, ".*", ".*", ".*", ".*", ".*", + &num_procs, &proc_list); + } + else if (search_type == SEARCH_TYPE_AUTHOR) + { + gimp_browser_show_message (GIMP_BROWSER (browser->browser), + _("Searching by author - please wait")); + + gimp_procedural_db_query (".*", ".*", ".*", query_text, ".*", ".*", ".*", + &num_procs, &proc_list); + } + else if (search_type == SEARCH_TYPE_COPYRIGHT) + { + gimp_browser_show_message (GIMP_BROWSER (browser->browser), + _("Searching by copyright - please wait")); + + gimp_procedural_db_query (".*", ".*", ".*", ".*", query_text, ".*", ".*", + &num_procs, &proc_list); + } + else if (search_type == SEARCH_TYPE_DATE) + { + gimp_browser_show_message (GIMP_BROWSER (browser->browser), + _("Searching by date - please wait")); + + gimp_procedural_db_query (".*", ".*", ".*", ".*", ".*", query_text, ".*", + &num_procs, &proc_list); + } + else if (search_type == SEARCH_TYPE_PROC_TYPE) + { + gimp_browser_show_message (GIMP_BROWSER (browser->browser), + _("Searching by type - please wait")); + + gimp_procedural_db_query (".*", ".*", ".*", ".*", ".*", ".*", query_text, &num_procs, &proc_list); } else { - gimp_proc_box_show_message (browser->proc_box, - _("Searching - please wait")); + gimp_browser_show_message (GIMP_BROWSER (browser->browser), + _("Searching - please wait")); gimp_procedural_db_query (".*", ".*", ".*", ".*", ".*", ".*", ".*", &num_procs, &proc_list); @@ -444,18 +402,19 @@ browser_search (GimpDBBrowser *browser, else str = g_strdup_printf (_("%d Procedures"), num_procs); - gtk_label_set_text (GTK_LABEL (browser->count_label), str); + gtk_label_set_text (GTK_LABEL (gimp_browser->count_label), str); g_free (str); if (num_procs > 0) { - GtkTreeIter iter; - gint i; + GtkTreeSelection *selection; + GtkTreeIter iter; + gint i; browser->store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING); - gtk_tree_view_set_model (GTK_TREE_VIEW (browser->tv), + gtk_tree_view_set_model (browser->tree_view, GTK_TREE_MODEL (browser->store)); g_object_unref (browser->store); @@ -478,21 +437,22 @@ browser_search (GimpDBBrowser *browser, g_free (proc_list); - gtk_tree_view_columns_autosize (GTK_TREE_VIEW (browser->tv)); + gtk_tree_view_columns_autosize (browser->tree_view); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (browser->store), COLUMN_LABEL, GTK_SORT_ASCENDING); - gtk_tree_model_get_iter_first (GTK_TREE_MODEL (browser->store), - &iter); - gtk_tree_selection_select_iter (browser->sel, &iter); + gtk_tree_model_get_iter_first (GTK_TREE_MODEL (browser->store), &iter); + selection = gtk_tree_view_get_selection (browser->tree_view); + gtk_tree_selection_select_iter (selection, &iter); } else { - gtk_tree_view_set_model (GTK_TREE_VIEW (browser->tv), NULL); + gtk_tree_view_set_model (browser->tree_view, NULL); browser->store = NULL; - gimp_proc_box_show_message (browser->proc_box, _("No matches")); + gimp_browser_show_message (GIMP_BROWSER (browser->browser), + _("No matches")); } } diff --git a/plug-ins/common/plugin-browser.c b/plug-ins/common/plugin-browser.c index 2d41a07b62..896695cabe 100644 --- a/plug-ins/common/plugin-browser.c +++ b/plug-ins/common/plugin-browser.c @@ -31,48 +31,45 @@ #include #include -#include "gimpprocbox.h" +#include "gimpbrowser.h" #include "gimpprocview.h" #include "libgimp/stdplugins-intl.h" -enum -{ - LIST_NAME_COLUMN, - LIST_DATE_COLUMN, - LIST_PATH_COLUMN, - LIST_IMAGE_TYPES_COLUMN, - LIST_PINFO_COLUMN, - LIST_N_COLUMNS -}; - -enum -{ - TREE_PATH_NAME_COLUMN, - TREE_DATE_COLUMN, - TREE_IMAGE_TYPES_COLUMN, - TREE_MPATH_COLUMN, - TREE_PINFO_COLUMN, - TREE_N_COLUMNS -}; - #define DBL_LIST_WIDTH 250 #define DBL_WIDTH (DBL_LIST_WIDTH + 400) #define DBL_HEIGHT 250 + +enum +{ + LIST_COLUMN_NAME, + LIST_COLUMN_DATE, + LIST_COLUMN_PATH, + LIST_COLUMN_IMAGE_TYPES, + LIST_COLUMN_PINFO, + N_LIST_COLUMNS +}; + +enum +{ + TREE_COLUMN_PATH_NAME, + TREE_COLUMN_DATE, + TREE_COLUMN_IMAGE_TYPES, + TREE_COLUMN_MPATH, + TREE_COLUMN_PINFO, + N_TREE_OLUMNS +}; + typedef struct { GtkWidget *dialog; - GtkWidget *search_entry; - GtkWidget *count_label; - GtkWidget *proc_box; + GtkWidget *browser; GtkTreeView *list_view; GtkTreeView *tree_view; - - guint search_timeout_id; } PluginBrowser; typedef struct @@ -100,8 +97,6 @@ static GtkWidget * browser_dialog_new (void); static void browser_dialog_response (GtkWidget *widget, gint response_id, PluginBrowser *browser); -static void browser_entry_changed (GtkEditable *editable, - PluginBrowser *browser); static void browser_list_selection_changed (GtkTreeSelection *selection, PluginBrowser *browser); static void browser_tree_selection_changed (GtkTreeSelection *selection, @@ -222,7 +217,7 @@ find_existing_mpath_helper (GtkTreeModel *model, gchar *picked_mpath; gtk_tree_model_get (model, iter, - TREE_MPATH_COLUMN, &picked_mpath, + TREE_COLUMN_MPATH, &picked_mpath, -1); if (! strcmp (mpath, picked_mpath)) @@ -261,18 +256,21 @@ find_existing_mpath (GtkTreeModel *model, { GtkTreePath *path; GtkTreeIter parent; + gboolean found; path = gtk_tree_path_new_first (); - if (gtk_tree_model_get_iter (model, &parent, path) == FALSE) + if (! gtk_tree_model_get_iter (model, &parent, path)) { gtk_tree_path_free (path); return FALSE; } - return find_existing_mpath_helper (model, &parent, path, - mpath, return_iter); + found = find_existing_mpath_helper (model, &parent, path, + mpath, return_iter); gtk_tree_path_free (path); + + return found; } static void @@ -305,21 +303,21 @@ get_parent (PluginBrowser *browser, leaf_ptr = mpath; gtk_tree_store_append (tree_store, parent, NULL); gtk_tree_store_set (tree_store, parent, - TREE_MPATH_COLUMN, mpath, - TREE_PATH_NAME_COLUMN, mpath, + TREE_COLUMN_MPATH, mpath, + TREE_COLUMN_PATH_NAME, mpath, -1); } else { - leaf_ptr = g_strdup(str_ptr+1); + leaf_ptr = g_strdup (str_ptr + 1); - *str_ptr = '\000'; + *str_ptr = '\0'; get_parent (browser, tmp_ptr, &last_parent); gtk_tree_store_append (tree_store, parent, &last_parent); gtk_tree_store_set (tree_store, parent, - TREE_MPATH_COLUMN, mpath, - TREE_PATH_NAME_COLUMN, leaf_ptr, + TREE_COLUMN_MPATH, mpath, + TREE_COLUMN_PATH_NAME, leaf_ptr, -1); } } @@ -351,7 +349,7 @@ insert_into_tree_view (PluginBrowser *browser, leaf_ptr = g_strdup (str_ptr + 1); - *str_ptr = '\000'; + *str_ptr = '\0'; /* printf("inserting %s...\n",menu_str); */ @@ -366,18 +364,20 @@ insert_into_tree_view (PluginBrowser *browser, tree_store = GTK_TREE_STORE (gtk_tree_view_get_model (browser->tree_view)); gtk_tree_store_append (tree_store, &iter, &parent); gtk_tree_store_set (tree_store, &iter, - TREE_MPATH_COLUMN, menu_str, - TREE_PATH_NAME_COLUMN, name, - TREE_IMAGE_TYPES_COLUMN, types_str, - TREE_DATE_COLUMN, xtimestr, - TREE_PINFO_COLUMN, pinfo, + TREE_COLUMN_MPATH, menu_str, + TREE_COLUMN_PATH_NAME, name, + TREE_COLUMN_IMAGE_TYPES, types_str, + TREE_COLUMN_DATE, xtimestr, + TREE_COLUMN_PINFO, pinfo, -1); } static void -browser_search (PluginBrowser *browser, - const gchar *search_text) +browser_search (GimpBrowser *gimp_browser, + gint search_type, + PluginBrowser *browser) { + const gchar *search_text; GimpParam *return_vals; gint nreturn_vals; gint num_plugins; @@ -385,11 +385,13 @@ browser_search (PluginBrowser *browser, GtkListStore *list_store; GtkTreeStore *tree_store; + search_text = gtk_entry_get_text (GTK_ENTRY (gimp_browser->search_entry)); + if (! search_text) search_text = ""; - gimp_proc_box_show_message (browser->proc_box, - _("Searching by name - please wait")); + gimp_browser_show_message (GIMP_BROWSER (browser->browser), + _("Searching by name - please wait")); return_vals = gimp_run_procedure ("gimp_plugins_query", &nreturn_vals, @@ -406,7 +408,7 @@ browser_search (PluginBrowser *browser, else str = g_strdup_printf (_("%d Plug-In Interfaces"), num_plugins); - gtk_label_set_text (GTK_LABEL (browser->count_label), str); + gtk_label_set_text (GTK_LABEL (gimp_browser->count_label), str); g_free (str); list_store = GTK_LIST_STORE (gtk_tree_view_get_model (browser->list_view)); @@ -483,11 +485,11 @@ browser_search (PluginBrowser *browser, gtk_list_store_append (list_store, &iter); gtk_list_store_set (list_store, &iter, - LIST_NAME_COLUMN, name, - LIST_DATE_COLUMN, xtimestr, - LIST_PATH_COLUMN, menu_strs[i], - LIST_IMAGE_TYPES_COLUMN, types_strs[i], - LIST_PINFO_COLUMN, pinfo, + LIST_COLUMN_NAME, name, + LIST_COLUMN_DATE, xtimestr, + LIST_COLUMN_PATH, menu_strs[i], + LIST_COLUMN_IMAGE_TYPES, types_strs[i], + LIST_COLUMN_PINFO, pinfo, -1); /* Now do the tree view.... */ @@ -503,10 +505,10 @@ browser_search (PluginBrowser *browser, gtk_tree_view_columns_autosize (GTK_TREE_VIEW (browser->tree_view)); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (list_store), - LIST_NAME_COLUMN, + LIST_COLUMN_NAME, GTK_SORT_ASCENDING); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (tree_store), - TREE_PATH_NAME_COLUMN, + TREE_COLUMN_PATH_NAME, GTK_SORT_ASCENDING); sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (browser->list_view)); @@ -517,32 +519,18 @@ browser_search (PluginBrowser *browser, } else { - gimp_proc_box_show_message (browser->proc_box, _("No matches")); + gimp_browser_show_message (GIMP_BROWSER (browser->browser), + _("No matches")); } gimp_destroy_params (return_vals, nreturn_vals); } -static gboolean -browser_search_timeout (gpointer data) -{ - PluginBrowser *browser = data; - const gchar *search_text = NULL; - - search_text = gtk_entry_get_text (GTK_ENTRY (browser->search_entry)); - browser_search (browser, search_text); - - browser->search_timeout_id = 0; - - return FALSE; -} - static GtkWidget * browser_dialog_new (void) { - GtkWidget *paned; - GtkWidget *hbox, *vbox; - GtkWidget *label, *notebook, *swindow; + GtkWidget *label, *notebook; + GtkWidget *scrolled_window; GtkListStore *list_store; GtkTreeStore *tree_store; GtkWidget *list_view; @@ -569,47 +557,24 @@ browser_dialog_new (void) G_CALLBACK (browser_dialog_response), browser); - /* paned : left=notebook ; right=description */ - - paned = gtk_hpaned_new (); - gtk_container_set_border_width (GTK_CONTAINER (paned), 12); + browser->browser = gimp_browser_new (); + gtk_container_set_border_width (GTK_CONTAINER (browser->browser), 12); gtk_container_add (GTK_CONTAINER (GTK_DIALOG (browser->dialog)->vbox), - paned); - gtk_widget_show (paned); + browser->browser); + gtk_widget_show (browser->browser); - /* left = vbox : the list and the search entry */ - - vbox = gtk_vbox_new (FALSE, 6); - gtk_paned_pack1 (GTK_PANED (paned), vbox, FALSE, TRUE); - gtk_widget_show (vbox); - - /* search entry */ - - hbox = gtk_hbox_new (FALSE, 6); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - gtk_widget_show (hbox); - - label = gtk_label_new_with_mnemonic (_("_Search:")); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - gtk_widget_show (label); - - browser->search_entry = gtk_entry_new (); - gtk_box_pack_start (GTK_BOX (hbox), browser->search_entry, TRUE, TRUE, 0); - gtk_widget_show (browser->search_entry); - - gtk_label_set_mnemonic_widget (GTK_LABEL (label), browser->search_entry); - - g_signal_connect (browser->search_entry, "changed", - G_CALLBACK (browser_entry_changed), + g_signal_connect (browser->browser, "search", + G_CALLBACK (browser_search), browser); /* left = notebook */ notebook = gtk_notebook_new (); - gtk_box_pack_start (GTK_BOX (vbox), notebook, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (GIMP_BROWSER (browser->browser)->left_vbox), + notebook, TRUE, TRUE, 0); /* list : list in a scrolled_win */ - list_store = gtk_list_store_new (LIST_N_COLUMNS, + list_store = gtk_list_store_new (N_LIST_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, @@ -624,41 +589,41 @@ browser_dialog_new (void) renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Name"), renderer, - "text", LIST_NAME_COLUMN, + "text", LIST_COLUMN_NAME, NULL); - gtk_tree_view_column_set_sort_column_id (column, LIST_NAME_COLUMN); + gtk_tree_view_column_set_sort_column_id (column, LIST_COLUMN_NAME); gtk_tree_view_append_column (GTK_TREE_VIEW (list_view), column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Insertion Date"), renderer, - "text", LIST_DATE_COLUMN, + "text", LIST_COLUMN_DATE, NULL); - gtk_tree_view_column_set_sort_column_id (column, LIST_DATE_COLUMN); + gtk_tree_view_column_set_sort_column_id (column, LIST_COLUMN_DATE); gtk_tree_view_append_column (GTK_TREE_VIEW (list_view), column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Menu Path"), renderer, - "text", LIST_PATH_COLUMN, + "text", LIST_COLUMN_PATH, NULL); - gtk_tree_view_column_set_sort_column_id (column, LIST_PATH_COLUMN); + gtk_tree_view_column_set_sort_column_id (column, LIST_COLUMN_PATH); gtk_tree_view_append_column (GTK_TREE_VIEW (list_view), column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Image Types"), renderer, "text", - LIST_IMAGE_TYPES_COLUMN, + LIST_COLUMN_IMAGE_TYPES, NULL); - gtk_tree_view_column_set_sort_column_id (column, LIST_IMAGE_TYPES_COLUMN); + gtk_tree_view_column_set_sort_column_id (column, LIST_COLUMN_IMAGE_TYPES); gtk_tree_view_append_column (GTK_TREE_VIEW (list_view), column); - swindow = gtk_scrolled_window_new (NULL, NULL); - gtk_container_set_border_width (GTK_CONTAINER (swindow), 2); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swindow), + scrolled_window = gtk_scrolled_window_new (NULL, NULL); + gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 2); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_set_size_request (list_view, DBL_LIST_WIDTH, DBL_HEIGHT); @@ -671,13 +636,13 @@ browser_dialog_new (void) browser); label = gtk_label_new (_("List View")); - gtk_notebook_append_page (GTK_NOTEBOOK (notebook), swindow, label); - gtk_container_add (GTK_CONTAINER (swindow), list_view); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), scrolled_window, label); + gtk_container_add (GTK_CONTAINER (scrolled_window), list_view); gtk_widget_show (list_view); - gtk_widget_show (swindow); + gtk_widget_show (scrolled_window); /* notebook->ctree */ - tree_store = gtk_tree_store_new (LIST_N_COLUMNS, + tree_store = gtk_tree_store_new (N_LIST_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, @@ -693,34 +658,34 @@ browser_dialog_new (void) column = gtk_tree_view_column_new_with_attributes (_("Menu Path/Name"), renderer, "text", - TREE_PATH_NAME_COLUMN, + TREE_COLUMN_PATH_NAME, NULL); - gtk_tree_view_column_set_sort_column_id (column, TREE_PATH_NAME_COLUMN); + gtk_tree_view_column_set_sort_column_id (column, TREE_COLUMN_PATH_NAME); gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Insertion Date"), renderer, "text", - TREE_DATE_COLUMN, + TREE_COLUMN_DATE, NULL); - gtk_tree_view_column_set_sort_column_id (column, TREE_DATE_COLUMN); + gtk_tree_view_column_set_sort_column_id (column, TREE_COLUMN_DATE); gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Image Types"), renderer, "text", - TREE_IMAGE_TYPES_COLUMN, + TREE_COLUMN_IMAGE_TYPES, NULL); - gtk_tree_view_column_set_sort_column_id (column, TREE_IMAGE_TYPES_COLUMN); + gtk_tree_view_column_set_sort_column_id (column, TREE_COLUMN_IMAGE_TYPES); gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column); - swindow = gtk_scrolled_window_new (NULL, NULL); - gtk_container_set_border_width (GTK_CONTAINER (swindow), 2); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swindow), + scrolled_window = gtk_scrolled_window_new (NULL, NULL); + gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 2); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_set_size_request (tree_view, DBL_LIST_WIDTH, DBL_HEIGHT); @@ -732,30 +697,18 @@ browser_dialog_new (void) browser); label = gtk_label_new (_("Tree View")); - gtk_notebook_append_page (GTK_NOTEBOOK (notebook), swindow, label); - gtk_container_add (GTK_CONTAINER (swindow), tree_view); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), scrolled_window, label); + gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view); gtk_widget_show (tree_view); - gtk_widget_show (swindow); + gtk_widget_show (scrolled_window); gtk_widget_show (notebook); - /* number of matches */ - - browser->count_label = gtk_label_new ("0 Plug-In Interfaces"); - gtk_misc_set_alignment (GTK_MISC (browser->count_label), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (vbox), browser->count_label, FALSE, FALSE, 0); - gtk_widget_show (browser->count_label); - - /* right = description */ - - browser->proc_box = gimp_proc_box_new (); - gtk_widget_set_size_request (browser->proc_box, + gtk_widget_set_size_request (GIMP_BROWSER (browser->browser)->right_vbox->parent->parent, DBL_WIDTH - DBL_LIST_WIDTH, -1); - gtk_paned_pack2 (GTK_PANED (paned), browser->proc_box, TRUE, TRUE); - gtk_widget_show (browser->proc_box); /* now build the list */ - browser_search (browser, NULL); + browser_search (GIMP_BROWSER (browser->browser), 0, browser); gtk_widget_show (browser->dialog); @@ -763,8 +716,6 @@ browser_dialog_new (void) gtk_tree_selection_select_iter (gtk_tree_view_get_selection (GTK_TREE_VIEW (list_view)), &iter); - gtk_widget_grab_focus (browser->search_entry); - return browser->dialog; } @@ -777,17 +728,6 @@ browser_dialog_response (GtkWidget *widget, gtk_main_quit (); } -static void -browser_entry_changed (GtkEditable *editable, - PluginBrowser *browser) -{ - if (browser->search_timeout_id) - g_source_remove (browser->search_timeout_id); - - browser->search_timeout_id = - g_timeout_add (100, browser_search_timeout, browser); -} - static void browser_list_selection_changed (GtkTreeSelection *selection, PluginBrowser *browser) @@ -802,8 +742,8 @@ browser_list_selection_changed (GtkTreeSelection *selection, if (gtk_tree_selection_get_selected (selection, &model, &iter)) { gtk_tree_model_get (model, &iter, - LIST_PINFO_COLUMN, &pinfo, - LIST_PATH_COLUMN, &mpath, + LIST_COLUMN_PINFO, &pinfo, + LIST_COLUMN_PATH, &mpath, -1); } @@ -858,8 +798,8 @@ browser_tree_selection_changed (GtkTreeSelection *selection, if (gtk_tree_selection_get_selected (selection, &model, &iter)) { gtk_tree_model_get (model, &iter, - TREE_PINFO_COLUMN, &pinfo, - TREE_MPATH_COLUMN, &mpath, + TREE_COLUMN_PINFO, &pinfo, + TREE_COLUMN_MPATH, &mpath, -1); } @@ -877,7 +817,7 @@ browser_tree_selection_changed (GtkTreeSelection *selection, gchar *picked_mpath; gtk_tree_model_get (model, &iter, - LIST_PATH_COLUMN, &picked_mpath, + LIST_COLUMN_PATH, &picked_mpath, -1); if (picked_mpath && !strcmp (mpath, picked_mpath)) { @@ -947,19 +887,19 @@ browser_show_plugin (PluginBrowser *browser, ¶ms, &return_vals); - gimp_proc_box_set_widget (browser->proc_box, - gimp_proc_view_new (pinfo->realname, - pinfo->menu, - blurb, - help, - author, - copyright, - date, - type, - n_params, - n_return_vals, - params, - return_vals)); + gimp_browser_set_widget (GIMP_BROWSER (browser->browser), + gimp_proc_view_new (pinfo->realname, + pinfo->menu, + blurb, + help, + author, + copyright, + date, + type, + n_params, + n_return_vals, + params, + return_vals)); g_free (blurb); g_free (help); diff --git a/plug-ins/dbbrowser/Makefile.am b/plug-ins/dbbrowser/Makefile.am index 8259d955ce..a063c7eff8 100644 --- a/plug-ins/dbbrowser/Makefile.am +++ b/plug-ins/dbbrowser/Makefile.am @@ -20,8 +20,8 @@ noinst_LTLIBRARIES = libgimpprocbrowser.la libexec_PROGRAMS = plugin-browser procedure-browser libgimpprocbrowser_la_SOURCES = \ - gimpprocbox.c \ - gimpprocbox.h \ + gimpbrowser.c \ + gimpbrowser.h \ gimpprocbrowser.c \ gimpprocbrowser.h \ gimpprocview.c \ diff --git a/plug-ins/dbbrowser/gimpbrowser.c b/plug-ins/dbbrowser/gimpbrowser.c new file mode 100644 index 0000000000..adebc77e4c --- /dev/null +++ b/plug-ins/dbbrowser/gimpbrowser.c @@ -0,0 +1,318 @@ +/* The GIMP -- an image manipulation program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * gimpbrowser.c + * Copyright (C) 2005 Michael Natterer + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include + +#include +#include + +#include "gimpbrowser.h" + +#include "libgimp/stdplugins-intl.h" + + +#define DBL_LIST_WIDTH 250 +#define DBL_WIDTH (DBL_LIST_WIDTH + 400) +#define DBL_HEIGHT 250 + + +enum +{ + SEARCH, + LAST_SIGNAL +}; + + +static void gimp_browser_class_init (GimpBrowserClass *klass); +static void gimp_browser_init (GimpBrowser *browser); + +static void gimp_browser_destroy (GtkObject *object); + +static void gimp_browser_entry_changed (GtkEditable *editable, + GimpBrowser *browser); +static gboolean gimp_browser_search_timeout (gpointer data); + + +static GtkHPanedClass *parent_class = NULL; + +static guint browser_signals[LAST_SIGNAL] = { 0 }; + + +GType +gimp_browser_get_type (void) +{ + static GType type = 0; + + if (! type) + { + static const GTypeInfo info = + { + sizeof (GimpBrowserClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) gimp_browser_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GimpBrowser), + 0, /* n_preallocs */ + (GInstanceInitFunc) gimp_browser_init, + }; + + type = g_type_register_static (GTK_TYPE_HPANED, + "GimpBrowser", + &info, 0); + } + + return type; +} + +static void +gimp_browser_class_init (GimpBrowserClass *klass) +{ + GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (klass); + + parent_class = g_type_class_peek_parent (klass); + + browser_signals[SEARCH] = + g_signal_new ("search", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GimpBrowserClass, search), + NULL, NULL, + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, 1, + G_TYPE_INT); + + gtk_object_class->destroy = gimp_browser_destroy; + + klass->search = NULL; +} + +static void +gimp_browser_init (GimpBrowser *browser) +{ + GtkWidget *hbox; + GtkWidget *label; + GtkWidget *scrolled_window; + + browser->search_type = -1; + + browser->left_vbox = gtk_vbox_new (FALSE, 6); + gtk_paned_pack1 (GTK_PANED (browser), browser->left_vbox, FALSE, TRUE); + gtk_widget_show (browser->left_vbox); + + /* search entry */ + + hbox = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (browser->left_vbox), hbox, FALSE, FALSE, 0); + gtk_widget_show (hbox); + + label = gtk_label_new_with_mnemonic (_("_Search:")); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + gtk_widget_show (label); + + browser->search_entry = gtk_entry_new (); + gtk_box_pack_start (GTK_BOX (hbox), browser->search_entry, TRUE, TRUE, 0); + gtk_widget_show (browser->search_entry); + + gtk_label_set_mnemonic_widget (GTK_LABEL (label), browser->search_entry); + + g_signal_connect (browser->search_entry, "changed", + G_CALLBACK (gimp_browser_entry_changed), + browser); + + /* count label */ + + browser->count_label = gtk_label_new ("0 Matches"); + gtk_misc_set_alignment (GTK_MISC (browser->count_label), 0.0, 0.5); + gtk_box_pack_end (GTK_BOX (browser->left_vbox), browser->count_label, + FALSE, FALSE, 0); + gtk_widget_show (browser->count_label); + + /* scrolled window */ + + scrolled_window = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_ALWAYS); + gtk_paned_pack2 (GTK_PANED (browser), scrolled_window, TRUE, TRUE); + gtk_widget_show (scrolled_window); + + browser->right_vbox = gtk_vbox_new (FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (browser->right_vbox), 12); + gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), + browser->right_vbox); + gtk_widget_show (browser->right_vbox); + + gtk_widget_grab_focus (browser->search_entry); +} + +static void +gimp_browser_destroy (GtkObject *object) +{ + GimpBrowser *browser = GIMP_BROWSER (object); + + if (browser->search_timeout_id) + { + g_source_remove (browser->search_timeout_id); + browser->search_timeout_id = 0; + } + + GTK_OBJECT_CLASS (parent_class)->destroy (object); +} + + +/* public functions */ + +GtkWidget * +gimp_browser_new (void) +{ + return g_object_new (GIMP_TYPE_BROWSER, NULL); +} + +void +gimp_browser_add_search_types (GimpBrowser *browser, + const gchar *first_type_label, + gint first_type_id, + ...) +{ + g_return_if_fail (GIMP_IS_BROWSER (browser)); + g_return_if_fail (first_type_label != NULL); + + if (! browser->search_type_combo) + { + GtkWidget *combo; + va_list args; + + va_start (args, first_type_id); + combo = gimp_int_combo_box_new_valist (first_type_label, + first_type_id, + args); + va_end (args); + + browser->search_type_combo = combo; + browser->search_type = first_type_id; + + gtk_box_pack_end (GTK_BOX (browser->search_entry->parent), combo, + FALSE, FALSE, 0); + gtk_widget_show (combo); + + gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (combo), + browser->search_type, + G_CALLBACK (gimp_int_combo_box_get_active), + &browser->search_type); + + g_signal_connect (combo, "changed", + G_CALLBACK (gimp_browser_entry_changed), + browser); + } + else + { + gimp_int_combo_box_append (GIMP_INT_COMBO_BOX (browser->search_type_combo), + first_type_label, first_type_id, + NULL); + } +} + +void +gimp_browser_set_widget (GimpBrowser *browser, + GtkWidget *widget) +{ + GtkWidget *child; + + g_return_if_fail (GIMP_IS_BROWSER (browser)); + g_return_if_fail (GTK_IS_WIDGET (widget)); + + child = g_object_get_data (G_OBJECT (browser->right_vbox), "child"); + + if (child) + gtk_container_remove (GTK_CONTAINER (browser->right_vbox), child); + + gtk_box_pack_start (GTK_BOX (browser->right_vbox), widget, FALSE, FALSE, 0); + gtk_widget_show (widget); + + g_object_set_data (G_OBJECT (browser->right_vbox), "child", widget); +} + +void +gimp_browser_show_message (GimpBrowser *browser, + const gchar *message) +{ + GtkWidget *child; + + g_return_if_fail (GIMP_IS_BROWSER (browser)); + g_return_if_fail (message != NULL); + + child = g_object_get_data (G_OBJECT (browser->right_vbox), "child"); + + if (GTK_IS_LABEL (child)) + { + gtk_label_set_text (GTK_LABEL (child), message); + } + else + { + if (child) + gtk_container_remove (GTK_CONTAINER (browser->right_vbox), child); + + child = gtk_label_new (message); + gtk_box_pack_start (GTK_BOX (browser->right_vbox), child, + FALSE, FALSE, 0); + gtk_widget_show (child); + + g_object_set_data (G_OBJECT (browser->right_vbox), "child", child); + } + + while (gtk_events_pending ()) + gtk_main_iteration (); +} + + +/* private functions */ + +static void +gimp_browser_entry_changed (GtkEditable *editable, + GimpBrowser *browser) +{ + if (browser->search_timeout_id) + g_source_remove (browser->search_timeout_id); + + browser->search_timeout_id = + g_timeout_add (100, gimp_browser_search_timeout, browser); +} + +static gboolean +gimp_browser_search_timeout (gpointer data) +{ + GimpBrowser *browser = GIMP_BROWSER (data); + + GDK_THREADS_ENTER(); + g_signal_emit (browser, browser_signals[SEARCH], 0, + browser->search_type); + GDK_THREADS_LEAVE(); + + browser->search_timeout_id = 0; + + return FALSE; +} diff --git a/plug-ins/dbbrowser/gimpbrowser.h b/plug-ins/dbbrowser/gimpbrowser.h new file mode 100644 index 0000000000..658be61245 --- /dev/null +++ b/plug-ins/dbbrowser/gimpbrowser.h @@ -0,0 +1,81 @@ +/* The GIMP -- an image manipulation program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * gimpbrowser.h + * Copyright (C) 2005 Michael Natterer + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __GIMP_BROWSER_H__ +#define __GIMP_BROWSER_H__ + + +#include + + +#define GIMP_TYPE_BROWSER (gimp_browser_get_type ()) +#define GIMP_BROWSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_BROWSER, GimpBrowser)) +#define GIMP_BROWSER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_BROWSER, GimpBrowserClass)) +#define GIMP_IS_BROWSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_BROWSER)) +#define GIMP_IS_BROWSER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_BROWSER)) +#define GIMP_BROWSER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_BROWSER, GimpBrowserClass)) + + +typedef struct _GimpBrowser GimpBrowser; +typedef struct _GimpBrowserClass GimpBrowserClass; + +struct _GimpBrowser +{ + GtkHPaned parent_instance; + + GtkWidget *left_vbox; + + GtkWidget *search_entry; + guint search_timeout_id; + + GtkWidget *search_type_combo; + gint search_type; + + GtkWidget *count_label; + + GtkWidget *right_vbox; +}; + +struct _GimpBrowserClass +{ + GtkHPanedClass parent_class; + + void (* search) (GimpBrowser *browser, + gint search_type); +}; + + +GType gimp_browser_get_type (void) G_GNUC_CONST; + +GtkWidget * gimp_browser_new (void); + +void gimp_browser_add_search_types (GimpBrowser *browser, + const gchar *first_type_label, + gint first_type_id, + ...); + +void gimp_browser_set_widget (GimpBrowser *browser, + GtkWidget *widget); +void gimp_browser_show_message (GimpBrowser *browser, + const gchar *message); + + +#endif /* __GIMP_BROWSER_H__ */ diff --git a/plug-ins/dbbrowser/gimpprocbox.c b/plug-ins/dbbrowser/gimpprocbox.c deleted file mode 100644 index f058fc8258..0000000000 --- a/plug-ins/dbbrowser/gimpprocbox.c +++ /dev/null @@ -1,111 +0,0 @@ -/* The GIMP -- an image manipulation program - * Copyright (C) 1995 Spencer Kimball and Peter Mattis - * - * This program 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 program 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 program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include "config.h" - -#include - -#include - -#include "gimpprocbox.h" - - -/* public functions */ - -GtkWidget * -gimp_proc_box_new (void) -{ - GtkWidget *scrolled_window; - GtkWidget *vbox; - - scrolled_window = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_ALWAYS); - - vbox = gtk_vbox_new (FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 12); - gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), - vbox); - gtk_widget_show (vbox); - - g_object_set_data (G_OBJECT (scrolled_window), "vbox", vbox); - - return scrolled_window; -} - -void -gimp_proc_box_set_widget (GtkWidget *proc_box, - GtkWidget *widget) -{ - GtkWidget *vbox; - GtkWidget *child; - - g_return_if_fail (GTK_IS_SCROLLED_WINDOW (proc_box)); - g_return_if_fail (GTK_IS_WIDGET (widget)); - - vbox = g_object_get_data (G_OBJECT (proc_box), "vbox"); - - g_return_if_fail (GTK_IS_VBOX (vbox)); - - child = g_object_get_data (G_OBJECT (vbox), "child"); - - if (child) - gtk_container_remove (GTK_CONTAINER (vbox), child); - - gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0); - gtk_widget_show (widget); - - g_object_set_data (G_OBJECT (vbox), "child", widget); -} - -void -gimp_proc_box_show_message (GtkWidget *proc_box, - const gchar *message) -{ - GtkWidget *vbox; - GtkWidget *child; - - g_return_if_fail (GTK_IS_SCROLLED_WINDOW (proc_box)); - g_return_if_fail (message != NULL); - - vbox = g_object_get_data (G_OBJECT (proc_box), "vbox"); - - g_return_if_fail (GTK_IS_VBOX (vbox)); - - child = g_object_get_data (G_OBJECT (vbox), "child"); - - if (GTK_IS_LABEL (child)) - { - gtk_label_set_text (GTK_LABEL (child), message); - } - else - { - if (child) - gtk_container_remove (GTK_CONTAINER (vbox), child); - - child = gtk_label_new (message); - gtk_box_pack_start (GTK_BOX (vbox), child, FALSE, FALSE, 0); - gtk_widget_show (child); - - g_object_set_data (G_OBJECT (vbox), "child", child); - } - - while (gtk_events_pending ()) - gtk_main_iteration (); -} diff --git a/plug-ins/dbbrowser/gimpprocbox.h b/plug-ins/dbbrowser/gimpprocbox.h deleted file mode 100644 index c5a34f8908..0000000000 --- a/plug-ins/dbbrowser/gimpprocbox.h +++ /dev/null @@ -1,31 +0,0 @@ -/* The GIMP -- an image manipulation program - * Copyright (C) 1995 Spencer Kimball and Peter Mattis - * - * This program 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 program 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 program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef __GIMP_PROC_BOX_H__ -#define __GIMP_PROC_BOX_H__ - - -GtkWidget * gimp_proc_box_new (void); - -void gimp_proc_box_set_widget (GtkWidget *proc_box, - GtkWidget *widget); -void gimp_proc_box_show_message (GtkWidget *proc_box, - const gchar *message); - - -#endif /* __GIMP_PROC_BOX_H__ */ diff --git a/plug-ins/dbbrowser/gimpprocbrowser.c b/plug-ins/dbbrowser/gimpprocbrowser.c index 7fd12e91b4..7c79dc3ea9 100644 --- a/plug-ins/dbbrowser/gimpprocbrowser.c +++ b/plug-ins/dbbrowser/gimpprocbrowser.c @@ -32,7 +32,7 @@ #include #include -#include "gimpprocbox.h" +#include "gimpbrowser.h" #include "gimpprocbrowser.h" #include "gimpprocview.h" @@ -48,7 +48,12 @@ typedef enum { SEARCH_TYPE_ALL, SEARCH_TYPE_NAME, - SEARCH_TYPE_BLURB + SEARCH_TYPE_BLURB, + SEARCH_TYPE_HELP, + SEARCH_TYPE_AUTHOR, + SEARCH_TYPE_COPYRIGHT, + SEARCH_TYPE_DATE, + SEARCH_TYPE_PROC_TYPE } SearchType; enum @@ -62,17 +67,10 @@ typedef struct { GtkWidget *dialog; - GtkWidget *search_entry; - SearchType search_type; - - GtkWidget *count_label; - GtkWidget *proc_box; + GtkWidget *browser; GtkListStore *store; - GtkWidget *tv; - GtkTreeSelection *sel; - - guint search_timeout_id; + GtkTreeView *tree_view; /* the currently selected procedure */ gchar *proc_name; @@ -95,8 +93,6 @@ typedef struct /* local function prototypes */ -static void browser_entry_changed (GtkEditable *editable, - GimpDBBrowser *browser); static void browser_selection_changed (GtkTreeSelection *sel, GimpDBBrowser *browser); static void browser_row_activated (GtkTreeView *treeview, @@ -105,9 +101,9 @@ static void browser_row_activated (GtkTreeView *treeview, GimpDBBrowser *browser); static void browser_show_procedure (GimpDBBrowser *browser, gchar *proc_name); -static gboolean browser_search_timeout (gpointer data); -static void browser_search (GimpDBBrowser *browser, - SearchType search_type); +static void browser_search (GimpBrowser *browser, + gint search_type, + GimpDBBrowser *db_browser); static void browser_response (GtkWidget *widget, gint response_id, GimpDBBrowser *browser); @@ -121,18 +117,13 @@ gimp_proc_browser_dialog_new (gboolean scheme_names, GimpProcBrowserApplyCallback apply_callback, gpointer user_data) { - GimpDBBrowser *browser; - GtkWidget *paned; - GtkWidget *hbox; - GtkWidget *vbox; - GtkWidget *combo; - GtkWidget *label; - GtkWidget *scrolled_window; - GtkCellRenderer *renderer; + GimpDBBrowser *browser; + GtkWidget *scrolled_window; + GtkCellRenderer *renderer; + GtkTreeSelection *selection; browser = g_new0 (GimpDBBrowser, 1); - browser->search_type = SEARCH_TYPE_NAME; browser->scheme_names = scheme_names ? TRUE : FALSE; browser->apply_callback = apply_callback; browser->user_data = user_data; @@ -158,53 +149,23 @@ gimp_proc_browser_dialog_new (gboolean scheme_names, G_CALLBACK (browser_response), browser); - /* paned : left=list ; right=description */ - - paned = gtk_hpaned_new (); - gtk_container_set_border_width (GTK_CONTAINER (paned), 12); + browser->browser = gimp_browser_new (); + gimp_browser_add_search_types (GIMP_BROWSER (browser->browser), + _("by name"), SEARCH_TYPE_NAME, + _("by description"), SEARCH_TYPE_BLURB, + _("by help"), SEARCH_TYPE_HELP, + _("by author"), SEARCH_TYPE_AUTHOR, + _("by copyright"), SEARCH_TYPE_COPYRIGHT, + _("by date"), SEARCH_TYPE_DATE, + _("by type"), SEARCH_TYPE_PROC_TYPE, + NULL); + gtk_container_set_border_width (GTK_CONTAINER (browser->browser), 12); gtk_container_add (GTK_CONTAINER (GTK_DIALOG (browser->dialog)->vbox), - paned); - gtk_widget_show (paned); + browser->browser); + gtk_widget_show (browser->browser); - /* left = vbox : the list and the search entry */ - - vbox = gtk_vbox_new (FALSE, 6); - gtk_paned_pack1 (GTK_PANED (paned), vbox, FALSE, TRUE); - gtk_widget_show (vbox); - - /* search entry */ - - hbox = gtk_hbox_new (FALSE, 6); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - gtk_widget_show (hbox); - - label = gtk_label_new_with_mnemonic (_("_Search:")); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - gtk_widget_show (label); - - browser->search_entry = gtk_entry_new (); - gtk_box_pack_start (GTK_BOX (hbox), browser->search_entry, TRUE, TRUE, 0); - gtk_widget_show (browser->search_entry); - - gtk_label_set_mnemonic_widget (GTK_LABEL (label), browser->search_entry); - - g_signal_connect (browser->search_entry, "changed", - G_CALLBACK (browser_entry_changed), - browser); - - combo = gimp_int_combo_box_new (_("by name"), SEARCH_TYPE_NAME, - _("by description"), SEARCH_TYPE_BLURB, - NULL); - gtk_box_pack_end (GTK_BOX (hbox), combo, FALSE, FALSE, 0); - gtk_widget_show (combo); - - gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (combo), - browser->search_type, - G_CALLBACK (gimp_int_combo_box_get_active), - &browser->search_type); - - g_signal_connect (combo, "changed", - G_CALLBACK (browser_entry_changed), + g_signal_connect (browser->browser, "search", + G_CALLBACK (browser_search), browser); /* list : list in a scrolled_win */ @@ -215,50 +176,41 @@ gimp_proc_browser_dialog_new (gboolean scheme_names, gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); - gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (GIMP_BROWSER (browser->browser)->left_vbox), + scrolled_window, TRUE, TRUE, 0); gtk_widget_show (scrolled_window); - browser->tv = gtk_tree_view_new (); + browser->tree_view = GTK_TREE_VIEW (gtk_tree_view_new ()); renderer = gtk_cell_renderer_text_new (); gtk_cell_renderer_text_set_fixed_height_from_font (GTK_CELL_RENDERER_TEXT (renderer), 1); - gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (browser->tv), + gtk_tree_view_insert_column_with_attributes (browser->tree_view, -1, NULL, renderer, "text", 0, NULL); - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (browser->tv), FALSE); + gtk_tree_view_set_headers_visible (browser->tree_view, FALSE); - g_signal_connect (browser->tv, "row_activated", + g_signal_connect (browser->tree_view, "row_activated", G_CALLBACK (browser_row_activated), browser); - gtk_widget_set_size_request (browser->tv, DBL_LIST_WIDTH, DBL_HEIGHT); - gtk_container_add (GTK_CONTAINER (scrolled_window), browser->tv); - gtk_widget_show (browser->tv); + gtk_widget_set_size_request (GTK_WIDGET (browser->tree_view), + DBL_LIST_WIDTH, DBL_HEIGHT); + gtk_container_add (GTK_CONTAINER (scrolled_window), + GTK_WIDGET (browser->tree_view)); + gtk_widget_show (GTK_WIDGET (browser->tree_view)); - browser->sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (browser->tv)); + selection = gtk_tree_view_get_selection (browser->tree_view); - g_signal_connect (browser->sel, "changed", + g_signal_connect (selection, "changed", G_CALLBACK (browser_selection_changed), browser); - /* number of matches */ - - browser->count_label = gtk_label_new ("0 Procedures"); - gtk_misc_set_alignment (GTK_MISC (browser->count_label), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (vbox), browser->count_label, FALSE, FALSE, 0); - gtk_widget_show (browser->count_label); - - /* right = description */ - - browser->proc_box = gimp_proc_box_new (); - gtk_widget_set_size_request (browser->proc_box, + gtk_widget_set_size_request (GIMP_BROWSER (browser->browser)->right_vbox->parent->parent, DBL_WIDTH - DBL_LIST_WIDTH, -1); - gtk_paned_pack2 (GTK_PANED (paned), browser->proc_box, TRUE, TRUE); - gtk_widget_show (browser->proc_box); /* now build the list */ @@ -266,22 +218,20 @@ gimp_proc_browser_dialog_new (gboolean scheme_names, /* initialize the "return" value (for "apply") */ - browser->proc_name = NULL; - browser->proc_blurb = NULL; - browser->proc_help = NULL; - browser->proc_author = NULL; - browser->proc_copyright = NULL; - browser->proc_date = NULL; - browser->proc_type = 0; - browser->n_params = 0; - browser->n_return_vals = 0; - browser->params = NULL; - browser->return_vals = NULL; + browser->proc_name = NULL; + browser->proc_blurb = NULL; + browser->proc_help = NULL; + browser->proc_author = NULL; + browser->proc_copyright = NULL; + browser->proc_date = NULL; + browser->proc_type = 0; + browser->n_params = 0; + browser->n_return_vals = 0; + browser->params = NULL; + browser->return_vals = NULL; /* first search (all procedures) */ - browser_search (browser, SEARCH_TYPE_ALL); - - gtk_widget_grab_focus (browser->search_entry); + browser_search (GIMP_BROWSER (browser->browser), SEARCH_TYPE_ALL, browser); return browser->dialog; } @@ -289,17 +239,6 @@ gimp_proc_browser_dialog_new (gboolean scheme_names, /* private functions */ -static void -browser_entry_changed (GtkEditable *editable, - GimpDBBrowser *browser) -{ - if (browser->search_timeout_id) - g_source_remove (browser->search_timeout_id); - - browser->search_timeout_id = - g_timeout_add (100, browser_search_timeout, browser); -} - static void browser_selection_changed (GtkTreeSelection *sel, GimpDBBrowser *browser) @@ -358,50 +297,39 @@ browser_show_procedure (GimpDBBrowser *browser, &browser->params, &browser->return_vals); - gimp_proc_box_set_widget (browser->proc_box, - gimp_proc_view_new (browser->proc_name, - NULL, - browser->proc_blurb, - browser->proc_help, - browser->proc_author, - browser->proc_copyright, - browser->proc_date, - browser->proc_type, - browser->n_params, - browser->n_return_vals, - browser->params, - browser->return_vals)); -} - -static gboolean -browser_search_timeout (gpointer data) -{ - GimpDBBrowser *browser = data; - - browser_search (browser, browser->search_type); - - browser->search_timeout_id = 0; - - return FALSE; + gimp_browser_set_widget (GIMP_BROWSER (browser->browser), + gimp_proc_view_new (browser->proc_name, + NULL, + browser->proc_blurb, + browser->proc_help, + browser->proc_author, + browser->proc_copyright, + browser->proc_date, + browser->proc_type, + browser->n_params, + browser->n_return_vals, + browser->params, + browser->return_vals)); } static void -browser_search (GimpDBBrowser *browser, - SearchType search_type) +browser_search (GimpBrowser *gimp_browser, + gint search_type, + GimpDBBrowser *browser) { const gchar *query_text; gchar **proc_list; gint num_procs; gchar *str; - query_text = gtk_entry_get_text (GTK_ENTRY (browser->search_entry)); + query_text = gtk_entry_get_text (GTK_ENTRY (gimp_browser->search_entry)); if (search_type == SEARCH_TYPE_NAME) { GString *query; - gimp_proc_box_show_message (browser->proc_box, - _("Searching by name - please wait")); + gimp_browser_show_message (GIMP_BROWSER (browser->browser), + _("Searching by name - please wait")); query = g_string_new (""); @@ -415,25 +343,55 @@ browser_search (GimpDBBrowser *browser, query_text++; } - gimp_procedural_db_query (query->str, - ".*", ".*", ".*", ".*", ".*", ".*", + gimp_procedural_db_query (query->str, ".*", ".*", ".*", ".*", ".*", ".*", &num_procs, &proc_list); g_string_free (query, TRUE); } else if (search_type == SEARCH_TYPE_BLURB) { - gimp_proc_box_show_message (browser->proc_box, - _("Searching by description - please wait")); + gimp_browser_show_message (GIMP_BROWSER (browser->browser), + _("Searching by description - please wait")); - gimp_procedural_db_query (".*", query_text, - ".*", ".*", ".*", ".*", ".*", + gimp_procedural_db_query (".*", query_text, ".*", ".*", ".*", ".*", ".*", + &num_procs, &proc_list); + } + else if (search_type == SEARCH_TYPE_AUTHOR) + { + gimp_browser_show_message (GIMP_BROWSER (browser->browser), + _("Searching by author - please wait")); + + gimp_procedural_db_query (".*", ".*", ".*", query_text, ".*", ".*", ".*", + &num_procs, &proc_list); + } + else if (search_type == SEARCH_TYPE_COPYRIGHT) + { + gimp_browser_show_message (GIMP_BROWSER (browser->browser), + _("Searching by copyright - please wait")); + + gimp_procedural_db_query (".*", ".*", ".*", ".*", query_text, ".*", ".*", + &num_procs, &proc_list); + } + else if (search_type == SEARCH_TYPE_DATE) + { + gimp_browser_show_message (GIMP_BROWSER (browser->browser), + _("Searching by date - please wait")); + + gimp_procedural_db_query (".*", ".*", ".*", ".*", ".*", query_text, ".*", + &num_procs, &proc_list); + } + else if (search_type == SEARCH_TYPE_PROC_TYPE) + { + gimp_browser_show_message (GIMP_BROWSER (browser->browser), + _("Searching by type - please wait")); + + gimp_procedural_db_query (".*", ".*", ".*", ".*", ".*", ".*", query_text, &num_procs, &proc_list); } else { - gimp_proc_box_show_message (browser->proc_box, - _("Searching - please wait")); + gimp_browser_show_message (GIMP_BROWSER (browser->browser), + _("Searching - please wait")); gimp_procedural_db_query (".*", ".*", ".*", ".*", ".*", ".*", ".*", &num_procs, &proc_list); @@ -444,18 +402,19 @@ browser_search (GimpDBBrowser *browser, else str = g_strdup_printf (_("%d Procedures"), num_procs); - gtk_label_set_text (GTK_LABEL (browser->count_label), str); + gtk_label_set_text (GTK_LABEL (gimp_browser->count_label), str); g_free (str); if (num_procs > 0) { - GtkTreeIter iter; - gint i; + GtkTreeSelection *selection; + GtkTreeIter iter; + gint i; browser->store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING); - gtk_tree_view_set_model (GTK_TREE_VIEW (browser->tv), + gtk_tree_view_set_model (browser->tree_view, GTK_TREE_MODEL (browser->store)); g_object_unref (browser->store); @@ -478,21 +437,22 @@ browser_search (GimpDBBrowser *browser, g_free (proc_list); - gtk_tree_view_columns_autosize (GTK_TREE_VIEW (browser->tv)); + gtk_tree_view_columns_autosize (browser->tree_view); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (browser->store), COLUMN_LABEL, GTK_SORT_ASCENDING); - gtk_tree_model_get_iter_first (GTK_TREE_MODEL (browser->store), - &iter); - gtk_tree_selection_select_iter (browser->sel, &iter); + gtk_tree_model_get_iter_first (GTK_TREE_MODEL (browser->store), &iter); + selection = gtk_tree_view_get_selection (browser->tree_view); + gtk_tree_selection_select_iter (selection, &iter); } else { - gtk_tree_view_set_model (GTK_TREE_VIEW (browser->tv), NULL); + gtk_tree_view_set_model (browser->tree_view, NULL); browser->store = NULL; - gimp_proc_box_show_message (browser->proc_box, _("No matches")); + gimp_browser_show_message (GIMP_BROWSER (browser->browser), + _("No matches")); } } diff --git a/plug-ins/dbbrowser/plugin-browser.c b/plug-ins/dbbrowser/plugin-browser.c index 2d41a07b62..896695cabe 100644 --- a/plug-ins/dbbrowser/plugin-browser.c +++ b/plug-ins/dbbrowser/plugin-browser.c @@ -31,48 +31,45 @@ #include #include -#include "gimpprocbox.h" +#include "gimpbrowser.h" #include "gimpprocview.h" #include "libgimp/stdplugins-intl.h" -enum -{ - LIST_NAME_COLUMN, - LIST_DATE_COLUMN, - LIST_PATH_COLUMN, - LIST_IMAGE_TYPES_COLUMN, - LIST_PINFO_COLUMN, - LIST_N_COLUMNS -}; - -enum -{ - TREE_PATH_NAME_COLUMN, - TREE_DATE_COLUMN, - TREE_IMAGE_TYPES_COLUMN, - TREE_MPATH_COLUMN, - TREE_PINFO_COLUMN, - TREE_N_COLUMNS -}; - #define DBL_LIST_WIDTH 250 #define DBL_WIDTH (DBL_LIST_WIDTH + 400) #define DBL_HEIGHT 250 + +enum +{ + LIST_COLUMN_NAME, + LIST_COLUMN_DATE, + LIST_COLUMN_PATH, + LIST_COLUMN_IMAGE_TYPES, + LIST_COLUMN_PINFO, + N_LIST_COLUMNS +}; + +enum +{ + TREE_COLUMN_PATH_NAME, + TREE_COLUMN_DATE, + TREE_COLUMN_IMAGE_TYPES, + TREE_COLUMN_MPATH, + TREE_COLUMN_PINFO, + N_TREE_OLUMNS +}; + typedef struct { GtkWidget *dialog; - GtkWidget *search_entry; - GtkWidget *count_label; - GtkWidget *proc_box; + GtkWidget *browser; GtkTreeView *list_view; GtkTreeView *tree_view; - - guint search_timeout_id; } PluginBrowser; typedef struct @@ -100,8 +97,6 @@ static GtkWidget * browser_dialog_new (void); static void browser_dialog_response (GtkWidget *widget, gint response_id, PluginBrowser *browser); -static void browser_entry_changed (GtkEditable *editable, - PluginBrowser *browser); static void browser_list_selection_changed (GtkTreeSelection *selection, PluginBrowser *browser); static void browser_tree_selection_changed (GtkTreeSelection *selection, @@ -222,7 +217,7 @@ find_existing_mpath_helper (GtkTreeModel *model, gchar *picked_mpath; gtk_tree_model_get (model, iter, - TREE_MPATH_COLUMN, &picked_mpath, + TREE_COLUMN_MPATH, &picked_mpath, -1); if (! strcmp (mpath, picked_mpath)) @@ -261,18 +256,21 @@ find_existing_mpath (GtkTreeModel *model, { GtkTreePath *path; GtkTreeIter parent; + gboolean found; path = gtk_tree_path_new_first (); - if (gtk_tree_model_get_iter (model, &parent, path) == FALSE) + if (! gtk_tree_model_get_iter (model, &parent, path)) { gtk_tree_path_free (path); return FALSE; } - return find_existing_mpath_helper (model, &parent, path, - mpath, return_iter); + found = find_existing_mpath_helper (model, &parent, path, + mpath, return_iter); gtk_tree_path_free (path); + + return found; } static void @@ -305,21 +303,21 @@ get_parent (PluginBrowser *browser, leaf_ptr = mpath; gtk_tree_store_append (tree_store, parent, NULL); gtk_tree_store_set (tree_store, parent, - TREE_MPATH_COLUMN, mpath, - TREE_PATH_NAME_COLUMN, mpath, + TREE_COLUMN_MPATH, mpath, + TREE_COLUMN_PATH_NAME, mpath, -1); } else { - leaf_ptr = g_strdup(str_ptr+1); + leaf_ptr = g_strdup (str_ptr + 1); - *str_ptr = '\000'; + *str_ptr = '\0'; get_parent (browser, tmp_ptr, &last_parent); gtk_tree_store_append (tree_store, parent, &last_parent); gtk_tree_store_set (tree_store, parent, - TREE_MPATH_COLUMN, mpath, - TREE_PATH_NAME_COLUMN, leaf_ptr, + TREE_COLUMN_MPATH, mpath, + TREE_COLUMN_PATH_NAME, leaf_ptr, -1); } } @@ -351,7 +349,7 @@ insert_into_tree_view (PluginBrowser *browser, leaf_ptr = g_strdup (str_ptr + 1); - *str_ptr = '\000'; + *str_ptr = '\0'; /* printf("inserting %s...\n",menu_str); */ @@ -366,18 +364,20 @@ insert_into_tree_view (PluginBrowser *browser, tree_store = GTK_TREE_STORE (gtk_tree_view_get_model (browser->tree_view)); gtk_tree_store_append (tree_store, &iter, &parent); gtk_tree_store_set (tree_store, &iter, - TREE_MPATH_COLUMN, menu_str, - TREE_PATH_NAME_COLUMN, name, - TREE_IMAGE_TYPES_COLUMN, types_str, - TREE_DATE_COLUMN, xtimestr, - TREE_PINFO_COLUMN, pinfo, + TREE_COLUMN_MPATH, menu_str, + TREE_COLUMN_PATH_NAME, name, + TREE_COLUMN_IMAGE_TYPES, types_str, + TREE_COLUMN_DATE, xtimestr, + TREE_COLUMN_PINFO, pinfo, -1); } static void -browser_search (PluginBrowser *browser, - const gchar *search_text) +browser_search (GimpBrowser *gimp_browser, + gint search_type, + PluginBrowser *browser) { + const gchar *search_text; GimpParam *return_vals; gint nreturn_vals; gint num_plugins; @@ -385,11 +385,13 @@ browser_search (PluginBrowser *browser, GtkListStore *list_store; GtkTreeStore *tree_store; + search_text = gtk_entry_get_text (GTK_ENTRY (gimp_browser->search_entry)); + if (! search_text) search_text = ""; - gimp_proc_box_show_message (browser->proc_box, - _("Searching by name - please wait")); + gimp_browser_show_message (GIMP_BROWSER (browser->browser), + _("Searching by name - please wait")); return_vals = gimp_run_procedure ("gimp_plugins_query", &nreturn_vals, @@ -406,7 +408,7 @@ browser_search (PluginBrowser *browser, else str = g_strdup_printf (_("%d Plug-In Interfaces"), num_plugins); - gtk_label_set_text (GTK_LABEL (browser->count_label), str); + gtk_label_set_text (GTK_LABEL (gimp_browser->count_label), str); g_free (str); list_store = GTK_LIST_STORE (gtk_tree_view_get_model (browser->list_view)); @@ -483,11 +485,11 @@ browser_search (PluginBrowser *browser, gtk_list_store_append (list_store, &iter); gtk_list_store_set (list_store, &iter, - LIST_NAME_COLUMN, name, - LIST_DATE_COLUMN, xtimestr, - LIST_PATH_COLUMN, menu_strs[i], - LIST_IMAGE_TYPES_COLUMN, types_strs[i], - LIST_PINFO_COLUMN, pinfo, + LIST_COLUMN_NAME, name, + LIST_COLUMN_DATE, xtimestr, + LIST_COLUMN_PATH, menu_strs[i], + LIST_COLUMN_IMAGE_TYPES, types_strs[i], + LIST_COLUMN_PINFO, pinfo, -1); /* Now do the tree view.... */ @@ -503,10 +505,10 @@ browser_search (PluginBrowser *browser, gtk_tree_view_columns_autosize (GTK_TREE_VIEW (browser->tree_view)); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (list_store), - LIST_NAME_COLUMN, + LIST_COLUMN_NAME, GTK_SORT_ASCENDING); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (tree_store), - TREE_PATH_NAME_COLUMN, + TREE_COLUMN_PATH_NAME, GTK_SORT_ASCENDING); sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (browser->list_view)); @@ -517,32 +519,18 @@ browser_search (PluginBrowser *browser, } else { - gimp_proc_box_show_message (browser->proc_box, _("No matches")); + gimp_browser_show_message (GIMP_BROWSER (browser->browser), + _("No matches")); } gimp_destroy_params (return_vals, nreturn_vals); } -static gboolean -browser_search_timeout (gpointer data) -{ - PluginBrowser *browser = data; - const gchar *search_text = NULL; - - search_text = gtk_entry_get_text (GTK_ENTRY (browser->search_entry)); - browser_search (browser, search_text); - - browser->search_timeout_id = 0; - - return FALSE; -} - static GtkWidget * browser_dialog_new (void) { - GtkWidget *paned; - GtkWidget *hbox, *vbox; - GtkWidget *label, *notebook, *swindow; + GtkWidget *label, *notebook; + GtkWidget *scrolled_window; GtkListStore *list_store; GtkTreeStore *tree_store; GtkWidget *list_view; @@ -569,47 +557,24 @@ browser_dialog_new (void) G_CALLBACK (browser_dialog_response), browser); - /* paned : left=notebook ; right=description */ - - paned = gtk_hpaned_new (); - gtk_container_set_border_width (GTK_CONTAINER (paned), 12); + browser->browser = gimp_browser_new (); + gtk_container_set_border_width (GTK_CONTAINER (browser->browser), 12); gtk_container_add (GTK_CONTAINER (GTK_DIALOG (browser->dialog)->vbox), - paned); - gtk_widget_show (paned); + browser->browser); + gtk_widget_show (browser->browser); - /* left = vbox : the list and the search entry */ - - vbox = gtk_vbox_new (FALSE, 6); - gtk_paned_pack1 (GTK_PANED (paned), vbox, FALSE, TRUE); - gtk_widget_show (vbox); - - /* search entry */ - - hbox = gtk_hbox_new (FALSE, 6); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - gtk_widget_show (hbox); - - label = gtk_label_new_with_mnemonic (_("_Search:")); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - gtk_widget_show (label); - - browser->search_entry = gtk_entry_new (); - gtk_box_pack_start (GTK_BOX (hbox), browser->search_entry, TRUE, TRUE, 0); - gtk_widget_show (browser->search_entry); - - gtk_label_set_mnemonic_widget (GTK_LABEL (label), browser->search_entry); - - g_signal_connect (browser->search_entry, "changed", - G_CALLBACK (browser_entry_changed), + g_signal_connect (browser->browser, "search", + G_CALLBACK (browser_search), browser); /* left = notebook */ notebook = gtk_notebook_new (); - gtk_box_pack_start (GTK_BOX (vbox), notebook, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (GIMP_BROWSER (browser->browser)->left_vbox), + notebook, TRUE, TRUE, 0); /* list : list in a scrolled_win */ - list_store = gtk_list_store_new (LIST_N_COLUMNS, + list_store = gtk_list_store_new (N_LIST_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, @@ -624,41 +589,41 @@ browser_dialog_new (void) renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Name"), renderer, - "text", LIST_NAME_COLUMN, + "text", LIST_COLUMN_NAME, NULL); - gtk_tree_view_column_set_sort_column_id (column, LIST_NAME_COLUMN); + gtk_tree_view_column_set_sort_column_id (column, LIST_COLUMN_NAME); gtk_tree_view_append_column (GTK_TREE_VIEW (list_view), column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Insertion Date"), renderer, - "text", LIST_DATE_COLUMN, + "text", LIST_COLUMN_DATE, NULL); - gtk_tree_view_column_set_sort_column_id (column, LIST_DATE_COLUMN); + gtk_tree_view_column_set_sort_column_id (column, LIST_COLUMN_DATE); gtk_tree_view_append_column (GTK_TREE_VIEW (list_view), column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Menu Path"), renderer, - "text", LIST_PATH_COLUMN, + "text", LIST_COLUMN_PATH, NULL); - gtk_tree_view_column_set_sort_column_id (column, LIST_PATH_COLUMN); + gtk_tree_view_column_set_sort_column_id (column, LIST_COLUMN_PATH); gtk_tree_view_append_column (GTK_TREE_VIEW (list_view), column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Image Types"), renderer, "text", - LIST_IMAGE_TYPES_COLUMN, + LIST_COLUMN_IMAGE_TYPES, NULL); - gtk_tree_view_column_set_sort_column_id (column, LIST_IMAGE_TYPES_COLUMN); + gtk_tree_view_column_set_sort_column_id (column, LIST_COLUMN_IMAGE_TYPES); gtk_tree_view_append_column (GTK_TREE_VIEW (list_view), column); - swindow = gtk_scrolled_window_new (NULL, NULL); - gtk_container_set_border_width (GTK_CONTAINER (swindow), 2); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swindow), + scrolled_window = gtk_scrolled_window_new (NULL, NULL); + gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 2); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_set_size_request (list_view, DBL_LIST_WIDTH, DBL_HEIGHT); @@ -671,13 +636,13 @@ browser_dialog_new (void) browser); label = gtk_label_new (_("List View")); - gtk_notebook_append_page (GTK_NOTEBOOK (notebook), swindow, label); - gtk_container_add (GTK_CONTAINER (swindow), list_view); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), scrolled_window, label); + gtk_container_add (GTK_CONTAINER (scrolled_window), list_view); gtk_widget_show (list_view); - gtk_widget_show (swindow); + gtk_widget_show (scrolled_window); /* notebook->ctree */ - tree_store = gtk_tree_store_new (LIST_N_COLUMNS, + tree_store = gtk_tree_store_new (N_LIST_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, @@ -693,34 +658,34 @@ browser_dialog_new (void) column = gtk_tree_view_column_new_with_attributes (_("Menu Path/Name"), renderer, "text", - TREE_PATH_NAME_COLUMN, + TREE_COLUMN_PATH_NAME, NULL); - gtk_tree_view_column_set_sort_column_id (column, TREE_PATH_NAME_COLUMN); + gtk_tree_view_column_set_sort_column_id (column, TREE_COLUMN_PATH_NAME); gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Insertion Date"), renderer, "text", - TREE_DATE_COLUMN, + TREE_COLUMN_DATE, NULL); - gtk_tree_view_column_set_sort_column_id (column, TREE_DATE_COLUMN); + gtk_tree_view_column_set_sort_column_id (column, TREE_COLUMN_DATE); gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Image Types"), renderer, "text", - TREE_IMAGE_TYPES_COLUMN, + TREE_COLUMN_IMAGE_TYPES, NULL); - gtk_tree_view_column_set_sort_column_id (column, TREE_IMAGE_TYPES_COLUMN); + gtk_tree_view_column_set_sort_column_id (column, TREE_COLUMN_IMAGE_TYPES); gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column); - swindow = gtk_scrolled_window_new (NULL, NULL); - gtk_container_set_border_width (GTK_CONTAINER (swindow), 2); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swindow), + scrolled_window = gtk_scrolled_window_new (NULL, NULL); + gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 2); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_set_size_request (tree_view, DBL_LIST_WIDTH, DBL_HEIGHT); @@ -732,30 +697,18 @@ browser_dialog_new (void) browser); label = gtk_label_new (_("Tree View")); - gtk_notebook_append_page (GTK_NOTEBOOK (notebook), swindow, label); - gtk_container_add (GTK_CONTAINER (swindow), tree_view); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), scrolled_window, label); + gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view); gtk_widget_show (tree_view); - gtk_widget_show (swindow); + gtk_widget_show (scrolled_window); gtk_widget_show (notebook); - /* number of matches */ - - browser->count_label = gtk_label_new ("0 Plug-In Interfaces"); - gtk_misc_set_alignment (GTK_MISC (browser->count_label), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (vbox), browser->count_label, FALSE, FALSE, 0); - gtk_widget_show (browser->count_label); - - /* right = description */ - - browser->proc_box = gimp_proc_box_new (); - gtk_widget_set_size_request (browser->proc_box, + gtk_widget_set_size_request (GIMP_BROWSER (browser->browser)->right_vbox->parent->parent, DBL_WIDTH - DBL_LIST_WIDTH, -1); - gtk_paned_pack2 (GTK_PANED (paned), browser->proc_box, TRUE, TRUE); - gtk_widget_show (browser->proc_box); /* now build the list */ - browser_search (browser, NULL); + browser_search (GIMP_BROWSER (browser->browser), 0, browser); gtk_widget_show (browser->dialog); @@ -763,8 +716,6 @@ browser_dialog_new (void) gtk_tree_selection_select_iter (gtk_tree_view_get_selection (GTK_TREE_VIEW (list_view)), &iter); - gtk_widget_grab_focus (browser->search_entry); - return browser->dialog; } @@ -777,17 +728,6 @@ browser_dialog_response (GtkWidget *widget, gtk_main_quit (); } -static void -browser_entry_changed (GtkEditable *editable, - PluginBrowser *browser) -{ - if (browser->search_timeout_id) - g_source_remove (browser->search_timeout_id); - - browser->search_timeout_id = - g_timeout_add (100, browser_search_timeout, browser); -} - static void browser_list_selection_changed (GtkTreeSelection *selection, PluginBrowser *browser) @@ -802,8 +742,8 @@ browser_list_selection_changed (GtkTreeSelection *selection, if (gtk_tree_selection_get_selected (selection, &model, &iter)) { gtk_tree_model_get (model, &iter, - LIST_PINFO_COLUMN, &pinfo, - LIST_PATH_COLUMN, &mpath, + LIST_COLUMN_PINFO, &pinfo, + LIST_COLUMN_PATH, &mpath, -1); } @@ -858,8 +798,8 @@ browser_tree_selection_changed (GtkTreeSelection *selection, if (gtk_tree_selection_get_selected (selection, &model, &iter)) { gtk_tree_model_get (model, &iter, - TREE_PINFO_COLUMN, &pinfo, - TREE_MPATH_COLUMN, &mpath, + TREE_COLUMN_PINFO, &pinfo, + TREE_COLUMN_MPATH, &mpath, -1); } @@ -877,7 +817,7 @@ browser_tree_selection_changed (GtkTreeSelection *selection, gchar *picked_mpath; gtk_tree_model_get (model, &iter, - LIST_PATH_COLUMN, &picked_mpath, + LIST_COLUMN_PATH, &picked_mpath, -1); if (picked_mpath && !strcmp (mpath, picked_mpath)) { @@ -947,19 +887,19 @@ browser_show_plugin (PluginBrowser *browser, ¶ms, &return_vals); - gimp_proc_box_set_widget (browser->proc_box, - gimp_proc_view_new (pinfo->realname, - pinfo->menu, - blurb, - help, - author, - copyright, - date, - type, - n_params, - n_return_vals, - params, - return_vals)); + gimp_browser_set_widget (GIMP_BROWSER (browser->browser), + gimp_proc_view_new (pinfo->realname, + pinfo->menu, + blurb, + help, + author, + copyright, + date, + type, + n_params, + n_return_vals, + params, + return_vals)); g_free (blurb); g_free (help);