]> Pileus Git - ~andy/gtk/blob - tests/testcellrenderertext.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / tests / testcellrenderertext.c
1 /* GTK - The GIMP Toolkit
2  * testcellrenderertext.c: Tests for the various properties of GtkCellRendererText
3  * Copyright (C) 2005, Novell, Inc.
4  *
5  * Authors:
6  *   Federico Mena-Quintero <federico@novell.com>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
20  */
21
22 #include <gtk/gtk.h>
23
24 #define COL_BACKGROUND 15
25 #define COL_LINE_NUM   16
26 #define NUM_COLS       17 /* change this when adding columns */
27
28 struct cell_params {
29   char *description;                    /* 0 */
30   char *test;                           /* 1 */
31   int xpad;                             /* 2 */
32   int ypad;                             /* 3 */
33   double xalign;                        /* 4 */
34   double yalign;                        /* 5 */
35   gboolean sensitive;                   /* 6 */
36   int width;                            /* 7 */
37   int height;                           /* 8 */
38   int width_chars;                      /* 9 */
39   int wrap_width;                       /* 10 */
40   PangoWrapMode wrap_mode;              /* 11 */
41   gboolean single_paragraph_mode;       /* 12 */
42   PangoEllipsizeMode ellipsize;         /* 13 */
43   PangoAlignment alignment;                     /* 14 */
44   /* COL_BACKGROUND      */             /* 15 */
45   /* COL_LINE_NUM */                    /* 16 */
46 };
47
48 #define WO PANGO_WRAP_WORD
49 #define CH PANGO_WRAP_CHAR
50 #define WC PANGO_WRAP_WORD_CHAR
51
52 #define NO PANGO_ELLIPSIZE_NONE
53 #define ST PANGO_ELLIPSIZE_START
54 #define MI PANGO_ELLIPSIZE_MIDDLE
55 #define EN PANGO_ELLIPSIZE_END
56
57 #define AL PANGO_ALIGN_LEFT
58 #define AC PANGO_ALIGN_CENTER
59 #define AR PANGO_ALIGN_RIGHT
60
61 #define TESTL "LEFT JUSTIFIED This is really truly verily some very long text\n\330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205 \330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205 \330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205"
62
63 #define TESTC "CENTERED This is really truly verily some very long text\n\330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205 \330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205 \330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205"
64
65 #define TESTR "RIGHT JUSTIFIED This is really truly verily some very long text\n\330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205 \330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205 \330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205"
66
67
68 /* DO NOT CHANGE THE ROWS!  They are numbered so that we can refer to
69  * problematic rows in bug reports.  If you need a different test, just add a
70  * new row at the bottom.  Also, please add your new row numbers to this column -------------------------------+
71  * to keep things tidy.                                                                                        v
72  */
73 static const struct cell_params cell_params[] = {
74   { "xp yp xa ya se wi he wc ww wm sp el", "",    0,  0, 0.0, 0.5, TRUE,  -1, -1, -1, -1, CH, FALSE, NO },  /* 0 */
75
76   /* Test alignment */
77
78   { "0  0  0  0  T  -1 -1 -1 -1 CH F  NO", TESTL,  0,  0, 0.0, 0.0, TRUE,  -1, -1, -1, -1, CH, FALSE, NO , AL }, /* 1 */
79   { "0  0  .5 0  T  -1 -1 -1 -1 CH F  NO", TESTC,  0,  0, 0.5, 0.0, TRUE,  -1, -1, -1, -1, CH, FALSE, NO , AL }, /* 2 */
80   { "0  0  1  0  T  -1 -1 -1 -1 CH F  NO", TESTR,  0,  0, 1.0, 0.0, TRUE,  -1, -1, -1, -1, CH, FALSE, NO , AL }, /* 3 */
81   { "0  0  0  .5 T  -1 -1 -1 -1 CH F  NO", TESTL,  0,  0, 0.0, 0.5, TRUE,  -1, -1, -1, -1, CH, FALSE, NO , AL }, /* 4 */
82   { "0  0  .5 .5 T  -1 -1 -1 -1 CH F  NO", TESTC,  0,  0, 0.5, 0.5, TRUE,  -1, -1, -1, -1, CH, FALSE, NO , AL }, /* 5 */
83   { "0  0  1  .5 T  -1 -1 -1 -1 CH F  NO", TESTR,  0,  0, 1.0, 0.5, TRUE,  -1, -1, -1, -1, CH, FALSE, NO , AL }, /* 6 */
84   { "0  0  0  1  T  -1 -1 -1 -1 CH F  NO", TESTL,  0,  0, 0.0, 1.0, TRUE,  -1, -1, -1, -1, CH, FALSE, NO , AL }, /* 7 */
85   { "0  0  .5 1  T  -1 -1 -1 -1 CH F  NO", TESTC,  0,  0, 0.5, 1.0, TRUE,  -1, -1, -1, -1, CH, FALSE, NO , AL }, /* 8 */
86   { "0  0  1  1  T  -1 -1 -1 -1 CH F  NO", TESTR,  0,  0, 1.0, 1.0, TRUE,  -1, -1, -1, -1, CH, FALSE, NO , AL }, /* 9 */
87
88   /* Test padding */
89
90   { "10 10 0  0  T  -1 -1 -1 -1 CH F  NO", TESTL, 10, 10, 0.0, 0.0, TRUE,  -1, -1, -1, -1, CH, FALSE, NO , AL }, /* 10 */
91   { "10 10 .5 0  T  -1 -1 -1 -1 CH F  NO", TESTC, 10, 10, 0.5, 0.0, TRUE,  -1, -1, -1, -1, CH, FALSE, NO , AL }, /* 11 */
92   { "10 10 1  0  T  -1 -1 -1 -1 CH F  NO", TESTR, 10, 10, 1.0, 0.0, TRUE,  -1, -1, -1, -1, CH, FALSE, NO , AL }, /* 12 */
93   { "10 10 0  .5 T  -1 -1 -1 -1 CH F  NO", TESTL, 10, 10, 0.0, 0.5, TRUE,  -1, -1, -1, -1, CH, FALSE, NO , AL }, /* 13 */
94   { "10 10 .5 .5 T  -1 -1 -1 -1 CH F  NO", TESTC, 10, 10, 0.5, 0.5, TRUE,  -1, -1, -1, -1, CH, FALSE, NO , AL }, /* 14 */
95   { "10 10 1  .5 T  -1 -1 -1 -1 CH F  NO", TESTR, 10, 10, 1.0, 0.5, TRUE,  -1, -1, -1, -1, CH, FALSE, NO , AL }, /* 15 */
96   { "10 10 0  1  T  -1 -1 -1 -1 CH F  NO", TESTL, 10, 10, 0.0, 1.0, TRUE,  -1, -1, -1, -1, CH, FALSE, NO , AL }, /* 16 */
97   { "10 10 .5 1  T  -1 -1 -1 -1 CH F  NO", TESTC, 10, 10, 0.5, 1.0, TRUE,  -1, -1, -1, -1, CH, FALSE, NO , AL }, /* 17 */
98   { "10 10 1  1  T  -1 -1 -1 -1 CH F  NO", TESTR, 10, 10, 1.0, 1.0, TRUE,  -1, -1, -1, -1, CH, FALSE, NO , AL }, /* 18 */
99
100   /* Test Pango alignment (not xalign) */
101   { "0  0  0  0  T  -1 -1 -1 -1 CH F  NO AL", TESTL,  0,  0, 0.0, 0.0, TRUE,  -1, -1, -1, 20, WO, FALSE, NO , AL }, /* 19 */
102   { "0  0  0  0  T  -1 -1 -1 -1 CH F  NO AC", TESTC,  0,  0, 0.0, 0.0, TRUE,  -1, -1, -1, 20, WO, FALSE, NO , AC }, /* 20 */
103   { "0  0  0  0  T  -1 -1 -1 -1 CH F  NO AR", TESTR,  0,  0, 0.0, 0.0, TRUE,  -1, -1, -1, 20, WO, FALSE, NO , AR }, /* 21 */
104 };
105
106 static GtkListStore *
107 create_list_store (void)
108 {
109   GtkListStore *list_store;
110   int i;
111
112   list_store = gtk_list_store_new (NUM_COLS,
113                                    G_TYPE_STRING,               /* 0 */ 
114                                    G_TYPE_STRING,               /* 1 */ 
115                                    G_TYPE_INT,                  /* 2 */ 
116                                    G_TYPE_INT,                  /* 3 */ 
117                                    G_TYPE_DOUBLE,               /* 4 */ 
118                                    G_TYPE_DOUBLE,               /* 5 */ 
119                                    G_TYPE_BOOLEAN,              /* 6 */ 
120                                    G_TYPE_INT,                  /* 7 */ 
121                                    G_TYPE_INT,                  /* 8 */ 
122                                    G_TYPE_INT,                  /* 9 */ 
123                                    G_TYPE_INT,                  /* 10 */
124                                    PANGO_TYPE_WRAP_MODE,        /* 11 */
125                                    G_TYPE_BOOLEAN,              /* 12 */
126                                    PANGO_TYPE_ELLIPSIZE_MODE,   /* 13 */
127                                    PANGO_TYPE_ALIGNMENT,        /* 14 */
128                                    G_TYPE_STRING,               /* 15 */
129                                    G_TYPE_STRING);              /* 16 */
130
131   for (i = 0; i < G_N_ELEMENTS (cell_params); i++)
132     {
133       const struct cell_params *p;
134       GtkTreeIter iter;
135       char buf[50];
136
137       p = cell_params + i;
138
139       g_snprintf (buf, sizeof (buf), "%d", i);
140
141       gtk_list_store_append (list_store, &iter);
142       gtk_list_store_set (list_store, &iter,
143                           0, p->description,
144                           1, p->test,
145                           2, p->xpad,
146                           3, p->ypad,
147                           4, p->xalign,
148                           5, p->yalign,
149                           6, p->sensitive,
150                           7, p->width,
151                           8, p->height,
152                           9, p->width_chars,
153                           10, p->wrap_width,
154                           11, p->wrap_mode,
155                           12, p->single_paragraph_mode,
156                           13, p->ellipsize,
157                           14, p->alignment,
158                           15, (i % 2 == 0) ? "gray50" : "gray80",
159                           16, buf,
160                           -1);
161     }
162
163   return list_store;
164 }
165
166 static GtkWidget *
167 create_tree (gboolean rtl)
168 {
169   GtkWidget *sw;
170   GtkWidget *treeview;
171   GtkListStore *list_store;
172   GtkTreeViewColumn *column;
173   GtkCellRenderer *renderer;
174   GdkPixbuf *pixbuf;
175
176   sw = gtk_scrolled_window_new (NULL, NULL);
177   gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN);
178   gtk_widget_set_direction (sw, rtl ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR);
179
180   list_store = create_list_store ();
181
182   treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
183   gtk_widget_set_direction (treeview, rtl ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR);
184   gtk_container_add (GTK_CONTAINER (sw), treeview);
185
186   /* Line number */
187
188   renderer = gtk_cell_renderer_text_new ();
189   column = gtk_tree_view_column_new_with_attributes ("#",
190                                                      renderer,
191                                                      "text", COL_LINE_NUM,
192                                                      NULL);
193   gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
194
195   /* Description */
196
197   renderer = gtk_cell_renderer_text_new ();
198   g_object_set (renderer,
199                 "font", "monospace",
200                 NULL);
201   column = gtk_tree_view_column_new_with_attributes ("Description",
202                                                      renderer,
203                                                      "text", 0,
204                                                      NULL);
205   gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
206
207   /* Test text */
208
209   renderer = gtk_cell_renderer_text_new ();
210   column = gtk_tree_view_column_new_with_attributes ("Test",
211                                                      renderer,
212                                                      "text", 1,
213                                                      "xpad", 2,
214                                                      "ypad", 3,
215                                                      "xalign", 4,
216                                                      "yalign", 5,
217                                                      "sensitive", 6,
218                                                      "width", 7,
219                                                      "height", 8,
220                                                      "width_chars", 9,
221                                                      "wrap_width", 10,
222                                                      "wrap_mode", 11,
223                                                      "single_paragraph_mode", 12,
224                                                      "ellipsize", 13,
225                                                      "alignment", 14,
226                                                      "cell_background", 15,
227                                                      NULL);
228   gtk_tree_view_column_set_resizable (column, TRUE);
229   gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
230
231   /* Empty column */
232
233   pixbuf = gdk_pixbuf_new_from_file ("apple-red.png", NULL);
234
235   renderer = gtk_cell_renderer_pixbuf_new ();
236   g_object_set (renderer,
237                 "pixbuf", pixbuf,
238                 "xpad", 10,
239                 "ypad", 10,
240                 NULL);
241   column = gtk_tree_view_column_new_with_attributes ("Empty",
242                                                      renderer,
243                                                      NULL);
244   gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
245
246   return sw;
247 }
248
249 int
250 main (int argc, char **argv)
251 {
252   GtkWidget *window;
253   GtkWidget *vbox;
254   GtkWidget *label;
255   GtkWidget *tree;
256
257   gtk_init (&argc, &argv);
258
259   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
260   g_signal_connect (window, "destroy",
261                     G_CALLBACK (gtk_main_quit), NULL);
262   gtk_container_set_border_width (GTK_CONTAINER (window), 12);
263
264   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
265   gtk_container_add (GTK_CONTAINER (window), vbox);
266
267   /* LTR */
268
269   label = gtk_label_new ("Left to right");
270   gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
271
272   tree = create_tree (FALSE);
273   gtk_box_pack_start (GTK_BOX (vbox), tree, TRUE, TRUE, 0);
274
275   /* RTL */
276
277   label = gtk_label_new ("Right to left");
278   gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
279
280   tree = create_tree (TRUE);
281   gtk_box_pack_start (GTK_BOX (vbox), tree, TRUE, TRUE, 0);
282
283   gtk_widget_show_all (window);
284   gtk_main ();
285
286   return 0;
287 }