GnuCash c935c2f+
Loading...
Searching...
No Matches
search-date.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 <gtk/gtk.h>
29#include <glib/gi18n.h>
30
31#include "gnc-date.h"
32#include "gnc-date-edit.h"
33#include "qof.h"
34
35#include "search-date.h"
36#include "search-core-utils.h"
37
38#define d(x)
39
40static void pass_parent (GNCSearchCoreType *fe, gpointer parent);
41static void editable_enters (GNCSearchCoreType *fe);
42static void grab_focus (GNCSearchCoreType *fe);
43static GNCSearchCoreType *gncs_clone (GNCSearchCoreType *fe);
44static gboolean gncs_validate (GNCSearchCoreType *fe);
45static GtkWidget *gncs_get_widget (GNCSearchCoreType *fe);
46static QofQueryPredData* gncs_get_predicate (GNCSearchCoreType *fe);
47
48static void gnc_search_date_finalize (GObject *obj);
49
51{
52 GNCSearchCoreType parent_instance;
53
55 time64 tt;
56
57 GtkWidget *entry;
58 GtkWindow *parent;
59};
60
61G_DEFINE_TYPE(GNCSearchDate, gnc_search_date, GNC_TYPE_SEARCH_CORE_TYPE)
62
63static void
64gnc_search_date_class_init (GNCSearchDateClass *klass)
65{
66 GObjectClass *object_class;
67 GNCSearchCoreTypeClass *gnc_search_core_type = (GNCSearchCoreTypeClass *)klass;
68
69 object_class = G_OBJECT_CLASS (klass);
70
71 object_class->finalize = gnc_search_date_finalize;
72
73 /* override methods */
74 gnc_search_core_type->pass_parent = pass_parent;
75 gnc_search_core_type->editable_enters = editable_enters;
76 gnc_search_core_type->grab_focus = grab_focus;
77 gnc_search_core_type->validate = gncs_validate;
78 gnc_search_core_type->get_widget = gncs_get_widget;
79 gnc_search_core_type->get_predicate = gncs_get_predicate;
80 gnc_search_core_type->clone = gncs_clone;
81}
82
83static void
84gnc_search_date_init (GNCSearchDate *o)
85{
86 o->tt = gnc_time (NULL);
87 o->how = QOF_COMPARE_LT;
88}
89
90static void
91gnc_search_date_finalize (GObject *obj)
92{
93 GNCSearchDate *o;
94
95 g_assert (GNC_IS_SEARCH_DATE (obj));
96
97 o = GNC_SEARCH_DATE(obj);
98 if (o->entry)
99 gtk_widget_destroy (o->entry);
100
101 G_OBJECT_CLASS (gnc_search_date_parent_class)->finalize(obj);
102}
103
111GNCSearchDate *
112gnc_search_date_new (void)
113{
114 GNCSearchDate *o = g_object_new(GNC_TYPE_SEARCH_DATE, NULL);
115 return o;
116}
117
118void
119gnc_search_date_set_date (GNCSearchDate *fi, time64 tt)
120{
121 g_return_if_fail (fi);
122 g_return_if_fail (GNC_IS_SEARCH_DATE (fi));
123
124 fi->tt = tt;
125}
126
127void
128gnc_search_date_set_how (GNCSearchDate *fi, QofQueryCompare how)
129{
130 g_return_if_fail (fi);
131 g_return_if_fail (GNC_IS_SEARCH_DATE (fi));
132 fi->how = how;
133}
134
135static void
136pass_parent (GNCSearchCoreType *fe, gpointer parent)
137{
138 GNCSearchDate *fi = (GNCSearchDate *)fe;
139
140 g_return_if_fail (fi);
141 g_return_if_fail (GNC_IS_SEARCH_DATE (fi));
142
143 fi->parent = GTK_WINDOW(parent);
144}
145
146static gboolean
147gncs_validate (GNCSearchCoreType *fe)
148{
149 GNCSearchDate *fi = (GNCSearchDate *)fe;
150 gboolean valid = TRUE;
151
152 g_return_val_if_fail (fi, FALSE);
153 g_return_val_if_fail (GNC_IS_SEARCH_DATE (fi), FALSE);
154
155 /* XXX */
156
157 return valid;
158}
159
160static void
161gnc_search_date_set_date_from_edit (GNCSearchDate *fe, GNCDateEdit *de)
162{
163 /* The gnc_date_edit_get_date function returns a value set to the
164 * start of the day 00:00:00, use gnc_date_edit_get_date_end to get
165 * value for day end 23:59:59 for LessThanEqual and GreaterThan */
166
167 if (fe->how == QOF_COMPARE_LTE || fe->how == QOF_COMPARE_GT)
168 fe->tt = gnc_date_edit_get_date_end (de);
169 else
170 fe->tt = gnc_date_edit_get_date (de);
171}
172
173static void
174date_changed (GNCDateEdit *date_edit, GNCSearchDate *fe)
175{
176 gnc_search_date_set_date_from_edit (fe, date_edit);
177}
178
179static GtkWidget *
180make_menu (GNCSearchCoreType *fe)
181{
182 GNCSearchDate *fi = (GNCSearchDate *)fe;
183 GtkComboBox *combo;
184
185 combo = GTK_COMBO_BOX(gnc_combo_box_new_search());
186
187 gnc_combo_box_search_add(combo, _("is before"), QOF_COMPARE_LT);
188 gnc_combo_box_search_add(combo, _("is before or on"), QOF_COMPARE_LTE);
189 gnc_combo_box_search_add(combo, _("is on"), QOF_COMPARE_EQUAL);
190 gnc_combo_box_search_add(combo, _("is not on"), QOF_COMPARE_NEQ);
191 gnc_combo_box_search_add(combo, _("is after"), QOF_COMPARE_GT);
192 gnc_combo_box_search_add(combo, _("is on or after"), QOF_COMPARE_GTE);
193 gnc_combo_box_search_changed(combo, &fi->how);
194 gnc_combo_box_search_set_active(combo, fi->how ? fi->how : QOF_COMPARE_LT);
195
196 return GTK_WIDGET(combo);
197}
198
199static void
200grab_focus (GNCSearchCoreType *fe)
201{
202 GNCSearchDate *fi = (GNCSearchDate *)fe;
203
204 g_return_if_fail (fi);
205 g_return_if_fail (GNC_IS_SEARCH_DATE (fi));
206
207 if (fi->entry)
208 gtk_widget_grab_focus (GNC_DATE_EDIT(fi->entry)->date_entry);
209}
210
211static void
212editable_enters (GNCSearchCoreType *fe)
213{
214 GNCSearchDate *fi = (GNCSearchDate *)fe;
215
216 g_return_if_fail (fi);
217 g_return_if_fail (GNC_IS_SEARCH_DATE (fi));
218
219 if (fi->entry)
220 gnc_date_activates_default (GNC_DATE_EDIT (fi->entry), TRUE);
221}
222
223static GtkWidget *
224gncs_get_widget (GNCSearchCoreType *fe)
225{
226 GtkWidget *entry, *menu, *box;
227 GNCSearchDate *fi = (GNCSearchDate *)fe;
228
229 g_return_val_if_fail (fi, NULL);
230 g_return_val_if_fail (GNC_IS_SEARCH_DATE (fi), NULL);
231
232 box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
233 gtk_box_set_homogeneous (GTK_BOX (box), FALSE);
234
235 /* Build and connect the option menu */
236 menu = make_menu (fe);
237 gtk_box_pack_start (GTK_BOX (box), menu, FALSE, FALSE, 3);
238
239 /* Build and connect the date entry window */
240 entry = gnc_date_edit_new (fi->tt, FALSE, FALSE);
241 g_signal_connect (G_OBJECT (entry), "date_changed", G_CALLBACK (date_changed), fe);
242 gtk_box_pack_start (GTK_BOX (box), entry, FALSE, FALSE, 3);
243 g_object_ref (entry);
244 fi->entry = entry;
245
246 /* And return the box */
247 return box;
248}
249
250static QofQueryPredData* gncs_get_predicate (GNCSearchCoreType *fe)
251{
252 GNCSearchDate *fi = (GNCSearchDate *)fe;
253
254 g_return_val_if_fail (fi, NULL);
255 g_return_val_if_fail (GNC_IS_SEARCH_DATE (fi), NULL);
256
257 /* Make sure we actually use the currently-entered date */
258 if (fi->entry)
259 gnc_search_date_set_date_from_edit (fi, GNC_DATE_EDIT (fi->entry));
260
261 if (fi->how == QOF_COMPARE_EQUAL || fi->how == QOF_COMPARE_NEQ)
262 return qof_query_date_predicate (fi->how, QOF_DATE_MATCH_DAY, fi->tt);
263 else
264 return qof_query_date_predicate (fi->how, QOF_DATE_MATCH_NORMAL, fi->tt);
265}
266
267static GNCSearchCoreType *gncs_clone(GNCSearchCoreType *fe)
268{
269 GNCSearchDate *se, *fse = (GNCSearchDate *)fe;
270
271 g_return_val_if_fail (fse, NULL);
272 g_return_val_if_fail (GNC_IS_SEARCH_DATE (fse), NULL);
273
274 se = gnc_search_date_new ();
275 gnc_search_date_set_date (se, fse->tt);
276 gnc_search_date_set_how (se, fse->how);
277
278 return (GNCSearchCoreType *)se;
279}
Date and Time handling routines.
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
Definition gnc-date.h:87
time64 gnc_time(time64 *tbuf)
get the current time
Definition gnc-date.cpp:262
QofQueryCompare
Standard Query comparators, for how to compare objects in a predicate.