00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#include "dialog.h"
00023
00024
00025
00026 bool use_colors = 1;
00027
00028 const char *
backtitle = NULL;
00029
00030 const char *
dialog_result;
00031
00032
00033
00034
00035 chtype
attributes[] =
00036 {
00037 A_NORMAL,
00038 A_NORMAL,
00039 A_NORMAL,
00040 A_BOLD,
00041 A_NORMAL,
00042 A_REVERSE,
00043 A_DIM,
00044 A_REVERSE,
00045 A_BOLD,
00046 A_REVERSE,
00047 A_NORMAL,
00048 A_NORMAL,
00049 A_NORMAL,
00050 A_NORMAL,
00051 A_BOLD,
00052 A_NORMAL,
00053 A_BOLD,
00054 A_NORMAL,
00055 A_NORMAL,
00056 A_NORMAL,
00057 A_REVERSE,
00058 A_BOLD,
00059 A_REVERSE,
00060 A_BOLD,
00061 A_REVERSE,
00062 A_BOLD,
00063 A_REVERSE,
00064 A_BOLD,
00065 A_BOLD
00066 };
00067
00068
00069
#include "colors.h"
00070
00071
00072
00073
00074 int color_table[][3] =
00075 {
00076 {
SCREEN_FG,
SCREEN_BG,
SCREEN_HL},
00077 {
SHADOW_FG,
SHADOW_BG,
SHADOW_HL},
00078 {
DIALOG_FG,
DIALOG_BG,
DIALOG_HL},
00079 {
TITLE_FG,
TITLE_BG,
TITLE_HL},
00080 {
BORDER_FG,
BORDER_BG,
BORDER_HL},
00081 {
BUTTON_ACTIVE_FG,
BUTTON_ACTIVE_BG,
BUTTON_ACTIVE_HL},
00082 {
BUTTON_INACTIVE_FG,
BUTTON_INACTIVE_BG,
BUTTON_INACTIVE_HL},
00083 {
BUTTON_KEY_ACTIVE_FG,
BUTTON_KEY_ACTIVE_BG,
BUTTON_KEY_ACTIVE_HL},
00084 {
BUTTON_KEY_INACTIVE_FG,
BUTTON_KEY_INACTIVE_BG,
BUTTON_KEY_INACTIVE_HL},
00085 {
BUTTON_LABEL_ACTIVE_FG,
BUTTON_LABEL_ACTIVE_BG,
BUTTON_LABEL_ACTIVE_HL},
00086 {
BUTTON_LABEL_INACTIVE_FG,
BUTTON_LABEL_INACTIVE_BG,
00087
BUTTON_LABEL_INACTIVE_HL},
00088 {
INPUTBOX_FG,
INPUTBOX_BG,
INPUTBOX_HL},
00089 {
INPUTBOX_BORDER_FG,
INPUTBOX_BORDER_BG,
INPUTBOX_BORDER_HL},
00090 {
SEARCHBOX_FG,
SEARCHBOX_BG,
SEARCHBOX_HL},
00091 {
SEARCHBOX_TITLE_FG,
SEARCHBOX_TITLE_BG,
SEARCHBOX_TITLE_HL},
00092 {
SEARCHBOX_BORDER_FG,
SEARCHBOX_BORDER_BG,
SEARCHBOX_BORDER_HL},
00093 {
POSITION_INDICATOR_FG,
POSITION_INDICATOR_BG,
POSITION_INDICATOR_HL},
00094 {
MENUBOX_FG,
MENUBOX_BG,
MENUBOX_HL},
00095 {
MENUBOX_BORDER_FG,
MENUBOX_BORDER_BG,
MENUBOX_BORDER_HL},
00096 {
ITEM_FG,
ITEM_BG,
ITEM_HL},
00097 {
ITEM_SELECTED_FG,
ITEM_SELECTED_BG,
ITEM_SELECTED_HL},
00098 {
TAG_FG,
TAG_BG,
TAG_HL},
00099 {
TAG_SELECTED_FG,
TAG_SELECTED_BG,
TAG_SELECTED_HL},
00100 {
TAG_KEY_FG,
TAG_KEY_BG,
TAG_KEY_HL},
00101 {
TAG_KEY_SELECTED_FG,
TAG_KEY_SELECTED_BG,
TAG_KEY_SELECTED_HL},
00102 {
CHECK_FG,
CHECK_BG,
CHECK_HL},
00103 {
CHECK_SELECTED_FG,
CHECK_SELECTED_BG,
CHECK_SELECTED_HL},
00104 {
UARROW_FG,
UARROW_BG,
UARROW_HL},
00105 {
DARROW_FG,
DARROW_BG,
DARROW_HL},
00106 };
00107
00108
00109
00110
00111
void
00112 attr_clear (WINDOW * win,
int height,
int width, chtype attr)
00113 {
00114
int i, j;
00115
00116 wattrset (win, attr);
00117
for (i = 0; i < height; i++) {
00118 wmove (win, i, 0);
00119
for (j = 0; j < width; j++)
00120 waddch (win,
' ');
00121 }
00122 touchwin (win);
00123 }
00124
00125 void dialog_clear (
void)
00126 {
00127
attr_clear (stdscr, LINES, COLS,
screen_attr);
00128
00129
if (
backtitle != NULL) {
00130
int i;
00131
00132 wattrset (stdscr,
screen_attr);
00133 mvwaddstr (stdscr, 0, 1, (
char *)
backtitle);
00134 wmove (stdscr, 1, 1);
00135
for (i = 1; i < COLS - 1; i++)
00136 waddch (stdscr,
ACS_HLINE);
00137 }
00138 wnoutrefresh (stdscr);
00139 }
00140
00141
00142
00143
00144
void
00145 init_dialog (
void)
00146 {
00147 initscr ();
00148 keypad (stdscr, TRUE);
00149 cbreak ();
00150 noecho ();
00151
00152
00153
if (
use_colors)
00154
color_setup ();
00155
00156
00157
dialog_clear ();
00158 }
00159
00160
00161
00162
00163
void
00164 color_setup (
void)
00165 {
00166
int i;
00167
00168
if (has_colors ()) {
00169 start_color ();
00170
00171
00172
for (i = 0; i <
ATTRIBUTE_COUNT; i++)
00173 init_pair (i + 1,
color_table[i][0],
color_table[i][1]);
00174
00175
00176
for (i = 0; i <
ATTRIBUTE_COUNT; i++)
00177
attributes[i] =
C_ATTR (
color_table[i][2], i + 1);
00178 }
00179 }
00180
00181
00182
00183
00184
void
00185 end_dialog (
void)
00186 {
00187 endwin ();
00188 }
00189
00190
00191
00192
00193
00194
00195
00196
00197
void
00198 print_autowrap (WINDOW * win,
const char *prompt,
int width,
int y,
int x)
00199 {
00200
int newl, cur_x, cur_y;
00201
int i, prompt_len, room, wlen;
00202
char tempstr[
MAX_LEN + 1], *word, *sp, *sp2;
00203
00204 strcpy (tempstr, prompt);
00205
00206 prompt_len = strlen(tempstr);
00207
00208
00209
00210
00211
for(i=0; i<prompt_len; i++) {
00212
if(tempstr[i] ==
'\n') tempstr[i] =
' ';
00213 }
00214
00215
if (prompt_len <= width - x * 2) {
00216 wmove (win, y, (width - prompt_len) / 2);
00217 waddstr (win, tempstr);
00218 }
else {
00219 cur_x = x;
00220 cur_y = y;
00221 newl = 1;
00222 word = tempstr;
00223
while (word && *word) {
00224 sp = index(word,
' ');
00225
if (sp)
00226 *sp++ = 0;
00227
00228
00229
00230
00231 room = width - cur_x;
00232 wlen = strlen(word);
00233
if (wlen > room ||
00234 (newl && wlen < 4 && sp && wlen+1+strlen(sp) > room
00235 && (!(sp2 = index(sp,
' ')) || wlen+1+(sp2-sp) > room))) {
00236 cur_y++;
00237 cur_x = x;
00238 }
00239 wmove (win, cur_y, cur_x);
00240 waddstr (win, word);
00241 getyx (win, cur_y, cur_x);
00242 cur_x++;
00243
if (sp && *sp ==
' ') {
00244 cur_x++;
00245
while (*++sp ==
' ');
00246 newl = 1;
00247 }
else
00248 newl = 0;
00249 word = sp;
00250 }
00251 }
00252 }
00253
00254
00255
00256
00257
void
00258 print_button (WINDOW * win,
const char *label,
int y,
int x,
int selected)
00259 {
00260
int i, temp;
00261
00262 wmove (win, y, x);
00263 wattrset (win, selected ?
button_active_attr :
button_inactive_attr);
00264 waddstr (win,
"<");
00265 temp = strspn (
label,
" ");
00266
label += temp;
00267 wattrset (win, selected ?
button_label_active_attr
00268 :
button_label_inactive_attr);
00269
for (i = 0; i < temp; i++)
00270 waddch (win,
' ');
00271 wattrset (win, selected ?
button_key_active_attr
00272 :
button_key_inactive_attr);
00273 waddch (win,
label[0]);
00274 wattrset (win, selected ?
button_label_active_attr
00275 :
button_label_inactive_attr);
00276 waddstr (win, (
char *)
label + 1);
00277 wattrset (win, selected ?
button_active_attr :
button_inactive_attr);
00278 waddstr (win,
">");
00279 wmove (win, y, x + temp + 1);
00280 }
00281
00282
00283
00284
00285
void
00286 draw_box (WINDOW * win,
int y,
int x,
int height,
int width,
00287 chtype box, chtype border)
00288 {
00289
int i, j;
00290
00291 wattrset (win, 0);
00292
for (i = 0; i < height; i++) {
00293 wmove (win, y + i, x);
00294
for (j = 0; j < width; j++)
00295
if (!i && !j)
00296 waddch (win, border |
ACS_ULCORNER);
00297
else if (i == height - 1 && !j)
00298 waddch (win, border |
ACS_LLCORNER);
00299
else if (!i && j == width - 1)
00300 waddch (win, box |
ACS_URCORNER);
00301
else if (i == height - 1 && j == width - 1)
00302 waddch (win, box |
ACS_LRCORNER);
00303
else if (!i)
00304 waddch (win, border |
ACS_HLINE);
00305
else if (i == height - 1)
00306 waddch (win, box |
ACS_HLINE);
00307
else if (!j)
00308 waddch (win, border |
ACS_VLINE);
00309
else if (j == width - 1)
00310 waddch (win, box |
ACS_VLINE);
00311
else
00312 waddch (win, box |
' ');
00313 }
00314 }
00315
00316
00317
00318
00319
00320
void
00321 draw_shadow (WINDOW * win,
int y,
int x,
int height,
int width)
00322 {
00323
int i;
00324
00325
if (has_colors ()) {
00326 wattrset (win,
shadow_attr);
00327 wmove (win, y + height, x + 2);
00328
for (i = 0; i < width; i++)
00329 waddch (win, winch (win) & A_CHARTEXT);
00330
for (i = y + 1; i < y + height + 1; i++) {
00331 wmove (win, i, x + width);
00332 waddch (win, winch (win) & A_CHARTEXT);
00333 waddch (win, winch (win) & A_CHARTEXT);
00334 }
00335 wnoutrefresh (win);
00336 }
00337 }
00338
00339
00340
00341
00342
int
00343 first_alpha(
const char *string,
const char *exempt)
00344 {
00345
int i, in_paren=0, c;
00346
00347
for (i = 0; i < strlen(string); i++) {
00348 c = tolower(string[i]);
00349
00350
if (strchr(
"<[(", c)) ++in_paren;
00351
if (strchr(
">])", c) && in_paren > 0) --in_paren;
00352
00353
if ((! in_paren) && isalpha(c) &&
00354 strchr(exempt, c) == 0)
00355
return i;
00356 }
00357
00358
return 0;
00359 }