]> git.deb.at Git - pkg/abook.git/blob - list.c
Minor tweaks
[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(char *option_name)
39 {
40         int i, ret = -1;
41         char *option_str;
42
43         assert(option_name != NULL);
44         
45         option_str = options_get_str(option_name);
46
47         if(option_str && *option_str) {
48                 for(i = 0; i < ITEM_FIELDS; i++) {
49                         if(!strcasecmp(option_str, abook_fields[i].key)) {
50                                 ret = i;
51                                 break;
52                         }
53                 }
54                 if(ret < MIN_EXTRA_COLUMN || ret > MAX_EXTRA_COLUMN) {
55                         ret = -1;
56                 }
57         }
58
59         return ret;
60 }
61
62 void
63 init_list()
64 {
65         list = newwin(LIST_LINES, LIST_COLS, LIST_TOP, 0);
66         scrollok(list, TRUE);
67
68         /*
69          * init extra_column and extra alternative
70          */
71
72         extra_column = init_extra_field("extra_column");
73         extra_alternative = init_extra_field("extra_alternative");
74 }
75
76 void
77 close_list()
78 {
79         delwin(list);
80         list = NULL;
81 }
82
83 void
84 refresh_list()
85 {
86         int i, line;
87         
88         werase(list);
89
90         ui_print_number_of_items();
91         
92         if( items < 1 ) {
93                 refresh();
94                 wrefresh(list);
95                 return;
96         }
97         
98         if(curitem < 0)
99                 curitem = 0;
100
101         if(first_list_item < 0)
102                 first_list_item = 0;
103
104         if(curitem < first_list_item)
105                 first_list_item = curitem;
106         else if(curitem > LAST_LIST_ITEM)
107                 first_list_item = max(curitem - LIST_LINES + 1, 0);
108
109         for( line = 0, i = first_list_item ; i <= LAST_LIST_ITEM && i < items;
110                         line++, i++ ) {
111
112                 print_list_line(i, line, i == curitem);
113         }
114
115         wrefresh(list);
116 }
117
118 void
119 print_list_line(int i, int line, int highlight)
120 {
121         int extra = extra_column;
122         char tmp[MAX_EMAILSTR_LEN];
123         int real_emaillen = (extra_column > 0 || extra_alternative > 0) ?
124                 EMAILLEN : COLS - EMAILPOS;
125
126         scrollok(list, FALSE);
127         if(highlight)
128                 highlight_line(list, line);
129
130         if( selected[i] )
131                 mvwaddch(list, line, 0, '*' );
132         
133         mvwaddnstr(list, line, NAMEPOS, database[i][NAME], NAMELEN);
134         if( options_get_int( "show_all_emails"  ) )
135                 mvwaddnstr(list, line, EMAILPOS, database[i][EMAIL],
136                                 real_emaillen);
137         else {
138                 get_first_email(tmp, i);
139                 mvwaddnstr(list, line, EMAILPOS, tmp, real_emaillen);
140         }
141
142         if(extra < 0 || !database[i][extra])
143                 extra = extra_alternative;
144         if(extra >= 0)
145                 mvwaddnstr(list, line, EXTRAPOS,
146                                 safe_str(database[i][extra]),
147                                 EXTRALEN);
148
149         scrollok(list, TRUE);
150         if(highlight)
151                 wstandend(list);
152 }
153         
154
155 void
156 list_headerline()
157 {
158 #ifdef A_BOLD
159         attrset(A_BOLD);
160 #else
161         /* hmm, maybe something here */
162 #endif
163         mvaddstr(2, NAMEPOS, abook_fields[NAME].name);
164         mvaddstr(2, EMAILPOS, abook_fields[EMAIL].name);
165         if(extra_column > 0)
166                 mvaddnstr(2, EXTRAPOS, abook_fields[extra_column].name,
167                                 COLS-EXTRAPOS);
168 #ifdef A_BOLD
169         attrset(A_NORMAL);
170 #endif
171 }
172
173 void
174 scroll_up()
175 {
176         if( curitem < 1 )
177                 return;
178
179         curitem--;
180
181         refresh_list();
182 }
183
184 void
185 scroll_down()
186 {
187         if( curitem > items - 2 )
188                 return;
189
190         curitem++;
191
192         refresh_list();
193 }
194
195
196 void
197 page_up()
198 {
199         if( curitem < 1 )
200                 return;
201         
202         curitem = curitem == first_list_item ?
203                 ((curitem -= LIST_LINES) < 0 ? 0 : curitem) : first_list_item;
204         
205         refresh_list();
206 }
207
208 void
209 page_down()
210 {
211         if( curitem > items - 2 )
212                 return;
213
214         curitem = curitem == LAST_LIST_ITEM ?
215                 ((curitem += LIST_LINES) > LAST_ITEM ? LAST_ITEM : curitem) :
216                 min(LAST_LIST_ITEM, LAST_ITEM);
217
218         refresh_list();
219 }
220
221
222 void
223 select_none()
224 {
225         memset( selected, 0, items );
226 }
227
228 void
229 select_all()
230 {
231         memset( selected, 1, items );
232 }
233
234 void
235 move_curitem(int direction)
236 {
237         list_item tmp;
238
239         if( curitem < 0 || curitem > LAST_ITEM )
240                 return;
241
242         itemcpy(tmp, database[curitem]);
243
244         switch(direction) {
245                 case MOVE_ITEM_UP:
246                         if( curitem < 1 )
247                                 return;
248                         itemcpy(database[curitem], database[curitem - 1]);
249                         itemcpy(database[curitem-1], tmp);
250                         scroll_up();
251                         break;
252
253                 case MOVE_ITEM_DOWN:
254                         if( curitem >= LAST_ITEM )
255                                 return;
256                         itemcpy(database[curitem], database[curitem + 1]);
257                         itemcpy(database[curitem+1], tmp);
258                         scroll_down();
259                         break;
260         }
261 }
262
263 void
264 goto_home()
265 {
266         if(items > 0)
267                 curitem = 0;
268         
269         refresh_list();
270 }
271
272 void
273 goto_end()
274 {
275         if(items > 0)
276                 curitem = LAST_ITEM;
277
278         refresh_list();
279 }
280
281
282 void
283 highlight_line(WINDOW *win, int line)
284 {
285         wstandout(win);
286         
287 #ifdef mvwchgat
288         mvwchgat(win, line, 0, -1,  A_STANDOUT, 0, NULL);
289 #else
290         /*
291          * buggy function: FIXME
292          */
293         scrollok(win, FALSE);
294         {
295                 int i;
296                 wmove(win, line, 0);
297                 for(i = 0; i < COLS; i++)
298                         waddch(win, ' ');
299         /*wattrset(win, 0);*/
300         }
301         scrollok(win, TRUE);
302 #endif
303 }
304
305 int
306 selected_items()
307 {
308         int i, n = 0;
309
310         for(i = 0; i < items; i++)
311                 if(selected[i])
312                         n++;
313
314         return n;
315 }
316
317 void
318 invert_selection()
319 {
320         int i;
321
322         if( items < 1 )
323                 return;
324
325         for(i = 0; i < items; i++)
326                 selected[i] = !selected[i];
327 }
328
329 int
330 list_current_item()
331 {
332         return curitem;
333 }
334
335 int
336 list_is_empty()
337 {
338         return items < 1;
339 }
340
341