editbook.c (9437B)
1 /* 2 * Claws Mail -- a GTK based, lightweight, and fast e-mail client 3 * Copyright (C) 2001-2022 the Claws Mail team and 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 3 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, see <http://www.gnu.org/licenses/>. 17 */ 18 19 /* 20 * Edit new address book entry. 21 */ 22 23 #include "defs.h" 24 25 #include <glib.h> 26 #include <glib/gi18n.h> 27 #include <gdk/gdkkeysyms.h> 28 #include <gtk/gtk.h> 29 30 #include "utils.h" 31 #include "prefs_common.h" 32 #include "mgutils.h" 33 #include "addressbook.h" 34 #include "addressitem.h" 35 #include "addrindex.h" 36 #include "addrbook.h" 37 #include "manage_window.h" 38 #include "gtkutils.h" 39 40 #define ADDRESSBOOK_GUESS_BOOK "MyAddressBook" 41 42 static struct _AddrBookEdit_Dlg { 43 GtkWidget *window; 44 GtkWidget *name_entry; 45 GtkWidget *file_label; 46 GtkWidget *ok_btn; 47 GtkWidget *cancel_btn; 48 GtkWidget *check_btn; 49 /* GtkWidget *file_btn; */ 50 GtkWidget *statusbar; 51 gint status_cid; 52 AddressBookFile *bookFile; 53 } addrbookedit_dlg; 54 55 /* 56 * Edit functions. 57 */ 58 static void edit_book_status_show( gchar *msg ) { 59 if( addrbookedit_dlg.statusbar != NULL ) { 60 gtk_statusbar_pop( GTK_STATUSBAR(addrbookedit_dlg.statusbar), addrbookedit_dlg.status_cid ); 61 if( msg ) { 62 gtk_statusbar_push( 63 GTK_STATUSBAR(addrbookedit_dlg.statusbar), addrbookedit_dlg.status_cid, msg ); 64 } 65 else { 66 gtk_statusbar_push( 67 GTK_STATUSBAR(addrbookedit_dlg.statusbar), addrbookedit_dlg.status_cid, "" ); 68 } 69 } 70 } 71 72 static void edit_book_ok( GtkWidget *widget, gboolean *cancelled ) { 73 *cancelled = FALSE; 74 gtk_main_quit(); 75 } 76 77 static void edit_book_cancel( GtkWidget *widget, gboolean *cancelled ) { 78 *cancelled = TRUE; 79 gtk_main_quit(); 80 } 81 82 static gint edit_book_delete_event( GtkWidget *widget, GdkEventAny *event, gboolean *cancelled ) { 83 *cancelled = TRUE; 84 gtk_main_quit(); 85 return TRUE; 86 } 87 88 static void edit_book_file_check( void ) { 89 gint t; 90 gchar *sMsg; 91 AddressBookFile *abf = addrbookedit_dlg.bookFile; 92 93 t = addrbook_test_read_file( abf, abf->fileName ); 94 if( t == MGU_SUCCESS ) { 95 sMsg = _("File appears to be OK."); 96 } 97 else if( t == MGU_BAD_FORMAT ) { 98 sMsg = _("File does not appear to be a valid address book format."); 99 } 100 else { 101 sMsg = _("Could not read file."); 102 } 103 edit_book_status_show( sMsg ); 104 } 105 106 static void edit_book_enable_buttons( gboolean enable ) { 107 gtk_widget_set_sensitive( addrbookedit_dlg.check_btn, enable ); 108 /* gtk_widget_set_sensitive( addrbookedit_dlg.file_btn, enable ); */ 109 } 110 111 static void edit_book_name_focus( GtkWidget *widget, GdkEventFocus *event, gpointer data) { 112 edit_book_status_show( "" ); 113 } 114 115 static void addressbook_edit_book_create( gboolean *cancelled ) { 116 GtkWidget *window; 117 GtkWidget *vbox; 118 GtkWidget *table; 119 GtkWidget *label; 120 GtkWidget *name_entry; 121 GtkWidget *file_label; 122 GtkWidget *hbbox; 123 GtkWidget *hsep; 124 GtkWidget *ok_btn; 125 GtkWidget *cancel_btn; 126 GtkWidget *check_btn; 127 /* GtkWidget *file_btn; */ 128 GtkWidget *statusbar; 129 GtkWidget *hsbox; 130 131 window = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "editbook"); 132 gtk_widget_set_size_request(window, 450, -1); 133 gtk_container_set_border_width( GTK_CONTAINER(window), 0 ); 134 gtk_window_set_title(GTK_WINDOW(window), _("Edit Addressbook")); 135 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); 136 gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG); 137 g_signal_connect(G_OBJECT(window), "delete_event", 138 G_CALLBACK(edit_book_delete_event), 139 cancelled); 140 141 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); 142 gtk_container_add(GTK_CONTAINER(window), vbox); 143 gtk_container_set_border_width( GTK_CONTAINER(vbox), 0 ); 144 145 table = gtk_grid_new(); 146 gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); 147 gtk_container_set_border_width( GTK_CONTAINER(table), 8 ); 148 gtk_grid_set_row_spacing(GTK_GRID(table), 8); 149 gtk_grid_set_column_spacing(GTK_GRID(table), 8); 150 151 /* First row */ 152 label = gtk_label_new(_("Name")); 153 gtk_label_set_xalign(GTK_LABEL(label), 0.0); 154 gtk_grid_attach(GTK_GRID(table), label, 0, 0, 1, 1); 155 156 name_entry = gtk_entry_new(); 157 gtk_grid_attach(GTK_GRID(table), name_entry, 1, 0, 1, 1); 158 gtk_widget_set_hexpand(name_entry, TRUE); 159 gtk_widget_set_halign(name_entry, GTK_ALIGN_FILL); 160 161 check_btn = gtk_button_new_with_label( _(" Check File ")); 162 gtk_grid_attach(GTK_GRID(table), check_btn, 2, 0, 1, 1); 163 164 /* Second row */ 165 label = gtk_label_new(_("File")); 166 gtk_label_set_xalign(GTK_LABEL(label), 0.0); 167 gtk_grid_attach(GTK_GRID(table), label, 0, 1, 1, 1); 168 169 file_label = gtk_label_new( "" ); 170 gtk_label_set_xalign(GTK_LABEL(file_label), 0.0); 171 gtk_grid_attach(GTK_GRID(table), file_label, 1, 1, 1, 1); 172 173 /* Status line */ 174 hsbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); 175 gtk_box_pack_end(GTK_BOX(vbox), hsbox, FALSE, FALSE, BORDER_WIDTH); 176 statusbar = gtk_statusbar_new(); 177 gtk_box_pack_start(GTK_BOX(hsbox), statusbar, TRUE, TRUE, BORDER_WIDTH); 178 179 /* Button panel */ 180 gtkut_stock_button_set_create(&hbbox, &cancel_btn, NULL, _("_Cancel"), 181 &ok_btn, NULL, _("_OK"), 182 NULL, NULL, NULL); 183 gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0); 184 gtk_container_set_border_width( GTK_CONTAINER(hbbox), 0 ); 185 gtk_widget_grab_default(ok_btn); 186 187 hsep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL); 188 gtk_box_pack_end(GTK_BOX(vbox), hsep, FALSE, FALSE, 0); 189 190 g_signal_connect(G_OBJECT(name_entry), "focus_in_event", 191 G_CALLBACK(edit_book_name_focus), NULL ); 192 g_signal_connect(G_OBJECT(ok_btn), "clicked", 193 G_CALLBACK(edit_book_ok), cancelled); 194 g_signal_connect(G_OBJECT(cancel_btn), "clicked", 195 G_CALLBACK(edit_book_cancel), cancelled); 196 /* g_signal_connect(G_OBJECT(file_btn), "clicked", */ 197 /* G_CALLBACK(edit_book_file_select), NULL); */ 198 g_signal_connect(G_OBJECT(check_btn), "clicked", 199 G_CALLBACK(edit_book_file_check), NULL); 200 201 gtk_widget_show_all(vbox); 202 203 addrbookedit_dlg.window = window; 204 addrbookedit_dlg.name_entry = name_entry; 205 addrbookedit_dlg.file_label = file_label; 206 addrbookedit_dlg.ok_btn = ok_btn; 207 addrbookedit_dlg.cancel_btn = cancel_btn; 208 addrbookedit_dlg.check_btn = check_btn; 209 /* addrbookedit_dlg.file_btn = file_btn; */ 210 addrbookedit_dlg.statusbar = statusbar; 211 addrbookedit_dlg.status_cid = gtk_statusbar_get_context_id( 212 GTK_STATUSBAR(statusbar), "Edit Addressbook Dialog" ); 213 } 214 215 AdapterDSource *addressbook_edit_book( AddressIndex *addrIndex, AdapterDSource *ads ) { 216 static gboolean cancelled; 217 gchar *sName; 218 AddressDataSource *ds = NULL; 219 AddressBookFile *abf; 220 gboolean fin; 221 gboolean newBook = FALSE; 222 gchar *newFile = NULL; 223 224 if (!addrbookedit_dlg.window) 225 addressbook_edit_book_create(&cancelled); 226 gtk_widget_grab_focus(addrbookedit_dlg.ok_btn); 227 gtk_widget_grab_focus(addrbookedit_dlg.name_entry); 228 gtk_widget_show(addrbookedit_dlg.window); 229 manage_window_set_transient(GTK_WINDOW(addrbookedit_dlg.window)); 230 gtk_window_set_modal(GTK_WINDOW(addrbookedit_dlg.window), TRUE); 231 232 edit_book_status_show( "" ); 233 gtk_label_set_text( GTK_LABEL(addrbookedit_dlg.file_label), "" ); 234 if( ads ) { 235 ds = ads->dataSource; 236 abf = ds->rawDataSource; 237 if ( addrbook_get_name( abf ) ) 238 gtk_entry_set_text(GTK_ENTRY(addrbookedit_dlg.name_entry), 239 addrbook_get_name( abf ) ); 240 if( abf->fileName ) 241 gtk_label_set_text(GTK_LABEL(addrbookedit_dlg.file_label), abf->fileName); 242 gtk_window_set_title( GTK_WINDOW(addrbookedit_dlg.window), _("Edit Addressbook")); 243 edit_book_enable_buttons( TRUE ); 244 } 245 else { 246 gchar *tmp = NULL; 247 newBook = TRUE; 248 abf = addrbook_create_book(); 249 addrbook_set_path( abf, addrIndex->filePath ); 250 251 /* Take initial guess at file name */ 252 newFile = addrbook_guess_next_file( abf ); 253 if( newFile ) { 254 tmp = g_strdup_printf( "<%s>", newFile ); 255 gtk_label_set_text(GTK_LABEL(addrbookedit_dlg.file_label), tmp ); 256 g_free( tmp ); 257 } 258 g_free( newFile ); 259 260 gtk_entry_set_text( GTK_ENTRY(addrbookedit_dlg.name_entry), ADDRESSBOOK_GUESS_BOOK ); 261 gtk_window_set_title( GTK_WINDOW(addrbookedit_dlg.window), _("Add New Addressbook") ); 262 edit_book_enable_buttons( FALSE ); 263 } 264 265 addrbookedit_dlg.bookFile = abf; 266 267 gtk_main(); 268 gtk_widget_hide(addrbookedit_dlg.window); 269 gtk_window_set_modal(GTK_WINDOW(addrbookedit_dlg.window), FALSE); 270 if( cancelled == TRUE ) { 271 if( newBook ) { 272 addrbook_free_book( abf ); 273 abf = NULL; 274 } 275 return NULL; 276 } 277 278 fin = FALSE; 279 sName = gtk_editable_get_chars( GTK_EDITABLE(addrbookedit_dlg.name_entry), 0, -1 ); 280 if( *sName == '\0' ) fin = TRUE; 281 282 if( fin ) { 283 if( newBook ) { 284 addrbook_free_book( abf ); 285 abf = NULL; 286 } 287 } 288 else { 289 if( newBook ) { 290 /* Get final file name in case it changed */ 291 newFile = addrbook_guess_next_file( abf ); 292 addrbook_set_file( abf, newFile ); 293 g_free( newFile ); 294 ds = addrindex_index_add_datasource( addrIndex, ADDR_IF_BOOK, abf ); 295 ads = addressbook_create_ds_adapter( ds, ADDR_BOOK, NULL ); 296 } 297 addressbook_ads_set_name( ads, sName ); 298 addrbook_set_name( abf, sName ); 299 } 300 g_free( sName ); 301 302 /* Save data */ 303 if( abf ) addrbook_save_data( abf ); 304 305 return ads; 306 }