GnuCash  2.6.99
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
gnc-tree-view-owner.c
1 /********************************************************************\
2  * gnc-tree-view-owner.c -- GtkTreeView implementation to display *
3  * owners in a GtkTreeView. *
4  * Copyright (C) 2011 Geert Janssens <[email protected]> *
5  * *
6  * This program is free software; you can redistribute it and/or *
7  * modify it under the terms of the GNU General Public License as *
8  * published by the Free Software Foundation; either version 2 of *
9  * the License, or (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, contact: *
18  * *
19  * Free Software Foundation Voice: +1-617-542-5942 *
20  * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
21  * Boston, MA 02110-1301, USA [email protected] *
22  * *
23 \********************************************************************/
24 
25 #include "config.h"
26 
27 #include <gtk/gtk.h>
28 #include <glib/gi18n.h>
29 #include <string.h>
30 
31 #include "gnc-tree-view.h"
32 #include "gnc-tree-model-owner.h"
33 #include "gnc-tree-view-owner.h"
34 
35 #include "gncOwner.h"
36 #include "gnc-accounting-period.h"
37 #include "gnc-commodity.h"
38 #include "gnc-component-manager.h"
39 #include "gnc-engine.h"
40 #include "gnc-glib-utils.h"
41 #include "gnc-gobject-utils.h"
42 #include "gnc-hooks.h"
43 #include "gnc-session.h"
44 #include "gnc-icons.h"
45 #include "gnc-ui-balances.h"
46 #include "dialog-utils.h"
47 #include "window-main-summarybar.h"
48 #include "assistant-utils.h"
49 
50 #define SAMPLE_OWNER_VALUE "$1,000,000.00"
51 
54 /* This static indicates the debugging module that this .o belongs to. */
55 static QofLogModule log_module = GNC_MOD_GUI;
56 
58 static void gnc_tree_view_owner_class_init (GncTreeViewOwnerClass *klass);
59 static void gnc_tree_view_owner_init (GncTreeViewOwner *view);
60 static void gnc_tree_view_owner_finalize (GObject *object);
61 
62 static void gtvo_update_column_names (GncTreeView *view);
63 static void gtvo_currency_changed_cb (void);
64 
65 static gboolean gnc_tree_view_owner_filter_helper (GtkTreeModel *model,
66  GtkTreeIter *iter,
67  gpointer data);
68 
69 #if 0 /* Not Used */
70 static void gtvo_setup_column_renderer_edited_cb(GncTreeViewOwner *owner_view,
71  GtkTreeViewColumn *column,
72  GtkCellRenderer *renderer,
73  GncTreeViewOwnerColumnTextEdited col_edited_cb);
74 #endif /* Not Used */
75 
77 {
78  OwnerViewInfo ovi;
79 
81  gpointer filter_data;
82  GSourceFunc filter_destroy;
83 
84  GtkTreeViewColumn *name_column;
85  GtkTreeViewColumn *id_column;
86  GtkTreeViewColumn *balance_report_column;
87  GtkTreeViewColumn *notes_column;
89 
90 #define GNC_TREE_VIEW_OWNER_GET_PRIVATE(o) \
91  (G_TYPE_INSTANCE_GET_PRIVATE ((o), GNC_TYPE_TREE_VIEW_OWNER, GncTreeViewOwnerPrivate))
92 
93 
94 /************************************************************/
95 /* g_object required functions */
96 /************************************************************/
97 
98 static GObjectClass *parent_class = NULL;
99 
100 GType
101 gnc_tree_view_owner_get_type (void)
102 {
103  static GType gnc_tree_view_owner_type = 0;
104 
105  if (gnc_tree_view_owner_type == 0)
106  {
107  static const GTypeInfo our_info =
108  {
109  sizeof (GncTreeViewOwnerClass),
110  NULL,
111  NULL,
112  (GClassInitFunc) gnc_tree_view_owner_class_init,
113  NULL,
114  NULL,
115  sizeof (GncTreeViewOwner),
116  0,
117  (GInstanceInitFunc) gnc_tree_view_owner_init
118  };
119 
120  gnc_tree_view_owner_type = g_type_register_static (
121  GNC_TYPE_TREE_VIEW, GNC_TREE_VIEW_OWNER_NAME,
122  &our_info, 0);
123  }
124 
125  return gnc_tree_view_owner_type;
126 }
127 
128 static void
129 gnc_tree_view_owner_class_init (GncTreeViewOwnerClass *klass)
130 {
131  GObjectClass *o_class;
132 
133  parent_class = g_type_class_peek_parent (klass);
134 
135  /* GObject signals */
136  o_class = G_OBJECT_CLASS (klass);
137  o_class->finalize = gnc_tree_view_owner_finalize;
138 
139  g_type_class_add_private(klass, sizeof(GncTreeViewOwnerPrivate));
140 
141  gnc_hook_add_dangler(HOOK_CURRENCY_CHANGED,
142  (GFunc)gtvo_currency_changed_cb, NULL);
143 }
144 
145 /********************************************************************\
146  * gnc_init_owner_view_info *
147  * initialize an owner view info structure with default values *
148  * *
149  * Args: ovi - structure to initialize *
150  * Returns: nothing *
151 \********************************************************************/
152 static void
153 gnc_init_owner_view_info(OwnerViewInfo *ovi)
154 {
155  ovi->show_inactive = FALSE;
156 }
157 
158 static void
159 gnc_tree_view_owner_init (GncTreeViewOwner *view)
160 {
162 
163  priv = GNC_TREE_VIEW_OWNER_GET_PRIVATE(view);
164  gnc_init_owner_view_info(&priv->ovi);
165 }
166 
167 static void
168 gnc_tree_view_owner_finalize (GObject *object)
169 {
170  GncTreeViewOwner *owner_view;
172 
173  ENTER("view %p", object);
174  g_return_if_fail (object != NULL);
175  g_return_if_fail (GNC_IS_TREE_VIEW_OWNER (object));
176 
177  owner_view = GNC_TREE_VIEW_OWNER (object);
178 
179  priv = GNC_TREE_VIEW_OWNER_GET_PRIVATE(owner_view);
180  if (priv->filter_destroy)
181  {
182  priv->filter_destroy(priv->filter_data);
183  priv->filter_destroy = NULL;
184  }
185  priv->filter_fn = NULL;
186 
187  if (G_OBJECT_CLASS (parent_class)->finalize)
188  (* G_OBJECT_CLASS (parent_class)->finalize) (object);
189  LEAVE(" ");
190 }
191 
192 
193 /************************************************************
194  * Callbacks *
195  ************************************************************/
196 static void
197 gnc_tree_view_owner_active_toggled (GtkCellRendererToggle *cell,
198  const gchar *s_path_str,
199  gpointer user_data)
200 {
201  GncTreeViewOwner *tree_view;
202  GtkTreePath *s_path;
203  GncOwner *owner;
204  gboolean active;
205 
206  /* Change the requested owner */
207  tree_view = user_data;
208  s_path = gtk_tree_path_new_from_string (s_path_str);
209  owner = gnc_tree_view_owner_get_owner_from_path (tree_view, s_path);
210  if (owner)
211  {
212  active = !gtk_cell_renderer_toggle_get_active (cell); // hasn't changed yet.
213  gncOwnerSetActive (owner, active);
214  }
215 
216  /* Clean up */
217  gtk_tree_path_free (s_path);
218 }
219 
220 
221 /************************************************************/
222 /* sort functions */
223 /************************************************************/
224 
225 static GtkTreeModel *
226 sort_cb_setup_w_iters (GtkTreeModel *f_model,
227  GtkTreeIter *f_iter_a,
228  GtkTreeIter *f_iter_b,
229  GtkTreeIter *iter_a,
230  GtkTreeIter *iter_b,
231  const GncOwner **owner_a,
232  const GncOwner **owner_b)
233 {
234  GtkTreeModel *model;
235 
236  model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
237  gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(f_model),
238  iter_a,
239  f_iter_a);
240  gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(f_model),
241  iter_b,
242  f_iter_b);
243  *owner_a = gnc_tree_model_owner_get_owner (GNC_TREE_MODEL_OWNER(model), iter_a);
244  *owner_b = gnc_tree_model_owner_get_owner (GNC_TREE_MODEL_OWNER(model), iter_b);
245  return model;
246 }
247 
248 static void
249 sort_cb_setup (GtkTreeModel *f_model,
250  GtkTreeIter *f_iter_a,
251  GtkTreeIter *f_iter_b,
252  const GncOwner **owner_a,
253  const GncOwner **owner_b)
254 {
255  GtkTreeIter iter_a, iter_b;
256 
257  sort_cb_setup_w_iters (f_model, f_iter_a, f_iter_b,
258  &iter_a, &iter_b, owner_a, owner_b);
259 }
260 
261 static gint
262 sort_by_string (GtkTreeModel *f_model,
263  GtkTreeIter *f_iter1,
264  GtkTreeIter *f_iter2,
265  gpointer user_data)
266 {
267  GtkTreeModel *model;
268  GtkTreeIter iter1, iter2;
269  const GncOwner *owner1, *owner2;
270  gchar *str1, *str2;
271  gint column = GPOINTER_TO_INT(user_data);
272  gint result;
273 
274  model = sort_cb_setup_w_iters(f_model, f_iter1, f_iter2, &iter1, &iter2, &owner1, &owner2);
275 
276  /* Get the strings. */
277  gtk_tree_model_get(GTK_TREE_MODEL(model), &iter1, column, &str1, -1);
278  gtk_tree_model_get(GTK_TREE_MODEL(model), &iter2, column, &str2, -1);
279 
280  result = safe_utf8_collate(str1, str2);
281  g_free(str1);
282  g_free(str2);
283  if (result != 0)
284  return result;
285  return gncOwnerCompare(owner1, owner2);
286 }
287 
288 static gint
289 sort_by_boolean (GtkTreeModel *f_model,
290  GtkTreeIter *f_iter1,
291  GtkTreeIter *f_iter2,
292  gpointer user_data)
293 {
294  GtkTreeModel *model;
295  GtkTreeIter iter1, iter2;
296  const GncOwner *owner1, *owner2;
297  gboolean *bool1, *bool2;
298  gint column = GPOINTER_TO_INT(user_data);
299 
300  model = sort_cb_setup_w_iters(f_model, f_iter1, f_iter2, &iter1, &iter2, &owner1, &owner2);
301 
302  /* Get the booleans. */
303  gtk_tree_model_get(GTK_TREE_MODEL(model), &iter1, column, &bool1, -1);
304  gtk_tree_model_get(GTK_TREE_MODEL(model), &iter2, column, &bool2, -1);
305 
306  if (bool1)
307  {
308  if (!bool2)
309  return 1; /* bool1 > bool2 */
310  }
311  else
312  {
313  if (bool2)
314  return -1; /* bool2 > bool1 */
315  }
316  return gncOwnerCompare(owner1, owner2);
317 }
318 
319 static gint
320 sort_by_xxx_value (GtkTreeModel *f_model,
321  GtkTreeIter *f_iter_a,
322  GtkTreeIter *f_iter_b,
323  gpointer user_data)
324 {
325  GncOwner *owner_a, *owner_b;
326  gnc_numeric balance_a, balance_b;
327  gint result;
328 
329  /* Find the owners */
330  sort_cb_setup (f_model, f_iter_a, f_iter_b, (const GncOwner**)&owner_a, (const GncOwner**)&owner_b);
331 
332  balance_a = gnc_ui_owner_get_balance_full(owner_a, NULL, NULL);
333  balance_b = gnc_ui_owner_get_balance_full(owner_b, NULL, NULL);
334 
335  result = gnc_numeric_compare(balance_a, balance_b);
336  if (result != 0)
337  return result;
338  return gncOwnerCompare(owner_a, owner_b);
339 }
340 
341 static gint
342 sort_by_balance_value (GtkTreeModel *f_model,
343  GtkTreeIter *f_iter_a,
344  GtkTreeIter *f_iter_b,
345  gpointer user_data)
346 {
347  return sort_by_xxx_value (f_model, f_iter_a, f_iter_b, user_data);
348 }
349 
350 
351 /************************************************************/
352 /* New View Creation */
353 /************************************************************/
354 
355 /*
356  * Create a new owner tree view for one type of owners.
357  * This view will be based on a model that is common to all views of
358  * the same set of books, but will have its own private filter on that
359  * model.
360  */
361 GtkTreeView *
362 gnc_tree_view_owner_new (GncOwnerType owner_type)
363 {
364  GncTreeView *view;
365  GtkTreeModel *model, *f_model, *s_model;
366  const gchar *sample_type, *sample_currency;
368 
369  ENTER(" ");
370  /* Create our view */
371  view = g_object_new (GNC_TYPE_TREE_VIEW_OWNER,
372  "name", "owner_tree", NULL);
373 
374  priv = GNC_TREE_VIEW_OWNER_GET_PRIVATE(GNC_TREE_VIEW_OWNER (view));
375 
376  /* Create/get a pointer to the existing model for this set of books. */
377  model = gnc_tree_model_owner_new (owner_type);
378 
379  /* Set up the view private filter layer on the common model. */
380  f_model = gtk_tree_model_filter_new (model, NULL);
381  /* A GncTreeModelOwner is based on a GncTreeModel, which is a
382  * GObject that provides a GtkTreeModel interface. */
383  g_object_unref(G_OBJECT(model));
384 
385  /* Set up the view private sort layer on the common model. */
386  s_model = gtk_tree_model_sort_new_with_model(f_model);
387  g_object_unref(G_OBJECT(f_model));
388  gtk_tree_view_set_model (GTK_TREE_VIEW (view), s_model);
389  g_object_unref(G_OBJECT(s_model));
390 
391  /* Set default visibilities */
392  gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(view), FALSE);
393 
394  sample_type = gncOwnerTypeToQofIdType (GNC_OWNER_CUSTOMER);
396 
397  priv->name_column
398  = gnc_tree_view_add_text_column(view, _("Owner Name"), GNC_OWNER_TREE_NAME_COL,
399  NULL, "GnuCash Inc.",
400  GNC_TREE_MODEL_OWNER_COL_NAME,
401  GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
402  sort_by_string);
403  gnc_tree_view_add_text_column(view, _("Type"), GNC_OWNER_TREE_TYPE_COL,
404  NULL, sample_type,
405  GNC_TREE_MODEL_OWNER_COL_TYPE,
406  GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
407  sort_by_string);
408  priv->id_column
409  = gnc_tree_view_add_text_column(view, _("Owner ID"), GNC_OWNER_TREE_ID_COL,
410  NULL, "1-123-1234",
411  GNC_TREE_MODEL_OWNER_COL_ID,
412  GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
413  sort_by_string);
414  gnc_tree_view_add_text_column(view, _("Currency"), GNC_OWNER_TREE_CURRENCY_COL,
415  NULL, sample_currency,
416  GNC_TREE_MODEL_OWNER_COL_CURRENCY,
417  GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
418  sort_by_string);
419  gnc_tree_view_add_text_column(view, _("Address Name"), GNC_OWNER_TREE_ADDRESS_NAME_COL,
420  NULL, "GnuCash Inc.",
421  GNC_TREE_MODEL_OWNER_COL_ADDRESS_NAME,
422  GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
423  sort_by_string);
424  gnc_tree_view_add_text_column(view, _("Address 1"), GNC_OWNER_TREE_ADDRESS_1_COL,
425  NULL, "Free Software Foundation",
426  GNC_TREE_MODEL_OWNER_COL_ADDRESS_1,
427  GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
428  sort_by_string);
429  gnc_tree_view_add_text_column(view, _("Address 2"), GNC_OWNER_TREE_ADDRESS_2_COL,
430  NULL, "51 Franklin Street, Fifth Floor",
431  GNC_TREE_MODEL_OWNER_COL_ADDRESS_2,
432  GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
433  sort_by_string);
434  gnc_tree_view_add_text_column(view, _("Address 3"), GNC_OWNER_TREE_ADDRESS_3_COL,
435  NULL, "Boston, MA 02110-1301",
436  GNC_TREE_MODEL_OWNER_COL_ADDRESS_3,
437  GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
438  sort_by_string);
439  gnc_tree_view_add_text_column(view, _("Address 4"), GNC_OWNER_TREE_ADDRESS_4_COL,
440  NULL, "USA",
441  GNC_TREE_MODEL_OWNER_COL_ADDRESS_4,
442  GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
443  sort_by_string);
444  gnc_tree_view_add_text_column(view, _("Phone"), GNC_OWNER_TREE_PHONE_COL,
445  NULL, "+1-617-542-5942",
446  GNC_TREE_MODEL_OWNER_COL_PHONE,
447  GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
448  sort_by_string);
449  gnc_tree_view_add_text_column(view, _("Fax"), GNC_OWNER_TREE_FAX_COL,
450  NULL, "+1-617-542-2652",
451  GNC_TREE_MODEL_OWNER_COL_FAX,
452  GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
453  sort_by_string);
454  gnc_tree_view_add_text_column(view, _("E-mail"), GNC_OWNER_TREE_EMAIL_COL,
455  NULL, "[email protected]",
456  GNC_TREE_MODEL_OWNER_COL_EMAIL,
457  GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
458  sort_by_string);
459  gnc_tree_view_add_numeric_column(view, _("Balance"), GNC_OWNER_TREE_BALANCE_COL,
460  SAMPLE_OWNER_VALUE,
461  GNC_TREE_MODEL_OWNER_COL_BALANCE,
462  GNC_TREE_MODEL_OWNER_COL_COLOR_BALANCE,
463  GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
464  sort_by_balance_value);
465 
466  priv->balance_report_column
467  = gnc_tree_view_add_numeric_column(view, _("Balance"), GNC_OWNER_TREE_BALANCE_REPORT_COL,
468  SAMPLE_OWNER_VALUE,
469  GNC_TREE_MODEL_OWNER_COL_BALANCE_REPORT,
470  GNC_TREE_MODEL_OWNER_COL_COLOR_BALANCE,
471  GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
472  sort_by_balance_value);
473 
474  priv->notes_column
475  = gnc_tree_view_add_text_column(view, _("Notes"), GNC_OWNER_TREE_NOTES_COL, NULL,
476  "Sample owner notes.",
477  GNC_TREE_MODEL_OWNER_COL_NOTES,
478  GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
479  sort_by_string);
480  gnc_tree_view_add_toggle_column (view, _("Active"),
481  /* Translators: This string has a context prefix; the translation
482  must only contain the part after the | character. */
483  Q_("Column letter for 'Active'|A"),
484  GNC_OWNER_TREE_ACTIVE_COL,
485  GNC_TREE_MODEL_OWNER_COL_ACTIVE,
486  GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
487  sort_by_boolean,
488  gnc_tree_view_owner_active_toggled);
489 
490  /* Update column titles to use the currency name. */
491  gtvo_update_column_names(view);
492 
493  /* By default only the first column is visible. */
495  gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (f_model),
496  gnc_tree_view_owner_filter_helper,
497  view,
498  NULL);
499 
500  /* Default the sorting to owner name */
501  gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(s_model),
502  GNC_TREE_MODEL_OWNER_COL_NAME,
503  GTK_SORT_ASCENDING);
504 
505  gtk_widget_show(GTK_WIDGET(view));
506  LEAVE("%p", view);
507  return GTK_TREE_VIEW(view);
508 }
509 
510 /************************************************************/
511 /* Auxiliary Functions */
512 /************************************************************/
513 
514 #define debug_path(fn, path) { \
515  gchar *path_string = gtk_tree_path_to_string(path); \
516  fn("tree path %s", path_string); \
517  g_free(path_string); \
518  }
519 
520 #if 0 /* Not Used */
521 static GtkTreePath *
522 gnc_tree_view_owner_get_path_from_owner (GncTreeViewOwner *view,
523  GncOwner *owner)
524 {
525  GtkTreeModel *model, *f_model, *s_model;
526  GtkTreePath *path, *f_path, *s_path;
527 
528  ENTER("view %p, owner %p (%s)", view, owner, gncOwnerGetName(owner));
529 
530  if (owner == NULL)
531  {
532  LEAVE("no owner");
533  return NULL;
534  }
535 
536  /* Reach down to the real model and get a path for this owner */
537  s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
538  f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
539  model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
540  path = gnc_tree_model_owner_get_path_from_owner (GNC_TREE_MODEL_OWNER(model), owner);
541  if (path == NULL)
542  {
543  LEAVE("no path");
544  return NULL;
545  }
546 
547  /* convert back to a filtered path */
548  f_path = gtk_tree_model_filter_convert_child_path_to_path (GTK_TREE_MODEL_FILTER (f_model), path);
549  gtk_tree_path_free(path);
550  if (!f_path)
551  {
552  LEAVE("no filter path");
553  return NULL;
554  }
555 
556  /* convert back to a sorted path */
557  s_path = gtk_tree_model_sort_convert_child_path_to_path (GTK_TREE_MODEL_SORT (s_model), f_path);
558  gtk_tree_path_free(f_path);
559  debug_path(LEAVE, s_path);
560  return s_path;
561 }
562 
563 static gboolean
564 gnc_tree_view_owner_get_iter_from_owner (GncTreeViewOwner *view,
565  GncOwner *owner,
566  GtkTreeIter *s_iter)
567 {
568  GtkTreeModel *model, *f_model, *s_model;
569  GtkTreeIter iter, f_iter;
570 
571  g_return_val_if_fail(GNC_IS_TREE_VIEW_OWNER(view), FALSE);
572  g_return_val_if_fail(owner != NULL, FALSE);
573  g_return_val_if_fail(s_iter != NULL, FALSE);
574 
575  ENTER("view %p, owner %p (%s)", view, owner, gncOwnerGetName(owner));
576 
577  /* Reach down to the real model and get an iter for this owner */
578  s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
579  f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
580  model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
582  GNC_TREE_MODEL_OWNER(model), owner, &iter))
583  {
584  LEAVE("model_get_iter_from_owner failed");
585  return FALSE;
586  }
587 
588  /* convert back to a sort iter */
589  gtk_tree_model_filter_convert_child_iter_to_iter (
590  GTK_TREE_MODEL_FILTER(f_model), &f_iter, &iter);
591  gtk_tree_model_sort_convert_child_iter_to_iter (GTK_TREE_MODEL_SORT(s_model),
592  s_iter, &f_iter);
593  LEAVE(" ");
594  return TRUE;
595 }
596 #endif /* Not Used */
597 
598 /************************************************************/
599 /* Owner Tree View Filter Functions */
600 /************************************************************/
601 
602 static gboolean
603 gnc_tree_view_owner_filter_helper (GtkTreeModel *model,
604  GtkTreeIter *iter,
605  gpointer data)
606 {
607  GncOwner *owner;
608  GncTreeViewOwner *view = data;
610 
611  g_return_val_if_fail (GNC_IS_TREE_MODEL_OWNER (model), FALSE);
612  g_return_val_if_fail (iter != NULL, FALSE);
613 
615  GNC_TREE_MODEL_OWNER(model), iter);
616 
617  priv = GNC_TREE_VIEW_OWNER_GET_PRIVATE(view);
618  if (priv->filter_fn)
619  return priv->filter_fn(owner, priv->filter_data);
620  else return TRUE;
621 }
622 
623 /*
624  * Set an GtkTreeModel visible filter on this owner. This filter will be
625  * called for each owner that the tree is about to show, and the
626  * owner will be passed to the callback function.
627  *
628  * Use NULL as func to remove filter.
629  */
630 void
633  gpointer data,
634  GSourceFunc destroy)
635 {
637 
638  ENTER("view %p, filter func %p, data %p, destroy %p",
639  view, func, data, destroy);
640 
641  g_return_if_fail(GNC_IS_TREE_VIEW_OWNER(view));
642 
643  priv = GNC_TREE_VIEW_OWNER_GET_PRIVATE(view);
644  if (priv->filter_destroy)
645  {
646  priv->filter_destroy(priv->filter_data);
647  }
648  priv->filter_destroy = destroy;
649  priv->filter_data = data;
650  priv->filter_fn = func;
651 
653  LEAVE(" ");
654 }
655 
656 /*
657  * Forces the entire owner tree to be re-evaluated for visibility.
658  */
659 void
661 {
662  GtkTreeModel *f_model, *s_model;
663 
664  g_return_if_fail(GNC_IS_TREE_VIEW_OWNER(view));
665 
666  s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
667  f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
668  gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (f_model));
669 }
670 
671 /************************************************************/
672 /* Owner Tree View Get/Set Functions */
673 /************************************************************/
674 
675 /*
676  * Retrieve the selected owner from an owner tree view. The
677  * owner tree must be in single selection mode.
678  */
679 GncOwner *
681  GtkTreePath *s_path)
682 {
683  GtkTreeModel *model, *f_model, *s_model;
684  GtkTreePath *path, *f_path;
685  GtkTreeIter iter;
686  GncOwner *owner;
687 
688  ENTER("view %p", view);
689  g_return_val_if_fail (GNC_IS_TREE_VIEW_OWNER (view), NULL);
690  g_return_val_if_fail (s_path != NULL, NULL);
691 
692  s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
693  f_path = gtk_tree_model_sort_convert_path_to_child_path (
694  GTK_TREE_MODEL_SORT (s_model), s_path);
695  if (!f_path)
696  {
697  LEAVE("no filter path");
698  return NULL;
699  }
700 
701  f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
702  path = gtk_tree_model_filter_convert_path_to_child_path (
703  GTK_TREE_MODEL_FILTER (f_model), f_path);
704  gtk_tree_path_free(f_path);
705  if (!path)
706  {
707  LEAVE("no path");
708  return NULL;
709  }
710 
711  model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
712  if (!gtk_tree_model_get_iter (model, &iter, path))
713  {
714  LEAVE("no iter");
715  return NULL;
716  }
717 
718  owner = iter.user_data;
719  gtk_tree_path_free(path);
720  LEAVE("owner %p (%s)", owner, gncOwnerGetName (owner));
721  return owner;
722 }
723 
724 
725 GncOwner *
727  GtkTreeIter *s_iter)
728 {
729  GtkTreeModel *model, *f_model;
730  GtkTreeIter iter, f_iter;
731  GncOwner *owner;
732 
733  g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT(s_model), NULL);
734  g_return_val_if_fail (s_iter != NULL, NULL);
735 
736  ENTER("model %p, iter %p", s_model, s_iter);
737 
738  gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT(s_model),
739  &f_iter,
740  s_iter);
741  f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
742  gtk_tree_model_filter_convert_iter_to_child_iter (
743  GTK_TREE_MODEL_FILTER(f_model), &iter, &f_iter);
744  model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
746  GNC_TREE_MODEL_OWNER(model), &iter);
747  LEAVE("owner %p (%s)", owner, gncOwnerGetName (owner));
748  return owner;
749 }
750 
751 
752 /*
753  * Retrieve the selected owner from an owner tree view. The
754  * owner tree must be in single selection mode.
755  */
756 GncOwner *
758 {
759  GtkTreeSelection *selection;
760  GtkTreeModel *f_model, *s_model;
761  GtkTreeIter iter, f_iter, s_iter;
762  GncOwner *owner;
763  GtkSelectionMode mode;
764 
765  ENTER("view %p", view);
766  g_return_val_if_fail (GNC_IS_TREE_VIEW_OWNER (view), NULL);
767 
768  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(view));
769  mode = gtk_tree_selection_get_mode(selection);
770  if ((mode != GTK_SELECTION_SINGLE) && (mode != GTK_SELECTION_BROWSE))
771  {
772  return NULL;
773  }
774  if (!gtk_tree_selection_get_selected (selection, &s_model, &s_iter))
775  {
776  LEAVE("no owner, get_selected failed");
777  return FALSE;
778  }
779 
780  gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model),
781  &f_iter, &s_iter);
782 
783  f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
784  gtk_tree_model_filter_convert_iter_to_child_iter (
785  GTK_TREE_MODEL_FILTER (f_model), &iter, &f_iter);
786 
787  owner = iter.user_data;
788  LEAVE("owner %p (%s)", owner, gncOwnerGetName (owner));
789  return owner;
790 }
791 
792 /*
793  * Selects a single owner in the owner tree view. The owner
794  * tree must be in single selection mode.
795  */
796 void
798  GncOwner *owner)
799 {
800  GtkTreeModel *model, *f_model, *s_model;
801  GtkTreePath *path, *f_path, *s_path;
802  GtkTreeSelection *selection;
803 
804  ENTER("view %p, owner %p (%s)", view,
805  owner, gncOwnerGetName (owner));
806  g_return_if_fail (GNC_IS_TREE_VIEW_OWNER (view));
807 
808  /* Clear any existing selection. */
809  selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
810  gtk_tree_selection_unselect_all (selection);
811 
812  if (owner == NULL)
813  return;
814 
815  s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
816  f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
817  model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
818 
820  GNC_TREE_MODEL_OWNER(model), owner);
821  if (path == NULL)
822  {
823  LEAVE("no path");
824  return;
825  }
826  debug_path(DEBUG, path);
827 
828  f_path = gtk_tree_model_filter_convert_child_path_to_path (
829  GTK_TREE_MODEL_FILTER (f_model), path);
830  gtk_tree_path_free(path);
831  if (f_path == NULL)
832  {
833  LEAVE("no filter path");
834  return;
835  }
836  debug_path(DEBUG, f_path);
837 
838  s_path = gtk_tree_model_sort_convert_child_path_to_path (GTK_TREE_MODEL_SORT (s_model),
839  f_path);
840  gtk_tree_path_free(f_path);
841  if (s_path == NULL)
842  {
843  LEAVE("no sort path");
844  return;
845  }
846 
847  gtk_tree_selection_select_path (selection, s_path);
848 
849  /* give gtk+ a chance to resize the tree view first by handling pending
850  * configure events */
851  while (gtk_events_pending ())
852  gtk_main_iteration ();
853  gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW(view), s_path, NULL, FALSE, 0.0, 0.0);
854  debug_path(LEAVE, s_path);
855  gtk_tree_path_free(s_path);
856 }
857 
858 /* Information re selection process */
859 typedef struct
860 {
861  GList* return_list;
864 
865 #if 0 /* Not Used */
866 /*
867  * This helper function is called once for each row in the tree view
868  * that is currently selected. Its task is to append the corresponding
869  * owner to the end of a glist.
870  */
871 static void
872 get_selected_owners_helper (GtkTreeModel *s_model,
873  GtkTreePath *s_path,
874  GtkTreeIter *s_iter,
875  gpointer data)
876 {
877  GncTreeViewSelectionInfo *gtvsi = data;
878  GtkTreeModel *f_model;
879  GtkTreeIter iter, f_iter;
880  GncOwner *owner;
881 
882  gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model),
883  &f_iter, s_iter);
884 
885  f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
886  gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (f_model),
887  &iter, &f_iter);
888  owner = iter.user_data;
889 
890  /* Only selected if it passes the filter */
891  if (gtvsi->priv->filter_fn == NULL || gtvsi->priv->filter_fn(owner, gtvsi->priv->filter_data))
892  {
893  gtvsi->return_list = g_list_append(gtvsi->return_list, owner);
894  }
895 }
896 #endif /* Not Used */
897 
898 /************************************************************/
899 /* Owner Tree View Add Column Functions */
900 /************************************************************/
901 
902 static void
903 gtvo_update_column_name (GtkTreeViewColumn *column,
904  const gchar *fmt,
905  const gchar *mnemonic)
906 {
907  gchar *name;
908 
909  g_return_if_fail(column);
910 
911  name = g_strdup_printf(fmt, mnemonic);
912  gtk_tree_view_column_set_title(column, name);
913  g_free(name);
914 }
915 
916 
917 static void
918 gtvo_update_column_names (GncTreeView *view)
919 {
921  const gchar *mnemonic;
922 
923  priv = GNC_TREE_VIEW_OWNER_GET_PRIVATE(view);
925 
926  gtvo_update_column_name(priv->balance_report_column,
927  /* Translators: %s is a currency mnemonic.*/
928  _("Balance (%s)"), mnemonic);
931 }
932 
933 
934 static void
935 gtvo_currency_changed_cb (void)
936 {
937  const GList *views, *ptr;
938 
939  views = gnc_gobject_tracking_get_list (GNC_TREE_VIEW_OWNER_NAME);
940  for (ptr = views; ptr; ptr = g_list_next(ptr))
941  {
942  gtvo_update_column_names (ptr->data);
943  }
944 }
945 
946 #if 0 /* Not Used */
947 /* This function implements a custom mapping between an owner's KVP
948  * and the cell renderer's 'text' property. */
949 static void
950 owner_cell_kvp_data_func (GtkTreeViewColumn *tree_column,
951  GtkCellRenderer *cell,
952  GtkTreeModel *s_model,
953  GtkTreeIter *s_iter,
954  gpointer key)
955 {
956  GncOwner *owner;
957  kvp_frame * frame;
958 
959  g_return_if_fail (GTK_IS_TREE_MODEL_SORT (s_model));
960  owner = gnc_tree_view_owner_get_owner_from_iter(s_model, s_iter);
961  frame = gncOwnerGetSlots(owner);
962 
963  g_object_set (G_OBJECT (cell),
964  "text", kvp_frame_get_string(frame, (gchar *)key),
965  "xalign", 0.0,
966  NULL);
967 
968 }
969 
970 static void col_edited_helper(GtkCellRendererText *cell, gchar *path_string,
971  gchar *new_text, gpointer _s_model)
972 {
973  GncOwner *owner;
974  GtkTreeModel *s_model;
975  GtkTreeIter s_iter;
976  GncTreeViewOwnerColumnTextEdited col_edited_cb;
977  GtkTreeViewColumn *col;
978 
979  col_edited_cb = g_object_get_data(G_OBJECT(cell),
980  "column_edited_callback");
981  col = GTK_TREE_VIEW_COLUMN(g_object_get_data(G_OBJECT(cell),
982  "column_view"));
983  s_model = GTK_TREE_MODEL(_s_model);
984 
985  if (!gtk_tree_model_get_iter_from_string(s_model, &s_iter, path_string))
986  return;
987 
988  owner = gnc_tree_view_owner_get_owner_from_iter(s_model, &s_iter);
989  col_edited_cb(owner, col, new_text);
990 }
991 
992 static void col_source_helper(GtkTreeViewColumn *col, GtkCellRenderer *cell,
993  GtkTreeModel *s_model, GtkTreeIter *s_iter,
994  gpointer _col_source_cb)
995 {
996  GncOwner *owner;
997  gchar *text;
998  GncTreeViewOwnerColumnSource col_source_cb;
999 
1000  g_return_if_fail (GTK_IS_TREE_MODEL_SORT (s_model));
1001  col_source_cb = (GncTreeViewOwnerColumnSource) _col_source_cb;
1002  owner = gnc_tree_view_owner_get_owner_from_iter(s_model, s_iter);
1003  text = col_source_cb(owner, col, cell);
1004  g_object_set (G_OBJECT (cell), "text", text, "xalign", 1.0, NULL);
1005  g_free(text);
1006 }
1007 
1012 void
1013 gtvo_setup_column_renderer_edited_cb(GncTreeViewOwner *owner_view,
1014  GtkTreeViewColumn *column,
1015  GtkCellRenderer *renderer,
1016  GncTreeViewOwnerColumnTextEdited col_edited_cb)
1017 {
1018  GtkTreeModel *s_model;
1019 
1020  if (col_edited_cb == NULL)
1021  {
1022  g_object_set(G_OBJECT(renderer), "editable", FALSE, NULL);
1023  g_object_set_data(G_OBJECT(renderer), "column_edited_callback", col_edited_cb);
1024  s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(owner_view));
1025  g_signal_handlers_disconnect_by_func(G_OBJECT(renderer), col_edited_cb, s_model);
1026  g_object_set_data(G_OBJECT(renderer), "column_view", column);
1027  }
1028  else
1029  {
1030  g_object_set(G_OBJECT(renderer), "editable", TRUE, NULL);
1031  g_object_set_data(G_OBJECT(renderer), "column_edited_callback",
1032  col_edited_cb);
1033  s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(owner_view));
1034  g_signal_connect(G_OBJECT(renderer), "edited",
1035  (GCallback) col_edited_helper, s_model);
1036  g_object_set_data(G_OBJECT(renderer), "column_view", column);
1037  }
1038 }
1039 #endif /* Not Used */
1040 
1041 /* BEGIN FILTER FUNCTIONS */
1042 #define FILTER_TREE_VIEW "types_tree_view"
1043 
1055 gboolean
1057  gpointer user_data)
1058 {
1059  OwnerFilterDialog *fd = user_data;
1060  gnc_numeric total;
1061 
1062  ENTER("owner %p:%s", owner, gncOwnerGetName(owner));
1063 
1064  if (!fd->show_inactive && !gncOwnerGetActive (owner))
1065  {
1066  LEAVE(" hide: inactive");
1067  return FALSE;
1068  }
1069 
1070  if (!fd->show_zero_total)
1071  {
1072  total = gncOwnerGetBalanceInCurrency (owner, NULL);
1073  if (gnc_numeric_zero_p(total))
1074  {
1075  LEAVE(" hide: zero balance");
1076  return FALSE;
1077  }
1078  }
1079 
1080  return TRUE;
1081 }
1082 
1089 void
1090 gppot_filter_show_inactive_toggled_cb (GtkToggleButton *button,
1091  OwnerFilterDialog *fd)
1092 {
1093  g_return_if_fail(GTK_IS_TOGGLE_BUTTON(button));
1094 
1095  ENTER("button %p", button);
1096  fd->show_inactive = !gtk_toggle_button_get_active(button);
1097  gnc_tree_view_owner_refilter(fd->tree_view);
1098  LEAVE("show_inactive %d", fd->show_inactive);
1099 }
1100 
1107 void
1108 gppot_filter_show_zero_toggled_cb (GtkToggleButton *button,
1109  OwnerFilterDialog *fd)
1110 {
1111  g_return_if_fail(GTK_IS_TOGGLE_BUTTON(button));
1112 
1113  ENTER("button %p", button);
1114  fd->show_zero_total = gtk_toggle_button_get_active(button);
1115  gnc_tree_view_owner_refilter(fd->tree_view);
1116  LEAVE("show_zero %d", fd->show_zero_total);
1117 }
1118 
1128 void
1129 gppot_filter_response_cb (GtkWidget *dialog,
1130  gint response,
1131  OwnerFilterDialog *fd)
1132 {
1133  gpointer gptemp;
1134 
1135  g_return_if_fail(GTK_IS_DIALOG(dialog));
1136 
1137  ENTER("dialog %p, response %d", dialog, response);
1138 
1139  if (response != GTK_RESPONSE_OK)
1140  {
1141  fd->show_inactive = fd->original_show_inactive;
1142  fd->show_zero_total = fd->original_show_zero_total;
1143  gnc_tree_view_owner_refilter(fd->tree_view);
1144  }
1145 
1146  /* Clean up and delete dialog */
1147  gptemp = (gpointer *)fd->dialog;
1148  g_atomic_pointer_compare_and_exchange(&gptemp,
1149  dialog, NULL);
1150  fd->dialog = gptemp;
1151  gtk_widget_destroy(dialog);
1152  LEAVE("");
1153 }
1154 
1155 void
1156 owner_filter_dialog_create(OwnerFilterDialog *fd, GncPluginPage *page)
1157 {
1158  GtkWidget *dialog, *button;
1159  GtkBuilder *builder;
1160  gchar *title;
1161 
1162  ENTER("(fd %p, page %p)", fd, page);
1163 
1164  if (fd->dialog)
1165  {
1166  gtk_window_present(GTK_WINDOW(fd->dialog));
1167  LEAVE("existing dialog");
1168  return;
1169  }
1170 
1171  /* Create the dialog */
1172  builder = gtk_builder_new();
1173  gnc_builder_add_from_file (builder, "gnc-tree-view-owner.glade", "Filter By");
1174  dialog = GTK_WIDGET(gtk_builder_get_object (builder, "Filter By"));
1175  fd->dialog = dialog;
1176  gtk_window_set_transient_for(GTK_WINDOW(dialog),
1177  GTK_WINDOW(GNC_PLUGIN_PAGE(page)->window));
1178  /* Translators: The %s is the name of the plugin page */
1179  title = g_strdup_printf(_("Filter %s by..."),
1180  gnc_plugin_page_get_page_name(GNC_PLUGIN_PAGE(page)));
1181  gtk_window_set_title(GTK_WINDOW(dialog), title);
1182  g_free(title);
1183 
1184  /* Remember current state */
1185  fd->original_show_inactive = fd->show_inactive;
1186  fd->original_show_zero_total = fd->show_zero_total;
1187 
1188  /* Update the dialog widgets for the current state */
1189  button = GTK_WIDGET(gtk_builder_get_object (builder, "show_inactive"));
1190  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button),
1191  !fd->show_inactive);
1192  button = GTK_WIDGET(gtk_builder_get_object (builder, "show_zero"));
1193  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button),
1194  fd->show_zero_total);
1195 
1196  /* Wire up the rest of the callbacks */
1197  gtk_builder_connect_signals (builder, fd);
1198  g_object_unref(G_OBJECT(builder));
1199 
1200  /* Show it */
1201  gtk_widget_show_all (dialog);
1202  LEAVE(" ");
1203 }
1204 
1205 #define OWNER_SELECTED_LABEL "SelectedOwner"
1206 #define SHOW_INACTIVE_LABEL "ShowInactive"
1207 #define SHOW_ZERO_LABEL "ShowZeroTotal"
1208 
1209 typedef struct foo
1210 {
1211  GKeyFile *key_file;
1212  const gchar *group_name;
1213 } bar_t;
1214 
1225 static void
1226 tree_save_selected_row (GncTreeViewOwner *view,
1227  gpointer user_data)
1228 {
1229  GncOwner *owner;
1230  bar_t *bar = user_data;
1231  const gchar *owner_name;
1232 
1234  if (owner == NULL)
1235  return;
1236 
1237  owner_name = gncOwnerGetName (owner);
1238  if (owner_name == NULL)
1239  return;
1240 
1241  g_key_file_set_string(bar->key_file, bar->group_name, OWNER_SELECTED_LABEL,
1242  owner_name);
1243 }
1244 
1245 void
1246 gnc_tree_view_owner_save(GncTreeViewOwner *view,
1247  OwnerFilterDialog *fd,
1248  GKeyFile *key_file, const gchar *group_name)
1249 {
1250  bar_t bar;
1251 
1252  g_return_if_fail (key_file != NULL);
1253  g_return_if_fail (group_name != NULL);
1254 
1255  ENTER("view %p, key_file %p, group_name %s", view, key_file,
1256  group_name);
1257 
1258  g_key_file_set_boolean(key_file, group_name, SHOW_INACTIVE_LABEL,
1259  fd->show_inactive);
1260  g_key_file_set_boolean(key_file, group_name, SHOW_ZERO_LABEL,
1261  fd->show_zero_total);
1262 
1263  bar.key_file = key_file;
1264  bar.group_name = group_name;
1265  tree_save_selected_row(view, &bar);
1266  LEAVE(" ");
1267 
1268 }
1269 
1277 static void
1278 tree_restore_selected_row (GncTreeViewOwner *view,
1279  GncOwnerType owner_type,
1280  const gchar *owner_guid_str)
1281 {
1282  GncOwner *owner = gncOwnerNew();
1283  QofBook *book;
1284  GncGUID owner_guid;
1285 
1286  book = qof_session_get_book (gnc_get_current_session());
1287  if (string_to_guid (owner_guid_str, &owner_guid))
1288  if (gncOwnerGetOwnerFromTypeGuid (book, owner, gncOwnerTypeToQofIdType(owner_type), &owner_guid))
1290 }
1291 
1292 void
1293 gnc_tree_view_owner_restore(GncTreeViewOwner *view,
1294  OwnerFilterDialog *fd,
1295  GKeyFile *key_file, const gchar *group_name,
1296  GncOwnerType owner_type)
1297 {
1298  GError *error = NULL;
1299  gchar *value;
1300  gboolean show;
1301 
1302  /* Filter information. Ignore missing keys. */
1303  show = g_key_file_get_boolean(key_file, group_name, SHOW_INACTIVE_LABEL, &error);
1304  if (error)
1305  {
1306  g_warning("error reading group %s key %s: %s",
1307  group_name, SHOW_INACTIVE_LABEL, error->message);
1308  g_error_free(error);
1309  error = NULL;
1310  show = TRUE;
1311  }
1312  fd->show_inactive = show;
1313 
1314  show = g_key_file_get_boolean(key_file, group_name, SHOW_ZERO_LABEL, &error);
1315  if (error)
1316  {
1317  g_warning("error reading group %s key %s: %s",
1318  group_name, SHOW_ZERO_LABEL, error->message);
1319  g_error_free(error);
1320  error = NULL;
1321  show = TRUE;
1322  }
1323  fd->show_zero_total = show;
1324 
1325  /* Selected owner (if any) */
1326  value = g_key_file_get_string(key_file, group_name, OWNER_SELECTED_LABEL, NULL);
1327  if (value)
1328  {
1329  tree_restore_selected_row(view, owner_type, value);
1330  g_free(value);
1331  }
1332 
1333  /* Update tree view for any changes */
1335 }
1336 
1337 #if 0 /* Not Used */
1338 static void
1339 gtvo_set_column_editor(GncTreeViewOwner *view,
1340  GtkTreeViewColumn *column,
1341  GncTreeViewOwnerColumnTextEdited edited_cb)
1342 {
1343  GList *renderers_orig, *renderers;
1344  GtkCellRenderer *renderer;
1345 
1346  // look for the first text-renderer; on the 0th column of the owner tree,
1347  // there are two renderers: pixbuf and text. So find the text one.
1348  for (renderers_orig = renderers = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
1349  renderers && !GTK_IS_CELL_RENDERER_TEXT(renderers->data);
1350  renderers = renderers->next);
1351  renderer = GTK_CELL_RENDERER(renderers->data);
1352  g_list_free(renderers_orig);
1353  g_return_if_fail(renderer != NULL);
1354  gtvo_setup_column_renderer_edited_cb(GNC_TREE_VIEW_OWNER(view), column, renderer, edited_cb);
1355 }
1356 #endif /* Not Used */
void gnc_tree_view_owner_set_selected_owner(GncTreeViewOwner *view, GncOwner *owner)
GtkTreeView * gnc_tree_view_owner_new(GncOwnerType owner_type)
Business Interface: Object OWNERs.
const GList * gnc_gobject_tracking_get_list(const gchar *name)
void gnc_tree_view_owner_set_filter(GncTreeViewOwner *view, gnc_tree_view_owner_filter_func func, gpointer data, GSourceFunc destroy)
const char * gnc_commodity_get_mnemonic(const gnc_commodity *cm)
void gnc_tree_view_owner_refilter(GncTreeViewOwner *view)
GtkTreeView implementation for gnucash owner tree.
GtkTreeViewColumn * gnc_tree_view_add_text_column(GncTreeView *view, const gchar *column_title, const gchar *pref_name, const gchar *stock_icon_name, const gchar *sizing_text, gint model_data_column, gint model_visibility_column, GtkTreeIterCompareFunc column_sort_fn)
GtkTreeModel implementation for gnucash owner tree.
int safe_utf8_collate(const char *da, const char *db)
common utilities for manipulating a GtkTreeView within gnucash
GncOwner * gnc_tree_view_owner_get_owner_from_iter(GtkTreeModel *s_model, GtkTreeIter *s_iter)
#define DEBUG(format, args...)
Definition: qoflog.h:255
const gchar * gnc_plugin_page_get_page_name(GncPluginPage *page)
gboolean string_to_guid(const gchar *string, GncGUID *guid)
void gppot_filter_response_cb(GtkWidget *dialog, gint response, OwnerFilterDialog *fd)
gboolean gnc_numeric_zero_p(gnc_numeric a)
void gnc_tree_view_set_show_column_menu(GncTreeView *view, gboolean visible)
gint gnc_numeric_compare(gnc_numeric a, gnc_numeric b)
GtkTreeViewColumn * gnc_tree_view_add_numeric_column(GncTreeView *view, const gchar *column_title, const gchar *pref_name, const gchar *sizing_text, gint model_data_column, gint model_color_column, gint model_visibility_column, GtkTreeIterCompareFunc column_sort_fn)
#define ENTER(format, args...)
Definition: qoflog.h:261
gnc_commodity * gnc_default_report_currency(void)
Definition: gnc-ui-util.c:972
Definition: guid.h:65
gnc_commodity * gnc_default_currency(void)
Definition: gnc-ui-util.c:939
gboolean(* gnc_tree_view_owner_filter_func)(GncOwner *owner, gpointer data)
GtkTreeViewColumn * gnc_tree_view_add_toggle_column(GncTreeView *view, const gchar *column_title, const gchar *column_short_title, const gchar *pref_name, gint model_data_column, gint model_visibility_column, GtkTreeIterCompareFunc column_sort_fn, renderer_toggled toggle_edited_cb)
QofBook * qof_session_get_book(const QofSession *session)
GtkTreeModel * gnc_tree_model_owner_new(GncOwnerType owner_type)
Gobject helper routines.
gnc_numeric gncOwnerGetBalanceInCurrency(const GncOwner *owner, const gnc_commodity *report_currency)
Definition: gncOwner.c:1417
void gnc_tree_view_configure_columns(GncTreeView *view)
General utilities for dealing with accounting periods.
int gncOwnerCompare(const GncOwner *a, const GncOwner *b)
Definition: gncOwner.c:568
void gppot_filter_show_inactive_toggled_cb(GtkToggleButton *button, OwnerFilterDialog *fd)
const char * gnc_commodity_get_fullname(const gnc_commodity *cm)
QofIdTypeConst gncOwnerTypeToQofIdType(GncOwnerType t)
Definition: gncOwner.c:213
GtkTreePath * gnc_tree_model_owner_get_path_from_owner(GncTreeModelOwner *model, GncOwner *owner)
GncOwner * gnc_tree_model_owner_get_owner(GncTreeModelOwner *model, GtkTreeIter *iter)
All type declarations for the whole Gnucash engine.
GLib helper routines.
gboolean gnc_tree_model_owner_get_iter_from_owner(GncTreeModelOwner *model, GncOwner *owner, GtkTreeIter *iter)
#define LEAVE(format, args...)
Definition: qoflog.h:271
void gppot_filter_show_zero_toggled_cb(GtkToggleButton *button, OwnerFilterDialog *fd)
GncOwner * gnc_tree_view_owner_get_selected_owner(GncTreeViewOwner *view)
GncOwner * gnc_tree_view_owner_get_owner_from_path(GncTreeViewOwner *view, GtkTreePath *s_path)
gboolean gnc_plugin_page_owner_tree_filter_owners(GncOwner *owner, gpointer user_data)
GncOwner * gncOwnerNew(void)
Definition: gncOwner.c:58
Commodity handling public routines.
const gchar * QofLogModule
Definition: qofid.h:89