1 /* Selector widgets/Combo widget
2  *
3  * The GdauiCombo widget displays data stored in a GdaDataModel in a GtkComboBox
4  */
5 
6 #include <libgda-ui/libgda-ui.h>
7 #include <sql-parser/gda-sql-parser.h>
8 
9 extern GdaConnection *demo_cnc;
10 extern GdaSqlParser *demo_parser;
11 static GtkWidget *window = NULL;
12 
13 static void
null_entry_changed_cb(GtkCheckButton * cbutton,GdauiCombo * combo)14 null_entry_changed_cb (GtkCheckButton *cbutton, GdauiCombo *combo)
15 {
16 	gdaui_combo_add_null (combo, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cbutton)));
17 }
18 
19 static void
popup_as_list_changed_cb(GtkCheckButton * cbutton,GdauiCombo * combo)20 popup_as_list_changed_cb (GtkCheckButton *cbutton, GdauiCombo *combo)
21 {
22 	g_object_set ((GObject*) combo, "as-list", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cbutton)), NULL);
23 }
24 
25 static void
column_show_changed_cb(GtkCheckButton * cbutton,GdauiCombo * combo)26 column_show_changed_cb (GtkCheckButton *cbutton, GdauiCombo *combo)
27 {
28 	gint column;
29 	column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cbutton), "column"));
30 	gdaui_data_selector_set_column_visible (GDAUI_DATA_SELECTOR (combo), column,
31 						gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cbutton)));
32 	g_print ("Column %d %s\n", column,
33 		 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cbutton)) ? "visible" : "invisible");
34 }
35 
36 static void
selection_changed_cb(GdauiDataSelector * selector,G_GNUC_UNUSED gpointer data)37 selection_changed_cb (GdauiDataSelector *selector, G_GNUC_UNUSED gpointer data)
38 {
39 	GString *string = NULL;
40 	GArray *sel;
41 	gsize i;
42 
43 	sel = gdaui_data_selector_get_selected_rows (selector);
44 	if (sel) {
45 		for (i = 0; i < sel->len; i++) {
46 			if (!string)
47 				string = g_string_new ("");
48 			else
49 				g_string_append (string, ", ");
50 			g_string_append_printf (string, "%d", g_array_index (sel, gint, i));
51 		}
52 		g_array_free (sel, TRUE);
53 	}
54 	g_print ("Selection changed: %s\n", string ? string->str: "none");
55 }
56 
57 static void
force_select(GtkButton * button,GdauiCombo * combo)58 force_select (GtkButton *button, GdauiCombo *combo)
59 {
60 	GtkEntry *entry;
61 	gint row;
62 	entry = g_object_get_data (G_OBJECT (button), "entry");
63 	row = atoi (gtk_entry_get_text (GTK_ENTRY (entry)));
64 	g_print ("Row %d selected: %s\n", row,
65 		 gdaui_data_selector_select_row (GDAUI_DATA_SELECTOR (combo), row) ? "OK": "Error");
66 }
67 
68 static void
force_unselect(GtkButton * button,GdauiCombo * combo)69 force_unselect (GtkButton *button, GdauiCombo *combo)
70 {
71 	GtkEntry *entry;
72 	gint row;
73 	entry = g_object_get_data (G_OBJECT (button), "entry");
74 	row = atoi (gtk_entry_get_text (GTK_ENTRY (entry)));
75 	gdaui_data_selector_unselect_row (GDAUI_DATA_SELECTOR (combo), row);
76 	g_print ("Row %d UNselected\n", row);
77 }
78 
79 GtkWidget *
do_combo(GtkWidget * do_widget)80 do_combo (GtkWidget *do_widget)
81 {
82 	if (!window) {
83                 GdaStatement *stmt;
84 		GtkWidget *vbox;
85 		GtkWidget *label;
86 		GdaDataModel *model;
87 		GtkWidget *combo;
88 
89 		window = gtk_dialog_new_with_buttons ("GdauiCombo",
90 						      GTK_WINDOW (do_widget),
91 						      0,
92 						      GTK_STOCK_CLOSE,
93 						      GTK_RESPONSE_NONE,
94 						      NULL);
95 
96 		g_signal_connect (window, "response",
97 				  G_CALLBACK (gtk_widget_destroy), NULL);
98 		g_signal_connect (window, "destroy",
99 				  G_CALLBACK (gtk_widget_destroyed), &window);
100 
101 		vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
102 		gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (window))),
103 				    vbox, TRUE, TRUE, 0);
104 		gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
105 
106 		label = gtk_label_new ("The following GdauiCombo widget displays customers");
107 		gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
108 
109 		/* Create the demo widget */
110 		gint cols_index[] = {1};
111 		stmt = gda_sql_parser_parse_string (demo_parser, "select c.id, c.name, count (o.id) as weight from customers c left join orders o on (c.id=o.customer) group by c.name order by c.name", NULL, NULL);
112 		model = gda_connection_statement_execute_select (demo_cnc, stmt, NULL, NULL);
113 		g_object_unref (stmt);
114 		combo = gdaui_combo_new_with_model (model, 1, cols_index);
115 		g_object_unref (model);
116 
117 		gtk_box_pack_start (GTK_BOX (vbox), combo, FALSE, FALSE, 0);
118 
119 		/* options */
120 		GtkWidget *option;
121 
122 		label = gtk_label_new ("");
123 		gtk_label_set_markup (GTK_LABEL (label), "<b>Options:</b>");
124 		gtk_misc_set_alignment (GTK_MISC (label), 0., -1);
125 		gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
126 
127 		option = gtk_check_button_new_with_label ("Add NULL entry");
128 		gtk_box_pack_start (GTK_BOX (vbox), option, FALSE, FALSE, 0);
129 		g_signal_connect (option, "toggled",
130 				  G_CALLBACK (null_entry_changed_cb), combo);
131 
132 		option = gtk_check_button_new_with_label ("Popup as list");
133 		gtk_box_pack_start (GTK_BOX (vbox), option, FALSE, FALSE, 0);
134 		g_signal_connect (option, "toggled",
135 				  G_CALLBACK (popup_as_list_changed_cb), combo);
136 
137 
138 		/* selection */
139 		GdaDataModelIter *sel;
140 		GtkWidget *form;
141 		label = gtk_label_new ("");
142 		gtk_label_set_markup (GTK_LABEL (label), "<b>Current selection is:</b>");
143 		gtk_misc_set_alignment (GTK_MISC (label), 0., -1);
144 		gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
145 
146 		sel = gdaui_data_selector_get_data_set (GDAUI_DATA_SELECTOR (combo));
147 		form = gdaui_basic_form_new (GDA_SET (sel));
148 		gtk_box_pack_start (GTK_BOX (vbox), form, FALSE, FALSE, 0);
149 
150 		g_signal_connect (combo, "selection-changed",
151 				  G_CALLBACK (selection_changed_cb), NULL);
152 
153 		/* force selection */
154 		GtkWidget *hbox, *entry, *button;
155 		label = gtk_label_new ("");
156 		gtk_label_set_markup (GTK_LABEL (label), "<b>Selection forcing:</b>");
157 		gtk_misc_set_alignment (GTK_MISC (label), 0., -1);
158 		gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
159 
160 		hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
161 		gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
162 		label = gtk_label_new ("row number:");
163 		gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
164 		entry = gtk_entry_new ();
165 		gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
166 
167 		hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
168 		gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
169 		button = gtk_button_new_with_label ("Force select");
170 		gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
171 		g_object_set_data (G_OBJECT (button), "entry", entry);
172 		g_signal_connect (button, "clicked",
173 				  G_CALLBACK (force_select), combo);
174 		button = gtk_button_new_with_label ("Force UNselect");
175 		gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
176 		g_object_set_data (G_OBJECT (button), "entry", entry);
177 		g_signal_connect (button, "clicked",
178 				  G_CALLBACK (force_unselect), combo);
179 
180 		/* show/hide columns */
181 		gint i, ncols;
182 		label = gtk_label_new ("");
183 		gtk_label_set_markup (GTK_LABEL (label), "<b>Show columns:</b>");
184 		gtk_misc_set_alignment (GTK_MISC (label), 0., -1);
185 		gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
186 		ncols = gda_data_model_get_n_columns (model);
187 		for (i = 0; i < ncols; i++) {
188 			gchar *str;
189 			str = g_strdup_printf ("Column %d", i);
190 			option = gtk_check_button_new_with_label (str);
191 			g_free (str);
192 			gtk_box_pack_start (GTK_BOX (vbox), option, FALSE, FALSE, 0);
193 			g_object_set_data (G_OBJECT (option), "column", GINT_TO_POINTER (i));
194 			if (i == 1)
195 				gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (option), TRUE);
196 			g_signal_connect (option, "toggled",
197 					  G_CALLBACK (column_show_changed_cb), combo);
198 		}
199 	}
200 
201 	gboolean visible;
202 	g_object_get (G_OBJECT (window), "visible", &visible, NULL);
203 	if (!visible)
204 		gtk_widget_show_all (window);
205 	else {
206 		gtk_widget_destroy (window);
207 		window = NULL;
208 	}
209 
210 	return window;
211 }
212 
213