1 /*  HomeBank -- Free, easy, personal accounting for everyone.
2  *  Copyright (C) 1995-2021 Maxime DOYEN
3  *
4  *  This file is part of HomeBank.
5  *
6  *  HomeBank 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  *  HomeBank 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, see <http://www.gnu.org/licenses/>.
18  */
19 
20 
21 #include "homebank.h"
22 
23 #include "gtk-chart.h"
24 #include "ui-widgets.h"
25 
26 /****************************************************************************/
27 /* Debug macros                                                             */
28 /****************************************************************************/
29 #define MYDEBUG 0
30 
31 #if MYDEBUG
32 #define DB(x) (x);
33 #else
34 #define DB(x);
35 #endif
36 
37 /* our global datas */
38 extern struct HomeBank *GLOBALS;
39 
40 
41 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
42 
43 
44 extern HbKvData CYA_FLT_RANGE[];
45 
46 
47 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
48 
49 //TODO: only WEIGHT & SCALE are used for now
50 void
gimp_label_set_attributes(GtkLabel * label,...)51 gimp_label_set_attributes (GtkLabel *label,
52                            ...)
53 {
54   PangoAttribute *attr  = NULL;
55   PangoAttrList  *attrs;
56   va_list         args;
57 
58   g_return_if_fail (GTK_IS_LABEL (label));
59 
60   attrs = pango_attr_list_new ();
61 
62   va_start (args, label);
63 
64   do
65     {
66       PangoAttrType attr_type = va_arg (args, PangoAttrType);
67 
68       if (attr_type <= 0)
69         attr_type = PANGO_ATTR_INVALID;
70 
71       switch (attr_type)
72         {
73         case PANGO_ATTR_LANGUAGE:
74           attr = pango_attr_language_new (va_arg (args, PangoLanguage *));
75           break;
76 
77         case PANGO_ATTR_FAMILY:
78           attr = pango_attr_family_new (va_arg (args, const gchar *));
79           break;
80 
81         case PANGO_ATTR_STYLE:
82           attr = pango_attr_style_new (va_arg (args, PangoStyle));
83           break;
84 
85         case PANGO_ATTR_WEIGHT:
86           attr = pango_attr_weight_new (va_arg (args, PangoWeight));
87           break;
88 
89         case PANGO_ATTR_VARIANT:
90           attr = pango_attr_variant_new (va_arg (args, PangoVariant));
91           break;
92 
93         case PANGO_ATTR_STRETCH:
94           attr = pango_attr_stretch_new (va_arg (args, PangoStretch));
95           break;
96 
97         case PANGO_ATTR_SIZE:
98           attr = pango_attr_size_new (va_arg (args, gint));
99           break;
100 
101         case PANGO_ATTR_FONT_DESC:
102           attr = pango_attr_font_desc_new (va_arg (args,
103                                                    const PangoFontDescription *));
104           break;
105 
106         case PANGO_ATTR_FOREGROUND:
107           {
108             const PangoColor *color = va_arg (args, const PangoColor *);
109 
110             attr = pango_attr_foreground_new (color->red,
111                                               color->green,
112                                               color->blue);
113           }
114           break;
115 
116         case PANGO_ATTR_BACKGROUND:
117           {
118             const PangoColor *color = va_arg (args, const PangoColor *);
119 
120             attr = pango_attr_background_new (color->red,
121                                               color->green,
122                                               color->blue);
123           }
124           break;
125 
126         case PANGO_ATTR_UNDERLINE:
127           attr = pango_attr_underline_new (va_arg (args, PangoUnderline));
128           break;
129 
130         case PANGO_ATTR_STRIKETHROUGH:
131           attr = pango_attr_strikethrough_new (va_arg (args, gboolean));
132           break;
133 
134         case PANGO_ATTR_RISE:
135           attr = pango_attr_rise_new (va_arg (args, gint));
136           break;
137 
138         case PANGO_ATTR_SCALE:
139           attr = pango_attr_scale_new (va_arg (args, gdouble));
140           break;
141 
142         default:
143           //g_warning ("%s: invalid PangoAttribute type %d", G_STRFUNC, attr_type);
144         case PANGO_ATTR_INVALID:
145           attr = NULL;
146           break;
147         }
148 
149       if (attr)
150         {
151           attr->start_index = 0;
152           attr->end_index   = -1;
153           pango_attr_list_insert (attrs, attr);
154         }
155     }
156   while (attr);
157 
158   va_end (args);
159 
160   gtk_label_set_attributes (label, attrs);
161   pango_attr_list_unref (attrs);
162 }
163 
164 
hb_widget_set_margin(GtkWidget * widget,gint margin)165 void hb_widget_set_margin(GtkWidget *widget, gint margin)
166 {
167 	gtk_widget_set_margin_start (widget, margin);
168 	gtk_widget_set_margin_end (widget, margin);
169 	gtk_widget_set_margin_top (widget, margin);
170 	gtk_widget_set_margin_bottom (widget, margin);
171 }
172 
173 
hb_widget_visible(GtkWidget * widget,gboolean visible)174 void hb_widget_visible(GtkWidget *widget, gboolean visible)
175 {
176 	if(!GTK_IS_WIDGET(widget))
177 		return;
178 
179 	if(visible)
180 	{
181 		gtk_widget_show(widget);
182 	}
183 	else
184 	{
185 		gtk_widget_hide(widget);
186 	}
187 }
188 
189 
ui_label_set_integer(GtkLabel * label,gint value)190 void ui_label_set_integer(GtkLabel *label, gint value)
191 {
192 gchar buf[16];
193 
194 	g_snprintf(buf, 16, "%d", value);
195 	gtk_label_set_text (label, buf);
196 }
197 
198 
hbtk_entry_tag_name_append(GtkEntry * entry,gchar * tagname)199 void hbtk_entry_tag_name_append(GtkEntry *entry, gchar *tagname)
200 {
201 GtkEntryBuffer *buffer;
202 const gchar *text;
203 guint len;
204 
205 	text = gtk_entry_get_text(entry);
206 	if( g_strstr_len(text, -1, tagname) == NULL )
207 	{
208 		DB( g_print(" gtkentry append tagname '%s'\n", tagname) );
209 		buffer = gtk_entry_get_buffer(GTK_ENTRY(entry));
210 		if(buffer)
211 		{
212 			len = gtk_entry_buffer_get_length(buffer);
213 			DB( g_print("- add ' %s' %p %d\n", tagname, buffer, len) );
214 			if(len > 0)
215 				gtk_entry_buffer_insert_text(buffer, len, " ", 1);
216 			gtk_entry_buffer_insert_text(buffer, len+1, tagname, -1);
217 		}
218 	}
219 
220 }
221 
222 
hbtk_entry_set_text(GtkEntry * entry,gchar * text)223 void hbtk_entry_set_text(GtkEntry *entry, gchar *text)
224 {
225 	//DB( g_print(" set text to '%s'\n", text) );
226 	gtk_entry_set_text(GTK_ENTRY(entry), ( text != NULL ) ? text : "");
227 }
228 
229 
hbtk_entry_replace_text(GtkEntry * entry,gchar ** storage)230 void hbtk_entry_replace_text(GtkEntry *entry, gchar **storage)
231 {
232 const gchar *text;
233 
234 	DB( g_print(" storage is '%p' at '%p'\n", *storage, storage) );
235 
236 	/* free any previous string */
237 	if( *storage != NULL )
238 	{
239 		g_free(*storage);
240 	}
241 
242 	*storage = NULL;
243 	text = gtk_entry_get_text(GTK_ENTRY(entry));
244 	*storage = g_strdup(text);
245 }
246 
247 
248 // redraw a single row of a listview (not work with GTK_SELECTION_MULTIPLE)
249 void
hbtk_listview_redraw_selected_row(GtkTreeView * treeview)250 hbtk_listview_redraw_selected_row(GtkTreeView *treeview)
251 {
252 GtkTreeModel *model;
253 GtkTreeSelection *selection;
254 GtkTreeIter iter;
255 GtkTreePath *path;
256 
257 	selection = gtk_tree_view_get_selection(treeview);
258 	if( gtk_tree_selection_get_selected(selection, &model, &iter) )
259 	{
260 		path = gtk_tree_model_get_path(model, &iter);
261 		gtk_tree_model_row_changed(model, path, &iter);
262 		gtk_tree_path_free (path);
263 	}
264 }
265 
266 
267 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
268 
269 
make_clicklabel(gchar * id,gchar * str)270 GtkWidget *make_clicklabel(gchar *id, gchar *str)
271 {
272 GtkWidget *label;
273 gchar buffer[255];
274 
275 	g_snprintf(buffer, 254, "<a href=\"%s\">%s</a>", id, str);
276 	label = gtk_label_new(buffer);
277 	gimp_label_set_attributes (GTK_LABEL (label), PANGO_ATTR_SCALE, PANGO_SCALE_SMALL, -1);
278 	gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
279 	gtk_label_set_track_visited_links(GTK_LABEL(label), FALSE);
280 	gtk_widget_set_halign(label, GTK_ALIGN_START);
281 
282 	return GTK_WIDGET(label);
283 }
284 
285 
make_label_group(gchar * str)286 GtkWidget *make_label_group(gchar *str)
287 {
288 GtkWidget *label = gtk_label_new (str);
289 
290 	gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
291 	gtk_widget_set_halign (label, GTK_ALIGN_START);
292 	gimp_label_set_attributes(GTK_LABEL(label), PANGO_ATTR_WEIGHT, PANGO_WEIGHT_BOLD, -1);
293 	return label;
294 }
295 
296 
make_label_widget(char * str)297 GtkWidget *make_label_widget(char *str)
298 {
299 GtkWidget *label = gtk_label_new_with_mnemonic (str);
300 
301 	gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
302 	gtk_widget_set_halign (label, GTK_ALIGN_END);
303 	return label;
304 }
305 
306 
make_label(char * str,gfloat xalign,gfloat yalign)307 GtkWidget *make_label(char *str, gfloat xalign, gfloat yalign)
308 {
309 GtkWidget *label = gtk_label_new_with_mnemonic (str);
310 
311 	#if( (GTK_MAJOR_VERSION == 3) && (GTK_MINOR_VERSION < 16) )
312 	gtk_misc_set_alignment (GTK_MISC (label), xalign, yalign);
313 	#else
314 	gtk_label_set_xalign(GTK_LABEL(label), xalign);
315 	gtk_label_set_yalign(GTK_LABEL(label), yalign);
316 	#endif
317 	return label;
318 }
319 
320 
321 /*
322 **
323 */
make_text(gfloat xalign)324 GtkWidget *make_text(gfloat xalign)
325 {
326 GtkWidget *entry;
327 
328 	entry = gtk_entry_new ();
329 	gtk_editable_set_editable (GTK_EDITABLE(entry), FALSE);
330 	g_object_set(entry, "xalign", xalign, NULL);
331 	return entry;
332 }
333 
334 
make_search(void)335 GtkWidget *make_search(void)
336 {
337 GtkWidget *search;
338 
339 	search = gtk_search_entry_new();
340 	gtk_entry_set_placeholder_text(GTK_ENTRY(search), _("Search...") );
341 
342 	return search;
343 }
344 
345 
346 
347 /*
348 **
349 */
make_string(GtkWidget * label)350 GtkWidget *make_string(GtkWidget *label)
351 {
352 GtkWidget *entry;
353 
354 	entry = gtk_entry_new ();
355 
356 	if(label)
357 		gtk_label_set_mnemonic_widget (GTK_LABEL(label), entry);
358 
359 	return entry;
360 }
361 
362 
363 GtkWidget *
hbtk_menubar_add_menu(GtkWidget * menubar,gchar * label,GtkWidget ** menuitem_ptr)364 hbtk_menubar_add_menu(GtkWidget *menubar, gchar *label, GtkWidget **menuitem_ptr)
365 {
366 GtkWidget *menu, *menuitem;
367 
368 	menu = gtk_menu_new();
369 	menuitem = gtk_menu_item_new_with_mnemonic(label);
370 	gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);
371 	gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
372 	if(menuitem_ptr)
373 		*menuitem_ptr = menuitem;
374 	return menu;
375 }
376 
377 
378 GtkWidget *
hbtk_menu_add_menuitem(GtkWidget * menu,gchar * label)379 hbtk_menu_add_menuitem(GtkWidget *menu, gchar *label)
380 {
381 GtkWidget *menuitem = gtk_menu_item_new_with_mnemonic(label);
382 	gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
383 	return menuitem;
384 }
385 
386 
387 GtkWidget *
hbtk_toolbar_add_toolbutton(GtkToolbar * toolbar,gchar * icon_name,gchar * label,gchar * tooltip_text)388 hbtk_toolbar_add_toolbutton(GtkToolbar *toolbar, gchar *icon_name, gchar *label, gchar *tooltip_text)
389 {
390 GtkWidget *button = gtk_widget_new(GTK_TYPE_TOOL_BUTTON,
391 		"icon-name", icon_name,
392         "label", label,
393 	    NULL);
394 	if(tooltip_text != NULL)
395 		gtk_widget_set_tooltip_text(button, tooltip_text);
396 
397 
398 	gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(button), -1);
399 
400 	return button;
401 }
402 
403 
make_image_toggle_button(gchar * icon_name,gchar * tooltip_text)404 GtkWidget *make_image_toggle_button(gchar *icon_name, gchar *tooltip_text)
405 {
406 GtkWidget *button, *image;
407 
408 	//todo 3.10 use gtk_button_new_from_icon_name
409 
410 	button = gtk_toggle_button_new();
411 	image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_BUTTON);
412 	g_object_set (button, "image", image, NULL);
413 	if(tooltip_text != NULL)
414 		gtk_widget_set_tooltip_text(button, tooltip_text);
415 
416 	return button;
417 }
418 
419 
make_image_button(gchar * icon_name,gchar * tooltip_text)420 GtkWidget *make_image_button(gchar *icon_name, gchar *tooltip_text)
421 {
422 GtkWidget *button, *image;
423 
424 	//todo 3.10 use gtk_button_new_from_icon_name
425 
426 	button = gtk_button_new();
427 	image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_BUTTON);
428 	g_object_set (button, "image", image, NULL);
429 	if(tooltip_text != NULL)
430 		gtk_widget_set_tooltip_text(button, tooltip_text);
431 
432 	return button;
433 }
434 
435 
436 
437 /*
438 **
439 */
make_memo_entry(GtkWidget * label)440 GtkWidget *make_memo_entry(GtkWidget *label)
441 {
442 GtkListStore *store;
443 GtkWidget *entry;
444 GtkEntryCompletion *completion;
445 GList *lmem, *list;
446 
447 	store = gtk_list_store_new (1, G_TYPE_STRING);
448 
449     completion = gtk_entry_completion_new ();
450     gtk_entry_completion_set_model (completion, GTK_TREE_MODEL(store));
451     gtk_entry_completion_set_text_column (completion, 0);
452 
453 	entry = gtk_entry_new ();
454 	gtk_entry_set_completion (GTK_ENTRY (entry), completion);
455 
456 	g_object_unref(store);
457 
458 	//populate
459 	//gtk_list_store_clear (GTK_LIST_STORE(store));
460 
461 	lmem = list = g_hash_table_get_keys(GLOBALS->h_memo);
462 	while (list != NULL)
463 	{
464 	GtkTreeIter  iter;
465 
466 		//gtk_list_store_append (GTK_LIST_STORE(store), &iter);
467 		//gtk_list_store_set (GTK_LIST_STORE(store), &iter, 0, list->data, -1);
468 		gtk_list_store_insert_with_values(GTK_LIST_STORE(store), &iter, -1,
469 			0, list->data,
470 			-1);
471 
472 		list = g_list_next(list);
473 	}
474 
475 	g_list_free(lmem);
476 
477 	if(label)
478 		gtk_label_set_mnemonic_widget (GTK_LABEL(label), entry);
479 
480 	return entry;
481 }
482 
483 
484 /*
485 **
486 */
make_string_maxlength(GtkWidget * label,guint max_length)487 GtkWidget *make_string_maxlength(GtkWidget *label, guint max_length)
488 {
489 GtkWidget *entry;
490 
491 	entry = make_string(label);
492 	gtk_entry_set_width_chars(GTK_ENTRY(entry), max_length+2);
493 	gtk_entry_set_max_length(GTK_ENTRY(entry), max_length);
494 
495 	return entry;
496 }
497 
498 /*
499 static void make_entry_numeric_insert_text_handler (GtkEntry    *entry,
500                           const gchar *text,
501                           gint         length,
502                           gint        *position,
503                           gpointer     data)
504 {
505 GtkEditable *editable = GTK_EDITABLE(entry);
506 int i, count=0;
507 gchar *result = g_new (gchar, length);
508 
509 	for (i=0; i < length; i++) {
510 	if (!g_ascii_isdigit(text[i]))
511 	  continue;
512 	result[count++] = text[i];
513 	}
514 
515 	if (count > 0) {
516 	g_signal_handlers_block_by_func (G_OBJECT (editable),
517 		                             G_CALLBACK (make_entry_numeric_insert_text_handler),
518 		                             data);
519 	gtk_editable_insert_text (editable, result, count, position);
520 	g_signal_handlers_unblock_by_func (G_OBJECT (editable),
521 		                               G_CALLBACK (make_entry_numeric_insert_text_handler),
522 		                               data);
523 	}
524 	g_signal_stop_emission_by_name (G_OBJECT (editable), "insert_text");
525 
526 	g_free (result);
527 }
528 
529 
530 GtkWidget *make_entry_numeric(GtkWidget *label, gint min, gint max)
531 {
532 GtkWidget *entry;
533 
534 	entry = make_string(label);
535 	gtk_entry_set_text(GTK_ENTRY(entry), "1");
536 
537 	g_signal_connect(G_OBJECT(entry), "insert-text", G_CALLBACK(make_entry_numeric_insert_text_handler),
538 			 NULL);
539 
540 	return entry;
541 }*/
542 
543 
hb_amount_insert_text_handler(GtkEntry * entry,const gchar * text,gint length,gint * position,gpointer data)544 static void hb_amount_insert_text_handler (GtkEntry *entry, const gchar *text, gint length, gint *position, gpointer data)
545 {
546 GtkEditable *editable = GTK_EDITABLE(entry);
547 gint i, digits, count=0, dcpos=-1;
548 gchar *clntxt;
549 
550 	DB( g_print("-----\ninsert_text-handler: instxt:%s pos:%d len:%d\n", text, *position, length) );
551 
552 	digits = gtk_spin_button_get_digits(GTK_SPIN_BUTTON(entry));
553 
554 	// most common : only 1 char to be inserted
555 	if( length == 1 )
556 	{
557 	const gchar *curtxt = gtk_entry_get_text(entry);
558 
559 		for (i=0 ; curtxt[i]!='\0' ; i++)
560 		{
561 	 		if(curtxt[i]==',' || curtxt[i]=='.')
562 				dcpos = i;
563 		}
564 		DB( g_print(" dcpos:'%d'\n", dcpos) );
565 
566 		clntxt = g_new0 (gchar, length+1);
567 		for (i=0 ; i < length ; i++)
568 		{
569 			if( g_ascii_isdigit(text[i]) && ( (*position <= dcpos + digits) || dcpos < 0) )
570 				goto doinsert;
571 
572 			//5.4.3 + sign now authorized
573 			if( (text[i]=='-' || text[i]=='+') && *position==0 )	/* -/+ sign only at position 0 */
574 				goto doinsert;
575 
576 			if( dcpos < 0 && (text[i]=='.' || text[i]==',') )	/* decimal separator if not in previous string */
577 				clntxt[count++] = '.';
578 
579 			continue;
580 
581 		doinsert:
582 			clntxt[count++] = text[i];
583 		}
584 	}
585 	// less common: paste a full text
586 	else
587 	{
588 		clntxt = hb_string_dup_raw_amount_clean(text, digits);
589 		count = strlen(clntxt);
590 	}
591 
592 	if (count > 0)
593 	{
594 		DB( g_print(" insert %d char '%s' at %d\n", count, clntxt, *position) );
595 		g_signal_handlers_block_by_func (G_OBJECT (editable), G_CALLBACK (hb_amount_insert_text_handler), data);
596 		gtk_editable_insert_text (editable, clntxt, count, position);
597 		g_signal_handlers_unblock_by_func (G_OBJECT (editable), G_CALLBACK (hb_amount_insert_text_handler), data);
598 	}
599 
600 	g_free (clntxt);
601 
602 	g_signal_stop_emission_by_name (G_OBJECT (editable), "insert-text");
603 }
604 
605 
make_amount(GtkWidget * label)606 GtkWidget *make_amount(GtkWidget *label)
607 {
608 GtkWidget *spinner;
609 GtkAdjustment *adj;
610 
611 	//adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -G_MAXDOUBLE, G_MAXDOUBLE, 0.01, 1.0, 0.0);
612 	adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -8589934588, 8589934588, 0.01, 1.0, 0.0);
613 	spinner = gtk_spin_button_new (adj, 1.0, 2);
614 	g_object_set(spinner, "xalign", 1.0, NULL);
615 
616 	if(label)
617 		gtk_label_set_mnemonic_widget (GTK_LABEL(label), spinner);
618 
619 	g_signal_connect(G_OBJECT(spinner), "insert-text",
620 			 G_CALLBACK(hb_amount_insert_text_handler),
621 			 NULL);
622 
623 	return spinner;
624 }
625 
626 
make_exchange_rate(GtkWidget * label)627 GtkWidget *make_exchange_rate(GtkWidget *label)
628 {
629 GtkWidget *spinner;
630 GtkAdjustment *adj;
631 
632 	//#1871383 wish: increase exchange rate size
633 	//adj = (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, 99999, 0.01, 1.0, 0.0);
634 	adj = (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, 999999, 0.01, 1.0, 0.0);
635 	spinner = gtk_spin_button_new (adj, 1.0, 8);
636 	//gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
637 	gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinner), TRUE);
638 	g_object_set(spinner, "xalign", 1.0, NULL);
639 
640 	if(label)
641 		gtk_label_set_mnemonic_widget (GTK_LABEL(label), spinner);
642 
643 	return spinner;
644 }
645 
646 /*
647 **
648 */
make_numeric(GtkWidget * label,gdouble min,gdouble max)649 GtkWidget *make_numeric(GtkWidget *label, gdouble min, gdouble max)
650 {
651 GtkWidget *spinner;
652 GtkAdjustment *adj;
653 
654 	adj = (GtkAdjustment *) gtk_adjustment_new (0.0, min, max, 1.0, 10.0, 0.0);
655 	spinner = gtk_spin_button_new (adj, 0, 0);
656 	//gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
657 	gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinner), TRUE);
658 	g_object_set(spinner, "xalign", 1.0, NULL);
659 
660 	if(label)
661 		gtk_label_set_mnemonic_widget (GTK_LABEL(label), spinner);
662 
663 	return spinner;
664 }
665 
666 /*
667 **
668 */
make_scale(GtkWidget * label)669 GtkWidget *make_scale(GtkWidget *label)
670 {
671 GtkWidget *scale;
672 
673 	scale = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, GTK_CHART_MINBARW, GTK_CHART_SPANBARW, 1.0);
674 	gtk_scale_set_draw_value(GTK_SCALE(scale), FALSE);
675 	gtk_range_set_value(GTK_RANGE(scale), GTK_CHART_BARW);
676 
677 	if(label)
678 		gtk_label_set_mnemonic_widget (GTK_LABEL(label), scale);
679 
680 	return scale;
681 }
682 
683 /*
684 **
685 */
make_long(GtkWidget * label)686 GtkWidget *make_long(GtkWidget *label)
687 {
688 GtkWidget *spinner;
689 
690 	spinner = make_numeric(label, 0.0, G_MAXINT);
691 	return spinner;
692 }
693 
694 
make_year(GtkWidget * label)695 GtkWidget *make_year(GtkWidget *label)
696 {
697 GtkWidget *spinner;
698 GtkAdjustment *adj;
699 
700 	adj = (GtkAdjustment *) gtk_adjustment_new (0.0, 1900, 2200, 1.0, 10.0, 0.0);
701 	spinner = gtk_spin_button_new (adj, 0, 0);
702 	gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
703 	gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinner), TRUE);
704 	g_object_set(spinner, "xalign", 1.0, NULL);
705 
706 	if(label)
707 		gtk_label_set_mnemonic_widget (GTK_LABEL(label), spinner);
708 
709 	return spinner;
710 }
711 
712 
713 GtkWidget *
create_popover(GtkWidget * parent,GtkWidget * child,GtkPositionType pos)714 create_popover (GtkWidget       *parent,
715                 GtkWidget       *child,
716                 GtkPositionType  pos)
717 {
718 GtkWidget *popover;
719 
720 	popover = gtk_popover_new (parent);
721 	gtk_popover_set_position (GTK_POPOVER (popover), pos);
722 	gtk_container_add (GTK_CONTAINER (popover), child);
723 	gtk_widget_show (child);
724 
725 	hb_widget_set_margin(child, SPACING_POPOVER);
726 
727 	return popover;
728 }
729 
730 
731 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
732 
733 
hbtk_radio_button_get_active(GtkContainer * container)734 gint hbtk_radio_button_get_active (GtkContainer *container)
735 {
736 GList *lchild, *list;
737 GtkWidget *radio;
738 gint i, retval = 0;
739 
740 	if(!GTK_IS_CONTAINER(container))
741 		return -1;
742 
743 	lchild = list = gtk_container_get_children (container);
744 	for(i=0;list != NULL;i++)
745 	{
746 		radio = list->data;
747 		if(GTK_IS_TOGGLE_BUTTON(radio))
748 		{
749 			if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio)) == TRUE )
750 			{
751 				retval = i;
752 				break;
753 			}
754 		}
755 		list = g_list_next(list);
756 	}
757 	g_list_free(lchild);
758 
759 	return retval;
760 }
761 
762 
hbtk_radio_button_set_active(GtkContainer * container,gint active)763 void hbtk_radio_button_set_active (GtkContainer *container, gint active)
764 {
765 GList *lchild, *list;
766 GtkWidget *radio;
767 
768 	if(!GTK_IS_CONTAINER(container))
769 		return;
770 
771 	lchild = list = gtk_container_get_children (container);
772 	radio = g_list_nth_data (list, active);
773 	if(radio != NULL && GTK_IS_TOGGLE_BUTTON(radio))
774 	{
775 		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(radio), TRUE);
776 	}
777 	g_list_free(lchild);
778 }
779 
780 
hbtk_radio_button_get_nth(GtkContainer * container,gint nth)781 GtkWidget *hbtk_radio_button_get_nth (GtkContainer *container, gint nth)
782 {
783 GList *lchild, *list;
784 GtkWidget *radio;
785 
786 	if(!GTK_IS_CONTAINER(container))
787 		return NULL;
788 
789 	lchild = list = gtk_container_get_children (container);
790 	radio = g_list_nth_data (list, nth);
791 	g_list_free(lchild);
792 	return radio;   //may return NULL
793 }
794 
795 
hbtk_radio_button_unblock_by_func(GtkContainer * container,GCallback c_handler,gpointer data)796 void hbtk_radio_button_unblock_by_func(GtkContainer *container, GCallback c_handler, gpointer data)
797 {
798 GList *lchild, *list;
799 GtkWidget *radio;
800 gint i;
801 
802 	if(!GTK_IS_CONTAINER(container))
803 		return;
804 
805 	lchild = list = gtk_container_get_children (container);
806 	for(i=0;list != NULL;i++)
807 	{
808 		radio = list->data;
809 		if(GTK_IS_TOGGLE_BUTTON(radio))
810 		{
811 			g_signal_handlers_unblock_by_func (radio, c_handler, data);
812 		}
813 		list = g_list_next(list);
814 	}
815 	g_list_free(lchild);
816 }
817 
818 
hbtk_radio_button_block_by_func(GtkContainer * container,GCallback c_handler,gpointer data)819 void hbtk_radio_button_block_by_func(GtkContainer *container, GCallback c_handler, gpointer data)
820 {
821 GList *lchild, *list;
822 GtkWidget *radio;
823 gint i;
824 
825 	if(!GTK_IS_CONTAINER(container))
826 		return;
827 
828 	lchild = list = gtk_container_get_children (container);
829 	for(i=0;list != NULL;i++)
830 	{
831 		radio = list->data;
832 		if(GTK_IS_TOGGLE_BUTTON(radio))
833 		{
834 			g_signal_handlers_block_by_func (radio, c_handler, data);
835 		}
836 		list = g_list_next(list);
837 	}
838 	g_list_free(lchild);
839 }
840 
841 
hbtk_radio_button_connect(GtkContainer * container,const gchar * detailed_signal,GCallback c_handler,gpointer data)842 void hbtk_radio_button_connect(GtkContainer *container, const gchar *detailed_signal, GCallback c_handler, gpointer data)
843 {
844 GList *lchild, *list;
845 GtkWidget *radio;
846 gint i;
847 
848 	if(!GTK_IS_CONTAINER(container))
849 		return;
850 
851 	lchild = list = gtk_container_get_children (container);
852 	for(i=0;list != NULL;i++)
853 	{
854 		radio = list->data;
855 		if(GTK_IS_TOGGLE_BUTTON(radio))
856 		{
857 			g_signal_connect (radio, "toggled", c_handler, data);
858 		}
859 		list = g_list_next(list);
860 	}
861 	g_list_free(lchild);
862 
863 }
864 
865 
hbtk_radio_button_new(GtkOrientation orientation,gchar ** items,gboolean buttonstyle)866 GtkWidget *hbtk_radio_button_new (GtkOrientation orientation, gchar **items, gboolean buttonstyle)
867 {
868 GtkWidget *box, *button, *newbutton;
869 guint i;
870 
871 	box = gtk_box_new (orientation, 0);
872 
873     button = gtk_radio_button_new_with_label (NULL, _(items[0]));
874 	gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), !buttonstyle);
875     gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
876 	for (i = 1; items[i] != NULL; i++)
877 	{
878 		newbutton = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (button), _(items[i]));
879 		gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (newbutton), !buttonstyle);
880 	    gtk_box_pack_start (GTK_BOX (box), newbutton, FALSE, FALSE, 0);
881 	}
882 
883 	if(buttonstyle)
884 	{
885 		gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_LINKED);
886 		gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_RAISED);
887 	}
888 
889 	return box;
890 }
891 
892 
hbtk_radio_button_new_with_data(HbKivData * kivdata,gboolean buttonstyle)893 GtkWidget *hbtk_radio_button_new_with_data (HbKivData *kivdata, gboolean buttonstyle)
894 {
895 GtkWidget *box, *button, *image, *newbutton;
896 HbKivData *tmp = &kivdata[0];
897 guint i;
898 
899 	box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
900 
901     //button = gtk_radio_button_new_with_label (NULL, _(items[0]));
902 	button = gtk_radio_button_new(NULL);
903 	image = gtk_image_new_from_icon_name (tmp->iconname, GTK_ICON_SIZE_BUTTON);
904 	g_object_set (button, "image", image, "tooltip-text", tmp->name, NULL);
905 	gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), !buttonstyle);
906     gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
907 	for (i = 1; ; i++)
908 	{
909 		tmp = &kivdata[i];
910 		if( tmp->name == NULL )
911 			break;
912 
913 		//newbutton = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (button), _(items[i]));
914 		newbutton = gtk_radio_button_new_from_widget (GTK_RADIO_BUTTON (button));
915 		image = gtk_image_new_from_icon_name (tmp->iconname, GTK_ICON_SIZE_BUTTON);
916 		g_object_set (newbutton, "image", image, "tooltip-text", tmp->name, NULL);
917 		gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (newbutton), !buttonstyle);
918 	    gtk_box_pack_start (GTK_BOX (box), newbutton, FALSE, FALSE, 0);
919 	}
920 
921 	if(buttonstyle)
922 	{
923 		gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_LINKED);
924 		gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_RAISED);
925 	}
926 
927 	return box;
928 }
929 
930 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
931 
932 
933 static gboolean
is_separator(GtkTreeModel * model,GtkTreeIter * iter,gpointer data)934 is_separator (GtkTreeModel *model,
935 	      GtkTreeIter  *iter,
936 	      gpointer      data)
937 {
938   //GtkTreePath *path;
939   gboolean retval;
940   gchar *txt;
941 
942 	gtk_tree_model_get (model, iter, 0, &txt, -1);
943 
944 	retval = *txt == 0 ? TRUE : FALSE;
945   //path = gtk_tree_model_get_path (model, iter);
946   //result = gtk_tree_path_get_indices (path)[0] == 4;
947   //gtk_tree_path_free (path);
948 
949 	//leak
950 	g_free(txt);
951 
952 
953   return retval;
954 }
955 
956 
make_cycle(GtkWidget * label,gchar ** items)957 GtkWidget *make_cycle(GtkWidget *label, gchar **items)
958 {
959 GtkWidget *combobox;
960 guint i;
961 
962 	combobox = gtk_combo_box_text_new ();
963 
964 	for (i = 0; items[i] != NULL; i++)
965 	{
966 		if(*items[i] != 0)
967 			gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combobox), _(items[i]));
968 		else
969 			gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combobox), "");
970 	}
971 	gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
972 	gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), is_separator, NULL, NULL);
973 
974 	if(label)
975 		gtk_label_set_mnemonic_widget (GTK_LABEL(label), combobox);
976 
977 	return combobox;
978 }
979 
980 
981 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
982 
983 
984 #define HB_KV_BUFFER_MAX_LEN	8
985 #define HB_KV_ITEMS_MAX_LEN		32
986 
hbtk_get_label(HbKvData * kvdata,guint32 key)987 gchar *hbtk_get_label(HbKvData *kvdata, guint32 key)
988 {
989 gchar *retval = NULL;
990 guint32 i;
991 
992 	for(i=0;i<HB_KV_ITEMS_MAX_LEN;i++)
993 	{
994 	HbKvData *tmp = &kvdata[i];
995 		if( tmp->name == NULL )
996 			break;
997 		if( tmp->key == key )
998 		{
999 			//#1820372
1000 			retval = (gchar *)_(tmp->name);
1001 			break;
1002 		}
1003 	}
1004 	return retval;
1005 }
1006 
1007 
hbtk_combo_box_is_separator(GtkTreeModel * model,GtkTreeIter * iter,gpointer data)1008 static gboolean hbtk_combo_box_is_separator (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
1009 {
1010 //GtkTreePath *path;
1011 gboolean retval;
1012 gchar *txt;
1013 
1014 	gtk_tree_model_get (model, iter, 0, &txt, -1);
1015 	retval = *txt == 0 ? TRUE : FALSE;
1016 	//leak
1017 	g_free(txt);
1018 
1019 	return retval;
1020 }
1021 
1022 
hbtk_combo_box_get_active_id(GtkComboBoxText * combobox)1023 guint32 hbtk_combo_box_get_active_id (GtkComboBoxText *combobox)
1024 {
1025 const gchar* buf;
1026 guint32 retval;
1027 
1028 	buf = gtk_combo_box_get_active_id(GTK_COMBO_BOX(combobox));
1029 	retval = buf != NULL ? atoi(buf) : 0;
1030 
1031 	return retval;
1032 }
1033 
1034 
hbtk_combo_box_set_active_id(GtkComboBoxText * combobox,guint32 key)1035 void hbtk_combo_box_set_active_id (GtkComboBoxText *combobox, guint32 key)
1036 {
1037 gchar buf[HB_KV_BUFFER_MAX_LEN];
1038 
1039 	g_snprintf(buf, HB_KV_BUFFER_MAX_LEN-1, "%d", key);
1040 	gtk_combo_box_set_active_id(GTK_COMBO_BOX(combobox), buf);
1041 }
1042 
1043 
hbtk_combo_box_text_append(GtkComboBoxText * combobox,guint32 key,gchar * text)1044 void hbtk_combo_box_text_append (GtkComboBoxText *combobox, guint32 key, gchar *text)
1045 {
1046 gchar buf[HB_KV_BUFFER_MAX_LEN];
1047 
1048 	g_snprintf(buf, HB_KV_BUFFER_MAX_LEN-1, "%d", key);
1049 	gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox), buf, text);
1050 }
1051 
1052 
hbtk_combo_box_new(GtkWidget * label)1053 GtkWidget *hbtk_combo_box_new (GtkWidget *label)
1054 {
1055 GtkWidget *combobox;
1056 
1057 	combobox = gtk_combo_box_text_new();
1058 
1059 	if(label)
1060 		gtk_label_set_mnemonic_widget (GTK_LABEL(label), combobox);
1061 
1062 	return combobox;
1063 }
1064 
1065 
hbtk_combo_box_new_with_data(GtkWidget * label,HbKvData * kvdata)1066 GtkWidget *hbtk_combo_box_new_with_data (GtkWidget *label, HbKvData *kvdata)
1067 {
1068 GtkWidget *combobox = hbtk_combo_box_new(label);
1069 HbKvData *tmp;
1070 gboolean hassep;
1071 guint32 i;
1072 
1073 	hassep = FALSE;
1074 	for(i=0;i<HB_KV_ITEMS_MAX_LEN;i++)
1075 	{
1076 		tmp = &kvdata[i];
1077 		if( tmp->name == NULL )
1078 			break;
1079 		if( *tmp->name != 0 )
1080 		{
1081 			hbtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox), tmp->key, (gchar *)_(tmp->name));
1082 		}
1083 		else
1084 		{
1085 			hbtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox), tmp->key, (gchar *)"");
1086 			hassep = TRUE;
1087 		}
1088 	}
1089 	gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
1090 
1091 	if(hassep)
1092 		gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), hbtk_combo_box_is_separator, NULL, NULL);
1093 
1094 	return combobox;
1095 }
1096 
1097 
1098 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
1099 
1100 static void
set_sensitive(GtkCellLayout * cell_layout,GtkCellRenderer * cell,GtkTreeModel * tree_model,GtkTreeIter * iter,gpointer data)1101 set_sensitive (GtkCellLayout   *cell_layout,
1102 	       GtkCellRenderer *cell,
1103 	       GtkTreeModel    *tree_model,
1104 	       GtkTreeIter     *iter,
1105 	       gpointer         data)
1106 {
1107 GtkTreePath *path;
1108 gint *indices;
1109 gboolean sensitive;
1110 
1111 	path = gtk_tree_model_get_path (tree_model, iter);
1112 	indices = gtk_tree_path_get_indices (path);
1113 	sensitive = indices[0] != FLT_RANGE_OTHER;
1114 	gtk_tree_path_free (path);
1115 
1116 	g_object_set (cell, "sensitive", sensitive, NULL);
1117 }
1118 
1119 
1120 
make_daterange(GtkWidget * label,guint dspmode)1121 GtkWidget *make_daterange(GtkWidget *label, guint dspmode)
1122 {
1123 GtkWidget *combobox = hbtk_combo_box_new(label);
1124 GList *renderers, *list;
1125 HbKvData *tmp, *kvdata = CYA_FLT_RANGE;
1126 guint32 i;
1127 
1128 	for(i=0;i<HB_KV_ITEMS_MAX_LEN;i++)
1129 	{
1130 		tmp = &kvdata[i];
1131 		if( tmp->name == NULL )
1132 			break;
1133 
1134 		if( (tmp->key == FLT_RANGE_OTHER) )
1135 		{
1136 			if( dspmode == DATE_RANGE_CUSTOM_DISABLE )
1137 			{
1138 				renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(combobox));
1139 				if(g_list_length(renderers) == 1)
1140 				{
1141 					list = g_list_first(renderers);
1142 					gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
1143 									list->data,
1144 									set_sensitive,
1145 									NULL, NULL);
1146 				}
1147 				g_list_free(renderers);
1148 			}
1149 			else
1150 			if( dspmode == DATE_RANGE_CUSTOM_HIDE )
1151 			{
1152 				//if hide, we do not show it
1153 				i++;
1154 				continue;
1155 			}
1156 		}
1157 
1158 		hbtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox), tmp->key, (*tmp->name != 0) ? (gchar *)_(tmp->name) : (gchar *)"");
1159 	}
1160 
1161 	gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
1162 	gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), hbtk_combo_box_is_separator, NULL, NULL);
1163 
1164 	return combobox;
1165 }
1166 
1167 
1168 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
1169 
1170 /*
1171 id  ofx  			english                           french
1172  ---------------------------------------------------------------------
1173  0	--------      	(none)                            (aucun)
1174  1	--------      	credit card                       carte de crédit
1175  2	OFX_CHECK     	Check                             cheque
1176  3  OFX_CASH      	Cash  	withdrawal                retrait espece
1177  4	OFX_XFER      	Transfer                          virement
1178  5	--------      	internal transfer                 virement compte
1179  6	--------      	(debit card)                      (carte de paiement
1180  7	OFX_REPEATPMT 	Repeating payment/standing order  Paiement recurrent/Virement auto.
1181 
1182  8	OFX_PAYMENT   	Electronic payment                télépaiement
1183  9	OFX_DEP 	    Deposit                           dépôt
1184 10	OFX_FEE       	FI fee                            frais bancaires
1185 
1186 
1187 	 OFX_DIRECTDEBIT 	Merchant initiated debit     prelevement
1188 	 OFX_OTHER 	Somer other type of transaction      autre
1189 
1190 other OFX values:
1191 
1192 OFX_CREDIT 	Generic credit
1193 OFX_DEBIT 	Generic debit
1194 OFX_INT 	Interest earned or paid (Note: Depends on signage of amount)
1195 OFX_DIV 	Dividend
1196 OFX_SRVCHG 	Service charge
1197 -OFX_DEP 	Deposit
1198 OFX_ATM 	ATM debit or credit (Note: Depends on signage of amount)
1199 OFX_POS 	Point of sale debit or credit (Note: Depends on signage of amount)
1200 -OFX_XFER 	Transfer
1201 -OFX_CHECK 	Check
1202 -OFX_PAYMENT 	Electronic payment
1203 -OFX_CASH 	Cash withdrawal
1204 OFX_DIRECTDEP 	Direct deposit
1205 OFX_DIRECTDEBIT 	Merchant initiated debit
1206 -OFX_REPEATPMT 	Repeating payment/standing order
1207 OFX_OTHER 	Somer other type of transaction
1208 */
1209 
1210 enum
1211 {
1212 	LST_PAYMODE_KEY,
1213 	LST_PAYMODE_ICONNAME,
1214 	LST_PAYMODE_LABEL,
1215 	NUM_LST_PAYMODE
1216 };
1217 
1218 
1219 HbKivData CYA_TXN_PAYMODE[NUM_PAYMODE_MAX] =
1220 {
1221 	{ PAYMODE_NONE,		"pm-none",		N_("(none)") },
1222 	{ PAYMODE_CCARD,		"pm-ccard", N_("Credit card") },
1223 	{ PAYMODE_CHECK,		"pm-check", N_("Check") },
1224 	{ PAYMODE_CASH,		"pm-cash" , N_("Cash") },
1225 	{ PAYMODE_XFER,		"pm-transfer", N_("Bank Transfer") },
1226 	{ PAYMODE_DCARD,		"pm-dcard", N_("Debit card") },
1227 	{ PAYMODE_REPEATPMT,		"pm-standingorder",	N_("Standing order") },
1228 	{ PAYMODE_EPAYMENT,		"pm-epayment", 	N_("Electronic payment") },
1229 	{ PAYMODE_DEPOSIT,		"pm-deposit", N_("Deposit") },
1230 	//TRANSLATORS: Financial institution fee
1231 	{ PAYMODE_FEE,		"pm-fifee", N_("FI fee") },
1232 	{ PAYMODE_DIRECTDEBIT,		"pm-directdebit", 	N_("Direct Debit") },
1233 	{ 0, NULL , NULL }
1234 };
1235 
1236 
1237 /* nota: used in ui-filter */
get_paymode_icon_name(guint32 key)1238 const gchar *get_paymode_icon_name(guint32 key)
1239 {
1240 const gchar *retval = NULL;
1241 HbKivData *kivdata = CYA_TXN_PAYMODE;
1242 guint32 i;
1243 
1244 	for(i=0;i<HB_KV_ITEMS_MAX_LEN;i++)
1245 	{
1246 	HbKivData *tmp = &kivdata[i];
1247 		if( tmp->name == NULL )
1248 			break;
1249 		if( tmp->key == key )
1250 		{
1251 			retval = tmp->iconname;
1252 			break;
1253 		}
1254 	}
1255 	return retval;
1256 }
1257 
1258 
paymode_combo_box_get_active(GtkComboBox * combo_box)1259 guint32 paymode_combo_box_get_active (GtkComboBox *combo_box)
1260 {
1261   GtkTreeModel *model;
1262   GtkTreeIter iter;
1263 
1264 	model = gtk_combo_box_get_model (combo_box);
1265 
1266 	if (gtk_combo_box_get_active_iter (combo_box, &iter))
1267     {
1268 	gint key;
1269 
1270       gtk_tree_model_get (model, &iter, LST_PAYMODE_KEY, &key, -1);
1271 
1272       return (guint32)key;
1273     }
1274 
1275 
1276 	return 0;
1277 }
1278 
1279 
paymode_combo_box_set_active(GtkComboBox * combo_box,guint32 active_key)1280 void paymode_combo_box_set_active (GtkComboBox *combo_box, guint32 active_key)
1281 {
1282   GtkTreeModel *model;
1283   GtkTreeIter iter;
1284 
1285 	model = gtk_combo_box_get_model (combo_box);
1286 
1287 	  if (gtk_tree_model_get_iter_first (model, &iter))
1288     do {
1289 	gint key;
1290 
1291       gtk_tree_model_get (model, &iter, LST_PAYMODE_KEY, &key, -1);
1292 
1293       if (key == (gint)active_key)
1294         {
1295           gtk_combo_box_set_active_iter (combo_box, &iter);
1296           break;
1297         }
1298     } while (gtk_tree_model_iter_next (model, &iter));
1299 
1300 }
1301 
1302 
1303 /*
1304 ** Make a paymode combobox widget
1305 */
make_paymode_internal(GtkWidget * label,gboolean intxfer)1306 static GtkWidget *make_paymode_internal(GtkWidget *label, gboolean intxfer)
1307 {
1308 GtkListStore *store;
1309 GtkTreeIter iter;
1310 GtkWidget *combobox;
1311 GtkCellRenderer *renderer, *r1, *r2;
1312 HbKivData *tmp, *kvdata = CYA_TXN_PAYMODE;
1313 guint i;
1314 
1315 	store = gtk_list_store_new (
1316 		NUM_LST_PAYMODE,
1317 		G_TYPE_INT,
1318 		G_TYPE_STRING,
1319 		G_TYPE_STRING
1320 		);
1321 
1322 	combobox = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
1323 	//leak
1324 	g_object_unref(store);
1325 
1326 	renderer = r1 = gtk_cell_renderer_pixbuf_new();
1327 	gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox), renderer, FALSE);
1328 	gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox), renderer, "icon-name", LST_PAYMODE_ICONNAME);
1329 
1330 	renderer = r2 = gtk_cell_renderer_text_new();
1331 	gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox), renderer, FALSE);
1332 	gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox), renderer, "text", LST_PAYMODE_LABEL);
1333 
1334 	//populate our combobox model
1335 	for(i=0;i<NUM_PAYMODE_MAX;i++)
1336 	{
1337 		tmp = &kvdata[i];
1338 		if( tmp->name == NULL )
1339 			break;
1340 		gtk_list_store_append(store, &iter);
1341 		gtk_list_store_set(store, &iter,
1342 			LST_PAYMODE_KEY, tmp->key,
1343 		    LST_PAYMODE_ICONNAME, tmp->iconname,
1344 			LST_PAYMODE_LABEL, _(tmp->name),
1345 			-1);
1346 	}
1347 
1348 	gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
1349 
1350 	if(label)
1351 		gtk_label_set_mnemonic_widget (GTK_LABEL(label), combobox);
1352 
1353 	return combobox;
1354 }
1355 
1356 
1357 
make_paymode(GtkWidget * label)1358 GtkWidget *make_paymode(GtkWidget *label)
1359 {
1360 	return make_paymode_internal(label, TRUE);
1361 }
1362 
make_paymode_nointxfer(GtkWidget * label)1363 GtkWidget *make_paymode_nointxfer(GtkWidget *label)
1364 {
1365 	return make_paymode_internal(label, FALSE);
1366 }
1367 
1368 
1369 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
1370 
1371 #define NUM_NAINEX_MAX 3
1372 
1373 enum
1374 {
1375 	LST_NAINEX_ICONNAME,
1376 	LST_NAINEX_LABEL,
1377 	NUM_LST_NAINEX
1378 };
1379 
1380 char *nainex_iconnames[NUM_NAINEX_MAX] =
1381 {
1382 	"flt-inactive",
1383 	"flt-include",
1384 	"flt-exclude",
1385 };
1386 
1387 extern gchar *nainex_label_names[];
1388 
1389 /*
1390 ** Make a nainex combobox widget
1391 */
make_nainex(GtkWidget * label)1392 GtkWidget *make_nainex(GtkWidget *label)
1393 {
1394 GtkListStore  *store;
1395 GtkTreeIter    iter;
1396 GtkWidget *combobox;
1397 GtkCellRenderer    *renderer;
1398 guint i;
1399 
1400 	//store
1401 	store = gtk_list_store_new (
1402 		NUM_LST_NAINEX,
1403 		G_TYPE_STRING,
1404 		G_TYPE_STRING
1405 		);
1406 
1407 	//combobox
1408 	combobox = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
1409 
1410 	//column 1
1411 	renderer = gtk_cell_renderer_pixbuf_new();
1412 	gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox), renderer, FALSE);
1413 	gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox), renderer, "icon-name", LST_NAINEX_ICONNAME);
1414 
1415 	renderer = gtk_cell_renderer_text_new();
1416 	gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox), renderer, FALSE);
1417 	gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox), renderer, "text", LST_NAINEX_LABEL);
1418 
1419 	gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
1420 
1421 	//populate our combobox model
1422 	for(i=0;i<NUM_NAINEX_MAX;i++)
1423 	{
1424 		gtk_list_store_append(store, &iter);
1425 		gtk_list_store_set(store, &iter,
1426 			LST_NAINEX_ICONNAME, nainex_iconnames[i],
1427 			LST_NAINEX_LABEL, _(nainex_label_names[i]),
1428 			-1);
1429 	}
1430 	gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
1431 
1432 	if(label)
1433 		gtk_label_set_mnemonic_widget (GTK_LABEL(label), combobox);
1434 
1435 	return combobox;
1436 }
1437 
1438