| /* testtreesort.c |
| * Copyright (C) 2001 Red Hat, Inc |
| * Author: Jonathan Blandford |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Library General Public |
| * License as published by the Free Software Foundation; either |
| * version 2 of the License, or (at your option) any later version. |
| * |
| * This library 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 |
| * Library General Public License for more details. |
| * |
| * You should have received a copy of the GNU Library General Public |
| * License along with this library. If not, see <http://www.gnu.org/licenses/>. |
| */ |
| |
| #include "config.h" |
| #include <gtk/gtk.h> |
| |
| |
| typedef struct _ListSort ListSort; |
| struct _ListSort |
| { |
| const char *word_1; |
| const char *word_2; |
| const char *word_3; |
| const char *word_4; |
| int number_1; |
| }; |
| |
| static ListSort data[] = |
| { |
| { "Apples", "Transmogrify long word to demonstrate weirdness", "Exculpatory", "Gesundheit", 30 }, |
| { "Oranges", "Wicker", "Adamantine", "Convivial", 10 }, |
| { "Bovine Spongiform Encephilopathy", "Sleazebucket", "Mountaineer", "Pander", 40 }, |
| { "Foot and Mouth", "Lampshade", "Skim Milk\nFull Milk", "Viewless", 20 }, |
| { "Blood,\nsweat,\ntears", "The Man", "Horses", "Muckety-Muck", 435 }, |
| { "Rare Steak", "Siam", "Watchdog", "Xantippe" , 99999 }, |
| { "SIGINT", "Rabbit Breath", "Alligator", "Bloodstained", 4123 }, |
| { "Google", "Chrysanthemums", "Hobnob", "Leapfrog", 1 }, |
| { "Technology fibre optic", "Turtle", "Academe", "Lonely", 3 }, |
| { "Freon", "Harpes", "Quidditch", "Reagan", 6}, |
| { "Transposition", "Fruit Basket", "Monkey Wort", "Glogg", 54 }, |
| { "Fern", "Glasnost and Perestroika", "Latitude", "Bomberman!!!", 2 }, |
| {NULL, } |
| }; |
| |
| static ListSort childdata[] = |
| { |
| { "Heineken", "Nederland", "Wanda de vis", "Electronische post", 2}, |
| { "Hottentottententententoonstelling", "Rotterdam", "Ionentransport", "Palm", 45}, |
| { "Fruitvlieg", "Eigenfrequentie", "Supernoodles", "Ramen", 2002}, |
| { "Gereedschapskist", "Stelsel van lineaire vergelijkingen", "Tulpen", "Badlaken", 1311}, |
| { "Stereoinstallatie", "Rood tapijt", "Het periodieke systeem der elementen", "Laaste woord", 200}, |
| {NULL, } |
| }; |
| |
| |
| enum |
| { |
| WORD_COLUMN_1 = 0, |
| WORD_COLUMN_2, |
| WORD_COLUMN_3, |
| WORD_COLUMN_4, |
| NUMBER_COLUMN_1, |
| NUM_COLUMNS |
| }; |
| |
| static void |
| switch_search_method (GtkWidget *button, |
| gpointer tree_view) |
| { |
| if (!gtk_tree_view_get_search_entry (GTK_TREE_VIEW (tree_view))) |
| { |
| gpointer search_entry = g_object_get_data (tree_view, "my-search-entry"); |
| gtk_tree_view_set_search_entry (GTK_TREE_VIEW (tree_view), GTK_EDITABLE (search_entry)); |
| } |
| else |
| gtk_tree_view_set_search_entry (GTK_TREE_VIEW (tree_view), NULL); |
| } |
| |
| static void |
| quit_cb (GtkWidget *widget, |
| gpointer user_data) |
| { |
| gboolean *done = user_data; |
| |
| *done = TRUE; |
| |
| g_main_context_wakeup (NULL); |
| } |
| |
| int |
| main (int argc, char *argv[]) |
| { |
| GtkWidget *window; |
| GtkWidget *vbox; |
| GtkWidget *scrolled_window; |
| GtkWidget *tree_view; |
| GtkTreeStore *model; |
| GtkTreeModel *smodel = NULL; |
| GtkTreeModel *ssmodel = NULL; |
| GtkCellRenderer *renderer; |
| GtkTreeViewColumn *column; |
| GtkTreeIter iter; |
| int i; |
| |
| GtkWidget *entry, *button; |
| GtkWidget *window2, *vbox2, *scrolled_window2, *tree_view2; |
| GtkWidget *window3, *vbox3, *scrolled_window3, *tree_view3; |
| gboolean done = FALSE; |
| |
| gtk_init (); |
| |
| /** |
| * First window - Just a GtkTreeStore |
| */ |
| |
| window = gtk_window_new (); |
| gtk_window_set_title (GTK_WINDOW (window), "Words, words, words - Window 1"); |
| g_signal_connect (window, "destroy", G_CALLBACK (quit_cb), &done); |
| vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8); |
| gtk_box_append (GTK_BOX (vbox), gtk_label_new ("Jonathan and Kristian's list of cool words. (And Anders' cool list of numbers) \n\nThis is just a GtkTreeStore")); |
| gtk_window_set_child (GTK_WINDOW (window), vbox); |
| |
| entry = gtk_entry_new (); |
| gtk_box_append (GTK_BOX (vbox), entry); |
| |
| button = gtk_button_new_with_label ("Switch search method"); |
| gtk_box_append (GTK_BOX (vbox), button); |
| |
| scrolled_window = gtk_scrolled_window_new (); |
| gtk_scrolled_window_set_has_frame (GTK_SCROLLED_WINDOW (scrolled_window), TRUE); |
| gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); |
| gtk_widget_set_vexpand (scrolled_window, TRUE); |
| gtk_box_append (GTK_BOX (vbox), scrolled_window); |
| |
| model = gtk_tree_store_new (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT); |
| |
| /* |
| smodel = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (model)); |
| ssmodel = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (smodel)); |
| */ |
| tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); |
| |
| gtk_tree_view_set_search_entry (GTK_TREE_VIEW (tree_view), GTK_EDITABLE (entry)); |
| g_object_set_data (G_OBJECT (tree_view), "my-search-entry", entry); |
| g_signal_connect (button, "clicked", |
| G_CALLBACK (switch_search_method), tree_view); |
| |
| /* gtk_tree_selection_set_select_function (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)), select_func, NULL, NULL);*/ |
| |
| /* 12 iters now, 12 later... */ |
| for (i = 0; data[i].word_1 != NULL; i++) |
| { |
| int k; |
| GtkTreeIter child_iter; |
| |
| |
| gtk_tree_store_prepend (GTK_TREE_STORE (model), &iter, NULL); |
| gtk_tree_store_set (GTK_TREE_STORE (model), &iter, |
| WORD_COLUMN_1, data[i].word_1, |
| WORD_COLUMN_2, data[i].word_2, |
| WORD_COLUMN_3, data[i].word_3, |
| WORD_COLUMN_4, data[i].word_4, |
| NUMBER_COLUMN_1, data[i].number_1, |
| -1); |
| |
| gtk_tree_store_append (GTK_TREE_STORE (model), &child_iter, &iter); |
| gtk_tree_store_set (GTK_TREE_STORE (model), &child_iter, |
| WORD_COLUMN_1, data[i].word_1, |
| WORD_COLUMN_2, data[i].word_2, |
| WORD_COLUMN_3, data[i].word_3, |
| WORD_COLUMN_4, data[i].word_4, |
| NUMBER_COLUMN_1, data[i].number_1, |
| -1); |
| |
| for (k = 0; childdata[k].word_1 != NULL; k++) |
| { |
| gtk_tree_store_append (GTK_TREE_STORE (model), &child_iter, &iter); |
| gtk_tree_store_set (GTK_TREE_STORE (model), &child_iter, |
| WORD_COLUMN_1, childdata[k].word_1, |
| WORD_COLUMN_2, childdata[k].word_2, |
| WORD_COLUMN_3, childdata[k].word_3, |
| WORD_COLUMN_4, childdata[k].word_4, |
| NUMBER_COLUMN_1, childdata[k].number_1, |
| -1); |
| |
| } |
| |
| } |
| |
| smodel = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (model)); |
| ssmodel = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (smodel)); |
| g_object_unref (model); |
| |
| renderer = gtk_cell_renderer_text_new (); |
| column = gtk_tree_view_column_new_with_attributes ("First Word", renderer, |
| "text", WORD_COLUMN_1, |
| NULL); |
| gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column); |
| gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_1); |
| |
| renderer = gtk_cell_renderer_text_new (); |
| column = gtk_tree_view_column_new_with_attributes ("Second Word", renderer, |
| "text", WORD_COLUMN_2, |
| NULL); |
| gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_2); |
| 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 ("Third Word", renderer, |
| "text", WORD_COLUMN_3, |
| NULL); |
| gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_3); |
| 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 ("Fourth Word", renderer, |
| "text", WORD_COLUMN_4, |
| NULL); |
| gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_4); |
| 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 ("First Number", renderer, |
| "text", NUMBER_COLUMN_1, |
| NULL); |
| gtk_tree_view_column_set_sort_column_id (column, NUMBER_COLUMN_1); |
| gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column); |
| |
| /* gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (smodel), |
| WORD_COLUMN_1, |
| GTK_SORT_ASCENDING);*/ |
| |
| gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolled_window), tree_view); |
| gtk_window_set_default_size (GTK_WINDOW (window), 400, 400); |
| gtk_widget_show (window); |
| |
| /** |
| * Second window - GtkTreeModelSort wrapping the GtkTreeStore |
| */ |
| |
| if (smodel) |
| { |
| window2 = gtk_window_new (); |
| gtk_window_set_title (GTK_WINDOW (window2), |
| "Words, words, words - window 2"); |
| g_signal_connect (window2, "destroy", G_CALLBACK (quit_cb), &done); |
| vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8); |
| gtk_box_append (GTK_BOX (vbox2), |
| gtk_label_new ("Jonathan and Kristian's list of words.\n\nA GtkTreeModelSort wrapping the GtkTreeStore of window 1")); |
| gtk_window_set_child (GTK_WINDOW (window2), vbox2); |
| |
| scrolled_window2 = gtk_scrolled_window_new (); |
| gtk_scrolled_window_set_has_frame (GTK_SCROLLED_WINDOW (scrolled_window2), TRUE); |
| gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window2), |
| GTK_POLICY_AUTOMATIC, |
| GTK_POLICY_AUTOMATIC); |
| gtk_widget_set_vexpand (scrolled_window2, TRUE); |
| gtk_box_append (GTK_BOX (vbox2), scrolled_window2); |
| |
| |
| tree_view2 = gtk_tree_view_new_with_model (smodel); |
| |
| renderer = gtk_cell_renderer_text_new (); |
| column = gtk_tree_view_column_new_with_attributes ("First Word", renderer, |
| "text", WORD_COLUMN_1, |
| NULL); |
| gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view2), column); |
| gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_1); |
| |
| renderer = gtk_cell_renderer_text_new (); |
| column = gtk_tree_view_column_new_with_attributes ("Second Word", renderer, |
| "text", WORD_COLUMN_2, |
| NULL); |
| gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_2); |
| gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view2), column); |
| |
| renderer = gtk_cell_renderer_text_new (); |
| column = gtk_tree_view_column_new_with_attributes ("Third Word", renderer, |
| "text", WORD_COLUMN_3, |
| NULL); |
| gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_3); |
| gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view2), column); |
| |
| renderer = gtk_cell_renderer_text_new (); |
| column = gtk_tree_view_column_new_with_attributes ("Fourth Word", renderer, |
| "text", WORD_COLUMN_4, |
| NULL); |
| gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_4); |
| gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view2), column); |
| |
| /* gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (smodel), |
| (GtkTreeIterCompareFunc)gtk_tree_data_list_compare_func, |
| NULL, NULL); |
| gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (smodel), |
| WORD_COLUMN_1, |
| GTK_SORT_DESCENDING);*/ |
| |
| gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolled_window2), tree_view2); |
| gtk_window_set_default_size (GTK_WINDOW (window2), 400, 400); |
| gtk_widget_show (window2); |
| } |
| |
| /** |
| * Third window - GtkTreeModelSort wrapping the GtkTreeModelSort which |
| * is wrapping the GtkTreeStore. |
| */ |
| |
| if (ssmodel) |
| { |
| window3 = gtk_window_new (); |
| gtk_window_set_title (GTK_WINDOW (window3), |
| "Words, words, words - Window 3"); |
| g_signal_connect (window3, "destroy", G_CALLBACK (quit_cb), &done); |
| vbox3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8); |
| gtk_box_append (GTK_BOX (vbox3), |
| gtk_label_new ("Jonathan and Kristian's list of words.\n\nA GtkTreeModelSort wrapping the GtkTreeModelSort of window 2")); |
| gtk_window_set_child (GTK_WINDOW (window3), vbox3); |
| |
| scrolled_window3 = gtk_scrolled_window_new (); |
| gtk_scrolled_window_set_has_frame (GTK_SCROLLED_WINDOW (scrolled_window3), TRUE); |
| gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window3), |
| GTK_POLICY_AUTOMATIC, |
| GTK_POLICY_AUTOMATIC); |
| gtk_widget_set_vexpand (scrolled_window3, TRUE); |
| gtk_box_append (GTK_BOX (vbox3), scrolled_window3); |
| |
| |
| tree_view3 = gtk_tree_view_new_with_model (ssmodel); |
| |
| renderer = gtk_cell_renderer_text_new (); |
| column = gtk_tree_view_column_new_with_attributes ("First Word", renderer, |
| "text", WORD_COLUMN_1, |
| NULL); |
| gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view3), column); |
| gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_1); |
| |
| renderer = gtk_cell_renderer_text_new (); |
| column = gtk_tree_view_column_new_with_attributes ("Second Word", renderer, |
| "text", WORD_COLUMN_2, |
| NULL); |
| gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_2); |
| gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view3), column); |
| |
| renderer = gtk_cell_renderer_text_new (); |
| column = gtk_tree_view_column_new_with_attributes ("Third Word", renderer, |
| "text", WORD_COLUMN_3, |
| NULL); |
| gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_3); |
| gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view3), column); |
| |
| renderer = gtk_cell_renderer_text_new (); |
| column = gtk_tree_view_column_new_with_attributes ("Fourth Word", renderer, |
| "text", WORD_COLUMN_4, |
| NULL); |
| gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_4); |
| gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view3), column); |
| |
| /* gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (ssmodel), |
| (GtkTreeIterCompareFunc)gtk_tree_data_list_compare_func, |
| NULL, NULL); |
| gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (ssmodel), |
| WORD_COLUMN_1, |
| GTK_SORT_ASCENDING);*/ |
| |
| gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolled_window3), tree_view3); |
| gtk_window_set_default_size (GTK_WINDOW (window3), 400, 400); |
| gtk_widget_show (window3); |
| } |
| |
| for (i = 0; data[i].word_1 != NULL; i++) |
| { |
| int k; |
| |
| gtk_tree_store_prepend (GTK_TREE_STORE (model), &iter, NULL); |
| gtk_tree_store_set (GTK_TREE_STORE (model), &iter, |
| WORD_COLUMN_1, data[i].word_1, |
| WORD_COLUMN_2, data[i].word_2, |
| WORD_COLUMN_3, data[i].word_3, |
| WORD_COLUMN_4, data[i].word_4, |
| -1); |
| for (k = 0; childdata[k].word_1 != NULL; k++) |
| { |
| GtkTreeIter child_iter; |
| |
| gtk_tree_store_append (GTK_TREE_STORE (model), &child_iter, &iter); |
| gtk_tree_store_set (GTK_TREE_STORE (model), &child_iter, |
| WORD_COLUMN_1, childdata[k].word_1, |
| WORD_COLUMN_2, childdata[k].word_2, |
| WORD_COLUMN_3, childdata[k].word_3, |
| WORD_COLUMN_4, childdata[k].word_4, |
| -1); |
| } |
| } |
| |
| while (!done) |
| g_main_context_iteration (NULL, TRUE); |
| |
| return 0; |
| } |