1 /*
2 * file: form_card.c
3 *
4 * Copyright (C) Nicola Fragale <nicolafragale@libero.it>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 */
20
21 #include <glib/gi18n-lib.h>
22 #include <gtk/gtk.h>
23 #include <glade/glade.h>
24
25 #include "libral.h"
26
27 #include "app.h"
28 #include "form.h"
29 #include "form_card.h"
30 #include "app.h"
31 #include "view.h"
32 #include "groups_view.h"
33 #include "groups_cb.h"
34 #include "models.h"
35 #include "types.h"
36 #include "themes.h"
37
38
39 struct _RubricaFormCardPrivate {
40 RGroupBox* groups;
41
42 GtkWidget* card;
43 GtkWidget* groups_view;
44 GtkWidget* lock;
45 GtkWidget* rate;
46
47 gboolean dispose_has_run;
48 };
49
50
51 RubricaThemedItem faces[] = {
52 {N_("None"), "rate1"}, // R_RATE_NONE
53 {N_("Few"), "rate2"}, // R_RATE_FEW
54 {N_("Normal"), "rate3"}, // R_RATE_NORMAL
55 {N_("High"), "rate4"}, // R_RATE_HIGH
56 {N_("Very high"), "rate5"}, // R_RATE_VERY_HIGH
57 {NULL}
58 };
59
60
61 static void rubrica_form_card_class_init (RubricaFormCardClass* klass);
62 static void rubrica_form_card_init (RubricaFormCard* obj);
63
64 static void rubrica_form_card_dispose (RubricaFormCard* obj);
65 static void rubrica_form_card_finalize (RubricaFormCard* obj);
66
67 static gboolean extract_groups (GtkTreeModel *model, GtkTreePath *path,
68 GtkTreeIter *iter, gpointer data);
69
70 static void form_card_extract_data (RubricaFormCard* form, RCard *card);
71 static void form_card_display_data (RubricaFormCard* form, RCard *card);
72 static void form_card_clean_form (RubricaFormCard* form);
73
74
75 static RubricaFormClass* parent_class;
76
77
78 GType
rubrica_form_card_get_type()79 rubrica_form_card_get_type()
80 {
81 static GType form_card_type = 0;
82
83 if (!form_card_type)
84 {
85 static const GTypeInfo form_card_info =
86 {
87 sizeof(RubricaFormCardClass),
88 NULL,
89 NULL,
90 (GClassInitFunc) rubrica_form_card_class_init,
91 NULL,
92 NULL,
93 sizeof(RubricaFormCard),
94 0,
95 (GInstanceInitFunc) rubrica_form_card_init
96 };
97
98 form_card_type = g_type_register_static (RUBRICA_FORM_TYPE,
99 "RubricaFormCard",
100 &form_card_info, 0);
101 }
102
103 return form_card_type;
104 }
105
106
107 static void
rubrica_form_card_class_init(RubricaFormCardClass * klass)108 rubrica_form_card_class_init(RubricaFormCardClass* klass)
109 {
110 GObjectClass *class;
111
112 class = G_OBJECT_CLASS (klass);
113 class->dispose = (GObjectFinalizeFunc) rubrica_form_card_dispose;
114 class->finalize = (GObjectFinalizeFunc) rubrica_form_card_finalize;
115
116 parent_class = RUBRICA_FORM_CLASS(klass);
117 parent_class->extract_data = (gpointer) form_card_extract_data;
118 parent_class->display_data = (gpointer) form_card_display_data;
119 parent_class->clean_form = (gpointer) form_card_clean_form;
120 }
121
122
123 static void
rubrica_form_card_init(RubricaFormCard * self)124 rubrica_form_card_init(RubricaFormCard* self)
125 {
126 self->priv = g_new(RubricaFormCardPrivate, 1);
127
128 self->priv->groups = NULL;
129 self->priv->card = NULL;
130 self->priv->lock = NULL;
131 self->priv->rate = NULL;
132
133 self->priv->dispose_has_run = FALSE;
134 }
135
136
137
138 static void
rubrica_form_card_dispose(RubricaFormCard * self)139 rubrica_form_card_dispose (RubricaFormCard* self)
140 {
141 g_return_if_fail(IS_RUBRICA_FORM(self));
142
143 if (self->priv->dispose_has_run)
144 return;
145
146 g_object_unref(self->priv->card);
147 g_object_unref(self->priv->lock);
148 g_object_unref(self->priv->rate);
149
150 self->priv->dispose_has_run = TRUE;
151 }
152
153
154 static void
rubrica_form_card_finalize(RubricaFormCard * self)155 rubrica_form_card_finalize (RubricaFormCard* self)
156 {
157 g_return_if_fail(IS_RUBRICA_FORM(self));
158
159 g_free(self->priv);
160 self->priv = NULL;
161 }
162
163 static gboolean
extract_groups(GtkTreeModel * model,GtkTreePath * path,GtkTreeIter * iter,gpointer data)164 extract_groups (GtkTreeModel *model, GtkTreePath *path,
165 GtkTreeIter *iter, gpointer data)
166 {
167 RCard* card = (RCard*) data;
168 gchar* name = NULL;
169 gchar* label = NULL;
170 gchar* owner = NULL;
171 gchar* uri = NULL;
172 gboolean belong = FALSE;
173
174 gtk_tree_model_get(model, iter,
175 GROUP_BELONG_COLUMN, &belong,
176 GROUP_NAME_COLUMN, &name,
177 GROUP_LABEL_COLUMN, &label,
178 GROUP_OWNER_COLUMN, &owner,
179 GROUP_PIXMAP_PATH, &uri,
180 -1);
181 if (belong)
182 {
183 RGroup* group;
184
185 group = r_group_new();
186 g_object_set(group,
187 "group-name", name,
188 "group-label", label,
189 "group-owner", owner,
190 "group-pixmap", uri,
191 "enabled", TRUE,
192 NULL);
193
194 r_card_add_group(R_CARD(card), group);
195
196 belong = FALSE;
197 }
198
199 return FALSE;
200 }
201
202
203 static void
form_card_extract_data(RubricaFormCard * form,RCard * card)204 form_card_extract_data (RubricaFormCard* form, RCard *card)
205 {
206 GtkWidget *tree;
207 GtkTreeModel *model = NULL;
208 const gchar *name;
209 gboolean lock;
210 gint rate;
211
212
213 name = gtk_entry_get_text(GTK_ENTRY(form->priv->card));
214 lock = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(form->priv->lock));
215 rate = gtk_combo_box_get_active(GTK_COMBO_BOX(form->priv->rate));
216
217 g_object_set(R_CARD(card),
218 "card-locked", lock, "card-deleted", FALSE,
219 "card-marked", FALSE, "card-name", name,
220 "card-rate", rate, NULL);
221
222 /* extract groups's data */
223 tree = rubrica_view_get_tree(RUBRICA_VIEW(form->priv->groups_view));
224 model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree));
225 if (model)
226 {
227 gtk_tree_model_foreach(GTK_TREE_MODEL(model), extract_groups, card);
228 g_object_unref(model);
229 }
230 }
231
232
233 static void
form_card_display_data(RubricaFormCard * form,RCard * card)234 form_card_display_data (RubricaFormCard* form, RCard *card)
235 {
236 GtkWidget* tree;
237 gpointer data;
238 gchar* name;
239 gboolean locked;
240 RRate rate;
241
242 tree = rubrica_view_get_tree(RUBRICA_VIEW(form->priv->groups_view));
243
244 g_object_get(R_CARD(card),
245 "card-name", &name,
246 "card-locked", &locked,
247 "card-rate", &rate,
248 NULL);
249
250 gtk_entry_set_text(GTK_ENTRY(form->priv->card), name);
251 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(form->priv->lock), locked);
252 gtk_combo_box_set_active(GTK_COMBO_BOX(form->priv->rate), rate);
253
254 r_group_box_disable_all (form->priv->groups);
255 data = r_card_get_group(R_CARD(card));
256 for (; data; data = r_card_get_next_group(R_CARD(card)))
257 r_group_box_enable_group(form->priv->groups, data);
258
259 rubrica_model_redisplay_groups_view(GTK_TREE_VIEW(tree),
260 form->priv->groups);
261 }
262
263
264 static void
form_card_clean_form(RubricaFormCard * form)265 form_card_clean_form (RubricaFormCard* form)
266 {
267 GtkWidget* tree;
268
269 tree = rubrica_view_get_tree(RUBRICA_VIEW(form->priv->groups_view));
270
271 gtk_entry_set_text(GTK_ENTRY(form->priv->card), "");
272 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(form->priv->lock), FALSE);
273 gtk_combo_box_set_active(GTK_COMBO_BOX(form->priv->rate), R_RATE_NORMAL);
274
275 r_group_box_disable_all (form->priv->groups);
276 rubrica_model_redisplay_groups_view(GTK_TREE_VIEW(tree),
277 form->priv->groups);
278 }
279
280
281 /* ***************************** Public *****************************
282 */
283
284
285 /**
286 * rubrica_form_card_new
287 *
288 * create a #RubricaFormCard
289 *
290 * Returns: a new #RubricaFormCard
291 */
292 RubricaFormCard*
rubrica_form_card_new(RubricaApp * app,GladeXML * gui)293 rubrica_form_card_new(RubricaApp* app, GladeXML *gui)
294 {
295 RubricaFormCard *form;
296 GtkWidget* tree;
297 GtkWidget* rate_box;
298 GtkWidget* group_box;
299 GtkWidget* rate_label;
300 GtkTreeModel* model;
301
302 model = rubrica_model_combo_new();
303 form = g_object_new(rubrica_form_card_get_type(), NULL);
304
305 form->priv->card = glade_xml_get_widget(gui, "card");
306 form->priv->lock = glade_xml_get_widget(gui, "lock");
307 form->priv->rate = gtk_combo_box_new_with_model(model);
308 form->priv->groups = rubrica_app_get_groups(app);
309 form->priv->groups_view = rubrica_groups_view_new(form->priv->groups,
310 FORM_GROUPS);
311
312 group_box = glade_xml_get_widget(gui, "group_box");
313 rate_box = glade_xml_get_widget(gui, "rate_box");
314 rate_label = glade_xml_get_widget(gui, "rate_label");
315
316 gtk_box_pack_start(GTK_BOX(group_box), form->priv->groups_view,
317 TRUE, TRUE, 6);
318 gtk_box_pack_start(GTK_BOX(rate_box), form->priv->rate, TRUE, TRUE, 6);
319
320 gtk_label_set_mnemonic_widget(GTK_LABEL(rate_label), form->priv->rate);
321
322 rubrica_themes_create_themed_list(GTK_COMBO_BOX(form->priv->rate), faces);
323 gtk_combo_box_set_active(GTK_COMBO_BOX(form->priv->rate), R_RATE_NORMAL);
324 gtk_widget_show(form->priv->rate);
325
326 tree = rubrica_view_get_tree(RUBRICA_VIEW(form->priv->groups_view));
327
328 g_signal_connect(GTK_OBJECT (tree), "button_press_event",
329 G_CALLBACK (on_form_group_view_event_occurred),
330 form->priv->groups_view);
331
332 gtk_widget_grab_focus (form->priv->card);
333 gtk_widget_show(group_box);
334 gtk_widget_show(form->priv->groups_view);
335
336 return form;
337 }
338
339
340 /**
341 * rubrica_form_card_free
342 * @form: a #RubricaFormCard
343 *
344 * free the #RubricaFormCard
345 */
346 void
rubrica_form_card_free(RubricaFormCard * form)347 rubrica_form_card_free(RubricaFormCard* form)
348 {
349 g_return_if_fail(IS_RUBRICA_FORM(form));
350
351 g_object_unref(form);
352 }
353