]> git.deb.at Git - pkg/abook.git/blob - list.c
- remove trailing whitespaces
[pkg/abook.git] / list.c
1
2 /*
3  * $Id$
4  *
5  * by JH <jheinonen@users.sourceforge.net>
6  *
7  * Copyright (C) Jaakko Heinonen
8  */
9
10 #include <stdio.h>
11 #include <string.h>
12 #include "abook.h"
13 #include <assert.h>
14 #include "ui.h"
15 #include "database.h"
16 #include "edit.h"
17 #include "list.h"
18 #include "misc.h"
19 #include "options.h"
20
21 #define MIN_EXTRA_COLUMN        ADDRESS /* 2 */
22 #define MAX_EXTRA_COLUMN        LAST_FIELD
23
24 int curitem = -1;
25 int first_list_item = -1;
26 char *selected = NULL;
27
28 int extra_column = -1;
29 int extra_alternative = -1;
30
31 extern int items;
32 extern list_item *database;
33 extern struct abook_field abook_fields[];
34
35 WINDOW *list = NULL;
36
37 static int
38 init_extra_field(enum str_opts option)
39 {
40         int i, ret = -1;
41         char *option_str;
42
43         option_str = opt_get_str(option);
44
45         if(option_str && *option_str) {
46                 for(i = 0; i < ITEM_FIELDS; i++) {
47                         if(!strcasecmp(option_str, abook_fields[i].key)) {
48                                 ret = i;
49                                 break;
50                         }
51                 }
52                 if(ret < MIN_EXTRA_COLUMN || ret > MAX_EXTRA_COLUMN) {
53                         ret = -1;
54                 }
55         }
56
57         return ret;
58 }
59
60 void
61 init_list()
62 {
63         list = newwin(LIST_LINES, LIST_COLS, LIST_TOP, 0);
64         scrollok(list, TRUE);
65
66         /*
67          * init extra_column and extra alternative
68          */
69
70         extra_column = init_extra_field(STR_EXTRA_COLUMN);
71         extra_alternative = init_extra_field(STR_EXTRA_ALTERNATIVE);
72 }
73
74 void
75 close_list()
76 {
77         delwin(list);
78         list = NULL;
79 }
80
81 void
82 refresh_list()
83 {
84         int i, line;
85
86         werase(list);
87
88         ui_print_number_of_items();
89
90         if(items < 1) {
91                 refresh();
92                 wrefresh(list);
93                 return;
94         }
95
96         if(curitem < 0)
97                 curitem = 0;
98
99         if(first_list_item < 0)
100                 first_list_item = 0;
101
102         if(curitem < first_list_item)
103                 first_list_item = curitem;
104         else if(curitem > LAST_LIST_ITEM)
105                 first_list_item = max(curitem - LIST_LINES + 1, 0);
106
107         for( line = 0, i = first_list_item ; i <= LAST_LIST_ITEM && i < items;
108                         line++, i++ ) {
109
110                 print_list_line(i, line, i == curitem);
111         }
112
113         if(opt_get_bool(BOOL_SHOW_CURSOR)) {
114                 wmove(list, curitem - first_list_item, 0);
115                 /* need to call refresh() to update the cursor positions */
116                 refresh();
117         }
118         wrefresh(list);
119 }
120
121 void
122 print_list_line(int i, int line, int highlight)
123 {
124         int extra = extra_column;
125         char tmp[MAX_EMAILSTR_LEN];
126         int real_emaillen = (extra_column > 0 || extra_alternative > 0) ?
127                 EMAILLEN : COLS - EMAILPOS;
128
129         scrollok(list, FALSE);
130         if(highlight)
131                 highlight_line(list, line);
132
133         if(selected[i])
134                 mvwaddch(list, line, 0, '*' );
135
136         mvwaddnstr(list, line, NAMEPOS, database[i][NAME],
137                 bytes2width(database[i][NAME], NAMELEN));
138         if(opt_get_bool(BOOL_SHOW_ALL_EMAILS))
139                 mvwaddnstr(list, line, EMAILPOS, database[i][EMAIL],
140                                 bytes2width(database[i][EMAIL], real_emaillen));
141         else {
142                 get_first_email(tmp, i);
143                 mvwaddnstr(list, line, EMAILPOS, tmp,
144                         bytes2width(tmp, real_emaillen));
145         }
146
147         if(extra < 0 || !database[i][extra])
148                 extra = extra_alternative;
149         if(extra >= 0)
150                 mvwaddnstr(list, line, EXTRAPOS,
151                         safe_str(database[i][extra]),
152                         bytes2width(safe_str(database[i][extra]), EXTRALEN));
153
154         scrollok(list, TRUE);
155         if(highlight)
156                 wstandend(list);
157 }
158
159
160 void
161 list_headerline()
162 {
163 #if defined(A_BOLD) && defined(A_NORMAL)
164         attrset(A_BOLD);
165 #endif
166         mvaddstr(2, NAMEPOS, abook_fields[NAME].name);
167         mvaddstr(2, EMAILPOS, abook_fields[EMAIL].name);
168         if(extra_column > 0)
169                 mvaddnstr(2, EXTRAPOS, abook_fields[extra_column].name,
170                                 COLS-EXTRAPOS);
171 #if defined(A_BOLD) && defined(A_NORMAL)
172         attrset(A_NORMAL);
173 #endif
174 }
175
176 void
177 scroll_up()
178 {
179         if(curitem < 1)
180                 return;
181
182         curitem--;
183
184         refresh_list();
185 }
186
187 void
188 scroll_down()
189 {
190         if(curitem > items - 2)
191                 return;
192
193         curitem++;
194
195         refresh_list();
196 }
197
198
199 void
200 page_up()
201 {
202         if(curitem < 1)
203                 return;
204
205         curitem = curitem == first_list_item ?
206                 ((curitem -= LIST_LINES) < 0 ? 0 : curitem) : first_list_item;
207
208         refresh_list();
209 }
210
211 void
212 page_down()
213 {
214         if(curitem > items - 2)
215                 return;
216
217         curitem = curitem == LAST_LIST_ITEM ?
218                 ((curitem += LIST_LINES) > LAST_ITEM ? LAST_ITEM : curitem) :
219                 min(LAST_LIST_ITEM, LAST_ITEM);
220
221         refresh_list();
222 }
223
224 void
225 select_none()
226 {
227         memset(selected, 0, items);
228 }
229
230 void
231 select_all()
232 {
233         memset(selected, 1, items);
234 }
235
236 void
237 move_curitem(int direction)
238 {
239         list_item tmp;
240
241         if( curitem < 0 || curitem > LAST_ITEM )
242                 return;
243
244         itemcpy(tmp, database[curitem]);
245
246         switch(direction) {
247                 case MOVE_ITEM_UP:
248                         if( curitem < 1 )
249                                 return;
250                         itemcpy(database[curitem], database[curitem - 1]);
251                         itemcpy(database[curitem-1], tmp);
252                         scroll_up();
253                         break;
254
255                 case MOVE_ITEM_DOWN:
256                         if( curitem >= LAST_ITEM )
257                                 return;
258                         itemcpy(database[curitem], database[curitem + 1]);
259                         itemcpy(database[curitem+1], tmp);
260                         scroll_down();
261                         break;
262         }
263 }
264
265 void
266 goto_home()
267 {
268         if(items > 0)
269                 curitem = 0;
270
271         refresh_list();
272 }
273
274 void
275 goto_end()
276 {
277         if(items > 0)
278                 curitem = LAST_ITEM;
279
280         refresh_list();
281 }
282
283
284 void
285 highlight_line(WINDOW *win, int line)
286 {
287         wstandout(win);
288
289         /*
290          * this is a tricky one
291          */
292 #if 0
293 /*#ifdef mvwchgat*/
294         mvwchgat(win, line, 0, -1,  A_STANDOUT, 0, NULL);
295 #else
296         /*
297          * buggy function: FIXME
298          */
299         scrollok(win, FALSE);
300         {
301                 int i;
302                 wmove(win, line, 0);
303                 for(i = 0; i < COLS; i++)
304                         waddch(win, ' ');
305         /*wattrset(win, 0);*/
306         }
307         scrollok(win, TRUE);
308 #endif
309 }
310
311 int
312 selected_items()
313 {
314         int i, n = 0;
315
316         for(i = 0; i < items; i++)
317                 if(selected[i])
318                         n++;
319
320         return n;
321 }
322
323 void
324 invert_selection()
325 {
326         int i;
327
328         if(items < 1)
329                 return;
330
331         for(i = 0; i < items; i++)
332                 selected[i] = !selected[i];
333 }
334
335 int
336 list_current_item()
337 {
338         return curitem;
339 }
340
341 int
342 list_is_empty()
343 {
344         return items < 1;
345 }
346
347 int
348 duplicate_item()
349 {
350         int i;
351         list_item item;
352
353         if(curitem < 0)
354                 return 1;
355
356         for(i = 0; i < ITEM_FIELDS; i++)
357                 item[i] = database[curitem][i] ? strdup(database[curitem][i]) :
358                         NULL;
359
360         if(add_item2database(item))
361                 return 1;
362
363         curitem = LAST_ITEM;
364         refresh_list();
365
366         return 0;
367 }
368