progressbox.c revision 217309
1217309Snwhitehorn/* 2217309Snwhitehorn * $Id: progressbox.c,v 1.8 2010/01/12 10:46:24 tom Exp $ 3217309Snwhitehorn * 4217309Snwhitehorn * progressbox.c -- implements the progress box 5217309Snwhitehorn * 6217309Snwhitehorn * Copyright 2005 Valery Reznic 7217309Snwhitehorn * 8217309Snwhitehorn * This program is free software; you can redistribute it and/or modify 9217309Snwhitehorn * it under the terms of the GNU Lesser General Public License as 10217309Snwhitehorn * published by the Free Software Foundation; either version 2.1 of the 11217309Snwhitehorn * License, or (at your option) any later version. 12217309Snwhitehorn * 13217309Snwhitehorn * This program is distributed in the hope that it will be useful, but 14217309Snwhitehorn * WITHOUT ANY WARRANTY; without even the implied warranty of 15217309Snwhitehorn * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16217309Snwhitehorn * Lesser General Public License for more details. 17217309Snwhitehorn * 18217309Snwhitehorn * You should have received a copy of the GNU Lesser General Public 19217309Snwhitehorn * License along with this program; if not, write to 20217309Snwhitehorn * Free Software Foundation, Inc. 21217309Snwhitehorn * 51 Franklin St., Fifth Floor 22217309Snwhitehorn * Boston, MA 02110, USA. 23217309Snwhitehorn */ 24217309Snwhitehorn 25217309Snwhitehorn#include <dialog.h> 26217309Snwhitehorn#include <dlg_keys.h> 27217309Snwhitehorn 28217309Snwhitehorn#define MIN_HIGH (4) 29217309Snwhitehorn#define MIN_WIDE (10 + 2 * (2 + MARGIN)) 30217309Snwhitehorn 31217309Snwhitehorntypedef struct { 32217309Snwhitehorn DIALOG_CALLBACK obj; 33217309Snwhitehorn WINDOW *text; 34217309Snwhitehorn char line[MAX_LEN + 1]; 35217309Snwhitehorn int is_eof; 36217309Snwhitehorn} MY_OBJ; 37217309Snwhitehorn 38217309Snwhitehorn/* 39217309Snwhitehorn * Return current line of text. 40217309Snwhitehorn */ 41217309Snwhitehornstatic char * 42217309Snwhitehornget_line(MY_OBJ * obj) 43217309Snwhitehorn{ 44217309Snwhitehorn FILE *fp = obj->obj.input; 45217309Snwhitehorn int col = 0; 46217309Snwhitehorn int j, tmpint, ch; 47217309Snwhitehorn 48217309Snwhitehorn while (1) { 49217309Snwhitehorn if ((ch = getc(fp)) == EOF) { 50217309Snwhitehorn obj->is_eof = 1; 51217309Snwhitehorn if (col) { 52217309Snwhitehorn break; 53217309Snwhitehorn } else { 54217309Snwhitehorn return NULL; 55217309Snwhitehorn } 56217309Snwhitehorn } 57217309Snwhitehorn if (ch == '\n') 58217309Snwhitehorn break; 59217309Snwhitehorn if (ch == '\r') 60217309Snwhitehorn break; 61217309Snwhitehorn if ((ch == TAB) && (dialog_vars.tab_correct)) { 62217309Snwhitehorn tmpint = dialog_state.tab_len 63217309Snwhitehorn - (col % dialog_state.tab_len); 64217309Snwhitehorn for (j = 0; j < tmpint; j++) { 65217309Snwhitehorn if (col < MAX_LEN) 66217309Snwhitehorn obj->line[col] = ' '; 67217309Snwhitehorn ++col; 68217309Snwhitehorn } 69217309Snwhitehorn } else { 70217309Snwhitehorn obj->line[col] = (char) ch; 71217309Snwhitehorn ++col; 72217309Snwhitehorn } 73217309Snwhitehorn if (col >= MAX_LEN) 74217309Snwhitehorn break; 75217309Snwhitehorn } 76217309Snwhitehorn 77217309Snwhitehorn obj->line[col] = '\0'; 78217309Snwhitehorn 79217309Snwhitehorn return obj->line; 80217309Snwhitehorn} 81217309Snwhitehorn 82217309Snwhitehorn/* 83217309Snwhitehorn * Print a new line of text. 84217309Snwhitehorn */ 85217309Snwhitehornstatic void 86217309Snwhitehornprint_line(MY_OBJ * obj, WINDOW *win, int row, int width) 87217309Snwhitehorn{ 88217309Snwhitehorn int i, y, x; 89217309Snwhitehorn char *line = obj->line; 90217309Snwhitehorn 91217309Snwhitehorn (void) wmove(win, row, 0); /* move cursor to correct line */ 92217309Snwhitehorn (void) waddch(win, ' '); 93217309Snwhitehorn#ifdef NCURSES_VERSION 94217309Snwhitehorn (void) waddnstr(win, line, MIN((int) strlen(line), width - 2)); 95217309Snwhitehorn#else 96217309Snwhitehorn line[MIN((int) strlen(line), width - 2)] = '\0'; 97217309Snwhitehorn waddstr(win, line); 98217309Snwhitehorn#endif 99217309Snwhitehorn 100217309Snwhitehorn getyx(win, y, x); 101217309Snwhitehorn /* Clear 'residue' of previous line */ 102217309Snwhitehorn for (i = 0; i < width - x; i++) 103217309Snwhitehorn (void) waddch(win, ' '); 104217309Snwhitehorn} 105217309Snwhitehorn 106217309Snwhitehorn/* 107217309Snwhitehorn * Display text from a stdin in a scrolling window. 108217309Snwhitehorn */ 109217309Snwhitehornint 110217309Snwhitehorndialog_progressbox(const char *title, const char *cprompt, int height, int width) 111217309Snwhitehorn{ 112217309Snwhitehorn int i; 113217309Snwhitehorn int x, y, thigh; 114217309Snwhitehorn WINDOW *dialog, *text; 115217309Snwhitehorn MY_OBJ *obj; 116217309Snwhitehorn FILE *fd = dialog_state.pipe_input; 117217309Snwhitehorn char *prompt = dlg_strclone(cprompt); 118217309Snwhitehorn 119217309Snwhitehorn dlg_tab_correct_str(prompt); 120217309Snwhitehorn dlg_auto_size(title, prompt, &height, &width, MIN_HIGH, MIN_WIDE); 121217309Snwhitehorn dlg_print_size(height, width); 122217309Snwhitehorn dlg_ctl_size(height, width); 123217309Snwhitehorn 124217309Snwhitehorn x = dlg_box_x_ordinate(width); 125217309Snwhitehorn y = dlg_box_y_ordinate(height); 126217309Snwhitehorn thigh = height - (2 * MARGIN); 127217309Snwhitehorn 128217309Snwhitehorn dialog = dlg_new_window(height, width, y, x); 129217309Snwhitehorn 130217309Snwhitehorn dlg_draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); 131217309Snwhitehorn dlg_draw_title(dialog, title); 132217309Snwhitehorn 133217309Snwhitehorn if (*prompt != '\0') { 134217309Snwhitehorn int y2, x2; 135217309Snwhitehorn 136217309Snwhitehorn wattrset(dialog, dialog_attr); 137217309Snwhitehorn dlg_print_autowrap(dialog, prompt, height, width); 138217309Snwhitehorn getyx(dialog, y2, x2); 139217309Snwhitehorn ++y2; 140217309Snwhitehorn wmove(dialog, y2, MARGIN); 141217309Snwhitehorn for (i = 0; i < getmaxx(dialog) - 2 * MARGIN; i++) 142217309Snwhitehorn (void) waddch(dialog, dlg_boxchar(ACS_HLINE)); 143217309Snwhitehorn y += y2; 144217309Snwhitehorn thigh -= y2; 145217309Snwhitehorn } 146217309Snwhitehorn 147217309Snwhitehorn /* Create window for text region, used for scrolling text */ 148217309Snwhitehorn text = dlg_sub_window(dialog, 149217309Snwhitehorn thigh, 150217309Snwhitehorn width - (2 * MARGIN), 151217309Snwhitehorn y + MARGIN, 152217309Snwhitehorn x + MARGIN); 153217309Snwhitehorn 154217309Snwhitehorn (void) wrefresh(dialog); 155217309Snwhitehorn 156217309Snwhitehorn (void) wmove(dialog, thigh, (MARGIN + 1)); 157217309Snwhitehorn (void) wnoutrefresh(dialog); 158217309Snwhitehorn 159217309Snwhitehorn obj = dlg_calloc(MY_OBJ, 1); 160217309Snwhitehorn assert_ptr(obj, "dialog_progressbox"); 161217309Snwhitehorn 162217309Snwhitehorn obj->obj.input = fd; 163217309Snwhitehorn obj->obj.win = dialog; 164217309Snwhitehorn obj->text = text; 165217309Snwhitehorn 166217309Snwhitehorn dlg_attr_clear(text, thigh, getmaxx(text), dialog_attr); 167217309Snwhitehorn for (i = 0; get_line(obj); i++) { 168217309Snwhitehorn if (i < thigh) { 169217309Snwhitehorn print_line(obj, text, i, width - (2 * MARGIN)); 170217309Snwhitehorn } else { 171217309Snwhitehorn scrollok(text, TRUE); 172217309Snwhitehorn scroll(text); 173217309Snwhitehorn scrollok(text, FALSE); 174217309Snwhitehorn print_line(obj, text, thigh - 1, width - (2 * MARGIN)); 175217309Snwhitehorn } 176217309Snwhitehorn (void) wnoutrefresh(text); 177217309Snwhitehorn (void) wrefresh(text); 178217309Snwhitehorn if (obj->is_eof) 179217309Snwhitehorn break; 180217309Snwhitehorn } 181217309Snwhitehorn dlg_unregister_window(text); 182217309Snwhitehorn dlg_del_window(dialog); 183217309Snwhitehorn free(prompt); 184217309Snwhitehorn free(obj); 185217309Snwhitehorn 186217309Snwhitehorn return DLG_EXIT_OK; 187217309Snwhitehorn} 188