4 * by JH <jheinonen@bigfoot.com>
6 * Copyright (C) Jaakko Heinonen
11 #include "abook_curses.h"
22 * some extern variables
25 extern struct abook_field abook_fields[];
27 extern list_item *database;
44 mvwhline(editw, TABLINE+1, 0, ACS_HLINE, EDITW_COLS);
46 for(i=0; i < TABS; i++)
47 mvwaddstr(editw, TABLINE, 16 * i + 3, tab_names[i]);
49 mvwaddstr(editw, TABLINE+1, 16 * tab + 2, "/ \\");
53 get_first_email(char *str, int item)
57 if(database[item][EMAIL] == NULL) {
62 strncpy(str, database[item][EMAIL], MAX_EMAIL_LEN);
63 if( (tmp = strchr(str, ',')) )
66 str[MAX_EMAIL_LEN-1] = 0;
72 char tmp[MAX_EMAILSTR_LEN];
75 strcpy(tmp, database[item][EMAIL]);
77 if( !(p = strchr(tmp, ',')) )
82 strcpy(database[item][EMAIL], p+1);
83 strcat(database[item][EMAIL], ",");
84 strcat(database[item][EMAIL], tmp);
91 editw = newwin(EDITW_LINES, EDITW_COLS, EDITW_TOP, EDITW_X);
97 * we have to introduce edit_undo here
99 static void edit_undo(int item, int mode);
111 edit_undo(-1, CLEAR_UNDO);
117 print_editor_header(int item)
120 char email[MAX_EMAIL_LEN];
123 if( (header = (char *)malloc(EDITW_COLS)) == NULL )
126 get_first_email(email, item);
128 if( snprintf(header, EDITW_COLS, "%s <%s>", database[item][NAME],
129 email ) == -1 || !*database[item][EMAIL] )
130 if( snprintf(header, EDITW_COLS, "%s", database[item][NAME]) == -1) {
135 len = strlen(header);
136 x = (EDITW_COLS - len) / 2;
137 mvwaddstr(editw, 0, x, header);
138 for(i = x; i < x + len; i++)
139 mvwaddch(editw,1, i, '^');
144 editor_print_data(int tab, int item)
146 const int pos_x = EDITW_COLS > 70 ? 8:4;
149 for(i = 0, j = 1; i < ITEM_FIELDS; i++) {
150 if(abook_fields[i].tab != tab)
153 if(i==EMAIL) { /* special field */
155 char emails[MAX_EMAILS][MAX_EMAIL_LEN];
156 split_emailstr(item, emails);
157 mvwaddstr(editw, (LINES > 21 ? 7:6), pos_x, "E-mail addresses:");
158 for(k=0; k < MAX_EMAILS; k++)
159 mvwprintw(editw, (LINES > 21 ? 9:7)+k*2, pos_x,
160 "%c -\t\t%s", '2' + k, emails[k] );
164 mvwprintw(editw, 3+j*2, pos_x, "%d - %s",
166 abook_fields[i].name);
167 mvwaddch(editw, 3+j*2, 28, ':');
168 mvwaddstr(editw, 3+j*2, 30, safe_str(database[item][i]));
174 * function: change_field
178 * message to display as a prompt
180 * a pointer to pointer which will point a new string. if the latter
181 * pointer != NULL it will be freed (if user doesn't cancel)
184 * a nonzero value if user has cancelled and zero if user has typed a
189 change_field(char *msg, char **field)
191 char tmp[MAX_FIELD_LEN];
192 int max_len = MAX_FIELD_LEN;
195 if( !strncmp("E-mail", msg, 6) )
196 max_len = MAX_EMAIL_LEN;
198 statusline_addstr(msg);
199 if( (ret = statusline_getnstr( tmp, max_len - 1, 0 ) ? 1:0 ) ) {
202 *field = strdup(tmp);
206 refresh_statusline();
212 change_name_field(char **field)
216 tmp = strdup(*field);
217 change_field("Name: ", field);
219 if( *field == NULL || ! **field ) {
221 *field = strdup(tmp);
228 fix_email_str(char *str)
231 *str = *str == ',' ? '_' : *str;
235 edit_emails(char c, int item)
238 char emails[4][MAX_EMAIL_LEN];
239 char tmp[MAX_EMAILSTR_LEN] = "";
242 split_emailstr(item, emails);
244 if(change_field("E-mail: ", &field)) {
245 fprintf(stderr, "change_field = TRUE\n");
246 return; /* user cancelled ( C-g ) */
249 strncpy(emails[c - '2'], field, MAX_EMAIL_LEN);
250 fix_email_str(emails[c - '2']);
252 *emails[c - '2'] = 0;
254 my_free(database[item][EMAIL]);
258 strcat(tmp, emails[i]);
264 if(tmp[len -1] == ',')
267 database[item][EMAIL] = strdup(tmp);
271 edit_field(int tab, char c, int item)
280 edit_undo(item, BACKUP_ITEM);
282 if(tab == TAB_CONTACT) {
284 case '1': change_name_field(&database[item][NAME]);
289 case '5': edit_emails(c, item); break;
295 for(i=0, j=0; i< ITEM_FIELDS; i++) {
296 if(abook_fields[i].tab == tab)
305 str = mkstr("%s: ", abook_fields[i].name);
306 change_field(str, &database[item][i]);
314 edit_undo(int item, int mode)
317 static list_item *backup = NULL;
322 free_list_item(backup[0]);
328 free_list_item(backup[0]);
331 backup = abook_malloc(sizeof(list_item));
332 for(i = 0; i < ITEM_FIELDS; i++)
333 backup[0][i] = safe_strdup(database[item][i]);
337 free_list_item(database[item]);
338 itemcpy(database[item], backup[0]);
348 static int tab = 0; /* first tab */
352 headerline(EDITOR_HELPLINE);
353 print_editor_header(item);
355 editor_print_data(tab, item);
356 wmove(editw, EDITW_LINES - 1, EDITW_COLS - 1);
361 switch( (c = getch()) ) {
362 case 'c': tab = TAB_CONTACT; break;
363 case 'a': tab = TAB_ADDRESS; break;
364 case 'p': tab = TAB_PHONE; break;
365 case 'o': tab = TAB_OTHER; break;
366 case KEY_LEFT: tab = tab == 0 ? MAX_TAB : tab - 1;
368 case KEY_RIGHT: tab = tab == MAX_TAB ? 0 : tab + 1;
370 case 'r': roll_emails(item); break;
371 case '?': display_editor_help(editw); break;
372 case 'u': edit_undo(item, RESTORE_ITEM); break;
373 default: return edit_field(tab, c, item);
390 while( edit_loop(item) )
402 change_field("Name: ", &field);
407 memset(item, 0, sizeof(item));
411 add_item2database(item);
415 edit_item(LAST_ITEM);