1 /*
2 *  program: Rubrica
3 *  file: models.c
4 *
5 *
6 *  Copyright (C) 2000-2005 Nicola Fragale <nicolafragale@libero.it>
7 *
8 *  This program is free software; you can redistribute it and/or modify
9 *  it under the terms of the GNU General Public License as published by
10 *  the Free Software Foundation; either version 3 of the License
11 *
12 *  This program is distributed in the hope that it will be useful,
13 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 *  GNU General Public License for more details.
16 *
17 *  You should have received a copy of the GNU General Public License
18 *  along with this program; if not, write to the Free Software
19 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 */
21 
22 #include <glib/gi18n-lib.h>
23 #include <gtk/gtk.h>
24 #include <gconf/gconf-client.h>
25 #include "libral.h"
26 
27 #include "models.h"
28 #include "preferences.h"
29 #include "themes.h"
30 #include "types.h"
31 
32 
33 GtkTreeModel*
rubrica_model_new(RubricaModelType type)34 rubrica_model_new(RubricaModelType type)
35 {
36   GtkListStore *model = NULL;
37 
38   switch (type)
39     {
40       /* Address model */
41     case ADDRESS_MODEL:
42       model = gtk_list_store_new(LAST_ADDRESS_COLUMN,
43 				 G_TYPE_STRING,        /* street        */
44 				 G_TYPE_STRING,        /* street number */
45 				 G_TYPE_STRING,        /* city          */
46 				 G_TYPE_STRING,        /* type label    */
47 				 G_TYPE_STRING,        /* address type  */
48 				 G_TYPE_STRING,        /* zip           */
49 				 G_TYPE_STRING,        /* province      */
50 				 G_TYPE_STRING,        /* state         */
51 				 G_TYPE_STRING);       /* country       */
52       break;
53 
54       /* net model */
55     case NET_MODEL:
56       model = gtk_list_store_new(LAST_NET_COLUMN,
57 				 G_TYPE_STRING,        /* url       */
58 				 G_TYPE_STRING);       /* url type  */
59       break;
60 
61       /* telephone model */
62     case TELEPHONE_MODEL:
63       // type label is for localization
64       model = gtk_list_store_new(LAST_TEL_COLUMN,
65 				 G_TYPE_STRING,        /* telephone number */
66 				 G_TYPE_STRING,        /* type label       */
67 				 G_TYPE_STRING);       /* telephone type   */
68       break;
69 
70     case INFO_MODEL:
71       model = gtk_list_store_new(LAST_INFO_COLUMN,
72 				 G_TYPE_STRING,        // card label
73 				 G_TYPE_STRING,        // first name
74 				 G_TYPE_STRING,        // last name
75 				 G_TYPE_STRING,        // assignment
76 				 G_TYPE_STRING,        // telephone
77 				 G_TYPE_STRING,        // email
78 				 G_TYPE_INT);          // card id
79       break;
80 
81     default:
82       break;
83     }
84 
85   return GTK_TREE_MODEL(model);
86 }
87 
88 GtkTreeModel*
rubrica_model_combo_new()89 rubrica_model_combo_new ()
90 {
91   return (GtkTreeModel *) gtk_list_store_new(COMBO_LAST_COLUMN,
92 			    GDK_TYPE_PIXBUF, G_TYPE_STRING);
93 }
94 
95 
96 
97 void
rubrica_model_redisplay_groups_view(GtkTreeView * view,RGroupBox * box)98 rubrica_model_redisplay_groups_view(GtkTreeView* view, RGroupBox* box)
99 {
100   GtkTreeModel* model;
101   GtkTreeIter iter;
102   GtkIconTheme* theme;
103   RGroup* group;
104 
105   theme = gtk_icon_theme_get_default();
106   model = gtk_tree_view_get_model(view);
107   gtk_list_store_clear (GTK_LIST_STORE(model));
108 
109   r_group_box_reset(box);
110   group = r_group_box_get_group(box);
111   for(; group; group = r_group_box_get_next_group(box))
112     {
113       gboolean enabled = FALSE;
114       gchar* name   = NULL;
115       gchar* label = NULL;
116       gchar* owner = NULL;
117       gchar* pixmap = NULL;
118       GdkPixbuf* pixbuf;
119       GError *error = NULL;
120 
121       g_object_get(group,
122 		   "group-name", &name, "group-label", &label,
123 		   "group-owner", &owner, "group-pixmap", &pixmap,
124 		   "enabled", &enabled, NULL);
125 
126       pixbuf = gtk_icon_theme_load_icon (theme, pixmap, 20, 0, NULL);
127       if (!pixbuf)
128 	pixbuf = gdk_pixbuf_new_from_file_at_size (pixmap, 20, 20, &error);
129 
130       if (!pixbuf)
131 	g_warning("\npixbuf: %s", error->message);
132 
133       gtk_list_store_append(GTK_LIST_STORE(model), &iter);
134       gtk_list_store_set(GTK_LIST_STORE(model), &iter,
135 			 GROUP_BELONG_COLUMN,   enabled,
136 			 GROUP_PIXMAP_COLUMN,   pixbuf,
137 			 GROUP_NAME_COLUMN,     name,
138 			 GROUP_LABEL_COLUMN,    label,
139 			 GROUP_OWNER_COLUMN,    owner,
140 			 GROUP_PIXMAP_PATH,     pixmap,
141 			 -1);
142     }
143 }
144 
145 
146 void
rubrica_model_add_columns(GtkTreeView * view,RubricaColumnsType type)147 rubrica_model_add_columns(GtkTreeView *view, RubricaColumnsType type)
148 {
149   GtkCellRenderer *renderer;
150   GtkTreeModel *model;
151 
152   model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
153 
154   switch(type)
155     {
156     case ADDRESS_COLUMNS:
157       renderer = gtk_cell_renderer_text_new();
158       gtk_tree_view_insert_column_with_attributes (view, /* tree view */
159 						   -1,  _("Street"),
160 						   renderer, "text",
161 						   ADDRESS_STREET_COLUMN,
162 						   NULL);
163 
164       renderer = gtk_cell_renderer_text_new();
165       gtk_tree_view_insert_column_with_attributes (view,
166 						   -1,  _("Number"),
167 						   renderer, "text",
168 						   ADDRESS_NUMBER_COLUMN,
169 						   NULL);
170 
171       renderer = gtk_cell_renderer_text_new();
172       gtk_tree_view_insert_column_with_attributes (view,
173 						   -1,  _("City"),
174 						   renderer, "text",
175 						   ADDRESS_CITY_COLUMN,
176 						   NULL);
177 
178       renderer = gtk_cell_renderer_text_new();
179       gtk_tree_view_insert_column_with_attributes (view,
180 						   -1,  _("Address type"),
181 						   renderer, "text",
182 						   ADDRESS_LABEL_COLUMN,
183 						   NULL);
184       break;
185 
186     case URI_COLUMNS:
187       renderer = gtk_cell_renderer_text_new();
188       gtk_tree_view_insert_column_with_attributes (view,
189 						   -1,  _("Net URL"),
190 						   renderer, "text",
191 						   URI_COLUMN,
192 						   NULL);
193       renderer = gtk_cell_renderer_text_new();
194       gtk_tree_view_insert_column_with_attributes (view, -1, _("Type"),
195 						   renderer, "text",
196 						   URI_TYPE_COLUMN,
197 						   NULL);
198       break;
199 
200     case TELEPHONE_COLUMNS:
201       renderer = gtk_cell_renderer_text_new();
202       gtk_tree_view_insert_column_with_attributes (view, -1, _("Number"),
203 						   renderer, "text",
204 						   TELEPHONE_NUMBER_COLUMN,
205 						   NULL);
206 
207       renderer = gtk_cell_renderer_text_new();
208       gtk_tree_view_insert_column_with_attributes (view, -1, _("Type"),
209 						   renderer, "text",
210 						   TELEPHONE_LABEL_COLUMN,
211 						   NULL);
212       break;
213 
214     case INFO_COLUMNS:
215       renderer = gtk_cell_renderer_text_new();
216       gtk_tree_view_insert_column_with_attributes (view, -1, _("Card"),
217 						   renderer, "text",
218 						   INFO_CARD_LABEL_COLUMN,
219 						   NULL);
220 
221       renderer = gtk_cell_renderer_text_new();
222       gtk_tree_view_insert_column_with_attributes (view, -1, _("First name"),
223 						   renderer, "text",
224 						   INFO_FIRST_NAME_COLUMN,
225 						   NULL);
226 
227       renderer = gtk_cell_renderer_text_new();
228       gtk_tree_view_insert_column_with_attributes (view, -1, _("Last name"),
229 						   renderer, "text",
230 						   INFO_LAST_NAME_COLUMN,
231 						   NULL);
232 
233       renderer = gtk_cell_renderer_text_new();
234       gtk_tree_view_insert_column_with_attributes (view, -1, _("Assignment"),
235 						   renderer, "text",
236 						   INFO_ASSIGNMENT_COLUMN,
237 						   NULL);
238 
239       renderer = gtk_cell_renderer_text_new();
240       gtk_tree_view_insert_column_with_attributes (view, -1, _("Telephone"),
241 						   renderer, "text",
242 						   INFO_TELEPHONE_COLUMN,
243 						   NULL);
244 
245       renderer = gtk_cell_renderer_text_new();
246       gtk_tree_view_insert_column_with_attributes (view, -1, _("Email"),
247 						   renderer, "text",
248 						   INFO_EMAIL_COLUMN,
249 						   NULL);
250       break;
251 
252     default:
253       break;
254     }
255 }
256 
257 /*
258 void rubrica_model_set_column_attributes(GConfClient *client,
259 					 GtkTreeView *view,
260 					 gchar *key, gint col)
261 {
262   GtkTreeViewColumn *column;
263 
264   column = gtk_tree_view_get_column(view, col);
265 
266   gtk_tree_view_column_set_resizable(column, TRUE);
267   gtk_tree_view_column_set_clickable(column, TRUE);
268 
269   gtk_tree_view_column_set_reorderable(column, TRUE);
270 
271   rubrica_preferences_column_config(client, column, key);
272 }
273 */
274 
275 
276 void
rubrica_model_toggle_group(GtkCellRendererToggle * cell,gchar * path_str,gpointer data)277 rubrica_model_toggle_group(GtkCellRendererToggle *cell,
278 			   gchar *path_str, gpointer data)
279 {
280   GtkTreeModel *model;
281   GtkTreeIter iter;
282   GtkTreePath *path;
283   gboolean status;
284 
285   model = (GtkTreeModel *) data;
286   path  = gtk_tree_path_new_from_string(path_str);
287 
288   gtk_tree_model_get_iter (model, &iter, path);
289   gtk_tree_model_get (model, &iter, GROUP_BELONG_COLUMN, &status, -1);
290 
291   status ^= 1;
292   gtk_list_store_set(GTK_LIST_STORE(model), &iter,
293 		     GROUP_BELONG_COLUMN, status, -1);
294 }
295 
296 /*
297 void
298 rubrica_model_populate_combo(GtkComboBox* combo, RubricaCombo* array)
299 {
300   RubricaCombo* lst = array;
301   GtkWidget *cellview;
302   GError *error = NULL;
303   GtkIconTheme *theme;
304   GtkListStore *store;
305   GtkTreeIter iter;
306 
307   theme    = gtk_icon_theme_get_default();
308   cellview = gtk_cell_view_new ();
309   store    = (GtkListStore*) gtk_combo_box_get_model(GTK_COMBO_BOX(combo));
310 
311   for (; lst->icon; lst++)
312     {
313       GdkPixbuf *pixbuf = NULL;
314 
315       pixbuf = gtk_icon_theme_load_icon (theme, lst->icon, 40, 0, &error);
316 
317       gtk_list_store_append (store, &iter);
318       if (pixbuf)
319 	gtk_list_store_set (store, &iter,
320 			    COMBO_PIXMAP, pixbuf,
321 			    COMBO_LABEL, lst->label,
322 			    -1);
323       else
324 	gtk_list_store_set (store, &iter,
325 			    COMBO_PIXMAP, NULL,
326 			    COMBO_LABEL, lst->label,
327 			    -1);
328     }
329 
330   gtk_widget_destroy (cellview);
331 }
332 */
333