29 #include <glib/gi18n.h> 34 #include "gnc-gui-query.h" 35 #include "dialog-utils.h" 37 #include "search-account.h" 38 #include "search-core-utils.h" 42 static void pass_parent (GNCSearchCoreType *fe, gpointer parent);
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);
48 static void gnc_search_account_finalize (GObject *obj);
52 GNCSearchCoreType parent;
62 GList * selected_accounts;
66 G_DEFINE_TYPE_WITH_PRIVATE(GNCSearchAccount, gnc_search_account, GNC_TYPE_SEARCH_CORE_TYPE)
69 ((GNCSearchAccountPrivate*)gnc_search_account_get_instance_private((GNCSearchAccount*)o)) 72 gnc_search_account_class_init (GNCSearchAccountClass *klass)
74 GObjectClass *object_class;
75 GNCSearchCoreTypeClass *gnc_search_core_type = (GNCSearchCoreTypeClass *)klass;
77 object_class = G_OBJECT_CLASS (klass);
79 object_class->finalize = gnc_search_account_finalize;
82 gnc_search_core_type->pass_parent = pass_parent;
83 gnc_search_core_type->validate = gncs_validate;
84 gnc_search_core_type->get_widget = gncs_get_widget;
85 gnc_search_core_type->get_predicate = gncs_get_predicate;
86 gnc_search_core_type->clone = gncs_clone;
90 gnc_search_account_init (GNCSearchAccount *o)
96 gnc_search_account_finalize (GObject *obj)
98 GNCSearchAccount *o = (GNCSearchAccount *)obj;
99 g_assert (GNC_IS_SEARCH_ACCOUNT (o));
101 G_OBJECT_CLASS (gnc_search_account_parent_class)->finalize(obj);
112 gnc_search_account_new (
void)
114 GNCSearchAccount *o = g_object_new(GNC_TYPE_SEARCH_ACCOUNT, NULL);
126 gnc_search_account_matchall_new (
void)
129 GNCSearchAccountPrivate *priv;
131 o = g_object_new(GNC_TYPE_SEARCH_ACCOUNT, NULL);
133 priv->match_all = TRUE;
139 gncs_validate (GNCSearchCoreType *fe)
141 GNCSearchAccount *fi = (GNCSearchAccount *)fe;
142 GNCSearchAccountPrivate *priv;
143 gboolean valid = TRUE;
145 g_return_val_if_fail (fi, FALSE);
146 g_return_val_if_fail (GNC_IS_SEARCH_ACCOUNT (fi), FALSE);
150 if (priv->selected_accounts == NULL && fi->how )
153 gnc_error_dialog (GTK_WINDOW(priv->parent),
"%s", _(
"You have not selected any accounts"));
162 make_menu (GNCSearchCoreType *fe)
164 GNCSearchAccount *fi = (GNCSearchAccount *)fe;
165 GNCSearchAccountPrivate *priv;
169 combo = GTK_COMBO_BOX(gnc_combo_box_new_search());
180 gnc_combo_box_search_add(combo, _(
"matches no accounts"), QOF_GUID_MATCH_NONE);
184 gnc_combo_box_search_changed(combo, &fi->how);
185 gnc_combo_box_search_set_active(combo, fi->how ? fi->how : initial);
187 return GTK_WIDGET(combo);
191 describe_button (GNCSearchAccount *fi)
193 GNCSearchAccountPrivate *priv;
196 if (priv->selected_accounts)
197 return (_(
"Selected Accounts"));
198 return (_(
"Choose Accounts"));
202 button_clicked (GtkButton *button, GNCSearchAccount *fi)
204 GNCSearchAccountPrivate *priv;
206 GtkWidget *account_tree;
207 GtkWidget *accounts_scroller;
210 GtkTreeSelection *selection;
214 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(account_tree), FALSE);
215 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(account_tree));
216 gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
220 if (priv->selected_accounts)
222 priv->selected_accounts, FALSE);
225 accounts_scroller = gtk_scrolled_window_new (NULL, NULL);
226 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(accounts_scroller),
227 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
228 gtk_container_add(GTK_CONTAINER(accounts_scroller), account_tree);
229 gtk_widget_set_size_request(GTK_WIDGET(accounts_scroller), 300, 300);
232 label = gtk_label_new (_(
"Select Accounts to Match"));
236 GTK_DIALOG(gtk_dialog_new_with_buttons(_(
"Select the Accounts to Compare"),
237 GTK_WINDOW(priv->parent),
239 _(
"_Cancel"), GTK_RESPONSE_CANCEL,
240 _(
"_OK"), GTK_RESPONSE_OK,
244 gtk_box_pack_start ((GtkBox *) gtk_dialog_get_content_area (dialog), label,
246 gtk_box_pack_start ((GtkBox *) gtk_dialog_get_content_area (dialog), accounts_scroller,
249 gtk_widget_show_all (GTK_WIDGET (dialog));
252 if (gtk_dialog_run (dialog) == GTK_RESPONSE_OK)
254 if (priv->selected_accounts)
255 g_list_free (priv->selected_accounts);
257 priv->selected_accounts =
260 desc = describe_button (fi);
261 gtk_label_set_text (GTK_LABEL (gtk_bin_get_child (GTK_BIN (button))), desc);
264 gtk_widget_destroy (GTK_WIDGET (dialog));
268 gncs_get_widget (GNCSearchCoreType *fe)
270 GtkWidget *button, *label, *menu, *box;
271 GNCSearchAccount *fi = (GNCSearchAccount *)fe;
274 g_return_val_if_fail (fi, NULL);
275 g_return_val_if_fail (GNC_IS_SEARCH_ACCOUNT (fi), NULL);
277 box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
278 gtk_box_set_homogeneous (GTK_BOX (box), FALSE);
281 menu = make_menu (fe);
282 gtk_box_pack_start (GTK_BOX (box), menu, FALSE, FALSE, 3);
285 desc = describe_button (fi);
286 label = gtk_label_new (desc);
287 gnc_label_set_alignment (label, 0.5, 0.5);
289 button = gtk_button_new ();
290 gtk_container_add (GTK_CONTAINER (button), label);
291 g_signal_connect (G_OBJECT (button),
"clicked", G_CALLBACK (button_clicked), fe);
292 gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 3);
298 static QofQueryPredData* gncs_get_predicate (GNCSearchCoreType *fe)
300 GNCSearchAccountPrivate *priv;
301 GNCSearchAccount *fi = (GNCSearchAccount *)fe;
302 GList *l = NULL, *node;
304 g_return_val_if_fail (fi, NULL);
305 g_return_val_if_fail (GNC_IS_SEARCH_ACCOUNT (fi), NULL);
308 for (node = priv->selected_accounts; node; node = node->next)
312 l = g_list_prepend (l, (gpointer)guid);
314 l = g_list_reverse (l);
316 return qof_query_guid_predicate (fi->how, l);
319 static GNCSearchCoreType *gncs_clone(GNCSearchCoreType *fe)
321 GNCSearchAccount *se, *fse = (GNCSearchAccount *)fe;
322 GNCSearchAccountPrivate *se_priv, *fse_priv;
324 g_return_val_if_fail (fse, NULL);
325 g_return_val_if_fail (GNC_IS_SEARCH_ACCOUNT (fse), NULL);
326 fse_priv = _PRIVATE(fse);
328 se = gnc_search_account_new ();
329 se_priv = _PRIVATE(se);
331 se_priv->match_all = fse_priv->match_all;
332 se_priv->selected_accounts = g_list_copy (fse_priv->selected_accounts);
334 return (GNCSearchCoreType *)se;
338 pass_parent (GNCSearchCoreType *fe, gpointer parent)
340 GNCSearchAccount *fi = (GNCSearchAccount *)fe;
341 GNCSearchAccountPrivate *priv;
343 g_return_if_fail (fi);
344 g_return_if_fail (GNC_IS_SEARCH_ACCOUNT (fi));
347 priv->parent = GTK_WINDOW(parent);
GList * gnc_tree_view_account_get_selected_accounts(GncTreeViewAccount *view)
This function returns a list of the accounts associated with the selected items in the account tree v...
These expect a single object and expect the QofAccessFunc returns GncGUID*.
void gnc_tree_view_account_set_selected_accounts(GncTreeViewAccount *view, GList *account_list, gboolean show_last)
This function selects a set of accounts in the account tree view.
#define xaccAccountGetGUID(X)
Account handling public routines.
GtkTreeView implementation for gnucash account tree.
GtkTreeView * gnc_tree_view_account_new(gboolean show_root)
Create a new account tree view.
These expect a GList* of objects and calls the QofAccessFunc routine on each item in the list to obta...
The type used to store guids in C.