00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00025 #include <gtk/gtk.h>
00026 #include <stdlib.h>
00027
00028 #include "application-data.h"
00029 #include "frame-common.h"
00030 #include "frame-new-dialog.h"
00031 #include "frame-private.h"
00032 #include "frame-utilities.h"
00033 #include "machine.h"
00034 #include "time-period.h"
00035
00036
00037
00052 static gboolean time_period_combo_free_each (GtkTreeModel *model,
00053 GtkTreePath *path,
00054 GtkTreeIter *iter,
00055 gpointer data)
00056 {
00057 gpointer ptr;
00058
00059 gtk_tree_model_get (model, iter, 1, &ptr, -1);
00060 time_period_free ((time_period_t *) ptr);
00061
00062 return FALSE;
00063 }
00064
00065
00066
00067 void frame_populate_time_period_combo (GtkWidget *combo, plugin_t *plugin, time_period_t *active_period)
00068 {
00069 gchar *name = NULL;
00070 GtkListStore *store = GTK_LIST_STORE (gtk_combo_box_get_model (GTK_COMBO_BOX(combo)));
00071 GtkTreeIter iter = {0};
00072 GList *list = NULL;
00073 GList *list_iter = NULL;
00074
00075 gtk_tree_model_foreach (GTK_TREE_MODEL (store),
00076 time_period_combo_free_each,
00077 NULL);
00078 gtk_list_store_clear (store);
00079
00080 if (plugin)
00081 list = plugin_get_time_periods (plugin);
00082 else
00083 return;
00084
00085 if (list) {
00086 list_iter = list;
00087 do {
00088 time_period_t *p = list_iter->data;
00089 name = time_period_get_display_name (p, TRUE);
00090 gtk_list_store_append (store, &iter);
00091 gtk_list_store_set (store, &iter, 0, name, 1, (gpointer) p, -1);
00092 g_free (name);
00093
00094 if (time_period_cmp (p, active_period) == 0)
00095 gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combo), &iter);
00096 } while ((list_iter = g_list_next (list_iter)) != NULL);
00097
00098 g_list_free (list);
00099 }
00100
00101 if (gtk_combo_box_get_active (GTK_COMBO_BOX (combo)) == -1)
00102 gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
00103 }
00104
00105
00106
00108 static gint g_strcmp0_func (gconstpointer a, gconstpointer b)
00109 {
00110 return g_strcmp0 (a, b);
00111 }
00112
00113
00114 void frame_populate_tool_type_combo (GtkWidget *combo, machine_t *machine, gchar *active_tool)
00115 {
00116 synema_instance_t *inst = synema_instance ();
00117 GList *list = NULL;
00118 GtkListStore *store = GTK_LIST_STORE (gtk_combo_box_get_model (GTK_COMBO_BOX(combo)));
00119 GtkTreeIter iter = {0};
00120
00121 gtk_list_store_clear (store);
00122
00123 if (machine) {
00124 if (machine_is_all_machines (machine)) {
00125 char *name = NULL;
00126 char *prev = NULL;
00127 GList *maciter = inst->machines_list;
00128 GList *allplugins = g_list_copy (machine->monitoring_tools);
00129 GList *pliter = NULL;
00130
00131 if (maciter) {
00132 do {
00133 machine_t *tmpmac = maciter->data;
00134 pliter = g_list_copy (tmpmac->monitoring_tools);
00135 if (pliter)
00136 allplugins = g_list_concat (allplugins, pliter);
00137 } while ((maciter = g_list_next (maciter)) != NULL);
00138 }
00139
00140 allplugins = g_list_sort (allplugins, g_strcmp0_func);
00141
00142 if (allplugins) {
00143 pliter = allplugins;
00144 do {
00145 prev = name;
00146 name = pliter->data;
00147 if (!g_strcmp0 (prev, name) == 0) {
00148 gtk_list_store_append (store, &iter);
00149 gtk_list_store_set (store, &iter, 0, plugin_get_display_name (plugin_list_find (name)), 1, name, -1);
00150 if (g_strcmp0 (name, active_tool) == 0)
00151 gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combo), &iter);
00152 }
00153 } while ((pliter = g_list_next (pliter)) != NULL);
00154 }
00155 g_list_free (allplugins);
00156
00157 } else if (machine->monitoring_tools) {
00158 list = machine->monitoring_tools;
00159 do {
00160 char *tool = list->data;
00161 gtk_list_store_append (store, &iter);
00162 gtk_list_store_set (store, &iter, 0, plugin_get_display_name (plugin_list_find (tool)), 1, tool, -1);
00163 if (g_strcmp0 (tool, active_tool) == 0)
00164 gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combo), &iter);
00165 } while ((list = g_list_next (list)) != NULL);
00166 }
00167 }
00168
00169 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store), 0, GTK_SORT_ASCENDING);
00170 if (gtk_combo_box_get_active (GTK_COMBO_BOX (combo)) == -1)
00171 gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
00172 }
00173
00174
00175
00176 void frame_populate_machine_combo (GtkWidget *combo, GList *machines_list, machine_t *active_machine)
00177 {
00178 GList *list_iter = NULL;
00179 GtkListStore *store = GTK_LIST_STORE (gtk_combo_box_get_model (GTK_COMBO_BOX(combo)));
00180 GtkTreeIter iter = {0};
00181
00182 gtk_list_store_clear (store);
00183
00184 if (machines_list) {
00185 list_iter = machines_list;
00186 do {
00187 machine_t *mac = list_iter->data;
00188 const char *name = machine_get_display_name (mac);
00189 gtk_list_store_append (store, &iter);
00190 gtk_list_store_set (store, &iter, 0, name, 1, (gpointer)mac, -1);
00191
00192 if (machine_cmp (active_machine, mac) == 0)
00193 gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combo), &iter);
00194 } while ((list_iter = g_list_next (list_iter)) != NULL);
00195 }
00196
00197 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store), 0, GTK_SORT_ASCENDING);
00198 if (gtk_combo_box_get_active (GTK_COMBO_BOX (combo)) == -1)
00199 gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
00200 }
00201
00202
00203
00214 static void frame_new_dialog_tool_type_changed (GtkComboBox *tooltype, gpointer user_data)
00215 {
00216 synema_instance_t *inst = synema_instance ();
00217 gchar *cur_tool = NULL;
00218 GtkTreeIter iter = {0};
00219 GtkWidget *period = NULL;
00220 GValue value = {0,};
00221 plugin_t **plugin = (plugin_t **) user_data;
00222 time_period_t cur_period = {-1,-1};
00223
00224 *plugin = NULL;
00225
00226 if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (tooltype), &iter)) {
00227 gtk_tree_model_get_value (gtk_combo_box_get_model (GTK_COMBO_BOX(tooltype)),
00228 &iter, 1, &value);
00229 cur_tool = g_value_dup_string (&value);
00230 *plugin = plugin_list_find (cur_tool);
00231 g_free (cur_tool);
00232 g_value_unset (&value);
00233 }
00234
00235 period = (GtkWidget *) gtk_builder_get_object (inst->builder, "time_combo");
00236 if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (period), &iter)) {
00237 gtk_tree_model_get_value (gtk_combo_box_get_model (GTK_COMBO_BOX(period)),
00238 &iter, 1, &value);
00239 time_period_t *ptr = (time_period_t *) g_value_get_pointer (&value);
00240 cur_period.type = ptr->type;
00241 cur_period.value = ptr->value;
00242 g_value_unset (&value);
00243 }
00244
00245 frame_populate_time_period_combo (period, *plugin, &cur_period);
00246
00247 g_signal_emit_by_name ((gpointer) period, "changed", user_data);
00248
00249 gtk_widget_set_sensitive ((GtkWidget *) gtk_builder_get_object (inst->builder, "create_button"),
00250 (gtk_combo_box_get_active (tooltype) != -1));
00251 }
00252
00253
00254
00265 static void frame_new_dialog_machine_changed (GtkComboBox *machine, gpointer user_data)
00266 {
00267 synema_instance_t *inst = synema_instance ();
00268 gchar *cur_tool = NULL;
00269 GtkTreeIter iter = {0};
00270 GtkWidget *tooltype = NULL;
00271 GValue value = {0,};
00272 machine_t *cur_machine = NULL;
00273
00274 tooltype = (GtkWidget *) gtk_builder_get_object (inst->builder, "type_combo");
00275
00276 if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (machine), &iter)) {
00277 gtk_tree_model_get_value (gtk_combo_box_get_model (GTK_COMBO_BOX(machine)),
00278 &iter, 1, &value);
00279 cur_machine = (machine_t *) g_value_get_pointer (&value);
00280 g_value_unset (&value);
00281 }
00282
00283 if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (tooltype), &iter)) {
00284 gtk_tree_model_get_value (gtk_combo_box_get_model (GTK_COMBO_BOX(tooltype)),
00285 &iter, 1, &value);
00286 cur_tool = g_value_dup_string (&value);
00287 g_value_unset (&value);
00288 }
00289
00290 g_signal_handlers_disconnect_by_func (tooltype,
00291 G_CALLBACK (frame_new_dialog_tool_type_changed),
00292 user_data);
00293
00294 frame_populate_tool_type_combo (tooltype, cur_machine, cur_tool);
00295 g_free (cur_tool);
00296
00297 g_signal_connect (tooltype, "changed",
00298 G_CALLBACK (frame_new_dialog_tool_type_changed),
00299 user_data);
00300
00301 g_signal_emit_by_name ((gpointer) tooltype, "changed", user_data);
00302 }
00303
00304
00305
00306 void frame_on_new (GtkToolButton *button, gpointer user_data)
00307 {
00308 synema_instance_t *inst = synema_instance ();
00309 frame_t *frame = NULL;
00310 gchar *path = NULL;
00311 gchar *cur_plugin = NULL;
00312 gchar *dlg_objects[] = {"new_frame_dialog", "type_store", "time_store", "machine_store", "window-new_image", NULL};
00313 GError *err = NULL;
00314 GtkCellRenderer *renderer = NULL;
00315 GtkTreeIter iter = {0};
00316 GtkWidget *dialog = NULL;
00317 GtkWidget *machine = NULL;
00318 GtkWidget *tooltype = NULL;
00319 GtkWidget *period = NULL;
00320 GValue value = {0,};
00321 machine_t *cur_machine = NULL;
00322 plugin_t *plugin = NULL;
00323 size_ratio_t cur_size = NORMAL;
00324 time_period_t *cur_period = NULL;
00325
00326
00327
00328 path = g_strdup_printf ("%s/window.ui", inst->data_dir);
00329 gtk_builder_add_objects_from_file (inst->builder, path, dlg_objects, &err);
00330 g_free (path);
00331 if (err) {
00332 g_warning ("frame_on_new: %s", err->message);
00333 g_clear_error (&err);
00334 return;
00335 }
00336
00337
00338
00339 machine = (GtkWidget *) gtk_builder_get_object (inst->builder, "machine_combo");
00340 renderer = gtk_cell_renderer_text_new ();
00341 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (machine), renderer, FALSE);
00342 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (machine), renderer,
00343 "text", 0, NULL);
00344
00345 frame_populate_machine_combo (machine, inst->machines_list, NULL);
00346 g_signal_connect (machine, "changed",
00347 G_CALLBACK (frame_new_dialog_machine_changed),
00348 (gpointer) &plugin);
00349
00350
00351
00352 tooltype = (GtkWidget *) gtk_builder_get_object (inst->builder, "type_combo");
00353 renderer = gtk_cell_renderer_text_new ();
00354 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (tooltype), renderer, FALSE);
00355 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (tooltype), renderer,
00356 "text", 0, NULL);
00357
00358 if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (machine), &iter)) {
00359 gtk_tree_model_get_value (gtk_combo_box_get_model (GTK_COMBO_BOX(machine)),
00360 &iter, 1, &value);
00361 cur_machine = (machine_t *) g_value_get_pointer (&value);
00362 g_value_unset (&value);
00363 }
00364
00365 frame_populate_tool_type_combo (tooltype, cur_machine, NULL);
00366 g_signal_connect (tooltype, "changed",
00367 G_CALLBACK (frame_new_dialog_tool_type_changed),
00368 (gpointer) &plugin);
00369
00370
00371
00372 period = (GtkWidget *) gtk_builder_get_object (inst->builder, "time_combo");
00373 renderer = gtk_cell_renderer_text_new ();
00374 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (period), renderer, FALSE);
00375 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (period), renderer,
00376 "text", 0, NULL);
00377
00378 if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (tooltype), &iter)) {
00379 gtk_tree_model_get_value (gtk_combo_box_get_model (GTK_COMBO_BOX(tooltype)),
00380 &iter, 1, &value);
00381 gchar *cur_tool = g_value_dup_string (&value);
00382 plugin = plugin_list_find (cur_tool);
00383 g_free (cur_tool);
00384 g_value_unset (&value);
00385 }
00386
00387 frame_populate_time_period_combo (period, plugin, NULL);
00388
00389 gtk_widget_set_sensitive ((GtkWidget *) gtk_builder_get_object (inst->builder, "create_button"),
00390 (gtk_combo_box_get_active (GTK_COMBO_BOX (tooltype)) != -1));
00391
00392
00393
00394 dialog = (GtkWidget *) gtk_builder_get_object (inst->builder, "new_frame_dialog");
00395 gint result = gtk_dialog_run (GTK_DIALOG (dialog));
00396
00397
00398
00399
00400
00401 switch (result) {
00402 case GTK_RESPONSE_OK:
00403 if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (machine), &iter)) {
00404 gtk_tree_model_get_value (gtk_combo_box_get_model (GTK_COMBO_BOX(machine)),
00405 &iter, 1, &value);
00406 cur_machine = (machine_t *) g_value_get_pointer (&value);
00407 g_value_unset (&value);
00408 }
00409
00410 if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (tooltype), &iter)) {
00411 gtk_tree_model_get_value (gtk_combo_box_get_model (GTK_COMBO_BOX(tooltype)),
00412 &iter, 1, &value);
00413 cur_plugin = g_value_dup_string (&value);
00414 g_value_unset (&value);
00415 }
00416
00417 if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (period), &iter)) {
00418 gtk_tree_model_get_value (gtk_combo_box_get_model (GTK_COMBO_BOX(period)),
00419 &iter, 1, &value);
00420 cur_period = (time_period_t *) g_value_get_pointer (&value);
00421 g_value_unset (&value);
00422 }
00423
00424
00425 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON((GtkWidget *)
00426 gtk_builder_get_object (inst->builder, "size_large"))))
00427 cur_size = LARGE;
00428 frame = frame_new (cur_plugin);
00429 if (!frame) {
00430 g_warning ("frame_on_new: Could not create frame of type %s", cur_plugin);
00431 error_dialog ("<b>Failed to create frame</b>\n\nCould not create a frame for the plugin ā%sā", cur_plugin);
00432 } else {
00433 if (frame_initialise (frame, cur_size, cur_machine, cur_period) == 0) {
00434 if (frame_table_add (inst->current_table, frame) != 0) {
00435 g_warning ("frame_on_new: Error while adding the new frame to the table");
00436 error_dialog ("<b>Failed to create frame</b>\n\nThe frame could not be added to the table");
00437 }
00438 } else {
00439 g_warning ("frame_on_new: Error while initialising the new frame");
00440 error_dialog ("<b>Failed to create frame</b>\n\nThe frame could not be initialised");
00441 }
00442 }
00443
00444 g_free (cur_plugin);
00445 break;
00446 default:
00447 break;
00448 }
00449
00450 gtk_tree_model_foreach (gtk_combo_box_get_model (GTK_COMBO_BOX(period)),
00451 time_period_combo_free_each,
00452 NULL);
00453 gtk_widget_destroy (dialog);
00454 }