29 #include <glib/gi18n.h> 31 #include <gnc-quotes.hpp> 33 #include "dialog-utils.h" 35 #include "gnc-amount-edit.h" 36 #include "gnc-commodity-edit.h" 37 #include "gnc-general-select.h" 38 #include "gnc-component-manager.h" 40 #include "gnc-date-edit.h" 42 #include "gnc-gui-query.h" 44 #include "gnc-session.h" 48 #include "gnc-warnings.h" 52 #define DIALOG_PRICE_DB_CM_CLASS "dialog-price-edit-db" 53 #define STATE_SECTION "dialogs/edit_prices" 54 #define GNC_PREFS_GROUP "dialogs.pricedb-editor" 57 static QofLogModule log_module = GNC_MOD_GUI;
61 void gnc_prices_dialog_destroy_cb (GtkWidget *
object, gpointer data);
62 void gnc_prices_dialog_close_cb (GtkDialog *dialog, gpointer data);
63 void gnc_prices_dialog_help_cb (GtkDialog *dialog, gpointer data);
64 void gnc_prices_dialog_edit_clicked (GtkWidget *widget, gpointer data);
65 void gnc_prices_dialog_remove_clicked (GtkWidget *widget, gpointer data);
66 void gnc_prices_dialog_remove_old_clicked (GtkWidget *widget, gpointer data);
67 void gnc_prices_dialog_add_clicked (GtkWidget *widget, gpointer data);
68 void gnc_prices_dialog_get_quotes_clicked (GtkWidget *widget, gpointer data);
69 static gboolean gnc_prices_dialog_key_press_cb (GtkWidget *widget,
82 GncTreeViewPrice * price_tree;
84 GtkWidget * edit_button;
85 GtkWidget * remove_button;
86 GtkWidget * add_button;
88 GtkWidget *remove_dialog;
89 GtkTreeView *remove_view;
95 gnc_prices_dialog_destroy_cb (GtkWidget *
object, gpointer data)
100 gnc_unregister_gui_component_by_data (DIALOG_PRICE_DB_CM_CLASS, pdb_dialog);
102 if (pdb_dialog->window)
104 gtk_widget_destroy (pdb_dialog->window);
105 pdb_dialog->window = NULL;
114 gnc_prices_dialog_delete_event_cb (GtkWidget *widget,
120 gnc_save_window_size (GNC_PREFS_GROUP,
121 GTK_WINDOW(pdb_dialog->window));
127 gnc_prices_dialog_close_cb (GtkDialog *dialog, gpointer data)
132 gnc_close_gui_component_by_data (DIALOG_PRICE_DB_CM_CLASS, pdb_dialog);
138 gnc_prices_dialog_help_cb (GtkDialog *dialog, gpointer data)
142 gnc_gnome_help (GTK_WINDOW (pdb_dialog->window), DF_MANUAL, DL_PRICE_DB);
147 gnc_prices_dialog_edit_clicked (GtkWidget *widget, gpointer data)
155 LEAVE(
"no price selected");
158 if (g_list_next(price_list))
160 g_list_free(price_list);
161 LEAVE(
"too many prices selected");
165 auto price =
static_cast<GNCPrice *
> (price_list->data);
166 gnc_price_edit_dialog (pdb_dialog->window, pdb_dialog->session,
167 price, GNC_PRICE_EDIT);
168 g_list_free (price_list);
174 remove_helper(GNCPrice *price, GNCPriceDB *pdb)
181 gnc_prices_dialog_remove_clicked (GtkWidget *widget, gpointer data)
189 LEAVE(
"no price selected");
194 auto length = g_list_length(price_list);
199 message = g_strdup_printf
201 ngettext(
"Are you sure you want to delete the selected price?",
202 "Are you sure you want to delete the %d selected prices?",
205 auto dialog = gtk_message_dialog_new (GTK_WINDOW(pdb_dialog->window),
206 GTK_DIALOG_DESTROY_WITH_PARENT,
207 GTK_MESSAGE_QUESTION,
209 "%s", _(
"Delete prices?"));
210 gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
213 gtk_dialog_add_buttons(GTK_DIALOG(dialog),
214 _(
"_Cancel"), GTK_RESPONSE_CANCEL,
215 _(
"_Delete"), GTK_RESPONSE_YES,
217 gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_YES);
218 response = gnc_dialog_run(GTK_DIALOG(dialog), GNC_PREF_WARN_PRICE_QUOTES_DEL);
219 gtk_widget_destroy(dialog);
223 response = GTK_RESPONSE_YES;
226 if (response == GTK_RESPONSE_YES)
228 g_list_foreach(price_list, (GFunc)remove_helper, pdb_dialog->price_db);
230 g_list_free(price_list);
231 gnc_gui_refresh_all ();
237 enum GncPriceColumn {PRICED_FULL_NAME, PRICED_COMM, PRICED_DATE, PRICED_COUNT};
240 gnc_prices_dialog_load_view (GtkTreeView *view, GNCPriceDB *pdb)
243 auto model = gtk_tree_view_get_model (view);
244 const auto commodity_table = gnc_get_current_commodities ();
247 for (
auto node_n = namespace_list; node_n; node_n = g_list_next (node_n))
249 auto tmp_namespace =
static_cast<char*
>(node_n->data);
250 DEBUG(
"Looking at namespace %s", tmp_namespace);
252 for (
auto node_c = commodity_list; node_c; node_c = g_list_next (node_c))
254 auto tmp_commodity =
static_cast<gnc_commodity*
>(node_c->data);
261 auto node = g_list_last (list);
262 auto price =
static_cast<GNCPrice*
> (node->data);
263 auto price_time = gnc_price_get_time64 (price);
266 if (oldest > price_time)
270 auto num_str = g_strdup_printf (
"%d", num);
273 gtk_list_store_append (GTK_LIST_STORE(model), &iter);
274 gtk_list_store_set (GTK_LIST_STORE(model), &iter, PRICED_FULL_NAME, name_str,
275 PRICED_COMM, tmp_commodity, PRICED_DATE, date_str, PRICED_COUNT, num_str, -1);
282 g_list_free (commodity_list);
284 g_list_free (namespace_list);
290 gnc_prices_dialog_get_commodities (GtkTreeView *view)
292 auto model = gtk_tree_view_get_model (GTK_TREE_VIEW(view));
293 auto selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(view));
294 auto list = gtk_tree_selection_get_selected_rows (selection, &model);
295 GList *comm_list =
nullptr;
298 for (
auto row = g_list_first (list); row; row = g_list_next (row))
300 auto path =
static_cast<GtkTreePath *
> (row->data);
302 if (gtk_tree_model_get_iter (model, &iter, path))
305 gtk_tree_model_get (model, &iter, PRICED_COMM, &comm, -1);
306 comm_list = g_list_prepend (comm_list, comm);
309 g_list_free_full (list, (GDestroyNotify) gtk_tree_path_free);
311 return g_list_reverse (comm_list);
315 change_source_flag (PriceRemoveSourceFlags source, gboolean
set, gpointer data)
318 GtkWidget *w = gtk_dialog_get_widget_for_response (GTK_DIALOG(pdb_dialog->remove_dialog), GTK_RESPONSE_OK);
319 gboolean enable_button;
322 pdb_dialog->remove_source = pdb_dialog->remove_source | source;
324 pdb_dialog->remove_source = pdb_dialog->remove_source & (~source);
327 enable_button = (pdb_dialog->remove_source > 8 ? TRUE : FALSE);
328 gtk_widget_set_sensitive (w, enable_button);
330 DEBUG(
"Source is: %d, remove_source is %d", source, pdb_dialog->remove_source);
334 check_event_fq_cb (GtkWidget *widget, gpointer data)
337 gboolean active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget));
339 change_source_flag (PRICE_REMOVE_SOURCE_FQ, active, pdb_dialog);
343 check_event_user_cb (GtkWidget *widget, gpointer data)
346 gboolean active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget));
348 change_source_flag (PRICE_REMOVE_SOURCE_USER, active, pdb_dialog);
352 check_event_app_cb (GtkWidget *widget, gpointer data)
355 gboolean active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget));
357 change_source_flag (PRICE_REMOVE_SOURCE_APP, active, pdb_dialog);
361 selection_changed_cb (GtkTreeSelection *selection, gpointer data)
364 auto model = gtk_tree_view_get_model (GTK_TREE_VIEW(pdb_dialog->remove_view));
365 auto rows = gtk_tree_selection_get_selected_rows (selection, &model);
368 change_source_flag (PRICE_REMOVE_SOURCE_COMM, have_rows, pdb_dialog);
369 g_list_free_full (rows, (GDestroyNotify) gtk_tree_path_free);
373 get_fiscal_end_date (
void)
377 memset (datebuff, 0,
sizeof(datebuff));
378 end = gnc_accounting_period_fiscal_end();
380 gnc_accounting_period_fiscal_end());
381 PINFO(
"Fiscal end date is %s", datebuff);
387 gnc_prices_dialog_remove_old_clicked (GtkWidget *widget, gpointer data)
392 auto builder = gtk_builder_new();
393 gnc_builder_add_from_file (builder,
"dialog-price.glade",
"liststore4");
394 gnc_builder_add_from_file (builder,
"dialog-price.glade",
"deletion_date_dialog");
396 pdb_dialog->remove_dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"deletion_date_dialog"));
398 auto box = GTK_WIDGET(gtk_builder_get_object (builder,
"date_hbox"));
399 auto date = gnc_date_edit_new (time (NULL), FALSE, FALSE);
401 gtk_box_pack_start (GTK_BOX (box), date, FALSE, FALSE, 0);
402 gtk_widget_show (date);
403 gtk_entry_set_activates_default(GTK_ENTRY(GNC_DATE_EDIT(date)->date_entry), TRUE);
404 auto label = GTK_WIDGET(gtk_builder_get_object (builder,
"date_label"));
405 gnc_date_make_mnemonic_target (GNC_DATE_EDIT(date), label);
408 pdb_dialog->remove_view = GTK_TREE_VIEW(gtk_builder_get_object (builder,
"commodty_treeview"));
409 auto selection = gtk_tree_view_get_selection (pdb_dialog->remove_view);
410 gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
413 auto tree_column = gtk_tree_view_column_new();
414 gtk_tree_view_column_set_title (tree_column, _(
"Entries"));
415 gtk_tree_view_append_column (GTK_TREE_VIEW(pdb_dialog->remove_view), tree_column);
416 gtk_tree_view_column_set_alignment (tree_column, 0.5);
417 gtk_tree_view_column_set_expand (tree_column, TRUE);
418 auto cr = gtk_cell_renderer_text_new();
419 gtk_tree_view_column_pack_start (tree_column, cr, TRUE);
421 gtk_tree_view_column_set_attributes (tree_column, cr,
"text", PRICED_COUNT, NULL);
422 gtk_cell_renderer_set_alignment (cr, 0.5, 0.5);
425 gnc_prices_dialog_load_view (pdb_dialog->remove_view, pdb_dialog->price_db);
426 gtk_tree_selection_select_all (selection);
427 g_signal_connect (selection,
"changed", G_CALLBACK(selection_changed_cb), pdb_dialog);
429 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, pdb_dialog);
431 gtk_window_set_transient_for (GTK_WINDOW (pdb_dialog->remove_dialog), GTK_WINDOW (pdb_dialog->window));
433 pdb_dialog->remove_source = PRICE_REMOVE_SOURCE_FQ + PRICE_REMOVE_SOURCE_COMM;
434 auto button = GTK_WIDGET(gtk_builder_get_object (builder,
"checkbutton_fq"));
435 g_signal_connect (button,
"toggled", G_CALLBACK (check_event_fq_cb), pdb_dialog);
436 button = GTK_WIDGET(gtk_builder_get_object (builder,
"checkbutton_user"));
437 g_signal_connect (button,
"toggled", G_CALLBACK (check_event_user_cb), pdb_dialog);
438 button = GTK_WIDGET(gtk_builder_get_object (builder,
"checkbutton_app"));
439 g_signal_connect (button,
"toggled", G_CALLBACK (check_event_app_cb), pdb_dialog);
441 auto result = gtk_dialog_run (GTK_DIALOG (pdb_dialog->remove_dialog));
442 if (result == GTK_RESPONSE_OK)
444 const char *fmt = _(
"Are you sure you want to delete these prices?");
445 auto comm_list = gnc_prices_dialog_get_commodities (pdb_dialog->remove_view);
448 if ((g_list_length (comm_list) != 0) && (gnc_verify_dialog (GTK_WINDOW (pdb_dialog->remove_dialog), FALSE, fmt, NULL)))
451 GDate fiscal_end_date = get_fiscal_end_date ();
452 PriceRemoveKeepOptions keep = PRICE_REMOVE_KEEP_NONE;
455 auto model = gtk_tree_view_get_model (GTK_TREE_VIEW(pdb_dialog->price_tree));
456 g_object_ref (G_OBJECT(model));
457 gtk_tree_view_set_model (GTK_TREE_VIEW(pdb_dialog->price_tree), NULL);
459 DEBUG(
"deleting prices");
460 last = gnc_date_edit_get_date (GNC_DATE_EDIT (date));
462 button = GTK_WIDGET(gtk_builder_get_object (builder,
"radiobutton_last_week"));
463 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)))
464 keep = PRICE_REMOVE_KEEP_LAST_WEEKLY;
465 button = GTK_WIDGET(gtk_builder_get_object (builder,
"radiobutton_last_month"));
466 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)))
467 keep = PRICE_REMOVE_KEEP_LAST_MONTHLY;
468 button = GTK_WIDGET(gtk_builder_get_object (builder,
"radiobutton_last_quarter"));
469 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)))
470 keep = PRICE_REMOVE_KEEP_LAST_QUARTERLY;
471 button = GTK_WIDGET(gtk_builder_get_object (builder,
"radiobutton_last_period"));
472 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)))
473 keep = PRICE_REMOVE_KEEP_LAST_PERIOD;
474 button = GTK_WIDGET(gtk_builder_get_object (builder,
"radiobutton_scaled"));
475 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)))
476 keep = PRICE_REMOVE_KEEP_SCALED;
478 if (keep != PRICE_REMOVE_KEEP_SCALED)
480 &fiscal_end_date, last,
481 static_cast<PriceRemoveSourceFlags> (pdb_dialog->remove_source),
486 g_date_subtract_months (&tmp_date, 6);
490 &fiscal_end_date, tmp,
491 static_cast<PriceRemoveSourceFlags> (pdb_dialog->remove_source),
492 PRICE_REMOVE_KEEP_LAST_WEEKLY);
494 g_date_subtract_months (&tmp_date, 6);
498 &fiscal_end_date, tmp,
499 static_cast<PriceRemoveSourceFlags> (pdb_dialog->remove_source),
500 PRICE_REMOVE_KEEP_LAST_MONTHLY);
503 gtk_tree_view_set_model (GTK_TREE_VIEW(pdb_dialog->price_tree), model);
504 g_object_unref(G_OBJECT(model));
506 g_list_free (comm_list);
508 gnc_gui_refresh_all ();
509 gtk_widget_destroy (pdb_dialog->remove_dialog);
510 g_object_unref (G_OBJECT (builder));
516 gnc_prices_dialog_add_clicked (GtkWidget *widget, gpointer data)
519 GNCPrice *price =
nullptr;
520 gboolean unref_price = FALSE;
528 price =
static_cast<GNCPrice *
> (price_list->data);
529 g_list_free (price_list);
535 auto comm = GNC_COMMODITY (comm_list->data);
540 price = GNC_PRICE (latest_price->data);
549 gnc_price_set_commodity (price, comm);
554 g_list_free (comm_list);
556 gnc_price_edit_dialog (pdb_dialog->window, pdb_dialog->session,
557 price, GNC_PRICE_NEW);
566 gnc_prices_dialog_get_quotes_clicked (GtkWidget *widget, gpointer data)
573 gnc_set_busy_cursor (NULL, TRUE);
574 quotes.
fetch (pdb_dialog->book);
575 gnc_unset_busy_cursor (NULL);
577 gnc_warning_dialog(GTK_WINDOW(pdb_dialog->window),
"%s",
578 quotes.report_failures().c_str());
582 gnc_unset_busy_cursor(
nullptr);
583 PERR(
"Price retrieval failed: %s", err.what());
584 gnc_error_dialog(GTK_WINDOW(pdb_dialog->window), _(
"Price retrieval failed: %s"), err.what());
589 gnc_gui_refresh_all ();
596 gnc_prices_dialog_selection_changed (GtkTreeSelection *treeselection,
603 auto length = g_list_length (price_list);
604 g_list_free (price_list);
606 auto model = gtk_tree_view_get_model (GTK_TREE_VIEW(pdb_dialog->price_tree));
607 auto rows = gtk_tree_selection_get_selected_rows (treeselection, &model);
610 if (g_list_length (rows) > length)
613 g_list_free_full (rows, (GDestroyNotify) gtk_tree_path_free);
615 gtk_widget_set_sensitive (pdb_dialog->edit_button,
617 gtk_widget_set_sensitive (pdb_dialog->remove_button,
619 gtk_widget_set_sensitive (pdb_dialog->add_button,
621 LEAVE(
"%d prices selected", length);
626 gnc_price_dialog_filter_ns_func (gnc_commodity_namespace *name_space,
633 if (g_strcmp0 (name, GNC_COMMODITY_NS_TEMPLATE) == 0)
639 for (
auto item = cm_list; !rv && item; item = g_list_next (item))
642 auto comm =
static_cast<gnc_commodity *
> (item->data);
647 g_list_free (cm_list);
653 gnc_price_dialog_filter_cm_func (gnc_commodity *commodity,
664 row_activated_cb (GtkTreeView *view, GtkTreePath *path,
665 GtkTreeViewColumn *column, gpointer data)
670 g_return_if_fail(view);
672 model = gtk_tree_view_get_model(view);
673 if (gtk_tree_model_get_iter(model, &iter, path))
675 if (gtk_tree_model_iter_has_child(model, &iter))
679 if (gtk_tree_view_row_expanded(view, path))
680 gtk_tree_view_collapse_row(view, path);
682 gtk_tree_view_expand_row(view, path, FALSE);
686 gnc_prices_dialog_edit_clicked(GTK_WIDGET(view), data);
692 gnc_prices_dialog_create (GtkWidget * parent,
PricesDialog *pdb_dialog)
694 GtkWidget *window, *scrolled_window;
697 GtkTreeSelection *selection;
700 builder = gtk_builder_new();
701 gnc_builder_add_from_file (builder,
"dialog-price.glade",
"prices_window");
703 window = GTK_WIDGET(gtk_builder_get_object (builder,
"prices_window"));
704 pdb_dialog->window = window;
707 gtk_widget_set_name (GTK_WIDGET(window),
"gnc-id-price-edit");
708 gnc_widget_style_context_add_class (GTK_WIDGET(window),
"gnc-class-securities");
710 pdb_dialog->session = gnc_get_current_session();
714 g_signal_connect (pdb_dialog->window,
"delete-event",
715 G_CALLBACK(gnc_prices_dialog_delete_event_cb), pdb_dialog);
717 g_signal_connect (pdb_dialog->window,
"key_press_event",
718 G_CALLBACK (gnc_prices_dialog_key_press_cb), pdb_dialog);
721 scrolled_window = GTK_WIDGET(gtk_builder_get_object (builder,
"price_list_window"));
723 "state-section", STATE_SECTION,
724 "show-column-menu", TRUE,
726 pdb_dialog->price_tree = GNC_TREE_VIEW_PRICE(view);
727 gtk_container_add (GTK_CONTAINER (scrolled_window), GTK_WIDGET(view));
728 gnc_tree_view_price_set_filter (pdb_dialog->price_tree,
729 gnc_price_dialog_filter_ns_func,
730 gnc_price_dialog_filter_cm_func,
734 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
735 gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
736 g_signal_connect (G_OBJECT (selection),
"changed",
737 G_CALLBACK (gnc_prices_dialog_selection_changed), pdb_dialog);
739 g_signal_connect (G_OBJECT (view),
"row-activated",
740 G_CALLBACK (row_activated_cb), pdb_dialog);
746 button = GTK_WIDGET(gtk_builder_get_object (builder,
"edit_button"));
747 pdb_dialog->edit_button = button;
749 button = GTK_WIDGET(gtk_builder_get_object (builder,
"remove_button"));
750 pdb_dialog->remove_button = button;
752 button = GTK_WIDGET(gtk_builder_get_object (builder,
"add_button"));
753 pdb_dialog->add_button = button;
757 button = GTK_WIDGET(gtk_builder_get_object (builder,
"get_quotes_button"));
758 gtk_widget_set_sensitive(button, FALSE);
761 button = GTK_WIDGET(gtk_builder_get_object (builder,
"close_button"));
762 gtk_widget_grab_default (button);
763 gtk_widget_grab_focus (button);
767 g_signal_connect (pdb_dialog->window,
"destroy",
768 G_CALLBACK(gnc_prices_dialog_destroy_cb), pdb_dialog);
770 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, pdb_dialog);
771 g_object_unref(G_OBJECT(builder));
773 gnc_restore_window_size (GNC_PREFS_GROUP, GTK_WINDOW(pdb_dialog->window), GTK_WINDOW (parent));
779 close_handler (gpointer user_data)
781 auto pdb_dialog =
static_cast<PricesDialog *
> (user_data);
784 gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(pdb_dialog->window));
785 gtk_widget_destroy (GTK_WIDGET (pdb_dialog->window));
791 refresh_handler (GHashTable *changes, gpointer user_data)
799 show_handler (
const char *klass, gint component_id,
800 gpointer user_data, gpointer iter_data)
802 auto pdb_dialog =
static_cast<PricesDialog *
> (user_data);
807 LEAVE(
"no data structure");
811 gtk_window_present (GTK_WINDOW(pdb_dialog->window));
818 gnc_prices_dialog_key_press_cb (GtkWidget *widget, GdkEventKey *event,
823 if (event->keyval == GDK_KEY_Escape)
825 close_handler (pdb_dialog);
841 gnc_prices_dialog (GtkWidget * parent)
847 if (gnc_forall_gui_components (DIALOG_PRICE_DB_CM_CLASS, show_handler, NULL))
849 LEAVE(
"existing dialog raised");
855 gnc_prices_dialog_create (parent, pdb_dialog);
857 component_id = gnc_register_gui_component (DIALOG_PRICE_DB_CM_CLASS,
858 refresh_handler, close_handler,
860 gnc_gui_component_set_session (component_id, pdb_dialog->session);
862 gtk_widget_grab_focus (GTK_WIDGET(pdb_dialog->price_tree));
864 gtk_widget_show (pdb_dialog->window);
void gnc_price_list_destroy(PriceList *prices)
gnc_price_list_destroy - destroy the given price list, calling gnc_price_unref on all the prices incl...
GNCPrice * gnc_price_create(QofBook *book)
gnc_price_create - returns a newly allocated and initialized price with a reference count of 1...
a simple price database for gnucash
utility functions for the GnuCash UI
#define PINFO(format, args...)
Print an informational note.
int gnc_pricedb_num_prices(GNCPriceDB *db, const gnc_commodity *c)
Get the number of prices, in any currency, for a given commodity.
void gnc_price_unref(GNCPrice *p)
gnc_price_unref - indicate you're finished with a price (i.e.
#define DEBUG(format, args...)
Print a debugging message.
bool had_failures() noexcept
Report if there were quotes requested but not retrieved.
gboolean gnc_pricedb_remove_old_prices(GNCPriceDB *db, GList *comm_list, GDate *fiscal_end_date, time64 cutoff, PriceRemoveSourceFlags source, PriceRemoveKeepOptions keep)
Remove and unref prices older than a certain time.
GDate time64_to_gdate(time64 t)
Returns the GDate in which the time64 occurs.
GList * gnc_tree_view_price_get_selected_commodities(GncTreeViewPrice *view)
This function returns a list of commodities associated with the selected rows that are not prices but...
GList * gnc_tree_view_price_get_selected_prices(GncTreeViewPrice *view)
This function returns a list of the prices associated with the selected items in the price tree view...
#define PERR(format, args...)
Log a serious error.
#define ENTER(format, args...)
Print a function entry debugging message.
GList * gnc_commodity_namespace_get_commodity_list(const gnc_commodity_namespace *name_space)
Return a list of all commodity data structures in the specified namespace.
GNCPriceDB * gnc_pricedb_get_db(QofBook *book)
Return the pricedb associated with the book.
const char * gnc_commodity_namespace_get_name(const gnc_commodity_namespace *ns)
Return the textual name of a namespace data structure.
GtkTreeView implementation for gnucash price tree.
Currency selection widget.
char * qof_print_date(time64 secs)
Convenience; calls through to qof_print_date_dmy_buff().
QofBook * qof_session_get_book(const QofSession *session)
Returns the QofBook of this session.
void gnc_gnome_help(GtkWindow *parent, const char *file_name, const char *anchor)
Launch the systems default help browser, gnome's yelp for linux, and open to a given link within a gi...
GList * gnc_commodity_table_get_namespaces(const gnc_commodity_table *table)
Return a list of all namespaces in the commodity table.
General utilities for dealing with accounting periods.
const char * gnc_commodity_get_fullname(const gnc_commodity *cm)
Retrieve the full name for the specified commodity.
time64 gdate_to_time64(GDate d)
Turns a GDate into a time64, returning the first second of the day.
PriceList * gnc_pricedb_lookup_latest_any_currency(GNCPriceDB *db, const gnc_commodity *commodity)
Find the most recent price between a commodity and all other commodities.
#define MAX_DATE_LENGTH
The maximum length of a string created by the date printers.
All type declarations for the whole Gnucash engine.
gboolean gnc_pricedb_remove_price(GNCPriceDB *db, GNCPrice *p)
Remove a price from the pricedb and unref the price.
gboolean gnc_pricedb_has_prices(GNCPriceDB *db, const gnc_commodity *commodity, const gnc_commodity *currency)
Report whether the pricedb contains prices for one commodity in another.
CommodityList * gnc_commodity_table_get_commodities(const gnc_commodity_table *table, const char *name_space)
Return a list of all commodities in the commodity table that are in the given namespace.
const char * gnc_commodity_get_printname(const gnc_commodity *cm)
Retrieve the 'print' name for the specified commodity.
void fetch(QofBook *book)
Fetch quotes for all commodities in our db that have a quote source set.
#define LEAVE(format, args...)
Print a function exit debugging message.
time64 gnc_time(time64 *tbuf)
get the current time
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
GtkTreeView * gnc_tree_view_price_new(QofBook *book, const gchar *first_property_name,...)
Create a new price tree view.
gint gnc_list_length_cmp(const GList *list, size_t len)
Scans the GList elements the minimum number of iterations required to test it against a specified siz...
void gnc_price_ref(GNCPrice *p)
gnc_price_ref - indicate your need for a given price to stick around (i.e.
size_t qof_print_date_buff(char *buff, size_t buflen, time64 secs)
Convenience: calls through to qof_print_date_dmy_buff().
gboolean gnc_quote_source_fq_installed(void)
This function indicates whether or not the Finance::Quote module is installed on a user's computer...
PriceList * gnc_pricedb_get_prices(GNCPriceDB *db, const gnc_commodity *commodity, const gnc_commodity *currency)
Return all the prices for a given commodity in another.