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