GnuCash c935c2f+
Loading...
Searching...
No Matches
search-reconciled.c
1/*
2 * Copyright (C) 2002 Derek Atkins
3 *
4 * Authors: Derek Atkins <warlord@MIT.EDU>
5 *
6 * Copyright (c) 2006 David Hampton <hampton@employees.org>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this program; if not, write to the
20 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301, USA.
22 */
23
24#ifdef HAVE_CONFIG_H
25#include <config.h>
26#endif
27
28#include <stdint.h>
29#include <gtk/gtk.h>
30#include <glib/gi18n.h>
31
32#include "qof.h"
33#include "Transaction.h" /* for ?REC */
34
35#include "search-reconciled.h"
36#include "search-core-utils.h"
37
38#define d(x)
39
40static void pass_parent (GNCSearchCoreType *fe, gpointer parent);
41static GNCSearchCoreType *gncs_clone(GNCSearchCoreType *fe);
42static gboolean gncs_validate (GNCSearchCoreType *fe);
43static GtkWidget *gncs_get_widget(GNCSearchCoreType *fe);
44static QofQueryPredData* gncs_get_predicate (GNCSearchCoreType *fe);
45
46static void gnc_search_reconciled_finalize (GObject *obj);
47
49{
50 GNCSearchCoreType parent_instance;
51
52 QofCharMatch how;
53 cleared_match_t value;
54
55 GtkWindow *parent;
56};
57
58G_DEFINE_TYPE(GNCSearchReconciled, gnc_search_reconciled, GNC_TYPE_SEARCH_CORE_TYPE)
59
60static void
61gnc_search_reconciled_class_init (GNCSearchReconciledClass *klass)
62{
63 GObjectClass *object_class;
64 GNCSearchCoreTypeClass *gnc_search_core_type = (GNCSearchCoreTypeClass *)klass;
65
66 object_class = G_OBJECT_CLASS (klass);
67
68 object_class->finalize = gnc_search_reconciled_finalize;
69
70 /* override methods */
71 gnc_search_core_type->pass_parent = pass_parent;
72 gnc_search_core_type->validate = gncs_validate;
73 gnc_search_core_type->get_widget = gncs_get_widget;
74 gnc_search_core_type->get_predicate = gncs_get_predicate;
75 gnc_search_core_type->clone = gncs_clone;
76}
77
78static void
79gnc_search_reconciled_init (GNCSearchReconciled *o)
80{
81 o->how = QOF_CHAR_MATCH_ANY;
82 o->value = CLEARED_NO;
83}
84
85static void
86gnc_search_reconciled_finalize (GObject *obj)
87{
88 GNCSearchReconciled *o = (GNCSearchReconciled *)obj;
89 g_assert (GNC_IS_SEARCH_RECONCILED (o));
90
91 G_OBJECT_CLASS (gnc_search_reconciled_parent_class)->finalize(obj);
92}
93
101GNCSearchReconciled *
102gnc_search_reconciled_new (void)
103{
104 GNCSearchReconciled *o = g_object_new(GNC_TYPE_SEARCH_RECONCILED, NULL);
105 return o;
106}
107
108void
109gnc_search_reconciled_set_value (GNCSearchReconciled *fi, cleared_match_t value)
110{
111 g_return_if_fail (fi);
112 g_return_if_fail (GNC_IS_SEARCH_RECONCILED (fi));
113
114 fi->value = value;
115}
116
117void
118gnc_search_reconciled_set_how (GNCSearchReconciled *fi, QofCharMatch how)
119{
120 g_return_if_fail (fi);
121 g_return_if_fail (GNC_IS_SEARCH_RECONCILED (fi));
122 fi->how = how;
123}
124
125static void
126pass_parent (GNCSearchCoreType *fe, gpointer parent)
127{
128 GNCSearchReconciled *fi = (GNCSearchReconciled *)fe;
129
130 g_return_if_fail (fi);
131 g_return_if_fail (GNC_IS_SEARCH_RECONCILED (fi));
132
133 fi->parent = GTK_WINDOW(parent);
134}
135
136static gboolean
137gncs_validate (GNCSearchCoreType *fe)
138{
139 GNCSearchReconciled *fi = (GNCSearchReconciled *)fe;
140 gboolean valid = TRUE;
141
142 g_return_val_if_fail (fi, FALSE);
143 g_return_val_if_fail (GNC_IS_SEARCH_RECONCILED (fi), FALSE);
144
145 /* XXX */
146
147 return valid;
148}
149
150static void
151toggle_changed (GtkToggleButton *button, GNCSearchReconciled *fe)
152{
153 gboolean is_on = gtk_toggle_button_get_active (button);
154 cleared_match_t value =
155 (cleared_match_t) ((uintptr_t)g_object_get_data (G_OBJECT (button), "button-value") & 0xffffffff); // Binary mask to silence void-pointer-to-enum-cast warning.
156
157 if (is_on)
158 fe->value |= value;
159 else
160 fe->value &= ~value;
161}
162
163static GtkWidget *
164make_menu (GNCSearchCoreType *fe)
165{
166 GNCSearchReconciled *fi = (GNCSearchReconciled *)fe;
167 GtkComboBox *combo;
168
169 combo = GTK_COMBO_BOX(gnc_combo_box_new_search());
170 gnc_combo_box_search_add(combo, _("is"), QOF_CHAR_MATCH_ANY);
171 gnc_combo_box_search_add(combo, _("is not"), QOF_CHAR_MATCH_NONE);
172 gnc_combo_box_search_changed(combo, &fi->how);
173 gnc_combo_box_search_set_active(combo, fi->how ? fi->how : QOF_CHAR_MATCH_ANY);
174
175 return GTK_WIDGET(combo);
176}
177
178static GtkWidget *
179make_toggle (GNCSearchReconciled *fi, char *label, cleared_match_t option)
180{
181 GtkWidget *toggle;
182
183 toggle = gtk_check_button_new_with_label (label);
184 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), (fi->value & option));
185 g_object_set_data (G_OBJECT (toggle), "button-value", (gpointer) option);
186 g_signal_connect (G_OBJECT (toggle), "toggled", G_CALLBACK (toggle_changed), fi);
187
188 return toggle;
189}
190
191static GtkWidget *
192gncs_get_widget (GNCSearchCoreType *fe)
193{
194 GtkWidget *toggle, *menu, *box;
195 GNCSearchReconciled *fi = (GNCSearchReconciled *)fe;
196
197 g_return_val_if_fail (fi, NULL);
198 g_return_val_if_fail (GNC_IS_SEARCH_RECONCILED (fi), NULL);
199
200 box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
201 gtk_box_set_homogeneous (GTK_BOX (box), FALSE);
202
203 /* Build and connect the option menu */
204 menu = make_menu (fe);
205 gtk_box_pack_start (GTK_BOX (box), menu, FALSE, FALSE, 3);
206
207 /* Build and connect the toggles */
208 toggle = make_toggle (fi, _("Not Cleared"), CLEARED_NO);
209 gtk_box_pack_start (GTK_BOX (box), toggle, FALSE, FALSE, 3);
210
211 toggle = make_toggle (fi, _("Cleared"), CLEARED_CLEARED);
212 gtk_box_pack_start (GTK_BOX (box), toggle, FALSE, FALSE, 3);
213
214 toggle = make_toggle (fi, _("Reconciled"), CLEARED_RECONCILED);
215 gtk_box_pack_start (GTK_BOX (box), toggle, FALSE, FALSE, 3);
216
217 toggle = make_toggle (fi, _("Frozen"), CLEARED_FROZEN);
218 gtk_box_pack_start (GTK_BOX (box), toggle, FALSE, FALSE, 3);
219
220 toggle = make_toggle (fi, _("Voided"), CLEARED_VOIDED);
221 gtk_box_pack_start (GTK_BOX (box), toggle, FALSE, FALSE, 3);
222
223 /* And return the box */
224 return box;
225}
226
227static QofQueryPredData* gncs_get_predicate (GNCSearchCoreType *fe)
228{
229 GNCSearchReconciled *fi = (GNCSearchReconciled *)fe;
230 char chars[6];
231 cleared_match_t value;
232 int i;
233
234 g_return_val_if_fail (fi, NULL);
235 g_return_val_if_fail (GNC_IS_SEARCH_RECONCILED (fi), NULL);
236
237 /* This code should look a lot like xaccQueryAddClearedMatch() */
238
239 value = fi->value;
240 i = 0;
241
242 if (value & CLEARED_CLEARED)
243 chars[i++] = CREC;
244 if (value & CLEARED_RECONCILED)
245 chars[i++] = YREC;
246 if (value & CLEARED_FROZEN)
247 chars[i++] = FREC;
248 if (value & CLEARED_NO)
249 chars[i++] = NREC;
250 if (value & CLEARED_VOIDED)
251 chars[i++] = VREC;
252 chars[i] = '\0';
253
254 return qof_query_char_predicate (fi->how, chars);
255}
256
257static GNCSearchCoreType *gncs_clone(GNCSearchCoreType *fe)
258{
259 GNCSearchReconciled *se, *fse = (GNCSearchReconciled *)fe;
260
261 g_return_val_if_fail (fse, NULL);
262 g_return_val_if_fail (GNC_IS_SEARCH_RECONCILED (fse), NULL);
263
264 se = gnc_search_reconciled_new ();
265 gnc_search_reconciled_set_value (se, fse->value);
266 gnc_search_reconciled_set_how (se, fse->how);
267
268 return (GNCSearchCoreType *)se;
269}
API for Transactions and Splits (journal entries)
QofCharMatch
A CHAR type is for a RECNCell, Comparisons for QOF_TYPE_CHAR 'ANY' will match any character in the st...
#define VREC
split is void
Definition Split.h:77
#define NREC
not reconciled or cleared
Definition Split.h:76
#define FREC
frozen into accounting period
Definition Split.h:75
#define CREC
The Split has been cleared
Definition Split.h:73
#define YREC
The Split has been reconciled.
Definition Split.h:74