summaryrefslogtreecommitdiff
path: root/src/editbook.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/editbook.c')
-rw-r--r--src/editbook.c360
1 files changed, 360 insertions, 0 deletions
diff --git a/src/editbook.c b/src/editbook.c
new file mode 100644
index 0000000..4e42e43
--- /dev/null
+++ b/src/editbook.c
@@ -0,0 +1,360 @@
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/*
21 * Edit new address book entry.
22 */
23
24#ifdef HAVE_CONFIG_H
25# include "config.h"
26#endif
27
28#include "defs.h"
29
30#include <glib.h>
31#include <glib/gi18n.h>
32#include <gdk/gdkkeysyms.h>
33#include <gtk/gtkwindow.h>
34#include <gtk/gtksignal.h>
35#include <gtk/gtkvbox.h>
36#include <gtk/gtklabel.h>
37#include <gtk/gtkentry.h>
38#include <gtk/gtktable.h>
39#include <gtk/gtkbutton.h>
40#include <gtk/gtkstatusbar.h>
41#include <gtk/gtkhseparator.h>
42#include <gtk/gtkstock.h>
43
44#include "utils.h"
45#include "prefs_common.h"
46#include "mgutils.h"
47#include "addressbook.h"
48#include "addressitem.h"
49#include "addrindex.h"
50#include "addrbook.h"
51#include "manage_window.h"
52#include "gtkutils.h"
53
54#define ADDRESSBOOK_GUESS_BOOK "MyAddressBook"
55
56static struct _AddrBookEdit_Dlg {
57 GtkWidget *window;
58 GtkWidget *name_entry;
59 GtkWidget *file_label;
60 GtkWidget *hbbox;
61 GtkWidget *ok_btn;
62 GtkWidget *cancel_btn;
63 GtkWidget *check_btn;
64 /* GtkWidget *file_btn; */
65 GtkWidget *statusbar;
66 gint status_cid;
67 AddressBookFile *bookFile;
68} addrbookedit_dlg;
69
70/* static struct _AddressFileSelection vcard_file_selector; */
71
72/*
73* Edit functions.
74*/
75void edit_book_status_show( gchar *msg ) {
76 if( addrbookedit_dlg.statusbar != NULL ) {
77 gtk_statusbar_pop( GTK_STATUSBAR(addrbookedit_dlg.statusbar), addrbookedit_dlg.status_cid );
78 if( msg ) {
79 gtk_statusbar_push(
80 GTK_STATUSBAR(addrbookedit_dlg.statusbar), addrbookedit_dlg.status_cid, msg );
81 }
82 else {
83 gtk_statusbar_push(
84 GTK_STATUSBAR(addrbookedit_dlg.statusbar), addrbookedit_dlg.status_cid, "" );
85 }
86 }
87}
88
89static void edit_book_ok( GtkWidget *widget, gboolean *cancelled ) {
90 *cancelled = FALSE;
91 gtk_main_quit();
92}
93
94static void edit_book_cancel( GtkWidget *widget, gboolean *cancelled ) {
95 *cancelled = TRUE;
96 gtk_main_quit();
97}
98
99static gint edit_book_delete_event( GtkWidget *widget, GdkEventAny *event, gboolean *cancelled ) {
100 *cancelled = TRUE;
101 gtk_main_quit();
102 return TRUE;
103}
104
105static gboolean edit_book_key_pressed( GtkWidget *widget, GdkEventKey *event, gboolean *cancelled ) {
106 if (event && event->keyval == GDK_Escape) {
107 *cancelled = TRUE;
108 gtk_main_quit();
109 }
110 return FALSE;
111}
112
113static void edit_book_file_check( void ) {
114 gint t;
115 gchar *sMsg;
116 AddressBookFile *abf = addrbookedit_dlg.bookFile;
117
118 t = addrbook_test_read_file( abf, abf->fileName );
119 if( t == MGU_SUCCESS ) {
120 sMsg = _("File appears to be Ok.");
121 }
122 else if( t == MGU_BAD_FORMAT ) {
123 sMsg = _("File does not appear to be a valid address book format.");
124 }
125 else {
126 sMsg = _("Could not read file.");
127 }
128 edit_book_status_show( sMsg );
129}
130
131static void edit_book_enable_buttons( gboolean enable ) {
132 gtk_widget_set_sensitive( addrbookedit_dlg.check_btn, enable );
133 /* gtk_widget_set_sensitive( addrbookedit_dlg.file_btn, enable ); */
134}
135
136#if 0
137static void edit_book_name_focus( GtkWidget *widget, GdkEventFocus *event, gpointer data) {
138 edit_book_status_show( "" );
139}
140#endif
141
142static gchar *edit_book_guess_file( AddressBookFile *abf ) {
143 gchar *newFile = NULL;
144 GList *fileList = NULL;
145 gint fileNum = 1;
146 fileList = addrbook_get_bookfile_list( abf );
147 if( fileList ) {
148 fileNum = 1 + abf->maxValue;
149 }
150 newFile = addrbook_gen_new_file_name( fileNum );
151 g_list_free( fileList );
152 fileList = NULL;
153 return newFile;
154}
155
156static void addressbook_edit_book_create( gboolean *cancelled ) {
157 GtkWidget *window;
158 GtkWidget *vbox;
159 GtkWidget *table;
160 GtkWidget *label;
161 GtkWidget *name_entry;
162 GtkWidget *file_label;
163 GtkWidget *hbbox;
164 GtkWidget *hsep;
165 GtkWidget *ok_btn;
166 GtkWidget *cancel_btn;
167 GtkWidget *check_btn;
168 /* GtkWidget *file_btn; */
169 GtkWidget *statusbar;
170 GtkWidget *hsbox;
171 gint top;
172
173 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
174 gtk_widget_set_size_request(window, 450, -1);
175 gtk_container_set_border_width( GTK_CONTAINER(window), 0 );
176 gtk_window_set_title(GTK_WINDOW(window), _("Edit Address Book"));
177 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
178 gtk_window_set_modal(GTK_WINDOW(window), TRUE);
179 g_signal_connect(G_OBJECT(window), "delete_event",
180 G_CALLBACK(edit_book_delete_event),
181 cancelled);
182 g_signal_connect(G_OBJECT(window), "key_press_event",
183 G_CALLBACK(edit_book_key_pressed),
184 cancelled);
185
186 vbox = gtk_vbox_new(FALSE, 8);
187 gtk_container_add(GTK_CONTAINER(window), vbox);
188 gtk_container_set_border_width( GTK_CONTAINER(vbox), 0 );
189
190 table = gtk_table_new(2, 3, FALSE);
191 gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
192 gtk_container_set_border_width( GTK_CONTAINER(table), 8 );
193 gtk_table_set_row_spacings(GTK_TABLE(table), 8);
194 gtk_table_set_col_spacings(GTK_TABLE(table), 8 );
195
196 /* First row */
197 top = 0;
198 label = gtk_label_new(_("Name"));
199 gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
200 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
201
202 name_entry = gtk_entry_new();
203 gtk_table_attach(GTK_TABLE(table), name_entry, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
204
205 check_btn = gtk_button_new_with_label( _(" Check File "));
206 gtk_table_attach(GTK_TABLE(table), check_btn, 2, 3, top, (top + 1), GTK_FILL, 0, 3, 0);
207
208 /* Second row */
209 top = 1;
210 label = gtk_label_new(_("File"));
211 gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
212 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
213
214 file_label = gtk_label_new( "" );
215 gtk_misc_set_alignment(GTK_MISC(file_label), 0, 0.5);
216 gtk_table_attach(GTK_TABLE(table), file_label, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
217
218 /* file_btn = gtk_button_new_with_label( _(" ... ")); */
219 /* gtk_table_attach(GTK_TABLE(table), file_btn, 2, 3, top, (top + 1), GTK_FILL, 0, 3, 0); */
220
221 /* Status line */
222 hsbox = gtk_hbox_new(FALSE, 0);
223 gtk_box_pack_end(GTK_BOX(vbox), hsbox, FALSE, FALSE, 0);
224 statusbar = gtk_statusbar_new();
225 gtk_box_pack_start(GTK_BOX(hsbox), statusbar, TRUE, TRUE, 0);
226
227 /* Button panel */
228 gtkut_stock_button_set_create(&hbbox, &ok_btn, GTK_STOCK_OK,
229 &cancel_btn, GTK_STOCK_CANCEL,
230 NULL, NULL);
231 gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
232 gtk_container_set_border_width( GTK_CONTAINER(hbbox), 0 );
233 gtk_widget_grab_default(ok_btn);
234
235 hsep = gtk_hseparator_new();
236 gtk_box_pack_end(GTK_BOX(vbox), hsep, FALSE, FALSE, 0);
237
238 /* g_signal_connect(G_OBJECT(name_entry), "focus_in_event",
239 G_CALLBACK(edit_book_name_focus), NULL ); */
240 g_signal_connect(G_OBJECT(ok_btn), "clicked",
241 G_CALLBACK(edit_book_ok), cancelled);
242 g_signal_connect(G_OBJECT(cancel_btn), "clicked",
243 G_CALLBACK(edit_book_cancel), cancelled);
244/* g_signal_connect(G_OBJECT(file_btn), "clicked", */
245/* G_CALLBACK(edit_book_file_select), NULL); */
246 g_signal_connect(G_OBJECT(check_btn), "clicked",
247 G_CALLBACK(edit_book_file_check), NULL);
248
249 gtk_widget_show_all(vbox);
250
251 addrbookedit_dlg.window = window;
252 addrbookedit_dlg.name_entry = name_entry;
253 addrbookedit_dlg.file_label = file_label;
254 addrbookedit_dlg.hbbox = hbbox;
255 addrbookedit_dlg.ok_btn = ok_btn;
256 addrbookedit_dlg.cancel_btn = cancel_btn;
257 addrbookedit_dlg.check_btn = check_btn;
258 /* addrbookedit_dlg.file_btn = file_btn; */
259 addrbookedit_dlg.statusbar = statusbar;
260 addrbookedit_dlg.status_cid = gtk_statusbar_get_context_id( GTK_STATUSBAR(statusbar), "Edit Address Book Dialog" );
261}
262
263AdapterDSource *addressbook_edit_book( AddressIndex *addrIndex, AdapterDSource *ads ) {
264 static gboolean cancelled;
265 gchar *sName;
266 AddressDataSource *ds = NULL;
267 AddressBookFile *abf;
268 gboolean fin;
269 gboolean newBook = FALSE;
270 gchar *newFile = NULL;
271
272 if (!addrbookedit_dlg.window)
273 addressbook_edit_book_create(&cancelled);
274 gtkut_box_set_reverse_order(GTK_BOX(addrbookedit_dlg.hbbox),
275 !prefs_common.comply_gnome_hig);
276 gtk_widget_grab_focus(addrbookedit_dlg.ok_btn);
277 gtk_widget_grab_focus(addrbookedit_dlg.name_entry);
278 gtk_widget_show(addrbookedit_dlg.window);
279 manage_window_set_transient(GTK_WINDOW(addrbookedit_dlg.window));
280
281 edit_book_status_show( "" );
282 gtk_label_set_text( GTK_LABEL(addrbookedit_dlg.file_label), "" );
283 if( ads ) {
284 ds = ads->dataSource;
285 abf = ds->rawDataSource;
286 if (abf->name)
287 gtk_entry_set_text(GTK_ENTRY(addrbookedit_dlg.name_entry), abf->name);
288 if( abf->fileName )
289 gtk_label_set_text(GTK_LABEL(addrbookedit_dlg.file_label), abf->fileName);
290 gtk_window_set_title( GTK_WINDOW(addrbookedit_dlg.window), _("Edit Address Book"));
291 edit_book_enable_buttons( TRUE );
292 }
293 else {
294 gchar *tmp = NULL;
295 newBook = TRUE;
296 abf = addrbook_create_book();
297 addrbook_set_path( abf, addrIndex->filePath );
298
299 /* Take initial guess at file name */
300 newFile = edit_book_guess_file( abf );
301 if( newFile ) {
302 tmp = g_strdup_printf( "<%s>", newFile );
303 gtk_label_set_text(GTK_LABEL(addrbookedit_dlg.file_label), tmp );
304 g_free( tmp );
305 }
306 g_free( newFile );
307
308 gtk_entry_set_text( GTK_ENTRY(addrbookedit_dlg.name_entry), ADDRESSBOOK_GUESS_BOOK );
309 gtk_window_set_title( GTK_WINDOW(addrbookedit_dlg.window), _("Add New Address Book") );
310 edit_book_enable_buttons( FALSE );
311 }
312
313 addrbookedit_dlg.bookFile = abf;
314
315 gtk_main();
316 gtk_widget_hide(addrbookedit_dlg.window);
317
318 if( cancelled == TRUE ) {
319 if( newBook ) {
320 addrbook_free_book( abf );
321 abf = NULL;
322 }
323 return NULL;
324 }
325
326 fin = FALSE;
327 sName = gtk_editable_get_chars( GTK_EDITABLE(addrbookedit_dlg.name_entry), 0, -1 );
328 g_strstrip(sName);
329 if( *sName == '\0' || *sName == '@' ) fin = TRUE;
330
331 if( fin ) {
332 if( newBook ) {
333 addrbook_free_book( abf );
334 abf = NULL;
335 }
336 }
337 else {
338 if( newBook ) {
339 /* Get final file name in case it changed */
340 newFile = edit_book_guess_file( abf );
341 addrbook_set_file( abf, newFile );
342 g_free( newFile );
343 ds = addrindex_index_add_datasource( addrIndex, ADDR_IF_BOOK, abf );
344 ads = addressbook_create_ds_adapter( ds, ADDR_BOOK, NULL );
345 }
346 addressbook_ads_set_name( ads, sName );
347 addrbook_set_name( abf, sName );
348 abf->dirtyFlag = TRUE;
349 }
350 g_free( sName );
351
352 /* Save data */
353 if( abf ) addrbook_save_data( abf );
354
355 return ads;
356}
357
358/*
359* End of Source.
360*/