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