33 #include <glib/gi18n.h> 43 #include "engine-helpers.h" 46 #include "dialog-utils.h" 47 #include "dialog-lot-viewer.h" 48 #include "gnc-component-manager.h" 52 #include "misc-gnome-utils.h" 53 #include "tree-view-utils.h" 55 #define LOT_VIEWER_CM_CLASS "dialog-lot-viewer" 75 SPLIT_COL_DESCRIPTION,
77 SPLIT_COL_AMOUNT_DOUBLE,
79 SPLIT_COL_VALUE_DOUBLE,
81 SPLIT_COL_GAIN_LOSS_DOUBLE,
83 SPLIT_COL_BALANCE_DOUBLE,
88 #define RESPONSE_VIEW 1 89 #define RESPONSE_DELETE 2 90 #define RESPONSE_SCRUB_LOT 3 91 #define RESPONSE_SCRUB_ACCOUNT 4 92 #define RESPONSE_NEW_LOT 5 94 #define GNC_PREFS_GROUP "dialogs.lot-viewer" 95 #define GNC_PREF_HPOS "hpane-position" 96 #define GNC_PREF_VPOS "vpane-position" 101 #ifdef LOTS_READY_FOR_SHOWTIME 102 GtkButton * regview_button;
104 GtkButton * delete_button;
105 GtkButton * scrub_lot_button;
106 GtkButton * new_lot_button;
107 GtkTreeView * lot_view;
108 GtkListStore * lot_store;
109 GtkTextView * lot_notes;
110 GtkEntry * title_entry;
111 GtkTreeView * split_in_lot_view;
112 GtkListStore * split_in_lot_store;
113 GtkTreeView * split_free_view;
114 GtkListStore * split_free_store;
115 GtkWidget * split_hpaned;
116 GtkButton * add_split_to_lot_button;
117 GtkButton * remove_split_from_lot_button;
118 GtkToggleButton * only_show_open_lots_checkbutton;
121 GNCLot * selected_lot;
124 static void gnc_lot_viewer_fill (GNCLotViewer *lv);
125 static void gnc_split_viewer_fill (GNCLotViewer *lv, GtkListStore *store,
SplitList *split_list);
130 void lv_title_entry_changed_cb (GtkEntry *ent, gpointer user_data);
131 void lv_response_cb (GtkDialog *dialog, gint response, gpointer data);
132 void lv_window_destroy_cb (GtkWidget *
object, gpointer user_data);
133 void lv_paned_notify_cb (GObject *gobject,
144 static gnc_commodity *
145 find_first_currency (GNCLot *lot)
150 for (node = split_list; node; node = node->next)
152 Split *s = node->data;
162 get_realized_gains (GNCLot *lot, gnc_commodity *currency)
164 gnc_numeric zero = gnc_numeric_zero();
165 gnc_numeric gains = zero;
168 if (!currency)
return zero;
171 for (node = split_list; node; node = node->next)
173 Split *s = node->data;
190 lv_show_splits_in_lot (GNCLotViewer *lv)
192 GNCLot *lot = lv->selected_lot;
195 if (NULL == lot)
return;
198 gnc_split_viewer_fill(lv, lv->split_in_lot_store, split_list);
205 lv_clear_splits_in_lot (GNCLotViewer *lv)
207 gtk_list_store_clear (lv->split_in_lot_store);
214 lv_show_splits_free (GNCLotViewer *lv)
220 gtk_list_store_clear (lv->split_free_store);
226 for (node = split_list; node; node = node->next)
228 Split *split = node->data;
231 filtered_list = g_list_prepend (filtered_list, split);
234 filtered_list = g_list_reverse (filtered_list);
237 gnc_split_viewer_fill(lv, lv->split_free_store, filtered_list);
238 g_list_free (filtered_list);
239 g_list_free (split_list);
246 lv_save_current_lot (GNCLotViewer *lv)
248 GNCLot *lot = lv->selected_lot;
254 gnc_lot_begin_edit(lot);
257 str = gtk_entry_get_text (lv->title_entry);
258 gnc_lot_set_title (lot, str);
261 notes = xxxgtk_textview_get_text (lv->lot_notes);
262 gnc_lot_set_notes (lot, notes);
265 gnc_lot_commit_edit(lot);
273 lv_unset_lot (GNCLotViewer *lv)
276 lv->selected_lot = NULL;
279 gtk_entry_set_text (lv->title_entry,
"");
280 gtk_editable_set_editable (GTK_EDITABLE(lv->title_entry), FALSE);
283 xxxgtk_textview_set_text (lv->lot_notes,
"");
284 gtk_text_view_set_editable (lv->lot_notes, FALSE);
287 lv_clear_splits_in_lot (lv);
289 #ifdef LOTS_READY_FOR_SHOWTIME 290 gtk_widget_set_sensitive(GTK_WIDGET(lv->regview_button), FALSE);
292 gtk_widget_set_sensitive(GTK_WIDGET(lv->delete_button), FALSE);
293 gtk_widget_set_sensitive(GTK_WIDGET(lv->scrub_lot_button), FALSE);
300 lv_select_row (GNCLotViewer *lv,
305 lv_save_current_lot (lv);
307 str = gnc_lot_get_title (lot);
309 gtk_entry_set_text (lv->title_entry, str);
310 gtk_editable_set_editable (GTK_EDITABLE(lv->title_entry), TRUE);
313 str = gnc_lot_get_notes (lot);
315 xxxgtk_textview_set_text (lv->lot_notes, str);
316 gtk_text_view_set_editable (lv->lot_notes, TRUE);
319 lv->selected_lot = lot;
320 lv_show_splits_in_lot (lv);
322 #ifdef LOTS_READY_FOR_SHOWTIME 323 gtk_widget_set_sensitive(GTK_WIDGET(lv->regview_button), TRUE);
325 gtk_widget_set_sensitive(GTK_WIDGET(lv->delete_button), TRUE);
326 gtk_widget_set_sensitive(GTK_WIDGET(lv->scrub_lot_button), TRUE);
333 lv_unselect_row (GNCLotViewer *lv)
335 lv_save_current_lot (lv);
343 gnc_lot_viewer_fill (GNCLotViewer *lv)
346 GNCLot *this_lot, *selected_lot = NULL;
350 GtkTreeSelection *selection;
351 gboolean found = FALSE;
355 selection = gtk_tree_view_get_selection(lv->lot_view);
356 if (gtk_tree_selection_get_selected (selection, &model, &iter))
357 gtk_tree_model_get(model, &iter, LOT_COL_PNTR, &selected_lot, -1);
360 gtk_list_store_clear (lv->lot_store);
362 for (node = lot_list; node; node = node->next)
367 GNCLot *lot = node->data;
370 gnc_commodity *currency = find_first_currency (lot);
371 gnc_numeric gains_baln = get_realized_gains (lot, currency);
374 if (TRUE == gtk_toggle_button_get_active(lv->only_show_open_lots_checkbutton) &&
gnc_lot_is_closed (lot))
379 store = lv->lot_store;
380 gtk_list_store_append(store, &iter);
386 snprintf(type_buff, 200,
"I");
388 gtk_list_store_set(store, &iter, LOT_COL_TYPE, type_buff, -1);
395 gtk_list_store_set(store, &iter, LOT_COL_OPEN, open_date, -1);
398 gtk_list_store_set(store, &iter, LOT_COL_OPEN, G_MININT64, -1);
407 gtk_list_store_set(store, &iter, LOT_COL_CLOSE, close_date, -1);
411 gtk_list_store_set(store, &iter, LOT_COL_CLOSE, G_MAXINT64, -1);
415 gtk_list_store_set(store, &iter, LOT_COL_TITLE, gnc_lot_get_title(lot), -1);
419 gnc_account_print_info (lv->account, TRUE));
420 gtk_list_store_set(store, &iter, LOT_COL_BALN, baln_buff, -1);
425 gnc_commodity_print_info (currency, TRUE));
426 gtk_list_store_set(store, &iter, LOT_COL_GAINS, gain_buff, -1);
430 gtk_list_store_set(store, &iter, LOT_COL_PNTR, lot, -1);
432 g_list_free(lot_list);
438 model = GTK_TREE_MODEL(lv->lot_store);
439 if (gtk_tree_model_get_iter_first(model, &iter))
443 gtk_tree_model_get(model, &iter, LOT_COL_PNTR, &this_lot, -1);
444 if (this_lot == selected_lot)
446 gtk_tree_selection_select_iter(selection, &iter);
451 while (gtk_tree_model_iter_next(model, &iter));
456 gtk_tree_selection_unselect_all(selection);
463 lv_get_selected_split (GNCLotViewer *lv, GtkTreeView *view)
467 GtkTreeSelection *selection;
470 selection = gtk_tree_view_get_selection(view);
471 if (gtk_tree_selection_get_selected (selection, &model, &iter))
473 gtk_tree_model_get(model, &iter, SPLIT_COL_PNTR, &split, -1);
483 lv_can_remove_split_from_lot(Split * split, GNCLot * lot)
485 GncInvoice *lot_invoice, *txn_invoice;
491 if ( lot_invoice != NULL && lot_invoice == txn_invoice )
501 gnc_split_viewer_fill (GNCLotViewer *lv, GtkListStore *store,
SplitList *split_list)
505 gboolean is_business_lot = FALSE;
506 gnc_numeric baln = gnc_numeric_zero();
508 if (lv->selected_lot)
511 gtk_list_store_clear (lv->split_in_lot_store);
512 for (node = split_list; node; node = node->next)
514 Split *split = node->data;
519 gnc_commodity *currency;
522 gnc_numeric amnt, value, gains;
527 gtk_list_store_append(store, &iter);
530 gtk_list_store_set (store, &iter, SPLIT_COL_DATE, date, -1);
533 gtk_list_store_set (store, &iter, SPLIT_COL_NUM,
534 gnc_get_num_action (trans, split), -1);
542 gnc_account_print_info (lv->account, TRUE));
543 gtk_list_store_set (store, &iter, SPLIT_COL_AMOUNT, amtbuff, -1);
551 if (lv->selected_lot && !is_business_lot && (node != split_list))
554 gnc_commodity_print_info (currency, TRUE));
555 gtk_list_store_set (store, &iter, SPLIT_COL_VALUE, valbuff, -1);
567 gnc_commodity_print_info (currency, TRUE));
569 gtk_list_store_set (store, &iter, SPLIT_COL_GAIN_LOSS, gainbuff, -1);
573 baln = gnc_numeric_add_fixed (baln, amnt);
581 gnc_account_print_info (lv->account, TRUE));
583 gtk_list_store_set (store, &iter, SPLIT_COL_BALANCE, balnbuff, -1);
587 gtk_list_store_set(store, &iter, SPLIT_COL_PNTR, split, -1);
594 lv_update_split_buttons(GNCLotViewer *lv)
597 gtk_widget_set_sensitive(GTK_WIDGET(lv->add_split_to_lot_button), FALSE);
598 gtk_widget_set_sensitive(GTK_WIDGET(lv->remove_split_from_lot_button), FALSE);
599 if (NULL != lv->selected_lot)
601 if (NULL != lv_get_selected_split(lv, lv->split_free_view) )
603 gtk_widget_set_sensitive(GTK_WIDGET(lv->add_split_to_lot_button), TRUE);
605 split = lv_get_selected_split(lv, lv->split_in_lot_view);
606 if (NULL != split && TRUE == lv_can_remove_split_from_lot(split, lv->selected_lot))
608 gtk_widget_set_sensitive(GTK_WIDGET(lv->remove_split_from_lot_button), TRUE);
613 static void lv_refresh(GNCLotViewer * lv)
615 gnc_lot_viewer_fill (lv);
616 lv_show_splits_free (lv);
617 lv_show_splits_in_lot (lv);
623 lv_refresh_handler (GHashTable *changes, gpointer user_data)
625 GNCLotViewer *lv = user_data;
630 lv_close_handler (gpointer user_data)
632 GNCLotViewer *lv = user_data;
634 lv_save_current_lot (lv);
636 gnc_save_window_size(GNC_PREFS_GROUP, GTK_WINDOW(lv->window));
637 gtk_widget_destroy (lv->window);
645 lv_title_entry_changed_cb (GtkEntry *ent, gpointer user_data)
647 GNCLotViewer *lv = user_data;
650 GtkTreeSelection *selection;
652 title = gtk_entry_get_text (lv->title_entry);
654 selection = gtk_tree_view_get_selection(lv->lot_view);
655 if (gtk_tree_selection_get_selected (selection, &model, &iter))
657 gtk_list_store_set(GTK_LIST_STORE(model), &iter, LOT_COL_TITLE, title, -1);
665 lv_selection_changed_cb (GtkTreeSelection *selection,
672 if (gtk_tree_selection_get_selected (selection, &model, &iter))
674 gtk_tree_model_get(model, &iter, LOT_COL_PNTR, &lot, -1);
675 lv_select_row(lv, lot);
681 lv_update_split_buttons(lv);
688 lv_window_destroy_cb (GtkWidget *
object, gpointer user_data)
690 GNCLotViewer *lv = user_data;
691 gnc_unregister_gui_component_by_data (LOT_VIEWER_CM_CLASS, lv);
696 lv_split_selection_changed_cb (GtkTreeSelection *selection,
699 lv_update_split_buttons(lv);
703 lv_add_split_to_lot_cb (GtkWidget *widget, GNCLotViewer * lv)
707 if ( NULL == lv->selected_lot )
return;
708 split = lv_get_selected_split(lv, lv->split_free_view);
709 if ( NULL == split )
return;
711 gnc_suspend_gui_refresh();
715 gnc_resume_gui_refresh();
721 lv_remove_split_from_lot_cb (GtkWidget *widget, GNCLotViewer * lv)
725 if ( NULL == lv->selected_lot )
return;
726 split = lv_get_selected_split(lv, lv->split_in_lot_view);
727 if ( NULL == split )
return;
729 if ( FALSE == lv_can_remove_split_from_lot(split, lv->selected_lot) )
732 gnc_suspend_gui_refresh();
736 gnc_resume_gui_refresh();
742 lv_only_show_open_lots_changed_cb (GtkWidget *widget, GNCLotViewer * lv)
751 lv_response_cb (GtkDialog *dialog, gint response, gpointer data)
753 GNCLotViewer *lv = data;
754 GNCLot *lot = lv->selected_lot;
758 case GTK_RESPONSE_CLOSE:
759 gnc_close_gui_component_by_data (LOT_VIEWER_CM_CLASS, lv);
765 printf (
"UNIMPLEMENTED: need to display register showing only this one lot.\n");
768 case RESPONSE_DELETE:
775 gnc_lot_destroy (lot);
777 gnc_lot_viewer_fill (lv);
780 case RESPONSE_SCRUB_LOT:
787 gnc_lot_viewer_fill (lv);
788 lv_show_splits_in_lot (lv);
791 case RESPONSE_SCRUB_ACCOUNT:
792 gnc_suspend_gui_refresh ();
797 gnc_resume_gui_refresh ();
798 gnc_lot_viewer_fill (lv);
799 lv_show_splits_free (lv);
800 lv_show_splits_in_lot (lv);
803 case RESPONSE_NEW_LOT:
804 lv_save_current_lot (lv);
813 static gchar* lot_get_open_date (GNCLot *lot)
815 g_return_val_if_fail (lot, NULL);
818 return g_strdup (_(
"Empty"));
823 static gchar* lot_get_closing_date (GNCLot *lot)
825 g_return_val_if_fail (lot, NULL);
830 return g_strdup (C_(
"Adjective",
"Open"));
835 typedef gchar* (*LotToDateFunc) (GNCLot *lot);
837 static void lot_print_date (GtkTreeViewColumn *tree_column,
838 GtkCellRenderer *cell,
839 GtkTreeModel *tree_model,
841 LotToDateFunc lot_to_date)
846 g_return_if_fail (cell && iter && tree_model);
847 gtk_tree_model_get (tree_model, iter, LOT_COL_PNTR, &lot, -1);
850 str = lot_to_date (lot);
852 g_object_set (G_OBJECT (cell),
"text", str, NULL);
856 static void print_date (GtkTreeViewColumn *tree_column,
857 GtkCellRenderer *cell,
858 GtkTreeModel *tree_model,
864 gint col = GPOINTER_TO_INT(data);
866 g_return_if_fail (cell && iter && tree_model);
868 gtk_tree_model_get (tree_model, iter, col, &doc_date_time, -1);
871 g_object_set (G_OBJECT (cell),
"text", doc_date_str, NULL);
872 g_free (doc_date_str);
876 configure_number_columns (GtkTreeViewColumn *column,
877 GtkCellRenderer *renderer, gint sort_column)
879 gtk_tree_view_column_set_sort_column_id (column, sort_column);
880 gtk_cell_renderer_set_alignment (renderer, 1.0, 0.5);
881 gtk_tree_view_column_set_alignment (column, 1.0);
882 gtk_cell_renderer_set_padding (renderer, 5, 0);
886 lv_init_lot_view (GNCLotViewer *lv)
890 GtkTreeViewColumn *column;
891 GtkTreeSelection *selection;
892 GtkCellRenderer *renderer;
894 g_return_if_fail(GTK_IS_TREE_VIEW(lv->lot_view));
897 store = gtk_list_store_new(NUM_LOT_COLS, G_TYPE_STRING, G_TYPE_INT64,
898 G_TYPE_INT64, G_TYPE_STRING,
899 G_TYPE_STRING, G_TYPE_DOUBLE,
900 G_TYPE_STRING,G_TYPE_DOUBLE,
902 gtk_tree_view_set_model(view, GTK_TREE_MODEL(store));
903 g_object_unref(store);
904 lv->lot_store = store;
907 renderer = gtk_cell_renderer_text_new();
908 column = gtk_tree_view_column_new_with_attributes(_(
"Type"), renderer,
909 "text", LOT_COL_TYPE, NULL);
910 gtk_tree_view_column_set_sort_column_id(column, LOT_COL_TYPE);
911 gtk_tree_view_append_column(view, column);
913 renderer = gtk_cell_renderer_text_new();
914 column = gtk_tree_view_column_new_with_attributes(_(
"Opened"), renderer,
915 "text", LOT_COL_OPEN, NULL);
916 gtk_tree_view_column_set_sort_column_id(column, LOT_COL_OPEN);
918 gtk_tree_view_column_set_cell_data_func (column, renderer,
919 (GtkTreeCellDataFunc) lot_print_date,
920 lot_get_open_date, NULL);
921 gtk_tree_view_append_column(view, column);
923 renderer = gtk_cell_renderer_text_new();
924 column = gtk_tree_view_column_new_with_attributes(_(
"Closed"), renderer,
925 "text", LOT_COL_CLOSE, NULL);
926 gtk_tree_view_column_set_sort_column_id(column, LOT_COL_CLOSE);
928 gtk_tree_view_column_set_cell_data_func (column, renderer,
929 (GtkTreeCellDataFunc) lot_print_date,
930 lot_get_closing_date, NULL);
931 gtk_tree_view_append_column(view, column);
933 renderer = gtk_cell_renderer_text_new();
934 column = gtk_tree_view_column_new_with_attributes(_(
"Title"), renderer,
935 "text", LOT_COL_TITLE, NULL);
936 gtk_tree_view_column_set_sort_column_id(column, LOT_COL_TITLE);
937 gtk_tree_view_column_set_expand (column, TRUE);
938 gtk_tree_view_append_column(view, column);
940 renderer = gtk_cell_renderer_text_new();
941 column = gtk_tree_view_column_new_with_attributes(_(
"Balance"), renderer,
942 "text", LOT_COL_BALN, NULL);
943 configure_number_columns (column, renderer, LOT_COL_BALN_DOUBLE);
944 gtk_tree_view_append_column(view, column);
946 renderer = gtk_cell_renderer_text_new();
947 column = gtk_tree_view_column_new_with_attributes(_(
"Gains"), renderer,
948 "text", LOT_COL_GAINS, NULL);
949 configure_number_columns (column, renderer, LOT_COL_GAINS_DOUBLE);
950 gtk_tree_view_append_column(view, column);
953 selection = gtk_tree_view_get_selection(view);
954 g_signal_connect(selection,
"changed",
955 G_CALLBACK(lv_selection_changed_cb), lv);
956 g_signal_connect(lv->only_show_open_lots_checkbutton,
"toggled",
957 G_CALLBACK(lv_only_show_open_lots_changed_cb), lv);
963 static GtkListStore *
964 lv_init_split_view (GNCLotViewer *lv, GtkTreeView *view)
967 GtkTreeViewColumn *column;
968 GtkTreeSelection *selection;
969 GtkCellRenderer *renderer;
971 g_return_val_if_fail(GTK_IS_TREE_VIEW(view), NULL);
973 store = gtk_list_store_new(NUM_SPLIT_COLS, G_TYPE_INT64,
974 G_TYPE_STRING, G_TYPE_STRING,
975 G_TYPE_STRING, G_TYPE_DOUBLE,
976 G_TYPE_STRING, G_TYPE_DOUBLE,
977 G_TYPE_STRING, G_TYPE_DOUBLE,
978 G_TYPE_STRING, G_TYPE_DOUBLE,
980 gtk_tree_view_set_model(view, GTK_TREE_MODEL(store));
981 g_object_unref(store);
984 renderer = gtk_cell_renderer_text_new();
985 column = gtk_tree_view_column_new_with_attributes(_(
"Date"), renderer,
986 "text", SPLIT_COL_DATE, NULL);
987 gtk_tree_view_column_set_sort_column_id(column, SPLIT_COL_DATE);
989 gtk_tree_view_column_set_cell_data_func (column, renderer,
990 (GtkTreeCellDataFunc) print_date,
991 GINT_TO_POINTER (SPLIT_COL_DATE), NULL);
992 gtk_tree_view_append_column(view, column);
994 renderer = gtk_cell_renderer_text_new();
995 column = gtk_tree_view_column_new_with_attributes(_(
"Num"), renderer,
996 "text", SPLIT_COL_NUM, NULL);
997 gtk_tree_view_column_set_sort_column_id(column, SPLIT_COL_NUM);
998 gtk_tree_view_append_column(view, column);
1000 renderer = gtk_cell_renderer_text_new();
1001 column = gtk_tree_view_column_new_with_attributes(_(
"Description"), renderer,
1002 "text", SPLIT_COL_DESCRIPTION, NULL);
1004 g_object_set (renderer,
"ellipsize", PANGO_ELLIPSIZE_END, NULL);
1007 gtk_tree_view_column_set_min_width (column, 200);
1009 gtk_tree_view_column_set_sort_column_id(column, SPLIT_COL_DESCRIPTION);
1010 gtk_tree_view_column_set_expand (column, TRUE);
1011 gtk_tree_view_column_set_resizable (column, TRUE);
1012 gtk_tree_view_append_column(view, column);
1014 renderer = gtk_cell_renderer_text_new();
1015 column = gtk_tree_view_column_new_with_attributes(_(
"Amount"), renderer,
1016 "text", SPLIT_COL_AMOUNT, NULL);
1017 configure_number_columns (column, renderer, SPLIT_COL_AMOUNT_DOUBLE);
1018 gtk_tree_view_append_column(view, column);
1020 renderer = gtk_cell_renderer_text_new();
1021 column = gtk_tree_view_column_new_with_attributes(_(
"Value"), renderer,
1022 "text", SPLIT_COL_VALUE, NULL);
1023 configure_number_columns (column, renderer, SPLIT_COL_VALUE_DOUBLE);
1024 gtk_tree_view_append_column(view, column);
1026 renderer = gtk_cell_renderer_text_new();
1027 column = gtk_tree_view_column_new_with_attributes(_(
"Gain/Loss"), renderer,
1028 "text", SPLIT_COL_GAIN_LOSS, NULL);
1029 configure_number_columns (column, renderer, SPLIT_COL_GAIN_LOSS_DOUBLE);
1030 gtk_tree_view_append_column(view, column);
1032 renderer = gtk_cell_renderer_text_new();
1033 column = gtk_tree_view_column_new_with_attributes(_(
"Balance"), renderer,
1034 "text", SPLIT_COL_BALANCE, NULL);
1035 configure_number_columns (column, renderer, SPLIT_COL_BALANCE_DOUBLE);
1036 gtk_tree_view_append_column(view, column);
1039 selection = gtk_tree_view_get_selection(view);
1040 g_signal_connect(selection,
"changed",
1041 G_CALLBACK(lv_split_selection_changed_cb), lv);
1047 lv_init_split_views (GNCLotViewer *lv)
1049 lv->split_free_store = lv_init_split_view (lv, lv->split_free_view);
1050 lv->split_in_lot_store = lv_init_split_view (lv, lv->split_in_lot_view);
1054 lv_init_split_buttons (GNCLotViewer *lv)
1057 g_signal_connect(G_OBJECT(lv->add_split_to_lot_button),
"clicked",
1058 G_CALLBACK(lv_add_split_to_lot_cb), lv);
1059 g_signal_connect(G_OBJECT(lv->remove_split_from_lot_button),
"clicked",
1060 G_CALLBACK(lv_remove_split_from_lot_cb), lv);
1066 window_realize_set_split_paned_position_cb (GtkWidget *widget, gpointer user_data)
1068 GNCLotViewer *lv = user_data;
1071 gtk_window_get_size (GTK_WINDOW(lv->window), &width, NULL);
1072 gtk_paned_set_position (GTK_PANED(lv->split_hpaned), width / 2);
1076 lv_create (GNCLotViewer *lv, GtkWindow *parent)
1079 GtkBuilder *builder;
1081 builder = gtk_builder_new();
1082 gnc_builder_add_from_file (builder,
"dialog-lot-viewer.glade",
"lot_viewer_dialog");
1084 lv->window = GTK_WIDGET(gtk_builder_get_object (builder,
"lot_viewer_dialog"));
1086 gtk_window_set_transient_for (GTK_WINDOW (lv->window), parent);
1089 gtk_widget_set_name (GTK_WIDGET(lv->window),
"gnc-id-lot-viewer");
1091 win_title = g_strdup_printf (_(
"Lots in Account %s"),
1093 gtk_window_set_title (GTK_WINDOW (lv->window), win_title);
1096 #ifdef LOTS_READY_FOR_SHOWTIME 1097 lv->regview_button = GTK_BUTTON(glade_xml_get_widget (builder,
"regview_button"));
1099 lv->delete_button = GTK_BUTTON(gtk_builder_get_object (builder,
"delete_button"));
1100 lv->scrub_lot_button = GTK_BUTTON(gtk_builder_get_object (builder,
"scrub_lot_button"));
1101 lv->new_lot_button = GTK_BUTTON(gtk_builder_get_object (builder,
"new_lot_button"));
1103 lv->lot_view = GTK_TREE_VIEW(gtk_builder_get_object (builder,
"lot_view"));
1104 lv->only_show_open_lots_checkbutton = GTK_TOGGLE_BUTTON(gtk_builder_get_object (builder,
"only_show_open_lots_checkbutton"));
1105 lv_init_lot_view(lv);
1106 lv->lot_notes = GTK_TEXT_VIEW(gtk_builder_get_object (builder,
"lot_notes_text"));
1107 lv->title_entry = GTK_ENTRY (gtk_builder_get_object (builder,
"lot_title_entry"));
1109 lv->split_in_lot_view = GTK_TREE_VIEW(gtk_builder_get_object (builder,
"split_in_lot_view"));
1110 lv->split_free_view = GTK_TREE_VIEW(gtk_builder_get_object (builder,
"split_free_view"));
1111 lv->split_hpaned = GTK_WIDGET(gtk_builder_get_object (builder,
"split_hpaned"));
1112 lv_init_split_views(lv);
1114 lv->add_split_to_lot_button = GTK_BUTTON(gtk_builder_get_object (builder,
"add_split_to_lot_button"));
1115 lv->remove_split_from_lot_button = GTK_BUTTON(gtk_builder_get_object (builder,
"remove_split_from_lot_button"));
1116 lv_init_split_buttons(lv);
1119 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW(lv->lot_view), gnc_tree_view_get_grid_lines_pref ());
1122 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW(lv->split_in_lot_view), gnc_tree_view_get_grid_lines_pref ());
1125 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW(lv->split_free_view), gnc_tree_view_get_grid_lines_pref ());
1131 object = gtk_builder_get_object (builder,
"lot_vpaned");
1132 gnc_prefs_bind (GNC_PREFS_GROUP, GNC_PREF_VPOS, NULL,
object,
"position");
1134 object = gtk_builder_get_object (builder,
"lot_hpaned");
1135 gnc_prefs_bind (GNC_PREFS_GROUP, GNC_PREF_HPOS, NULL,
object,
"position");
1138 lv->selected_lot = NULL;
1141 g_signal_connect (G_OBJECT(lv->window),
"realize",
1142 G_CALLBACK(window_realize_set_split_paned_position_cb), lv);
1145 gtk_builder_connect_signals(builder, lv);
1146 g_object_unref(G_OBJECT(builder));
1148 lv_update_split_buttons(lv);
1150 gnc_restore_window_size(GNC_PREFS_GROUP, GTK_WINDOW(lv->window), parent);
1156 gnc_lot_viewer_dialog (GtkWindow *parent,
Account *account)
1161 if (!account)
return NULL;
1163 lv = g_new0 (GNCLotViewer, 1);
1164 lv->account = account;
1165 lv_create (lv, parent);
1166 gnc_lot_viewer_fill (lv);
1167 lv_show_splits_free (lv);
1169 component_id = gnc_register_gui_component (LOT_VIEWER_CM_CLASS,
1174 gnc_gui_component_watch_entity_type (component_id,
1176 QOF_EVENT_CREATE | QOF_EVENT_ADD | QOF_EVENT_REMOVE | QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
1178 gtk_widget_show_all (lv->window);
1179 gnc_window_adjust_for_screen (GTK_WINDOW(lv->window));
High-Level API for imposing Lot constraints.
void tree_view_column_set_default_width(GtkTreeView *view, GtkTreeViewColumn *column, const gchar *sizing_text)
Set default width for a treeview column.
GList LotList
GList of GNCLots.
time64 xaccTransGetDate(const Transaction *trans)
Retrieve the posted date of the transaction.
SplitList * xaccAccountGetSplitList(const Account *acc)
The xaccAccountGetSplitList() routine returns a pointer to a GList of the splits in the account...
utility functions for the GnuCash UI
GNCAccountType xaccAccountGetType(const Account *acc)
Returns the account's account type.
gnc_numeric gnc_numeric_neg(gnc_numeric a)
Returns a newly created gnc_numeric that is the negative of the given gnc_numeric value...
All arguments are required to have the same denominator, that denominator is to be used in the output...
Functions that are supported by all types of windows.
gboolean gnc_commodity_equal(const gnc_commodity *a, const gnc_commodity *b)
This routine returns TRUE if the two commodities are equal.
void gnc_lot_add_split(GNCLot *lot, Split *split)
Adds a split to this lot.
gnc_numeric gnc_numeric_add(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
Return a+b.
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
void xaccAccountInsertLot(Account *acc, GNCLot *lot)
The xaccAccountInsertLot() method will register the indicated lot with this account.
Transaction * xaccSplitGetParent(const Split *split)
Returns the parent transaction of the split.
gnc_numeric xaccSplitGetCapGains(Split *split)
The xaccSplitGetCapGains() method returns the value of capital gains (if any) associated with the ind...
void xaccAccountScrubLots(Account *acc)
The xaccAccountScrubLots() routine makes sure that every split in the account is assigned to a lot...
Cleanup functions for business objects.
Split * gnc_lot_get_earliest_split(GNCLot *lot)
Convenience routine to identify the earliest date in the lot.
void gncScrubBusinessAccountLots(Account *acc, QofPercentageFunc percentagefunc)
The gncScrubBusinessAccountLots() function will call gncScrubBusinessLot() on each lot in the given a...
GncInvoice * gncInvoiceGetInvoiceFromTxn(const Transaction *txn)
Given a transaction, find and return the Invoice.
Split * gnc_lot_get_latest_split(GNCLot *lot)
Convenience routineto identify the date this lot was closed.
gdouble gnc_numeric_to_double(gnc_numeric n)
Convert numeric to floating-point value.
char * qof_print_date(time64 secs)
Convenience; calls through to qof_print_date_dmy_buff().
GList SplitList
GList of Split.
Account handling public routines.
SplitList * gnc_lot_get_split_list(const GNCLot *lot)
Returns a list of all the splits in this lot.
LotList * xaccAccountGetLotList(const Account *acc)
The xaccAccountGetLotList() routine returns a list of all lots in this account.
const char * xaccTransGetDescription(const Transaction *trans)
Gets the transaction Description.
void gnc_lot_remove_split(GNCLot *lot, Split *split)
Adds a split from this lot.
gboolean xaccAccountIsAPARType(GNCAccountType t)
Convenience function to check if the account is a valid business account type (meaning an Accounts Pa...
void gnc_prefs_bind(const gchar *group, const gchar *pref_name, const gchar *pref_value, gpointer object, const gchar *property)
Bind a setting to a g_object property.
int xaccSPrintAmount(char *bufp, gnc_numeric val, GNCPrintAmountInfo info)
Make a string representation of a gnc_numeric.
Generic api to store and retrieve preferences.
GncInvoice * gncInvoiceGetInvoiceFromLot(GNCLot *lot)
Given a LOT, find and return the Invoice attached to the lot.
Business Invoice Interface.
GNCLot * gnc_lot_make_default(Account *acc)
gboolean gnc_lot_is_closed(GNCLot *lot)
Returns closed status of the given lot.
gnc_numeric xaccSplitGetValue(const Split *split)
Returns the value of this split in the transaction's commodity.
gboolean gncScrubBusinessLot(GNCLot *lot)
The gncScrubBusinessLot() function makes sure that the indicated lot has all the correct properties r...
void xaccAccountBeginEdit(Account *acc)
The xaccAccountBeginEdit() subroutine is the first phase of a two-phase-commit wrapper for account up...
gnc_commodity * xaccTransGetCurrency(const Transaction *trans)
Returns the valuation commodity of this transaction.
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
Get a boolean value from the preferences backend.
gboolean xaccScrubLot(GNCLot *lot)
The xaccScrubLot() routine makes sure that the indicated lot is self-consistent and properly balanced...
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
Account * gnc_lot_get_account(const GNCLot *lot)
Returns the account with which this lot is associated.
const char * xaccAccountGetName(const Account *acc)
Get the account's name.
#define GNC_DENOM_AUTO
Values that can be passed as the 'denom' argument.
API for Transactions and Splits (journal entries)
void xaccAccountCommitEdit(Account *acc)
ThexaccAccountCommitEdit() subroutine is the second phase of a two-phase-commit wrapper for account u...
Utilities to Automatically Compute Capital Gains/Losses.
Commodity handling public routines.
gnc_numeric gnc_lot_get_balance(GNCLot *lot)
Returns the lot balance.
GNCLot * xaccSplitGetLot(const Split *split)
Returns the pointer to the debited/credited Lot where this split belongs to, or NULL if it doesn't be...
gnc_numeric xaccSplitGetAmount(const Split *split)
Returns the amount of the split in the account's commodity.