36 #include <glib/gi18n.h> 37 #include "dialog-utils.h" 39 #include "gnc-date-edit.h" 46 #include "engine-helpers.h" 47 #include "qofbookslots.h" 62 static std::string DEFAULT_FILTER_NUM_DAYS_GL =
"30";
63 static std::string DEFAULT_FILTER =
"0x001f";
66 static QofLogModule log_module = GNC_MOD_GUI;
73 GtkWidget* start_date_choose;
74 GtkWidget* start_date_today;
75 GtkWidget* start_date;
76 GtkWidget* end_date_choose;
77 GtkWidget* end_date_today;
81 cleared_match_t original_cleared_match;
82 time64 original_start_time;
85 bool original_save_filter;
87 bool show_save_button;
126 std::string action_name;
131 static std::array<status_action, 5> status_actions {{
132 {
"filter_status_reconciled", CLEARED_RECONCILED,
nullptr },
133 {
"filter_status_cleared", CLEARED_CLEARED,
nullptr },
134 {
"filter_status_voided", CLEARED_VOIDED,
nullptr },
135 {
"filter_status_frozen", CLEARED_FROZEN,
nullptr },
136 {
"filter_status_unreconciled", CLEARED_NO,
nullptr }
141 gboolean_to_bool (gboolean value)
143 return value ? true :
false;
146 static inline gboolean
147 bool_to_gboolean (
bool value)
149 return value ? TRUE : FALSE;
153 get_filter_default_num_of_days (GNCLedgerDisplayType ledger_type)
155 if (ledger_type == LD_GL)
156 return DEFAULT_FILTER_NUM_DAYS_GL;
163 gnc_ppr_filter_time2dmy (
time64 raw_time)
166 char date_string[11];
169 strftime (date_string, 11,
"%d-%m-%Y", timeinfo);
170 PINFO(
"Date to string is %s", date_string);
173 return (date_string);
178 gnc_ppr_filter_dmy2time (std::string date_string)
182 PINFO(
"Date from string is %s", date_string.c_str());
183 memset (&when, 0,
sizeof (when));
185 std::sscanf (date_string.c_str(),
"%d-%d-%d", &when.tm_mday,
186 &when.tm_mon, &when.tm_year);
189 when.tm_year -= 1900;
194 static std::vector<std::string>
195 split_filter_by_delimiter (std::string str,
char delimiter)
197 std::istringstream ss;
198 std::vector<std::string> res;
201 while (std::getline (ss, token, delimiter))
203 res.push_back (token);
209 gnc_ppr_check_for_empty_group (GKeyFile *state_file,
210 const gchar *state_section)
213 gchar **keys = g_key_file_get_keys (state_file, state_section, &num_keys,
nullptr);
222 gnc_ppr_filter_load_filter (GNCSplitReg *gsr, GNCLedgerDisplayType ledger_type)
226 auto state_section = gsr_get_register_state_section (gsr);
227 GError* error =
nullptr;
229 auto filter = g_key_file_get_string (state_file, state_section,
230 KEY_PAGE_FILTER, &error);
231 std::string filter_str;
234 g_clear_error (&error);
236 filter_str = std::string (filter);
239 g_free (state_section);
241 if (!filter_str.empty())
244 return DEFAULT_FILTER +
";0;0;" + get_filter_default_num_of_days (ledger_type);
250 fd->cleared_match = (cleared_match_t)std::stol (DEFAULT_FILTER,
nullptr, 16);
254 fd->save_filter =
false;
258 gnc_ppr_filter_load_filter_parts (GNCSplitReg *gsr, GNCLedgerDisplayType ledger_type,
FilterData *fd)
260 set_filterdata_to_defaults (fd);
261 fd->dialog =
nullptr;
266 std::string filter_str = gnc_ppr_filter_load_filter (gsr, ledger_type);
268 PINFO(
"Loaded Filter String is %s", filter_str.c_str());
270 std::vector<std::string> split_filter = split_filter_by_delimiter (filter_str,
';');
271 int split_filter_size = split_filter.size();
273 if (split_filter_size > 0 && (split_filter[0].compare (DEFAULT_FILTER)) != 0)
275 PINFO(
"Loaded Filter Status is %s", split_filter[0].c_str());
277 fd->cleared_match = (cleared_match_t)std::stol (split_filter[0],
nullptr, 16);
278 fd->save_filter =
true;
281 if (split_filter_size > 1 && (split_filter[1].compare (std::string (
"0"))) != 0)
283 PINFO(
"Loaded Filter Start Date is %s", split_filter[1].c_str());
285 fd->start_time = gnc_ppr_filter_dmy2time (split_filter[1]);
287 fd->save_filter =
true;
290 if (split_filter_size > 2 && (split_filter[2].compare (std::string (
"0"))) != 0)
292 PINFO(
"Loaded Filter End Date is %s", split_filter[2].c_str());
294 fd->end_time = gnc_ppr_filter_dmy2time (split_filter[2]);
296 fd->save_filter =
true;
300 fd->days = (int)std::stol (get_filter_default_num_of_days (ledger_type),
nullptr, 10);
302 if (split_filter_size > 3 &&
303 (split_filter[3].compare (get_filter_default_num_of_days (ledger_type)) != 0))
305 PINFO(
"Loaded Filter Days is %s", split_filter[3].c_str());
307 fd->days = (int)std::stol (split_filter[3],
nullptr, 10);
308 fd->save_filter =
true;
313 gnc_ppr_filter_save_filter (GNCSplitReg *gsr, std::string filter)
316 GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (gsr->ledger);
318 std::string default_filter_str = DEFAULT_FILTER +
";0;0;" +
319 get_filter_default_num_of_days (ledger_type);
323 auto state_section = gsr_get_register_state_section (gsr);
325 if (filter.empty() || (filter.compare (default_filter_str) == 0))
327 if (g_key_file_has_key (state_file, state_section, KEY_PAGE_FILTER,
nullptr))
328 g_key_file_remove_key (state_file, state_section, KEY_PAGE_FILTER,
nullptr);
330 gnc_ppr_check_for_empty_group (state_file, state_section);
334 PINFO(
"The filter to save is %s", filter.c_str());
335 g_key_file_set_string (state_file, state_section, KEY_PAGE_FILTER,
338 g_free (state_section);
342 gnc_ppr_filter_save_filter_parts (GNCSplitReg *gsr,
FilterData *fd)
347 std::string save_filter_str;
351 static const size_t buffer_size = 10;
352 char buffer [buffer_size];
355 std::snprintf (buffer, buffer_size,
"0x%04x", fd->cleared_match);
356 save_filter_str.append (buffer);
359 if (fd->start_time != 0)
361 save_filter_str.append (
";" + gnc_ppr_filter_time2dmy (fd->start_time));
364 save_filter_str.append (
";0");
367 if (fd->end_time != 0)
369 save_filter_str.append (
";" + gnc_ppr_filter_time2dmy (fd->end_time));
372 save_filter_str.append (
";0");
377 save_filter_str.append (
";" + std::to_string (fd->days));
380 save_filter_str.append (
";0");
382 gnc_ppr_filter_save_filter (gsr, save_filter_str);
386 gpp_update_match_filter_text (cleared_match_t match,
const guint mask,
387 const gchar* filter_name, GList **show, GList **hide)
389 if ((match & mask) == mask)
390 *show = g_list_prepend (*show, g_strdup (filter_name));
392 *hide = g_list_prepend (*hide, g_strdup (filter_name));
406 GList *t_list =
nullptr;
413 if (fd->start_time != 0)
416 t_list = g_list_prepend
417 (t_list, g_strdup_printf (
"%s %s", _(
"Start Date:"), sdate));
424 t_list = g_list_prepend
425 (t_list, g_strdup_printf (
"%s %d", _(
"Show previous number of days:"),
429 if (fd->end_time != 0)
432 t_list = g_list_prepend
433 (t_list, g_strdup_printf (
"%s %s", _(
"End Date:"), edate));
438 if (fd->cleared_match != CLEARED_ALL)
440 GList *show =
nullptr;
441 GList *hide =
nullptr;
443 gpp_update_match_filter_text (fd->cleared_match, 0x01, _(
"Unreconciled"),
445 gpp_update_match_filter_text (fd->cleared_match, 0x02, _(
"Cleared"),
447 gpp_update_match_filter_text (fd->cleared_match, 0x04, _(
"Reconciled"),
449 gpp_update_match_filter_text (fd->cleared_match, 0x08, _(
"Frozen"),
451 gpp_update_match_filter_text (fd->cleared_match, 0x10, _(
"Voided"),
454 show = g_list_reverse (show);
455 hide = g_list_reverse (hide);
460 t_list = g_list_prepend
461 (t_list, g_strdup_printf (
"%s %s", _(
"Show:"), str));
468 t_list = g_list_prepend
469 (t_list, g_strdup_printf (
"%s %s", _(
"Hide:"), str));
473 g_list_free_full (show, g_free);
474 g_list_free_full (hide, g_free);
477 t_list = g_list_reverse (t_list);
480 t_list = g_list_prepend (t_list, g_strdup (_(
"Filter By:")));
483 if (gsr->filter_text)
484 g_free (gsr->filter_text);
489 g_list_free_full (t_list, g_free);
507 gnc_ppr_filter_update_status_query (
GncPluginPage* plugin_page)
524 LEAVE(
"no query found");
532 if (reg->type != SEARCH_LEDGER)
534 GSList *param_list = qof_query_build_param_list (SPLIT_RECONCILE,
nullptr);
536 g_slist_free (param_list);
540 if (fd->cleared_match != CLEARED_ALL)
541 xaccQueryAddClearedMatch (query, fd->cleared_match, QOF_QUERY_AND);
563 gnc_ppr_filter_update_date_query (
GncPluginPage* plugin_page)
580 LEAVE(
"no query found");
588 if (reg->type != SEARCH_LEDGER)
590 GSList *param_list = qof_query_build_param_list (SPLIT_TRANS,
591 TRANS_DATE_POSTED,
nullptr);
593 g_slist_free (param_list);
596 if (fd->start_time || fd->end_time)
599 xaccQueryAddDateMatchTT (query,
600 fd->start_time != 0, fd->start_time,
601 fd->end_time != 0, fd->end_time,
612 tm.tm_mday = tm.tm_mday - fd->days;
614 xaccQueryAddDateMatchTT (query, TRUE, start, FALSE, 0, QOF_QUERY_AND);
633 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
637 set_filterdata_to_defaults (fd);
639 gnc_ppr_filter_update_date_query (plugin_page);
650 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
658 GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (gsr->ledger);
661 fd->save_filter =
false;
663 gnc_ppr_filter_load_filter_parts (gsr, ledger_type, fd);
665 if (ledger_type == LD_GL)
669 if (reg->type != GENERAL_JOURNAL)
670 set_filterdata_to_defaults (fd);
673 gnc_ppr_filter_update_status_query (plugin_page);
674 gnc_ppr_filter_update_date_query (plugin_page);
690 g_return_if_fail (GTK_IS_CHECK_BUTTON(button));
691 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rfd->plugin_page));
693 auto name = gtk_buildable_get_name (GTK_BUILDABLE(button));
695 ENTER(
"toggle button %s (%p), plugin_page %p", name, button, rfd->plugin_page);
700 int value = CLEARED_NONE;
701 for (
const auto& action : status_actions)
703 if (action.action_name.compare (name) == 0)
705 value = action.value;
711 if (gtk_toggle_button_get_active (button))
712 fd->cleared_match = (cleared_match_t)(fd->cleared_match | value);
714 fd->cleared_match = (cleared_match_t)(fd->cleared_match & ~value);
716 gnc_ppr_filter_update_status_query (rfd->plugin_page);
722 set_checkbutton_with_blocking (GtkWidget *widget,
727 PINFO(
"Block GtkToggleButton %p for setting active %s",
728 widget, active ?
"TRUE" :
"FALSE");
729 g_signal_handlers_block_by_func (widget,
730 (gpointer)
function, rfd);
731 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(widget), active);
732 g_signal_handlers_unblock_by_func (widget,
733 (gpointer)
function, rfd);
748 g_return_if_fail (GTK_IS_BUTTON(button));
749 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rfd->plugin_page));
751 ENTER(
"(button %p, page %p)", button, rfd->plugin_page);
756 for (
const auto& action : status_actions)
758 set_checkbutton_with_blocking (action.widget,
764 fd->cleared_match = CLEARED_ALL;
765 gnc_ppr_filter_update_status_query (rfd->plugin_page);
781 g_return_if_fail (GTK_IS_BUTTON(button));
782 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rfd->plugin_page));
784 ENTER(
"(button %p, page %p)", button, rfd->plugin_page);
789 for (
const auto& action : status_actions)
791 set_checkbutton_with_blocking (action.widget,
797 fd->cleared_match = CLEARED_NONE;
798 gnc_ppr_filter_update_status_query (rfd->plugin_page);
819 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(rfd->start_date_choose)))
821 time_val = gnc_date_edit_get_date (GNC_DATE_EDIT(rfd->start_date));
823 fd->start_time = time_val;
827 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(rfd->start_date_today)))
833 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(rfd->end_date_choose)))
835 time_val = gnc_date_edit_get_date (GNC_DATE_EDIT(rfd->end_date));
837 fd->end_time = time_val;
841 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(rfd->end_date_today)))
862 g_return_if_fail (GTK_IS_RADIO_BUTTON(button));
863 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rfd->plugin_page));
865 ENTER(
"(button %p, page %p)", button, rfd->plugin_page);
869 auto name = gtk_buildable_get_name (GTK_BUILDABLE(button));
870 gboolean active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(button));
872 if (active && g_strcmp0 (name,
"filter_show_range") == 0)
874 gtk_widget_set_sensitive (rfd->table, active);
875 gtk_widget_set_sensitive (rfd->num_days, !active);
876 get_filter_times (rfd);
878 else if (active && g_strcmp0 (name,
"filter_show_days") == 0)
880 gtk_widget_set_sensitive (rfd->table, !active);
881 gtk_widget_set_sensitive (rfd->num_days, active);
882 gtk_spin_button_set_value (GTK_SPIN_BUTTON(rfd->num_days), fd->days);
886 gtk_widget_set_sensitive (rfd->table, FALSE);
887 gtk_widget_set_sensitive (rfd->num_days, FALSE);
892 gnc_ppr_filter_update_date_query (rfd->plugin_page);
909 g_return_if_fail (GTK_IS_SPIN_BUTTON(button));
910 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rfd->plugin_page));
912 ENTER(
"(button %p, page %p)", button, rfd->plugin_page);
916 fd->days = gtk_spin_button_get_value (GTK_SPIN_BUTTON(button));
917 gnc_ppr_filter_update_date_query (rfd->plugin_page);
932 gnc_ppr_filter_gde_changed_cb (GtkWidget* unused,
935 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rfd->plugin_page));
937 ENTER(
"(widget %s(%p), page %p)",
938 gtk_buildable_get_name (GTK_BUILDABLE(unused)), unused, rfd->plugin_page);
940 get_filter_times (rfd);
941 gnc_ppr_filter_update_date_query (rfd->plugin_page);
968 g_return_if_fail (GTK_IS_RADIO_BUTTON(radio));
969 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rfd->plugin_page));
971 ENTER(
"(radio %s(%p), page %p)",
972 gtk_buildable_get_name (GTK_BUILDABLE(radio)), radio, rfd->plugin_page);
974 if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(radio)))
976 LEAVE(
"1st callback of pair. Defer to 2nd callback.");
980 auto name = gtk_buildable_get_name (GTK_BUILDABLE(radio));
981 gboolean active = !g_strcmp0 (name,
"start_date_choose");
982 gtk_widget_set_sensitive (rfd->start_date, active);
983 get_filter_times (rfd);
984 gnc_ppr_filter_update_date_query (rfd->plugin_page);
1011 g_return_if_fail (GTK_IS_RADIO_BUTTON(radio));
1012 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rfd->plugin_page));
1014 ENTER(
"(radio %s(%p), page %p)",
1015 gtk_buildable_get_name (GTK_BUILDABLE(radio)), radio, rfd->plugin_page);
1017 if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(radio)))
1019 LEAVE(
"1st callback of pair. Defer to 2nd callback.");
1023 auto name = gtk_buildable_get_name (GTK_BUILDABLE(radio));
1024 gboolean active = !g_strcmp0 (name,
"end_date_choose");
1025 gtk_widget_set_sensitive (rfd->end_date, active);
1026 get_filter_times (rfd);
1027 gnc_ppr_filter_update_date_query (rfd->plugin_page);
1043 g_return_if_fail (GTK_IS_CHECK_BUTTON(button));
1044 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rfd->plugin_page));
1046 ENTER(
"Save toggle button (%p), plugin_page %p", button, rfd->plugin_page);
1051 if (gtk_toggle_button_get_active (button))
1052 fd->save_filter =
true;
1054 fd->save_filter =
false;
1074 g_return_if_fail (GTK_IS_DIALOG(dialog));
1075 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rfd->plugin_page));
1082 if (response != GTK_RESPONSE_OK)
1085 fd->cleared_match = rfd->original_cleared_match;
1087 gnc_ppr_filter_update_status_query (rfd->plugin_page);
1089 fd->start_time = rfd->original_start_time;
1090 fd->end_time = rfd->original_end_time;
1091 fd->days = rfd->original_days;
1092 fd->save_filter = rfd->original_save_filter;
1093 gnc_ppr_filter_update_date_query (rfd->plugin_page);
1098 if (!fd->save_filter && rfd->original_save_filter)
1099 gnc_ppr_filter_save_filter (gsr,
"");
1101 rfd->original_save_filter = fd->save_filter;
1103 if (fd->save_filter)
1104 gnc_ppr_filter_save_filter_parts (gsr, fd);
1106 rfd->dialog =
nullptr;
1107 fd->dialog =
nullptr;
1109 gtk_widget_destroy (GTK_WIDGET(dialog));
1124 time64 start_time, end_time, time_val;
1127 auto builder = gtk_builder_new();
1128 gnc_builder_add_from_file (builder,
"gnc-plugin-page-register.glade",
1130 gnc_builder_add_from_file (builder,
"gnc-plugin-page-register.glade",
1131 "filter_by_dialog");
1132 auto dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"filter_by_dialog"));
1133 rfd->dialog = dialog;
1134 fd->dialog = rfd->dialog;
1136 gtk_window_set_transient_for (GTK_WINDOW(dialog),
1137 gnc_window_get_gtk_window (GNC_WINDOW(
1138 GNC_PLUGIN_PAGE(rfd->plugin_page)->window)));
1141 auto title = g_strdup_printf (_ (
"Filter %s by…"),
1143 gtk_window_set_title (GTK_WINDOW(dialog), title);
1147 for (
auto& action : status_actions)
1149 auto toggle = GTK_WIDGET(gtk_builder_get_object (builder,
1150 action.action_name.c_str()));
1151 bool value = fd->cleared_match & action.value;
1152 action.widget = toggle;
1153 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(toggle), bool_to_gboolean (value));
1155 rfd->original_cleared_match = fd->cleared_match;
1157 auto button = GTK_WIDGET(gtk_builder_get_object (builder,
"filter_save"));
1158 if (fd->save_filter)
1159 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
1161 rfd->original_save_filter = fd->save_filter;
1164 gtk_widget_set_visible (GTK_WIDGET(button), bool_to_gboolean (rfd->show_save_button));
1167 rfd->num_days = GTK_WIDGET(gtk_builder_get_object (builder,
"filter_show_num_days"));
1168 button = GTK_WIDGET(gtk_builder_get_object (builder,
"filter_show_days"));
1172 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
1173 gtk_widget_set_sensitive (GTK_WIDGET(rfd->num_days), TRUE);
1174 gtk_spin_button_set_value (GTK_SPIN_BUTTON(rfd->num_days), fd->days);
1175 rfd->original_days = fd->days;
1183 gtk_widget_set_sensitive (GTK_WIDGET(rfd->num_days), FALSE);
1184 rfd->original_days = 0;
1188 xaccQueryGetDateMatchTT (query, &start_time, &end_time);
1192 rfd->original_start_time = start_time;
1193 fd->start_time = start_time;
1194 rfd->original_end_time = end_time;
1195 fd->end_time = end_time;
1197 button = GTK_WIDGET(gtk_builder_get_object (builder,
"filter_show_range"));
1198 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), start_time || end_time);
1199 auto table = GTK_WIDGET(gtk_builder_get_object (builder,
"select_range_table"));
1201 gtk_widget_set_sensitive (GTK_WIDGET(
table), start_time || end_time);
1203 rfd->start_date_choose = GTK_WIDGET(gtk_builder_get_object (builder,
"start_date_choose"));
1204 rfd->start_date_today = GTK_WIDGET(gtk_builder_get_object (builder,
"start_date_today"));
1205 rfd->end_date_choose = GTK_WIDGET(gtk_builder_get_object (builder,
"end_date_choose"));
1206 rfd->end_date_today = GTK_WIDGET(gtk_builder_get_object (builder,
"end_date_today"));
1211 if (start_time == 0)
1213 button = GTK_WIDGET(gtk_builder_get_object(builder,
"start_date_earliest"));
1214 time_val = xaccQueryGetEarliestDateFound (query);
1219 time_val = start_time;
1223 button = rfd->start_date_today;
1228 button = rfd->start_date_choose;
1232 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
1233 rfd->start_date = gnc_date_edit_new (
gnc_time (
nullptr), FALSE, FALSE);
1234 auto hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"start_date_hbox"));
1235 gtk_box_pack_start (GTK_BOX(hbox), rfd->start_date, TRUE, TRUE, 0);
1236 gtk_widget_show (rfd->start_date);
1237 gtk_widget_set_sensitive (GTK_WIDGET(rfd->start_date), bool_to_gboolean (sensitive));
1238 gnc_date_edit_set_time (GNC_DATE_EDIT(rfd->start_date), time_val);
1239 g_signal_connect (G_OBJECT(rfd->start_date),
"date-changed",
1240 G_CALLBACK(gnc_ppr_filter_gde_changed_cb), rfd);
1247 button = GTK_WIDGET(gtk_builder_get_object (builder,
"end_date_latest"));
1248 time_val = xaccQueryGetLatestDateFound (query);
1253 time_val = end_time;
1257 button = rfd->end_date_today;
1262 button = rfd->end_date_choose;
1266 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
1267 rfd->end_date = gnc_date_edit_new (
gnc_time (
nullptr), FALSE, FALSE);
1268 auto hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"end_date_hbox"));
1269 gtk_box_pack_start (GTK_BOX(hbox), rfd->end_date, TRUE, TRUE, 0);
1270 gtk_widget_show (rfd->end_date);
1271 gtk_widget_set_sensitive (GTK_WIDGET(rfd->end_date), bool_to_gboolean (sensitive));
1272 gnc_date_edit_set_time (GNC_DATE_EDIT(rfd->end_date), time_val);
1273 g_signal_connect (G_OBJECT(rfd->end_date),
"date-changed",
1274 G_CALLBACK(gnc_ppr_filter_gde_changed_cb), rfd);
1278 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, rfd);
1281 gtk_widget_show (dialog);
1282 g_object_unref (G_OBJECT(builder));
1307 rfd->plugin_page = plugin_page;
1308 rfd->show_save_button = show_save_button;
1310 gnc_ppr_filter_dialog_create (rfd, fd, query);
Functions to load, save and get gui state.
Functions providing a register page filter for the GnuCash UI.
void gnc_plugin_register_set_enable_refresh(GncPluginPageRegister *page, gboolean enable_refresh)
This allows controlling when refreshes happen, used to reduce refreshes when different aspects of the...
The instance data structure for a content plugin.
Date and Time handling routines.
gchar * gnc_g_list_stringjoin(GList *list_of_strings, const gchar *sep)
Return a string joining a GList whose elements are gchar* strings.
utility functions for the GnuCash UI
#define PINFO(format, args...)
Print an informational note.
void qof_query_purge_terms(QofQuery *q, QofQueryParamList *param_list)
Remove query terms of a particular type from q.
FilterData * gnc_plugin_page_register_get_filter_data(GncPluginPage *plugin_page)
Get the FilterData data structure associated with this register page.
gint gnc_state_drop_sections_for(const gchar *partial_name)
Drop all sections from the state file whose name contains partial_name.
void gnc_ppr_filter_end_cb(GtkWidget *radio, RegisterFilterDialog *rfd)
This function is called when one of the end date radio buttons is selected.
const gchar * gnc_plugin_page_get_page_name(GncPluginPage *page)
Retrieve the name of this page.
Functions that are supported by all types of windows.
void gnc_ppr_filter_save_cb(GtkToggleButton *button, RegisterFilterDialog *rfd)
This function is called whenever the save status is checked or unchecked.
void gnc_ppr_filter_response_cb(GtkDialog *dialog, gint response, RegisterFilterDialog *rfd)
This function is called when the "Filter By…" dialog is closed.
void gnc_tm_get_today_start(struct tm *tm)
The gnc_tm_get_today_start() routine takes a pointer to a struct tm and fills it in with the first se...
#define ENTER(format, args...)
Print a function entry debugging message.
GKeyFile * gnc_state_get_current(void)
Returns a pointer to the most recently loaded state.
Functions for adding content to a window.
void gnc_tm_free(struct tm *time)
free a struct tm* created with gnc_localtime() or gnc_gmtime()
void gnc_ppr_filter_status_clear_all_cb(GtkButton *button, RegisterFilterDialog *rfd)
This function is called whenever the "clear all" status button is clicked.
void gnc_ppr_filter_select_range_cb(GtkRadioButton *button, RegisterFilterDialog *rfd)
This function is called when the radio buttons changes state.
char * qof_print_date(time64 secs)
Convenience; calls through to qof_print_date_dmy_buff().
Functions providing a register page for the GnuCash UI.
time64 gnc_time64_get_day_start(time64 time_val)
The gnc_time64_get_day_start() routine will take the given time in seconds and adjust it to the first...
void gnc_ppr_filter_set_tooltip(GncPluginPage *plugin_page, FilterData *fd)
This function is used to update the tooltip shown in the register which shows a summary of the curren...
gchar * gnc_list_formatter(GList *strings)
This function takes a GList of char*, and uses locale-sensitive list formatter.
time64 gnc_time64_get_today_start(void)
The gnc_time64_get_today_start() routine returns a time64 value corresponding to the first second of ...
void gnc_ppr_filter_update_register(GncPluginPage *plugin_page)
This function is called to update the register.
void gnc_ppr_filter_status_select_all_cb(GtkButton *button, RegisterFilterDialog *rfd)
This function is called whenever the "select all" status button is clicked.
time64 gnc_mktime(struct tm *time)
calculate seconds from the epoch given a time struct
void gnc_ppr_filter_by(GncPluginPage *plugin_page, Query *query, FilterData *fd, bool show_save_button)
This function is called for the filter dialog.
void gnc_ppr_filter_start_cb(GtkWidget *radio, RegisterFilterDialog *rfd)
This function is called when one of the start date radio buttons is selected.
struct tm * gnc_localtime(const time64 *secs)
fill out a time struct from a 64-bit time value.
Generic api to store and retrieve preferences.
Query * gnc_plugin_page_register_get_query(GncPluginPage *plugin_page)
This function is called to get the query associated with this plugin page.
time64 gnc_time64_get_today_end(void)
The gnc_time64_get_today_end() routine returns a time64 value corresponding to the last second of tod...
#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...
void gnc_plugin_page_register_query_update(GncPluginPageRegister *page, Query *query)
This updates the query after the filters have been applied.
time64 gnc_time64_get_day_end(time64 time_val)
The gnc_time64_get_day_end() routine will take the given time in seconds and adjust it to the last se...
SplitRegister * gnc_ledger_display_get_split_register(GNCLedgerDisplay *ld)
return the split register associated with a ledger display
void gnc_plugin_page_register_update_for_search_query(GncPluginPageRegister *page)
This checks if the register is a search register and if so saves the query.
GNCSplitReg * gnc_plugin_page_register_get_gsr(GncPluginPage *plugin_page)
Get the GNCSplitReg data structure associated with this register page.
void gnc_ppr_filter_days_changed_cb(GtkSpinButton *button, RegisterFilterDialog *rfd)
This function is called when the "number of days" spin button is changed which is then saved and upda...
void gnc_ppr_filter_status_one_cb(GtkToggleButton *button, RegisterFilterDialog *rfd)
This function is called whenever one of the status entries is checked or unchecked.
void gnc_ppr_filter_clear_current_filter(GncPluginPage *plugin_page)
This function is used to clear the current filter so that a specific split can be shown in the regist...