Chameleon

Chameleon Svn Source Tree

Root/tags/2.0/i386/config/checklist.c

Source at commit 1808 created 12 years 3 months ago.
By blackosx, Revise layout of package installer 'Welcome' file so it looks cleaner. Change the copyright notice to begin from 2009 as seen in the Chameleon 2.0 r431 installer. Should this date be set earlier?
1/*
2 * checklist.c -- implements the checklist box
3 *
4 * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
5 * Stuart Herbert - S.Herbert@sheffield.ac.uk: radiolist extension
6 * Alessandro Rubini - rubini@ipvvis.unipv.it: merged the two
7 * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 */
23
24#include "dialog.h"
25
26static int list_width, check_x, item_x;
27
28/*
29 * Print list item
30 */
31static void print_item(WINDOW * win, int choice, int selected)
32{
33int i;
34char *list_item = malloc(list_width + 1);
35
36strncpy(list_item, item_str(), list_width - item_x);
37list_item[list_width - item_x] = '\0';
38
39/* Clear 'residue' of last item */
40wattrset(win, dlg.menubox.atr);
41wmove(win, choice, 0);
42for (i = 0; i < list_width; i++)
43waddch(win, ' ');
44
45wmove(win, choice, check_x);
46wattrset(win, selected ? dlg.check_selected.atr
47 : dlg.check.atr);
48if (!item_is_tag(':'))
49wprintw(win, "(%c)", item_is_tag('X') ? 'X' : ' ');
50
51wattrset(win, selected ? dlg.tag_selected.atr : dlg.tag.atr);
52mvwaddch(win, choice, item_x, list_item[0]);
53wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
54waddstr(win, list_item + 1);
55if (selected) {
56wmove(win, choice, check_x + 1);
57wrefresh(win);
58}
59free(list_item);
60}
61
62/*
63 * Print the scroll indicators.
64 */
65static void print_arrows(WINDOW * win, int choice, int item_no, int scroll,
66 int y, int x, int height)
67{
68wmove(win, y, x);
69
70if (scroll > 0) {
71wattrset(win, dlg.uarrow.atr);
72waddch(win, ACS_UARROW);
73waddstr(win, "(-)");
74} else {
75wattrset(win, dlg.menubox.atr);
76waddch(win, ACS_HLINE);
77waddch(win, ACS_HLINE);
78waddch(win, ACS_HLINE);
79waddch(win, ACS_HLINE);
80}
81
82y = y + height + 1;
83wmove(win, y, x);
84
85if ((height < item_no) && (scroll + choice < item_no - 1)) {
86wattrset(win, dlg.darrow.atr);
87waddch(win, ACS_DARROW);
88waddstr(win, "(+)");
89} else {
90wattrset(win, dlg.menubox_border.atr);
91waddch(win, ACS_HLINE);
92waddch(win, ACS_HLINE);
93waddch(win, ACS_HLINE);
94waddch(win, ACS_HLINE);
95}
96}
97
98/*
99 * Display the termination buttons
100 */
101static void print_buttons(WINDOW * dialog, int height, int width, int selected)
102{
103int x = width / 2 - 11;
104int y = height - 2;
105
106print_button(dialog, gettext("Select"), y, x, selected == 0);
107print_button(dialog, gettext(" Help "), y, x + 14, selected == 1);
108
109wmove(dialog, y, x + 1 + 14 * selected);
110wrefresh(dialog);
111}
112
113/*
114 * Display a dialog box with a list of options that can be turned on or off
115 * in the style of radiolist (only one option turned on at a time).
116 */
117int dialog_checklist(const char *title, const char *prompt, int height,
118 int width, int list_height)
119{
120int i, x, y, box_x, box_y;
121int key = 0, button = 0, choice = 0, scroll = 0, max_choice;
122WINDOW *dialog, *list;
123
124/* which item to highlight */
125item_foreach() {
126if (item_is_tag('X'))
127choice = item_n();
128if (item_is_selected()) {
129choice = item_n();
130break;
131}
132}
133
134do_resize:
135if (getmaxy(stdscr) < (height + 6))
136return -ERRDISPLAYTOOSMALL;
137if (getmaxx(stdscr) < (width + 6))
138return -ERRDISPLAYTOOSMALL;
139
140max_choice = MIN(list_height, item_count());
141
142/* center dialog box on screen */
143x = (COLS - width) / 2;
144y = (LINES - height) / 2;
145
146draw_shadow(stdscr, y, x, height, width);
147
148dialog = newwin(height, width, y, x);
149keypad(dialog, TRUE);
150
151draw_box(dialog, 0, 0, height, width,
152 dlg.dialog.atr, dlg.border.atr);
153wattrset(dialog, dlg.border.atr);
154mvwaddch(dialog, height - 3, 0, ACS_LTEE);
155for (i = 0; i < width - 2; i++)
156waddch(dialog, ACS_HLINE);
157wattrset(dialog, dlg.dialog.atr);
158waddch(dialog, ACS_RTEE);
159
160print_title(dialog, title, width);
161
162wattrset(dialog, dlg.dialog.atr);
163print_autowrap(dialog, prompt, width - 2, 1, 3);
164
165list_width = width - 6;
166box_y = height - list_height - 5;
167box_x = (width - list_width) / 2 - 1;
168
169/* create new window for the list */
170list = subwin(dialog, list_height, list_width, y + box_y + 1,
171 x + box_x + 1);
172
173keypad(list, TRUE);
174
175/* draw a box around the list items */
176draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2,
177 dlg.menubox_border.atr, dlg.menubox.atr);
178
179/* Find length of longest item in order to center checklist */
180check_x = 0;
181item_foreach()
182check_x = MAX(check_x, strlen(item_str()) + 4);
183check_x = MIN(check_x, list_width);
184
185check_x = (list_width - check_x) / 2;
186item_x = check_x + 4;
187
188if (choice >= list_height) {
189scroll = choice - list_height + 1;
190choice -= scroll;
191}
192
193/* Print the list */
194for (i = 0; i < max_choice; i++) {
195item_set(scroll + i);
196print_item(list, i, i == choice);
197}
198
199print_arrows(dialog, choice, item_count(), scroll,
200 box_y, box_x + check_x + 5, list_height);
201
202print_buttons(dialog, height, width, 0);
203
204wnoutrefresh(dialog);
205wnoutrefresh(list);
206doupdate();
207
208while (key != KEY_ESC) {
209key = wgetch(dialog);
210
211for (i = 0; i < max_choice; i++) {
212item_set(i + scroll);
213if (toupper(key) == toupper(item_str()[0]))
214break;
215}
216
217if (i < max_choice || key == KEY_UP || key == KEY_DOWN ||
218 key == '+' || key == '-') {
219if (key == KEY_UP || key == '-') {
220if (!choice) {
221if (!scroll)
222continue;
223/* Scroll list down */
224if (list_height > 1) {
225/* De-highlight current first item */
226item_set(scroll);
227print_item(list, 0, FALSE);
228scrollok(list, TRUE);
229wscrl(list, -1);
230scrollok(list, FALSE);
231}
232scroll--;
233item_set(scroll);
234print_item(list, 0, TRUE);
235print_arrows(dialog, choice, item_count(),
236 scroll, box_y, box_x + check_x + 5, list_height);
237
238wnoutrefresh(dialog);
239wrefresh(list);
240
241continue;/* wait for another key press */
242} else
243i = choice - 1;
244} else if (key == KEY_DOWN || key == '+') {
245if (choice == max_choice - 1) {
246if (scroll + choice >= item_count() - 1)
247continue;
248/* Scroll list up */
249if (list_height > 1) {
250/* De-highlight current last item before scrolling up */
251item_set(scroll + max_choice - 1);
252print_item(list,
253 max_choice - 1,
254 FALSE);
255scrollok(list, TRUE);
256wscrl(list, 1);
257scrollok(list, FALSE);
258}
259scroll++;
260item_set(scroll + max_choice - 1);
261print_item(list, max_choice - 1, TRUE);
262
263print_arrows(dialog, choice, item_count(),
264 scroll, box_y, box_x + check_x + 5, list_height);
265
266wnoutrefresh(dialog);
267wrefresh(list);
268
269continue;/* wait for another key press */
270} else
271i = choice + 1;
272}
273if (i != choice) {
274/* De-highlight current item */
275item_set(scroll + choice);
276print_item(list, choice, FALSE);
277/* Highlight new item */
278choice = i;
279item_set(scroll + choice);
280print_item(list, choice, TRUE);
281wnoutrefresh(dialog);
282wrefresh(list);
283}
284continue;/* wait for another key press */
285}
286switch (key) {
287case 'H':
288case 'h':
289case '?':
290button = 1;
291/* fall-through */
292case 'S':
293case 's':
294case ' ':
295case '\n':
296item_foreach()
297item_set_selected(0);
298item_set(scroll + choice);
299item_set_selected(1);
300delwin(list);
301delwin(dialog);
302return button;
303case TAB:
304case KEY_LEFT:
305case KEY_RIGHT:
306button = ((key == KEY_LEFT ? --button : ++button) < 0)
307 ? 1 : (button > 1 ? 0 : button);
308
309print_buttons(dialog, height, width, button);
310wrefresh(dialog);
311break;
312case 'X':
313case 'x':
314key = KEY_ESC;
315break;
316case KEY_ESC:
317key = on_key_esc(dialog);
318break;
319case KEY_RESIZE:
320delwin(list);
321delwin(dialog);
322on_key_resize();
323goto do_resize;
324}
325
326/* Now, update everything... */
327doupdate();
328}
329delwin(list);
330delwin(dialog);
331return key;/* ESC pressed */
332}
333

Archive Download this file

Revision: 1808