1 #ifdef HAVE_CONFIG_H
2 #include <config.h>
3 #endif
4
5 #include <signal.h>
6 #include <stdio.h>
7 #include <string.h>
8 #include <gtk/gtk.h>
9
10 #include "gdl/gdl.h"
11
12 #include <glib.h>
13
14 /* ---- end of debugging code */
15
16 static void
on_style_button_toggled(GtkRadioButton * button,GdlDock * dock)17 on_style_button_toggled (GtkRadioButton *button, GdlDock *dock)
18 {
19 gboolean active;
20 GdlDockMaster *master = GDL_DOCK_MASTER (gdl_dock_object_get_master (GDL_DOCK_OBJECT (dock)));
21 GdlSwitcherStyle style =
22 GPOINTER_TO_INT (g_object_get_data (G_OBJECT (button),
23 "__style_id"));
24 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
25 if (active) {
26 g_object_set (master, "switcher-style", style, NULL);
27 }
28 }
29
30 static GtkWidget *
create_style_button(GtkWidget * dock,GtkWidget * box,GtkWidget * group,GdlSwitcherStyle style,const gchar * style_text)31 create_style_button (GtkWidget *dock, GtkWidget *box, GtkWidget *group,
32 GdlSwitcherStyle style, const gchar *style_text)
33 {
34 GdlSwitcherStyle current_style;
35 GtkWidget *button1;
36 GdlDockMaster *master = GDL_DOCK_MASTER (gdl_dock_object_get_master (GDL_DOCK_OBJECT (dock)));
37 g_object_get (master, "switcher-style", ¤t_style, NULL);
38 button1 = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (group),
39 style_text);
40 gtk_widget_show (button1);
41 g_object_set_data (G_OBJECT (button1), "__style_id",
42 GINT_TO_POINTER (style));
43 if (current_style == style) {
44 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button1), TRUE);
45 }
46 g_signal_connect (button1, "toggled",
47 G_CALLBACK (on_style_button_toggled),
48 dock);
49 gtk_box_pack_start (GTK_BOX (box), button1, FALSE, FALSE, 0);
50 return button1;
51 }
52
53 static GtkWidget *
create_styles_item(GtkWidget * dock)54 create_styles_item (GtkWidget *dock)
55 {
56 GtkWidget *vbox1;
57 GtkWidget *group;
58
59 vbox1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
60 gtk_widget_show (vbox1);
61
62 group = create_style_button (dock, vbox1, NULL,
63 GDL_SWITCHER_STYLE_ICON, "Only icon");
64 group = create_style_button (dock, vbox1, group,
65 GDL_SWITCHER_STYLE_TEXT, "Only text");
66 group = create_style_button (dock, vbox1, group,
67 GDL_SWITCHER_STYLE_BOTH,
68 "Both icons and texts");
69 group = create_style_button (dock, vbox1, group,
70 GDL_SWITCHER_STYLE_TOOLBAR,
71 "Desktop toolbar style");
72 group = create_style_button (dock, vbox1, group,
73 GDL_SWITCHER_STYLE_TABS,
74 "Notebook tabs");
75 group = create_style_button (dock, vbox1, group,
76 GDL_SWITCHER_STYLE_NONE,
77 "None of the above");
78 return vbox1;
79 }
80
81 static GtkWidget *
create_item(const gchar * button_title)82 create_item (const gchar *button_title)
83 {
84 GtkWidget *button1;
85
86 button1 = gtk_button_new_with_label (button_title);
87 gtk_widget_show (button1);
88
89 return button1;
90 }
91
92 /* creates a simple widget with a textbox inside */
93 static GtkWidget *
create_text_item()94 create_text_item ()
95 {
96 GtkWidget *vbox1;
97 GtkWidget *scrolledwindow1;
98 GtkWidget *text;
99
100 vbox1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
101 gtk_widget_show (vbox1);
102
103 scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
104 gtk_widget_show (scrolledwindow1);
105 gtk_box_pack_start (GTK_BOX (vbox1), scrolledwindow1, TRUE, TRUE, 0);
106 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1),
107 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
108 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow1),
109 GTK_SHADOW_ETCHED_IN);
110 text = gtk_text_view_new ();
111 g_object_set (text, "wrap-mode", GTK_WRAP_WORD, NULL);
112 gtk_widget_show (text);
113 gtk_container_add (GTK_CONTAINER (scrolledwindow1), text);
114
115 return vbox1;
116 }
117
118 static void
button_dump_cb(GtkWidget * button,gpointer data)119 button_dump_cb (GtkWidget *button, gpointer data)
120 {
121 /* Dump XML tree. */
122 gdl_dock_layout_save_to_file (GDL_DOCK_LAYOUT (data), "layout.xml");
123 g_spawn_command_line_async ("cat layout.xml", NULL);
124 }
125
126 static void
save_layout_cb(GtkWidget * w,gpointer data)127 save_layout_cb (GtkWidget *w, gpointer data)
128 {
129 GdlDockLayout *layout = GDL_DOCK_LAYOUT (data);
130 GtkWidget *dialog, *hbox, *label, *entry;
131 gint response;
132
133 dialog = gtk_dialog_new_with_buttons ("New Layout",
134 NULL,
135 GTK_DIALOG_MODAL |
136 GTK_DIALOG_DESTROY_WITH_PARENT,
137 GTK_STOCK_OK,
138 GTK_RESPONSE_OK,
139 NULL);
140
141 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
142 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
143 gtk_box_pack_start (GTK_BOX (gtk_dialog_get_action_area (GTK_DIALOG (dialog))), hbox, FALSE, FALSE, 0);
144
145 label = gtk_label_new ("Name:");
146 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
147
148 entry = gtk_entry_new ();
149 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
150
151 gtk_widget_show_all (hbox);
152 response = gtk_dialog_run (GTK_DIALOG (dialog));
153
154 if (response == GTK_RESPONSE_OK) {
155 const gchar *name = gtk_entry_get_text (GTK_ENTRY (entry));
156 gdl_dock_layout_save_layout (layout, name);
157 }
158
159 gtk_widget_destroy (dialog);
160 }
161
162 static void
on_change_name(GtkWidget * widget,gpointer data)163 on_change_name (GtkWidget* widget, gpointer data)
164 {
165 static int index = 10;
166 static gboolean toggle = TRUE;
167 gchar* name = g_strdup_printf ("Item %d", index);
168 GdlDockItem* item3 = data;
169 g_object_set (G_OBJECT (item3), "long_name", name, NULL);
170 g_free (name);
171 if (toggle) {
172 gdl_dock_item_hide_grip (item3);
173 g_object_set (G_OBJECT (widget), "label", "hidden", NULL);
174 toggle = FALSE;
175 } else {
176 gdl_dock_item_show_grip (item3);
177 g_object_set (G_OBJECT (widget), "label", "shown", NULL);
178 toggle = TRUE;
179 }
180 index++;
181 }
182
183 int
main(int argc,char ** argv)184 main (int argc, char **argv)
185 {
186 GtkWidget *item1, *item2, *item3;
187 GtkWidget *items [4];
188 GtkWidget *win, *table, *button, *box;
189 int i;
190 GdlDockLayout *layout;
191 GtkWidget *dock, *dockbar;
192 GtkWidget* name_button;
193
194 gtk_init (&argc, &argv);
195
196 /*gtk_widget_set_default_direction (GTK_TEXT_DIR_RTL);*/
197
198 /* window creation */
199 win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
200 g_signal_connect (win, "delete_event",
201 G_CALLBACK (gtk_main_quit), NULL);
202 gtk_window_set_title (GTK_WINDOW (win), "Docking widget test");
203 gtk_window_set_default_size (GTK_WINDOW (win), 400, 400);
204
205 /* table */
206 table = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
207 gtk_container_add (GTK_CONTAINER (win), table);
208 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
209
210 /* create the dock */
211 dock = gdl_dock_new ();
212 GdlDockMaster *master = GDL_DOCK_MASTER (gdl_dock_object_get_master (GDL_DOCK_OBJECT (dock)));
213 g_object_set (master, "tab-pos", GTK_POS_TOP, NULL);
214 g_object_set (master, "tab-reorderable", TRUE, NULL);
215
216 /* ... and the layout manager */
217 layout = gdl_dock_layout_new (G_OBJECT (dock));
218
219 /* create the dockbar */
220 dockbar = gdl_dock_bar_new (G_OBJECT (dock));
221 gdl_dock_bar_set_style(GDL_DOCK_BAR(dockbar), GDL_DOCK_BAR_TEXT);
222
223 box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
224 gtk_box_pack_start (GTK_BOX (table), box, TRUE, TRUE, 0);
225
226 gtk_box_pack_start (GTK_BOX (box), dockbar, FALSE, FALSE, 0);
227 gtk_box_pack_end (GTK_BOX (box), dock, TRUE, TRUE, 0);
228
229 /* create the dock items */
230 item1 = gdl_dock_item_new ("item1", "Item #1", GDL_DOCK_ITEM_BEH_LOCKED);
231 gtk_container_add (GTK_CONTAINER (item1), create_text_item ());
232 gdl_dock_add_item (GDL_DOCK (dock), GDL_DOCK_ITEM (item1),
233 GDL_DOCK_TOP);
234 gtk_widget_show (item1);
235
236 item2 = gdl_dock_item_new_with_stock ("item2", "Item #2: Select the switcher style for notebooks",
237 GTK_STOCK_EXECUTE,
238 GDL_DOCK_ITEM_BEH_NORMAL);
239 g_object_set (item2, "resize", FALSE, NULL);
240 gtk_container_add (GTK_CONTAINER (item2), create_styles_item (dock));
241 gdl_dock_add_item (GDL_DOCK (dock), GDL_DOCK_ITEM (item2),
242 GDL_DOCK_RIGHT);
243 gtk_widget_show (item2);
244
245 item3 = gdl_dock_item_new_with_stock ("item3", "Item #3 has accented characters (áéíóúñ)",
246 GTK_STOCK_CONVERT,
247 GDL_DOCK_ITEM_BEH_NORMAL |
248 GDL_DOCK_ITEM_BEH_CANT_CLOSE);
249 name_button = create_item ("Change name");
250 gtk_container_add (GTK_CONTAINER (item3), name_button);
251 g_signal_connect (name_button, "clicked", G_CALLBACK(on_change_name), item3);
252 gdl_dock_add_item (GDL_DOCK (dock), GDL_DOCK_ITEM (item3),
253 GDL_DOCK_BOTTOM);
254 gtk_widget_show (item3);
255
256 items [0] = gdl_dock_item_new_with_stock ("Item #4", "Item #4",
257 GTK_STOCK_JUSTIFY_FILL,
258 GDL_DOCK_ITEM_BEH_NORMAL |
259 GDL_DOCK_ITEM_BEH_CANT_ICONIFY);
260 gtk_container_add (GTK_CONTAINER (items [0]), create_text_item ());
261 gtk_widget_show (items [0]);
262 gdl_dock_add_item (GDL_DOCK (dock), GDL_DOCK_ITEM (items [0]), GDL_DOCK_BOTTOM);
263 for (i = 1; i < 3; i++) {
264 gchar name[10];
265
266 snprintf (name, sizeof (name), "Item #%d", i + 4);
267 items [i] = gdl_dock_item_new_with_stock (name, name, GTK_STOCK_NEW,
268 GDL_DOCK_ITEM_BEH_NORMAL);
269 gtk_container_add (GTK_CONTAINER (items [i]), create_text_item ());
270 gtk_widget_show (items [i]);
271
272 gdl_dock_object_dock (GDL_DOCK_OBJECT (items [0]),
273 GDL_DOCK_OBJECT (items [i]),
274 GDL_DOCK_CENTER, NULL);
275 };
276
277 /* tests: manually dock and move around some of the items */
278 gdl_dock_item_dock_to (GDL_DOCK_ITEM (item3), GDL_DOCK_ITEM (item1),
279 GDL_DOCK_TOP, -1);
280
281 gdl_dock_item_dock_to (GDL_DOCK_ITEM (item2), GDL_DOCK_ITEM (item3),
282 GDL_DOCK_RIGHT, -1);
283
284 gdl_dock_item_dock_to (GDL_DOCK_ITEM (item2), GDL_DOCK_ITEM (item3),
285 GDL_DOCK_LEFT, -1);
286
287 gdl_dock_item_dock_to (GDL_DOCK_ITEM (item2), NULL,
288 GDL_DOCK_FLOATING, -1);
289
290 box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
291 gtk_box_set_homogeneous (GTK_BOX (box), TRUE);
292 gtk_box_pack_end (GTK_BOX (table), box, FALSE, FALSE, 0);
293
294 button = gtk_button_new_from_stock (GTK_STOCK_SAVE);
295 g_signal_connect (button, "clicked",
296 G_CALLBACK (save_layout_cb), layout);
297 gtk_box_pack_end (GTK_BOX (box), button, FALSE, TRUE, 0);
298
299 button = gtk_button_new_with_label ("Dump XML");
300 g_signal_connect (button, "clicked",
301 G_CALLBACK (button_dump_cb), layout);
302 gtk_box_pack_end (GTK_BOX (box), button, FALSE, TRUE, 0);
303
304 gtk_widget_show_all (win);
305
306 #ifndef GDL_DISABLE_DEPRECATED
307 gdl_dock_placeholder_new ("ph1", GDL_DOCK_OBJECT (dock), GDL_DOCK_TOP, FALSE);
308 gdl_dock_placeholder_new ("ph2", GDL_DOCK_OBJECT (dock), GDL_DOCK_BOTTOM, FALSE);
309 gdl_dock_placeholder_new ("ph3", GDL_DOCK_OBJECT (dock), GDL_DOCK_LEFT, FALSE);
310 gdl_dock_placeholder_new ("ph4", GDL_DOCK_OBJECT (dock), GDL_DOCK_RIGHT, FALSE);
311 #endif
312
313 gtk_main ();
314
315 g_object_unref (layout);
316
317 return 0;
318 }
319