Make sure that all timeouts in HildonBanner are removed
[hildon] / examples / hildon-pannable-area-touch-list-example.c
1 /*
2  * This file is a part of hildon examples
3  *
4  * Copyright (C) 2008 Nokia Corporation, all rights reserved.
5  *
6  * Author: Karl Lattimer <karl.lattimer@nokia.com>
7  *
8  * Based on testhildontreeview.c by Kristian Rietveld <kris@imendio.com>
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public License
12  * as published by the Free Software Foundation; version 2.1 of
13  * the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful, but
16  * WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with this library; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
23  * 02110-1301 USA
24  *
25  */
26
27 #include                                        <gtk/gtk.h>
28 #include                                        <hildon/hildon.h>
29
30 enum
31 {
32   MULTI_SELECT  = 1 << 0,
33   NORMAL_MODE   = 1 << 1,
34   EDIT_MODE     = 1 << 2
35 };
36
37
38 static GtkTreeModel *
39 create_model (void)
40 {
41   int i;
42   GtkListStore *store;
43
44   store = gtk_list_store_new (1, G_TYPE_STRING);
45
46   for (i = 0; i < 50; i++)
47     {
48       gchar *str;
49
50       str = g_strdup_printf ("\nRow %d\n", i);
51       gtk_list_store_insert_with_values (store, NULL, i, 0, str, -1);
52       g_free (str);
53     }
54
55   return GTK_TREE_MODEL (store);
56 }
57
58 static void
59 row_activated_callback (GtkWidget         *tree_view,
60                         GtkTreePath       *path,
61                         GtkTreeViewColumn *column,
62                         gpointer           user_data)
63 {
64   g_print ("row-activated emitted.\n");
65 }
66
67 static void
68 row_insensitive_callback (GtkWidget         *tree_view,
69                           GtkTreePath       *path,
70                           gpointer           user_data)
71 {
72   g_print ("row-insensitive emitted.\n");
73 }
74
75 static GtkWidget *
76 create_tree_view (HildonUIMode  mode,
77                   const char   *name,
78                   gboolean      multi_select)
79 {
80   GtkWidget *tree_view;
81   GtkCellRenderer *renderer;
82   GtkTreeSelection *selection;
83   GtkTreeModel *model;
84
85   if (name && g_str_equal (name, "fremantle-widget"))
86       tree_view = hildon_gtk_tree_view_new (mode);
87   else
88       tree_view = gtk_tree_view_new ();
89
90   if (name)
91     gtk_widget_set_name (tree_view, name);
92
93   gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE);
94
95   model = create_model ();
96   gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), model);
97   g_object_unref (model);
98
99   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view));
100   if (multi_select)
101     gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
102   else if (mode != HILDON_UI_MODE_NORMAL)
103     gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
104
105   renderer = gtk_cell_renderer_text_new ();
106   g_object_set (renderer,
107                 "xalign", 0.5,
108                 "weight", PANGO_WEIGHT_BOLD,
109                 NULL);
110
111   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
112                                                0, "Column 0",
113                                                renderer,
114                                                "text", 0,
115                                                NULL);
116
117   return tree_view;
118 }
119
120 static void
121 create_tree_view_window (GtkWidget *button,
122                          gpointer   user_data)
123 {
124   const char *name;
125   GtkWidget *window;
126   GtkWidget *sw;
127   GtkWidget *tree_view;
128   HildonUIMode mode = 0;
129
130   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
131   g_signal_connect (window, "delete-event",
132                     G_CALLBACK (gtk_widget_destroy), window);
133   gtk_container_set_border_width (GTK_CONTAINER (window), 6);
134
135   sw = hildon_pannable_area_new ();
136   gtk_container_add (GTK_CONTAINER (window), sw);
137
138   if ((GPOINTER_TO_INT (user_data) & NORMAL_MODE) == NORMAL_MODE)
139     {
140       mode = HILDON_UI_MODE_NORMAL;
141       name = "fremantle-widget";
142     }
143   else if ((GPOINTER_TO_INT (user_data) & EDIT_MODE) == EDIT_MODE)
144     {
145       mode = HILDON_UI_MODE_EDIT;
146       name = "fremantle-widget";
147     }
148   else
149     name = NULL;
150
151   tree_view = create_tree_view (mode, name,
152                                 (GPOINTER_TO_INT (user_data) & MULTI_SELECT) == MULTI_SELECT);
153
154   /* Some signals doing printfs() to see if the behavior is correct. */
155   g_signal_connect (tree_view, "row-activated",
156                     G_CALLBACK (row_activated_callback), NULL);
157   g_signal_connect (tree_view, "row-insensitive",
158                     G_CALLBACK (row_insensitive_callback), NULL);
159
160   gtk_widget_set_size_request (tree_view, 480, 800);
161   gtk_container_add (GTK_CONTAINER (sw), tree_view);
162
163   gtk_widget_show_all (window);
164 }
165
166 int
167 main (int argc, char **argv)
168 {
169   GtkWidget *window;
170   GtkWidget *mainbox;
171   GtkWidget *label;
172   GtkWidget *vbox;
173   GtkWidget *padbox;
174   GtkWidget *button;
175
176   hildon_gtk_init (&argc, &argv);
177
178   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
179   g_signal_connect (window, "delete-event",
180                     G_CALLBACK (gtk_main_quit), NULL);
181   gtk_container_set_border_width (GTK_CONTAINER (window), 6);
182
183   mainbox = gtk_vbox_new (FALSE, 6);
184   gtk_container_add (GTK_CONTAINER (window), mainbox);
185
186   /* old-style */
187   label = gtk_label_new (NULL);
188   gtk_label_set_markup (GTK_LABEL (label), "<b>Old-style behavior</b>");
189   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
190   gtk_box_pack_start (GTK_BOX (mainbox), label, FALSE, FALSE, 0);
191
192   padbox = gtk_hbox_new (FALSE, 6);
193   gtk_box_pack_start (GTK_BOX (mainbox), padbox, FALSE, FALSE, 6);
194
195   gtk_box_pack_start (GTK_BOX (padbox), gtk_label_new ("   "),
196                       FALSE, FALSE, 6);
197
198   vbox = gtk_vbox_new (FALSE, 6);
199   gtk_box_pack_start (GTK_BOX (padbox), vbox, TRUE, TRUE, 6);
200
201   button = gtk_button_new_with_label ("Single selection");
202   g_signal_connect (button, "clicked",
203                     G_CALLBACK (create_tree_view_window), 0x0);
204   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
205
206   button = gtk_button_new_with_label ("Multiple selections");
207   g_signal_connect (button, "clicked",
208                     G_CALLBACK (create_tree_view_window),
209                     GINT_TO_POINTER (MULTI_SELECT));
210   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
211
212   /* normal-mode */
213   label = gtk_label_new (NULL);
214   gtk_label_set_markup (GTK_LABEL (label), "<b>Fremantle Normal mode</b>");
215   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
216   gtk_box_pack_start (GTK_BOX (mainbox), label, FALSE, FALSE, 0);
217
218   padbox = gtk_hbox_new (FALSE, 6);
219   gtk_box_pack_start (GTK_BOX (mainbox), padbox, FALSE, FALSE, 6);
220
221   gtk_box_pack_start (GTK_BOX (padbox), gtk_label_new ("   "),
222                       FALSE, FALSE, 6);
223
224   vbox = gtk_vbox_new (FALSE, 6);
225   gtk_box_pack_start (GTK_BOX (padbox), vbox, TRUE, TRUE, 6);
226
227   button = gtk_button_new_with_label ("Direct activation");
228   g_signal_connect (button, "clicked",
229                     G_CALLBACK (create_tree_view_window),
230                     GINT_TO_POINTER (NORMAL_MODE));
231   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
232
233   /* edit-mode */
234   label = gtk_label_new (NULL);
235   gtk_label_set_markup (GTK_LABEL (label), "<b>Fremantle Edit mode</b>");
236   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
237   gtk_box_pack_start (GTK_BOX (mainbox), label, FALSE, FALSE, 0);
238
239   padbox = gtk_hbox_new (FALSE, 6);
240   gtk_box_pack_start (GTK_BOX (mainbox), padbox, FALSE, FALSE, 6);
241
242   gtk_box_pack_start (GTK_BOX (padbox), gtk_label_new ("   "),
243                       FALSE, FALSE, 6);
244
245   vbox = gtk_vbox_new (FALSE, 6);
246   gtk_box_pack_start (GTK_BOX (padbox), vbox, TRUE, TRUE, 6);
247
248   button = gtk_button_new_with_label ("Single selection");
249   g_signal_connect (button, "clicked",
250                     G_CALLBACK (create_tree_view_window),
251                     GINT_TO_POINTER (EDIT_MODE));
252   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
253
254   button = gtk_button_new_with_label ("Multiple selections");
255   g_signal_connect (button, "clicked",
256                     G_CALLBACK (create_tree_view_window),
257                     GINT_TO_POINTER (EDIT_MODE | MULTI_SELECT));
258   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
259
260
261   button = gtk_button_new_with_label ("Close");
262   g_signal_connect (button, "clicked",
263                     G_CALLBACK (gtk_main_quit), NULL);
264   gtk_box_pack_end (GTK_BOX (mainbox), button, FALSE, FALSE, 0);
265
266   gtk_box_pack_end (GTK_BOX (mainbox), gtk_hseparator_new (),
267                     FALSE, FALSE, 6);
268
269   gtk_widget_show_all (window);
270
271   gtk_main ();
272
273   return 0;
274 }