]> Pileus Git - ~andy/gtk/blob - tests/testtoolbar.c
Make it work even when item 0 is a placeholder. (#125826) add an assertion
[~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_homogeneous_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_homogeneous (tool_item), NULL);
185   g_object_unref (tool_item);
186 }
187
188 static void
189 homogeneous_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_homogeneous (tool_item, !gtk_tool_item_get_homogeneous (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
208 static void
209 set_important_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
210                    GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
211 {
212   GtkToolItem *tool_item;
213
214   gtk_tree_model_get (model, iter, 0, &tool_item, -1);
215
216   g_object_set (G_OBJECT (cell), "active", gtk_tool_item_get_is_important (tool_item), NULL);
217   g_object_unref (tool_item);
218 }
219
220 static void
221 important_toggled(GtkCellRendererToggle *cell, const gchar *path_str,
222                   GtkTreeModel *model)
223 {
224   GtkTreePath *path;
225   GtkTreeIter iter;
226   GtkToolItem *tool_item;
227
228   path = gtk_tree_path_new_from_string (path_str);
229   gtk_tree_model_get_iter (model, &iter, path);
230
231   gtk_tree_model_get (model, &iter, 0, &tool_item, -1);
232   gtk_tool_item_set_is_important (tool_item, !gtk_tool_item_get_is_important (tool_item));
233   g_object_unref (tool_item);
234
235   gtk_tree_model_row_changed (model, path, &iter);
236   gtk_tree_path_free (path);
237 }
238
239 static GtkListStore *
240 create_items_list (GtkWidget **tree_view_p)
241 {
242   GtkWidget *tree_view;
243   GtkListStore *list_store;
244   GtkCellRenderer *cell;
245   
246   list_store = gtk_list_store_new (2, GTK_TYPE_TOOL_ITEM, G_TYPE_STRING);
247   
248   tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
249
250   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
251                                                -1, "Tool Item",
252                                                gtk_cell_renderer_text_new (),
253                                                "text", 1, NULL);
254
255   cell = gtk_cell_renderer_toggle_new ();
256   g_signal_connect (cell, "toggled", G_CALLBACK (visibile_toggled),
257                     list_store);
258   gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (tree_view),
259                                               -1, "Visible",
260                                               cell,
261                                               set_visible_func, NULL, NULL);
262
263   cell = gtk_cell_renderer_toggle_new ();
264   g_signal_connect (cell, "toggled", G_CALLBACK (expand_toggled),
265                     list_store);
266   gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (tree_view),
267                                               -1, "Expand",
268                                               cell,
269                                               set_expand_func, NULL, NULL);
270
271   cell = gtk_cell_renderer_toggle_new ();
272   g_signal_connect (cell, "toggled", G_CALLBACK (homogeneous_toggled),
273                     list_store);
274   gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (tree_view),
275                                               -1, "Homogeneous",
276                                               cell,
277                                               set_homogeneous_func, NULL,NULL);
278
279   cell = gtk_cell_renderer_toggle_new ();
280   g_signal_connect (cell, "toggled", G_CALLBACK (important_toggled),
281                     list_store);
282   gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (tree_view),
283                                               -1, "Important",
284                                               cell,
285                                               set_important_func, NULL,NULL);
286
287   g_object_unref (list_store);
288
289   *tree_view_p = tree_view;
290
291   return list_store;
292 }
293
294 static void
295 add_item_to_list (GtkListStore *store, GtkToolItem *item, const gchar *text)
296 {
297   GtkTreeIter iter;
298
299   gtk_list_store_append (store, &iter);
300   gtk_list_store_set (store, &iter,
301                       0, item,
302                       1, text,
303                       -1);
304   
305 }
306
307 static void
308 bold_toggled (GtkToggleToolButton *button)
309 {
310   g_message ("Bold toggled (active=%d)",
311              gtk_toggle_tool_button_get_active (button));
312 }
313
314 static void
315 set_icon_size_toggled (GtkCheckButton *button, GtkToolbar *toolbar)
316 {
317   GtkWidget *option_menu;
318   int icon_size;
319   
320   option_menu = g_object_get_data (G_OBJECT (button), "option-menu");
321
322   if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)))
323     {
324       icon_size = gtk_option_menu_get_history (GTK_OPTION_MENU (option_menu));
325       icon_size += GTK_ICON_SIZE_SMALL_TOOLBAR;
326
327       gtk_toolbar_set_icon_size (toolbar, icon_size);
328       gtk_widget_set_sensitive (option_menu, TRUE);
329     }
330   else
331     {
332       gtk_toolbar_unset_icon_size (toolbar);
333       gtk_widget_set_sensitive (option_menu, FALSE);
334     }
335 }
336
337 static void
338 icon_size_history_changed (GtkOptionMenu *menu, GtkToolbar *toolbar)
339 {
340   int icon_size;
341
342   icon_size = gtk_option_menu_get_history (menu);
343   icon_size += GTK_ICON_SIZE_SMALL_TOOLBAR;
344
345   gtk_toolbar_set_icon_size (toolbar, icon_size);
346 }
347
348 static gboolean
349 toolbar_drag_drop (GtkWidget *widget, GdkDragContext *context,
350                    gint x, gint y, guint time, GtkWidget *label)
351 {
352   gchar buf[32];
353
354   g_snprintf(buf, sizeof(buf), "%d",
355              gtk_toolbar_get_drop_index (GTK_TOOLBAR (widget), x, y));
356   gtk_label_set_label (GTK_LABEL (label), buf);
357
358   return TRUE;
359 }
360
361 static GtkTargetEntry target_table[] = {
362   { "application/x-toolbar-item", 0, 0 }
363 };
364
365 static GtkWidget *
366 make_prop_editor (GObject *object)
367 {
368   GtkWidget *prop_editor = create_prop_editor (object, 0);
369   gtk_widget_show (prop_editor);
370   return prop_editor;
371 }
372
373 static void
374 rtl_toggled (GtkCheckButton *check)
375 {
376   if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check)))
377     gtk_widget_set_default_direction (GTK_TEXT_DIR_RTL);
378   else
379     gtk_widget_set_default_direction (GTK_TEXT_DIR_LTR);
380 }
381
382 typedef struct
383 {
384   int x;
385   int y;
386 } MenuPositionData;
387
388 static void
389 position_function (GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data)
390 {
391   /* Do not do this in your own code */
392
393   MenuPositionData *position_data = user_data;
394
395   if (x)
396     *x = position_data->x;
397
398   if (y)
399     *y = position_data->y;
400
401   if (push_in)
402     *push_in = FALSE;
403 }
404
405 static gboolean
406 popup_context_menu (GtkToolbar *toolbar, gint x, gint y, gint button_number)
407 {
408   MenuPositionData position_data;
409   
410   GtkMenu *menu = GTK_MENU (gtk_menu_new ());
411   int i;
412
413   for (i = 0; i < 5; i++)
414     {
415       GtkWidget *item;
416       gchar *label = g_strdup_printf ("Item _%d", i);
417       item = gtk_menu_item_new_with_mnemonic (label);
418       gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
419     }
420   gtk_widget_show_all (GTK_WIDGET (menu));
421
422   if (button_number != -1)
423     {
424       position_data.x = x;
425       position_data.y = y;
426       
427       gtk_menu_popup (menu, NULL, NULL, position_function,
428                       &position_data, button_number, gtk_get_current_event_time());
429     }
430   else
431     gtk_menu_popup (menu, NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time());
432
433   return TRUE;
434 }
435
436 static GtkToolItem *drag_item = NULL;
437
438 static gboolean
439 toolbar_drag_motion (GtkToolbar     *toolbar,
440                      GdkDragContext *context,
441                      gint            x,
442                      gint            y,
443                      guint           time,
444                      gpointer        null)
445 {
446   gint index;
447   
448   if (!drag_item)
449     {
450       drag_item = gtk_tool_button_new (NULL, "A quite long button");
451       gtk_object_sink (GTK_OBJECT (g_object_ref (drag_item)));
452     }
453   
454   gdk_drag_status (context, GDK_ACTION_MOVE, time);
455
456   index = gtk_toolbar_get_drop_index (toolbar, x, y);
457   
458   gtk_toolbar_set_drop_highlight_item (toolbar, drag_item, index);
459   
460   return TRUE;
461 }
462
463 static void
464 toolbar_drag_leave (GtkToolbar     *toolbar,
465                     GdkDragContext *context,
466                     guint           time,
467                     gpointer        null)
468 {
469   if (drag_item)
470     {
471       g_object_unref (G_OBJECT (drag_item));
472       drag_item = NULL;
473     }
474   
475   gtk_toolbar_set_drop_highlight_item (toolbar, NULL, 0);
476 }
477
478 gint
479 main (gint argc, gchar **argv)
480 {
481   GtkWidget *window, *toolbar, *table, *treeview, *scrolled_window;
482   GtkWidget *hbox, *checkbox, *option_menu, *menu;
483   gint i;
484   static const gchar *toolbar_styles[] = { "icons", "text", "both (vertical)",
485                                            "both (horizontal)" };
486   GtkToolItem *item;
487   GtkListStore *store;
488   GtkWidget *image;
489   GtkWidget *menuitem;
490   GtkWidget *button;
491   GtkWidget *label;
492   GSList *group;
493   
494   gtk_init (&argc, &argv);
495
496   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
497
498   g_signal_connect (window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
499
500   table = gtk_table_new (4, 2, FALSE);
501   gtk_container_add (GTK_CONTAINER (window), table);
502
503   toolbar = gtk_toolbar_new ();
504   gtk_table_attach (GTK_TABLE (table), toolbar,
505                     0,2, 0,1, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0);
506
507   hbox = gtk_hbox_new (FALSE, 5);
508   gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
509   gtk_table_attach (GTK_TABLE (table), hbox,
510                     1,2, 1,2, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0);
511
512   checkbox = gtk_check_button_new_with_mnemonic("_Vertical");
513   gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, FALSE, 0);
514   g_signal_connect (checkbox, "toggled",
515                     G_CALLBACK (change_orientation), toolbar);
516
517   checkbox = gtk_check_button_new_with_mnemonic("_Show Arrow");
518   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), TRUE);
519   gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, FALSE, 0);
520   g_signal_connect (checkbox, "toggled",
521                     G_CALLBACK (change_show_arrow), toolbar);
522
523   checkbox = gtk_check_button_new_with_mnemonic("_Set Toolbar Style:");
524   g_signal_connect (checkbox, "toggled", G_CALLBACK (set_toolbar_style_toggled), toolbar);
525   gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, FALSE, 0);
526   
527   option_menu = gtk_option_menu_new();
528   gtk_widget_set_sensitive (option_menu, FALSE);  
529   g_object_set_data (G_OBJECT (checkbox), "option-menu", option_menu);
530   
531   menu = gtk_menu_new();
532   for (i = 0; i < G_N_ELEMENTS (toolbar_styles); i++)
533     {
534       GtkWidget *menuitem;
535
536       menuitem = gtk_menu_item_new_with_label (toolbar_styles[i]);
537       gtk_container_add (GTK_CONTAINER (menu), menuitem);
538       gtk_widget_show (menuitem);
539     }
540   gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), menu);
541   gtk_option_menu_set_history (GTK_OPTION_MENU (option_menu),
542                                GTK_TOOLBAR (toolbar)->style);
543   gtk_box_pack_start (GTK_BOX (hbox), option_menu, FALSE, FALSE, 0);
544   g_signal_connect (option_menu, "changed",
545                     G_CALLBACK (change_toolbar_style), toolbar);
546
547   checkbox = gtk_check_button_new_with_mnemonic("_Set Icon Size:"); 
548   g_signal_connect (checkbox, "toggled", G_CALLBACK (set_icon_size_toggled), toolbar);
549   gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, FALSE, 0);
550
551   option_menu = gtk_option_menu_new();
552   g_object_set_data (G_OBJECT (checkbox), "option-menu", option_menu);
553   gtk_widget_set_sensitive (option_menu, FALSE);
554   menu = gtk_menu_new();
555   menuitem = gtk_menu_item_new_with_label ("small toolbar");
556   g_object_set_data (G_OBJECT (menuitem), "value-id", GINT_TO_POINTER (GTK_ICON_SIZE_SMALL_TOOLBAR));
557   gtk_container_add (GTK_CONTAINER (menu), menuitem);
558   gtk_widget_show (menuitem);
559
560   menuitem = gtk_menu_item_new_with_label ("large toolbar");
561   g_object_set_data (G_OBJECT (menuitem), "value-id", GINT_TO_POINTER (GTK_ICON_SIZE_LARGE_TOOLBAR));
562   gtk_container_add (GTK_CONTAINER (menu), menuitem);
563   gtk_widget_show (menuitem);
564
565   gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), menu);
566   gtk_box_pack_start (GTK_BOX (hbox), option_menu, FALSE, FALSE, 0);
567   g_signal_connect (option_menu, "changed",
568                     G_CALLBACK (icon_size_history_changed), toolbar);
569   
570   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
571   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
572                                   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
573   gtk_table_attach (GTK_TABLE (table), scrolled_window,
574                     1,2, 2,3, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0);
575
576   store = create_items_list (&treeview);
577   gtk_container_add (GTK_CONTAINER (scrolled_window), treeview);
578   
579   item = gtk_tool_button_new_from_stock (GTK_STOCK_NEW);
580   gtk_tool_button_set_label (GTK_TOOL_BUTTON (item), "Custom label");
581   gtk_tool_button_set_label (GTK_TOOL_BUTTON (item), NULL);
582   add_item_to_list (store, item, "New");
583   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
584   gtk_tool_item_set_expand (item, TRUE);
585
586   item = gtk_tool_button_new_from_stock (GTK_STOCK_OPEN);
587   add_item_to_list (store, item, "Open");
588   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
589
590   item = gtk_separator_tool_item_new ();
591   add_item_to_list (store, item, "-----");    
592   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
593   
594   item = gtk_tool_button_new_from_stock (GTK_STOCK_REFRESH);
595   add_item_to_list (store, item, "Refresh");
596   g_signal_connect (item, "clicked", G_CALLBACK (reload_clicked), NULL);
597   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
598
599   image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG);
600   item = gtk_tool_item_new ();
601   gtk_widget_show (image);
602   gtk_container_add (GTK_CONTAINER (item), image);
603   add_item_to_list (store, item, "(Custom Item)");    
604   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
605   
606   item = gtk_tool_button_new_from_stock (GTK_STOCK_GO_BACK);
607   add_item_to_list (store, item, "Back");    
608   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
609
610   item = gtk_separator_tool_item_new ();
611   add_item_to_list (store, item, "-----");  
612   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
613   
614   item = gtk_tool_button_new_from_stock (GTK_STOCK_GO_FORWARD);
615   add_item_to_list (store, item, "Forward");  
616   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
617
618   item = gtk_toggle_tool_button_new_from_stock (GTK_STOCK_BOLD);
619   g_signal_connect (item, "toggled", G_CALLBACK (bold_toggled), NULL);
620   add_item_to_list (store, item, "Bold");  
621   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
622
623   item = gtk_separator_tool_item_new ();
624   add_item_to_list (store, item, "-----");  
625   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
626   gtk_tool_item_set_expand (item, TRUE);
627   gtk_separator_tool_item_set_draw (GTK_SEPARATOR_TOOL_ITEM (item), FALSE);
628   g_assert (gtk_toolbar_get_nth_item (toolbar, 0) != 0);
629   
630   item = gtk_radio_tool_button_new_from_stock (NULL, GTK_STOCK_JUSTIFY_LEFT);
631   group = gtk_radio_tool_button_get_group (GTK_RADIO_TOOL_BUTTON (item));
632   add_item_to_list (store, item, "Left");
633   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
634   
635   
636   item = gtk_radio_tool_button_new_from_stock (group, GTK_STOCK_JUSTIFY_CENTER);
637 #if 0
638   make_prop_editor (G_OBJECT (item));
639 #endif
640
641   group = gtk_radio_tool_button_get_group (GTK_RADIO_TOOL_BUTTON (item));
642   add_item_to_list (store, item, "Center");
643   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
644
645   item = gtk_radio_tool_button_new_from_stock (group, GTK_STOCK_JUSTIFY_RIGHT);
646   add_item_to_list (store, item, "Right");
647   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
648
649   item = gtk_tool_button_new (gtk_image_new_from_file ("apple-red.png"), "_Apple");
650   add_item_to_list (store, item, "Apple");
651   gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
652   gtk_tool_button_set_use_underline (GTK_TOOL_BUTTON (item), TRUE);
653   
654   hbox = gtk_hbox_new (FALSE, 5);
655   gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
656   gtk_table_attach (GTK_TABLE (table), hbox,
657                     1,2, 3,4, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0);
658
659   button = gtk_button_new_with_label ("Drag me to the toolbar");
660   gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
661
662   label = gtk_label_new ("Drop index:");
663   gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
664
665   label = gtk_label_new ("");
666   gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
667
668   checkbox = gtk_check_button_new_with_mnemonic("_Right to left");
669   if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
670     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), TRUE);
671   else
672     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), FALSE);
673   g_signal_connect (checkbox, "toggled", G_CALLBACK (rtl_toggled), NULL);
674
675   gtk_box_pack_end (GTK_BOX (hbox), checkbox, FALSE, FALSE, 0);
676   
677   gtk_drag_source_set (button, GDK_BUTTON1_MASK,
678                        target_table, G_N_ELEMENTS (target_table),
679                        GDK_ACTION_MOVE);
680   gtk_drag_dest_set (toolbar, GTK_DEST_DEFAULT_DROP,
681                      target_table, G_N_ELEMENTS (target_table),
682                      GDK_ACTION_MOVE);
683   g_signal_connect (toolbar, "drag_motion",
684                     G_CALLBACK (toolbar_drag_motion), NULL);
685   g_signal_connect (toolbar, "drag_leave",
686                     G_CALLBACK (toolbar_drag_leave), NULL);
687   g_signal_connect (toolbar, "drag_drop",
688                     G_CALLBACK (toolbar_drag_drop), label);
689
690   gtk_widget_show_all (window);
691
692 #if 0
693   make_prop_editor (G_OBJECT (toolbar));
694 #endif
695
696   g_signal_connect (window, "delete_event", G_CALLBACK (gtk_main_quit), NULL);
697   
698   g_signal_connect (toolbar, "popup_context_menu", G_CALLBACK (popup_context_menu), NULL);
699   
700   gtk_main ();
701   
702   return 0;
703 }