1 /*
2  * Copyright (C) 2009 - 2011 Vivien Malerba <malerba@gnome-db.org>
3  * Copyright (C) 2010 David King <davidk@openismus.com>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
18  * Boston, MA  02110-1301, USA.
19  */
20 
21 #include <string.h>
22 #include <libgda/gda-config.h>
23 #include <libgda-ui/gdaui-provider-selector.h>
24 #include <libgda-ui/gdaui-combo.h>
25 
26 struct _GdauiProviderSelectorPrivate {
27 	gint dummy;
28 };
29 
30 static void gdaui_provider_selector_class_init (GdauiProviderSelectorClass *klass);
31 static void gdaui_provider_selector_init       (GdauiProviderSelector *selector,
32 						GdauiProviderSelectorClass *klass);
33 static void gdaui_provider_selector_finalize   (GObject *object);
34 static void gdaui_provider_selector_show       (GtkWidget *widget);
35 
36 static GObjectClass *parent_class = NULL;
37 
38 /* column to display */
39 static gint cols[] = {0};
40 
41 /*
42  * Private functions
43  */
44 
45 static void
show_providers(GdauiProviderSelector * selector)46 show_providers (GdauiProviderSelector *selector)
47 {
48 	GdaDataModel *model;
49 
50 	model = gda_config_list_providers ();
51 	gdaui_combo_set_model (GDAUI_COMBO (selector), model, 1, cols);
52 	g_object_unref (model);
53 }
54 
55 static void
gdaui_provider_selector_show(GtkWidget * widget)56 gdaui_provider_selector_show (GtkWidget *widget)
57 {
58 	GSList *list;
59 	GValue *tmpval;
60 	GdauiProviderSelector *selector;
61 
62 	selector = (GdauiProviderSelector *) widget;
63 	GTK_WIDGET_CLASS (parent_class)->show (widget);
64 	g_value_set_string (tmpval = gda_value_new (G_TYPE_STRING), "SQLite");
65 	list = g_slist_append (NULL, tmpval);
66 	_gdaui_combo_set_selected_ext (GDAUI_COMBO (selector), list, cols);
67 	gda_value_free ((GValue *)(list->data));
68 	g_slist_free (list);
69 }
70 
71 /*
72  * GdauiProviderSelector class implementation
73  */
74 
75 static void
gdaui_provider_selector_class_init(GdauiProviderSelectorClass * klass)76 gdaui_provider_selector_class_init (GdauiProviderSelectorClass *klass)
77 {
78 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
79 
80 	parent_class = g_type_class_peek_parent (klass);
81 
82 	object_class->finalize = gdaui_provider_selector_finalize;
83 	GTK_WIDGET_CLASS (klass)->show = gdaui_provider_selector_show;
84 }
85 
86 static void
gdaui_provider_selector_init(GdauiProviderSelector * selector,G_GNUC_UNUSED GdauiProviderSelectorClass * klass)87 gdaui_provider_selector_init (GdauiProviderSelector *selector,
88 			      G_GNUC_UNUSED GdauiProviderSelectorClass *klass)
89 {
90 	g_return_if_fail (GDAUI_IS_PROVIDER_SELECTOR (selector));
91 
92 	selector->priv = g_new0 (GdauiProviderSelectorPrivate, 1);
93 	show_providers (selector);
94 }
95 
96 static void
gdaui_provider_selector_finalize(GObject * object)97 gdaui_provider_selector_finalize (GObject *object)
98 {
99 	GdauiProviderSelector *selector = (GdauiProviderSelector *) object;
100 
101 	g_return_if_fail (GDAUI_IS_PROVIDER_SELECTOR (selector));
102 
103 	g_free (selector->priv);
104 	selector->priv = NULL;
105 
106 	parent_class->finalize (object);
107 }
108 
109 GType
gdaui_provider_selector_get_type(void)110 gdaui_provider_selector_get_type (void)
111 {
112 	static GType type = 0;
113 
114 	if (G_UNLIKELY (type == 0)) {
115 		static const GTypeInfo info = {
116 			sizeof (GdauiProviderSelectorClass),
117 			(GBaseInitFunc) NULL,
118 			(GBaseFinalizeFunc) NULL,
119 			(GClassInitFunc) gdaui_provider_selector_class_init,
120 			NULL,
121 			NULL,
122 			sizeof (GdauiProviderSelector),
123 			0,
124 			(GInstanceInitFunc) gdaui_provider_selector_init,
125 			0
126 		};
127 		type = g_type_register_static (GDAUI_TYPE_COMBO, "GdauiProviderSelector", &info, 0);
128 	}
129 	return type;
130 }
131 
132 /**
133  * gdaui_provider_selector_new:
134  *
135  * Create a new #GdauiProviderSelector widget.
136  *
137  * Returns: (transfer full): the newly created widget.
138  */
139 GtkWidget *
gdaui_provider_selector_new(void)140 gdaui_provider_selector_new (void)
141 {
142 	GdauiProviderSelector *selector;
143 
144 	selector = g_object_new (GDAUI_TYPE_PROVIDER_SELECTOR, NULL);
145 	return GTK_WIDGET (selector);
146 }
147 
148 /**
149  * gdaui_provider_selector_get_provider:
150  * @selector: a #GdauiProviderSelector widget
151  *
152  * Get the selected provider.
153  *
154  * Returns: (transfer none): the selected provider, or %NULL if no provider is selected
155  *
156  * Since: 4.2
157  */
158 const gchar *
gdaui_provider_selector_get_provider(GdauiProviderSelector * selector)159 gdaui_provider_selector_get_provider (GdauiProviderSelector *selector)
160 {
161 	GSList *list;
162 	const gchar *str;
163 
164 	g_return_val_if_fail (GDAUI_IS_PROVIDER_SELECTOR (selector), NULL);
165 	list = _gdaui_combo_get_selected (GDAUI_COMBO (selector));
166 	if (list && list->data) {
167 		str = g_value_get_string ((GValue *)(list->data));
168 		g_slist_free (list);
169 		return str;
170 	}
171 	else
172 		return NULL;
173 }
174 
175 /**
176  * gdaui_provider_selector_set_provider:
177  * @selector: a #GdauiProviderSelector widget
178  * @provider: (allow-none): the provider to be selected, or %NULL for the default (SQLite)
179  *
180  * Forces @selector to be set on @provider
181  *
182  * Returns: %TRUE if @provider has been selected
183  *
184  * Since: 4.2
185  */
186 gboolean
gdaui_provider_selector_set_provider(GdauiProviderSelector * selector,const gchar * provider)187 gdaui_provider_selector_set_provider (GdauiProviderSelector *selector, const gchar *provider)
188 {
189 	GSList *list;
190 	gboolean retval;
191 	GValue *tmpval;
192 
193 	g_return_val_if_fail (GDAUI_IS_PROVIDER_SELECTOR (selector), FALSE);
194 
195 	if (provider && *provider)
196 		g_value_set_string (tmpval = gda_value_new (G_TYPE_STRING), provider);
197 	else
198 		g_value_set_string (tmpval = gda_value_new (G_TYPE_STRING), "SQLite");
199 
200 	list = g_slist_append (NULL, tmpval);
201 	retval = _gdaui_combo_set_selected_ext (GDAUI_COMBO (selector), list, cols);
202 	gda_value_free ((GValue *)(list->data));
203 	g_slist_free (list);
204 
205 	return retval;
206 }
207 
208 /**
209  * gdaui_provider_selector_get_provider_obj:
210  * @selector: a #GdauiProviderSelector widget
211  *
212  * Get the selected provider as a #GdaServerProvider object
213  *
214  * Returns: (transfer none): a #GdaServerProvider or %NULL if an error occurred
215  *
216  * Since: 4.2
217  */
218 GdaServerProvider *
gdaui_provider_selector_get_provider_obj(GdauiProviderSelector * selector)219 gdaui_provider_selector_get_provider_obj (GdauiProviderSelector *selector)
220 {
221 	const gchar *pname;
222 
223 	g_return_val_if_fail (GDAUI_IS_PROVIDER_SELECTOR (selector), NULL);
224 
225 	pname = gdaui_provider_selector_get_provider (selector);
226 	if (pname)
227 		return gda_config_get_provider (pname, NULL);
228 	else
229 		return NULL;
230 }
231