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