00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00026 #include <glib.h>
00027
00028 #include "application-data.h"
00029 #include "frame-actions.h"
00030 #include "frame-utilities.h"
00031 #include "plugins.h"
00032
00033
00034
00035 static gint time_period_cmp_func (gconstpointer a, gconstpointer b)
00036 {
00037 return time_period_cmp (a, b);
00038 }
00039
00040
00041
00042 static void frame_try_set_period (frame_t *frame, gpointer period)
00043 {
00044 synema_instance_t *inst = synema_instance ();
00045 gboolean found = FALSE;
00046 gchar *tmp = NULL;
00047 GtkComboBox *combo = NULL;
00048 GtkTreeIter iter;
00049 GtkTreeModel *combomodel = NULL;
00050 time_period_t tmp_period = {-1,-1};
00051
00052 combo = GTK_COMBO_BOX (gtk_builder_get_object (frame->builder, "display_period"));
00053 combomodel = gtk_combo_box_get_model (combo);
00054
00055 if (gtk_tree_model_get_iter_first (combomodel, &iter)) {
00056 found = FALSE;
00057 do {
00058 gtk_tree_model_get (combomodel, &iter, 1, &tmp_period.type, 2, &tmp_period.value, -1);
00059 if (time_period_cmp (&tmp_period, period) == 0) {
00060 gtk_combo_box_set_active_iter (combo, &iter);
00061 found = TRUE;
00062 }
00063 } while (!found && (gtk_tree_model_iter_next (combomodel, &iter)));
00064
00065 if (!found) {
00066 if (inst->settings->unhandled_action_period == UA_ERROR_MESSAGE) {
00067 tmp = time_period_get_display_name (period, TRUE);
00068 frame_display_error_message (frame, ERROR_PERIOD, "This frame can't display data for the %s time period", tmp);
00069 g_free (tmp);
00070 } else if (inst->settings->unhandled_action_period == UA_TRY_NEAREST) {
00071
00072 }
00073 }
00074 }
00075
00076 if ((found) && (frame->last_err == ERROR_PERIOD)) {
00077 frame_unset_error (frame);
00078 }
00079
00080 }
00081
00082
00083
00084 static void frame_try_set_machine (frame_t *frame, gpointer machine)
00085 {
00086 synema_instance_t *inst = synema_instance ();
00087 gboolean found = FALSE;
00088 gpointer pointer = NULL;
00089 GtkComboBox *combo = NULL;
00090 GtkTreeIter iter;
00091 GtkTreeModel *combomodel = NULL;
00092
00093 combo = GTK_COMBO_BOX (gtk_builder_get_object (frame->builder, "display_machine"));
00094 combomodel = gtk_combo_box_get_model (combo);
00095
00096 if (gtk_tree_model_get_iter_first (combomodel, &iter)) {
00097 found = FALSE;
00098 do {
00099 gtk_tree_model_get (combomodel, &iter, 1, &pointer, -1);
00100 if (machine_cmp (pointer, machine) == 0) {
00101 gtk_combo_box_set_active_iter (combo, &iter);
00102 found = TRUE;
00103 }
00104 } while (!found && (gtk_tree_model_iter_next (combomodel, &iter)));
00105
00106 if (!found && (inst->settings->unhandled_action_machine != UA_DO_NOTHING)) {
00107 frame_display_error_message (frame, ERROR_MACHINE, "Machine %s is not available for this frame", machine_get_display_name (machine));
00108 }
00109 }
00110
00111 if ((found) && (frame->last_err == ERROR_MACHINE)) {
00112 frame_unset_error (frame);
00113 }
00114 }
00115
00116
00117
00118 void frame_action_set_machine (GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
00119 {
00120 synema_instance_t *inst = synema_instance ();
00121 GList *list = NULL;
00122 gpointer machine = NULL;
00123 GtkTreeIter iter;
00124 GtkTreeModel *model = gtk_tree_view_get_model (view);
00125
00126 if (gtk_tree_model_get_iter (model, &iter, path)) {
00127 gtk_tree_model_get (model, &iter, 1, &machine, -1);
00128
00129 list = inst->current_table->frames_list;
00130 if (list) {
00131 do {
00132 frame_try_set_machine (list->data, machine);
00133 } while ((list = g_list_next (list)) != NULL);
00134 }
00135 }
00136 }
00137
00138
00139
00140 void frame_action_set_period (GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
00141 {
00142 synema_instance_t *inst = synema_instance ();
00143 GList *list = NULL;
00144 gpointer period = NULL;
00145 GtkTreeIter iter;
00146 GtkTreeModel *model = gtk_tree_view_get_model (view);
00147
00148 if (gtk_tree_model_get_iter (model, &iter, path)) {
00149 gtk_tree_model_get (model, &iter, 1, &period, -1);
00150
00151 list = inst->current_table->frames_list;
00152 if (list) {
00153 do {
00154 frame_try_set_period (list->data, period);
00155 } while ((list = g_list_next (list)) != NULL);
00156 }
00157 }
00158 }
00159
00160
00161
00162 void frame_action_setup_widgets ()
00163 {
00164 synema_instance_t *inst = synema_instance ();
00165 gchar *name = NULL;
00166 GList *iter = NULL;
00167 GList *list = NULL;
00168 GList *prev = NULL;
00169 GtkCellRenderer *renderer = NULL;
00170 GtkListStore *store = NULL;
00171 GtkTreeIter treeiter;
00172 GtkTreeViewColumn *column = NULL;
00173 GtkWidget *mac_view = (GtkWidget *) gtk_builder_get_object (inst->builder, "action_treeview_set_machine");
00174 GtkWidget *prd_view = (GtkWidget *) gtk_builder_get_object (inst->builder, "action_treeview_set_period");
00175
00176
00177
00178 renderer = gtk_cell_renderer_text_new ();
00179 column = gtk_tree_view_column_new_with_attributes ("Name", renderer,
00180 "text", 0, NULL);
00181 gtk_tree_view_append_column (GTK_TREE_VIEW (prd_view), column);
00182
00183 store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER);
00184 gtk_tree_view_set_model (GTK_TREE_VIEW(prd_view), GTK_TREE_MODEL(store));
00185 g_signal_connect (prd_view, "row-activated", G_CALLBACK (frame_action_set_period), NULL);
00186
00187
00188
00189 iter = inst->plugins_list;
00190 if (iter) {
00191 do {
00192 list = g_list_concat (list, plugin_get_time_periods (iter->data));
00193 } while ((iter = g_list_next (iter)) != NULL);
00194 }
00195
00196 list = g_list_sort (list, time_period_cmp_func);
00197 iter = list;
00198 if (iter) {
00199 name = time_period_get_display_name (iter->data, TRUE);
00200 gtk_list_store_append (store, &treeiter);
00201 gtk_list_store_set (store, &treeiter, 0, name, 1, iter->data, -1);
00202 g_free (name);
00203 prev = iter;
00204 while ((iter = g_list_next (iter)) != NULL) {
00205 if (time_period_cmp (prev->data, iter->data)) {
00206 name = time_period_get_display_name (iter->data, TRUE);
00207 gtk_list_store_append (store, &treeiter);
00208 gtk_list_store_set (store, &treeiter, 0, name, 1, iter->data, -1);
00209 g_free (name);
00210 }
00211 prev = iter;
00212 }
00213 }
00214
00215 g_list_free (list);
00216 g_object_unref (store);
00217
00218
00219
00220 renderer = gtk_cell_renderer_text_new ();
00221 column = gtk_tree_view_column_new_with_attributes ("Name", renderer,
00222 "text", 0, NULL);
00223 gtk_tree_view_append_column (GTK_TREE_VIEW (mac_view), column);
00224
00225 store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER);
00226 gtk_tree_view_set_model (GTK_TREE_VIEW(mac_view), GTK_TREE_MODEL(store));
00227 g_signal_connect (mac_view, "row-activated", G_CALLBACK (frame_action_set_machine), NULL);
00228
00229
00230
00231 if (inst->machines_list) {
00232 iter = inst->machines_list;
00233 do {
00234 gtk_list_store_append (store, &treeiter);
00235 gtk_list_store_set (store, &treeiter, 0, machine_get_display_name (iter->data), 1, iter->data, -1);
00236 } while ((iter = g_list_next (iter)) != NULL);
00237 }
00238 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store), 0, GTK_SORT_ASCENDING);
00239
00240 g_object_unref (store);
00241 }