GnuCash  2.6.99
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
gnc-date-delta.c
1 /*
2  * gnc-datedelta.c -- Date delta widget
3  *
4  * Copyright (C) 2000 Free Software Foundation
5  * All rights reserved.
6  *
7  * Gnucash is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public License
9  * as published by the Free Software Foundation; either version 2 of the
10  * License, or (at your option) any later version.
11  *
12  * Gnucash is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, contact:
19  *
20  * Free Software Foundation Voice: +1-617-542-5942
21  * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
22  * Boston, MA 02110-1301, USA [email protected]
23  *
24  */
25 /*
26  @NOTATION@
27  */
28 
29 /*
30  * Date delta widget
31  *
32  * Author: Dave Peticolas <[email protected]>
33  */
34 
35 #include "config.h"
36 
37 #include <gtk/gtk.h>
38 #include <glib/gi18n.h>
39 #include <string.h>
40 #include <stdlib.h> /* atoi */
41 #include <ctype.h> /* isdigit */
42 #include <stdio.h>
43 
44 #include "gnc-date.h"
45 #include "gnc-date-delta.h"
46 
47 #define GDD_LABEL "gdd"
48 
49 enum
50 {
51  VALUE_CHANGED,
52  UNITS_CHANGED,
53  POLARITY_CHANGED,
54  DELTA_CHANGED,
55  LAST_SIGNAL
56 };
57 
58 static guint date_delta_signals [LAST_SIGNAL] = { 0 };
59 
60 
61 static void gnc_date_delta_init (GNCDateDelta *gdd);
62 static void gnc_date_delta_class_init (GNCDateDeltaClass *klass);
63 static void gnc_date_delta_forall (GtkContainer *container,
64  gboolean include_internals,
65  GtkCallback callback,
66  gpointer callbabck_data);
67 
68 static GtkHBoxClass *parent_class;
69 
75 GType
76 gnc_date_delta_get_type (void)
77 {
78  static GType date_delta_type = 0;
79 
80  if (date_delta_type == 0)
81  {
82  GTypeInfo date_delta_info =
83  {
84  sizeof (GNCDateDeltaClass),
85  NULL,
86  NULL,
87  (GClassInitFunc) gnc_date_delta_class_init,
88  NULL,
89  NULL,
90  sizeof (GNCDateDelta),
91  0,
92  (GInstanceInitFunc) gnc_date_delta_init
93  };
94 
95  date_delta_type = g_type_register_static (gtk_hbox_get_type (),
96  "GNCDateDelta",
97  &date_delta_info,
98  0);
99  }
100 
101  return date_delta_type;
102 }
103 
104 static void
105 gnc_date_delta_class_init (GNCDateDeltaClass *klass)
106 {
107  GObjectClass *object_class = G_OBJECT_CLASS (klass);
108  GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
109 
110  parent_class = g_type_class_peek_parent (klass);
111 
112  date_delta_signals [VALUE_CHANGED] =
113  g_signal_new ("value_changed",
114  G_OBJECT_CLASS_TYPE (object_class),
115  G_SIGNAL_RUN_FIRST,
116  G_STRUCT_OFFSET (GNCDateDeltaClass, value_changed),
117  NULL,
118  NULL,
119  g_cclosure_marshal_VOID__VOID,
120  G_TYPE_NONE,
121  0);
122 
123  date_delta_signals [UNITS_CHANGED] =
124  g_signal_new ("units_changed",
125  G_OBJECT_CLASS_TYPE (object_class),
126  G_SIGNAL_RUN_FIRST,
127  G_STRUCT_OFFSET (GNCDateDeltaClass, units_changed),
128  NULL,
129  NULL,
130  g_cclosure_marshal_VOID__VOID,
131  G_TYPE_NONE,
132  0);
133 
134  date_delta_signals [POLARITY_CHANGED] =
135  g_signal_new ("polarity_changed",
136  G_OBJECT_CLASS_TYPE (object_class),
137  G_SIGNAL_RUN_FIRST,
138  G_STRUCT_OFFSET (GNCDateDeltaClass, polarity_changed),
139  NULL,
140  NULL,
141  g_cclosure_marshal_VOID__VOID,
142  G_TYPE_NONE,
143  0);
144 
145  date_delta_signals [DELTA_CHANGED] =
146  g_signal_new ("delta_changed",
147  G_OBJECT_CLASS_TYPE (object_class),
148  G_SIGNAL_RUN_FIRST,
149  G_STRUCT_OFFSET (GNCDateDeltaClass, delta_changed),
150  NULL,
151  NULL,
152  g_cclosure_marshal_VOID__VOID,
153  G_TYPE_NONE,
154  0);
155 
156  container_class->forall = gnc_date_delta_forall;
157 }
158 
159 static void
160 gnc_date_delta_init (GNCDateDelta *gdd)
161 {
162  gdd->value_spin = NULL;
163  gdd->units_combo = NULL;
164  gdd->polarity_combo = NULL;
165 
166  gdd->units = 0;
167  gdd->polarity = 0;
168 
169  gdd->show_polarity = FALSE;
170 }
171 
172 static void
173 gnc_date_delta_forall (GtkContainer *container, gboolean include_internals,
174  GtkCallback callback, gpointer callback_data)
175 {
176  g_return_if_fail (container != NULL);
177  g_return_if_fail (GNC_IS_DATE_DELTA (container));
178  g_return_if_fail (callback != NULL);
179 
180  /* Let GtkBox handle things only if the internal widgets need to be
181  * poked.
182  */
183  if (include_internals)
184  if (GTK_CONTAINER_CLASS (parent_class)->forall)
185  (* GTK_CONTAINER_CLASS (parent_class)->forall)
186  (container, include_internals, callback, callback_data);
187 }
188 
189 static void
190 value_changed(GtkEditable *editable, gpointer data)
191 {
192  GNCDateDelta *gdd = GNC_DATE_DELTA(data);
193 
194  g_signal_emit(gdd, date_delta_signals [VALUE_CHANGED], 0);
195  g_signal_emit(gdd, date_delta_signals [DELTA_CHANGED], 0);
196 }
197 
198 static void
199 set_units (GtkComboBox *combo, GNCDateDelta *gdd)
200 {
201  gint active;
202 
203  active = gtk_combo_box_get_active(GTK_COMBO_BOX(gdd->units_combo));
204  if ((active < GNC_DATE_DELTA_DAYS) || (active > GNC_DATE_DELTA_YEARS))
205  active = GNC_DATE_DELTA_DAYS;
206  gdd->units = active;
207 
208  g_signal_emit (gdd, date_delta_signals [UNITS_CHANGED], 0);
209  g_signal_emit (gdd, date_delta_signals [DELTA_CHANGED], 0);
210 }
211 
212 static void
213 fill_units_combo(GNCDateDelta *gdd)
214 {
215  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(gdd->units_combo),
216  _("Days"));
217  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(gdd->units_combo),
218  _("Weeks"));
219  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(gdd->units_combo),
220  _("Months"));
221  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(gdd->units_combo),
222  _("Years"));
223 
224  g_signal_connect (gdd->units_combo, "changed",
225  G_CALLBACK (set_units), gdd);
226 }
227 
228 static void
229 set_polarity (GtkComboBox *combo, GNCDateDelta *gdd)
230 {
231  gint active;
232 
233  active = gtk_combo_box_get_active(GTK_COMBO_BOX(gdd->units_combo));
234  if ((active < GNC_DATE_DELTA_PAST) || (active > GNC_DATE_DELTA_FUTURE))
235  active = GNC_DATE_DELTA_PAST;
236  gdd->polarity = active;
237 
238  g_signal_emit (gdd, date_delta_signals [POLARITY_CHANGED], 0);
239  g_signal_emit (gdd, date_delta_signals [DELTA_CHANGED], 0);
240 }
241 
242 static void
243 fill_polarity_combo(GNCDateDelta *gdd)
244 {
245  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(gdd->polarity_combo),
246  _("Ago"));
247  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(gdd->polarity_combo),
248  _("From Now"));
249 
250  g_signal_connect (gdd->polarity_combo, "changed",
251  G_CALLBACK(set_polarity), gdd);
252 }
253 
254 static void
255 create_children (GNCDateDelta *gdd)
256 {
257  GtkObject *adj;
258 
259  adj = gtk_adjustment_new(1.0, 1.0, 1000.0, 1.0, 5.0, 5.0);
260  gdd->value_spin = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1.0, 0);
261  gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(gdd->value_spin), TRUE);
262  gtk_box_pack_start(GTK_BOX(gdd), gdd->value_spin, FALSE, FALSE, 0);
263  gtk_widget_show(gdd->value_spin);
264 
265  g_signal_connect(gdd->value_spin, "changed",
266  G_CALLBACK(value_changed), gdd);
267 
268  gdd->units_combo = gtk_combo_box_text_new();
269  fill_units_combo(gdd);
270  gtk_combo_box_set_active(GTK_COMBO_BOX(gdd->units_combo), 0);
271  gtk_box_pack_start(GTK_BOX(gdd), gdd->units_combo, FALSE, FALSE, 0);
272  gtk_widget_show(gdd->units_combo);
273 
274  gdd->polarity_combo = gtk_combo_box_text_new();
275  fill_polarity_combo(gdd);
276  gtk_combo_box_set_active(GTK_COMBO_BOX(gdd->polarity_combo), 0);
277  gtk_box_pack_start(GTK_BOX(gdd), gdd->polarity_combo, FALSE, FALSE, 0);
278  if (gdd->show_polarity)
279  gtk_widget_show(gdd->polarity_combo);
280 }
281 
292 GtkWidget *
293 gnc_date_delta_new (gboolean show_polarity)
294 {
295  GNCDateDelta *gdd;
296 
297  gdd = g_object_new (gnc_date_delta_get_type (), NULL);
298 
299  gdd->show_polarity = show_polarity;
300 
301  create_children (gdd);
302 
303  return GTK_WIDGET (gdd);
304 }
305 
313 void
314 gnc_date_delta_set_value (GNCDateDelta *gdd, int value)
315 {
316  g_return_if_fail(gdd != NULL);
317  g_return_if_fail(GNC_IS_DATE_DELTA(gdd));
318 
319  gtk_spin_button_set_value(GTK_SPIN_BUTTON(gdd->value_spin), value);
320 }
321 
328 int
329 gnc_date_delta_get_value (GNCDateDelta *gdd)
330 {
331  g_return_val_if_fail(gdd != NULL, 0);
332  g_return_val_if_fail(GNC_IS_DATE_DELTA(gdd), 0);
333 
334  return gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(gdd->value_spin));
335 }
336 
344 void
345 gnc_date_delta_set_units (GNCDateDelta *gdd, GNCDateDeltaUnits units)
346 {
347  g_return_if_fail(gdd != NULL);
348  g_return_if_fail(GNC_IS_DATE_DELTA(gdd));
349  g_return_if_fail((units >= 0) && (units < GNC_DATE_DELTA_NUM_UNITS));
350 
351  gdd->units = units;
352 
353  gtk_combo_box_set_active(GTK_COMBO_BOX(gdd->units_combo), units);
354 }
355 
362 GNCDateDeltaUnits
363 gnc_date_delta_get_units (GNCDateDelta *gdd)
364 {
365  g_return_val_if_fail(gdd != NULL, GNC_DATE_DELTA_DAYS);
366  g_return_val_if_fail(GNC_IS_DATE_DELTA(gdd), GNC_DATE_DELTA_DAYS);
367 
368  return gdd->units;
369 }
370 
378 void
379 gnc_date_delta_set_polarity (GNCDateDelta *gdd, GNCDateDeltaPolarity polarity)
380 {
381  g_return_if_fail(gdd != NULL);
382  g_return_if_fail(GNC_IS_DATE_DELTA(gdd));
383  g_return_if_fail((polarity >= 0) &&
384  (polarity < GNC_DATE_DELTA_NUM_POLARITY));
385 
386  gdd->polarity = polarity;
387 
388  gtk_combo_box_set_active(GTK_COMBO_BOX(gdd->polarity_combo), polarity);
389 }
390 
397 GNCDateDeltaPolarity
398 gnc_date_delta_get_polarity (GNCDateDelta *gdd)
399 {
400  g_return_val_if_fail(gdd != NULL, GNC_DATE_DELTA_PAST);
401  g_return_val_if_fail(GNC_IS_DATE_DELTA(gdd), GNC_DATE_DELTA_PAST);
402 
403  return gdd->polarity;
404 }
405 
413 void
414 gnc_date_delta_show_polarity (GNCDateDelta *gdd, gboolean show_polarity)
415 {
416  g_return_if_fail(gdd != NULL);
417  g_return_if_fail(GNC_IS_DATE_DELTA(gdd));
418 
419  gdd->show_polarity = show_polarity;
420 
421  if (show_polarity)
422  gtk_widget_show(gdd->polarity_combo);
423  else
424  gtk_widget_hide(gdd->polarity_combo);
425 }
Date and Time handling routines.