00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00026 #include <gtk/gtk.h>
00027 #include <math.h>
00028
00029 #include "frame-table.h"
00030 #include "frame-utilities.h"
00031 #include "table-utilities.h"
00032
00033
00034
00035 frame_t *slot_data_get (frame_table_t *tab, guint rows, guint cols)
00036 {
00037 guint table_cols;
00038
00039 g_object_get (tab->table, "n-columns", &table_cols, NULL);
00040
00041 return tab->slot_data[table_cols*rows + cols];
00042 }
00043
00044
00045
00046 void slot_data_set (frame_table_t *tab, guint rows, guint cols, frame_t *elem)
00047 {
00048 guint table_cols;
00049
00050 g_object_get (tab->table, "n-columns", &table_cols, NULL);
00051
00052
00053 tab->slot_data[table_cols * rows + cols] = elem;
00054 }
00055
00056
00057
00058 int slot_data_find_empty_slot (frame_table_t *tab, guint *rows, guint *cols, guint size_x, guint size_y)
00059 {
00060 guint table_rows, table_cols;
00061
00062 g_object_get (tab->table, "n-columns", &table_cols, "n-rows", &table_rows, NULL);
00063
00064
00065 while ((*rows) < table_rows) {
00066
00067 if (slot_data_get (tab, *rows, *cols) == NULL) {
00068
00069 return 0;
00070 } else {
00071 if ((*cols) == (table_cols - 1)) {
00072 (*cols) = 0;
00073 (*rows)++;
00074 } else {
00075 (*cols)++;
00076 }
00077 }
00078 }
00079
00080 return 1;
00081
00082
00083
00084 }
00085
00086 int slot_data_resize (frame_table_t *tab, guint old_rows, guint old_cols, guint rows, guint cols)
00087 {
00088 tab->slot_data = g_realloc (tab->slot_data, sizeof (frame_t*) * rows*cols);
00089
00090 guint i,j;
00091 for (i = 0; i < rows; i++) {
00092 for (j = old_cols; j < cols; j++) {
00093 tab->slot_data[cols * i + j] = NULL;
00094 }
00095 }
00096 for (i = old_rows; i < rows; i++) {
00097 for (j = 0; j < old_cols; j++) {
00098 tab->slot_data[cols * i + j] = NULL;
00099 }
00100 }
00101 return 0;
00102 }
00103
00104 int frame_table_size_changed (frame_table_t *tab, frame_t *elem, guint old_size_x, guint old_size_y, guint new_size_x, guint new_size_y)
00105 {
00106
00107 return 0;
00108 }
00109
00110 int table_get_optimal_nb_cols (frame_table_t *tab)
00111 {
00112 return 3;
00113
00114 }
00115
00116 int table_get_optimal_nb_rows (frame_table_t *tab)
00117 {
00118 return 2;
00119
00120 }
00121
00122 int table_size_changed (frame_table_t *tab)
00123 {
00124 guint table_rows, table_cols;
00125 guint optimal_rows, optimal_cols;
00126
00127 g_object_get (tab->table, "n-columns", &table_cols, "n-rows", &table_rows, NULL);
00128
00129 optimal_rows = table_get_optimal_nb_rows (tab);
00130 optimal_cols = table_get_optimal_nb_cols (tab);
00131
00132
00133 gtk_table_resize (GTK_TABLE (tab->table), optimal_rows, optimal_cols);
00134 slot_data_resize (tab, table_rows, table_cols, optimal_rows, optimal_cols);
00135
00136
00137
00138 return 0;
00139 }
00140
00141 int table_add (frame_table_t *tab, frame_t *elem)
00142 {
00143 guint size_x = ((elem->size == NORMAL) ? NORMAL_WIDTH_SLOTS : LARGE_WIDTH_SLOTS);
00144 guint size_y = ((elem->size == NORMAL) ? NORMAL_HEIGHT_SLOTS : LARGE_HEIGHT_SLOTS);
00145 guint columns = 0, rows = 0;
00146
00147 table_size_changed (tab);
00148 tab->children_size[elem->size]++;
00149
00150 if (!slot_data_find_empty_slot (tab, &rows, &columns, size_x, size_y)) {
00151 gtk_table_attach_defaults (GTK_TABLE (tab->table), frame_get_root_widget (elem), columns, columns+1, rows, rows+1);
00152
00153
00154 slot_data_set (tab, rows, columns, elem);
00155 elem->hidden = FALSE;
00156 }
00157
00158
00159
00160 return 0;
00161 }
00162
00163 int table_add_with_coords (frame_table_t *tab, frame_t *elem, guint left, guint top)
00164 {
00165 table_size_changed (tab);
00166
00167 tab->children_size[elem->size]++;
00168 gtk_table_attach_defaults (GTK_TABLE (tab->table), frame_get_root_widget (elem), left, left+1, top, top+1);
00169 elem->hidden = FALSE;
00170 slot_data_set (tab, top, left, elem);
00171
00172 return 0;
00173 }
00174
00175
00176 int table_remove (frame_table_t *tab, frame_t *elem)
00177 {
00178 GtkWidget *elemwidget = frame_get_root_widget (elem);
00179
00180 int top = 0, left = 0;
00181 guint table_rows, table_cols;
00182
00183 g_object_get (tab->table, "n-columns", &table_cols, "n-rows", &table_rows, NULL);
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193 while (slot_data_get (tab, top, left) != elem ) {
00194
00195 if (top < table_rows) {
00196 if (left == (table_cols-1)) {
00197 left = 0;
00198 top++;
00199 }
00200 else {
00201 left++;
00202 }
00203 } else {
00204 g_warning ("table_remove: The frame is not in the table");
00205 return 1;
00206 }
00207 }
00208
00209
00210
00211
00212 slot_data_set (tab, top, left, NULL);
00213
00214 g_object_ref (elemwidget);
00215 elem->hidden = TRUE;
00216 gtk_container_remove (GTK_CONTAINER (tab->table), elemwidget);
00217 tab->children_size[elem->size]--;
00218
00219 return 0;
00220 }
00221
00222 int table_swap_children (frame_table_t *tab, frame_t *child1, frame_t *child2)
00223 {
00224
00225
00226
00227
00228 return 0;
00229 }
00230
00231
00232