GnuCash  5.6-150-g038405b370+
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 
40 static void pass_parent (GNCSearchCoreType *fe, gpointer parent);
41 static void editable_enters (GNCSearchCoreType *fe);
42 static void grab_focus (GNCSearchCoreType *fe);
43 static GNCSearchCoreType *gncs_clone (GNCSearchCoreType *fe);
44 static gboolean gncs_validate (GNCSearchCoreType *fe);
45 static GtkWidget *gncs_get_widget (GNCSearchCoreType *fe);
46 static QofQueryPredData* gncs_get_predicate (GNCSearchCoreType *fe);
47 
48 static void gnc_search_date_finalize (GObject *obj);
49 
51 {
52  GNCSearchCoreType parent_instance;
53 
54  QofQueryCompare how;
55  time64 tt;
56 
57  GtkWidget *entry;
58  GtkWindow *parent;
59 };
60 
61 G_DEFINE_TYPE(GNCSearchDate, gnc_search_date, GNC_TYPE_SEARCH_CORE_TYPE)
62 
63 static void
64 gnc_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 
83 static void
84 gnc_search_date_init (GNCSearchDate *o)
85 {
86  o->tt = gnc_time (NULL);
87  o->how = QOF_COMPARE_LT;
88 }
89 
90 static void
91 gnc_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 
111 GNCSearchDate *
112 gnc_search_date_new (void)
113 {
114  GNCSearchDate *o = g_object_new(GNC_TYPE_SEARCH_DATE, NULL);
115  return o;
116 }
117 
118 void
119 gnc_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 
127 void
128 gnc_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 
135 static void
136 pass_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 
146 static gboolean
147 gncs_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 
160 static void
161 gnc_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 
173 static void
174 date_changed (GNCDateEdit *date_edit, GNCSearchDate *fe)
175 {
176  gnc_search_date_set_date_from_edit (fe, date_edit);
177 }
178 
179 static GtkWidget *
180 make_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 
199 static void
200 grab_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 
211 static void
212 editable_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 
223 static GtkWidget *
224 gncs_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 
250 static 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 
267 static 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.
QofQueryCompare
Standard Query comparators, for how to compare objects in a predicate.
Definition: qofquerycore.h:54
time64 gnc_time(time64 *tbuf)
get the current time
Definition: gnc-date.cpp:261
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
Definition: gnc-date.h:87