]> Pileus Git - ~andy/gtk/blob - tests/testtoolbar.c
gtkiconview: Use symbolic names for button numbers
[~andy/gtk] / tests / testtoolbar.c
1 /* testtoolbar.c
2  *
3  * Copyright (C) 2002 Anders Carlsson <andersca@codefactory.se>
4  * Copyright (C) 2002 James Henstridge <james@daa.com.au>
5  * Copyright (C) 2003 Soeren Sandmann <sandmann@daimi.au.dk>
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public
18  * License along with this library; if not, write to the
19  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  */
22 #include "config.h"
23 #include <gtk/gtk.h>
24 #include "prop-editor.h"
25
26 static void
27 change_orientation (GtkWidget *button, GtkWidget *toolbar)
28 {
29   GtkWidget *grid;
30   GtkOrientation orientation;
31
32   grid = gtk_widget_get_parent (toolbar);
33   if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)))
34     orientation = GTK_ORIENTATION_VERTICAL;
35   else
36     orientation = GTK_ORIENTATION_HORIZONTAL;
37
38   g_object_ref (toolbar);
39   gtk_container_remove (GTK_CONTAINER (grid), toolbar);
40   gtk_orientable_set_orientation (GTK_ORIENTABLE (toolbar), orientation);
41   if (orientation == GTK_ORIENTATION_HORIZONTAL)
42     {
43       gtk_widget_set_hexpand (toolbar, TRUE);
44       gtk_widget_set_vexpand (toolbar, FALSE);
45       gtk_grid_attach (GTK_GRID (grid), toolbar, 0, 0, 2, 1);
46     }
47   else
48     {
49       gtk_widget_set_hexpand (toolbar, FALSE);
50       gtk_widget_set_vexpand (toolbar, TRUE);
51       gtk_grid_attach (GTK_GRID (grid), toolbar, 0, 0, 1, 5);
52     }
53   g_object_unref (toolbar);
54 }
55
56 static void
57 change_show_arrow (GtkWidget *button, GtkWidget *toolbar)
58 {
59   gtk_toolbar_set_show_arrow (GTK_TOOLBAR (toolbar),
60                 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)));
61 }
62
63 static void
64 set_toolbar_style_toggled (GtkCheckButton *button, GtkToolbar *toolbar)
65 {
66   GtkWidget *option_menu;
67   int style;
68   
69   option_menu = g_object_get_data (G_OBJECT (button), "option-menu");
70
71   if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)))
72     {
73       style = gtk_combo_box_get_active (GTK_COMBO_BOX (option_menu));
74
75       gtk_toolbar_set_style (toolbar, style);
76       gtk_widget_set_sensitive (option_menu, TRUE);
77     }
78   else
79     {
80       gtk_toolbar_unset_style (toolbar);
81       gtk_widget_set_sensitive (option_menu, FALSE);
82     }
83 }
84
85 static void
86 change_toolbar_style (GtkWidget *option_menu, GtkWidget *toolbar)
87 {
88   GtkToolbarStyle style;
89
90   style = gtk_combo_box_get_active (GTK_COMBO_BOX (option_menu));
91   gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), style);
92 }
93
94 static void
95 set_visible_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
96                  GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
97 {
98   GtkToolItem *tool_item;
99   gboolean visible;
100
101   gtk_tree_model_get (model, iter, 0, &tool_item, -1);
102
103   g_object_get (tool_item, "visible", &visible, NULL);
104   g_object_set (cell, "active", visible, NULL);
105   g_object_unref (tool_item);
106 }
107
108 static void
109 visibile_toggled(GtkCellRendererToggle *cell, const gchar *path_str,
110                  GtkTreeModel *model)
111 {
112   GtkTreePath *path;
113   GtkTreeIter iter;
114   GtkToolItem *tool_item;
115   gboolean visible;
116
117   path = gtk_tree_path_new_from_string (path_str);
118   gtk_tree_model_get_iter (model, &iter, path);
119
120   gtk_tree_model_get (model, &iter, 0, &tool_item, -1);
121   g_object_get (tool_item, "visible", &visible, NULL);
122   g_object_set (tool_item, "visible", !visible, NULL);
123   g_object_unref (tool_item);
124
125   gtk_tree_model_row_changed (model, path, &iter);
126   gtk_tree_path_free (path);
127 }
128
129 static void
130 set_expand_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
131                 GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
132 {
133   GtkToolItem *tool_item;
134
135   gtk_tree_model_get (model, iter, 0, &tool_item, -1);
136
137   g_object_set (cell, "active", gtk_tool_item_get_expand (tool_item), NULL);
138   g_object_unref (tool_item);
139 }
140
141 static void
142 expand_toggled(GtkCellRendererToggle *cell, const gchar *path_str,
143                GtkTreeModel *model)
144 {
145   GtkTreePath *path;
146   GtkTreeIter iter;
147   GtkToolItem *tool_item;
148
149   path = gtk_tree_path_new_from_string (path_str);
150   gtk_tree_model_get_iter (model, &iter, path);
151
152   gtk_tree_model_get (model, &iter, 0, &tool_item, -1);
153   gtk_tool_item_set_expand (tool_item, !gtk_tool_item_get_expand (tool_item));
154   g_object_unref (tool_item);
155
156   gtk_tree_model_row_changed (model, path, &iter);
157   gtk_tree_path_free (path);
158 }
159
160 static void
161 set_homogeneous_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
162                      GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
163 {
164   GtkToolItem *tool_item;
165
166   gtk_tree_model_get (model, iter, 0, &tool_item, -1);
167
168   g_object_set (cell, "active", gtk_tool_item_get_homogeneous (tool_item), NULL);
169   g_object_unref (tool_item);
170 }
171
172 static void
173 homogeneous_toggled(GtkCellRendererToggle *cell, const gchar *path_str,
174                     GtkTreeModel *model)
175 {
176   GtkTreePath *path;
177   GtkTreeIter iter;
178   GtkToolItem *tool_item;
179
180   path = gtk_tree_path_new_from_string (path_str);
181   gtk_tree_model_get_iter (model, &iter, path);
182
183   gtk_tree_model_get (model, &iter, 0, &tool_item, -1);
184   gtk_tool_item_set_homogeneous (tool_item, !gtk_tool_item_get_homogeneous (tool_item));
185   g_object_unref (tool_item);
186
187   gtk_tree_model_row_changed (model, path, &iter);
188   gtk_tree_path_free (path);
189 }
190
191
192 static void
193 set_important_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
194                    GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
195 {
196   GtkToolItem *tool_item;
197
198   gtk_tree_model_get (model, iter, 0, &tool_item, -1);
199
200   g_object_set (cell, "active", gtk_tool_item_get_is_important (tool_item), NULL);
201   g_object_unref (tool_item);
202 }
203
204 static void
205 important_toggled(GtkCellRendererToggle *cell, const gchar *path_str,
206                   GtkTreeModel *model)
207 {
208   GtkTreePath *path;
209   GtkTreeIter iter;
210   GtkToolItem *tool_item;
211
212   path = gtk_tree_path_new_from_string (path_str);
213   gtk_tree_model_get_iter (model, &iter, path);
214
215   gtk_tree_model_get (model, &iter, 0, &tool_item, -1);
216   gtk_tool_item_set_is_important (tool_item, !gtk_tool_item_get_is_important (tool_item));
217   g_object_unref (tool_item);
218
219   gtk_tree_model_row_changed (model, path, &iter);
220   gtk_tree_path_free (path);
221 }
222
223 static GtkListStore *
224 create_items_list (GtkWidget **tree_view_p)
225 {
226   GtkWidget *tree_view;
227   GtkListStore *list_store;
228   GtkCellRenderer *cell;
229   
230   list_store = gtk_list_store_new (2, GTK_TYPE_TOOL_ITEM, G_TYPE_STRING);
231   
232   tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
233
234   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
235                                                -1, "Tool Item",
236                                                gtk_cell_renderer_text_new (),
237                                                "text", 1, NULL);
238
239   cell = gtk_cell_renderer_toggle_new ();
240   g_signal_connect (cell, "toggled", G_CALLBACK (visibile_toggled),
241                     list_store);
242   gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (tree_view),
243                                               -1, "Visible",
244                                               cell,
245                                               set_visible_func, NULL, NULL);
246
247   cell = gtk_cell_renderer_toggle_new ();
248   g_signal_connect (cell, "toggled", G_CALLBACK (expand_toggled),
249                     list_store);
250   gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (tree_view),
251                                               -1, "Expand",
252                                               cell,
253                                               set_expand_func, NULL, NULL);
254
255   cell = gtk_cell_renderer_toggle_new ();
256   g_signal_connect (cell, "toggled", G_CALLBACK (homogeneous_toggled),
257                     list_store);
258   gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (tree_view),
259                                               -1, "Homogeneous",
260                                               cell,
261                                               set_homogeneous_func, NULL,NULL);
262
263   cell = gtk_cell_renderer_toggle_new ();
264   g_signal_connect (cell, "toggled", G_CALLBACK (important_toggled),
265                     list_store);
266   gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (tree_view),
267                                               -1, "Important",
268                                               cell,
269                                               set_important_func, NULL,NULL);
270
271   g_object_unref (list_store);
272
273   *tree_view_p = tree_view;
274
275   return list_store;
276 }
277
278 static void
279 add_item_to_list (GtkListStore *store, GtkToolItem *item, const gchar *text)
280 {
281   GtkTreeIter iter;
282
283   gtk_list_store_append (store, &iter);
284   gtk_list_store_set (store, &iter,
285                       0, item,
286                       1, text,
287                       -1);
288   
289 }
290
291 static void
292 bold_toggled (GtkToggleToolButton *button)
293 {
294   g_message ("Bold toggled (active=%d)",
295              gtk_toggle_tool_button_get_active (button));
296 }
297
298 static void
299 set_icon_size_toggled (GtkCheckButton *button, GtkToolbar *toolbar)
300 {
301   GtkWidget *option_menu;
302   int icon_size;
303   
304   option_menu = g_object_get_data (G_OBJECT (button), "option-menu");
305
306   if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)))
307     {
308       if (gtk_combo_box_get_active (GTK_COMBO_BOX (option_menu)) == 0)
309         icon_size = GTK_ICON_SIZE_SMALL_TOOLBAR;
310       else
311         icon_size = GTK_ICON_SIZE_LARGE_TOOLBAR;
312
313       gtk_toolbar_set_icon_size (toolbar, icon_size);
314       gtk_widget_set_sensitive (option_menu, TRUE);
315     }
316   else
317     {
318       gtk_toolbar_unset_icon_size (toolbar);
319       gtk_widget_set_sensitive (option_menu, FALSE);
320     }
321 }
322
323 static void
324 icon_size_history_changed (GtkComboBox *menu, GtkToolbar *toolbar)
325 {
326   int icon_size;
327
328   if (gtk_combo_box_get_active (menu) == 0)
329     icon_size = GTK_ICON_SIZE_SMALL_TOOLBAR;
330   else
331     icon_size = GTK_ICON_SIZE_LARGE_TOOLBAR;
332
333   gtk_toolbar_set_icon_size (toolbar, icon_size);
334 }
335
336 static gboolean
337 toolbar_drag_drop (GtkWidget *widget, GdkDragContext *context,
338                    gint x, gint y, guint time, GtkWidget *label)
339 {
340   gchar buf[32];
341
342   g_snprintf(buf, sizeof(buf), "%d",
343              gtk_toolbar_get_drop_index (GTK_TOOLBAR (widget), x, y));
344   gtk_label_set_label (GTK_LABEL (label), buf);
345
346   return TRUE;
347 }
348
349 static GtkTargetEntry target_table[] = {
350   { "application/x-toolbar-item", 0, 0 }
351 };
352
353 static GtkWidget *
354 make_prop_editor (GObject *object)
355 {
356   GtkWidget *prop_editor = create_prop_editor (object, 0);
357   gtk_widget_show (prop_editor);
358   return prop_editor;
359 }
360
361 static void
362 rtl_toggled (GtkCheckButton *check)
363 {
364   if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check)))
365     gtk_widget_set_default_direction (GTK_TEXT_DIR_RTL);
366   else
367     gtk_widget_set_default_direction (GTK_TEXT_DIR_LTR);
368 }
369
370 typedef struct
371 {
372   int x;
373   int y;
374 } MenuPositionData;
375
376 static void
377 position_function (GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data)
378 {
379   /* Do not do this in your own code */
380
381   MenuPositionData *position_data = user_data;
382
383   if (x)
384     *x = position_data->x;
385
386   if (y)
387     *y = position_data->y;
388
389   if (push_in)
390     *push_in = FALSE;
391 }
392
393 static gboolean
394 popup_context_menu (GtkToolbar *toolbar, gint x, gint y, gint button_number)
395 {
396   MenuPositionData position_data;
397   
398   GtkMenu *menu = GTK_MENU (gtk_menu_new ());
399   int i;
400
401   for (i = 0; i < 5; i++)
402     {
403       GtkWidget *item;
404       gchar *label = g_strdup_printf ("Item _%d", i);
405       item = gtk_menu_item_new_with_mnemonic (label);
406       gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
407     }
408   gtk_widget_show_all (GTK_WIDGET (menu));
409
410   if (button_number != -1)
411     {
412       position_data.x = x;
413       position_data.y = y;
414       
415       gtk_menu_popup (menu, NULL, NULL, position_function,
416                       &position_data, button_number, gtk_get_current_event_time());
417     }
418   else
419     gtk_menu_popup (menu, NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time());
420
421   return TRUE;
422 }
423
424 static GtkToolItem *drag_item = NULL;
425
426 static gboolean
427 toolbar_drag_motion (GtkToolbar     *toolbar,
428                      GdkDragContext *context,
429                      gint            x,
430                      gint            y,
431                      guint           time,
432                      gpointer        null)
433 {
434   gint index;
435   
436   if (!drag_item)
437     {
438       drag_item = gtk_tool_button_new (NULL, "A quite long button");
439       g_object_ref_sink (g_object_ref (drag_item));
440     }
441   
442   gdk_drag_status (context, GDK_ACTION_MOVE, time);
443
444   index = gtk_toolbar_get_drop_index (toolbar, x, y);
445   
446   gtk_toolbar_set_drop_highlight_item (toolbar, drag_item, index);
447   
448   return TRUE;
449 }
450
451 static void
452 toolbar_drag_leave (GtkToolbar     *toolbar,
453                     GdkDragContext *context,
454                     guint           time,
455                     gpointer        null)
456 {
457   if (drag_item)
458     {
459       g_object_unref (drag_item);
460       drag_item = NULL;
461     }
462   
463   gtk_toolbar_set_drop_highlight_item (toolbar, NULL, 0);
464 }
465
466 static gboolean
467 timeout_cb (GtkWidget *widget)
468 {
469   static gboolean sensitive = TRUE;
470   
471   sensitive = !sensitive;
472   
473   gtk_widget_set_sensitive (widget, sensitive);
474   
475   return TRUE;
476 }
477
478 static gboolean
479 timeout_cb1 (GtkWidget *widget)
480 {
481         static gboolean sensitive = TRUE;
482         sensitive = !sensitive;
483         gtk_widget_set_sensitive (widget, sensitive);
484         return TRUE;
485 }
486
487 gint
488 main (gint argc, gchar **argv)
489 {
490   GtkWidget *window, *toolbar, *grid, *treeview, *scrolled_window;
491   GtkWidget *hbox, *hbox1, *hbox2, *checkbox, *option_menu, *menu;
492   gint i;
493   static const gchar *toolbar_styles[] = { "icons", "text", "both (vertical)",
494                                            "both (horizontal)" };
495   GtkToolItem *item;
496   GtkListStore *store;
497   GtkWidget *image;
498   GtkWidget *menuitem;
499   GtkWidget *button;
500   GtkWidget *label;
501   GIcon *gicon;
502   GSList *group;
503   
504   gtk_init (&argc, &argv);
505
506   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
507
508   g_signal_connect (window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
509
510   grid = gtk_grid_new ();
511   gtk_container_add (GTK_CONTAINER (window), grid);
512
513   toolbar = gtk_toolbar_new ();
514   gtk_widget_set_vexpand (toolbar, TRUE);
515   gtk_grid_attach (GTK_GRID (grid), toolbar, 0, 0, 2, 1);
516
517   hbox1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
518   gtk_container_set_border_width (GTK_CONTAINER (hbox1), 5);
519   gtk_widget_set_vexpand (hbox1, TRUE);
520   gtk_grid_attach (GTK_GRID (grid), hbox1, 1, 1, 1, 1);
521
522   hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
523   gtk_container_set_border_width (GTK_CONTAINER (hbox2), 5);
524   gtk_widget_set_vexpand (hbox2, TRUE);
525   gtk_grid_attach (GTK_GRID (grid), hbox2, 1, 2, 1, 1);
526
527   checkbox = gtk_check_button_new_with_mnemonic("_Vertical");
528   gtk_box_pack_start (GTK_BOX (hbox1), checkbox, FALSE, FALSE, 0);
529   g_signal_connect (checkbox, "toggled",
530                     G_CALLBACK (change_orientation), toolbar);
531
532   checkbox = gtk_check_button_new_with_mnemonic("_Show Arrow");
533   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), TRUE);
534   gtk_box_pack_start (GTK_BOX (hbox1), checkbox, FALSE, FALSE, 0);
535   g_signal_connect (checkbox, "toggled",
536                     G_CALLBACK (change_show_arrow), toolbar);
537
538   checkbox = gtk_check_button_new_with_mnemonic("_Set Toolbar Style:");
539   g_signal_connect (checkbox, "toggled", G_CALLBACK (set_toolbar_style_toggled), toolbar);
540   gtk_box_pack_start (GTK_BOX (hbox1), checkbox, FALSE, FALSE, 0);
541
542   option_menu = gtk_combo_box_text_new ();
543   gtk_widget_set_sensitive (option_menu, FALSE);  
544   g_object_set_data (G_OBJECT (checkbox), "option-menu", option_menu);
545   
546   for (i = 0; i < G_N_ELEMENTS (toolbar_styles); i++)
547     gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (option_menu), toolbar_styles[i]);
548   gtk_combo_box_set_active (GTK_COMBO_BOX (option_menu),
549                             gtk_toolbar_get_style (GTK_TOOLBAR (toolbar)));
550   gtk_box_pack_start (GTK_BOX (hbox2), option_menu, FALSE, FALSE, 0);
551   g_signal_connect (option_menu, "changed",
552                     G_CALLBACK (change_toolbar_style), toolbar);
553
554   checkbox = gtk_check_button_new_with_mnemonic("_Set Icon Size:"); 
555   g_signal_connect (checkbox, "toggled", G_CALLBACK (set_icon_size_toggled), toolbar);
556   gtk_box_pack_start (GTK_BOX (hbox2), checkbox, FALSE, FALSE, 0);
557
558   option_menu = gtk_combo_box_text_new ();
559   g_object_set_data (G_OBJECT (checkbox), "option-menu", option_menu);
560   gtk_widget_set_sensitive (option_menu, FALSE);
561   gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (option_menu), "small toolbar");
562   gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (option_menu), "large toolbar");
563
564   gtk_box_pack_start (GTK_BOX (hbox2), option_menu, FALSE, FALSE, 0);
565   g_signal_connect (option_menu, "changed",
566                     G_CALLBACK (icon_size_history_changed), toolbar);
567   
568   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
569   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
570                                   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
571   gtk_widget_set_hexpand (scrolled_window, TRUE);
572   gtk_widget_set_vexpand (scrolled_window, TRUE);
573   gtk_grid_attach (GTK_GRID (grid), scrolled_window, 1, 3, 1, 1);
574
575   store = create_items_list (&treeview);
576   gtk_container_add (GTK_CONTAINER (scrolled_window), treeview);
577   
578   item = gtk_tool_button_new_from_stock (GTK_STOCK_NEW);
579   gtk_tool_button_set_label (GTK_TOOL_BUTTON (item), "Custom label");
580   gtk_tool_button_set_label (GTK_TOOL_BUTTON (item), NULL);
581   add_item_to_list (store, item, "New");
582   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
583   gdk_threads_add_timeout (3000, (GSourceFunc) timeout_cb, item);
584   gtk_tool_item_set_expand (item, TRUE);
585
586   menu = gtk_menu_new ();
587   for (i = 0; i < 20; i++)
588     {
589       char *text;
590       text = g_strdup_printf ("Menuitem %d", i);
591       menuitem = gtk_menu_item_new_with_label (text);
592       g_free (text);
593       gtk_widget_show (menuitem);
594       gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
595     }
596
597   item = gtk_menu_tool_button_new_from_stock (GTK_STOCK_OPEN);
598   gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (item), menu);
599   add_item_to_list (store, item, "Open");
600   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
601   gdk_threads_add_timeout (3000, (GSourceFunc) timeout_cb1, item);
602  
603   menu = gtk_menu_new ();
604   for (i = 0; i < 20; i++)
605     {
606       char *text;
607       text = g_strdup_printf ("A%d", i);
608       menuitem = gtk_menu_item_new_with_label (text);
609       g_free (text);
610       gtk_widget_show (menuitem);
611       gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
612     }
613
614   item = gtk_menu_tool_button_new_from_stock (GTK_STOCK_GO_BACK);
615   gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (item), menu);
616   add_item_to_list (store, item, "BackWithHistory");
617   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
618  
619   item = gtk_separator_tool_item_new ();
620   add_item_to_list (store, item, "-----");    
621   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
622   
623   image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG);
624   item = gtk_tool_item_new ();
625   gtk_widget_show (image);
626   gtk_container_add (GTK_CONTAINER (item), image);
627   add_item_to_list (store, item, "(Custom Item)");    
628   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
629   
630   item = gtk_tool_button_new_from_stock (GTK_STOCK_GO_BACK);
631   add_item_to_list (store, item, "Back");    
632   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
633
634   item = gtk_separator_tool_item_new ();
635   add_item_to_list (store, item, "-----");  
636   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
637   
638   item = gtk_tool_button_new_from_stock (GTK_STOCK_GO_FORWARD);
639   add_item_to_list (store, item, "Forward");  
640   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
641
642   item = gtk_toggle_tool_button_new_from_stock (GTK_STOCK_BOLD);
643   g_signal_connect (item, "toggled", G_CALLBACK (bold_toggled), NULL);
644   add_item_to_list (store, item, "Bold");  
645   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
646   gtk_widget_set_sensitive (GTK_WIDGET (item), FALSE);
647
648   item = gtk_separator_tool_item_new ();
649   add_item_to_list (store, item, "-----");  
650   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
651   gtk_tool_item_set_expand (item, TRUE);
652   gtk_separator_tool_item_set_draw (GTK_SEPARATOR_TOOL_ITEM (item), FALSE);
653   g_assert (gtk_toolbar_get_nth_item (GTK_TOOLBAR (toolbar), 0) != 0);
654   
655   item = gtk_radio_tool_button_new_from_stock (NULL, GTK_STOCK_JUSTIFY_LEFT);
656   group = gtk_radio_tool_button_get_group (GTK_RADIO_TOOL_BUTTON (item));
657   add_item_to_list (store, item, "Left");
658   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
659   
660   
661   item = gtk_radio_tool_button_new_from_stock (group, GTK_STOCK_JUSTIFY_CENTER);
662   make_prop_editor (G_OBJECT (item));
663
664   group = gtk_radio_tool_button_get_group (GTK_RADIO_TOOL_BUTTON (item));
665   add_item_to_list (store, item, "Center");
666   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
667
668   item = gtk_radio_tool_button_new_from_stock (group, GTK_STOCK_JUSTIFY_RIGHT);
669   add_item_to_list (store, item, "Right");
670   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
671
672   item = gtk_tool_button_new (gtk_image_new_from_file ("apple-red.png"), "_Apple");
673   add_item_to_list (store, item, "Apple");
674   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
675   gtk_tool_button_set_use_underline (GTK_TOOL_BUTTON (item), TRUE);
676
677   gicon = g_content_type_get_icon ("video/ogg");
678   image = gtk_image_new_from_gicon (gicon, GTK_ICON_SIZE_LARGE_TOOLBAR);
679   g_object_unref (gicon);
680   item = gtk_tool_button_new (image, "Video");
681   add_item_to_list (store, item, "Video");
682   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
683
684   image = gtk_image_new_from_icon_name ("utilities-terminal", GTK_ICON_SIZE_LARGE_TOOLBAR);
685   item = gtk_tool_button_new (image, "Terminal");
686   add_item_to_list (store, item, "Terminal");
687   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
688
689   image = gtk_spinner_new ();
690   gtk_spinner_start (GTK_SPINNER (image));
691   item = gtk_tool_button_new (image, "Spinner");
692   add_item_to_list (store, item, "Spinner");
693   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
694
695   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
696   gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
697   gtk_widget_set_hexpand (hbox, TRUE);
698   gtk_grid_attach (GTK_GRID (grid), hbox, 1, 4, 1, 1);
699
700   button = gtk_button_new_with_label ("Drag me to the toolbar");
701   gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
702
703   label = gtk_label_new ("Drop index:");
704   gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
705
706   label = gtk_label_new ("");
707   gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
708
709   checkbox = gtk_check_button_new_with_mnemonic("_Right to left");
710   if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
711     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), TRUE);
712   else
713     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), FALSE);
714   g_signal_connect (checkbox, "toggled", G_CALLBACK (rtl_toggled), NULL);
715
716   gtk_box_pack_end (GTK_BOX (hbox), checkbox, FALSE, FALSE, 0);
717   
718   gtk_drag_source_set (button, GDK_BUTTON1_MASK,
719                        target_table, G_N_ELEMENTS (target_table),
720                        GDK_ACTION_MOVE);
721   gtk_drag_dest_set (toolbar, GTK_DEST_DEFAULT_DROP,
722                      target_table, G_N_ELEMENTS (target_table),
723                      GDK_ACTION_MOVE);
724   g_signal_connect (toolbar, "drag_motion",
725                     G_CALLBACK (toolbar_drag_motion), NULL);
726   g_signal_connect (toolbar, "drag_leave",
727                     G_CALLBACK (toolbar_drag_leave), NULL);
728   g_signal_connect (toolbar, "drag_drop",
729                     G_CALLBACK (toolbar_drag_drop), label);
730
731   gtk_widget_show_all (window);
732
733   make_prop_editor (G_OBJECT (toolbar));
734
735   g_signal_connect (window, "delete_event", G_CALLBACK (gtk_main_quit), NULL);
736   
737   g_signal_connect (toolbar, "popup_context_menu", G_CALLBACK (popup_context_menu), NULL);
738   
739   gtk_main ();
740   
741   return 0;
742 }