Statistics
| Revision:

root / src / importldif.c @ 3038

History | View | Annotate | Download (26 kB)

1
/*
2
 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3
 * Copyright (C) 2001 Match Grun
4
 *
5
 * This program is free software; you can redistribute it and/or modify
6
 * it under the terms of the GNU General Public License as published by
7
 * the Free Software Foundation; either version 2 of the License, or
8
 * (at your option) any later version.
9
 *
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.
14
 *
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, USA.
18
 */
19
20
#ifdef HAVE_CONFIG_H
21
#  include "config.h"
22
#endif
23
24
#include "defs.h"
25
26
#include <glib.h>
27
#include <glib/gi18n.h>
28
#include <gdk/gdkkeysyms.h>
29
#include <gtk/gtkwindow.h>
30
#include <gtk/gtksignal.h>
31
#include <gtk/gtkvbox.h>
32
#include <gtk/gtklabel.h>
33
#include <gtk/gtkentry.h>
34
#include <gtk/gtktable.h>
35
#include <gtk/gtkbutton.h>
36
#include <gtk/gtkhbbox.h>
37
#include <gtk/gtkcheckbutton.h>
38
#include <gtk/gtktogglebutton.h>
39
#include <gtk/gtkstatusbar.h>
40
#include <gtk/gtknotebook.h>
41
#include <gtk/gtkstock.h>
42
43
#include "addrbook.h"
44
#include "addressbook.h"
45
#include "addressitem.h"
46
#include "filesel.h"
47
#include "gtkutils.h"
48
#include "stock_pixmap.h"
49
#include "prefs_common.h"
50
#include "manage_window.h"
51
#include "mgutils.h"
52
#include "ldif.h"
53
#include "codeconv.h"
54
#include "utils.h"
55
56
#define IMPORTLDIF_GUESS_NAME "LDIF Import"
57
58
#define PAGE_FILE_INFO             0
59
#define PAGE_ATTRIBUTES            1
60
#define PAGE_FINISH                2
61
62
#define IMPORTLDIF_WIDTH           380
63
#define IMPORTLDIF_HEIGHT          300
64
65
#define FIELDS_N_COLS              3
66
#define FIELDS_COL_WIDTH_SELECT    10
67
#define FIELDS_COL_WIDTH_FIELD     140
68
#define FIELDS_COL_WIDTH_ATTRIB    140
69
70
typedef enum {
71
        FIELD_COL_SELECT  = 0,
72
        FIELD_COL_FIELD   = 1,
73
        FIELD_COL_ATTRIB  = 2
74
} ImpLdif_FieldColPos;
75
76
static struct _ImpLdif_Dlg {
77
        GtkWidget *window;
78
        GtkWidget *notebook;
79
        GtkWidget *file_entry;
80
        GtkWidget *name_entry;
81
        GtkWidget *clist_field;
82
        GtkWidget *name_ldif;
83
        GtkWidget *name_attrib;
84
        GtkWidget *check_select;
85
        GtkWidget *labelBook;
86
        GtkWidget *labelFile;
87
        GtkWidget *labelRecords;
88
        GtkWidget *btnPrev;
89
        GtkWidget *btnNext;
90
        GtkWidget *btnCancel;
91
        GtkWidget *statusbar;
92
        gint      status_cid;
93
        gint      rowIndSelect;
94
        gint      rowCount;
95
        gchar     *nameBook;
96
        gchar     *fileName;
97
        gboolean  cancelled;
98
} impldif_dlg;
99
100
static AddressBookFile *_importedBook_;
101
static AddressIndex *_imp_addressIndex_;
102
static LdifFile *_ldifFile_ = NULL;
103
104
static GdkPixmap *markxpm;
105
static GdkBitmap *markxpmmask;
106
107
static void imp_ldif_status_show( gchar *msg ) {
108
        if( impldif_dlg.statusbar != NULL ) {
109
                gtk_statusbar_pop( GTK_STATUSBAR(impldif_dlg.statusbar), impldif_dlg.status_cid );
110
                if( msg ) {
111
                        gtk_statusbar_push( GTK_STATUSBAR(impldif_dlg.statusbar), impldif_dlg.status_cid, msg );
112
                }
113
        }
114
}
115
116
static void imp_ldif_message( void ) {
117
        gchar *sMsg = NULL;
118
        gint pageNum;
119
120
        pageNum = gtk_notebook_get_current_page( GTK_NOTEBOOK(impldif_dlg.notebook) );
121
        if( pageNum == PAGE_FILE_INFO ) {
122
                sMsg = _( "Please specify address book name and file to import." );
123
        }
124
        else if( pageNum == PAGE_ATTRIBUTES ) {
125
                sMsg = _( "Select and rename LDIF field names to import." );
126
        }
127
        else if( pageNum == PAGE_FINISH ) {
128
                sMsg = _( "File imported." );
129
        }
130
        imp_ldif_status_show( sMsg );
131
}
132
133
static gchar *imp_ldif_guess_file( AddressBookFile *abf ) {
134
        gchar *newFile = NULL;
135
        GList *fileList = NULL;
136
        gint fileNum = 1;
137
        fileList = addrbook_get_bookfile_list( abf );
138
        if( fileList ) {
139
                fileNum = 1 + abf->maxValue;
140
        }
141
        newFile = addrbook_gen_new_file_name( fileNum );
142
        g_list_free( fileList );
143
        fileList = NULL;
144
        return newFile;
145
}
146
147
static void imp_ldif_update_row( GtkCList *clist ) {
148
        Ldif_FieldRec *rec;
149
        gchar *text[ FIELDS_N_COLS ];
150
        gint row;
151
152
        if( impldif_dlg.rowIndSelect < 0 ) return;
153
        row = impldif_dlg.rowIndSelect;
154
155
        rec = gtk_clist_get_row_data( clist, row );
156
        text[ FIELD_COL_SELECT ] = "";
157
        text[ FIELD_COL_FIELD  ] = rec->tagName;
158
        text[ FIELD_COL_ATTRIB ] = rec->userName;
159
160
        gtk_clist_freeze( clist );
161
        gtk_clist_remove( clist, row );
162
        if( row == impldif_dlg.rowCount - 1 ) {
163
                gtk_clist_append( clist, text );
164
        }
165
        else {
166
                gtk_clist_insert( clist, row, text );
167
        }
168
        if( rec->selected )
169
                gtk_clist_set_pixmap( clist, row, FIELD_COL_SELECT, markxpm, markxpmmask );
170
171
        gtk_clist_set_row_data( clist, row, rec );
172
        gtk_clist_thaw( clist );
173
}
174
175
static void imp_ldif_load_fields( LdifFile *ldf ) {
176
        GtkCList *clist = GTK_CLIST(impldif_dlg.clist_field);
177
        GList *node, *list;
178
        gchar *text[ FIELDS_N_COLS ];
179
180
        impldif_dlg.rowIndSelect = -1;
181
        impldif_dlg.rowCount = 0;
182
        if( ! ldf->accessFlag ) return;
183
        gtk_clist_clear( clist );
184
        list = ldif_get_fieldlist( ldf );
185
        node = list;
186
        while( node ) {
187
                Ldif_FieldRec *rec = node->data;
188
                gint row;
189
190
                if( ! rec->reserved ) {
191
                        text[ FIELD_COL_SELECT ] = "";
192
                        text[ FIELD_COL_FIELD  ] = rec->tagName;
193
                        text[ FIELD_COL_ATTRIB ] = rec->userName;
194
                        row = gtk_clist_append( clist, text );
195
                        gtk_clist_set_row_data( clist, row, rec );
196
                        if( rec->selected )
197
                                gtk_clist_set_pixmap( clist, row, FIELD_COL_SELECT, markxpm, markxpmmask );
198
                        impldif_dlg.rowCount++;
199
                }
200
                node = g_list_next( node );
201
        }
202
        g_list_free( list );
203
        list = NULL;
204
        ldif_set_accessed( ldf, FALSE );
205
}
206
207
static void imp_ldif_field_list_selected( GtkCList *clist, gint row, gint column, GdkEvent *event, gpointer data ) {
208
        Ldif_FieldRec *rec = gtk_clist_get_row_data( clist, row );
209
210
        impldif_dlg.rowIndSelect = row;
211
        gtk_entry_set_text( GTK_ENTRY(impldif_dlg.name_attrib), "" );
212
        if( rec ) {
213
                gtk_label_set_text( GTK_LABEL(impldif_dlg.name_ldif), rec->tagName );
214
                if( rec->userName )
215
                        gtk_entry_set_text( GTK_ENTRY(impldif_dlg.name_attrib), rec->userName );
216
                gtk_toggle_button_set_active(
217
                        GTK_TOGGLE_BUTTON( impldif_dlg.check_select),
218
                        rec->selected );
219
        }
220
        gtk_widget_grab_focus(impldif_dlg.name_attrib);
221
}
222
223
static gboolean imp_ldif_field_list_toggle( GtkCList *clist, GdkEventButton *event, gpointer data ) {
224
        if( ! event ) return FALSE;
225
        if( impldif_dlg.rowIndSelect < 0 ) return FALSE;
226
        if( event->button == 1 ) {
227
                if( event->type == GDK_2BUTTON_PRESS ) {
228
                        Ldif_FieldRec *rec = gtk_clist_get_row_data( clist, impldif_dlg.rowIndSelect );
229
                        if( rec ) {
230
                                rec->selected = ! rec->selected;
231
                                imp_ldif_update_row( clist );
232
                        }
233
                }
234
        }
235
        return FALSE;
236
}
237
238
static void imp_ldif_modify_pressed( GtkWidget *widget, gpointer data ) {
239
        GtkCList *clist = GTK_CLIST(impldif_dlg.clist_field);
240
        Ldif_FieldRec *rec;
241
        gint row;
242
243
        if( impldif_dlg.rowIndSelect < 0 ) return;
244
        row = impldif_dlg.rowIndSelect;
245
        rec = gtk_clist_get_row_data( clist, impldif_dlg.rowIndSelect );
246
247
        g_free( rec->userName );
248
        rec->userName = gtk_editable_get_chars( GTK_EDITABLE(impldif_dlg.name_attrib), 0, -1 );
249
        rec->selected = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( impldif_dlg.check_select) );
250
        imp_ldif_update_row( clist );
251
        gtk_clist_select_row( clist, row, 0 );
252
        gtk_label_set_text( GTK_LABEL(impldif_dlg.name_ldif), "" );
253
        gtk_entry_set_text( GTK_ENTRY(impldif_dlg.name_attrib), "" );
254
        gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( impldif_dlg.check_select), FALSE );
255
}
256
257
/*
258
* Move off fields page.
259
* return: TRUE if OK to move off page.
260
*/
261
static gboolean imp_ldif_field_move() {
262
        gboolean retVal = FALSE;
263
        gchar *newFile;
264
        AddressBookFile *abf = NULL;
265
266
        if( _importedBook_ ) {
267
                addrbook_free_book( _importedBook_ );
268
        }
269
270
        abf = addrbook_create_book();
271
        addrbook_set_path( abf, _imp_addressIndex_->filePath );
272
        addrbook_set_name( abf, impldif_dlg.nameBook );
273
        newFile = imp_ldif_guess_file( abf );
274
        addrbook_set_file( abf, newFile );
275
        g_free( newFile );
276
277
        /* Import data into file */
278
        if( ldif_import_data( _ldifFile_, abf->addressCache ) == MGU_SUCCESS ) {
279
                addrbook_save_data( abf );
280
                abf->dirtyFlag = TRUE;
281
                _importedBook_ = abf;
282
                retVal = TRUE;
283
        }
284
        else {
285
                addrbook_free_book( abf );
286
        }
287
288
        return retVal;
289
}
290
291
/*
292
* Move off fields page.
293
* return: TRUE if OK to move off page.
294
*/
295
static gboolean imp_ldif_file_move() {
296
        gboolean retVal = FALSE;
297
        gchar *sName;
298
        gchar *sFile;
299
        gchar *sMsg = NULL;
300
        gboolean errFlag = FALSE;
301
302
        sFile = gtk_editable_get_chars( GTK_EDITABLE(impldif_dlg.file_entry), 0, -1 );
303
        g_strchug( sFile ); g_strchomp( sFile );
304
305
        sName = gtk_editable_get_chars( GTK_EDITABLE(impldif_dlg.name_entry), 0, -1 );
306
        g_strchug( sName ); g_strchomp( sName );
307
308
        g_free( impldif_dlg.nameBook );
309
        g_free( impldif_dlg.fileName );
310
        impldif_dlg.nameBook = sName;
311
        impldif_dlg.fileName = sFile;
312
313
        gtk_entry_set_text( GTK_ENTRY(impldif_dlg.file_entry), sFile );
314
        gtk_entry_set_text( GTK_ENTRY(impldif_dlg.name_entry), sName );
315
316
        if( *sFile == '\0'|| strlen( sFile ) < 1 ) {
317
                sMsg = _( "Please select a file." );
318
                gtk_widget_grab_focus(impldif_dlg.file_entry);
319
                errFlag = TRUE;
320
        }
321
322
        if( *sName == '\0'|| strlen( sName ) < 1 ) {
323
                if( ! errFlag ) sMsg = _( "Address book name must be supplied." );
324
                gtk_widget_grab_focus(impldif_dlg.name_entry);
325
                errFlag = TRUE;
326
        }
327
328
        if( ! errFlag ) {
329
                gchar *sFSFile;
330
                /* Read attribute list */
331
                sFSFile = conv_filename_from_utf8( sFile );
332
                ldif_set_file( _ldifFile_, sFSFile );
333
                g_free( sFSFile );
334
                if( ldif_read_tags( _ldifFile_ ) == MGU_SUCCESS ) {
335
                        /* Load fields */
336
                        /* ldif_print_file( _ldifFile_, stdout ); */
337
                        imp_ldif_load_fields( _ldifFile_ );
338
                        retVal = TRUE;
339
                }
340
                else {
341
                        sMsg = _( "Error reading LDIF fields." );
342
                }
343
        }
344
        imp_ldif_status_show( sMsg );
345
346
        return retVal;
347
}
348
349
/*
350
 * Display finish page.
351
 */
352
static void imp_ldif_finish_show() {
353
        gchar *sMsg;
354
        gchar *name;
355
356
        name = gtk_editable_get_chars( GTK_EDITABLE(impldif_dlg.name_entry), 0, -1 );
357
        gtk_label_set_text( GTK_LABEL(impldif_dlg.labelBook), name );
358
        g_free( name );
359
        gtk_label_set_text( GTK_LABEL(impldif_dlg.labelFile), _ldifFile_->path );
360
        gtk_label_set_text( GTK_LABEL(impldif_dlg.labelRecords), itos( _ldifFile_->importCount ) );
361
        gtk_widget_set_sensitive( impldif_dlg.btnPrev, FALSE );
362
        gtk_widget_set_sensitive( impldif_dlg.btnNext, FALSE );
363
        if( _ldifFile_->retVal == MGU_SUCCESS ) {
364
                sMsg = _( "LDIF file imported successfully." );
365
        }
366
        else {
367
                sMsg = mgu_error2string( _ldifFile_->retVal );
368
        }
369
        imp_ldif_status_show( sMsg );
370
        gtk_button_set_label(GTK_BUTTON(impldif_dlg.btnCancel), GTK_STOCK_CLOSE);
371
        gtk_widget_grab_focus(impldif_dlg.btnCancel);
372
}
373
374
static void imp_ldif_prev( GtkWidget *widget ) {
375
        gint pageNum;
376
377
        pageNum = gtk_notebook_get_current_page( GTK_NOTEBOOK(impldif_dlg.notebook) );
378
        if( pageNum == PAGE_ATTRIBUTES ) {
379
                /* Goto file page stuff */
380
                gtk_notebook_set_current_page(
381
                        GTK_NOTEBOOK(impldif_dlg.notebook), PAGE_FILE_INFO );
382
                gtk_widget_set_sensitive( impldif_dlg.btnPrev, FALSE );
383
        }
384
        imp_ldif_message();
385
}
386
387
static void imp_ldif_next( GtkWidget *widget ) {
388
        gint pageNum;
389
390
        pageNum = gtk_notebook_get_current_page( GTK_NOTEBOOK(impldif_dlg.notebook) );
391
        if( pageNum == PAGE_FILE_INFO ) {
392
                /* Goto attributes stuff */
393
                if( imp_ldif_file_move() ) {
394
                        gtk_notebook_set_current_page(
395
                                GTK_NOTEBOOK(impldif_dlg.notebook), PAGE_ATTRIBUTES );
396
                        imp_ldif_message();
397
                        gtk_widget_set_sensitive( impldif_dlg.btnPrev, TRUE );
398
                }
399
                else {
400
                        gtk_widget_set_sensitive( impldif_dlg.btnPrev, FALSE );
401
                }
402
        }
403
        else if( pageNum == PAGE_ATTRIBUTES ) {
404
                /* Goto finish stuff */
405
                if( imp_ldif_field_move() ) {
406
                        gtk_notebook_set_current_page(
407
                                GTK_NOTEBOOK(impldif_dlg.notebook), PAGE_FINISH );
408
                        imp_ldif_finish_show();
409
                }
410
        }
411
}
412
413
static void imp_ldif_cancel( GtkWidget *widget, gpointer data ) {
414
        gint pageNum;
415
416
        pageNum = gtk_notebook_get_current_page( GTK_NOTEBOOK(impldif_dlg.notebook) );
417
        if( pageNum != PAGE_FINISH ) {
418
                impldif_dlg.cancelled = TRUE;
419
        }
420
        gtk_main_quit();
421
}
422
423
static void imp_ldif_file_select( void ) {
424
        gchar *sSelFile;
425
426
        sSelFile = filesel_select_file( _("Select LDIF File"), NULL,
427
                                        GTK_FILE_CHOOSER_ACTION_OPEN );
428
        if ( sSelFile ) {
429
                gchar *sUTF8File;
430
                sUTF8File = conv_filename_to_utf8( sSelFile );
431
                gtk_entry_set_text( GTK_ENTRY(impldif_dlg.file_entry), sUTF8File );
432
                g_free( sUTF8File );
433
                g_free( sSelFile );
434
        }
435
}
436
437
static gint imp_ldif_delete_event( GtkWidget *widget, GdkEventAny *event, gpointer data ) {
438
        imp_ldif_cancel( widget, data );
439
        return TRUE;
440
}
441
442
static gboolean imp_ldif_key_pressed( GtkWidget *widget, GdkEventKey *event, gpointer data ) {
443
        if (event && event->keyval == GDK_Escape) {
444
                imp_ldif_cancel( widget, data );
445
        }
446
        return FALSE;
447
}
448
449
static void imp_ldif_page_file( gint pageNum, gchar *pageLbl ) {
450
        GtkWidget *vbox;
451
        GtkWidget *table;
452
        GtkWidget *label;
453
        GtkWidget *file_entry;
454
        GtkWidget *name_entry;
455
        GtkWidget *file_btn;
456
        gint top;
457
458
        vbox = gtk_vbox_new(FALSE, 8);
459
        gtk_container_add( GTK_CONTAINER( impldif_dlg.notebook ), vbox );
460
        gtk_container_set_border_width( GTK_CONTAINER (vbox), BORDER_WIDTH );
461
462
        label = gtk_label_new( pageLbl );
463
        gtk_widget_show( label );
464
        gtk_notebook_set_tab_label(
465
                GTK_NOTEBOOK( impldif_dlg.notebook ),
466
                gtk_notebook_get_nth_page(
467
                        GTK_NOTEBOOK( impldif_dlg.notebook ), pageNum ),
468
                label );
469
470
        table = gtk_table_new(2, 3, FALSE);
471
        gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
472
        gtk_container_set_border_width( GTK_CONTAINER(table), 8 );
473
        gtk_table_set_row_spacings(GTK_TABLE(table), 8);
474
        gtk_table_set_col_spacings(GTK_TABLE(table), 8 );
475
476
        /* First row */
477
        top = 0;
478
        label = gtk_label_new(_("Address Book"));
479
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1),
480
                GTK_FILL, 0, 0, 0);
481
        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
482
483
        name_entry = gtk_entry_new();
484
        gtk_table_attach(GTK_TABLE(table), name_entry, 1, 2, top, (top + 1),
485
                GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
486
487
        /* Second row */
488
        top = 1;
489
        label = gtk_label_new(_("File Name"));
490
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1),
491
                GTK_FILL, 0, 0, 0);
492
        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
493
494
        file_entry = gtk_entry_new();
495
        gtk_table_attach(GTK_TABLE(table), file_entry, 1, 2, top, (top + 1),
496
                GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
497
498
        file_btn = gtk_button_new_with_label( _(" ... "));
499
        gtk_table_attach(GTK_TABLE(table), file_btn, 2, 3, top, (top + 1),
500
                GTK_FILL, 0, 3, 0);
501
502
        gtk_widget_show_all(vbox);
503
504
        /* Button handler */
505
        g_signal_connect(G_OBJECT(file_btn), "clicked",
506
                         G_CALLBACK(imp_ldif_file_select), NULL);
507
508
        impldif_dlg.file_entry = file_entry;
509
        impldif_dlg.name_entry = name_entry;
510
}
511
512
static void imp_ldif_page_fields( gint pageNum, gchar *pageLbl ) {
513
        GtkWidget *vbox;
514
        GtkWidget *vboxt;
515
        GtkWidget *vboxb;
516
        GtkWidget *buttonMod;
517
518
        GtkWidget *table;
519
        GtkWidget *label;
520
        GtkWidget *clist_swin;
521
        GtkWidget *clist_field;
522
        GtkWidget *name_ldif;
523
        GtkWidget *name_attrib;
524
        GtkWidget *check_select;
525
        gint top;
526
527
        gchar *titles[ FIELDS_N_COLS ];
528
        gint i;
529
530
        titles[ FIELD_COL_SELECT ] = _("S");
531
        titles[ FIELD_COL_FIELD  ] = _("LDIF Field");
532
        titles[ FIELD_COL_ATTRIB ] = _("Attribute Name");
533
534
        vbox = gtk_vbox_new(FALSE, 8);
535
        gtk_container_add( GTK_CONTAINER( impldif_dlg.notebook ), vbox );
536
        gtk_container_set_border_width( GTK_CONTAINER (vbox), 4 );
537
538
        label = gtk_label_new( pageLbl );
539
        gtk_widget_show( label );
540
        gtk_notebook_set_tab_label(
541
                GTK_NOTEBOOK( impldif_dlg.notebook ),
542
                gtk_notebook_get_nth_page(GTK_NOTEBOOK( impldif_dlg.notebook ), pageNum ),
543
                label );
544
545
        /* Upper area - Field list */
546
        vboxt = gtk_vbox_new( FALSE, 4 );
547
        gtk_container_add( GTK_CONTAINER( vbox ), vboxt );
548
549
        clist_swin = gtk_scrolled_window_new( NULL, NULL );
550
        gtk_container_add( GTK_CONTAINER(vboxt), clist_swin );
551
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(clist_swin),
552
                                       GTK_POLICY_AUTOMATIC,
553
                                       GTK_POLICY_ALWAYS);
554
555
        clist_field = gtk_clist_new_with_titles( FIELDS_N_COLS, titles );
556
        gtk_container_add( GTK_CONTAINER(clist_swin), clist_field );
557
        gtk_clist_set_selection_mode( GTK_CLIST(clist_field), GTK_SELECTION_BROWSE );
558
        gtk_clist_set_column_width(
559
                        GTK_CLIST(clist_field), FIELD_COL_SELECT, FIELDS_COL_WIDTH_SELECT );
560
        gtk_clist_set_column_width(
561
                        GTK_CLIST(clist_field), FIELD_COL_FIELD, FIELDS_COL_WIDTH_FIELD );
562
        gtk_clist_set_column_width(
563
                        GTK_CLIST(clist_field), FIELD_COL_ATTRIB, FIELDS_COL_WIDTH_ATTRIB );
564
        gtkut_clist_set_redraw( GTK_CLIST(clist_field) );
565
566
        for( i = 0; i < FIELDS_N_COLS; i++ )
567
                GTK_WIDGET_UNSET_FLAGS(GTK_CLIST(clist_field)->column[i].button, GTK_CAN_FOCUS);
568
569
        /* Lower area - Edit area */
570
        vboxb = gtk_vbox_new( FALSE, 4 );
571
        gtk_box_pack_end(GTK_BOX(vbox), vboxb, FALSE, FALSE, 2);
572
573
        /* Data entry area */
574
        table = gtk_table_new( 3, 3, FALSE);
575
        gtk_box_pack_start(GTK_BOX(vboxb), table, FALSE, FALSE, 0);
576
        gtk_table_set_row_spacings(GTK_TABLE(table), 4);
577
        gtk_table_set_col_spacings(GTK_TABLE(table), 4);
578
579
        /* First row */
580
        top = 0;
581
        label = gtk_label_new(_("LDIF Field"));
582
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
583
        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
584
585
        name_ldif = gtk_label_new( "" );
586
        gtk_misc_set_alignment(GTK_MISC(name_ldif), 0.01, 0.5);
587
        gtk_table_attach(GTK_TABLE(table), name_ldif, 1, 3, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
588
589
        /* Second row */
590
        ++top;
591
        label = gtk_label_new(_("Attribute"));
592
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
593
        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
594
595
        name_attrib = gtk_entry_new();
596
        gtk_table_attach(GTK_TABLE(table), name_attrib, 1, 3, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
597
598
        /* Next row */
599
        ++top;
600
        label = gtk_label_new(_("Select"));
601
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
602
        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
603
604
        check_select = gtk_check_button_new();
605
        gtk_table_attach(GTK_TABLE(table), check_select, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
606
607
        buttonMod = gtk_button_new_with_label( _("Modify"));
608
        gtk_table_attach(GTK_TABLE(table), buttonMod, 2, 3, top, (top + 1), GTK_FILL, 0, 3, 0);
609
610
        gtk_widget_show_all(vbox);
611
612
        /* Event handlers */
613
        g_signal_connect( G_OBJECT(clist_field), "select_row",
614
                          G_CALLBACK(imp_ldif_field_list_selected), NULL );
615
        g_signal_connect( G_OBJECT(clist_field), "button_press_event",
616
                          G_CALLBACK(imp_ldif_field_list_toggle), NULL );
617
        g_signal_connect( G_OBJECT(buttonMod), "clicked",
618
                          G_CALLBACK(imp_ldif_modify_pressed), NULL );
619
620
        impldif_dlg.clist_field  = clist_field;
621
        impldif_dlg.name_ldif    = name_ldif;
622
        impldif_dlg.name_attrib  = name_attrib;
623
        impldif_dlg.check_select = check_select;
624
}
625
626
static void imp_ldif_page_finish( gint pageNum, gchar *pageLbl ) {
627
        GtkWidget *vbox;
628
        GtkWidget *table;
629
        GtkWidget *label;
630
        GtkWidget *labelBook;
631
        GtkWidget *labelFile;
632
        GtkWidget *labelRecs;
633
        gint top;
634
635
        vbox = gtk_vbox_new(FALSE, 8);
636
        gtk_container_add( GTK_CONTAINER( impldif_dlg.notebook ), vbox );
637
        gtk_container_set_border_width( GTK_CONTAINER (vbox), BORDER_WIDTH );
638
639
        label = gtk_label_new( pageLbl );
640
        gtk_widget_show( label );
641
        gtk_notebook_set_tab_label(
642
                GTK_NOTEBOOK( impldif_dlg.notebook ),
643
                gtk_notebook_get_nth_page( GTK_NOTEBOOK( impldif_dlg.notebook ), pageNum ), label );
644
645
        table = gtk_table_new(3, 2, FALSE);
646
        gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
647
        gtk_container_set_border_width( GTK_CONTAINER(table), 8 );
648
        gtk_table_set_row_spacings(GTK_TABLE(table), 8);
649
        gtk_table_set_col_spacings(GTK_TABLE(table), 8 );
650
651
        /* First row */
652
        top = 0;
653
        label = gtk_label_new(_("Address Book :"));
654
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
655
        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
656
657
        labelBook = gtk_label_new("");
658
        gtk_table_attach(GTK_TABLE(table), labelBook, 1, 2, top, (top + 1), GTK_FILL, 0, 0, 0);
659
        gtk_misc_set_alignment(GTK_MISC(labelBook), 0, 0.5);
660
661
        /* Second row */
662
        top++;
663
        label = gtk_label_new(_("File Name :"));
664
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
665
        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
666
667
        labelFile = gtk_label_new("");
668
        gtk_table_attach(GTK_TABLE(table), labelFile, 1, 2, top, (top + 1), GTK_FILL, 0, 0, 0);
669
        gtk_misc_set_alignment(GTK_MISC(labelFile), 0, 0.5);
670
671
        /* Third row */
672
        top++;
673
        label = gtk_label_new(_("Records :"));
674
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
675
        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
676
677
        labelRecs = gtk_label_new("");
678
        gtk_table_attach(GTK_TABLE(table), labelRecs, 1, 2, top, (top + 1), GTK_FILL, 0, 0, 0);
679
        gtk_misc_set_alignment(GTK_MISC(labelRecs), 0, 0.5);
680
681
        impldif_dlg.labelBook    = labelBook;
682
        impldif_dlg.labelFile    = labelFile;
683
        impldif_dlg.labelRecords = labelRecs;
684
}
685
686
static void imp_ldif_dialog_create() {
687
        GtkWidget *window;
688
        GtkWidget *vbox;
689
        GtkWidget *vnbox;
690
        GtkWidget *notebook;
691
        GtkWidget *hbbox;
692
        GtkWidget *btnPrev;
693
        GtkWidget *btnNext;
694
        GtkWidget *btnCancel;
695
        GtkWidget *hsbox;
696
        GtkWidget *statusbar;
697
698
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
699
        gtk_widget_set_size_request(window, IMPORTLDIF_WIDTH, IMPORTLDIF_HEIGHT );
700
        gtk_container_set_border_width( GTK_CONTAINER(window), 0 );
701
        gtk_window_set_title( GTK_WINDOW(window), _("Import LDIF file into Address Book") );
702
        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
703
        gtk_window_set_modal(GTK_WINDOW(window), TRUE);        
704
        g_signal_connect(G_OBJECT(window), "delete_event",
705
                         G_CALLBACK(imp_ldif_delete_event), NULL);
706
        g_signal_connect(G_OBJECT(window), "key_press_event",
707
                         G_CALLBACK(imp_ldif_key_pressed), NULL);
708
        MANAGE_WINDOW_SIGNALS_CONNECT(window);
709
710
        vbox = gtk_vbox_new(FALSE, 4);
711
        gtk_widget_show(vbox);
712
        gtk_container_add(GTK_CONTAINER(window), vbox);
713
714
        vnbox = gtk_vbox_new(FALSE, 4);
715
        gtk_container_set_border_width(GTK_CONTAINER(vnbox), 4);
716
        gtk_widget_show(vnbox);
717
        gtk_box_pack_start(GTK_BOX(vbox), vnbox, TRUE, TRUE, 0);
718
719
        /* Notebook */
720
        notebook = gtk_notebook_new();
721
        gtk_notebook_set_show_tabs( GTK_NOTEBOOK(notebook), FALSE );
722
        gtk_widget_show(notebook);
723
        gtk_box_pack_start(GTK_BOX(vnbox), notebook, TRUE, TRUE, 0);
724
        gtk_container_set_border_width(GTK_CONTAINER(notebook), 6);
725
726
        /* Status line */
727
        hsbox = gtk_hbox_new(FALSE, 0);
728
        gtk_box_pack_end(GTK_BOX(vbox), hsbox, FALSE, FALSE, 0);
729
        statusbar = gtk_statusbar_new();
730
        gtk_box_pack_start(GTK_BOX(hsbox), statusbar, TRUE, TRUE, 0);
731
732
        /* Button panel */
733
        gtkut_stock_button_set_create(&hbbox, &btnNext, _("Next"),
734
                                      &btnPrev, _("Prev"),
735
                                      &btnCancel, GTK_STOCK_CANCEL);
736
        gtk_button_box_set_child_secondary(GTK_BUTTON_BOX(hbbox), btnCancel,
737
                                           TRUE);
738
        gtkut_box_set_reverse_order(GTK_BOX(hbbox), FALSE);
739
        gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
740
        gtk_container_set_border_width(GTK_CONTAINER(hbbox), 2);
741
        gtk_widget_grab_default(btnNext);
742
743
        /* Button handlers */
744
        g_signal_connect(G_OBJECT(btnPrev), "clicked",
745
                         G_CALLBACK(imp_ldif_prev), NULL);
746
        g_signal_connect(G_OBJECT(btnNext), "clicked",
747
                         G_CALLBACK(imp_ldif_next), NULL);
748
        g_signal_connect(G_OBJECT(btnCancel), "clicked",
749
                         G_CALLBACK(imp_ldif_cancel), NULL);
750
751
        gtk_widget_show_all(vbox);
752
753
        impldif_dlg.window     = window;
754
        impldif_dlg.notebook   = notebook;
755
        impldif_dlg.btnPrev    = btnPrev;
756
        impldif_dlg.btnNext    = btnNext;
757
        impldif_dlg.btnCancel  = btnCancel;
758
        impldif_dlg.statusbar  = statusbar;
759
        impldif_dlg.status_cid = gtk_statusbar_get_context_id(
760
                        GTK_STATUSBAR(statusbar), "Import LDIF Dialog" );
761
762
}
763
764
static void imp_ldif_create() {
765
        imp_ldif_dialog_create();
766
        imp_ldif_page_file( PAGE_FILE_INFO, _( "File Info" ) );
767
        imp_ldif_page_fields( PAGE_ATTRIBUTES, _( "Attributes" ) );
768
        imp_ldif_page_finish( PAGE_FINISH, _( "Finish" ) );
769
        gtk_widget_show_all( impldif_dlg.window );
770
}
771
772
AddressBookFile *addressbook_imp_ldif( AddressIndex *addrIndex ) {
773
        _importedBook_ = NULL;
774
        _imp_addressIndex_ = addrIndex;
775
776
        if( ! impldif_dlg.window )
777
                imp_ldif_create();
778
        impldif_dlg.cancelled = FALSE;
779
        manage_window_set_transient(GTK_WINDOW(impldif_dlg.window));
780
        gtk_widget_grab_default(impldif_dlg.btnNext);
781
782
        gtk_entry_set_text( GTK_ENTRY(impldif_dlg.name_entry), IMPORTLDIF_GUESS_NAME );
783
        gtk_entry_set_text( GTK_ENTRY(impldif_dlg.file_entry), "" );
784
        gtk_label_set_text( GTK_LABEL(impldif_dlg.name_ldif), "" );
785
        gtk_entry_set_text( GTK_ENTRY(impldif_dlg.name_attrib), "" );
786
        gtk_clist_clear( GTK_CLIST(impldif_dlg.clist_field) );
787
        gtk_notebook_set_current_page( GTK_NOTEBOOK(impldif_dlg.notebook), PAGE_FILE_INFO );
788
        gtk_widget_set_sensitive( impldif_dlg.btnPrev, FALSE );
789
        gtk_widget_set_sensitive( impldif_dlg.btnNext, TRUE );
790
        gtk_button_set_label( GTK_BUTTON(impldif_dlg.btnCancel), GTK_STOCK_CANCEL );
791
        stock_pixmap_gdk( impldif_dlg.window, STOCK_PIXMAP_MARK,
792
                          &markxpm, &markxpmmask );
793
        imp_ldif_message();
794
        gtk_widget_grab_focus(impldif_dlg.file_entry);
795
796
        impldif_dlg.rowIndSelect = -1;
797
        impldif_dlg.rowCount = 0;
798
        g_free( impldif_dlg.nameBook );
799
        g_free( impldif_dlg.fileName );
800
        impldif_dlg.nameBook = NULL;
801
        impldif_dlg.fileName = NULL;
802
803
        _ldifFile_ = ldif_create();
804
805
        gtk_widget_show(impldif_dlg.window);
806
807
        gtk_main();
808
        gtk_widget_hide(impldif_dlg.window);
809
        ldif_free( _ldifFile_ );
810
        _ldifFile_ = NULL;
811
        _imp_addressIndex_ = NULL;
812
813
        g_free( impldif_dlg.nameBook );
814
        g_free( impldif_dlg.fileName );
815
        impldif_dlg.nameBook = NULL;
816
        impldif_dlg.fileName = NULL;
817
818
        if( impldif_dlg.cancelled == TRUE ) return NULL;
819
        return _importedBook_;
820
}
821
822
AddressBookFile *addressbook_imp_ldif_file( AddressIndex *addrIndex,
823
                                            const gchar *file,
824
                                            const gchar *book_name ) {
825
        gchar *fsfile;
826
        GList *node, *list;
827
        gboolean ret = FALSE;
828
829
        g_return_val_if_fail(addrIndex != NULL, NULL);
830
        g_return_val_if_fail(file != NULL, NULL);
831
        g_return_val_if_fail(book_name != NULL, NULL);
832
833
        debug_print("addressbook_imp_ldif_file: file: %s name: %s\n",
834
                    file, book_name);
835
836
        _importedBook_ = NULL;
837
        _imp_addressIndex_ = addrIndex;
838
        _ldifFile_ = ldif_create();
839
840
        fsfile = conv_filename_from_utf8( file );
841
        ldif_set_file(_ldifFile_, fsfile);
842
        g_free( fsfile );
843
844
        if( ldif_read_tags( _ldifFile_ ) != MGU_SUCCESS )
845
                goto finish;
846
        list = ldif_get_fieldlist( _ldifFile_ );
847
        node = list;
848
        while( node ) {
849
                Ldif_FieldRec *rec = node->data;
850
                if( ! rec->reserved ) {
851
                        if( g_ascii_strcasecmp( rec->tagName, "dn" ) != 0 ) {
852
                                rec->selected = TRUE;
853
                        }
854
                }
855
                node = g_list_next( node );
856
        }
857
        g_list_free( list );
858
859
        g_free( impldif_dlg.nameBook );
860
        impldif_dlg.nameBook = g_strdup(book_name);
861
862
        ret = imp_ldif_field_move();
863
864
        g_free( impldif_dlg.nameBook );
865
        impldif_dlg.nameBook = NULL;
866
867
finish:
868
        ldif_free( _ldifFile_ );
869
        _ldifFile_ = NULL;
870
        _imp_addressIndex_ = NULL;
871
872
        if (ret)
873
                debug_print("addressbook_imp_ldif_file: import succeeded\n");
874
875
        return _importedBook_;
876
}
877
878
/*
879
* End of Source.
880
*/
881