]> Pileus Git - ~andy/gtk/blob - tests/testcombo.c
Demonstrate custom widgets in a GtkComboBox.
[~andy/gtk] / tests / testcombo.c
1 /* testcombo.c
2  * Copyright (C) 2003  Kristian Rietveld
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19 #include <config.h>
20 #include <gtk/gtk.h>
21
22 #include <string.h>
23 #include <stdio.h>
24
25 /**
26  * oh yes, this test app surely has a lot of ugly code
27  */
28
29 /* grid combo demo */
30 static GdkPixbuf *
31 create_color_pixbuf (const char *color)
32 {
33         GdkPixbuf *pixbuf;
34         GdkColor col;
35
36         int x;
37         int num;
38         int rowstride;
39         guchar *pixels, *p;
40
41         if (!gdk_color_parse (color, &col))
42                 return NULL;
43
44         pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
45                                  FALSE, 8,
46                                  16, 16);
47
48         rowstride = gdk_pixbuf_get_rowstride (pixbuf);
49         p = pixels = gdk_pixbuf_get_pixels (pixbuf);
50
51         num = gdk_pixbuf_get_width (pixbuf) *
52                 gdk_pixbuf_get_height (pixbuf);
53
54         for (x = 0; x < num; x++) {
55                 p[0] = col.red / 65535 * 255;
56                 p[1] = col.green / 65535 * 255;
57                 p[2] = col.blue / 65535 * 255;
58                 p += 3;
59         }
60
61         return pixbuf;
62 }
63
64 static GtkWidget *
65 create_combo_box_grid_demo (void)
66 {
67         GtkWidget *combo;
68         GtkTreeIter iter;
69         GtkCellRenderer *cell = gtk_cell_renderer_pixbuf_new ();
70         GtkListStore *store;
71
72         store = gtk_list_store_new (1, GDK_TYPE_PIXBUF);
73
74         combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store));
75         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo),
76                                     cell, TRUE);
77         gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo),
78                                         cell, "pixbuf", 0, NULL);
79         gtk_combo_box_set_wrap_width (GTK_COMBO_BOX (combo),
80                                       3);
81
82         /* first row */
83         gtk_list_store_append (store, &iter);
84         gtk_list_store_set (store, &iter,
85                             0, create_color_pixbuf ("red"),
86                             -1);
87
88         gtk_list_store_append (store, &iter);
89         gtk_list_store_set (store, &iter,
90                             0, create_color_pixbuf ("green"),
91                             -1);
92
93         gtk_list_store_append (store, &iter);
94         gtk_list_store_set (store, &iter,
95                             0, create_color_pixbuf ("blue"),
96                             -1);
97
98         /* second row */
99         gtk_list_store_append (store, &iter);
100         gtk_list_store_set (store, &iter,
101                             0, create_color_pixbuf ("yellow"),
102                             -1);
103
104         gtk_list_store_append (store, &iter);
105         gtk_list_store_set (store, &iter,
106                             0, create_color_pixbuf ("black"),
107                             -1);
108
109         gtk_list_store_append (store, &iter);
110         gtk_list_store_set (store, &iter,
111                             0, create_color_pixbuf ("white"),
112                             -1);
113
114         /* third row */
115         gtk_list_store_append (store, &iter);
116         gtk_list_store_set (store, &iter,
117                             0, create_color_pixbuf ("gray"),
118                             -1);
119
120         gtk_list_store_append (store, &iter);
121         gtk_list_store_set (store, &iter,
122                             0, create_color_pixbuf ("snow"),
123                             -1);
124
125         gtk_list_store_append (store, &iter);
126         gtk_list_store_set (store, &iter,
127                             0, create_color_pixbuf ("magenta"),
128                             -1);
129
130         g_object_unref (store);
131
132         gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
133
134         return combo;
135 }
136
137 /* blaat */
138 static GtkTreeModel *
139 create_tree_blaat (void)
140 {
141         GdkPixbuf *pixbuf;
142         GtkWidget *cellview;
143         GtkTreeIter iter, iter2;
144         GtkTreeStore *store;
145
146         cellview = gtk_cell_view_new ();
147
148         store = gtk_tree_store_new (3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_BOOLEAN);
149
150         pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_DIALOG_WARNING,
151                                          GTK_ICON_SIZE_BUTTON, NULL);
152         gtk_tree_store_append (store, &iter, NULL);
153         gtk_tree_store_set (store, &iter,
154                             0, pixbuf,
155                             1, "gtk-stock-dialog-warning",
156                             2, FALSE,
157                             -1);
158
159         pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_STOP,
160                                          GTK_ICON_SIZE_BUTTON, NULL);
161         gtk_tree_store_append (store, &iter2, &iter);                          
162         gtk_tree_store_set (store, &iter2,
163                             0, pixbuf,
164                             1, "gtk-stock-stop",
165                             2, FALSE,
166                             -1);
167
168         pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_NEW,
169                                          GTK_ICON_SIZE_BUTTON, NULL);
170         gtk_tree_store_append (store, &iter2, &iter);                          
171         gtk_tree_store_set (store, &iter2,
172                             0, pixbuf,
173                             1, "gtk-stock-new",
174                             2, FALSE,
175                             -1);
176
177         pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_CLEAR,
178                                          GTK_ICON_SIZE_BUTTON, NULL);
179         gtk_tree_store_append (store, &iter, NULL);
180         gtk_tree_store_set (store, &iter,
181                             0, pixbuf,
182                             1, "gtk-stock-clear",
183                             2, FALSE,
184                             -1);
185
186 #if 0
187         gtk_tree_store_append (store, &iter, NULL);
188         gtk_tree_store_set (store, &iter,
189                             0, NULL,
190                             1, "separator",
191                             2, TRUE,
192                             -1);
193 #endif
194
195         pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_OPEN,
196                                          GTK_ICON_SIZE_BUTTON, NULL);
197         gtk_tree_store_append (store, &iter, NULL);
198         gtk_tree_store_set (store, &iter,
199                             0, pixbuf,
200                             1, "gtk-stock-open",
201                             2, FALSE,
202                             -1);
203
204         gtk_widget_destroy (cellview);
205
206         return GTK_TREE_MODEL (store);
207 }
208
209 static GtkTreeModel *
210 create_list_blaat (void)
211 {
212         GdkPixbuf *pixbuf;
213         GtkWidget *cellview;
214         GtkTreeIter iter;
215         GtkListStore *store;
216
217         cellview = gtk_cell_view_new ();
218
219         store = gtk_list_store_new (2, GDK_TYPE_PIXBUF, G_TYPE_STRING);
220
221         pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_DIALOG_WARNING,
222                                          GTK_ICON_SIZE_BUTTON, NULL);
223         gtk_list_store_append (store, &iter);
224         gtk_list_store_set (store, &iter,
225                             0, pixbuf,
226                             1, "gtk-stock-dialog-warning",
227                             -1);
228
229         pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_STOP,
230                                          GTK_ICON_SIZE_BUTTON, NULL);
231         gtk_list_store_append (store, &iter);                          
232         gtk_list_store_set (store, &iter,
233                             0, pixbuf,
234                             1, "gtk-stock-stop",
235                             -1);
236
237         pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_NEW,
238                                          GTK_ICON_SIZE_BUTTON, NULL);
239         gtk_list_store_append (store, &iter);                          
240         gtk_list_store_set (store, &iter,
241                             0, pixbuf,
242                             1, "gtk-stock-new",
243                             -1);
244
245         pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_CLEAR,
246                                          GTK_ICON_SIZE_BUTTON, NULL);
247         gtk_list_store_append (store, &iter);
248         gtk_list_store_set (store, &iter,
249                             0, pixbuf,
250                             1, "gtk-stock-clear",
251                             -1);
252
253         gtk_list_store_append (store, &iter);
254         gtk_list_store_set (store, &iter,
255                             0, NULL,
256                             1, "separator",
257                             -1);
258
259         pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_OPEN,
260                                          GTK_ICON_SIZE_BUTTON, NULL);
261         gtk_list_store_append (store, &iter);
262         gtk_list_store_set (store, &iter,
263                             0, pixbuf,
264                             1, "gtk-stock-open",
265                             -1);
266
267         gtk_widget_destroy (cellview);
268
269         return GTK_TREE_MODEL (store);
270 }
271
272 /* blaat */
273 static GtkTreeModel *
274 create_phylogenetic_tree (void)
275 {
276         GtkTreeIter iter, iter2, iter3;
277         GtkTreeStore *store;
278
279         store = gtk_tree_store_new (1,G_TYPE_STRING);
280
281         gtk_tree_store_append (store, &iter, NULL);
282         gtk_tree_store_set (store, &iter,
283                             0, "Eubacteria",
284                             -1);
285
286         gtk_tree_store_append (store, &iter2, &iter);                          
287         gtk_tree_store_set (store, &iter2,
288                             0, "Aquifecales",
289                             -1);
290
291         gtk_tree_store_append (store, &iter2, &iter);                          
292         gtk_tree_store_set (store, &iter2,
293                             0, "Thermotogales",
294                             -1);
295
296         gtk_tree_store_append (store, &iter2, &iter);                          
297         gtk_tree_store_set (store, &iter2,
298                             0, "Thermodesulfobacterium",
299                             -1);
300
301         gtk_tree_store_append (store, &iter2, &iter);                          
302         gtk_tree_store_set (store, &iter2,
303                             0, "Thermus-Deinococcus group",
304                             -1);
305
306         gtk_tree_store_append (store, &iter2, &iter);                          
307         gtk_tree_store_set (store, &iter2,
308                             0, "Chloroflecales",
309                             -1);
310
311         gtk_tree_store_append (store, &iter2, &iter);                          
312         gtk_tree_store_set (store, &iter2,
313                             0, "Cyanobacteria",
314                             -1);
315
316         gtk_tree_store_append (store, &iter2, &iter);                          
317         gtk_tree_store_set (store, &iter2,
318                             0, "Firmicutes",
319                             -1);
320
321         gtk_tree_store_append (store, &iter2, &iter);                          
322         gtk_tree_store_set (store, &iter2,
323                             0, "Leptospirillium Group",
324                             -1);
325
326         gtk_tree_store_append (store, &iter2, &iter);                          
327         gtk_tree_store_set (store, &iter2,
328                             0, "Synergistes",
329                             -1);
330         gtk_tree_store_append (store, &iter2, &iter);                          
331         gtk_tree_store_set (store, &iter2,
332                             0, "Chlorobium-Flavobacteria group",
333                             -1);
334         gtk_tree_store_append (store, &iter2, &iter);                          
335         gtk_tree_store_set (store, &iter2,
336                             0, "Chlamydia-Verrucomicrobia group",
337                             -1);
338
339         gtk_tree_store_append (store, &iter3, &iter2);                         
340         gtk_tree_store_set (store, &iter3,
341                             0, "Verrucomicrobia",
342                             -1);
343         gtk_tree_store_append (store, &iter3, &iter2);                         
344         gtk_tree_store_set (store, &iter3,
345                             0, "Chlamydia",
346                             -1);
347
348         gtk_tree_store_append (store, &iter2, &iter);                          
349         gtk_tree_store_set (store, &iter2,
350                             0, "Flexistipes",
351                             -1);
352
353
354         gtk_tree_store_append (store, &iter2, &iter);                          
355         gtk_tree_store_set (store, &iter2,
356                             0, "Fibrobacter group",
357                             -1);
358
359
360         gtk_tree_store_append (store, &iter2, &iter);                          
361         gtk_tree_store_set (store, &iter2,
362                             0, "spirocheteus",
363                             -1);
364
365
366         gtk_tree_store_append (store, &iter2, &iter);                          
367         gtk_tree_store_set (store, &iter2,
368                             0, "Proteobacteria",
369                             -1);
370
371
372         gtk_tree_store_append (store, &iter3, &iter2);                         
373         gtk_tree_store_set (store, &iter3,
374                             0, "alpha",
375                             -1);
376
377
378         gtk_tree_store_append (store, &iter3, &iter2);                         
379         gtk_tree_store_set (store, &iter3,
380                             0, "beta",
381                             -1);
382
383
384         gtk_tree_store_append (store, &iter3, &iter2);                         
385         gtk_tree_store_set (store, &iter3,
386                             0, "delta ",
387                             -1);
388
389
390         gtk_tree_store_append (store, &iter3, &iter2);                         
391         gtk_tree_store_set (store, &iter3,
392                             0, "epsilon",
393                             -1);
394
395
396         gtk_tree_store_append (store, &iter3, &iter2);  
397         gtk_tree_store_set (store, &iter3,
398                             0, "gamma ",
399                             -1);
400
401
402         gtk_tree_store_append (store, &iter, NULL);                            
403         gtk_tree_store_set (store, &iter,
404                             0, "Eukaryotes",
405                             -1);
406
407
408         gtk_tree_store_append (store, &iter2, &iter);                          
409         gtk_tree_store_set (store, &iter2,
410                             0, "Metazoa",
411                             -1);
412
413
414         gtk_tree_store_append (store, &iter2, &iter);                          
415         gtk_tree_store_set (store, &iter2,
416                             0, "Bilateria",
417                             -1);
418
419
420         gtk_tree_store_append (store, &iter2, &iter);                          
421         gtk_tree_store_set (store, &iter2,
422                             0, "Myxozoa",
423                             -1);
424
425
426         gtk_tree_store_append (store, &iter2, &iter);                          
427         gtk_tree_store_set (store, &iter2,
428                             0, "Cnidaria",
429                             -1);
430
431
432         gtk_tree_store_append (store, &iter2, &iter);                          
433         gtk_tree_store_set (store, &iter2,
434                             0, "Ctenophora",
435                             -1);
436
437
438         gtk_tree_store_append (store, &iter2, &iter);                          
439         gtk_tree_store_set (store, &iter2,
440                             0, "Placozoa",
441                             -1);
442
443
444         gtk_tree_store_append (store, &iter2, &iter);                          
445         gtk_tree_store_set (store, &iter2,
446                             0, "Porifera",
447                             -1);
448
449
450         gtk_tree_store_append (store, &iter2, &iter);                          
451         gtk_tree_store_set (store, &iter2,
452                             0, "choanoflagellates",
453                             -1);
454
455
456         gtk_tree_store_append (store, &iter2, &iter);                          
457         gtk_tree_store_set (store, &iter2,
458                             0, "Fungi",
459                             -1);
460
461
462         gtk_tree_store_append (store, &iter2, &iter);                          
463         gtk_tree_store_set (store, &iter2,
464                             0, "Microsporidia",
465                             -1);
466
467
468         gtk_tree_store_append (store, &iter2, &iter);                          
469         gtk_tree_store_set (store, &iter2,
470                             0, "Aleveolates",
471                             -1);
472
473
474         gtk_tree_store_append (store, &iter2, &iter);                          
475         gtk_tree_store_set (store, &iter2,
476                             0, "Stramenopiles",
477                             -1);
478
479
480         gtk_tree_store_append (store, &iter2, &iter);                          
481         gtk_tree_store_set (store, &iter2,
482                             0, "Rhodophyta",
483                             -1);
484
485
486         gtk_tree_store_append (store, &iter2, &iter);                          
487         gtk_tree_store_set (store, &iter2,
488                             0, "Viridaeplantae",
489                             -1);
490
491
492         gtk_tree_store_append (store, &iter2, &iter);                          
493         gtk_tree_store_set (store, &iter2,
494                             0, "crytomonads et al",
495                             -1);
496
497
498         gtk_tree_store_append (store, &iter, NULL);                            
499         gtk_tree_store_set (store, &iter,
500                             0, "Archaea ",
501                             -1);
502
503
504         gtk_tree_store_append (store, &iter2, &iter);                          
505         gtk_tree_store_set (store, &iter2,
506                             0, "Korarchaeota",
507                             -1);
508
509
510         gtk_tree_store_append (store, &iter2, &iter);                          
511         gtk_tree_store_set (store, &iter2,
512                             0, "Crenarchaeota",
513                             -1);
514
515
516         gtk_tree_store_append (store, &iter2, &iter);                          
517         gtk_tree_store_set (store, &iter2,
518                             0, "Buryarchaeota",
519                             -1);
520
521         return GTK_TREE_MODEL (store);
522 }
523
524
525 /* blaat */
526 static GtkTreeModel *
527 create_capital_tree (void)
528 {
529         GtkTreeIter iter, iter2;
530         GtkTreeStore *store;
531
532         store = gtk_tree_store_new (1, G_TYPE_STRING);
533
534         gtk_tree_store_append (store, &iter, NULL);
535         gtk_tree_store_set (store, &iter, 0, "A - B", -1);
536
537         gtk_tree_store_append (store, &iter2, &iter);
538         gtk_tree_store_set (store, &iter2, 0, "Albany", -1);
539
540         gtk_tree_store_append (store, &iter2, &iter);
541         gtk_tree_store_set (store, &iter2, 0, "Annapolis", -1);
542
543         gtk_tree_store_append (store, &iter2, &iter);
544         gtk_tree_store_set (store, &iter2, 0, "Atlanta", -1);
545
546         gtk_tree_store_append (store, &iter2, &iter);
547         gtk_tree_store_set (store, &iter2, 0, "Augusta", -1);
548
549         gtk_tree_store_append (store, &iter2, &iter);
550         gtk_tree_store_set (store, &iter2, 0, "Austin", -1);
551
552         gtk_tree_store_append (store, &iter2, &iter);
553         gtk_tree_store_set (store, &iter2, 0, "Baton Rouge", -1);
554
555         gtk_tree_store_append (store, &iter2, &iter);
556         gtk_tree_store_set (store, &iter2, 0, "Bismarck", -1);
557
558         gtk_tree_store_append (store, &iter2, &iter);
559         gtk_tree_store_set (store, &iter2, 0, "Boise", -1);
560
561         gtk_tree_store_append (store, &iter2, &iter);
562         gtk_tree_store_set (store, &iter2, 0, "Boston", -1);
563
564         gtk_tree_store_append (store, &iter, NULL);
565         gtk_tree_store_set (store, &iter, 0, "C - D", -1);
566
567         gtk_tree_store_append (store, &iter2, &iter);
568         gtk_tree_store_set (store, &iter2, 0, "Carson City", -1);
569
570         gtk_tree_store_append (store, &iter2, &iter);
571         gtk_tree_store_set (store, &iter2, 0, "Charleston", -1);
572
573         gtk_tree_store_append (store, &iter2, &iter);
574         gtk_tree_store_set (store, &iter2, 0, "Cheyenne", -1);
575
576         gtk_tree_store_append (store, &iter2, &iter);
577         gtk_tree_store_set (store, &iter2, 0, "Columbia", -1);
578
579         gtk_tree_store_append (store, &iter2, &iter);
580         gtk_tree_store_set (store, &iter2, 0, "Columbus", -1);
581
582         gtk_tree_store_append (store, &iter2, &iter);
583         gtk_tree_store_set (store, &iter2, 0, "Concord", -1);
584
585         gtk_tree_store_append (store, &iter2, &iter);
586         gtk_tree_store_set (store, &iter2, 0, "Denver", -1);
587
588         gtk_tree_store_append (store, &iter2, &iter);
589         gtk_tree_store_set (store, &iter2, 0, "Des Moines", -1);
590
591         gtk_tree_store_append (store, &iter2, &iter);
592         gtk_tree_store_set (store, &iter2, 0, "Dover", -1);
593
594
595         gtk_tree_store_append (store, &iter, NULL);
596         gtk_tree_store_set (store, &iter, 0, "E - J", -1);
597
598         gtk_tree_store_append (store, &iter2, &iter);
599         gtk_tree_store_set (store, &iter2, 0, "Frankfort", -1);
600
601         gtk_tree_store_append (store, &iter2, &iter);
602         gtk_tree_store_set (store, &iter2, 0, "Harrisburg", -1);
603
604         gtk_tree_store_append (store, &iter2, &iter);
605         gtk_tree_store_set (store, &iter2, 0, "Hartford", -1);
606
607         gtk_tree_store_append (store, &iter2, &iter);
608         gtk_tree_store_set (store, &iter2, 0, "Helena", -1);
609
610         gtk_tree_store_append (store, &iter2, &iter);
611         gtk_tree_store_set (store, &iter2, 0, "Honolulu", -1);
612
613         gtk_tree_store_append (store, &iter2, &iter);
614         gtk_tree_store_set (store, &iter2, 0, "Indianapolis", -1);
615
616         gtk_tree_store_append (store, &iter2, &iter);
617         gtk_tree_store_set (store, &iter2, 0, "Jackson", -1);
618
619         gtk_tree_store_append (store, &iter2, &iter);
620         gtk_tree_store_set (store, &iter2, 0, "Jefferson City", -1);
621
622         gtk_tree_store_append (store, &iter2, &iter);
623         gtk_tree_store_set (store, &iter2, 0, "Juneau", -1);
624
625
626         gtk_tree_store_append (store, &iter, NULL);
627         gtk_tree_store_set (store, &iter, 0, "K - O", -1);
628
629         gtk_tree_store_append (store, &iter2, &iter);
630         gtk_tree_store_set (store, &iter2, 0, "Lansing", -1);
631
632         gtk_tree_store_append (store, &iter2, &iter);
633         gtk_tree_store_set (store, &iter2, 0, "Lincoln", -1);
634
635         gtk_tree_store_append (store, &iter2, &iter);
636         gtk_tree_store_set (store, &iter2, 0, "Little Rock", -1);
637
638         gtk_tree_store_append (store, &iter2, &iter);
639         gtk_tree_store_set (store, &iter2, 0, "Madison", -1);
640
641         gtk_tree_store_append (store, &iter2, &iter);
642         gtk_tree_store_set (store, &iter2, 0, "Montgomery", -1);
643
644         gtk_tree_store_append (store, &iter2, &iter);
645         gtk_tree_store_set (store, &iter2, 0, "Montpelier", -1);
646
647         gtk_tree_store_append (store, &iter2, &iter);
648         gtk_tree_store_set (store, &iter2, 0, "Nashville", -1);
649
650         gtk_tree_store_append (store, &iter2, &iter);
651         gtk_tree_store_set (store, &iter2, 0, "Oklahoma City", -1);
652
653         gtk_tree_store_append (store, &iter2, &iter);
654         gtk_tree_store_set (store, &iter2, 0, "Olympia", -1);
655
656
657         gtk_tree_store_append (store, &iter, NULL);
658         gtk_tree_store_set (store, &iter, 0, "P - S", -1);
659
660         gtk_tree_store_append (store, &iter2, &iter);
661         gtk_tree_store_set (store, &iter2, 0, "Phoenix", -1);
662
663         gtk_tree_store_append (store, &iter2, &iter);
664         gtk_tree_store_set (store, &iter2, 0, "Pierre", -1);
665
666         gtk_tree_store_append (store, &iter2, &iter);
667         gtk_tree_store_set (store, &iter2, 0, "Providence", -1);
668
669         gtk_tree_store_append (store, &iter2, &iter);
670         gtk_tree_store_set (store, &iter2, 0, "Raleigh", -1);
671
672         gtk_tree_store_append (store, &iter2, &iter);
673         gtk_tree_store_set (store, &iter2, 0, "Richmond", -1);
674
675         gtk_tree_store_append (store, &iter2, &iter);
676         gtk_tree_store_set (store, &iter2, 0, "Sacramento", -1);
677
678         gtk_tree_store_append (store, &iter2, &iter);
679         gtk_tree_store_set (store, &iter2, 0, "Salem", -1);
680
681         gtk_tree_store_append (store, &iter2, &iter);
682         gtk_tree_store_set (store, &iter2, 0, "Salt Lake City", -1);
683
684         gtk_tree_store_append (store, &iter2, &iter);
685         gtk_tree_store_set (store, &iter2, 0, "Santa Fe", -1);
686
687         gtk_tree_store_append (store, &iter2, &iter);
688         gtk_tree_store_set (store, &iter2, 0, "Springfield", -1);
689
690         gtk_tree_store_append (store, &iter2, &iter);
691         gtk_tree_store_set (store, &iter2, 0, "St. Paul", -1);
692
693
694         gtk_tree_store_append (store, &iter, NULL);
695         gtk_tree_store_set (store, &iter, 0, "T - Z", -1);
696
697         gtk_tree_store_append (store, &iter2, &iter);
698         gtk_tree_store_set (store, &iter2, 0, "Tallahassee", -1);
699
700         gtk_tree_store_append (store, &iter2, &iter);
701         gtk_tree_store_set (store, &iter2, 0, "Topeka", -1);
702
703         gtk_tree_store_append (store, &iter2, &iter);
704         gtk_tree_store_set (store, &iter2, 0, "Trenton", -1);
705
706         return GTK_TREE_MODEL (store);
707 }
708
709 static void
710 capital_sensitive (GtkCellLayout   *cell_layout,
711                    GtkCellRenderer *cell,
712                    GtkTreeModel    *tree_model,
713                    GtkTreeIter     *iter,
714                    gpointer         data)
715 {
716   gboolean sensitive;
717
718   sensitive = !gtk_tree_model_iter_has_child (tree_model, iter);
719
720   g_object_set (cell, "sensitive", sensitive, NULL);
721 }
722
723 static gboolean
724 capital_animation (gpointer data)
725 {
726   static gint insert_count = 0;
727   GtkTreeModel *model = GTK_TREE_MODEL (data);
728   GtkTreePath *path;
729   GtkTreeIter iter, parent;
730
731   switch (insert_count % 8)
732     {
733     case 0:
734       gtk_tree_store_insert (GTK_TREE_STORE (model), &iter, NULL, 0);
735       gtk_tree_store_set (GTK_TREE_STORE (model), 
736                           &iter,
737                           0, "Europe", -1);
738       break;
739
740     case 1:
741       path = gtk_tree_path_new_from_indices (0, -1);
742       gtk_tree_model_get_iter (model, &parent, path);
743       gtk_tree_path_free (path);
744       gtk_tree_store_insert (GTK_TREE_STORE (model), &iter, &parent, 0);
745       gtk_tree_store_set (GTK_TREE_STORE (model), 
746                           &iter,
747                           0, "Berlin", -1);
748       break;
749
750     case 2:
751       path = gtk_tree_path_new_from_indices (0, -1);
752       gtk_tree_model_get_iter (model, &parent, path);
753       gtk_tree_path_free (path);
754       gtk_tree_store_insert (GTK_TREE_STORE (model), &iter, &parent, 1);
755       gtk_tree_store_set (GTK_TREE_STORE (model), 
756                           &iter,
757                           0, "London", -1);
758       break;
759
760     case 3:
761       path = gtk_tree_path_new_from_indices (0, -1);
762       gtk_tree_model_get_iter (model, &parent, path);
763       gtk_tree_path_free (path);
764       gtk_tree_store_insert (GTK_TREE_STORE (model), &iter, &parent, 2);
765       gtk_tree_store_set (GTK_TREE_STORE (model), 
766                           &iter,
767                           0, "Paris", -1);
768       break;
769
770     case 4:
771       path = gtk_tree_path_new_from_indices (0, 2, -1);
772       gtk_tree_model_get_iter (model, &iter, path);
773       gtk_tree_path_free (path);
774       gtk_tree_store_remove (GTK_TREE_STORE (model), &iter);
775       break;
776
777     case 5:
778       path = gtk_tree_path_new_from_indices (0, 1, -1);
779       gtk_tree_model_get_iter (model, &iter, path);
780       gtk_tree_path_free (path);
781       gtk_tree_store_remove (GTK_TREE_STORE (model), &iter);
782       break;
783
784     case 6:
785       path = gtk_tree_path_new_from_indices (0, 0, -1);
786       gtk_tree_model_get_iter (model, &iter, path);
787       gtk_tree_path_free (path);
788       gtk_tree_store_remove (GTK_TREE_STORE (model), &iter);
789       break;
790
791     case 7:
792       path = gtk_tree_path_new_from_indices (0, -1);
793       gtk_tree_model_get_iter (model, &iter, path);
794       gtk_tree_path_free (path);
795       gtk_tree_store_remove (GTK_TREE_STORE (model), &iter);
796       break;
797
798     default: ;
799
800     }
801   insert_count++;
802
803   return TRUE;
804 }
805
806 static void
807 setup_combo_entry (GtkWidget *entry_box)
808 {
809         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
810                                    "dum de dum");
811         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
812                                    "la la la");
813         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
814                                    "la la la dum de dum la la la la la la boom de da la la");
815         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
816                                    "bloop");
817         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
818                                    "bleep");
819         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
820                                    "klaas");
821         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
822                                    "klaas0");
823         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
824                                    "klaas1");
825         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
826                                    "klaas2");
827         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
828                                    "klaas3");
829         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
830                                    "klaas4");
831         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
832                                    "klaas5");
833         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
834                                    "klaas6");
835         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
836                                    "klaas7");
837         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
838                                    "klaas8");
839         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
840                                    "klaas9");
841         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
842                                    "klaasa");
843         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
844                                    "klaasb");
845         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
846                                    "klaasc");
847         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
848                                    "klaasd");
849         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
850                                    "klaase");
851         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
852                                    "klaasf");
853         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
854                                    "klaas10");
855         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
856                                    "klaas11");
857         gtk_combo_box_append_text (GTK_COMBO_BOX (entry_box),
858                                    "klaas12");
859 }
860
861 static void
862 set_sensitive (GtkCellLayout   *cell_layout,
863                GtkCellRenderer *cell,
864                GtkTreeModel    *tree_model,
865                GtkTreeIter     *iter,
866                gpointer         data)
867 {
868   GtkTreePath *path;
869   gint *indices;
870   gboolean sensitive;
871
872   path = gtk_tree_model_get_path (tree_model, iter);
873   indices = gtk_tree_path_get_indices (path);
874   sensitive = indices[0] != 1;
875   gtk_tree_path_free (path);
876
877   g_object_set (cell, "sensitive", sensitive, NULL);
878 }
879
880 static gboolean
881 is_separator (GtkTreeModel *model,
882               GtkTreeIter  *iter,
883               gpointer      data)
884 {
885   GtkTreePath *path;
886   gboolean result;
887
888   path = gtk_tree_model_get_path (model, iter);
889   result = gtk_tree_path_get_indices (path)[0] == 4;
890   gtk_tree_path_free (path);
891
892   return result;
893   
894 }
895
896 static void
897 displayed_row_changed (GtkComboBox *combo,
898                        GtkCellView *cell)
899 {
900   gint row;
901   GtkTreePath *path;
902
903   row = gtk_combo_box_get_active (combo);
904   path = gtk_tree_path_new_from_indices (row, -1);
905   gtk_cell_view_set_displayed_row (cell, path);
906   gtk_tree_path_free (path);
907 }
908
909 int
910 main (int argc, char **argv)
911 {
912         GtkWidget *window, *cellview, *mainbox;
913         GtkWidget *combobox, *comboboxtext, *comboboxgrid;
914         GtkWidget *tmp, *boom;
915         GtkCellRenderer *renderer;
916         GdkPixbuf *pixbuf;
917         GtkTreeModel *model;
918         GtkTreePath *path;
919         GtkTreeIter iter;
920         GdkColor color;
921         
922         gtk_init (&argc, &argv);
923
924         if (g_getenv ("RTL"))
925           gtk_widget_set_default_direction (GTK_TEXT_DIR_RTL);
926
927         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
928         gtk_container_set_border_width (GTK_CONTAINER (window), 5);
929         g_signal_connect (window, "destroy", gtk_main_quit, NULL);
930
931         mainbox = gtk_vbox_new (FALSE, 2);
932         gtk_container_add (GTK_CONTAINER (window), mainbox);
933
934         /* GtkCellView */
935         tmp = gtk_frame_new ("GtkCellView");
936         gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
937
938         boom = gtk_vbox_new (FALSE, 0);
939         gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
940         gtk_container_add (GTK_CONTAINER (tmp), boom);
941
942         cellview = gtk_cell_view_new ();
943         renderer = gtk_cell_renderer_pixbuf_new ();
944         pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_DIALOG_WARNING,
945                                          GTK_ICON_SIZE_BUTTON, NULL);
946
947         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (cellview),
948                                     renderer,
949                                     FALSE);
950         g_object_set (renderer, "pixbuf", pixbuf, NULL);
951
952         renderer = gtk_cell_renderer_text_new ();
953         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (cellview),
954                                     renderer,
955                                     TRUE);
956         g_object_set (renderer, "text", "la la la", NULL);
957         gtk_container_add (GTK_CONTAINER (boom), cellview);
958
959         /* GtkComboBox list */
960         tmp = gtk_frame_new ("GtkComboBox (list)");
961         gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
962
963         boom = gtk_vbox_new (FALSE, 0);
964         gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
965         gtk_container_add (GTK_CONTAINER (tmp), boom);
966
967         model = create_list_blaat ();
968         combobox = gtk_combo_box_new_with_model (model);
969         gtk_combo_box_set_add_tearoffs (GTK_COMBO_BOX (combobox), TRUE);
970         g_object_unref (model);
971         gtk_container_add (GTK_CONTAINER (boom), combobox);
972
973         renderer = gtk_cell_renderer_pixbuf_new ();
974         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
975                                     renderer,
976                                     FALSE);
977         gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
978                                         "pixbuf", 0,
979                                         NULL);
980         gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
981                                             renderer,
982                                             set_sensitive,
983                                             NULL, NULL);
984
985         renderer = gtk_cell_renderer_text_new ();
986         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
987                                     renderer,
988                                     TRUE);
989         gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
990                                         "text", 1,
991                                         NULL);
992         gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
993                                             renderer,
994                                             set_sensitive,
995                                             NULL, NULL);
996         gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), 
997                                               is_separator, NULL, NULL);
998                                                 
999         gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 0);
1000
1001         /* GtkComboBox custom entry */
1002         tmp = gtk_frame_new ("GtkComboBox (custom)");
1003         gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
1004
1005         boom = gtk_vbox_new (FALSE, 0);
1006         gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
1007         gtk_container_add (GTK_CONTAINER (tmp), boom);
1008
1009         model = create_list_blaat ();
1010         combobox = gtk_combo_box_new_with_model (model);
1011         gtk_combo_box_set_add_tearoffs (GTK_COMBO_BOX (combobox), TRUE);
1012         g_object_unref (model);
1013         gtk_container_add (GTK_CONTAINER (boom), combobox);
1014
1015         renderer = gtk_cell_renderer_pixbuf_new ();
1016         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
1017                                     renderer,
1018                                     FALSE);
1019         gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
1020                                         "pixbuf", 0,
1021                                         NULL);
1022         gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
1023                                             renderer,
1024                                             set_sensitive,
1025                                             NULL, NULL);
1026
1027         renderer = gtk_cell_renderer_text_new ();
1028         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
1029                                     renderer,
1030                                     TRUE);
1031         gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
1032                                         "text", 1,
1033                                         NULL);
1034         gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
1035                                             renderer,
1036                                             set_sensitive,
1037                                             NULL, NULL);
1038         gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), 
1039                                               is_separator, NULL, NULL);
1040                                                 
1041         gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 0);
1042
1043         tmp = gtk_cell_view_new ();
1044         gtk_widget_show (tmp);
1045         gtk_cell_view_set_model (GTK_CELL_VIEW (tmp), model);
1046
1047         renderer = gtk_cell_renderer_text_new ();
1048         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (tmp), renderer, TRUE);
1049         gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (tmp), renderer,
1050                                         "text", 1,
1051                                         NULL);
1052         color.red = 0xffff;
1053         color.blue = 0xffff;
1054         color.green = 0;
1055         gtk_cell_view_set_background_color (GTK_CELL_VIEW (tmp), &color);
1056         displayed_row_changed (GTK_COMBO_BOX (combobox), GTK_CELL_VIEW (tmp));
1057         g_signal_connect (combobox, "changed", G_CALLBACK (displayed_row_changed), tmp); 
1058            
1059         gtk_container_add (GTK_CONTAINER (combobox), tmp);
1060
1061         /* GtkComboBox tree */
1062         tmp = gtk_frame_new ("GtkComboBox (tree)");
1063         gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
1064
1065         boom = gtk_vbox_new (FALSE, 0);
1066         gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
1067         gtk_container_add (GTK_CONTAINER (tmp), boom);
1068
1069         model = create_tree_blaat ();
1070         combobox = gtk_combo_box_new_with_model (model);
1071         gtk_combo_box_set_add_tearoffs (GTK_COMBO_BOX (combobox), TRUE);
1072         g_object_unref (model);
1073         gtk_container_add (GTK_CONTAINER (boom), combobox);
1074
1075         renderer = gtk_cell_renderer_pixbuf_new ();
1076         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
1077                                     renderer,
1078                                     FALSE);
1079         gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
1080                                         "pixbuf", 0,
1081                                         NULL);
1082         gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
1083                                             renderer,
1084                                             set_sensitive,
1085                                             NULL, NULL);
1086
1087         renderer = gtk_cell_renderer_text_new ();
1088         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
1089                                     renderer,
1090                                     TRUE);
1091         gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
1092                                         "text", 1,
1093                                         NULL);
1094         gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
1095                                             renderer,
1096                                             set_sensitive,
1097                                             NULL, NULL);
1098         gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), 
1099                                               is_separator, NULL, NULL);
1100                                                 
1101         gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 0);
1102 #if 0
1103         g_timeout_add (1000, (GSourceFunc) animation_timer, model);
1104 #endif
1105
1106         /* GtkComboBox (grid mode) */
1107         tmp = gtk_frame_new ("GtkComboBox (grid mode)");
1108         gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
1109
1110         boom = gtk_vbox_new (FALSE, 0);
1111         gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
1112         gtk_container_add (GTK_CONTAINER (tmp), boom);
1113
1114         comboboxgrid = create_combo_box_grid_demo ();
1115         gtk_box_pack_start (GTK_BOX (boom), comboboxgrid, FALSE, FALSE, 0);
1116
1117
1118         /* GtkComboBoxEntry */
1119         tmp = gtk_frame_new ("GtkComboBoxEntry");
1120         gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
1121
1122         boom = gtk_vbox_new (FALSE, 0);
1123         gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
1124         gtk_container_add (GTK_CONTAINER (tmp), boom);
1125
1126         comboboxtext = gtk_combo_box_entry_new_text ();
1127         setup_combo_entry (comboboxtext);
1128         gtk_container_add (GTK_CONTAINER (boom), comboboxtext);
1129
1130
1131         /* Phylogenetic tree */
1132         tmp = gtk_frame_new ("What are you ?");
1133         gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
1134
1135         boom = gtk_vbox_new (FALSE, 0);
1136         gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
1137         gtk_container_add (GTK_CONTAINER (tmp), boom);
1138
1139         model = create_phylogenetic_tree ();
1140         combobox = gtk_combo_box_new_with_model (model);
1141         gtk_combo_box_set_add_tearoffs (GTK_COMBO_BOX (combobox), TRUE);
1142         g_object_unref (model);
1143         gtk_container_add (GTK_CONTAINER (boom), combobox);
1144
1145         renderer = gtk_cell_renderer_text_new ();
1146         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
1147                                     renderer,
1148                                     TRUE);
1149         gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
1150                                         "text", 0,
1151                                         NULL);
1152         
1153         gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 0);
1154
1155
1156         /* Capitals */
1157         tmp = gtk_frame_new ("Where are you ?");
1158         gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
1159
1160         boom = gtk_vbox_new (FALSE, 0);
1161         gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
1162         gtk_container_add (GTK_CONTAINER (tmp), boom);
1163
1164         model = create_capital_tree ();
1165         combobox = gtk_combo_box_new_with_model (model);
1166         gtk_combo_box_set_add_tearoffs (GTK_COMBO_BOX (combobox), TRUE);
1167         g_object_unref (model);
1168         gtk_container_add (GTK_CONTAINER (boom), combobox);
1169         renderer = gtk_cell_renderer_text_new ();
1170         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
1171                                     renderer,
1172                                     TRUE);
1173         gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
1174                                         "text", 0,
1175                                         NULL);
1176         gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
1177                                             renderer,
1178                                             capital_sensitive,
1179                                             NULL, NULL);
1180         path = gtk_tree_path_new_from_indices (0, 8, -1);
1181         gtk_tree_model_get_iter (model, &iter, path);
1182         gtk_tree_path_free (path);
1183         gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combobox), &iter);
1184
1185 #if 1
1186         g_timeout_add (1000, (GSourceFunc) capital_animation, model);
1187 #endif
1188
1189         gtk_widget_show_all (window);
1190
1191         gtk_main ();
1192
1193         return 0;
1194 }
1195
1196 /* vim:expandtab
1197  */