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", &current_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