]> git.sur5r.net Git - glabels/blob - src/merge-properties-dialog.c
Imported Upstream version 2.2.8
[glabels] / src / merge-properties-dialog.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
2
3 /*
4  *  (GLABELS) Label and Business Card Creation program for GNOME
5  *
6  *  merge-properties-dialog.c:  document merge properties dialog module
7  *
8  *  Copyright (C) 2001  Jim Evins <evins@snaught.com>.
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License as published by
12  *  the Free Software Foundation; either version 2 of the License, or
13  *  (at your option) any later version.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program; if not, write to the Free Software
22  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
23  */
24 #include <config.h>
25
26 #include "merge-properties-dialog.h"
27
28 #include <glib/gi18n.h>
29 #include <glade/glade-xml.h>
30 #include <gtk/gtkfilechooserbutton.h>
31 #include <gtk/gtkcombobox.h>
32 #include <gtk/gtkstock.h>
33 #include <gtk/gtktreestore.h>
34 #include <gtk/gtktreeselection.h>
35 #include <gtk/gtkcellrenderertoggle.h>
36 #include <gtk/gtkcellrenderertext.h>
37 #include <gtk/gtklabel.h>
38 #include <string.h>
39
40 #include "label.h"
41 #include "merge.h"
42 #include "util.h"
43 #include "hig.h"
44
45 #include "debug.h"
46
47 /*===========================================*/
48 /* Private data types                        */
49 /*===========================================*/
50
51 struct _glMergePropertiesDialogPrivate {
52
53         glLabel      *label;
54         glMerge      *merge;
55
56         GtkWidget    *type_combo;
57         GtkWidget    *location_vbox;
58         GtkWidget    *src_entry;
59
60         GtkTreeStore *store;
61         GtkWidget    *treeview;
62
63         GtkWidget    *select_all_button;
64         GtkWidget    *unselect_all_button;
65
66         gchar        *saved_src;
67
68 };
69
70 enum {
71         /* Real columns */
72         SELECT_COLUMN,
73         RECORD_FIELD_COLUMN,
74         VALUE_COLUMN,
75
76         /* Invisible columns */
77         IS_RECORD_COLUMN,
78         DATA_COLUMN, /* points to glMergeRecord */
79
80         N_COLUMNS
81 };
82
83 /*===========================================*/
84 /* Private globals                           */
85 /*===========================================*/
86
87
88 /*===========================================*/
89 /* Local function prototypes                 */
90 /*===========================================*/
91
92 static void gl_merge_properties_dialog_finalize   (GObject                      *object);
93 static void gl_merge_properties_dialog_construct  (glMergePropertiesDialog      *dialog,
94                                                    glLabel                      *label,
95                                                    GtkWindow                    *window);
96
97 static void type_changed_cb                       (GtkWidget                    *widget,
98                                                    glMergePropertiesDialog      *dialog);
99
100 static void src_changed_cb                        (GtkWidget                    *widget,
101                                                    glMergePropertiesDialog      *dialog);
102
103 static void response_cb                           (glMergePropertiesDialog      *dialog,
104                                                    gint                          response,
105                                                    gpointer                      user_data);
106
107 static void load_tree                             (GtkTreeStore                 *store,
108                                                    glMerge                      *merge);
109
110 static void record_select_toggled_cb              (GtkCellRendererToggle        *cell,
111                                                    gchar                        *path_str,
112                                                    GtkTreeStore                 *store);
113
114 static void select_all_button_clicked_cb          (GtkWidget                    *widget,
115                                                    glMergePropertiesDialog      *dialog);
116
117 static void unselect_all_button_clicked_cb        (GtkWidget                    *widget,
118                                                    glMergePropertiesDialog      *dialog);
119
120 \f
121 /*****************************************************************************/
122 /* Boilerplate object stuff.                                                 */
123 /*****************************************************************************/
124 G_DEFINE_TYPE (glMergePropertiesDialog, gl_merge_properties_dialog, GTK_TYPE_DIALOG);
125
126 static void
127 gl_merge_properties_dialog_class_init (glMergePropertiesDialogClass *class)
128 {
129         GObjectClass *object_class = G_OBJECT_CLASS (class);
130
131         gl_debug (DEBUG_MERGE, "");
132         
133         gl_merge_properties_dialog_parent_class = g_type_class_peek_parent (class);
134
135         object_class->finalize = gl_merge_properties_dialog_finalize;   
136 }
137
138 static void
139 gl_merge_properties_dialog_init (glMergePropertiesDialog *dialog)
140 {
141         gl_debug (DEBUG_MERGE, "START");
142
143         dialog->priv = g_new0 (glMergePropertiesDialogPrivate, 1);
144
145         gtk_container_set_border_width (GTK_CONTAINER(dialog), GL_HIG_PAD2);
146
147         gtk_dialog_set_has_separator (GTK_DIALOG(dialog), FALSE);
148         gtk_dialog_add_buttons (GTK_DIALOG (dialog),
149                                 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
150                                 GTK_STOCK_OK, GTK_RESPONSE_OK,
151                                 NULL);
152
153         gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
154
155         g_signal_connect(G_OBJECT (dialog), "response",
156                          G_CALLBACK (response_cb), NULL);
157
158
159         gl_debug (DEBUG_MERGE, "END");
160 }
161
162 static void 
163 gl_merge_properties_dialog_finalize (GObject *object)
164 {
165         glMergePropertiesDialog* dialog = GL_MERGE_PROPERTIES_DIALOG (object);
166         
167         gl_debug (DEBUG_MERGE, "START");
168
169         g_return_if_fail (object != NULL);
170         g_return_if_fail (GL_IS_MERGE_PROPERTIES_DIALOG (dialog));
171         g_return_if_fail (dialog->priv != NULL);
172
173         if (dialog->priv->merge != NULL) {
174                 g_object_unref (G_OBJECT (dialog->priv->merge));
175         }
176         g_free (dialog->priv);
177
178         G_OBJECT_CLASS (gl_merge_properties_dialog_parent_class)->finalize (object);
179         gl_debug (DEBUG_MERGE, "END");
180 }
181
182 /*****************************************************************************/
183 /* NEW merge properties dialog.                                              */
184 /*****************************************************************************/
185 GtkWidget*
186 gl_merge_properties_dialog_new (glLabel   *label,
187                                 GtkWindow *window)
188 {
189         GtkWidget *dialog;
190
191         gl_debug (DEBUG_MERGE, "START");
192
193         dialog = GTK_WIDGET (g_object_new (GL_TYPE_MERGE_PROPERTIES_DIALOG, NULL));
194
195         gl_merge_properties_dialog_construct (GL_MERGE_PROPERTIES_DIALOG (dialog),
196                                               label, window);
197
198         gl_debug (DEBUG_MERGE, "END");
199
200         return dialog;
201 }
202
203 /*--------------------------------------------------------------------------*/
204 /* PRIVATE.  Create merge widgets.                                          */
205 /*--------------------------------------------------------------------------*/
206 static void
207 gl_merge_properties_dialog_construct (glMergePropertiesDialog *dialog,
208                                       glLabel                 *label,
209                                       GtkWindow               *window)
210 {
211         GladeXML          *gui;
212         gchar             *description;
213         glMergeSrcType     src_type;
214         gchar             *src;
215         gchar             *name, *title;
216         GList             *texts;
217         GtkWidget         *vbox;
218         GtkCellRenderer   *renderer;
219         GtkTreeViewColumn *column;
220         GtkTreeSelection  *selection;
221
222         gl_debug (DEBUG_MERGE, "START");
223
224         g_return_if_fail (GL_IS_MERGE_PROPERTIES_DIALOG (dialog));
225         g_return_if_fail (dialog->priv != NULL);
226
227         if (window) {
228                 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(window));
229                 gtk_window_set_destroy_with_parent (GTK_WINDOW(dialog), TRUE);
230         }
231
232         gui = glade_xml_new (GLABELS_GLADE_DIR "merge-properties-dialog.glade",
233                              "merge_properties_vbox", NULL);
234
235         if (!gui) {
236                 g_critical ("Could not open merge-properties-dialog.glade. gLabels may not be installed correctly!");
237                 return;
238         }
239
240         vbox = glade_xml_get_widget (gui, "merge_properties_vbox");
241         gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox);
242
243         dialog->priv->type_combo    = glade_xml_get_widget (gui, "type_combo");
244         dialog->priv->location_vbox = glade_xml_get_widget (gui, "location_vbox");
245         dialog->priv->treeview      = glade_xml_get_widget (gui, "treeview");
246
247         dialog->priv->select_all_button   = glade_xml_get_widget (gui, "select_all_button");
248         dialog->priv->unselect_all_button = glade_xml_get_widget (gui, "unselect_all_button");
249
250         g_object_unref (gui);
251
252         gl_util_combo_box_add_text_model (GTK_COMBO_BOX (dialog->priv->type_combo));
253
254         dialog->priv->label = label;
255
256         dialog->priv->merge = gl_label_get_merge (dialog->priv->label);
257         description         = gl_merge_get_description (dialog->priv->merge);
258         src_type            = gl_merge_get_src_type (dialog->priv->merge);
259         src                 = gl_merge_get_src (dialog->priv->merge);
260
261         /* --- Window title --- */
262         name = gl_label_get_short_name (label);
263         title = g_strdup_printf ("%s %s", name, _("Merge Properties"));
264         gtk_window_set_title (GTK_WINDOW (dialog), title);
265         g_free (name);
266         g_free (title);
267
268         texts = gl_merge_get_descriptions ();
269         gl_debug (DEBUG_MERGE, "DESCRIPTIONS:");
270         {
271                 GList *p;
272
273                 for (p=texts; p!=NULL; p=p->next) {
274                         gl_debug (DEBUG_MERGE, "    \"%s\"", p->data);
275                 }
276         }
277         gl_util_combo_box_set_strings (GTK_COMBO_BOX (dialog->priv->type_combo),
278                                        texts);
279         gl_merge_free_descriptions (&texts);
280         gl_util_combo_box_set_active_text (GTK_COMBO_BOX (dialog->priv->type_combo),
281                                            description);
282         g_signal_connect (G_OBJECT (dialog->priv->type_combo), "changed",
283                           G_CALLBACK (type_changed_cb), dialog);
284
285         gl_debug (DEBUG_MERGE, "Src_type = %d", src_type);
286         switch (src_type) {
287         case GL_MERGE_SRC_IS_FILE:
288                 dialog->priv->src_entry =
289                         gtk_file_chooser_button_new (_("Select merge-database source"),
290                                                      GTK_FILE_CHOOSER_ACTION_OPEN);
291                 gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (dialog->priv->src_entry),
292                                                src);
293                 g_signal_connect (G_OBJECT (dialog->priv->src_entry),
294                                   "selection-changed",
295                                   G_CALLBACK (src_changed_cb), dialog);
296                 break;
297         default:
298                 dialog->priv->src_entry = gtk_label_new (_("N/A"));
299                 gtk_misc_set_alignment (GTK_MISC (dialog->priv->src_entry), 0.0, 0.5);
300                 break;
301         }
302         gtk_box_pack_start (GTK_BOX (dialog->priv->location_vbox),
303                             dialog->priv->src_entry, FALSE, FALSE, 0);
304         gtk_widget_show_all (GTK_WIDGET (dialog->priv->location_vbox));
305
306         dialog->priv->store = gtk_tree_store_new (N_COLUMNS,
307                                           G_TYPE_BOOLEAN, /* Record selector */
308                                           G_TYPE_STRING,  /* Record/Field name */
309                                           G_TYPE_STRING,  /* Field value */
310                                           G_TYPE_BOOLEAN, /* Is Record? */
311                                           G_TYPE_POINTER  /* Pointer to record */);
312         load_tree (dialog->priv->store, dialog->priv->merge);
313
314         gtk_tree_view_set_model (GTK_TREE_VIEW (dialog->priv->treeview),
315                                  GTK_TREE_MODEL (dialog->priv->store));
316
317         gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (dialog->priv->treeview),
318                                       TRUE);
319         selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->priv->treeview));
320         gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE);
321         renderer = gtk_cell_renderer_toggle_new ();
322         g_signal_connect (G_OBJECT (renderer), "toggled",
323                           G_CALLBACK (record_select_toggled_cb), dialog->priv->store);
324         column = gtk_tree_view_column_new_with_attributes (_("Select"), renderer,
325                                                            "active", SELECT_COLUMN,
326                                                            "visible", IS_RECORD_COLUMN,
327                                                            NULL);
328         gtk_tree_view_column_set_clickable (column, TRUE);
329         gtk_tree_view_append_column (GTK_TREE_VIEW (dialog->priv->treeview), column);
330         renderer = gtk_cell_renderer_text_new ();
331         gtk_object_set (GTK_OBJECT (renderer), "yalign", 0.0, NULL);
332         column = gtk_tree_view_column_new_with_attributes (_("Record/Field"), renderer,
333                                                            "text", RECORD_FIELD_COLUMN,
334                                                            NULL);
335         gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
336         gtk_tree_view_append_column (GTK_TREE_VIEW (dialog->priv->treeview), column);
337         gtk_tree_view_set_expander_column (GTK_TREE_VIEW (dialog->priv->treeview), column);
338         renderer = gtk_cell_renderer_text_new ();
339         gtk_object_set (GTK_OBJECT (renderer), "yalign", 0.0, NULL);
340         column = gtk_tree_view_column_new_with_attributes (_("Data"), renderer,
341                                                            "text", VALUE_COLUMN,
342                                                            NULL);
343         gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
344         gtk_tree_view_append_column (GTK_TREE_VIEW (dialog->priv->treeview), column);
345
346         g_signal_connect (G_OBJECT (dialog->priv->select_all_button),
347                           "clicked",
348                           G_CALLBACK (select_all_button_clicked_cb), dialog);
349
350         g_signal_connect (G_OBJECT (dialog->priv->unselect_all_button),
351                           "clicked",
352                           G_CALLBACK (unselect_all_button_clicked_cb), dialog);
353
354
355         g_free (src);
356         g_free (description);
357
358         gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
359
360         gl_debug (DEBUG_MERGE, "END");
361 }
362
363 /*--------------------------------------------------------------------------*/
364 /* PRIVATE.  type "changed" callback.                                       */
365 /*--------------------------------------------------------------------------*/
366 static void
367 type_changed_cb (GtkWidget               *widget,
368                  glMergePropertiesDialog *dialog)
369 {
370         gchar             *description;
371         gchar             *name;
372         gchar             *src;
373         glMergeSrcType     src_type;
374
375         gl_debug (DEBUG_MERGE, "START");
376
377         description = gtk_combo_box_get_active_text (GTK_COMBO_BOX (dialog->priv->type_combo));
378         name = gl_merge_description_to_name (description);
379
380         src = gl_merge_get_src (dialog->priv->merge); /* keep current src if possible */
381         if ( src != NULL ) {
382                 gl_debug (DEBUG_MERGE, "Saving src = \"%s\"", src);
383                 g_free (dialog->priv->saved_src);
384                 dialog->priv->saved_src = src;
385         }
386
387         if (dialog->priv->merge != NULL) {
388                 g_object_unref (G_OBJECT(dialog->priv->merge));
389         }
390         dialog->priv->merge = gl_merge_new (name);
391
392         gtk_widget_destroy (dialog->priv->src_entry);
393         src_type = gl_merge_get_src_type (dialog->priv->merge);
394         switch (src_type) {
395         case GL_MERGE_SRC_IS_FILE:
396                 dialog->priv->src_entry =
397                         gtk_file_chooser_button_new (_("Select merge-database source"),
398                                                      GTK_FILE_CHOOSER_ACTION_OPEN);
399                 if (dialog->priv->saved_src != NULL) {
400                         gl_debug (DEBUG_MERGE, "Setting src = \"%s\"", dialog->priv->saved_src);
401                         gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (dialog->priv->src_entry),
402                                                        dialog->priv->saved_src);
403                         gl_merge_set_src (dialog->priv->merge, dialog->priv->saved_src);
404                 }
405                 g_signal_connect (G_OBJECT (dialog->priv->src_entry),
406                                   "selection-changed",
407                                   G_CALLBACK (src_changed_cb), dialog);
408                 break;
409         case GL_MERGE_SRC_IS_FIXED:
410                 dialog->priv->src_entry = gtk_label_new (_("Fixed"));
411                 gtk_misc_set_alignment (GTK_MISC (dialog->priv->src_entry), 0.0, 0.5);
412
413                 gl_debug (DEBUG_MERGE, "Setting src = \"%s\"", dialog->priv->saved_src);
414                 gl_merge_set_src (dialog->priv->merge, "Fixed");
415                 break;
416         default:
417                 dialog->priv->src_entry = gtk_label_new (_("N/A"));
418                 gtk_misc_set_alignment (GTK_MISC (dialog->priv->src_entry), 0.0, 0.5);
419                 break;
420         }
421         gtk_box_pack_start( GTK_BOX (dialog->priv->location_vbox),
422                             dialog->priv->src_entry, FALSE, FALSE, 0);
423         gtk_widget_show_all (dialog->priv->location_vbox);
424
425         load_tree (dialog->priv->store, dialog->priv->merge);
426
427         g_free (description);
428         g_free (name);
429
430         gl_debug (DEBUG_MERGE, "END");
431 }
432
433 /*--------------------------------------------------------------------------*/
434 /* PRIVATE.  source "changed" callback.                                     */
435 /*--------------------------------------------------------------------------*/
436 static void
437 src_changed_cb (GtkWidget               *widget,
438                 glMergePropertiesDialog *dialog)
439 {
440         gchar     *src, *orig_src;
441
442         gl_debug (DEBUG_MERGE, "START");
443
444         orig_src = gl_merge_get_src (dialog->priv->merge);
445         src = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog->priv->src_entry));
446
447         gl_debug (DEBUG_MERGE, "orig=\"%s\", new=\"%s\"\n", orig_src, src);
448
449         if (((orig_src == NULL) && (src != NULL)) ||
450             ((orig_src != NULL) && (src == NULL)) ||
451             ((orig_src != NULL) && (src != NULL) && strcmp (src, orig_src)))
452         {
453                 gl_merge_set_src (dialog->priv->merge, src);
454                 load_tree (dialog->priv->store, dialog->priv->merge);
455         }
456
457         g_free (orig_src);
458         g_free (src);
459
460
461         gl_debug (DEBUG_MERGE, "END");
462 }
463
464 /*--------------------------------------------------------------------------*/
465 /* PRIVATE.  response callback.                                             */
466 /*--------------------------------------------------------------------------*/
467 static void
468 response_cb (glMergePropertiesDialog *dialog,
469              gint                     response,
470              gpointer                 user_data)
471 {
472         gl_debug (DEBUG_MERGE, "START");
473
474         switch (response) {
475
476         case GTK_RESPONSE_OK:
477                 gl_label_set_merge (dialog->priv->label, dialog->priv->merge);
478                 gtk_widget_hide (GTK_WIDGET (dialog));
479                 break;
480         case GTK_RESPONSE_CANCEL:
481                 /* Let the dialog get rebuilt next time to recover state. */
482                 gtk_widget_destroy (GTK_WIDGET (dialog));
483                 break;
484         case GTK_RESPONSE_DELETE_EVENT:
485                 break;
486         default:
487                 g_print ("response = %d", response);
488                 g_assert_not_reached ();
489         }
490
491         gl_debug (DEBUG_MERGE, "END");
492 }
493
494 /*--------------------------------------------------------------------------*/
495 /* PRIVATE.  Load tree store from merge data.                               */
496 /*--------------------------------------------------------------------------*/
497 static void
498 load_tree (GtkTreeStore           *store,
499            glMerge                *merge)
500 {
501         const GList   *record_list;
502         GList         *p_rec, *p_field;
503         glMergeRecord *record;
504         glMergeField  *field;
505         GtkTreeIter    iter1, iter2;
506         gchar         *primary_key;
507         gchar         *primary_value;
508
509         gl_debug (DEBUG_MERGE, "START");
510
511         gtk_tree_store_clear (store);
512
513         primary_key = gl_merge_get_primary_key (merge);
514         record_list = gl_merge_get_record_list (merge);
515
516         for ( p_rec=(GList *)record_list; p_rec!=NULL; p_rec=p_rec->next ) {
517                 record = (glMergeRecord *)p_rec->data;
518                 
519                 primary_value = gl_merge_eval_key (record, primary_key);
520
521                 gtk_tree_store_append (store, &iter1, NULL);
522                 gtk_tree_store_set (store, &iter1,
523                                     SELECT_COLUMN,       record->select_flag,
524                                     RECORD_FIELD_COLUMN, primary_value,
525                                     IS_RECORD_COLUMN,    TRUE,
526                                     DATA_COLUMN,         record,
527                                     -1);
528
529                 g_free (primary_value);
530
531                 for ( p_field=record->field_list; p_field!=NULL; p_field=p_field->next ) {
532                         field = (glMergeField *)p_field->data;
533
534                         gtk_tree_store_append (store, &iter2, &iter1);
535                         gtk_tree_store_set (store, &iter2,
536                                             RECORD_FIELD_COLUMN, field->key,
537                                             VALUE_COLUMN,        field->value,
538                                             IS_RECORD_COLUMN,    FALSE,
539                                             -1);
540                 }
541         }
542
543         g_free (primary_key);
544
545         gl_debug (DEBUG_MERGE, "END");
546 }
547
548 /*--------------------------------------------------------------------------*/
549 /* PRIVATE.  Record select toggled.                                         */
550 /*--------------------------------------------------------------------------*/
551 static void
552 record_select_toggled_cb (GtkCellRendererToggle *cell,
553                           gchar                 *path_str,
554                           GtkTreeStore          *store)
555 {
556         GtkTreePath   *path;
557         GtkTreeIter    iter;
558         glMergeRecord *record;
559
560         gl_debug (DEBUG_MERGE, "START");
561
562         /* get toggled iter */
563         path = gtk_tree_path_new_from_string (path_str);
564         gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, path);
565
566         /* get current data */
567         gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
568                             DATA_COLUMN,   &record,
569                             -1);
570
571         /* toggle the select flag within the record */
572         record->select_flag ^= 1;
573
574         /* set new value in store */
575         gtk_tree_store_set (store, &iter,
576                             SELECT_COLUMN, record->select_flag,
577                             -1);
578
579         /* clean up */
580         gtk_tree_path_free (path);
581
582         gl_debug (DEBUG_MERGE, "END");
583 }
584
585 /*--------------------------------------------------------------------------*/
586 /* PRIVATE.  "Select All" button callback.                                  */
587 /*--------------------------------------------------------------------------*/
588 static void
589 select_all_button_clicked_cb (GtkWidget                    *widget,
590                               glMergePropertiesDialog      *dialog)
591 {
592         GtkTreeModel  *store = GTK_TREE_MODEL (dialog->priv->store);
593         GtkTreeIter    iter;
594         glMergeRecord *record;
595         gboolean       good;
596
597         gl_debug (DEBUG_MERGE, "START");
598
599         for ( good = gtk_tree_model_get_iter_first (store, &iter);
600               good;
601               good = gtk_tree_model_iter_next (store, &iter) )
602         {
603                 
604                 /* get current data */
605                 gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
606                                     DATA_COLUMN,   &record,
607                                     -1);
608
609                 
610                 /* Set select flag within the record */
611                 record->select_flag = TRUE;
612
613                 /* set new value in store */
614                 gtk_tree_store_set (GTK_TREE_STORE (store), &iter,
615                                     SELECT_COLUMN, record->select_flag,
616                                     -1);
617
618         }
619
620         gl_debug (DEBUG_MERGE, "END");
621 }
622
623 /*--------------------------------------------------------------------------*/
624 /* PRIVATE.  "Unselect All" button callback.                                */
625 /*--------------------------------------------------------------------------*/
626 static void
627 unselect_all_button_clicked_cb (GtkWidget                    *widget,
628                                 glMergePropertiesDialog      *dialog)
629 {
630         GtkTreeModel  *store = GTK_TREE_MODEL (dialog->priv->store);
631         GtkTreeIter    iter;
632         glMergeRecord *record;
633         gboolean       good;
634
635         gl_debug (DEBUG_MERGE, "START");
636
637         for ( good = gtk_tree_model_get_iter_first (store, &iter);
638               good;
639               good = gtk_tree_model_iter_next (store, &iter) )
640         {
641                 
642                 /* get current data */
643                 gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
644                                     DATA_COLUMN,   &record,
645                                     -1);
646
647                 
648                 /* Set select flag within the record */
649                 record->select_flag = FALSE;
650
651                 /* set new value in store */
652                 gtk_tree_store_set (GTK_TREE_STORE (store), &iter,
653                                     SELECT_COLUMN, record->select_flag,
654                                     -1);
655
656         }
657
658         gl_debug (DEBUG_MERGE, "END");
659 }