2 * irreco - Ir Remote Control
3 * Copyright (C) 2007 Arto Karppinen (arto.karppinen@iki.fi)
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.
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"
25 * @typedef IrrecoBackendDlg
27 * Show a dialog where the user can create, destroy and configure backend
31 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
32 /* Prototypes & Datatypes */
33 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
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
)
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
,
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
),
86 gtk_widget_show_all(GTK_WIDGET(self
));
90 GtkWidget
*irreco_backend_dlg_new(IrrecoData
*irreco_data
,
93 IrrecoBackendDlg
*self
;
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
;
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",
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(
125 IRRECO_STRING_TABLE_FOREACH_END
130 * Get the IrrecoBackendInstance which matches the current selection.
133 irreco_backend_dlg_get_instance(IrrecoBackendDlg
*self
,
134 IrrecoBackendInstance
**instance
)
137 IrrecoBackendManager
*manager
;
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
,
147 (gpointer
*)instance
)) {
148 IRRECO_RETURN_BOOL(TRUE
);
150 IRRECO_ERROR("No instance found for index \"%i\"\n",
154 irreco_info_dlg(GTK_WINDOW(self
),
155 _("Please select something."));
157 IRRECO_RETURN_BOOL(FALSE
);
162 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
164 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
166 void irreco_show_backend_dlg(IrrecoData
*irreco_data
,
169 gboolean loop
= TRUE
;
170 IrrecoBackendDlg
*self
;
173 self
= IRRECO_BACKEND_DLG(irreco_backend_dlg_new(irreco_data
, parent
));
175 switch (gtk_dialog_run(GTK_DIALOG(self
))) {
176 case IRRECO_BACKEND_NEW
:
177 irreco_backend_dlg_response_new(self
);
180 case IRRECO_BACKEND_DELETE
:
181 irreco_backend_dlg_response_delete(self
);
184 case IRRECO_BACKEND_CONFIGURE
:
185 irreco_backend_dlg_response_configure(self
);
188 case GTK_RESPONSE_OK
:
192 gtk_widget_grab_focus(self
->listbox
);
193 } while (loop
== TRUE
);
195 gtk_widget_destroy(GTK_WIDGET(self
));
199 void irreco_backend_dlg_set_irreco_data(IrrecoBackendDlg
*self
,
200 IrrecoData
*irreco_data
)
203 self
->irreco_data
= irreco_data
;
204 irreco_backend_dlg_populate_listbox(self
);
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
;
221 manager
= self
->irreco_data
->irreco_backend_manager
;
222 if (irreco_show_backend_select_dlg(self
->irreco_data
,
225 instance
= irreco_backend_manager_create_instance(
226 manager
, lib
, NULL
, NULL
);
227 if (instance
!= NULL
) {
228 irreco_backend_instance_configure(instance
, GTK_WINDOW(
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
);
240 static void irreco_backend_dlg_response_delete(IrrecoBackendDlg
*self
)
242 IrrecoBackendManager
*manager
;
243 IrrecoBackendInstance
*instance
;
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
),
258 g_string_free(message
, TRUE
);
261 g_string_free(message
, TRUE
);
263 if (!irreco_backend_manager_destroy_instance(manager
,
265 irreco_error_dlg(GTK_WINDOW(self
),
266 _("Delete failed."));
268 irreco_config_save_backends(manager
);
269 irreco_backend_dlg_populate_listbox(self
);
276 static void irreco_backend_dlg_response_configure(IrrecoBackendDlg
*self
)
278 IrrecoBackendManager
*manager
;
279 IrrecoBackendInstance
*instance
;
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(
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
);