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