Modified xmlrpc to send irreco version in correct format.
[irreco.git] / irreco / src / core / irreco_backend_dlg.c
blob7de1ee28508b632fe2e8f30d8c390ea32a1397c2
1 /*
2 * irreco - Ir Remote Control
3 * Copyright (C) 2007 Arto Karppinen (arto.karppinen@iki.fi)
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 *
10 * This program 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
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 #include "irreco_backend_dlg.h"
21 #include "irreco_config.h"
22 #include "irreco_backend_select_dlg.h"
24 /**
25 * @typedef IrrecoBackendDlg
27 * Show a dialog where the user can create, destroy and configure backend
28 * instances.
31 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
32 /* Prototypes & Datatypes */
33 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
35 enum {
36 IRRECO_BACKEND_NEW = 1,
37 IRRECO_BACKEND_DELETE,
38 IRRECO_BACKEND_CONFIGURE
41 static void irreco_backend_dlg_response_new(IrrecoBackendDlg *self);
42 static void irreco_backend_dlg_response_delete(IrrecoBackendDlg *self);
43 static void irreco_backend_dlg_response_configure(IrrecoBackendDlg *self);
47 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
48 /* Construction & Destruction */
49 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
51 G_DEFINE_TYPE(IrrecoBackendDlg, irreco_backend_dlg, IRRECO_TYPE_DLG)
53 static void irreco_backend_dlg_finalize(GObject * object)
55 G_OBJECT_CLASS(irreco_backend_dlg_parent_class)->finalize(object);
58 static void irreco_backend_dlg_class_init(IrrecoBackendDlgClass * klass)
60 GObjectClass *object_class = G_OBJECT_CLASS(klass);
61 object_class->finalize = irreco_backend_dlg_finalize;
64 static void irreco_backend_dlg_init(IrrecoBackendDlg * self)
66 GtkWidget *align;
67 IRRECO_ENTER
69 /* Construct dialog. */
70 gtk_window_set_title(GTK_WINDOW(self), _("Device controllers"));
71 gtk_window_set_modal(GTK_WINDOW(self), TRUE);
72 gtk_window_set_destroy_with_parent(GTK_WINDOW(self), TRUE);
73 gtk_dialog_set_has_separator(GTK_DIALOG(self), FALSE);
74 gtk_dialog_add_buttons(GTK_DIALOG(self),
75 GTK_STOCK_NEW, IRRECO_BACKEND_NEW,
76 GTK_STOCK_DELETE, IRRECO_BACKEND_DELETE,
77 _("Configure"), IRRECO_BACKEND_CONFIGURE,
78 GTK_STOCK_OK, GTK_RESPONSE_OK,
79 NULL);
81 /* Create new listbox and add it to the dialog. */
82 self->listbox = irreco_listbox_text_new_with_autosize(0, 600, 100, 250);
83 align = irreco_gtk_align(self->listbox, 0, 0, 1, 1, 8, 8, 8, 8);
84 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(self)->vbox),
85 align, 0, 0, 0);
86 gtk_widget_show_all(GTK_WIDGET(self));
87 IRRECO_RETURN
90 GtkWidget *irreco_backend_dlg_new(IrrecoData *irreco_data,
91 GtkWindow *parent)
93 IrrecoBackendDlg *self;
94 IRRECO_ENTER
96 self = g_object_new(IRRECO_TYPE_BACKEND_DLG, NULL);
97 irreco_dlg_set_parent(IRRECO_DLG(self), parent);
98 irreco_backend_dlg_set_irreco_data(self, irreco_data);
99 IRRECO_RETURN_PTR(self);
104 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
105 /* Private Functions */
106 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
109 * Generate the listbox.
111 static void irreco_backend_dlg_populate_listbox(IrrecoBackendDlg *self)
113 IrrecoBackendManager *manager;
114 IRRECO_ENTER
116 irreco_listbox_clear(IRRECO_LISTBOX(self->listbox));
117 manager = self->irreco_data->irreco_backend_manager;
118 IRRECO_BACKEND_MANAGER_FOREACH_INSTANCE(manager, instance)
119 IRRECO_DEBUG("Adding backend instance \"%s\" to list.\n",
120 instance->name);
121 irreco_backend_instance_get_description(instance);
122 irreco_listbox_text_append(IRRECO_LISTBOX_TEXT(self->listbox),
123 irreco_backend_instance_get_name_and_description(
124 instance), NULL);
125 IRRECO_STRING_TABLE_FOREACH_END
126 IRRECO_RETURN
130 * Get the IrrecoBackendInstance which matches the current selection.
132 static gboolean
133 irreco_backend_dlg_get_instance(IrrecoBackendDlg *self,
134 IrrecoBackendInstance **instance)
136 gint sel_index;
137 IrrecoBackendManager *manager;
138 IRRECO_ENTER
140 manager = self->irreco_data->irreco_backend_manager;
141 sel_index = irreco_listbox_get_selection_index(
142 IRRECO_LISTBOX(self->listbox));
144 if (sel_index >= 0) {
145 if (irreco_string_table_index(manager->instance_table,
146 sel_index, NULL,
147 (gpointer *)instance)) {
148 IRRECO_RETURN_BOOL(TRUE);
149 } else {
150 IRRECO_ERROR("No instance found for index \"%i\"\n",
151 sel_index);
153 } else {
154 irreco_info_dlg(GTK_WINDOW(self),
155 _("Please select something."));
157 IRRECO_RETURN_BOOL(FALSE);
162 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
163 /* Functions */
164 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
166 void irreco_show_backend_dlg(IrrecoData *irreco_data,
167 GtkWindow *parent)
169 gboolean loop = TRUE;
170 IrrecoBackendDlg *self;
171 IRRECO_ENTER
173 self = IRRECO_BACKEND_DLG(irreco_backend_dlg_new(irreco_data, parent));
174 do {
175 switch (gtk_dialog_run(GTK_DIALOG(self))) {
176 case IRRECO_BACKEND_NEW:
177 irreco_backend_dlg_response_new(self);
178 break;
180 case IRRECO_BACKEND_DELETE:
181 irreco_backend_dlg_response_delete(self);
182 break;
184 case IRRECO_BACKEND_CONFIGURE:
185 irreco_backend_dlg_response_configure(self);
186 break;
188 case GTK_RESPONSE_OK:
189 loop = FALSE;
190 break;
192 gtk_widget_grab_focus(self->listbox);
193 } while (loop == TRUE);
195 gtk_widget_destroy(GTK_WIDGET(self));
196 IRRECO_RETURN
199 void irreco_backend_dlg_set_irreco_data(IrrecoBackendDlg *self,
200 IrrecoData *irreco_data)
202 IRRECO_ENTER
203 self->irreco_data = irreco_data;
204 irreco_backend_dlg_populate_listbox(self);
205 IRRECO_RETURN
210 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
211 /* Events and Callbacks */
212 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
214 static void irreco_backend_dlg_response_new(IrrecoBackendDlg *self)
216 IrrecoBackendLib *lib;
217 IrrecoBackendManager *manager;
218 IrrecoBackendInstance *instance;
219 IRRECO_ENTER
221 manager = self->irreco_data->irreco_backend_manager;
222 if (irreco_show_backend_select_dlg(self->irreco_data,
223 GTK_WINDOW(self),
224 &lib)) {
225 instance = irreco_backend_manager_create_instance(
226 manager, lib, NULL, NULL);
227 if (instance != NULL) {
228 irreco_backend_instance_configure(instance, GTK_WINDOW(
229 self));
230 irreco_backend_instance_save_to_conf(instance);
231 irreco_backend_instance_get_devcmd_list(instance);
232 irreco_backend_dlg_populate_listbox(self);
233 irreco_config_save_backends(manager);
237 IRRECO_RETURN
240 static void irreco_backend_dlg_response_delete(IrrecoBackendDlg *self)
242 IrrecoBackendManager *manager;
243 IrrecoBackendInstance *instance;
244 IRRECO_ENTER
246 manager = self->irreco_data->irreco_backend_manager;
247 if (irreco_backend_dlg_get_instance(self, &instance)) {
249 GString *message = g_string_new(NULL);
250 g_string_append_printf(
251 message, _("Delete %s?\n\n%i commands in command chains"
252 " depend on this backend. Are you sure you want to "
253 "delete this backend."),
254 irreco_backend_instance_get_name_and_description(
255 instance), instance->irreco_cmd_dependencies->len);
256 if (!irreco_yes_no_dlg(GTK_WINDOW(self),
257 message->str)) {
258 g_string_free(message, TRUE);
259 IRRECO_RETURN
261 g_string_free(message, TRUE);
263 if (!irreco_backend_manager_destroy_instance(manager,
264 instance)) {
265 irreco_error_dlg(GTK_WINDOW(self),
266 _("Delete failed."));
267 } else {
268 irreco_config_save_backends(manager);
269 irreco_backend_dlg_populate_listbox(self);
273 IRRECO_RETURN
276 static void irreco_backend_dlg_response_configure(IrrecoBackendDlg *self)
278 IrrecoBackendManager *manager;
279 IrrecoBackendInstance *instance;
280 IRRECO_ENTER
282 manager = self->irreco_data->irreco_backend_manager;
283 if (irreco_backend_dlg_get_instance(self, &instance)) {
284 irreco_backend_instance_configure(instance, GTK_WINDOW(
285 self));
286 irreco_backend_instance_save_to_conf(instance);
287 irreco_backend_instance_get_devcmd_list(instance);
288 irreco_backend_dlg_populate_listbox(self);
289 irreco_config_save_backends(manager);
292 IRRECO_RETURN