2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 2001-2003 Match Grun
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.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 * Import LDIF address book data.
31 #include <glib/gi18n.h>
32 #include <gdk/gdkkeysyms.h>
33 #include <gtk/gtkwindow.h>
34 #include <gtk/gtksignal.h>
35 #include <gtk/gtklabel.h>
36 #include <gtk/gtkentry.h>
37 #include <gtk/gtktable.h>
38 #include <gtk/gtkbutton.h>
41 #include "addressbook.h"
42 #include "addressitem.h"
44 #include "stock_pixmap.h"
45 #include "prefs_common.h"
46 #include "manage_window.h"
51 #define IMPORTLDIF_GUESS_NAME "LDIF Import"
53 #define PAGE_FILE_INFO 0
54 #define PAGE_ATTRIBUTES 1
57 #define IMPORTLDIF_WIDTH 390
58 #define IMPORTLDIF_HEIGHT 300
60 #define FIELDS_N_COLS 4
61 #define FIELDS_COL_WIDTH_RESERVED 10
62 #define FIELDS_COL_WIDTH_SELECT 10
63 #define FIELDS_COL_WIDTH_FIELD 140
64 #define FIELDS_COL_WIDTH_ATTRIB 140
67 FIELD_COL_RESERVED = 0,
71 } ImpLdif_FieldColPos;
74 * LDIF dialog definition.
76 static struct _ImpLdif_Dlg {
81 GtkWidget *clist_field;
82 GtkWidget *entryField;
83 GtkWidget *entryAttrib;
84 GtkWidget *checkSelect;
88 GtkWidget *labelRecords;
101 static struct _AddressFileSelection _imp_ldif_file_selector_;
102 static AddressBookFile *_importedBook_;
103 static AddressIndex *_imp_addressIndex_;
104 static LdifFile *_ldifFile_ = NULL;
106 static GdkPixmap *markxpm;
107 static GdkBitmap *markxpmmask;
110 * Structure of error message table.
112 typedef struct _ErrMsgTableEntry ErrMsgTableEntry;
113 struct _ErrMsgTableEntry {
118 static gchar *_errMsgUnknown_ = N_( "Unknown" );
121 * Lookup table of error messages for general errors. Note that a NULL
122 * description signifies the end of the table.
124 static ErrMsgTableEntry _lutErrorsLDIF_[] = {
125 { MGU_SUCCESS, N_("Success") },
126 { MGU_BAD_ARGS, N_("Bad arguments") },
127 { MGU_NO_FILE, N_("File not specified") },
128 { MGU_OPEN_FILE, N_("Error opening file") },
129 { MGU_ERROR_READ, N_("Error reading file") },
130 { MGU_EOF, N_("End of file encountered") },
131 { MGU_OO_MEMORY, N_("Error allocating memory") },
132 { MGU_BAD_FORMAT, N_("Bad file format") },
133 { MGU_ERROR_WRITE, N_("Error writing to file") },
134 { MGU_OPEN_DIRECTORY, N_("Error opening directory") },
135 { MGU_NO_PATH, N_("No path specified") },
140 * Lookup message for specified error code.
141 * \param lut Lookup table.
142 * \param code Code to lookup.
143 * \return Description associated to code.
145 static gchar *imp_ldif_err2string( ErrMsgTableEntry lut[], gint code ) {
147 ErrMsgTableEntry entry;
150 for( i = 0; ; i++ ) {
152 if( entry.description == NULL ) break;
153 if( entry.code == code ) {
154 desc = entry.description;
159 desc = _errMsgUnknown_;
165 * Display message in status field.
166 * \param msg Message to display.
168 static void imp_ldif_status_show( gchar *msg ) {
169 if( impldif_dlg.statusbar != NULL ) {
170 gtk_statusbar_pop( GTK_STATUSBAR(impldif_dlg.statusbar),
171 impldif_dlg.status_cid );
174 GTK_STATUSBAR(impldif_dlg.statusbar),
175 impldif_dlg.status_cid, msg );
181 * Select and display status message appropriate for the page being displayed.
183 static void imp_ldif_message( void ) {
187 pageNum = gtk_notebook_get_current_page( GTK_NOTEBOOK(impldif_dlg.notebook) );
188 if( pageNum == PAGE_FILE_INFO ) {
189 sMsg = _( "Please specify address book name and file to import." );
191 else if( pageNum == PAGE_ATTRIBUTES ) {
192 sMsg = _( "Select and rename LDIF field names to import." );
194 else if( pageNum == PAGE_FINISH ) {
195 sMsg = _( "File imported." );
197 imp_ldif_status_show( sMsg );
201 * Update list with data for current row.
202 * \param clist List to update.
204 static void imp_ldif_update_row( GtkCList *clist ) {
206 gchar *text[ FIELDS_N_COLS ];
209 if( impldif_dlg.rowIndSelect < 0 ) return;
210 row = impldif_dlg.rowIndSelect;
212 rec = gtk_clist_get_row_data( clist, row );
213 text[ FIELD_COL_RESERVED ] = "";
214 text[ FIELD_COL_SELECT ] = "";
215 text[ FIELD_COL_FIELD ] = rec->tagName;
216 text[ FIELD_COL_ATTRIB ] = rec->userName;
218 gtk_clist_freeze( clist );
219 gtk_clist_remove( clist, row );
220 if( row == impldif_dlg.rowCount - 1 ) {
221 gtk_clist_append( clist, text );
224 gtk_clist_insert( clist, row, text );
226 if( rec->selected ) {
227 gtk_clist_set_pixmap(
228 clist, row, FIELD_COL_SELECT, markxpm, markxpmmask );
230 if( rec->reserved ) {
231 gtk_clist_set_pixmap(
232 clist, row, FIELD_COL_RESERVED, markxpm, markxpmmask );
235 gtk_clist_set_row_data( clist, row, rec );
236 gtk_clist_thaw( clist );
240 * Load list with LDIF fields read from file.
241 * \param ldf LDIF control data.
243 static void imp_ldif_load_fields( LdifFile *ldf ) {
244 GtkCList *clist = GTK_CLIST(impldif_dlg.clist_field);
246 gchar *text[ FIELDS_N_COLS ];
248 impldif_dlg.rowIndSelect = -1;
249 impldif_dlg.rowCount = 0;
250 if( ! ldf->accessFlag ) return;
251 gtk_clist_clear( clist );
252 list = ldif_get_fieldlist( ldf );
255 Ldif_FieldRec *rec = node->data;
258 text[ FIELD_COL_RESERVED ] = "";
259 text[ FIELD_COL_SELECT ] = "";
260 text[ FIELD_COL_FIELD ] = rec->tagName;
261 text[ FIELD_COL_ATTRIB ] = rec->userName;
262 row = gtk_clist_append( clist, text );
263 gtk_clist_set_row_data( clist, row, rec );
264 if( rec->selected ) {
265 gtk_clist_set_pixmap( clist, row,
266 FIELD_COL_SELECT, markxpm, markxpmmask );
268 if( rec->reserved ) {
269 gtk_clist_set_pixmap( clist, row,
270 FIELD_COL_RESERVED, markxpm, markxpmmask );
272 impldif_dlg.rowCount++;
273 node = g_list_next( node );
277 ldif_set_accessed( ldf, FALSE );
281 * Callback function when list iterm selected.
282 * \param clist List widget.
285 * \param event Event object.
286 * \param data User data.
288 static void imp_ldif_field_list_selected(
289 GtkCList *clist, gint row, gint column, GdkEvent *event,
292 Ldif_FieldRec *rec = gtk_clist_get_row_data( clist, row );
294 impldif_dlg.rowIndSelect = row;
295 gtk_entry_set_text( GTK_ENTRY(impldif_dlg.entryAttrib), "" );
297 /* Update widget contents */
299 GTK_LABEL(impldif_dlg.entryField), rec->tagName );
302 GTK_ENTRY(impldif_dlg.entryAttrib), rec->userName );
303 gtk_toggle_button_set_active(
304 GTK_TOGGLE_BUTTON( impldif_dlg.checkSelect),
307 /* Disable widgets for reserved fields */
308 gtk_widget_set_sensitive(
309 impldif_dlg.entryAttrib, ! rec->reserved );
310 gtk_widget_set_sensitive(
311 impldif_dlg.checkSelect, ! rec->reserved );
312 gtk_widget_set_sensitive(
313 impldif_dlg.btnModify, ! rec->reserved );
315 gtk_widget_grab_focus(impldif_dlg.entryAttrib);
319 * Callback function to toggle selected LDIF field.
320 * \param clist List to update.
321 * \param event Event object.
324 static gboolean imp_ldif_field_list_toggle(
325 GtkCList *clist, GdkEventButton *event, gpointer data )
328 gboolean toggle = FALSE;
330 if( ! event ) return FALSE;
331 if( impldif_dlg.rowIndSelect < 0 ) return FALSE;
332 if( event->button == 1 ) {
333 /* If single click in select column */
334 if( event->type == GDK_BUTTON_PRESS ) {
339 gtk_clist_get_selection_info( clist, x, y, &row, &col );
340 if( col != FIELD_COL_SELECT ) return FALSE;
341 if( row > impldif_dlg.rowCount ) return FALSE;
344 impldif_dlg.rowIndSelect = row;
348 /* If double click anywhere in row */
349 else if( event->type == GDK_2BUTTON_PRESS ) {
353 /* Toggle field selection */
355 rec = gtk_clist_get_row_data(
356 clist, impldif_dlg.rowIndSelect );
358 ldif_field_toggle( rec );
359 imp_ldif_update_row( clist );
366 * Callback function to update LDIF field data from input fields.
367 * \param widget Widget (button).
368 * \param data User data.
370 static void imp_ldif_modify_pressed( GtkWidget *widget, gpointer data ) {
371 GtkCList *clist = GTK_CLIST(impldif_dlg.clist_field);
375 if( impldif_dlg.rowIndSelect < 0 ) return;
376 row = impldif_dlg.rowIndSelect;
377 rec = gtk_clist_get_row_data( clist, impldif_dlg.rowIndSelect );
379 ldif_field_set_name( rec, gtk_editable_get_chars(
380 GTK_EDITABLE(impldif_dlg.entryAttrib), 0, -1 ) );
381 ldif_field_set_selected( rec, gtk_toggle_button_get_active(
382 GTK_TOGGLE_BUTTON( impldif_dlg.checkSelect) ) );
383 imp_ldif_update_row( clist );
384 gtk_clist_select_row( clist, row, 0 );
385 gtk_label_set_text( GTK_LABEL(impldif_dlg.entryField), "" );
386 gtk_entry_set_text( GTK_ENTRY(impldif_dlg.entryAttrib), "" );
387 gtk_toggle_button_set_active(
388 GTK_TOGGLE_BUTTON( impldif_dlg.checkSelect), FALSE );
392 * Test whether we can move off fields page.
393 * \return <i>TRUE</i> if OK to move off page.
395 static gboolean imp_ldif_field_move() {
396 gboolean retVal = FALSE;
398 AddressBookFile *abf = NULL;
400 if( _importedBook_ ) {
401 addrbook_free_book( _importedBook_ );
404 abf = addrbook_create_book();
405 addrbook_set_path( abf, _imp_addressIndex_->filePath );
406 addrbook_set_name( abf, impldif_dlg.nameBook );
407 newFile = addrbook_guess_next_file( abf );
408 addrbook_set_file( abf, newFile );
411 /* Import data into file */
412 if( ldif_import_data( _ldifFile_, abf->addressCache ) == MGU_SUCCESS ) {
413 addrbook_save_data( abf );
414 _importedBook_ = abf;
418 addrbook_free_book( abf );
425 * Test whether we can move off file page.
426 * \return <i>TRUE</i> if OK to move off page.
428 static gboolean imp_ldif_file_move() {
429 gboolean retVal = FALSE;
433 gboolean errFlag = FALSE;
435 sFile = gtk_editable_get_chars( GTK_EDITABLE(impldif_dlg.entryFile), 0, -1 );
436 g_strchug( sFile ); g_strchomp( sFile );
438 sName = gtk_editable_get_chars( GTK_EDITABLE(impldif_dlg.entryName), 0, -1 );
439 g_strchug( sName ); g_strchomp( sName );
441 g_free( impldif_dlg.nameBook );
442 g_free( impldif_dlg.fileName );
443 impldif_dlg.nameBook = sName;
444 impldif_dlg.fileName = sFile;
446 gtk_entry_set_text( GTK_ENTRY(impldif_dlg.entryFile), sFile );
447 gtk_entry_set_text( GTK_ENTRY(impldif_dlg.entryName), sName );
449 if( *sFile == '\0'|| strlen( sFile ) < 1 ) {
450 sMsg = _( "Please select a file." );
451 gtk_widget_grab_focus(impldif_dlg.entryFile);
455 if( *sName == '\0'|| strlen( sName ) < 1 ) {
456 if( ! errFlag ) sMsg = _( "Address book name must be supplied." );
457 gtk_widget_grab_focus(impldif_dlg.entryName);
462 /* Read attribute list */
463 ldif_set_file( _ldifFile_, sFile );
464 if( ldif_read_tags( _ldifFile_ ) == MGU_SUCCESS ) {
466 /* ldif_print_file( _ldifFile_, stdout ); */
467 imp_ldif_load_fields( _ldifFile_ );
471 sMsg = _( "Error reading LDIF fields." );
474 imp_ldif_status_show( sMsg );
480 * Display finish page.
482 static void imp_ldif_finish_show() {
486 name = gtk_editable_get_chars( GTK_EDITABLE(impldif_dlg.entryName), 0, -1 );
487 gtk_label_set_text( GTK_LABEL(impldif_dlg.labelBook), name );
489 gtk_label_set_text( GTK_LABEL(impldif_dlg.labelFile), _ldifFile_->path );
490 gtk_label_set_text( GTK_LABEL(impldif_dlg.labelRecords), itos( _ldifFile_->importCount ) );
491 gtk_widget_set_sensitive( impldif_dlg.btnPrev, FALSE );
492 gtk_widget_set_sensitive( impldif_dlg.btnNext, FALSE );
493 if( _ldifFile_->retVal == MGU_SUCCESS ) {
494 sMsg = _( "LDIF file imported successfully." );
497 sMsg = imp_ldif_err2string( _lutErrorsLDIF_, _ldifFile_->retVal );
499 imp_ldif_status_show( sMsg );
500 gtk_widget_grab_focus(impldif_dlg.btnCancel);
504 * Callback function to select previous page.
505 * \param widget Widget (button).
507 static void imp_ldif_prev( GtkWidget *widget ) {
510 pageNum = gtk_notebook_get_current_page( GTK_NOTEBOOK(impldif_dlg.notebook) );
511 if( pageNum == PAGE_ATTRIBUTES ) {
512 /* Goto file page stuff */
513 gtk_notebook_set_current_page(
514 GTK_NOTEBOOK(impldif_dlg.notebook), PAGE_FILE_INFO );
515 gtk_widget_set_sensitive( impldif_dlg.btnPrev, FALSE );
521 * Callback function to select next page.
522 * \param widget Widget (button).
524 static void imp_ldif_next( GtkWidget *widget ) {
527 pageNum = gtk_notebook_get_current_page( GTK_NOTEBOOK(impldif_dlg.notebook) );
528 if( pageNum == PAGE_FILE_INFO ) {
529 /* Goto attributes stuff */
530 if( imp_ldif_file_move() ) {
531 gtk_notebook_set_current_page(
532 GTK_NOTEBOOK(impldif_dlg.notebook), PAGE_ATTRIBUTES );
534 gtk_widget_set_sensitive( impldif_dlg.btnPrev, TRUE );
537 gtk_widget_set_sensitive( impldif_dlg.btnPrev, FALSE );
540 else if( pageNum == PAGE_ATTRIBUTES ) {
541 /* Goto finish stuff */
542 if( imp_ldif_field_move() ) {
543 gtk_notebook_set_current_page(
544 GTK_NOTEBOOK(impldif_dlg.notebook), PAGE_FINISH );
545 imp_ldif_finish_show();
551 * Callback function to cancel and close dialog.
552 * \param widget Widget (button).
553 * \param data User data.
555 static void imp_ldif_cancel( GtkWidget *widget, gpointer data ) {
558 pageNum = gtk_notebook_get_current_page( GTK_NOTEBOOK(impldif_dlg.notebook) );
559 if( pageNum != PAGE_FINISH ) {
560 impldif_dlg.cancelled = TRUE;
566 * Callback function to accept LDIF file selection.
567 * \param widget Widget (button).
568 * \param data User data.
570 static void imp_ldif_file_ok( GtkWidget *widget, gpointer data ) {
572 AddressFileSelection *afs;
575 afs = ( AddressFileSelection * ) data;
576 fileSel = afs->fileSelector;
577 sFile = gtk_file_selection_get_filename( GTK_FILE_SELECTION(fileSel) );
579 afs->cancelled = FALSE;
580 gtk_entry_set_text( GTK_ENTRY(impldif_dlg.entryFile), sFile );
581 gtk_widget_hide( afs->fileSelector );
582 gtk_grab_remove( afs->fileSelector );
583 gtk_widget_grab_focus( impldif_dlg.entryFile );
587 * Callback function to cancel LDIF file selection dialog.
588 * \param widget Widget (button).
589 * \param data User data.
591 static void imp_ldif_file_cancel( GtkWidget *widget, gpointer data ) {
592 AddressFileSelection *afs = ( AddressFileSelection * ) data;
593 afs->cancelled = TRUE;
594 gtk_widget_hide( afs->fileSelector );
595 gtk_grab_remove( afs->fileSelector );
596 gtk_widget_grab_focus( impldif_dlg.entryFile );
600 * Create LDIF file selection dialog.
601 * \param afs Address file selection data.
603 static void imp_ldif_file_select_create( AddressFileSelection *afs ) {
604 GtkWidget *fileSelector;
606 fileSelector = gtk_file_selection_new( _("Select LDIF File") );
607 gtk_file_selection_hide_fileop_buttons( GTK_FILE_SELECTION(fileSelector) );
608 g_signal_connect( G_OBJECT (GTK_FILE_SELECTION(fileSelector)->ok_button),
609 "clicked", G_CALLBACK (imp_ldif_file_ok), ( gpointer ) afs );
610 g_signal_connect( G_OBJECT (GTK_FILE_SELECTION(fileSelector)->cancel_button),
611 "clicked", G_CALLBACK (imp_ldif_file_cancel), ( gpointer ) afs );
612 afs->fileSelector = fileSelector;
613 afs->cancelled = TRUE;
617 * Callback function to display LDIF file selection dialog.
619 static void imp_ldif_file_select( void ) {
621 if( ! _imp_ldif_file_selector_.fileSelector )
622 imp_ldif_file_select_create( & _imp_ldif_file_selector_ );
624 sFile = gtk_editable_get_chars( GTK_EDITABLE(impldif_dlg.entryFile), 0, -1 );
625 gtk_file_selection_set_filename(
626 GTK_FILE_SELECTION( _imp_ldif_file_selector_.fileSelector ),
629 gtk_widget_show( _imp_ldif_file_selector_.fileSelector );
630 gtk_grab_add( _imp_ldif_file_selector_.fileSelector );
634 * Callback function to handle dialog close event.
635 * \param widget Widget (dialog).
636 * \param event Event object.
637 * \param data User data.
639 static gint imp_ldif_delete_event( GtkWidget *widget, GdkEventAny *event, gpointer data ) {
640 imp_ldif_cancel( widget, data );
645 * Callback function to respond to dialog key press events.
646 * \param widget Widget.
647 * \param event Event object.
648 * \param data User data.
650 static gboolean imp_ldif_key_pressed( GtkWidget *widget, GdkEventKey *event, gpointer data ) {
651 if (event && event->keyval == GDK_Escape) {
652 imp_ldif_cancel( widget, data );
658 * Format notebook "file" page.
659 * \param pageNum Page (tab) number.
660 * \param pageLbl Page (tab) label.
662 static void imp_ldif_page_file( gint pageNum, gchar *pageLbl ) {
666 GtkWidget *entryFile;
667 GtkWidget *entryName;
669 GtkTooltips *toolTip;
672 vbox = gtk_vbox_new(FALSE, 8);
673 gtk_container_add( GTK_CONTAINER( impldif_dlg.notebook ), vbox );
674 gtk_container_set_border_width( GTK_CONTAINER (vbox), BORDER_WIDTH );
676 label = gtk_label_new( pageLbl );
677 gtk_widget_show( label );
678 gtk_notebook_set_tab_label(
679 GTK_NOTEBOOK( impldif_dlg.notebook ),
680 gtk_notebook_get_nth_page(
681 GTK_NOTEBOOK( impldif_dlg.notebook ), pageNum ),
684 table = gtk_table_new(2, 3, FALSE);
685 gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
686 gtk_container_set_border_width( GTK_CONTAINER(table), 8 );
687 gtk_table_set_row_spacings(GTK_TABLE(table), 8);
688 gtk_table_set_col_spacings(GTK_TABLE(table), 8 );
692 label = gtk_label_new(_("Address Book"));
693 gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1),
695 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
697 entryName = gtk_entry_new();
698 gtk_table_attach(GTK_TABLE(table), entryName, 1, 2, top, (top + 1),
699 GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
701 toolTip = gtk_tooltips_new();
702 gtk_tooltips_set_tip( toolTip, entryName, _(
703 "Specify the name for the address book that will " \
704 "be created from the LDIF file data." ),
709 label = gtk_label_new(_("File Name"));
710 gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1),
712 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
714 entryFile = gtk_entry_new();
715 gtk_table_attach(GTK_TABLE(table), entryFile, 1, 2, top, (top + 1),
716 GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
718 toolTip = gtk_tooltips_new();
719 gtk_tooltips_set_tip( toolTip, entryFile,
720 _( "The full file specification of the LDIF file to import." ),
723 btnFile = gtk_button_new_with_label( _(" ... "));
724 gtk_table_attach(GTK_TABLE(table), btnFile, 2, 3, top, (top + 1),
727 toolTip = gtk_tooltips_new();
728 gtk_tooltips_set_tip( toolTip, btnFile,
729 _( "Select the LDIF file to import." ),
732 gtk_widget_show_all(vbox);
735 g_signal_connect(G_OBJECT(btnFile), "clicked",
736 G_CALLBACK(imp_ldif_file_select), NULL);
738 impldif_dlg.entryFile = entryFile;
739 impldif_dlg.entryName = entryName;
743 * Format notebook fields page.
744 * \param pageNum Page (tab) number.
745 * \param pageLbl Page (tab) label.
747 static void imp_ldif_page_fields( gint pageNum, gchar *pageLbl ) {
753 GtkWidget *clist_swin;
754 GtkWidget *clist_field;
755 GtkWidget *entryField;
756 GtkWidget *entryAttrib;
757 GtkWidget *checkSelect;
758 GtkWidget *btnModify;
760 GtkTooltips *toolTip;
763 gchar *titles[ FIELDS_N_COLS ];
766 titles[ FIELD_COL_RESERVED ] = _("R");
767 titles[ FIELD_COL_SELECT ] = _("S");
768 titles[ FIELD_COL_FIELD ] = _("LDIF Field Name");
769 titles[ FIELD_COL_ATTRIB ] = _("Attribute Name");
771 vbox = gtk_vbox_new(FALSE, 8);
772 gtk_container_add( GTK_CONTAINER( impldif_dlg.notebook ), vbox );
773 gtk_container_set_border_width( GTK_CONTAINER (vbox), 4 );
775 label = gtk_label_new( pageLbl );
776 gtk_widget_show( label );
777 gtk_notebook_set_tab_label(
778 GTK_NOTEBOOK( impldif_dlg.notebook ),
779 gtk_notebook_get_nth_page(GTK_NOTEBOOK( impldif_dlg.notebook ), pageNum ),
782 /* Upper area - Field list */
783 vboxt = gtk_vbox_new( FALSE, 4 );
784 gtk_container_add( GTK_CONTAINER( vbox ), vboxt );
786 clist_swin = gtk_scrolled_window_new( NULL, NULL );
787 gtk_container_add( GTK_CONTAINER(vboxt), clist_swin );
788 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(clist_swin),
789 GTK_POLICY_AUTOMATIC,
790 GTK_POLICY_AUTOMATIC);
792 clist_field = gtk_clist_new_with_titles( FIELDS_N_COLS, titles );
793 gtk_container_add( GTK_CONTAINER(clist_swin), clist_field );
794 gtk_clist_set_selection_mode(
795 GTK_CLIST(clist_field), GTK_SELECTION_BROWSE );
796 gtk_clist_set_column_width( GTK_CLIST(clist_field),
797 FIELD_COL_RESERVED, FIELDS_COL_WIDTH_RESERVED );
798 gtk_clist_set_column_width( GTK_CLIST(clist_field),
799 FIELD_COL_SELECT, FIELDS_COL_WIDTH_SELECT );
800 gtk_clist_set_column_width( GTK_CLIST(clist_field),
801 FIELD_COL_FIELD, FIELDS_COL_WIDTH_FIELD );
802 gtk_clist_set_column_width( GTK_CLIST(clist_field),
803 FIELD_COL_ATTRIB, FIELDS_COL_WIDTH_ATTRIB );
805 /* Remove focus capability for column headers */
806 for( i = 0; i < FIELDS_N_COLS; i++ ) {
807 GTK_WIDGET_UNSET_FLAGS(
808 GTK_CLIST(clist_field)->column[i].button,
812 /* Lower area - Edit area */
813 vboxb = gtk_vbox_new( FALSE, 4 );
814 gtk_box_pack_end(GTK_BOX(vbox), vboxb, FALSE, FALSE, 2);
816 /* Data entry area */
817 table = gtk_table_new( 3, 3, FALSE);
818 gtk_box_pack_start(GTK_BOX(vboxb), table, FALSE, FALSE, 0);
819 gtk_table_set_row_spacings(GTK_TABLE(table), 4);
820 gtk_table_set_col_spacings(GTK_TABLE(table), 4);
824 label = gtk_label_new(_("LDIF Field"));
825 gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1),
827 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
829 entryField = gtk_label_new( "" );
830 gtk_misc_set_alignment(GTK_MISC(entryField), 0.01, 0.5);
831 gtk_table_attach(GTK_TABLE(table), entryField, 1, 3, top, (top + 1),
832 GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
836 label = gtk_label_new(_("Attribute"));
837 gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1),
839 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
841 entryAttrib = gtk_entry_new();
842 gtk_table_attach(GTK_TABLE(table), entryAttrib, 1, 3, top, (top + 1),
843 GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
845 toolTip = gtk_tooltips_new();
846 gtk_tooltips_set_tip( toolTip, entryAttrib,
847 _( "The LDIF field can be renamed to the User Attribute name." ),
852 label = gtk_label_new( _( "???" ) );
854 gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1),
857 gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
860 * Use an event box to attach some help in the form of a tooltip.
861 * Tried this for the clist but it looked bad.
863 eventBox = gtk_event_box_new();
864 gtk_container_add( GTK_CONTAINER(eventBox), label );
865 gtk_table_attach(GTK_TABLE(table), eventBox, 0, 1, top, (top + 1),
868 toolTip = gtk_tooltips_new();
869 gtk_tooltips_set_tip( toolTip, eventBox, _(
870 "Choose the LDIF field that will be renamed or selected " \
871 "for import in the list above. Reserved fields (marked " \
872 "with a tick in the \"R\" column), are automatically " \
873 "imported and cannot be renamed. A single click in the " \
874 "Select (\"S\") column will select the field for import " \
875 "with a tick. A single click anywhere in the row will " \
876 "select that field for rename in the input area below " \
877 "the list. A double click anywhere in the row will also " \
878 "select the field for import."
882 checkSelect = gtk_check_button_new_with_label( _( "Select for Import" ) );
883 gtk_table_attach(GTK_TABLE(table), checkSelect, 1, 2, top, (top + 1),
884 GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
886 toolTip = gtk_tooltips_new();
887 gtk_tooltips_set_tip( toolTip, checkSelect,
888 _( "Select the LDIF field for import into the address book." ),
891 btnModify = gtk_button_new_with_label( _(" Modify "));
892 gtk_table_attach(GTK_TABLE(table), btnModify, 2, 3, top, (top + 1),
895 toolTip = gtk_tooltips_new();
896 gtk_tooltips_set_tip( toolTip, btnModify,
897 _( "This button will update the list above with the data supplied." ),
900 gtk_widget_show_all(vbox);
903 g_signal_connect( G_OBJECT(clist_field), "select_row",
904 G_CALLBACK(imp_ldif_field_list_selected), NULL );
905 g_signal_connect( G_OBJECT(clist_field), "button_press_event",
906 G_CALLBACK(imp_ldif_field_list_toggle), NULL );
907 g_signal_connect( G_OBJECT(btnModify), "clicked",
908 G_CALLBACK(imp_ldif_modify_pressed), NULL );
910 impldif_dlg.clist_field = clist_field;
911 impldif_dlg.entryField = entryField;
912 impldif_dlg.entryAttrib = entryAttrib;
913 impldif_dlg.checkSelect = checkSelect;
914 impldif_dlg.btnModify = btnModify;
918 * Format notebook finish page.
919 * \param pageNum Page (tab) number.
920 * \param pageLbl Page (tab) label.
922 static void imp_ldif_page_finish( gint pageNum, gchar *pageLbl ) {
926 GtkWidget *labelBook;
927 GtkWidget *labelFile;
928 GtkWidget *labelRecs;
931 vbox = gtk_vbox_new(FALSE, 8);
932 gtk_container_add( GTK_CONTAINER( impldif_dlg.notebook ), vbox );
933 gtk_container_set_border_width( GTK_CONTAINER (vbox), BORDER_WIDTH );
935 label = gtk_label_new( pageLbl );
936 gtk_widget_show( label );
937 gtk_notebook_set_tab_label(
938 GTK_NOTEBOOK( impldif_dlg.notebook ),
939 gtk_notebook_get_nth_page( GTK_NOTEBOOK( impldif_dlg.notebook ), pageNum ),
942 table = gtk_table_new(3, 2, FALSE);
943 gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
944 gtk_container_set_border_width( GTK_CONTAINER(table), 8 );
945 gtk_table_set_row_spacings(GTK_TABLE(table), 8);
946 gtk_table_set_col_spacings(GTK_TABLE(table), 8);
950 label = gtk_label_new( _( "Address Book :" ) );
951 gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
952 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
954 labelBook = gtk_label_new("");
955 gtk_table_attach(GTK_TABLE(table), labelBook, 1, 2, top, (top + 1), GTK_FILL, 0, 0, 0);
956 gtk_misc_set_alignment(GTK_MISC(labelBook), 0, 0.5);
960 label = gtk_label_new( _( "File Name :" ) );
961 gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
962 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
964 labelFile = gtk_label_new("");
965 gtk_table_attach(GTK_TABLE(table), labelFile, 1, 2, top, (top + 1), GTK_FILL, 0, 0, 0);
966 gtk_misc_set_alignment(GTK_MISC(labelFile), 0, 0.5);
970 label = gtk_label_new( _("Records Imported :") );
971 gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
972 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
974 labelRecs = gtk_label_new("");
975 gtk_table_attach(GTK_TABLE(table), labelRecs, 1, 2, top, (top + 1), GTK_FILL, 0, 0, 0);
976 gtk_misc_set_alignment(GTK_MISC(labelRecs), 0, 0.5);
978 impldif_dlg.labelBook = labelBook;
979 impldif_dlg.labelFile = labelFile;
980 impldif_dlg.labelRecords = labelRecs;
984 * Create main dialog decorations (excluding notebook pages).
986 static void imp_ldif_dialog_create() {
994 GtkWidget *btnCancel;
996 GtkWidget *statusbar;
998 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
999 gtk_widget_set_size_request(window, IMPORTLDIF_WIDTH, IMPORTLDIF_HEIGHT );
1000 gtk_container_set_border_width( GTK_CONTAINER(window), 0 );
1001 gtk_window_set_title( GTK_WINDOW(window), _("Import LDIF file into Address Book") );
1002 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
1003 gtk_window_set_modal(GTK_WINDOW(window), TRUE);
1004 g_signal_connect(G_OBJECT(window), "delete_event",
1005 G_CALLBACK(imp_ldif_delete_event),
1007 g_signal_connect(G_OBJECT(window), "key_press_event",
1008 G_CALLBACK(imp_ldif_key_pressed),
1011 vbox = gtk_vbox_new(FALSE, 4);
1012 gtk_widget_show(vbox);
1013 gtk_container_add(GTK_CONTAINER(window), vbox);
1015 vnbox = gtk_vbox_new(FALSE, 4);
1016 gtk_container_set_border_width(GTK_CONTAINER(vnbox), 4);
1017 gtk_widget_show(vnbox);
1018 gtk_box_pack_start(GTK_BOX(vbox), vnbox, TRUE, TRUE, 0);
1021 notebook = gtk_notebook_new();
1022 gtk_notebook_set_show_tabs( GTK_NOTEBOOK(notebook), FALSE );
1023 gtk_widget_show(notebook);
1024 gtk_box_pack_start(GTK_BOX(vnbox), notebook, TRUE, TRUE, 0);
1025 gtk_container_set_border_width(GTK_CONTAINER(notebook), 6);
1028 hsbox = gtk_hbox_new(FALSE, 0);
1029 gtk_box_pack_end(GTK_BOX(vbox), hsbox, FALSE, FALSE, BORDER_WIDTH);
1030 statusbar = gtk_statusbar_new();
1031 gtk_box_pack_start(GTK_BOX(hsbox), statusbar, TRUE, TRUE, BORDER_WIDTH);
1034 gtkut_stock_button_set_create(&hbbox, &btnPrev, _("Prev"),
1035 &btnNext, _("Next"),
1036 &btnCancel, GTK_STOCK_CANCEL);
1037 gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
1038 gtk_container_set_border_width(GTK_CONTAINER(hbbox), 2);
1039 gtk_widget_grab_default(btnNext);
1041 /* Button handlers */
1042 g_signal_connect(G_OBJECT(btnPrev), "clicked",
1043 G_CALLBACK(imp_ldif_prev), NULL);
1044 g_signal_connect(G_OBJECT(btnNext), "clicked",
1045 G_CALLBACK(imp_ldif_next), NULL);
1046 g_signal_connect(G_OBJECT(btnCancel), "clicked",
1047 G_CALLBACK(imp_ldif_cancel), NULL);
1049 gtk_widget_show_all(vbox);
1051 impldif_dlg.window = window;
1052 impldif_dlg.notebook = notebook;
1053 impldif_dlg.btnPrev = btnPrev;
1054 impldif_dlg.btnNext = btnNext;
1055 impldif_dlg.btnCancel = btnCancel;
1056 impldif_dlg.statusbar = statusbar;
1057 impldif_dlg.status_cid = gtk_statusbar_get_context_id(
1058 GTK_STATUSBAR(statusbar), "Import LDIF Dialog" );
1063 * Create import LDIF dialog.
1065 static void imp_ldif_create() {
1066 imp_ldif_dialog_create();
1067 imp_ldif_page_file( PAGE_FILE_INFO, _( "File Info" ) );
1068 imp_ldif_page_fields( PAGE_ATTRIBUTES, _( "Attributes" ) );
1069 imp_ldif_page_finish( PAGE_FINISH, _( "Finish" ) );
1070 gtk_widget_show_all( impldif_dlg.window );
1075 * \param addrIndex Address index.
1076 * \return Address book file of imported data, or <i>NULL</i> if import
1079 AddressBookFile *addressbook_imp_ldif( AddressIndex *addrIndex ) {
1080 _importedBook_ = NULL;
1081 _imp_addressIndex_ = addrIndex;
1083 if( ! impldif_dlg.window )
1085 impldif_dlg.cancelled = FALSE;
1086 gtk_widget_show(impldif_dlg.window);
1087 manage_window_set_transient(GTK_WINDOW(impldif_dlg.window));
1088 gtk_widget_grab_default(impldif_dlg.btnNext);
1090 gtk_entry_set_text( GTK_ENTRY(impldif_dlg.entryName), IMPORTLDIF_GUESS_NAME );
1091 gtk_entry_set_text( GTK_ENTRY(impldif_dlg.entryFile), "" );
1092 gtk_label_set_text( GTK_LABEL(impldif_dlg.entryField), "" );
1093 gtk_entry_set_text( GTK_ENTRY(impldif_dlg.entryAttrib), "" );
1094 gtk_clist_clear( GTK_CLIST(impldif_dlg.clist_field) );
1095 gtk_notebook_set_current_page( GTK_NOTEBOOK(impldif_dlg.notebook), PAGE_FILE_INFO );
1096 gtk_widget_set_sensitive( impldif_dlg.btnPrev, FALSE );
1097 gtk_widget_set_sensitive( impldif_dlg.btnNext, TRUE );
1098 stock_pixmap_gdk( impldif_dlg.window, STOCK_PIXMAP_MARK,
1099 &markxpm, &markxpmmask );
1101 gtk_widget_grab_focus(impldif_dlg.entryFile);
1103 impldif_dlg.rowIndSelect = -1;
1104 impldif_dlg.rowCount = 0;
1105 g_free( impldif_dlg.nameBook );
1106 g_free( impldif_dlg.fileName );
1107 impldif_dlg.nameBook = NULL;
1108 impldif_dlg.fileName = NULL;
1110 _ldifFile_ = ldif_create();
1112 gtk_widget_hide(impldif_dlg.window);
1113 ldif_free( _ldifFile_ );
1115 _imp_addressIndex_ = NULL;
1117 g_free( impldif_dlg.nameBook );
1118 g_free( impldif_dlg.fileName );
1119 impldif_dlg.nameBook = NULL;
1120 impldif_dlg.fileName = NULL;
1122 if( impldif_dlg.cancelled == TRUE ) return NULL;
1123 return _importedBook_;
1127 * ============================================================================
1129 * ============================================================================