1
/* query-fields-editor.c
3
* Copyright (C) 2004 - 2007 Vivien Malerba
5
* This program is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU General Public License as
7
* published by the Free Software Foundation; either version 2 of the
8
* License, or (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
21
#include "query-fields-editor.h"
22
#include "query-fields-menu.h"
23
#include <glib/gi18n-lib.h>
25
static void query_fields_editor_class_init (QueryFieldsEditorClass * class);
26
static void query_fields_editor_init (QueryFieldsEditor * wid);
27
static void query_fields_editor_dispose (GObject * object);
30
struct _QueryFieldsEditorPriv
37
GtkWidget *del_button;
39
GtkWidget *down_button;
42
/* get a pointer to the parents to be able to call their destructor */
43
static GObjectClass *parent_class = NULL;
46
query_fields_editor_get_type (void)
48
static GType type = 0;
51
static const GTypeInfo info = {
52
sizeof (QueryFieldsEditorClass),
54
(GBaseFinalizeFunc) NULL,
55
(GClassInitFunc) query_fields_editor_class_init,
58
sizeof (QueryFieldsEditor),
60
(GInstanceInitFunc) query_fields_editor_init
63
type = g_type_register_static (GTK_TYPE_VBOX, "QueryFieldsEditor", &info, 0);
70
query_fields_editor_class_init (QueryFieldsEditorClass * class)
72
GObjectClass *object_class = G_OBJECT_CLASS (class);
74
parent_class = g_type_class_peek_parent (class);
76
object_class->dispose = query_fields_editor_dispose;
80
COLUMN_FIELD_PTR, /* pointer to GnomeDbQField obj */
82
COLUMN_FIELD_EDIT, /* TRUE if field text can be edited: for GdaQueryFieldValue, GdaQueryFieldFunc, etc */
83
COLUMN_SHOWN, /* TRUE if field visible && not internal */
86
COLUMN_FILTER_ENABLE, /* TRUE if the WHERE condition is composed of AND'ed individual conditions */
87
COLUMN_FILTER_COND, /* GdaQueryCondition pointer if COLUMN_FILTER does have some text */
88
COLUMN_ORDER_NUMBER, /* -1 if not ordered */
89
COLUMN_ORDER_ENABLE, /* TRUE if field is in the ORDER BY */
96
query_fields_editor_init (QueryFieldsEditor * wid)
98
wid->priv = g_new0 (QueryFieldsEditorPriv, 1);
99
wid->priv->query = NULL;
100
wid->priv->model = GTK_TREE_MODEL (gtk_list_store_new (N_COLUMNS,
113
wid->priv->del_button = NULL;
116
static void query_fields_editor_initialize (QueryFieldsEditor *mgsel);
119
static void query_destroyed_cb (GdaQuery *query, QueryFieldsEditor *mgsel);
120
static void query_changed_cb (GdaQuery *query, QueryFieldsEditor *fedit);
123
* query_fields_editor_new
124
* @query: a #GdaQuery object
126
* Creates a new #QueryFieldsEditor widget.
128
* Returns: the new widget
131
query_fields_editor_new (GdaQuery *query, guint mode)
134
QueryFieldsEditor *fedit;
136
g_return_val_if_fail (query && GDA_IS_QUERY (query), NULL);
138
obj = g_object_new (QUERY_FIELDS_EDITOR_TYPE, NULL);
139
fedit = QUERY_FIELDS_EDITOR (obj);
141
fedit->priv->query = query;
142
fedit->priv->mode = mode;
144
gda_object_connect_destroy (fedit->priv->query,
145
G_CALLBACK (query_destroyed_cb), fedit);
146
g_signal_connect (G_OBJECT (fedit->priv->query), "changed",
147
G_CALLBACK (query_changed_cb), fedit);
149
query_fields_editor_initialize (fedit);
151
return GTK_WIDGET (obj);
155
query_destroyed_cb (GdaQuery *query, QueryFieldsEditor *mgsel)
157
gtk_widget_destroy (GTK_WIDGET (mgsel));
161
query_fields_editor_dispose (GObject *object)
163
QueryFieldsEditor *fedit;
165
g_return_if_fail (object != NULL);
166
g_return_if_fail (IS_QUERY_FIELDS_EDITOR (object));
167
fedit = QUERY_FIELDS_EDITOR (object);
170
/* Weak unref the GdaQuery if necessary */
171
if (fedit->priv->query) {
172
g_signal_handlers_disconnect_by_func (G_OBJECT (fedit->priv->query),
173
G_CALLBACK (query_destroyed_cb), fedit);
174
g_signal_handlers_disconnect_by_func (G_OBJECT (fedit->priv->query),
175
G_CALLBACK (query_changed_cb), fedit);
178
if (fedit->priv->model)
179
g_object_unref (fedit->priv->model);
181
/* the private area itself */
182
g_free (fedit->priv);
186
/* for the parent class */
187
parent_class->dispose (object);
190
static void renderer_field_txt_edited_cb (GtkCellRendererText *renderer,
191
gchar *tree_path, gchar *new_text, QueryFieldsEditor *fedit);
192
static void renderer_field_shown_toggled_cb (GtkCellRendererToggle *renderer,
193
gchar *tree_path, QueryFieldsEditor *fedit);
194
static void renderer_field_alias_edited_cb (GtkCellRendererText *renderer,
195
gchar *tree_path, gchar *new_text, QueryFieldsEditor *fedit);
196
static void renderer_field_filter_edited_cb (GtkCellRendererText *renderer,
197
gchar *tree_path, gchar *new_text, QueryFieldsEditor *fedit);
198
static void renderer_field_orderno_edited_cb (GtkCellRendererText *renderer,
199
gchar *tree_path, gchar *new_text, QueryFieldsEditor *fedit);
200
static void renderer_field_orderty_edited_cb (GtkCellRendererText *renderer,
201
gchar *tree_path, gchar *new_text, QueryFieldsEditor *fedit);
202
static void field_selection_changed_cb (GtkTreeSelection *selection, QueryFieldsEditor *fedit);
203
static void action_drop_field_cb (GtkButton *button, QueryFieldsEditor *fedit);
204
static void action_up_field_cb (GtkButton *button, QueryFieldsEditor *fedit);
205
static void action_down_field_cb (GtkButton *button, QueryFieldsEditor *fedit);
207
query_fields_editor_initialize (QueryFieldsEditor *fedit)
209
GtkWidget *sw, *tv, *hbox, *bbox, *button, *wid;
210
GtkCellRenderer *renderer;
211
GtkTreeViewColumn *column;
212
GtkTreeSelection *select;
214
hbox = gtk_hbox_new (FALSE, 0);
215
gtk_box_pack_start (GTK_BOX (fedit), hbox, TRUE, TRUE, 0);
216
gtk_widget_show (hbox);
219
* TreeView initialization
221
sw = gtk_scrolled_window_new (NULL, NULL);
222
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
223
GTK_POLICY_AUTOMATIC,
224
GTK_POLICY_AUTOMATIC);
225
gtk_box_pack_start (GTK_BOX (hbox), sw, TRUE, TRUE, 0);
226
gtk_widget_show (sw);
228
tv = gtk_tree_view_new_with_model (fedit->priv->model);
229
gtk_container_add (GTK_CONTAINER (sw), tv);
230
gtk_widget_show (tv);
231
fedit->priv->view = GTK_TREE_VIEW (tv);
233
select = gtk_tree_view_get_selection (GTK_TREE_VIEW (tv));
234
gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
235
g_signal_connect (G_OBJECT (select), "changed",
236
G_CALLBACK (field_selection_changed_cb), fedit);
240
renderer = gtk_cell_renderer_text_new ();
241
g_signal_connect (G_OBJECT (renderer), "edited",
242
G_CALLBACK (renderer_field_txt_edited_cb), fedit);
243
g_object_set (G_OBJECT (renderer), "strikethrough", TRUE, NULL);
244
column = gtk_tree_view_column_new_with_attributes (_("Field"),
246
"text", COLUMN_FIELD_TXT,
247
"editable", COLUMN_FIELD_EDIT,
248
"strikethrough-set", COLUMN_ERROR,
250
gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column);
253
if (fedit->priv->mode & QEF_SHOW_OPTION) {
254
renderer = gtk_cell_renderer_toggle_new ();
255
g_signal_connect (G_OBJECT (renderer), "toggled",
256
G_CALLBACK (renderer_field_shown_toggled_cb), fedit);
257
column = gtk_tree_view_column_new_with_attributes (_("Shown & alias"),
259
"active", COLUMN_SHOWN,
261
renderer = gtk_cell_renderer_text_new ();
262
g_signal_connect (G_OBJECT (renderer), "edited",
263
G_CALLBACK (renderer_field_alias_edited_cb), fedit);
264
g_object_set (G_OBJECT (renderer), "strikethrough", TRUE, NULL);
265
gtk_tree_view_column_pack_start (column, renderer, TRUE);
266
gtk_tree_view_column_set_attributes (column, renderer,
267
"text", COLUMN_ALIAS,
268
"editable", COLUMN_SHOWN,
269
"strikethrough-set", COLUMN_ERROR,
271
gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column);
275
if (fedit->priv->mode & QEF_FILTER_OPTION) {
276
renderer = gtk_cell_renderer_text_new ();
277
g_signal_connect (G_OBJECT (renderer), "edited",
278
G_CALLBACK (renderer_field_filter_edited_cb), fedit);
279
g_object_set (G_OBJECT (renderer), "strikethrough", TRUE, NULL);
280
column = gtk_tree_view_column_new_with_attributes (_("Filter"),
282
"text", COLUMN_FILTER,
283
"editable", COLUMN_FILTER_ENABLE,
284
"strikethrough-set", COLUMN_ERROR,
286
gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column);
287
gtk_tree_view_column_set_expand (column, TRUE);
293
if (fedit->priv->mode & QEF_ORDER_OPTION) {
294
renderer = gtk_cell_renderer_text_new ();
295
g_signal_connect (G_OBJECT (renderer), "edited",
296
G_CALLBACK (renderer_field_orderno_edited_cb), fedit);
297
g_object_set (G_OBJECT (renderer), "strikethrough", TRUE, NULL);
298
column = gtk_tree_view_column_new_with_attributes (_("Ordering"),
300
"text", COLUMN_ORDER_NUMBER,
301
"strikethrough-set", COLUMN_ERROR,
303
g_object_set (G_OBJECT (renderer), "editable", TRUE, NULL);
304
renderer = gtk_cell_renderer_text_new ();
305
g_signal_connect (G_OBJECT (renderer), "edited",
306
G_CALLBACK (renderer_field_orderty_edited_cb), fedit);
307
g_object_set (G_OBJECT (renderer), "strikethrough", TRUE, NULL);
308
gtk_tree_view_column_pack_start (column, renderer, TRUE);
309
gtk_tree_view_column_set_attributes (column, renderer,
310
"text", COLUMN_ORDER_ASC,
311
"editable", COLUMN_ORDER_ENABLE,
312
"strikethrough-set", COLUMN_ERROR,
314
gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column);
320
if (fedit->priv->mode & QEF_ACTION_BUTTONS) {
321
bbox = gtk_vbutton_box_new ();
322
gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_START);
323
gtk_box_pack_start (GTK_BOX (hbox), bbox, FALSE, FALSE, 6);
324
gtk_widget_show (bbox);
326
button = query_fields_menu_new (fedit->priv->query);
327
gtk_container_add (GTK_CONTAINER (bbox), button);
328
gtk_widget_show (button);
330
button = gtk_button_new ();
331
wid = gtk_image_new_from_stock (GTK_STOCK_DELETE, GTK_ICON_SIZE_BUTTON);
332
gtk_widget_show (wid);
333
gtk_container_add (GTK_CONTAINER (button), wid);
334
gtk_container_add (GTK_CONTAINER (bbox), button);
335
gtk_widget_show (button);
336
gtk_widget_set_sensitive (button, FALSE);
337
fedit->priv->del_button = button;
338
g_signal_connect (G_OBJECT (button), "clicked",
339
G_CALLBACK (action_drop_field_cb), fedit);
341
button = gtk_button_new ();
342
wid = gtk_image_new_from_stock (GTK_STOCK_GO_UP, GTK_ICON_SIZE_BUTTON);
343
gtk_widget_show (wid);
344
gtk_container_add (GTK_CONTAINER (button), wid);
345
gtk_container_add (GTK_CONTAINER (bbox), button);
346
gtk_widget_show (button);
347
gtk_widget_set_sensitive (button, FALSE);
348
fedit->priv->up_button = button;
349
g_signal_connect (G_OBJECT (button), "clicked",
350
G_CALLBACK (action_up_field_cb), fedit);
352
button = gtk_button_new ();
353
wid = gtk_image_new_from_stock (GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_BUTTON);
354
gtk_widget_show (wid);
355
gtk_container_add (GTK_CONTAINER (button), wid);
356
gtk_container_add (GTK_CONTAINER (bbox), button);
357
gtk_widget_show (button);
358
gtk_widget_set_sensitive (button, FALSE);
359
fedit->priv->down_button = button;
360
g_signal_connect (G_OBJECT (button), "clicked",
361
G_CALLBACK (action_down_field_cb), fedit);
365
* Model initialization
367
query_changed_cb (fedit->priv->query, fedit);
371
* Fetch the GdaQueryField held at row described by @tree_path. if @iter is not NULL, then sets
372
* it to represent the corresponding row
374
static GdaQueryField *
375
model_get_field_from_path (GtkTreeModel *model, GtkTreeIter *iter, const gchar *tree_path)
379
GdaQueryField *field = NULL;
381
path = gtk_tree_path_new_from_string (tree_path);
382
if (gtk_tree_model_get_iter (model, &tmpiter, path)) {
383
gtk_tree_model_get (model, &tmpiter, COLUMN_FIELD_PTR, &field, -1);
387
gtk_tree_path_free (path);
393
* Sets @iter to point to the row representing @field
395
static gboolean get_iter_for_field (QueryFieldsEditor *fedit, GtkTreeIter *iter, GdaEntityField *field)
397
GdaEntityField *tmpfield;
399
g_return_val_if_fail (iter, FALSE);
400
g_return_val_if_fail (field, FALSE);
402
if (! gtk_tree_model_get_iter_first (fedit->priv->model, iter))
405
gtk_tree_model_get (fedit->priv->model, iter, COLUMN_FIELD_PTR, &tmpfield, -1);
406
if (field == tmpfield)
409
while (gtk_tree_model_iter_next (fedit->priv->model, iter)) {
410
gtk_tree_model_get (fedit->priv->model, iter, COLUMN_FIELD_PTR, &tmpfield, -1);
411
if (field == tmpfield)
420
renderer_field_txt_edited_cb (GtkCellRendererText *renderer,
421
gchar *tree_path, gchar *new_text, QueryFieldsEditor *fedit)
423
GdaQueryField *field;
425
field = model_get_field_from_path (fedit->priv->model, NULL, tree_path);
426
if (GDA_IS_QUERY_FIELD_VALUE (field)) {
431
g_object_get (G_OBJECT (field), "gda-type", >ype, NULL);
432
dh = gda_dict_get_default_handler (gda_object_get_dict ((GdaObject *) field), gtype);
433
value = gda_data_handler_get_value_from_sql (dh, new_text,
434
gda_entity_field_get_g_type (GDA_ENTITY_FIELD (field)));
436
gda_query_field_value_set_value (GDA_QUERY_FIELD_VALUE (field), value);
437
gda_value_free (value);
443
renderer_field_shown_toggled_cb (GtkCellRendererToggle *renderer,
444
gchar *tree_path, QueryFieldsEditor *fedit)
446
GdaQueryField *field;
448
field = model_get_field_from_path (fedit->priv->model, NULL, tree_path);
449
gda_query_field_set_visible (field, !gtk_cell_renderer_toggle_get_active (renderer));
453
renderer_field_alias_edited_cb (GtkCellRendererText *renderer,
454
gchar *tree_path, gchar *new_text, QueryFieldsEditor *fedit)
456
GdaQueryField *field;
458
field = model_get_field_from_path (fedit->priv->model, NULL, tree_path);
459
gda_query_field_set_alias (field, new_text);
463
renderer_field_filter_edited_cb (GtkCellRendererText *renderer,
464
gchar *tree_path, gchar *new_text, QueryFieldsEditor *fedit)
466
GdaQueryField *field;
467
GdaQueryCondition *newcond, *cond;
470
field = model_get_field_from_path (fedit->priv->model, &iter, tree_path);
471
gtk_tree_model_get (fedit->priv->model, &iter, COLUMN_FILTER_COND, &cond, -1);
473
if (new_text && *new_text) {
474
GError *error = NULL;
476
newcond = gda_query_condition_new_from_sql (fedit->priv->query, new_text, NULL, &error);
479
sql = gda_renderer_render_as_sql (GDA_RENDERER (field), NULL, NULL, 0, NULL);
481
gchar *text = g_strdup_printf ("%s %s", sql, new_text);
483
newcond = gda_query_condition_new_from_sql (fedit->priv->query, text, NULL, NULL);
493
msg = g_strdup_printf ("<b>%s</b>\n%s '%s':\n\n%s",
494
_("Error parsing/analysing condition expression:"),
499
g_error_free (error);
502
msg = g_strdup_printf ("<b>%s</b>\n%s '%s'",
503
_("Error parsing/analysing condition expression:"),
507
dlg = gtk_message_dialog_new_with_markup (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR,
508
GTK_BUTTONS_CLOSE, msg);
510
gtk_dialog_run (GTK_DIALOG (dlg));
511
gtk_widget_destroy (dlg);
520
/* there was a previous condition */
521
GdaQueryCondition *parent = gda_query_condition_get_parent (cond);
525
repl = g_hash_table_new (NULL, NULL);
526
g_hash_table_insert (repl, cond, newcond);
527
gda_referer_replace_refs (GDA_REFERER (parent), repl);
528
g_hash_table_destroy (repl);
531
gda_query_set_condition (fedit->priv->query, newcond);
534
/* 'append' with an AND the new condition to the already existing one */
535
gda_query_append_condition (fedit->priv->query, newcond, TRUE);
537
g_object_unref (newcond);
541
gda_object_destroy (GDA_OBJECT (cond));
546
renderer_field_orderno_edited_cb (GtkCellRendererText *renderer,
547
gchar *tree_path, gchar *new_text, QueryFieldsEditor *fedit)
549
GdaQueryField *field;
552
field = model_get_field_from_path (fedit->priv->model, NULL, tree_path);
553
order = atoi (new_text);
556
if (gda_query_get_order_by_field (fedit->priv->query, field, &asc) < 0)
558
gda_query_set_order_by_field (fedit->priv->query, field, order - 1, asc);
561
gda_query_set_order_by_field (fedit->priv->query, field, -1, TRUE);
566
renderer_field_orderty_edited_cb (GtkCellRendererText *renderer,
567
gchar *tree_path, gchar *new_text, QueryFieldsEditor *fedit)
569
GdaQueryField *field;
572
field = model_get_field_from_path (fedit->priv->model, NULL, tree_path);
574
order = gda_query_get_order_by_field (fedit->priv->query, field, NULL);
575
gda_query_set_order_by_field (fedit->priv->query, field, order,
576
new_text && ((*new_text == 'A') || (*new_text == 'a')));
580
field_selection_changed_cb (GtkTreeSelection *selection, QueryFieldsEditor *fedit)
585
GdaEntityField *ofield = NULL;
587
if (!fedit->priv->del_button)
590
has_sel = gtk_tree_selection_get_selected (selection, NULL, &iter);
592
GdaEntityField *field;
594
gtk_tree_model_get (fedit->priv->model, &iter, COLUMN_FIELD_PTR, &field, -1);
595
pos = gda_entity_get_field_index (GDA_ENTITY (fedit->priv->query), field);
596
ofield = gda_entity_get_field_by_index (GDA_ENTITY (fedit->priv->query), pos + 1);
599
gtk_widget_set_sensitive (fedit->priv->del_button, has_sel);
600
gtk_widget_set_sensitive (fedit->priv->up_button, has_sel && (pos > 0));
601
gtk_widget_set_sensitive (fedit->priv->down_button, has_sel && ofield);
605
action_drop_field_cb (GtkButton *button, QueryFieldsEditor *fedit)
607
GtkTreeSelection *select;
610
select = gtk_tree_view_get_selection (GTK_TREE_VIEW (fedit->priv->view));
611
if (gtk_tree_selection_get_selected (select, NULL, &iter)) {
612
GdaQueryField *field;
614
gtk_tree_model_get (fedit->priv->model, &iter, COLUMN_FIELD_PTR, &field, -1);
615
gda_entity_remove_field (GDA_ENTITY (fedit->priv->query), GDA_ENTITY_FIELD (field));
620
action_up_field_cb (GtkButton *button, QueryFieldsEditor *fedit)
622
GtkTreeSelection *select;
625
select = gtk_tree_view_get_selection (GTK_TREE_VIEW (fedit->priv->view));
626
if (gtk_tree_selection_get_selected (select, NULL, &iter)) {
627
GdaEntityField *field;
630
gtk_tree_model_get (fedit->priv->model, &iter, COLUMN_FIELD_PTR, &field, -1);
631
pos = gda_entity_get_field_index (GDA_ENTITY (fedit->priv->query), field);
633
GdaEntityField *ofield;
634
ofield = gda_entity_get_field_by_index (GDA_ENTITY (fedit->priv->query), pos - 1);
635
gda_entity_swap_fields (GDA_ENTITY (fedit->priv->query), field, ofield);
637
if (get_iter_for_field (fedit, &iter, field))
638
gtk_tree_selection_select_iter (select, &iter);
644
action_down_field_cb (GtkButton *button, QueryFieldsEditor *fedit)
646
GtkTreeSelection *select;
649
select = gtk_tree_view_get_selection (GTK_TREE_VIEW (fedit->priv->view));
650
if (gtk_tree_selection_get_selected (select, NULL, &iter)) {
651
GdaEntityField *field, *ofield;
654
gtk_tree_model_get (fedit->priv->model, &iter, COLUMN_FIELD_PTR, &field, -1);
655
pos = gda_entity_get_field_index (GDA_ENTITY (fedit->priv->query), field);
656
ofield = gda_entity_get_field_by_index (GDA_ENTITY (fedit->priv->query), pos + 1);
658
gda_entity_swap_fields (GDA_ENTITY (fedit->priv->query), field, ofield);
660
if (get_iter_for_field (fedit, &iter, field))
661
gtk_tree_selection_select_iter (select, &iter);
666
static GSList *compute_fields_to_display (QueryFieldsEditor *fedit);
669
* (re)-write all the rows of the model with the fields which do qualify to be displayed
672
query_changed_cb (GdaQuery *query, QueryFieldsEditor *fedit)
674
GSList *list, *fields;
676
GtkTreeModel *model = fedit->priv->model;
677
gboolean iter_valid = FALSE;
679
fields = compute_fields_to_display (fedit);
682
GdaQueryField *field = GDA_QUERY_FIELD (list->data);
683
gchar *sql, *order_str = NULL, *asc_str = NULL;
686
GdaQueryCondition *cond;
687
gchar *cond_sql = NULL;
689
/* fetch a new iter */
691
/* fetch first iter, or create a new one */
692
if (! gtk_tree_model_get_iter_first (model, &iter))
693
gtk_list_store_append (GTK_LIST_STORE (model), &iter);
697
/* fetch next iter, or create a new one */
698
if (! gtk_tree_model_iter_next (model, &iter))
699
gtk_list_store_append (GTK_LIST_STORE (model), &iter);
702
/* modify the model at iter */
703
sql = gda_renderer_render_as_sql (GDA_RENDERER (field), NULL, NULL, 0, NULL);
704
order = gda_query_get_order_by_field (fedit->priv->query, field, &asc);
706
order_str = g_strdup_printf ("%d", order + 1);
707
asc_str = asc ? "ASC" : "DESC";
709
cond = g_object_get_data (G_OBJECT (field), "qf_filter_cond");
710
g_object_set_data (G_OBJECT (field), "qf_filter_cond", NULL);
712
cond_sql = gda_renderer_render_as_sql (GDA_RENDERER (cond), NULL, NULL,
713
GDA_RENDERER_PARAMS_AS_DETAILED,
715
gtk_list_store_set (GTK_LIST_STORE (model), &iter,
716
COLUMN_FIELD_PTR, field,
717
COLUMN_FIELD_TXT, sql ? sql : gda_object_get_name (GDA_OBJECT (field)),
718
COLUMN_FIELD_EDIT, GDA_IS_QUERY_FIELD_VALUE (field),
719
COLUMN_SHOWN, gda_query_field_is_visible (field),
720
COLUMN_ALIAS, gda_query_field_get_alias (field),
721
COLUMN_ORDER_NUMBER, order_str,
722
COLUMN_ORDER_ENABLE, (order >= 0) ? TRUE : FALSE,
723
COLUMN_ORDER_ASC, asc_str,
724
COLUMN_FILTER, cond_sql,
725
COLUMN_FILTER_COND, cond,
726
COLUMN_FILTER_ENABLE, TRUE /*cond ? TRUE : FALSE*/,
727
COLUMN_ERROR, sql ? FALSE : TRUE,
732
list = g_slist_next (list);
734
g_slist_free (fields);
736
/* clean the remaining rows */
738
if (gtk_tree_model_get_iter_first (model, &iter))
739
while (gtk_list_store_remove (GTK_LIST_STORE (model), &iter));
742
if (gtk_tree_model_iter_next (model, &iter))
743
while (gtk_list_store_remove (GTK_LIST_STORE (model), &iter));
745
/* update action buttons' status */
746
field_selection_changed_cb (gtk_tree_view_get_selection (fedit->priv->view), fedit);
750
compute_fields_to_display (QueryFieldsEditor *fedit)
752
GSList *list, *fields;
753
GSList *retval = NULL;
754
GSList *main_conds = NULL;
755
GdaQueryCondition *cond;
757
cond = gda_query_get_condition (fedit->priv->query);
759
main_conds = gda_query_condition_get_main_conditions (cond);
761
/* FIXME: add the fields which are GROUPed BY, and the ones in HAVING condition */
762
/* analyse all query's fields */
763
fields = gda_query_get_all_fields (fedit->priv->query);
766
GdaQueryField *field = GDA_QUERY_FIELD (list->data);
767
gboolean to_include = FALSE;
770
/* fields as LEFT op of a main condition are always shown */
772
while (clist && !to_include) {
773
cond = GDA_QUERY_CONDITION (clist->data);
774
if (gda_query_condition_is_leaf (cond) &&
775
(gda_query_condition_leaf_get_operator (cond, GDA_QUERY_CONDITION_OP_LEFT) == field)) {
777
g_object_set_data (G_OBJECT (field), "qf_filter_cond", cond);
779
clist = g_slist_next (clist);
782
retval = g_slist_prepend (retval, field);
783
list = g_slist_next (list);
787
/* fields in ORDER BY are always shows */
788
if (gda_query_get_order_by_field (fedit->priv->query, field, NULL) >= 0) {
789
retval = g_slist_prepend (retval, field);
790
list = g_slist_next (list);
796
if (gda_query_field_is_internal (field))
798
if (to_include && !gda_query_field_is_visible (field))
801
retval = g_slist_prepend (retval, field);
803
list = g_slist_next (list);
806
g_slist_free (main_conds);
807
g_slist_free (fields);
809
return g_slist_reverse (retval);