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