27 #include <glib/gi18n.h> 29 #include "gnc-report-combo.h" 32 #include "dialog-utils.h" 35 __attribute__((unused))
static QofLogModule log_module = GNC_MOD_GUI;
37 static void gnc_report_combo_dispose (GObject *
object);
38 static void gnc_report_combo_finalize (GObject *
object);
40 #define GNC_REPORT_COMBO_PATH "gnc-report-combo-path" 54 GtkWidget *warning_image;
56 const gchar *rpt_guids;
58 gboolean block_signal;
61 gchar *active_report_guid;
62 gchar *active_report_name;
66 G_DEFINE_TYPE(GncReportCombo, gnc_report_combo, GTK_TYPE_BOX)
75 static guint report_combo_signals [LAST_SIGNAL] = {0};
84 static GParamSpec *report_combo_properties [N_PROPERTIES] = {NULL,};
87 gnc_report_combo_get_property (GObject *
object,
92 GncReportCombo *grc = GNC_REPORT_COMBO(
object);
96 case PROP_POPUP_SHOWN:
97 g_value_set_boolean (value, grc->popup_shown);
102 G_OBJECT_WARN_INVALID_PROPERTY_ID (
object, property_id, pspec);
114 gnc_report_combo_class_init (GncReportComboClass *klass)
116 GObjectClass *object_class = G_OBJECT_CLASS(klass);
118 object_class->get_property = gnc_report_combo_get_property;
119 object_class->dispose = gnc_report_combo_dispose;
120 object_class->finalize = gnc_report_combo_finalize;
122 report_combo_signals [CHANGED] =
123 g_signal_new (
"changed",
124 G_OBJECT_CLASS_TYPE(object_class),
129 g_cclosure_marshal_VOID__VOID,
133 report_combo_properties [PROP_POPUP_SHOWN] =
134 g_param_spec_boolean (
"popup-shown",
140 g_object_class_install_properties (object_class,
142 report_combo_properties);
152 gnc_report_combo_init (GncReportCombo *grc)
154 g_return_if_fail (grc != NULL);
155 g_return_if_fail (GNC_IS_REPORT_COMBO(grc));
158 gtk_widget_set_name (GTK_WIDGET(grc),
"gnc-id-report-combo");
160 grc->block_signal = FALSE;
161 grc->active_report_guid = NULL;
162 grc->active_report_name = NULL;
163 grc->popup_shown = FALSE;
177 gnc_report_combo_dispose (GObject *
object)
182 G_OBJECT_CLASS (gnc_report_combo_parent_class)->dispose (
object);
196 gnc_report_combo_finalize (GObject *
object)
200 g_return_if_fail (
object != NULL);
201 g_return_if_fail (GNC_IS_REPORT_COMBO(
object));
203 grc = GNC_REPORT_COMBO(
object);
205 g_free (grc->active_report_guid);
206 g_free (grc->active_report_name);
208 G_OBJECT_CLASS (gnc_report_combo_parent_class)->finalize (
object);
222 select_active_and_check_exists (GncReportCombo *grc)
224 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX(grc->combo));
226 gboolean valid_iter = gtk_tree_model_get_iter_first (model, &iter);
232 gtk_tree_model_get (model, &iter, RC_GUID, &guid, -1);
234 if (g_strcmp0 (grc->active_report_guid, guid) == 0)
236 gtk_combo_box_set_active_iter (GTK_COMBO_BOX(grc->combo), &iter);
241 valid_iter = gtk_tree_model_iter_next (model, &iter);
244 if (grc->active_report_name)
245 tmp = g_strdup (grc->active_report_name);
247 tmp = g_strdup (_(
"Selected Report is Missing"));
249 gtk_list_store_prepend (GTK_LIST_STORE(model), &iter);
250 gtk_list_store_set (GTK_LIST_STORE(model), &iter,
252 RC_GUID, grc->active_report_guid,
257 gtk_combo_box_set_active_iter (GTK_COMBO_BOX(grc->combo), &iter);
262 update_report_list (GncReportCombo *grc, GSList *report_list)
264 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX(grc->combo));
266 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(model),
267 RC_NAME, GTK_SORT_ASCENDING);
269 gtk_list_store_clear (GTK_LIST_STORE(model));
275 for (GSList* node = report_list; node != NULL; node = g_slist_next (node))
279 gtk_list_store_append (GTK_LIST_STORE(model), &iter);
280 gtk_list_store_set (GTK_LIST_STORE(model), &iter,
281 RC_NAME, rle->report_name,
282 RC_GUID, rle->report_guid,
285 g_free (rle->report_name);
286 g_free (rle->report_guid);
290 g_slist_free (report_list);
294 update_warning_tooltip (GncReportCombo *grc)
298 if (grc->active_report_name)
300 tool_tip = g_strdup_printf (_(
"'%s' is missing"),
301 grc->active_report_name);
304 tool_tip = g_strdup_printf (_(
"Report with GUID '%s' is missing"),
305 grc->active_report_guid);
307 gtk_widget_show (grc->warning_image);
308 gtk_widget_set_tooltip_text (grc->warning_image, tool_tip);
313 gnc_report_combo_set_active (GncReportCombo *grc,
314 const char* active_report_guid,
315 const char* active_report_name)
317 g_return_if_fail (grc != NULL);
318 g_return_if_fail (GNC_IS_REPORT_COMBO(grc));
320 g_free (grc->active_report_guid);
322 grc->active_report_guid = g_strdup (active_report_guid);
324 g_free (grc->active_report_name);
326 grc->active_report_name = g_strdup (active_report_name);
328 grc->block_signal = TRUE;
330 if (!select_active_and_check_exists (grc))
331 update_warning_tooltip (grc);
333 grc->block_signal = FALSE;
337 gnc_report_combo_get_active_guid (GncReportCombo *grc)
342 g_return_val_if_fail (grc != NULL, NULL);
343 g_return_val_if_fail (GNC_IS_REPORT_COMBO(grc), NULL);
345 if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX(grc->combo), &iter))
347 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX(grc->combo));
348 gtk_tree_model_get (model, &iter, RC_GUID, &guid, -1);
354 gnc_report_combo_get_active_name (GncReportCombo *grc)
359 g_return_val_if_fail (grc != NULL, NULL);
360 g_return_val_if_fail (GNC_IS_REPORT_COMBO(grc), NULL);
362 if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX(grc->combo), &iter))
364 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX(grc->combo));
365 gtk_tree_model_get (model, &iter, RC_NAME, &name, -1);
371 gnc_report_combo_get_active_guid_name (GncReportCombo *grc)
373 gchar *report = NULL;
376 g_return_val_if_fail (grc != NULL, NULL);
377 g_return_val_if_fail (GNC_IS_REPORT_COMBO(grc), NULL);
379 if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX(grc->combo), &iter))
381 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX(grc->combo));
384 gtk_tree_model_get (model, &iter, RC_NAME, &report_name,
385 RC_GUID, &report_guid,
388 report = g_strconcat (report_guid,
"/", report_name, NULL);
389 g_free (report_guid);
390 g_free (report_name);
396 gnc_report_combo_set_active_guid_name (GncReportCombo *grc,
397 const gchar *guid_name)
399 g_return_if_fail (grc != NULL);
400 g_return_if_fail (GNC_IS_REPORT_COMBO(grc));
402 if (guid_name && *guid_name)
405 gchar *name = g_strstr_len (guid_name, -1,
"/");
409 guid = g_strndup (guid_name, (name - guid_name));
410 gnc_report_combo_set_active (grc, guid, name + 1);
417 gnc_report_combo_is_warning_visible_for_active (GncReportCombo *grc)
419 g_return_val_if_fail (grc != NULL, FALSE);
420 g_return_val_if_fail (GNC_IS_REPORT_COMBO(grc), FALSE);
422 return gtk_widget_is_visible (GTK_WIDGET(grc->warning_image));
426 combo_changed_cb (GtkComboBox *widget, gpointer user_data)
428 GncReportCombo *grc = GNC_REPORT_COMBO(user_data);
431 if (gtk_combo_box_get_active_iter (widget, &iter))
433 GtkTreeModel *model = gtk_combo_box_get_model (widget);
435 gtk_tree_model_get (model, &iter, RC_MISSING, &missing, -1);
437 gtk_widget_set_visible (grc->warning_image, missing);
439 if (!grc->block_signal)
440 g_signal_emit (grc, report_combo_signals [CHANGED], 0);
442 gtk_widget_queue_resize (GTK_WIDGET(widget));
447 combo_popped_cb (GObject *gobject,
451 GncReportCombo *grc = GNC_REPORT_COMBO(user_data);
452 gboolean popup_shown;
454 g_object_get (G_OBJECT(gobject),
"popup-shown", &popup_shown, NULL);
456 grc->popup_shown = popup_shown;
457 g_object_notify (G_OBJECT(grc),
"popup-shown");
461 gnc_report_combo_refresh (GncReportCombo *grc, GSList *report_list)
463 g_return_if_fail (grc != NULL);
464 g_return_if_fail (GNC_IS_REPORT_COMBO(grc));
465 g_return_if_fail (report_list != NULL);
467 grc->block_signal = TRUE;
469 update_report_list (grc, report_list);
471 if (!select_active_and_check_exists (grc))
472 update_warning_tooltip (grc);
474 grc->block_signal = FALSE;
483 gnc_report_combo_new (GSList *report_list)
487 GtkCellRenderer *renderer;
489 store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
490 grc = g_object_new (GNC_TYPE_REPORT_COMBO, NULL);
492 grc->combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL(store));
493 g_object_unref (store);
495 renderer = gtk_cell_renderer_text_new ();
496 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(grc->combo), renderer, TRUE);
497 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT(grc->combo), renderer,
498 "text", RC_NAME, NULL);
500 gtk_box_pack_start (GTK_BOX(grc), GTK_WIDGET(grc->combo), TRUE, TRUE, 0);
501 grc->warning_image = gtk_image_new_from_icon_name (
"dialog-warning",
502 GTK_ICON_SIZE_SMALL_TOOLBAR);
503 gtk_box_pack_start (GTK_BOX(grc), GTK_WIDGET(grc->warning_image), FALSE, FALSE, 6);
504 gtk_widget_set_no_show_all (GTK_WIDGET(grc->warning_image), TRUE);
505 gtk_widget_hide (GTK_WIDGET(grc->warning_image));
507 update_report_list (grc, report_list);
509 g_signal_connect (G_OBJECT(grc->combo),
"changed",
510 G_CALLBACK(combo_changed_cb), grc);
512 g_signal_connect (G_OBJECT(grc->combo),
"notify::popup-shown",
513 G_CALLBACK(combo_popped_cb), grc);
515 gtk_widget_show_all (GTK_WIDGET(grc));
517 return GTK_WIDGET(grc);
utility functions for the GnuCash UI
All type declarations for the whole Gnucash engine.