]> Pileus Git - ~andy/gtk/blob - tests/testtoolbar.c
connect to "delete_event" so the application will actually quit when you
[~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 #undef GTK_DISABLE_DEPRECATED
23 #include <gtk/gtk.h>
24 #include "prop-editor.h"
25
26 static void
27 reload_clicked (GtkWidget *widget)
28 {
29   static GdkAtom atom_rcfiles = GDK_NONE;
30
31   GdkEventClient sev;
32   int i;
33   
34   if (!atom_rcfiles)
35     atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
36
37   for(i = 0; i < 5; i++)
38     sev.data.l[i] = 0;
39   sev.data_format = 32;
40   sev.message_type = atom_rcfiles;
41   gdk_event_send_clientmessage_toall ((GdkEvent *) &sev);
42 }
43
44 static void
45 change_orientation (GtkWidget *button, GtkWidget *toolbar)
46 {
47   GtkWidget *table;
48   GtkOrientation orientation;
49
50   table = gtk_widget_get_parent (toolbar);
51   if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)))
52     orientation = GTK_ORIENTATION_VERTICAL;
53   else
54     orientation = GTK_ORIENTATION_HORIZONTAL;
55
56   g_object_ref (toolbar);
57   gtk_container_remove (GTK_CONTAINER (table), toolbar);
58   gtk_toolbar_set_orientation (GTK_TOOLBAR (toolbar), orientation);
59   if (orientation == GTK_ORIENTATION_HORIZONTAL)
60     {
61       gtk_table_attach (GTK_TABLE (table), toolbar,
62                         0,2, 0,1, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0);
63     }
64   else
65     {
66       gtk_table_attach (GTK_TABLE (table), toolbar,
67                         0,1, 0,4, GTK_FILL, GTK_FILL|GTK_EXPAND, 0, 0);
68     }
69   g_object_unref (toolbar);
70 }
71
72 static void
73 change_show_arrow (GtkWidget *button, GtkWidget *toolbar)
74 {
75   gtk_toolbar_set_show_arrow (GTK_TOOLBAR (toolbar),
76                 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)));
77 }
78
79 static void
80 set_toolbar_style_toggled (GtkCheckButton *button, GtkToolbar *toolbar)
81 {
82   GtkWidget *option_menu;
83   int style;
84   
85   option_menu = g_object_get_data (G_OBJECT (button), "option-menu");
86
87   if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)))
88     {
89       style = gtk_option_menu_get_history (GTK_OPTION_MENU (option_menu));
90
91       gtk_toolbar_set_style (toolbar, style);
92       gtk_widget_set_sensitive (option_menu, TRUE);
93     }
94   else
95     {
96       gtk_toolbar_unset_style (toolbar);
97       gtk_widget_set_sensitive (option_menu, FALSE);
98     }
99 }
100
101 static void
102 change_toolbar_style (GtkWidget *option_menu, GtkWidget *toolbar)
103 {
104   GtkToolbarStyle style;
105
106   style = gtk_option_menu_get_history (GTK_OPTION_MENU (option_menu));
107   gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), style);
108 }
109
110 static void
111 set_visible_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
112                  GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
113 {
114   GtkToolItem *tool_item;
115   gboolean visible;
116
117   gtk_tree_model_get (model, iter, 0, &tool_item, -1);
118
119   g_object_get (G_OBJECT (tool_item), "visible", &visible, NULL);
120   g_object_set (G_OBJECT (cell), "active", visible, NULL);
121   g_object_unref (tool_item);
122 }
123
124 static void
125 visibile_toggled(GtkCellRendererToggle *cell, const gchar *path_str,
126                  GtkTreeModel *model)
127 {
128   GtkTreePath *path;
129   GtkTreeIter iter;
130   GtkToolItem *tool_item;
131   gboolean visible;
132
133   path = gtk_tree_path_new_from_string (path_str);
134   gtk_tree_model_get_iter (model, &iter, path);
135
136   gtk_tree_model_get (model, &iter, 0, &tool_item, -1);
137   g_object_get (G_OBJECT (tool_item), "visible", &visible, NULL);
138   g_object_set (G_OBJECT (tool_item), "visible", !visible, NULL);
139   g_object_unref (tool_item);
140
141   gtk_tree_model_row_changed (model, path, &iter);
142   gtk_tree_path_free (path);
143 }
144
145 static void
146 set_expand_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
147                 GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
148 {
149   GtkToolItem *tool_item;
150
151   gtk_tree_model_get (model, iter, 0, &tool_item, -1);
152
153   g_object_set (G_OBJECT (cell), "active", gtk_tool_item_get_expand (tool_item), NULL);
154   g_object_unref (tool_item);
155 }
156
157 static void
158 expand_toggled(GtkCellRendererToggle *cell, const gchar *path_str,
159                GtkTreeModel *model)
160 {
161   GtkTreePath *path;
162   GtkTreeIter iter;
163   GtkToolItem *tool_item;
164
165   path = gtk_tree_path_new_from_string (path_str);
166   gtk_tree_model_get_iter (model, &iter, path);
167
168   gtk_tree_model_get (model, &iter, 0, &tool_item, -1);
169   gtk_tool_item_set_expand (tool_item, !gtk_tool_item_get_expand (tool_item));
170   g_object_unref (tool_item);
171
172   gtk_tree_model_row_changed (model, path, &iter);
173   gtk_tree_path_free (path);
174 }
175
176 static void
177 set_pack_end_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
178                   GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
179 {
180   GtkToolItem *tool_item;
181
182   gtk_tree_model_get (model, iter, 0, &tool_item, -1);
183
184   g_object_set (G_OBJECT (cell), "active", gtk_tool_item_get_pack_end (tool_item), NULL);
185   g_object_unref (tool_item);
186 }
187
188 static void
189 pack_end_toggled(GtkCellRendererToggle *cell, const gchar *path_str,
190                  GtkTreeModel *model)
191 {
192   GtkTreePath *path;
193   GtkTreeIter iter;
194   GtkToolItem *tool_item;
195
196   path = gtk_tree_path_new_from_string (path_str);
197   gtk_tree_model_get_iter (model, &iter, path);
198
199   gtk_tree_model_get (model, &iter, 0, &tool_item, -1);
200   gtk_tool_item_set_pack_end (tool_item, !gtk_tool_item_get_pack_end (tool_item));
201   g_object_unref (tool_item);
202
203   gtk_tree_model_row_changed (model, path, &iter);
204   gtk_tree_path_free (path);
205 }
206
207 static void
208 set_homogeneous_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
209                      GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
210 {
211   GtkToolItem *tool_item;
212
213   gtk_tree_model_get (model, iter, 0, &tool_item, -1);
214
215   g_object_set (G_OBJECT (cell), "active", gtk_tool_item_get_homogeneous (tool_item), NULL);
216   g_object_unref (tool_item);
217 }
218
219 static void
220 homogeneous_toggled(GtkCellRendererToggle *cell, const gchar *path_str,
221                     GtkTreeModel *model)
222 {
223   GtkTreePath *path;
224   GtkTreeIter iter;
225   GtkToolItem *tool_item;
226
227   path = gtk_tree_path_new_from_string (path_str);
228   gtk_tree_model_get_iter (model, &iter, path);
229
230   gtk_tree_model_get (model, &iter, 0, &tool_item, -1);
231   gtk_tool_item_set_homogeneous (tool_item, !gtk_tool_item_get_homogeneous (tool_item));
232   g_object_unref (tool_item);
233
234   gtk_tree_model_row_changed (model, path, &iter);
235   gtk_tree_path_free (path);
236 }
237
238
239 static void
240 set_important_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
241                    GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
242 {
243   GtkToolItem *tool_item;
244
245   gtk_tree_model_get (model, iter, 0, &tool_item, -1);
246
247   g_object_set (G_OBJECT (cell), "active", gtk_tool_item_get_is_important (tool_item), NULL);
248   g_object_unref (tool_item);
249 }
250
251 static void
252 important_toggled(GtkCellRendererToggle *cell, const gchar *path_str,
253                   GtkTreeModel *model)
254 {
255   GtkTreePath *path;
256   GtkTreeIter iter;
257   GtkToolItem *tool_item;
258
259   path = gtk_tree_path_new_from_string (path_str);
260   gtk_tree_model_get_iter (model, &iter, path);
261
262   gtk_tree_model_get (model, &iter, 0, &tool_item, -1);
263   gtk_tool_item_set_is_important (tool_item, !gtk_tool_item_get_is_important (tool_item));
264   g_object_unref (tool_item);
265
266   gtk_tree_model_row_changed (model, path, &iter);
267   gtk_tree_path_free (path);
268 }
269
270 static GtkListStore *
271 create_items_list (GtkWidget **tree_view_p)
272 {
273   GtkWidget *tree_view;
274   GtkListStore *list_store;
275   GtkCellRenderer *cell;
276   
277   list_store = gtk_list_store_new (2, GTK_TYPE_TOOL_ITEM, G_TYPE_STRING);
278   
279   tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
280
281   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
282                                                -1, "Tool Item",
283                                                gtk_cell_renderer_text_new (),
284                                                "text", 1, NULL);
285
286   cell = gtk_cell_renderer_toggle_new ();
287   g_signal_connect (cell, "toggled", G_CALLBACK (visibile_toggled),
288                     list_store);
289   gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (tree_view),
290                                               -1, "Visible",
291                                               cell,
292                                               set_visible_func, NULL, NULL);
293
294   cell = gtk_cell_renderer_toggle_new ();
295   g_signal_connect (cell, "toggled", G_CALLBACK (expand_toggled),
296                     list_store);
297   gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (tree_view),
298                                               -1, "Expand",
299                                               cell,
300                                               set_expand_func, NULL, NULL);
301
302   cell = gtk_cell_renderer_toggle_new ();
303   g_signal_connect (cell, "toggled", G_CALLBACK (pack_end_toggled),
304                     list_store);
305   gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (tree_view),
306                                               -1, "Pack End",
307                                               cell,
308                                               set_pack_end_func, NULL, NULL);
309
310   cell = gtk_cell_renderer_toggle_new ();
311   g_signal_connect (cell, "toggled", G_CALLBACK (homogeneous_toggled),
312                     list_store);
313   gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (tree_view),
314                                               -1, "Homogeneous",
315                                               cell,
316                                               set_homogeneous_func, NULL,NULL);
317
318   cell = gtk_cell_renderer_toggle_new ();
319   g_signal_connect (cell, "toggled", G_CALLBACK (important_toggled),
320                     list_store);
321   gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (tree_view),
322                                               -1, "Important",
323                                               cell,
324                                               set_important_func, NULL,NULL);
325
326   g_object_unref (list_store);
327
328   *tree_view_p = tree_view;
329
330   return list_store;
331 }
332
333 static void
334 add_item_to_list (GtkListStore *store, GtkToolItem *item, const gchar *text)
335 {
336   GtkTreeIter iter;
337
338   gtk_list_store_append (store, &iter);
339   gtk_list_store_set (store, &iter,
340                       0, item,
341                       1, text,
342                       -1);
343   
344 }
345
346 static void
347 bold_toggled (GtkToggleToolButton *button)
348 {
349   g_message ("Bold toggled (active=%d)",
350              gtk_toggle_tool_button_get_active (button));
351 }
352
353 static void
354 set_icon_size_toggled (GtkCheckButton *button, GtkToolbar *toolbar)
355 {
356   GtkWidget *option_menu;
357   int icon_size;
358   
359   option_menu = g_object_get_data (G_OBJECT (button), "option-menu");
360
361   if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)))
362     {
363       icon_size = gtk_option_menu_get_history (GTK_OPTION_MENU (option_menu));
364       icon_size += GTK_ICON_SIZE_SMALL_TOOLBAR;
365
366       gtk_toolbar_set_icon_size (toolbar, icon_size);
367       gtk_widget_set_sensitive (option_menu, TRUE);
368     }
369   else
370     {
371       gtk_toolbar_unset_icon_size (toolbar);
372       gtk_widget_set_sensitive (option_menu, FALSE);
373     }
374 }
375
376 static void
377 icon_size_history_changed (GtkOptionMenu *menu, GtkToolbar *toolbar)
378 {
379   int icon_size;
380
381   icon_size = gtk_option_menu_get_history (menu);
382   icon_size += GTK_ICON_SIZE_SMALL_TOOLBAR;
383
384   gtk_toolbar_set_icon_size (toolbar, icon_size);
385 }
386
387 static gboolean
388 toolbar_drag_drop (GtkWidget *widget, GdkDragContext *context,
389                    gint x, gint y, guint time, GtkWidget *label)
390 {
391   gchar buf[32];
392
393   g_snprintf(buf, sizeof(buf), "%d",
394              gtk_toolbar_get_drop_index (GTK_TOOLBAR (widget), x, y));
395   gtk_label_set_label (GTK_LABEL (label), buf);
396
397   return TRUE;
398 }
399
400 static GtkTargetEntry target_table[] = {
401   { "application/x-toolbar-item", 0, 0 }
402 };
403
404 static GtkWidget *
405 make_prop_editor (GObject *object)
406 {
407   GtkWidget *prop_editor = create_prop_editor (object, 0);
408   gtk_widget_show (prop_editor);
409   return prop_editor;
410 }
411
412 static void
413 rtl_toggled (GtkCheckButton *check)
414 {
415   if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check)))
416     gtk_widget_set_default_direction (GTK_TEXT_DIR_RTL);
417   else
418     gtk_widget_set_default_direction (GTK_TEXT_DIR_LTR);
419 }
420
421 typedef struct
422 {
423   int x;
424   int y;
425 } MenuPositionData;
426
427 static void
428 position_function (GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data)
429 {
430   /* Do not do this in your own code */
431
432   MenuPositionData *position_data = user_data;
433
434   if (x)
435     *x = position_data->x;
436
437   if (y)
438     *y = position_data->y;
439
440   if (push_in)
441     *push_in = FALSE;
442 }
443
444 static gboolean
445 popup_context_menu (GtkToolbar *toolbar, gint x, gint y, gint button_number)
446 {
447   MenuPositionData position_data;
448   
449   GtkMenu *menu = GTK_MENU (gtk_menu_new ());
450   int i;
451
452   for (i = 0; i < 5; i++)
453     {
454       GtkWidget *item;
455       gchar *label = g_strdup_printf ("Item _%d", i);
456       item = gtk_menu_item_new_with_mnemonic (label);
457       gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
458     }
459   gtk_widget_show_all (GTK_WIDGET (menu));
460
461   if (button_number != -1)
462     {
463       position_data.x = x;
464       position_data.y = y;
465       
466       gtk_menu_popup (menu, NULL, NULL, position_function,
467                       &position_data, button_number, gtk_get_current_event_time());
468     }
469   else
470     gtk_menu_popup (menu, NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time());
471
472   return TRUE;
473 }
474
475 gint
476 main (gint argc, gchar **argv)
477 {
478   GtkWidget *window, *toolbar, *table, *treeview, *scrolled_window;
479   GtkWidget *hbox, *checkbox, *option_menu, *menu;
480   gint i;
481   static const gchar *toolbar_styles[] = { "icons", "text", "both (vertical)",
482                                            "both (horizontal)" };
483   GtkToolItem *item;
484   GtkListStore *store;
485   GtkWidget *image;
486   GtkWidget *menuitem;
487   GtkWidget *button;
488   GtkWidget *label;
489   GSList *group;
490   
491   gtk_init (&argc, &argv);
492
493   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
494
495   g_signal_connect (window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
496
497   table = gtk_table_new (4, 2, FALSE);
498   gtk_container_add (GTK_CONTAINER (window), table);
499
500   toolbar = gtk_toolbar_new ();
501   gtk_table_attach (GTK_TABLE (table), toolbar,
502                     0,2, 0,1, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0);
503
504   hbox = gtk_hbox_new (FALSE, 5);
505   gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
506   gtk_table_attach (GTK_TABLE (table), hbox,
507                     1,2, 1,2, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0);
508
509   checkbox = gtk_check_button_new_with_mnemonic("_Vertical");
510   gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, FALSE, 0);
511   g_signal_connect (checkbox, "toggled",
512                     G_CALLBACK (change_orientation), toolbar);
513
514   checkbox = gtk_check_button_new_with_mnemonic("_Show Arrow");
515   gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, FALSE, 0);
516   g_signal_connect (checkbox, "toggled",
517                     G_CALLBACK (change_show_arrow), toolbar);
518
519   checkbox = gtk_check_button_new_with_mnemonic("_Set Toolbar Style:");
520   g_signal_connect (checkbox, "toggled", G_CALLBACK (set_toolbar_style_toggled), toolbar);
521   gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, FALSE, 0);
522   
523   option_menu = gtk_option_menu_new();
524   gtk_widget_set_sensitive (option_menu, FALSE);  
525   g_object_set_data (G_OBJECT (checkbox), "option-menu", option_menu);
526   
527   menu = gtk_menu_new();
528   for (i = 0; i < G_N_ELEMENTS (toolbar_styles); i++)
529     {
530       GtkWidget *menuitem;
531
532       menuitem = gtk_menu_item_new_with_label (toolbar_styles[i]);
533       gtk_container_add (GTK_CONTAINER (menu), menuitem);
534       gtk_widget_show (menuitem);
535     }
536   gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), menu);
537   gtk_option_menu_set_history (GTK_OPTION_MENU (option_menu),
538                                GTK_TOOLBAR (toolbar)->style);
539   gtk_box_pack_start (GTK_BOX (hbox), option_menu, FALSE, FALSE, 0);
540   g_signal_connect (option_menu, "changed",
541                     G_CALLBACK (change_toolbar_style), toolbar);
542
543   checkbox = gtk_check_button_new_with_mnemonic("_Set Icon Size:"); 
544   g_signal_connect (checkbox, "toggled", G_CALLBACK (set_icon_size_toggled), toolbar);
545   gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, FALSE, 0);
546
547   option_menu = gtk_option_menu_new();
548   g_object_set_data (G_OBJECT (checkbox), "option-menu", option_menu);
549   gtk_widget_set_sensitive (option_menu, FALSE);
550   menu = gtk_menu_new();
551   menuitem = gtk_menu_item_new_with_label ("small toolbar");
552   g_object_set_data (G_OBJECT (menuitem), "value-id", GINT_TO_POINTER (GTK_ICON_SIZE_SMALL_TOOLBAR));
553   gtk_container_add (GTK_CONTAINER (menu), menuitem);
554   gtk_widget_show (menuitem);
555
556   menuitem = gtk_menu_item_new_with_label ("large toolbar");
557   g_object_set_data (G_OBJECT (menuitem), "value-id", GINT_TO_POINTER (GTK_ICON_SIZE_LARGE_TOOLBAR));
558   gtk_container_add (GTK_CONTAINER (menu), menuitem);
559   gtk_widget_show (menuitem);
560
561   gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), menu);
562   gtk_box_pack_start (GTK_BOX (hbox), option_menu, FALSE, FALSE, 0);
563   g_signal_connect (option_menu, "changed",
564                     G_CALLBACK (icon_size_history_changed), toolbar);
565   
566   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
567   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
568                                   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
569   gtk_table_attach (GTK_TABLE (table), scrolled_window,
570                     1,2, 2,3, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0);
571
572   store = create_items_list (&treeview);
573   gtk_container_add (GTK_CONTAINER (scrolled_window), treeview);
574   
575   item = gtk_tool_button_new_from_stock (GTK_STOCK_NEW);
576   gtk_tool_button_set_label (GTK_TOOL_BUTTON (item), "Custom label");
577   gtk_tool_button_set_label (GTK_TOOL_BUTTON (item), NULL);
578   add_item_to_list (store, item, "New");
579   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
580
581   item = gtk_tool_button_new_from_stock (GTK_STOCK_OPEN);
582   add_item_to_list (store, item, "Open");
583   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
584
585   item = gtk_separator_tool_item_new ();
586   add_item_to_list (store, item, "-----");    
587   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
588   
589   item = gtk_tool_button_new_from_stock (GTK_STOCK_REFRESH);
590   add_item_to_list (store, item, "Refresh");
591   g_signal_connect (item, "clicked", G_CALLBACK (reload_clicked), NULL);
592   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
593
594   image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG);
595   item = gtk_tool_item_new ();
596   gtk_widget_show (image);
597   gtk_container_add (GTK_CONTAINER (item), image);
598   add_item_to_list (store, item, "(Custom Item)");    
599   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
600   
601   item = gtk_tool_button_new_from_stock (GTK_STOCK_GO_BACK);
602   add_item_to_list (store, item, "Back");    
603   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
604
605   item = gtk_separator_tool_item_new ();
606   add_item_to_list (store, item, "-----");  
607   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
608   
609   item = gtk_tool_button_new_from_stock (GTK_STOCK_GO_FORWARD);
610   add_item_to_list (store, item, "Forward");  
611   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
612
613   item = gtk_toggle_tool_button_new_from_stock (GTK_STOCK_BOLD);
614   g_signal_connect (item, "toggled", G_CALLBACK (bold_toggled), NULL);
615   add_item_to_list (store, item, "Bold");  
616   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
617
618   item = gtk_separator_tool_item_new ();
619   add_item_to_list (store, item, "-----");  
620   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
621
622   item = gtk_radio_tool_button_new_from_stock (NULL, GTK_STOCK_JUSTIFY_LEFT);
623   group = gtk_radio_tool_button_get_group (GTK_RADIO_TOOL_BUTTON (item));
624   add_item_to_list (store, item, "Left");
625   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
626   
627   item = gtk_radio_tool_button_new_from_stock (group, GTK_STOCK_JUSTIFY_CENTER);  make_prop_editor (G_OBJECT (item));
628
629   group = gtk_radio_tool_button_get_group (GTK_RADIO_TOOL_BUTTON (item));
630   add_item_to_list (store, item, "Center");
631   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
632
633   item = gtk_radio_tool_button_new_from_stock (group, GTK_STOCK_JUSTIFY_RIGHT);
634   add_item_to_list (store, item, "Right");
635   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
636
637   item = gtk_tool_button_new (gtk_image_new_from_file ("apple-red.png"), "_Apple");
638   add_item_to_list (store, item, "Apple");
639   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
640   gtk_tool_button_set_use_underline (GTK_TOOL_BUTTON (item), TRUE);
641   
642   hbox = gtk_hbox_new (FALSE, 5);
643   gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
644   gtk_table_attach (GTK_TABLE (table), hbox,
645                     1,2, 3,4, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0);
646
647   button = gtk_button_new_with_label ("Drag me to the toolbar");
648   gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
649
650   label = gtk_label_new ("Drop index:");
651   gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
652
653   label = gtk_label_new ("");
654   gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
655
656   checkbox = gtk_check_button_new_with_mnemonic("_Right to left");
657   if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
658     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), TRUE);
659   else
660     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), FALSE);
661   g_signal_connect (checkbox, "toggled", G_CALLBACK (rtl_toggled), NULL);
662
663   gtk_box_pack_end (GTK_BOX (hbox), checkbox, FALSE, FALSE, 0);
664   
665   gtk_drag_source_set (button, GDK_BUTTON1_MASK,
666                        target_table, G_N_ELEMENTS (target_table),
667                        GDK_ACTION_MOVE);
668   gtk_drag_dest_set (toolbar, GTK_DEST_DEFAULT_DROP,
669                      target_table, G_N_ELEMENTS (target_table),
670                      GDK_ACTION_MOVE);
671   g_signal_connect (toolbar, "drag_drop",
672                     G_CALLBACK (toolbar_drag_drop), label);
673
674   gtk_widget_show_all (window);
675
676   make_prop_editor (G_OBJECT (toolbar));
677
678   g_signal_connect (window, "delete_event", G_CALLBACK (gtk_main_quit), NULL);
679   
680   g_signal_connect (toolbar, "popup_context_menu", G_CALLBACK (popup_context_menu), NULL);
681   
682   gtk_main ();
683   
684   return 0;
685 }