2 * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 2001-2015 Match Grun and the Claws Mail team
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 3 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, see <http://www.gnu.org/licenses/>.
20 * Import LDIF address book data.
25 #include "claws-features.h"
31 #include <glib/gi18n.h>
32 #include <gdk/gdkkeysyms.h>
36 #include "addressbook.h"
37 #include "addressitem.h"
39 #include "stock_pixmap.h"
40 #include "prefs_common.h"
41 #include "manage_window.h"
47 #define IMPORTLDIF_GUESS_NAME "LDIF Import"
49 #define PAGE_FILE_INFO 0
50 #define PAGE_ATTRIBUTES 1
53 #define IMPORTLDIF_WIDTH 390
54 #define IMPORTLDIF_HEIGHT 300
56 #define FIELDS_COL_WIDTH_RESERVED 10
57 #define FIELDS_COL_WIDTH_SELECT 10
58 #define FIELDS_COL_WIDTH_FIELD 140
59 #define FIELDS_COL_WIDTH_ATTRIB 140
68 } ImpLdif_FieldColPos
;
71 * LDIF dialog definition.
73 static struct _ImpLdif_Dlg
{
78 GtkWidget
*view_fields
;
79 GtkWidget
*entryField
;
80 GtkWidget
*entryAttrib
;
81 GtkWidget
*checkSelect
;
85 GtkWidget
*labelRecords
;
88 GtkWidget
*btnProceed
;
98 static struct _AddressFileSelection _imp_ldif_file_selector_
;
99 static AddressBookFile
*_importedBook_
;
100 static AddressIndex
*_imp_addressIndex_
;
101 static LdifFile
*_ldifFile_
= NULL
;
103 static GdkPixbuf
*markxpm
;
106 * Structure of error message table.
108 typedef struct _ErrMsgTableEntry ErrMsgTableEntry
;
109 struct _ErrMsgTableEntry
{
114 static gchar
*_errMsgUnknown_
= N_( "Unknown" );
117 * Lookup table of error messages for general errors. Note that a NULL
118 * description signifies the end of the table.
120 static ErrMsgTableEntry _lutErrorsLDIF_
[] = {
121 { MGU_SUCCESS
, N_("Success") },
122 { MGU_BAD_ARGS
, N_("Bad arguments") },
123 { MGU_NO_FILE
, N_("File not specified") },
124 { MGU_OPEN_FILE
, N_("Error opening file") },
125 { MGU_ERROR_READ
, N_("Error reading file") },
126 { MGU_EOF
, N_("End of file encountered") },
127 { MGU_OO_MEMORY
, N_("Error allocating memory") },
128 { MGU_BAD_FORMAT
, N_("Bad file format") },
129 { MGU_ERROR_WRITE
, N_("Error writing to file") },
130 { MGU_OPEN_DIRECTORY
, N_("Error opening directory") },
131 { MGU_NO_PATH
, N_("No path specified") },
136 * Lookup message for specified error code.
137 * \param lut Lookup table.
138 * \param code Code to lookup.
139 * \return Description associated to code.
141 static gchar
*imp_ldif_err2string( ErrMsgTableEntry lut
[], gint code
) {
143 ErrMsgTableEntry entry
;
146 for( i
= 0; ; i
++ ) {
148 if( entry
.description
== NULL
) break;
149 if( entry
.code
== code
) {
150 desc
= entry
.description
;
155 desc
= _errMsgUnknown_
;
161 * Display message in status field.
162 * \param msg Message to display.
164 static void imp_ldif_status_show( gchar
*msg
) {
165 if( impldif_dlg
.statusbar
!= NULL
) {
166 gtk_statusbar_pop( GTK_STATUSBAR(impldif_dlg
.statusbar
),
167 impldif_dlg
.status_cid
);
170 GTK_STATUSBAR(impldif_dlg
.statusbar
),
171 impldif_dlg
.status_cid
, msg
);
177 * Select and display status message appropriate for the page being displayed.
179 static void imp_ldif_message( void ) {
183 pageNum
= gtk_notebook_get_current_page( GTK_NOTEBOOK(impldif_dlg
.notebook
) );
184 if( pageNum
== PAGE_FILE_INFO
) {
185 sMsg
= _( "Please specify address book name and file to import." );
187 else if( pageNum
== PAGE_ATTRIBUTES
) {
188 sMsg
= _( "Select and rename LDIF field names to import." );
190 else if( pageNum
== PAGE_FINISH
) {
191 sMsg
= _( "File imported." );
193 imp_ldif_status_show( sMsg
);
197 * Update the line (represented by the GtkTreeIter) with data
198 * from the Ldif_FieldRec.
200 static void _populate_iter(GtkListStore
*store
, GtkTreeIter
*iter
,
203 gtk_list_store_set(store
, iter
,
204 FIELD_COL_FIELD
, rec
->tagName
,
205 FIELD_COL_ATTRIB
, rec
->userName
,
208 gtk_list_store_set(store
, iter
,
209 FIELD_COL_SELECT
, rec
->selected
? markxpm
: NULL
, -1);
210 gtk_list_store_set(store
, iter
,
211 FIELD_COL_RESERVED
, rec
->reserved
? markxpm
: NULL
, -1);
215 * Load list with LDIF fields read from file.
216 * \param ldf LDIF control data.
218 static void imp_ldif_load_fields( LdifFile
*ldf
) {
219 GtkWidget
*view
= impldif_dlg
.view_fields
;
220 GtkTreeModel
*model
= gtk_tree_view_get_model(GTK_TREE_VIEW(view
));
224 impldif_dlg
.rowCount
= 0;
226 if( ! ldf
->accessFlag
) return;
228 gtk_list_store_clear(GTK_LIST_STORE(model
));
230 list
= ldif_get_fieldlist( ldf
);
233 Ldif_FieldRec
*rec
= node
->data
;
235 gtk_list_store_append(GTK_LIST_STORE(model
), &iter
);
236 _populate_iter(GTK_LIST_STORE(model
), &iter
, rec
);
237 impldif_dlg
.rowCount
++;
238 node
= g_list_next( node
);
242 ldif_set_accessed( ldf
, FALSE
);
246 * Test whether we can move off fields page.
247 * \return <i>TRUE</i> if OK to move off page.
249 static gboolean
imp_ldif_field_move() {
250 gboolean retVal
= FALSE
;
252 AddressBookFile
*abf
= NULL
;
254 if( _importedBook_
) {
255 addrbook_free_book( _importedBook_
);
258 abf
= addrbook_create_book();
259 addrbook_set_path( abf
, _imp_addressIndex_
->filePath
);
260 addrbook_set_name( abf
, impldif_dlg
.nameBook
);
261 newFile
= addrbook_guess_next_file( abf
);
262 addrbook_set_file( abf
, newFile
);
265 /* Import data into file */
266 if( ldif_import_data( _ldifFile_
, abf
->addressCache
) == MGU_SUCCESS
) {
267 addrbook_save_data( abf
);
268 _importedBook_
= abf
;
272 addrbook_free_book( abf
);
278 static void _update_selected_row()
284 rec
= gtkut_tree_view_get_selected_pointer(
285 GTK_TREE_VIEW(impldif_dlg
.view_fields
), FIELD_COL_PTR
,
286 &model
, NULL
, &iter
);
290 ldif_field_set_name(rec
, gtk_entry_get_text(
291 GTK_ENTRY(impldif_dlg
.entryAttrib
)));
292 ldif_field_set_selected(rec
, gtk_toggle_button_get_active(
293 GTK_TOGGLE_BUTTON(impldif_dlg
.checkSelect
)));
295 _populate_iter(GTK_LIST_STORE(model
), &iter
, rec
);
298 static void imp_ldif_modify_pressed(GtkButton
*widget
, gpointer user_data
)
300 _update_selected_row();
303 static void imp_ldif_entryattrib_activate(GtkEntry
*entry
, gpointer user_data
)
305 _update_selected_row();
309 * Test whether we can move off file page.
310 * \return <i>TRUE</i> if OK to move off page.
312 static gboolean
imp_ldif_file_move() {
313 gboolean retVal
= FALSE
;
317 gboolean errFlag
= FALSE
;
319 sFile
= gtk_editable_get_chars( GTK_EDITABLE(impldif_dlg
.entryFile
), 0, -1 );
322 sName
= gtk_editable_get_chars( GTK_EDITABLE(impldif_dlg
.entryName
), 0, -1 );
325 g_free( impldif_dlg
.nameBook
);
326 g_free( impldif_dlg
.fileName
);
327 impldif_dlg
.nameBook
= sName
;
328 impldif_dlg
.fileName
= sFile
;
330 gtk_entry_set_text( GTK_ENTRY(impldif_dlg
.entryFile
), sFile
);
331 gtk_entry_set_text( GTK_ENTRY(impldif_dlg
.entryName
), sName
);
333 if( *sFile
== '\0' ) {
334 sMsg
= _( "Please select a file." );
335 gtk_widget_grab_focus(impldif_dlg
.entryFile
);
339 if( ! errFlag
&& *sName
== '\0' ) {
340 sMsg
= _( "Address book name must be supplied." );
341 gtk_widget_grab_focus(impldif_dlg
.entryName
);
346 /* Read attribute list */
347 ldif_set_file( _ldifFile_
, sFile
);
348 if( ldif_read_tags( _ldifFile_
) == MGU_SUCCESS
) {
350 /* ldif_print_file( _ldifFile_, stdout ); */
351 imp_ldif_load_fields( _ldifFile_
);
355 sMsg
= imp_ldif_err2string( _lutErrorsLDIF_
, _ldifFile_
->retVal
);
358 imp_ldif_status_show( sMsg
);
364 * Display finish page.
366 static void imp_ldif_finish_show() {
370 name
= gtk_editable_get_chars( GTK_EDITABLE(impldif_dlg
.entryName
), 0, -1 );
371 gtk_label_set_text( GTK_LABEL(impldif_dlg
.labelBook
), name
);
373 gtk_label_set_text( GTK_LABEL(impldif_dlg
.labelFile
), _ldifFile_
->path
);
374 gtk_label_set_text( GTK_LABEL(impldif_dlg
.labelRecords
), itos( _ldifFile_
->importCount
) );
375 gtk_widget_set_sensitive( impldif_dlg
.btnPrev
, FALSE
);
376 gtk_widget_hide( impldif_dlg
.btnNext
);
377 gtk_widget_show( impldif_dlg
.btnProceed
);
378 gtk_widget_set_sensitive( impldif_dlg
.btnProceed
, FALSE
);
379 if( _ldifFile_
->retVal
== MGU_SUCCESS
) {
380 sMsg
= _( "LDIF file imported successfully." );
383 sMsg
= imp_ldif_err2string( _lutErrorsLDIF_
, _ldifFile_
->retVal
);
385 imp_ldif_status_show( sMsg
);
386 gtk_widget_grab_focus(impldif_dlg
.btnCancel
);
390 * Callback function to select previous page.
391 * \param widget Widget (button).
393 static void imp_ldif_prev( GtkWidget
*widget
) {
396 pageNum
= gtk_notebook_get_current_page( GTK_NOTEBOOK(impldif_dlg
.notebook
) );
397 if( pageNum
== PAGE_ATTRIBUTES
) {
398 /* Goto file page stuff */
399 gtk_notebook_set_current_page(
400 GTK_NOTEBOOK(impldif_dlg
.notebook
), PAGE_FILE_INFO
);
401 gtk_widget_set_sensitive( impldif_dlg
.btnPrev
, FALSE
);
402 gtk_widget_hide( impldif_dlg
.btnProceed
);
403 gtk_widget_show( impldif_dlg
.btnNext
);
409 * Callback function to select next page.
410 * \param widget Widget (button).
412 static void imp_ldif_next( GtkWidget
*widget
) {
415 pageNum
= gtk_notebook_get_current_page( GTK_NOTEBOOK(impldif_dlg
.notebook
) );
416 if( pageNum
== PAGE_FILE_INFO
) {
417 /* Goto attributes stuff */
418 if( imp_ldif_file_move() ) {
419 gtk_notebook_set_current_page(
420 GTK_NOTEBOOK(impldif_dlg
.notebook
), PAGE_ATTRIBUTES
);
422 gtk_widget_set_sensitive( impldif_dlg
.btnPrev
, TRUE
);
423 gtk_widget_hide( impldif_dlg
.btnNext
);
424 gtk_widget_show( impldif_dlg
.btnProceed
);
425 gtk_widget_set_sensitive( impldif_dlg
.btnProceed
, TRUE
);
428 gtk_widget_set_sensitive( impldif_dlg
.btnPrev
, FALSE
);
429 _ldifFile_
->dirtyFlag
= TRUE
;
432 else if( pageNum
== PAGE_ATTRIBUTES
) {
433 /* Goto finish stuff */
434 if( imp_ldif_field_move() ) {
435 gtk_notebook_set_current_page(
436 GTK_NOTEBOOK(impldif_dlg
.notebook
), PAGE_FINISH
);
437 gtk_button_set_label(GTK_BUTTON(impldif_dlg
.btnCancel
),
439 imp_ldif_finish_show();
445 * Callback function to cancel and close dialog.
446 * \param widget Widget (button).
447 * \param data User data.
449 static void imp_ldif_cancel( GtkWidget
*widget
, gpointer data
) {
452 pageNum
= gtk_notebook_get_current_page( GTK_NOTEBOOK(impldif_dlg
.notebook
) );
453 if( pageNum
!= PAGE_FINISH
) {
454 impldif_dlg
.cancelled
= TRUE
;
461 * Create LDIF file selection dialog.
462 * \param afs Address file selection data.
464 static void imp_ldif_file_select_create( AddressFileSelection
*afs
) {
465 gchar
*file
= filesel_select_file_open(_("Select LDIF File"), NULL
);
468 afs
->cancelled
= TRUE
;
470 afs
->cancelled
= FALSE
;
471 gtk_entry_set_text( GTK_ENTRY(impldif_dlg
.entryFile
), file
);
477 * Callback function to display LDIF file selection dialog.
479 static void imp_ldif_file_select( void ) {
480 imp_ldif_file_select_create( & _imp_ldif_file_selector_
);
484 * Callback function to handle dialog close event.
485 * \param widget Widget (dialog).
486 * \param event Event object.
487 * \param data User data.
489 static gint
imp_ldif_delete_event( GtkWidget
*widget
, GdkEventAny
*event
, gpointer data
) {
490 imp_ldif_cancel( widget
, data
);
495 * Callback function to respond to dialog key press events.
496 * \param widget Widget.
497 * \param event Event object.
498 * \param data User data.
500 static gboolean
imp_ldif_key_pressed( GtkWidget
*widget
, GdkEventKey
*event
, gpointer data
) {
501 if (event
&& event
->keyval
== GDK_KEY_Escape
) {
502 imp_ldif_cancel( widget
, data
);
508 * Format notebook "file" page.
509 * \param pageNum Page (tab) number.
510 * \param pageLbl Page (tab) label.
512 static void imp_ldif_page_file( gint pageNum
, gchar
*pageLbl
) {
516 GtkWidget
*entryFile
;
517 GtkWidget
*entryName
;
521 vbox
= gtk_vbox_new(FALSE
, 8);
522 gtk_container_add( GTK_CONTAINER( impldif_dlg
.notebook
), vbox
);
523 gtk_container_set_border_width( GTK_CONTAINER (vbox
), BORDER_WIDTH
);
525 label
= gtk_label_new( pageLbl
);
526 gtk_widget_show( label
);
527 gtk_notebook_set_tab_label(
528 GTK_NOTEBOOK( impldif_dlg
.notebook
),
529 gtk_notebook_get_nth_page(
530 GTK_NOTEBOOK( impldif_dlg
.notebook
), pageNum
),
533 table
= gtk_table_new(2, 3, FALSE
);
534 gtk_box_pack_start(GTK_BOX(vbox
), table
, FALSE
, FALSE
, 0);
535 gtk_container_set_border_width( GTK_CONTAINER(table
), 8 );
536 gtk_table_set_row_spacings(GTK_TABLE(table
), 8);
537 gtk_table_set_col_spacings(GTK_TABLE(table
), 8 );
541 label
= gtk_label_new(_("Address Book"));
542 gtk_table_attach(GTK_TABLE(table
), label
, 0, 1, top
, (top
+ 1),
544 gtk_misc_set_alignment(GTK_MISC(label
), 0, 0.5);
546 entryName
= gtk_entry_new();
547 gtk_table_attach(GTK_TABLE(table
), entryName
, 1, 2, top
, (top
+ 1),
548 GTK_EXPAND
|GTK_SHRINK
|GTK_FILL
, 0, 0, 0);
550 CLAWS_SET_TIP(entryName
, _(
551 "Specify the name for the address book that will " \
552 "be created from the LDIF file data." ));
556 label
= gtk_label_new(_("File Name"));
557 gtk_table_attach(GTK_TABLE(table
), label
, 0, 1, top
, (top
+ 1),
559 gtk_misc_set_alignment(GTK_MISC(label
), 0, 0.5);
561 entryFile
= gtk_entry_new();
562 gtk_table_attach(GTK_TABLE(table
), entryFile
, 1, 2, top
, (top
+ 1),
563 GTK_EXPAND
|GTK_SHRINK
|GTK_FILL
, 0, 0, 0);
565 CLAWS_SET_TIP(entryFile
,
566 _( "The full file specification of the LDIF file to import." ));
568 btnFile
= gtkut_get_browse_file_btn(_("B_rowse"));
569 gtk_table_attach(GTK_TABLE(table
), btnFile
, 2, 3, top
, (top
+ 1),
572 CLAWS_SET_TIP(btnFile
,
573 _( "Select the LDIF file to import." ));
575 gtk_widget_show_all(vbox
);
578 g_signal_connect(G_OBJECT(btnFile
), "clicked",
579 G_CALLBACK(imp_ldif_file_select
), NULL
);
581 impldif_dlg
.entryFile
= entryFile
;
582 impldif_dlg
.entryName
= entryName
;
586 static void imp_ldif_field_list_cursor_changed(GtkTreeView
*view
,
591 gtk_entry_set_text( GTK_ENTRY(impldif_dlg
.entryAttrib
), "" );
593 rec
= gtkut_tree_view_get_selected_pointer(view
, FIELD_COL_PTR
,
597 /* Update widget contents */
599 GTK_LABEL(impldif_dlg
.entryField
), rec
->tagName
);
602 GTK_ENTRY(impldif_dlg
.entryAttrib
), rec
->userName
);
603 gtk_toggle_button_set_active(
604 GTK_TOGGLE_BUTTON(impldif_dlg
.checkSelect
),
607 /* Disable widgets for reserved fields */
608 gtk_widget_set_sensitive(
609 impldif_dlg
.entryAttrib
, ! rec
->reserved
);
610 gtk_widget_set_sensitive(
611 impldif_dlg
.checkSelect
, ! rec
->reserved
);
612 gtk_widget_set_sensitive(
613 impldif_dlg
.btnModify
, ! rec
->reserved
);
615 gtk_widget_grab_focus(impldif_dlg
.entryAttrib
);
618 static void imp_ldif_field_list_row_activated(GtkTreeView
*view
,
619 GtkTreePath
*path
, GtkTreeViewColumn
*col
,
622 GtkTreeModel
*model
= gtk_tree_view_get_model(view
);
627 ok
= gtk_tree_model_get_iter(model
, &iter
, path
);
632 gtk_tree_model_get(model
, &iter
, FIELD_COL_PTR
, &rec
, -1);
633 cm_return_if_fail(rec
!= NULL
);
635 /* Flip the "selected" state for the record, and update the
636 * "selected" column in the list view, as well as the
637 * "selected" checkbox. */
638 ldif_field_toggle(rec
);
639 gtk_list_store_set(GTK_LIST_STORE(model
), &iter
,
640 FIELD_COL_SELECT
, rec
->selected
? markxpm
: NULL
, -1);
641 gtk_toggle_button_set_active(
642 GTK_TOGGLE_BUTTON(impldif_dlg
.checkSelect
),
647 * Format notebook fields page.
648 * \param pageNum Page (tab) number.
649 * \param pageLbl Page (tab) label.
651 static void imp_ldif_page_fields( gint pageNum
, gchar
*pageLbl
) {
657 GtkWidget
*scrollwin
;
658 GtkWidget
*view_fields
;
659 GtkWidget
*entryField
;
660 GtkWidget
*entryAttrib
;
661 GtkWidget
*checkSelect
;
662 GtkWidget
*btnModify
;
666 GtkCellRenderer
*rdr
;
667 GtkTreeViewColumn
*col
;
668 GtkTreeSelection
*sel
;
670 vbox
= gtk_vbox_new(FALSE
, 8);
671 gtk_container_add( GTK_CONTAINER( impldif_dlg
.notebook
), vbox
);
672 gtk_container_set_border_width( GTK_CONTAINER (vbox
), 4 );
674 label
= gtk_label_new( pageLbl
);
675 gtk_widget_show( label
);
676 gtk_notebook_set_tab_label(
677 GTK_NOTEBOOK( impldif_dlg
.notebook
),
678 gtk_notebook_get_nth_page(GTK_NOTEBOOK( impldif_dlg
.notebook
), pageNum
),
681 /* Upper area - Field list */
682 vboxt
= gtk_vbox_new( FALSE
, 4 );
683 gtk_container_add( GTK_CONTAINER( vbox
), vboxt
);
685 scrollwin
= gtk_scrolled_window_new( NULL
, NULL
);
686 gtk_container_add( GTK_CONTAINER(vboxt
), scrollwin
);
687 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin
),
688 GTK_POLICY_AUTOMATIC
,
689 GTK_POLICY_AUTOMATIC
);
691 store
= gtk_list_store_new(FIELDS_N_COLS
,
692 GDK_TYPE_PIXBUF
, GDK_TYPE_PIXBUF
,
693 G_TYPE_STRING
, G_TYPE_STRING
,
697 view_fields
= gtk_tree_view_new_with_model(GTK_TREE_MODEL(store
));
698 g_object_unref(store
);
699 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view_fields
), TRUE
);
700 gtk_tree_view_set_reorderable(GTK_TREE_VIEW(view_fields
), FALSE
);
701 sel
= gtk_tree_view_get_selection(GTK_TREE_VIEW(view_fields
));
702 gtk_tree_selection_set_mode(sel
, GTK_SELECTION_BROWSE
);
704 rdr
= gtk_cell_renderer_pixbuf_new();
705 col
= gtk_tree_view_column_new_with_attributes(_("R"), rdr
,
706 "pixbuf", FIELD_COL_RESERVED
, NULL
);
707 gtk_tree_view_column_set_min_width(col
, FIELD_COL_RESERVED
);
708 gtk_tree_view_append_column(GTK_TREE_VIEW(view_fields
), col
);
710 col
= gtk_tree_view_column_new_with_attributes(_("S"), rdr
,
711 "pixbuf", FIELD_COL_SELECT
, NULL
);
712 gtk_tree_view_column_set_min_width(col
, FIELD_COL_SELECT
);
713 gtk_tree_view_append_column(GTK_TREE_VIEW(view_fields
), col
);
715 rdr
= gtk_cell_renderer_text_new();
716 col
= gtk_tree_view_column_new_with_attributes(_("LDIF Field Name"), rdr
,
717 "markup", FIELD_COL_FIELD
, NULL
);
718 gtk_tree_view_column_set_min_width(col
, FIELD_COL_FIELD
);
719 gtk_tree_view_append_column(GTK_TREE_VIEW(view_fields
), col
);
721 col
= gtk_tree_view_column_new_with_attributes(_("Attribute Name"), rdr
,
722 "markup", FIELD_COL_ATTRIB
, NULL
);
723 gtk_tree_view_column_set_min_width(col
, FIELD_COL_ATTRIB
);
724 gtk_tree_view_append_column(GTK_TREE_VIEW(view_fields
), col
);
726 gtk_container_add( GTK_CONTAINER(scrollwin
), view_fields
);
728 /* Lower area - Edit area */
729 vboxb
= gtk_vbox_new( FALSE
, 4 );
730 gtk_box_pack_end(GTK_BOX(vbox
), vboxb
, FALSE
, FALSE
, 2);
732 /* Data entry area */
733 table
= gtk_table_new( 3, 3, FALSE
);
734 gtk_box_pack_start(GTK_BOX(vboxb
), table
, FALSE
, FALSE
, 0);
735 gtk_table_set_row_spacings(GTK_TABLE(table
), 4);
736 gtk_table_set_col_spacings(GTK_TABLE(table
), 4);
740 label
= gtk_label_new(_("LDIF Field"));
741 gtk_table_attach(GTK_TABLE(table
), label
, 0, 1, top
, (top
+ 1),
743 gtk_misc_set_alignment(GTK_MISC(label
), 0, 0.5);
745 entryField
= gtk_label_new( "" );
746 gtk_misc_set_alignment(GTK_MISC(entryField
), 0.01, 0.5);
747 gtk_table_attach(GTK_TABLE(table
), entryField
, 1, 3, top
, (top
+ 1),
748 GTK_EXPAND
|GTK_SHRINK
|GTK_FILL
, 0, 0, 0);
752 label
= gtk_label_new(_("Attribute"));
754 * Use an event box to attach some help in the form of a tooltip.
755 * Tried this for the clist but it looked bad.
757 eventBox
= gtk_event_box_new();
758 gtk_container_add( GTK_CONTAINER(eventBox
), label
);
759 gtk_misc_set_alignment(GTK_MISC(label
), 0, 0.5);
760 gtk_table_attach(GTK_TABLE(table
), eventBox
, 0, 1, top
, (top
+ 1),
763 CLAWS_SET_TIP(eventBox
, _(
764 "Choose the LDIF field that will be renamed or selected " \
765 "for import in the list above. Reserved fields (marked " \
766 "with a tick in the \"R\" column), are automatically " \
767 "imported and cannot be renamed. A single click in the " \
768 "Select (\"S\") column will select the field for import " \
769 "with a tick. A single click anywhere in the row will " \
770 "select that field for rename in the input area below " \
771 "the list. A double click anywhere in the row will also " \
772 "select the field for import."));
774 entryAttrib
= gtk_entry_new();
775 gtk_table_attach(GTK_TABLE(table
), entryAttrib
, 1, 3, top
, (top
+ 1),
776 GTK_EXPAND
|GTK_SHRINK
|GTK_FILL
, 0, 0, 0);
778 CLAWS_SET_TIP(entryAttrib
,
779 _( "The LDIF field can be renamed to the User Attribute name." ));
784 checkSelect
= gtk_check_button_new_with_label( _( "Select for Import" ) );
785 gtk_table_attach(GTK_TABLE(table
), checkSelect
, 1, 2, top
, (top
+ 1),
786 GTK_EXPAND
|GTK_SHRINK
|GTK_FILL
, 0, 0, 0);
788 CLAWS_SET_TIP(checkSelect
,
789 _( "Select the LDIF field for import into the address book." ));
791 btnModify
= gtk_button_new_with_label( _(" Modify "));
792 gtk_table_attach(GTK_TABLE(table
), btnModify
, 2, 3, top
, (top
+ 1),
795 CLAWS_SET_TIP(btnModify
,
796 _( "This button will update the list above with the data supplied." ));
798 gtk_widget_show_all(vbox
);
801 g_signal_connect(G_OBJECT(view_fields
), "cursor-changed",
802 G_CALLBACK(imp_ldif_field_list_cursor_changed
), NULL
);
803 g_signal_connect(G_OBJECT(view_fields
), "row-activated",
804 G_CALLBACK(imp_ldif_field_list_row_activated
), NULL
);
805 g_signal_connect(G_OBJECT(btnModify
), "clicked",
806 G_CALLBACK(imp_ldif_modify_pressed
), NULL
);
807 g_signal_connect(G_OBJECT(entryAttrib
), "activate",
808 G_CALLBACK(imp_ldif_entryattrib_activate
), NULL
);
810 impldif_dlg
.view_fields
= view_fields
;
811 impldif_dlg
.entryField
= entryField
;
812 impldif_dlg
.entryAttrib
= entryAttrib
;
813 impldif_dlg
.checkSelect
= checkSelect
;
814 impldif_dlg
.btnModify
= btnModify
;
818 * Format notebook finish page.
819 * \param pageNum Page (tab) number.
820 * \param pageLbl Page (tab) label.
822 static void imp_ldif_page_finish( gint pageNum
, gchar
*pageLbl
) {
826 GtkWidget
*labelBook
;
827 GtkWidget
*labelFile
;
828 GtkWidget
*labelRecs
;
831 vbox
= gtk_vbox_new(FALSE
, 8);
832 gtk_container_add( GTK_CONTAINER( impldif_dlg
.notebook
), vbox
);
833 gtk_container_set_border_width( GTK_CONTAINER (vbox
), BORDER_WIDTH
);
835 label
= gtk_label_new( pageLbl
);
836 gtk_widget_show( label
);
837 gtk_notebook_set_tab_label(
838 GTK_NOTEBOOK( impldif_dlg
.notebook
),
839 gtk_notebook_get_nth_page( GTK_NOTEBOOK( impldif_dlg
.notebook
), pageNum
),
842 table
= gtk_table_new(3, 2, FALSE
);
843 gtk_box_pack_start(GTK_BOX(vbox
), table
, FALSE
, FALSE
, 0);
844 gtk_container_set_border_width( GTK_CONTAINER(table
), 8 );
845 gtk_table_set_row_spacings(GTK_TABLE(table
), 8);
846 gtk_table_set_col_spacings(GTK_TABLE(table
), 8);
850 label
= gtk_label_new( _( "Address Book:" ) );
851 gtk_table_attach(GTK_TABLE(table
), label
, 0, 1, top
, (top
+ 1), GTK_FILL
, 0, 0, 0);
852 gtk_misc_set_alignment(GTK_MISC(label
), 1, 0.5);
854 labelBook
= gtk_label_new("");
855 gtk_table_attach(GTK_TABLE(table
), labelBook
, 1, 2, top
, (top
+ 1), GTK_FILL
, 0, 0, 0);
856 gtk_misc_set_alignment(GTK_MISC(labelBook
), 0, 0.5);
860 label
= gtk_label_new( _( "File Name:" ) );
861 gtk_table_attach(GTK_TABLE(table
), label
, 0, 1, top
, (top
+ 1), GTK_FILL
, 0, 0, 0);
862 gtk_misc_set_alignment(GTK_MISC(label
), 1, 0.5);
864 labelFile
= gtk_label_new("");
865 gtk_table_attach(GTK_TABLE(table
), labelFile
, 1, 2, top
, (top
+ 1), GTK_FILL
, 0, 0, 0);
866 gtk_misc_set_alignment(GTK_MISC(labelFile
), 0, 0.5);
870 label
= gtk_label_new( _("Records Imported:") );
871 gtk_table_attach(GTK_TABLE(table
), label
, 0, 1, top
, (top
+ 1), GTK_FILL
, 0, 0, 0);
872 gtk_misc_set_alignment(GTK_MISC(label
), 1, 0.5);
874 labelRecs
= gtk_label_new("");
875 gtk_table_attach(GTK_TABLE(table
), labelRecs
, 1, 2, top
, (top
+ 1), GTK_FILL
, 0, 0, 0);
876 gtk_misc_set_alignment(GTK_MISC(labelRecs
), 0, 0.5);
878 impldif_dlg
.labelBook
= labelBook
;
879 impldif_dlg
.labelFile
= labelFile
;
880 impldif_dlg
.labelRecords
= labelRecs
;
884 * Create main dialog decorations (excluding notebook pages).
886 static void imp_ldif_dialog_create() {
894 GtkWidget
*btnProceed
;
895 GtkWidget
*btnCancel
;
897 GtkWidget
*statusbar
;
899 window
= gtkut_window_new(GTK_WINDOW_TOPLEVEL
, "importldif");
900 gtk_widget_set_size_request(window
, IMPORTLDIF_WIDTH
, IMPORTLDIF_HEIGHT
);
901 gtk_container_set_border_width( GTK_CONTAINER(window
), 0 );
902 gtk_window_set_title( GTK_WINDOW(window
), _("Import LDIF file into Address Book") );
903 gtk_window_set_position(GTK_WINDOW(window
), GTK_WIN_POS_CENTER
);
904 gtk_window_set_type_hint(GTK_WINDOW(window
), GDK_WINDOW_TYPE_HINT_DIALOG
);
905 g_signal_connect(G_OBJECT(window
), "delete_event",
906 G_CALLBACK(imp_ldif_delete_event
),
908 g_signal_connect(G_OBJECT(window
), "key_press_event",
909 G_CALLBACK(imp_ldif_key_pressed
),
912 vbox
= gtk_vbox_new(FALSE
, 4);
913 gtk_widget_show(vbox
);
914 gtk_container_add(GTK_CONTAINER(window
), vbox
);
916 vnbox
= gtk_vbox_new(FALSE
, 4);
917 gtk_container_set_border_width(GTK_CONTAINER(vnbox
), 4);
918 gtk_widget_show(vnbox
);
919 gtk_box_pack_start(GTK_BOX(vbox
), vnbox
, TRUE
, TRUE
, 0);
922 notebook
= gtk_notebook_new();
923 gtk_notebook_set_show_tabs( GTK_NOTEBOOK(notebook
), FALSE
);
924 gtk_widget_show(notebook
);
925 gtk_box_pack_start(GTK_BOX(vnbox
), notebook
, TRUE
, TRUE
, 0);
926 gtk_container_set_border_width(GTK_CONTAINER(notebook
), 6);
929 hsbox
= gtk_hbox_new(FALSE
, 0);
930 gtk_box_pack_end(GTK_BOX(vbox
), hsbox
, FALSE
, FALSE
, BORDER_WIDTH
);
931 statusbar
= gtk_statusbar_new();
932 gtk_box_pack_start(GTK_BOX(hsbox
), statusbar
, TRUE
, TRUE
, BORDER_WIDTH
);
935 gtkut_stock_button_set_create(&hbbox
,
936 &btnCancel
, GTK_STOCK_CANCEL
,
937 &btnPrev
, GTK_STOCK_GO_BACK
,
938 &btnNext
, GTK_STOCK_GO_FORWARD
);
940 btnProceed
= gtk_button_new_with_mnemonic(_("Proceed"));
941 gtk_button_set_image(GTK_BUTTON(btnProceed
),
942 gtk_image_new_from_stock(GTK_STOCK_OK
, GTK_ICON_SIZE_BUTTON
));
943 gtk_widget_set_can_default(btnProceed
, TRUE
);
944 gtk_box_pack_start(GTK_BOX(hbbox
), btnProceed
, TRUE
, TRUE
, 0);
945 gtk_widget_hide(btnProceed
);
947 gtk_box_pack_end(GTK_BOX(vbox
), hbbox
, FALSE
, FALSE
, 0);
948 gtk_container_set_border_width(GTK_CONTAINER(hbbox
), 2);
949 gtk_widget_grab_default(btnNext
);
951 /* Button handlers */
952 g_signal_connect(G_OBJECT(btnPrev
), "clicked",
953 G_CALLBACK(imp_ldif_prev
), NULL
);
954 g_signal_connect(G_OBJECT(btnNext
), "clicked",
955 G_CALLBACK(imp_ldif_next
), NULL
);
956 g_signal_connect(G_OBJECT(btnProceed
), "clicked",
957 G_CALLBACK(imp_ldif_next
), NULL
);
958 g_signal_connect(G_OBJECT(btnCancel
), "clicked",
959 G_CALLBACK(imp_ldif_cancel
), NULL
);
961 gtk_widget_show_all(vbox
);
963 impldif_dlg
.window
= window
;
964 impldif_dlg
.notebook
= notebook
;
965 impldif_dlg
.btnPrev
= btnPrev
;
966 impldif_dlg
.btnNext
= btnNext
;
967 impldif_dlg
.btnProceed
= btnProceed
;
968 impldif_dlg
.btnCancel
= btnCancel
;
969 impldif_dlg
.statusbar
= statusbar
;
970 impldif_dlg
.status_cid
= gtk_statusbar_get_context_id(
971 GTK_STATUSBAR(statusbar
), "Import LDIF Dialog" );
976 * Create import LDIF dialog.
978 static void imp_ldif_create() {
979 imp_ldif_dialog_create();
980 imp_ldif_page_file( PAGE_FILE_INFO
, _( "File Info" ) );
981 imp_ldif_page_fields( PAGE_ATTRIBUTES
, _( "Attributes" ) );
982 imp_ldif_page_finish( PAGE_FINISH
, _( "Finish" ) );
983 gtk_widget_show_all( impldif_dlg
.window
);
988 * \param addrIndex Address index.
989 * \return Address book file of imported data, or <i>NULL</i> if import
992 AddressBookFile
*addressbook_imp_ldif( AddressIndex
*addrIndex
) {
996 _importedBook_
= NULL
;
997 _imp_addressIndex_
= addrIndex
;
999 if( ! impldif_dlg
.window
)
1002 view
= impldif_dlg
.view_fields
;
1003 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(view
));
1005 gtk_button_set_label(GTK_BUTTON(impldif_dlg
.btnCancel
),
1007 gtk_widget_hide(impldif_dlg
.btnProceed
);
1008 gtk_widget_show(impldif_dlg
.btnNext
);
1010 impldif_dlg
.cancelled
= FALSE
;
1011 gtk_widget_show(impldif_dlg
.window
);
1012 manage_window_set_transient(GTK_WINDOW(impldif_dlg
.window
));
1013 gtk_widget_grab_default(impldif_dlg
.btnNext
);
1014 gtk_window_set_modal(GTK_WINDOW(impldif_dlg
.window
), TRUE
);
1016 gtk_entry_set_text( GTK_ENTRY(impldif_dlg
.entryName
), IMPORTLDIF_GUESS_NAME
);
1017 gtk_entry_set_text( GTK_ENTRY(impldif_dlg
.entryFile
), "" );
1018 gtk_label_set_text( GTK_LABEL(impldif_dlg
.entryField
), "" );
1019 gtk_entry_set_text( GTK_ENTRY(impldif_dlg
.entryAttrib
), "" );
1020 gtk_list_store_clear( GTK_LIST_STORE(model
) );
1021 gtk_notebook_set_current_page( GTK_NOTEBOOK(impldif_dlg
.notebook
), PAGE_FILE_INFO
);
1022 gtk_widget_set_sensitive( impldif_dlg
.btnPrev
, FALSE
);
1023 gtk_widget_set_sensitive( impldif_dlg
.btnNext
, TRUE
);
1024 stock_pixbuf_gdk(STOCK_PIXMAP_MARK
, &markxpm
);
1026 gtk_widget_grab_focus(impldif_dlg
.entryFile
);
1028 impldif_dlg
.rowCount
= 0;
1029 g_free( impldif_dlg
.nameBook
);
1030 g_free( impldif_dlg
.fileName
);
1031 impldif_dlg
.nameBook
= NULL
;
1032 impldif_dlg
.fileName
= NULL
;
1034 _ldifFile_
= ldif_create();
1036 gtk_widget_hide(impldif_dlg
.window
);
1037 gtk_window_set_modal(GTK_WINDOW(impldif_dlg
.window
), FALSE
);
1038 ldif_free( _ldifFile_
);
1040 _imp_addressIndex_
= NULL
;
1042 g_free( impldif_dlg
.nameBook
);
1043 g_free( impldif_dlg
.fileName
);
1044 impldif_dlg
.nameBook
= NULL
;
1045 impldif_dlg
.fileName
= NULL
;
1047 if( impldif_dlg
.cancelled
== TRUE
) return NULL
;
1048 return _importedBook_
;
1052 * ============================================================================
1054 * ============================================================================