GnuCash  5.6-150-g038405b370+
search-boolean.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 "qof.h"
32 
33 #include "search-boolean.h"
34 #include "search-core-utils.h"
35 
36 #define d(x)
37 
38 static void pass_parent (GNCSearchCoreType *fe, gpointer parent);
39 static GNCSearchCoreType *gncs_clone(GNCSearchCoreType *fe);
40 static gboolean gncs_validate (GNCSearchCoreType *fe);
41 static GtkWidget *gncs_get_widget(GNCSearchCoreType *fe);
42 static QofQueryPredData* gncs_get_predicate (GNCSearchCoreType *fe);
43 
44 static void gnc_search_boolean_finalize (GObject *obj);
45 
47 {
48  GNCSearchCoreType parent_instance;
49 
50  gboolean value;
51 
52  GtkWindow *parent;
53 };
54 
55 G_DEFINE_TYPE(GNCSearchBoolean, gnc_search_boolean, GNC_TYPE_SEARCH_CORE_TYPE)
56 
57 static void
58 gnc_search_boolean_class_init (GNCSearchBooleanClass *klass)
59 {
60  GObjectClass *object_class;
61  GNCSearchCoreTypeClass *gnc_search_core_type = (GNCSearchCoreTypeClass *)klass;
62 
63  object_class = G_OBJECT_CLASS (klass);
64 
65  object_class->finalize = gnc_search_boolean_finalize;
66 
67  /* override methods */
68  gnc_search_core_type->pass_parent = pass_parent;
69  gnc_search_core_type->validate = gncs_validate;
70  gnc_search_core_type->get_widget = gncs_get_widget;
71  gnc_search_core_type->get_predicate = gncs_get_predicate;
72  gnc_search_core_type->clone = gncs_clone;
73 }
74 
75 static void
76 gnc_search_boolean_init (GNCSearchBoolean *o)
77 {
78  o->value = TRUE;
79 }
80 
81 static void
82 gnc_search_boolean_finalize (GObject *obj)
83 {
84  GNCSearchBoolean *o = (GNCSearchBoolean *)obj;
85  g_assert (GNC_IS_SEARCH_BOOLEAN (o));
86 
87  G_OBJECT_CLASS (gnc_search_boolean_parent_class)->finalize(obj);
88 }
89 
97 GNCSearchBoolean *
98 gnc_search_boolean_new (void)
99 {
100  GNCSearchBoolean *o = g_object_new(GNC_TYPE_SEARCH_BOOLEAN, NULL);
101  return o;
102 }
103 
104 void
105 gnc_search_boolean_set_value (GNCSearchBoolean *fi, gboolean value)
106 {
107  g_return_if_fail (fi);
108  g_return_if_fail (GNC_IS_SEARCH_BOOLEAN (fi));
109 
110  fi->value = value;
111 }
112 
113 static void
114 pass_parent (GNCSearchCoreType *fe, gpointer parent)
115 {
116  GNCSearchBoolean *fi = (GNCSearchBoolean *)fe;
117 
118  g_return_if_fail (fi);
119  g_return_if_fail (GNC_IS_SEARCH_BOOLEAN (fi));
120 
121  fi->parent = GTK_WINDOW(parent);
122 }
123 
124 static gboolean
125 gncs_validate (GNCSearchCoreType *fe)
126 {
127  GNCSearchBoolean *fi = (GNCSearchBoolean *)fe;
128  gboolean valid = TRUE;
129 
130  g_return_val_if_fail (fi, FALSE);
131  g_return_val_if_fail (GNC_IS_SEARCH_BOOLEAN (fi), FALSE);
132 
133  /* XXX */
134 
135  return valid;
136 }
137 
138 static void
139 toggle_changed (GtkToggleButton *button, GNCSearchBoolean *fe)
140 {
141  fe->value = gtk_toggle_button_get_active (button);
142 }
143 
144 static GtkWidget *
145 gncs_get_widget (GNCSearchCoreType *fe)
146 {
147  GtkWidget *toggle, *box;
148  GNCSearchBoolean *fi = (GNCSearchBoolean *)fe;
149 
150  g_return_val_if_fail (fi, NULL);
151  g_return_val_if_fail (GNC_IS_SEARCH_BOOLEAN (fi), NULL);
152 
153  box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
154  gtk_box_set_homogeneous (GTK_BOX (box), FALSE);
155 
156  /* Build and connect the toggle */
157  toggle = gtk_check_button_new ();
158  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), fi->value);
159  g_signal_connect (G_OBJECT (toggle), "toggled", G_CALLBACK (toggle_changed), fe);
160  gtk_box_pack_start (GTK_BOX (box), toggle, FALSE, FALSE, 3);
161 
162  /* And return the box */
163  return box;
164 }
165 
166 static QofQueryPredData* gncs_get_predicate (GNCSearchCoreType *fe)
167 {
168  GNCSearchBoolean *fi = (GNCSearchBoolean *)fe;
169 
170  g_return_val_if_fail (fi, NULL);
171  g_return_val_if_fail (GNC_IS_SEARCH_BOOLEAN (fi), NULL);
172 
173  return qof_query_boolean_predicate (QOF_COMPARE_EQUAL, fi->value);
174 }
175 
176 static GNCSearchCoreType *gncs_clone(GNCSearchCoreType *fe)
177 {
178  GNCSearchBoolean *se, *fse = (GNCSearchBoolean *)fe;
179 
180  g_return_val_if_fail (fse, NULL);
181  g_return_val_if_fail (GNC_IS_SEARCH_BOOLEAN (fse), NULL);
182 
183  se = gnc_search_boolean_new ();
184  gnc_search_boolean_set_value (se, fse->value);
185 
186  return (GNCSearchCoreType *)se;
187 }