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>
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.
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.
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.
24 #include "prop-editor.h"
27 reload_clicked (GtkWidget *widget)
29 static GdkAtom atom_rcfiles = GDK_NONE;
35 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
37 for(i = 0; i < 5; i++)
40 sev.message_type = atom_rcfiles;
41 gdk_event_send_clientmessage_toall ((GdkEvent *) &sev);
45 change_orientation (GtkWidget *button, GtkWidget *toolbar)
48 GtkOrientation orientation;
50 table = gtk_widget_get_parent (toolbar);
51 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)))
52 orientation = GTK_ORIENTATION_VERTICAL;
54 orientation = GTK_ORIENTATION_HORIZONTAL;
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)
61 gtk_table_attach (GTK_TABLE (table), toolbar,
62 0,2, 0,1, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0);
66 gtk_table_attach (GTK_TABLE (table), toolbar,
67 0,1, 0,4, GTK_FILL, GTK_FILL|GTK_EXPAND, 0, 0);
69 g_object_unref (toolbar);
73 change_show_arrow (GtkWidget *button, GtkWidget *toolbar)
75 gtk_toolbar_set_show_arrow (GTK_TOOLBAR (toolbar),
76 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)));
80 set_toolbar_style_toggled (GtkCheckButton *button, GtkToolbar *toolbar)
82 GtkWidget *option_menu;
85 option_menu = g_object_get_data (G_OBJECT (button), "option-menu");
87 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)))
89 style = gtk_option_menu_get_history (GTK_OPTION_MENU (option_menu));
91 gtk_toolbar_set_style (toolbar, style);
92 gtk_widget_set_sensitive (option_menu, TRUE);
96 gtk_toolbar_unset_style (toolbar);
97 gtk_widget_set_sensitive (option_menu, FALSE);
102 change_toolbar_style (GtkWidget *option_menu, GtkWidget *toolbar)
104 GtkToolbarStyle style;
106 style = gtk_option_menu_get_history (GTK_OPTION_MENU (option_menu));
107 gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), style);
111 set_visible_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
112 GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
114 GtkToolItem *tool_item;
117 gtk_tree_model_get (model, iter, 0, &tool_item, -1);
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);
125 visibile_toggled(GtkCellRendererToggle *cell, const gchar *path_str,
130 GtkToolItem *tool_item;
133 path = gtk_tree_path_new_from_string (path_str);
134 gtk_tree_model_get_iter (model, &iter, path);
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);
141 gtk_tree_model_row_changed (model, path, &iter);
142 gtk_tree_path_free (path);
146 set_expand_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
147 GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
149 GtkToolItem *tool_item;
151 gtk_tree_model_get (model, iter, 0, &tool_item, -1);
153 g_object_set (G_OBJECT (cell), "active", tool_item->expand, NULL);
154 g_object_unref (tool_item);
158 expand_toggled(GtkCellRendererToggle *cell, const gchar *path_str,
163 GtkToolItem *tool_item;
165 path = gtk_tree_path_new_from_string (path_str);
166 gtk_tree_model_get_iter (model, &iter, path);
168 gtk_tree_model_get (model, &iter, 0, &tool_item, -1);
169 gtk_tool_item_set_expand (tool_item, !tool_item->expand);
170 g_object_unref (tool_item);
172 gtk_tree_model_row_changed (model, path, &iter);
173 gtk_tree_path_free (path);
177 set_pack_end_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
178 GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
180 GtkToolItem *tool_item;
182 gtk_tree_model_get (model, iter, 0, &tool_item, -1);
184 g_object_set (G_OBJECT (cell), "active", tool_item->pack_end, NULL);
185 g_object_unref (tool_item);
189 pack_end_toggled(GtkCellRendererToggle *cell, const gchar *path_str,
194 GtkToolItem *tool_item;
196 path = gtk_tree_path_new_from_string (path_str);
197 gtk_tree_model_get_iter (model, &iter, path);
199 gtk_tree_model_get (model, &iter, 0, &tool_item, -1);
200 gtk_tool_item_set_pack_end (tool_item, !tool_item->pack_end);
201 g_object_unref (tool_item);
203 gtk_tree_model_row_changed (model, path, &iter);
204 gtk_tree_path_free (path);
208 set_homogeneous_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
209 GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
211 GtkToolItem *tool_item;
213 gtk_tree_model_get (model, iter, 0, &tool_item, -1);
215 g_object_set (G_OBJECT (cell), "active", tool_item->homogeneous, NULL);
216 g_object_unref (tool_item);
220 homogeneous_toggled(GtkCellRendererToggle *cell, const gchar *path_str,
225 GtkToolItem *tool_item;
227 path = gtk_tree_path_new_from_string (path_str);
228 gtk_tree_model_get_iter (model, &iter, path);
230 gtk_tree_model_get (model, &iter, 0, &tool_item, -1);
231 gtk_tool_item_set_homogeneous (tool_item, !tool_item->homogeneous);
232 g_object_unref (tool_item);
234 gtk_tree_model_row_changed (model, path, &iter);
235 gtk_tree_path_free (path);
238 static GtkListStore *
239 create_items_list (GtkWidget **tree_view_p)
241 GtkWidget *tree_view;
242 GtkListStore *list_store;
243 GtkCellRenderer *cell;
245 list_store = gtk_list_store_new (2, GTK_TYPE_TOOL_ITEM, G_TYPE_STRING);
247 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
249 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
251 gtk_cell_renderer_text_new (),
254 cell = gtk_cell_renderer_toggle_new ();
255 g_signal_connect (cell, "toggled", G_CALLBACK (visibile_toggled),
257 gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (tree_view),
260 set_visible_func, NULL, NULL);
262 cell = gtk_cell_renderer_toggle_new ();
263 g_signal_connect (cell, "toggled", G_CALLBACK (expand_toggled),
265 gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (tree_view),
268 set_expand_func, NULL, NULL);
270 cell = gtk_cell_renderer_toggle_new ();
271 g_signal_connect (cell, "toggled", G_CALLBACK (pack_end_toggled),
273 gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (tree_view),
276 set_pack_end_func, NULL, NULL);
278 cell = gtk_cell_renderer_toggle_new ();
279 g_signal_connect (cell, "toggled", G_CALLBACK (homogeneous_toggled),
281 gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (tree_view),
284 set_homogeneous_func, NULL,NULL);
286 g_object_unref (list_store);
288 *tree_view_p = tree_view;
294 add_item_to_list (GtkListStore *store, GtkToolItem *item, const gchar *text)
298 gtk_list_store_append (store, &iter);
299 gtk_list_store_set (store, &iter,
307 bold_toggled (GtkToggleToolButton *button)
309 g_message ("Bold toggled (active=%d)",
310 gtk_toggle_tool_button_get_active (button));
314 set_icon_size_toggled (GtkCheckButton *button, GtkToolbar *toolbar)
316 GtkWidget *option_menu;
319 option_menu = g_object_get_data (G_OBJECT (button), "option-menu");
321 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)))
323 icon_size = gtk_option_menu_get_history (GTK_OPTION_MENU (option_menu));
324 icon_size += GTK_ICON_SIZE_SMALL_TOOLBAR;
326 gtk_toolbar_set_icon_size (toolbar, icon_size);
327 gtk_widget_set_sensitive (option_menu, TRUE);
331 gtk_toolbar_unset_icon_size (toolbar);
332 gtk_widget_set_sensitive (option_menu, FALSE);
337 icon_size_history_changed (GtkOptionMenu *menu, GtkToolbar *toolbar)
341 icon_size = gtk_option_menu_get_history (menu);
342 icon_size += GTK_ICON_SIZE_SMALL_TOOLBAR;
344 gtk_toolbar_set_icon_size (toolbar, icon_size);
348 toolbar_drag_drop (GtkWidget *widget, GdkDragContext *context,
349 gint x, gint y, guint time, GtkWidget *label)
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);
360 static GtkTargetEntry target_table[] = {
361 { "application/x-toolbar-item", 0, 0 }
365 make_prop_editor (GObject *object)
367 GtkWidget *prop_editor = create_prop_editor (object, 0);
368 gtk_widget_show (prop_editor);
373 rtl_toggled (GtkCheckButton *check)
375 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check)))
376 gtk_widget_set_default_direction (GTK_TEXT_DIR_RTL);
378 gtk_widget_set_default_direction (GTK_TEXT_DIR_LTR);
382 main (gint argc, gchar **argv)
384 GtkWidget *window, *toolbar, *table, *treeview, *scrolled_window;
385 GtkWidget *hbox, *checkbox, *option_menu, *menu;
387 static const gchar *toolbar_styles[] = { "icons", "text", "both (vertical)",
388 "both (horizontal)" };
397 gtk_init (&argc, &argv);
399 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
401 g_signal_connect (window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
403 table = gtk_table_new (4, 2, FALSE);
404 gtk_container_add (GTK_CONTAINER (window), table);
406 toolbar = gtk_toolbar_new ();
407 gtk_table_attach (GTK_TABLE (table), toolbar,
408 0,2, 0,1, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0);
410 hbox = gtk_hbox_new (FALSE, 5);
411 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
412 gtk_table_attach (GTK_TABLE (table), hbox,
413 1,2, 1,2, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0);
415 checkbox = gtk_check_button_new_with_mnemonic("_Vertical");
416 gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, FALSE, 0);
417 g_signal_connect (checkbox, "toggled",
418 G_CALLBACK (change_orientation), toolbar);
420 checkbox = gtk_check_button_new_with_mnemonic("_Show Arrow");
421 gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, FALSE, 0);
422 g_signal_connect (checkbox, "toggled",
423 G_CALLBACK (change_show_arrow), toolbar);
425 checkbox = gtk_check_button_new_with_mnemonic("_Set Toolbar Style:");
426 g_signal_connect (checkbox, "toggled", G_CALLBACK (set_toolbar_style_toggled), toolbar);
427 gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, FALSE, 0);
429 option_menu = gtk_option_menu_new();
430 gtk_widget_set_sensitive (option_menu, FALSE);
431 g_object_set_data (G_OBJECT (checkbox), "option-menu", option_menu);
433 menu = gtk_menu_new();
434 for (i = 0; i < G_N_ELEMENTS (toolbar_styles); i++)
438 menuitem = gtk_menu_item_new_with_label (toolbar_styles[i]);
439 gtk_container_add (GTK_CONTAINER (menu), menuitem);
440 gtk_widget_show (menuitem);
442 gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), menu);
443 gtk_option_menu_set_history (GTK_OPTION_MENU (option_menu),
444 GTK_TOOLBAR (toolbar)->style);
445 gtk_box_pack_start (GTK_BOX (hbox), option_menu, FALSE, FALSE, 0);
446 g_signal_connect (option_menu, "changed",
447 G_CALLBACK (change_toolbar_style), toolbar);
449 checkbox = gtk_check_button_new_with_mnemonic("_Set Icon Size:");
450 g_signal_connect (checkbox, "toggled", G_CALLBACK (set_icon_size_toggled), toolbar);
451 gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, FALSE, 0);
453 option_menu = gtk_option_menu_new();
454 g_object_set_data (G_OBJECT (checkbox), "option-menu", option_menu);
455 gtk_widget_set_sensitive (option_menu, FALSE);
456 menu = gtk_menu_new();
457 menuitem = gtk_menu_item_new_with_label ("small toolbar");
458 g_object_set_data (G_OBJECT (menuitem), "value-id", GINT_TO_POINTER (GTK_ICON_SIZE_SMALL_TOOLBAR));
459 gtk_container_add (GTK_CONTAINER (menu), menuitem);
460 gtk_widget_show (menuitem);
462 menuitem = gtk_menu_item_new_with_label ("large toolbar");
463 g_object_set_data (G_OBJECT (menuitem), "value-id", GINT_TO_POINTER (GTK_ICON_SIZE_LARGE_TOOLBAR));
464 gtk_container_add (GTK_CONTAINER (menu), menuitem);
465 gtk_widget_show (menuitem);
467 gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), menu);
468 gtk_box_pack_start (GTK_BOX (hbox), option_menu, FALSE, FALSE, 0);
469 g_signal_connect (option_menu, "changed",
470 G_CALLBACK (icon_size_history_changed), toolbar);
472 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
473 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
474 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
475 gtk_table_attach (GTK_TABLE (table), scrolled_window,
476 1,2, 2,3, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0);
478 store = create_items_list (&treeview);
479 gtk_container_add (GTK_CONTAINER (scrolled_window), treeview);
481 item = gtk_tool_button_new_from_stock (GTK_STOCK_NEW);
482 gtk_tool_button_set_label (GTK_TOOL_BUTTON (item), "Custom label");
483 gtk_tool_button_set_label (GTK_TOOL_BUTTON (item), NULL);
484 add_item_to_list (store, item, "New");
485 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
487 item = gtk_tool_button_new_from_stock (GTK_STOCK_OPEN);
488 add_item_to_list (store, item, "Open");
489 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
491 item = gtk_separator_tool_item_new ();
492 add_item_to_list (store, item, "-----");
493 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
495 item = gtk_tool_button_new_from_stock (GTK_STOCK_REFRESH);
496 add_item_to_list (store, item, "Refresh");
497 g_signal_connect (item, "clicked", G_CALLBACK (reload_clicked), NULL);
498 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
500 image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG);
501 item = gtk_tool_item_new ();
502 gtk_widget_show (image);
503 gtk_container_add (GTK_CONTAINER (item), image);
504 add_item_to_list (store, item, "(Custom Item)");
505 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
507 item = gtk_tool_button_new_from_stock (GTK_STOCK_GO_BACK);
508 add_item_to_list (store, item, "Back");
509 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
511 item = gtk_separator_tool_item_new ();
512 add_item_to_list (store, item, "-----");
513 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
515 item = gtk_tool_button_new_from_stock (GTK_STOCK_GO_FORWARD);
516 add_item_to_list (store, item, "Forward");
517 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
519 item = gtk_toggle_tool_button_new_from_stock (GTK_STOCK_BOLD);
520 g_signal_connect (item, "toggled", G_CALLBACK (bold_toggled), NULL);
521 add_item_to_list (store, item, "Bold");
522 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
524 item = gtk_separator_tool_item_new ();
525 add_item_to_list (store, item, "-----");
526 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
528 item = gtk_radio_tool_button_new_from_stock (NULL, GTK_STOCK_JUSTIFY_LEFT);
529 group = gtk_radio_tool_button_get_group (GTK_RADIO_TOOL_BUTTON (item));
530 add_item_to_list (store, item, "Left");
531 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
533 item = gtk_radio_tool_button_new_from_stock (group, GTK_STOCK_JUSTIFY_CENTER); make_prop_editor (G_OBJECT (item));
535 group = gtk_radio_tool_button_get_group (GTK_RADIO_TOOL_BUTTON (item));
536 add_item_to_list (store, item, "Center");
537 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
539 item = gtk_radio_tool_button_new_from_stock (group, GTK_STOCK_JUSTIFY_RIGHT);
540 add_item_to_list (store, item, "Right");
541 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
543 item = gtk_tool_button_new ("_Apple", gtk_image_new_from_file ("apple-red.png"));
544 add_item_to_list (store, item, "Apple");
545 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
546 gtk_tool_button_set_use_underline (GTK_TOOL_BUTTON (item), TRUE);
548 hbox = gtk_hbox_new (FALSE, 5);
549 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
550 gtk_table_attach (GTK_TABLE (table), hbox,
551 1,2, 3,4, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0);
553 button = gtk_button_new_with_label ("Drag me to the toolbar");
554 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
556 label = gtk_label_new ("Drop index:");
557 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
559 label = gtk_label_new ("");
560 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
562 checkbox = gtk_check_button_new_with_mnemonic("_Right to left");
563 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
564 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), TRUE);
566 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), FALSE);
567 g_signal_connect (checkbox, "toggled", G_CALLBACK (rtl_toggled), NULL);
569 gtk_box_pack_end (GTK_BOX (hbox), checkbox, FALSE, FALSE, 0);
571 gtk_drag_source_set (button, GDK_BUTTON1_MASK,
572 target_table, G_N_ELEMENTS (target_table),
574 gtk_drag_dest_set (toolbar, GTK_DEST_DEFAULT_DROP,
575 target_table, G_N_ELEMENTS (target_table),
577 g_signal_connect (toolbar, "drag_drop",
578 G_CALLBACK (toolbar_drag_drop), label);
580 gtk_widget_show_all (window);
582 make_prop_editor (G_OBJECT (toolbar));