⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 textbox.c

📁 This version of dialog, formerly known as cdialog is based on the Debian package for dialog 0.9a (se
💻 C
📖 第 1 页 / 共 2 页
字号:
    int box_x, box_y, key = 0, box_height = 3, box_width = 30;    int offset = 0;    int fkey;    bool first = TRUE;    box_x = (width - box_width) / 2;    box_y = (height - box_height) / 2;#ifdef HAVE_COLOR    if (dialog_state.use_shadow)	dlg_draw_shadow(dialog, box_y, box_x, box_height, box_width);#endif    dlg_draw_box(dialog, box_y, box_x, box_height, box_width, dialog_attr, searchbox_border_attr);    wattrset(dialog, searchbox_title_attr);    (void) wmove(dialog, box_y, box_x + box_width / 2 - 4);    (void) waddstr(dialog, " Search ");    box_y++;    box_x++;    box_width -= 2;    input[0] = '\0';    for (;;) {	if (!first) {	    key = dlg_getc(dialog, &fkey);	    if (key == ESC)		return DLG_EXIT_ESC;	    if (key == '\n')		return DLG_EXIT_OK;	}	if (dlg_edit_string(input, &offset, key, fkey, first)) {	    dlg_show_string(dialog, input, offset, searchbox_attr,			    box_y, box_x, box_width, FALSE, first);	    first = FALSE;	}    }}static boolperform_search(MY_OBJ * obj, int height, int width, int key, char *search_term){    int dir, tempinx;    long fpos;    bool found;    bool temp, temp1;    bool moved = FALSE;    /* set search direction */    dir = (key == '/' || key == 'n') ? 1 : 0;    if (dir ? !obj->end_reached : !obj->begin_reached) {	if (key == 'n' || key == 'N') {	    if (search_term[0] == '\0') {	/* No search term yet */		(void) beep();		return FALSE;	    }	    /* Get search term from user */	} else if (get_search_term(obj->text, search_term,				   height - 4,				   width - 2) == DLG_EXIT_ESC		   || search_term[0] == '\0') {	    /* ESC pressed, or no search term, reprint page to clear box */	    wattrset(obj->text, dialog_attr);	    back_lines(obj, obj->page_length);	    return TRUE;	}	/* Save variables for restoring in case search term can't be found */	tempinx = obj->in_buf;	temp = obj->begin_reached;	temp1 = obj->end_reached;	fpos = ftell_obj(obj) - obj->fd_bytes_read;	/* update 'in_buf' to point to next (previous) line before	   forward (backward) searching */	back_lines(obj, (dir			 ? obj->page_length - 1			 : obj->page_length + 1));	found = FALSE;	if (dir) {		/* Forward search */	    while ((found = match_string(obj, search_term)) == FALSE) {		if (obj->end_reached)		    break;	    }	} else {		/* Backward search */	    while ((found = match_string(obj, search_term)) == FALSE) {		if (obj->begin_reached)		    break;		back_lines(obj, 2);	    }	}	if (found == FALSE) {	/* not found */	    (void) beep();	    /* Restore program state to that before searching */	    lseek_obj(obj, fpos, SEEK_SET);	    read_high(obj, BUF_SIZE);	    obj->in_buf = tempinx;	    obj->begin_reached = temp;	    obj->end_reached = temp1;	    /* move 'in_buf' to point to start of current page to	     * re-print current page.  Note that 'in_buf' always points	     * to start of next page, so this is necessary	     */	    back_lines(obj, obj->page_length);	} else {		/* Search term found */	    back_lines(obj, 1);	}	/* Reprint page */	wattrset(obj->text, dialog_attr);	moved = TRUE;    } else {			/* no need to find */	(void) beep();    }    return moved;}/* * Display text from a file in a dialog box. */intdialog_textbox(const char *title, const char *file, int height, int width){    long fpos;    int x, y, cur_x, cur_y;    int key = 0, fkey;    int next = 0;#ifdef NCURSES_VERSION    int i, passed_end;#endif    char search_term[MAX_LEN + 1];    MY_OBJ obj;    WINDOW *dialog;    bool moved = TRUE;    int result = DLG_EXIT_UNKNOWN;    dlg_auto_sizefile(title, file, &height, &width, 2, 12);    dlg_print_size(height, width);    dlg_ctl_size(height, width);    search_term[0] = '\0';	/* no search term entered yet */    memset(&obj, 0, sizeof(obj));    obj.begin_reached = TRUE;    obj.buffer_first = TRUE;    obj.end_reached = FALSE;    obj.buttons = dlg_exit_label();    /* Open input file for reading */    if ((obj.fd = open(file, O_RDONLY)) == -1)	dlg_exiterr("Can't open input file %s", file);    /* Get file size. Actually, 'file_size' is the real file size - 1,       since it's only the last byte offset from the beginning */    obj.file_size = lseek_obj(&obj, 0, SEEK_END);    /* Restore file pointer to beginning of file after getting file size */    lseek_obj(&obj, 0, SEEK_SET);    read_high(&obj, BUF_SIZE);    x = dlg_box_x_ordinate(width);    y = dlg_box_y_ordinate(height);    dialog = dlg_new_window(height, width, y, x);    dlg_mouse_setbase(x, y);    /* Create window for text region, used for scrolling text */    obj.text = dlg_sub_window(dialog, height - 4, width - 2, y + 1, x + 1);    /* register the new window, along with its borders */    dlg_mouse_mkbigregion(0, 0, height - 2, width, KEY_MAX, 1, 1, 3 /* cells */ );    dlg_draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);    dlg_draw_bottom_box(dialog);    dlg_draw_title(dialog, title);    dlg_draw_buttons(dialog, height - 2, 0, obj.buttons, FALSE, FALSE, width);    (void) wnoutrefresh(dialog);    getyx(dialog, cur_y, cur_x);	/* Save cursor position */    dlg_attr_clear(obj.text, height - 4, width - 2, dialog_attr);    wtimeout(dialog, WTIMEOUT_VAL);    while (result == DLG_EXIT_UNKNOWN) {	/*	 * Update the screen according to whether we shifted up/down by a line	 * or not.	 */	if (moved) {	    if (next < 0) {		(void) scrollok(obj.text, TRUE);		(void) scroll(obj.text);	/* Scroll text region up one line */		(void) scrollok(obj.text, FALSE);		print_line(&obj, height - 5, width - 2);#ifndef NCURSES_VERSION		wmove(obj.text, height - 5, 0);		waddch(obj.text, ' ');		wmove(obj.text, height - 5, width - 3);		waddch(obj.text, ' ');#endif		(void) wnoutrefresh(obj.text);	    } else if (next > 0) {#ifdef NCURSES_VERSION		/*		 * We don't call print_page() here but use scrolling to ensure		 * faster screen update.  However, 'end_reached' and		 * 'page_length' should still be updated, and 'in_buf' should		 * point to start of next page.  This is done by calling		 * get_line() in the following 'for' loop.		 */		(void) scrollok(obj.text, TRUE);		(void) wscrl(obj.text, -1);	/* Scroll text region down one line */		(void) scrollok(obj.text, FALSE);		obj.page_length = 0;		passed_end = 0;		for (i = 0; i < height - 4; i++) {		    if (!i) {			print_line(&obj, 0, width - 2);		/* print first line of page */			(void) wnoutrefresh(obj.text);		    } else			(void) get_line(&obj);	/* Called to update 'end_reached' and 'in_buf' */		    if (!passed_end)			obj.page_length++;		    if (obj.end_reached && !passed_end)			passed_end = 1;		}#else		print_page(&obj, height - 4, width - 2);#endif	    } else {		print_page(&obj, height - 4, width - 2);	    }	    print_position(&obj, dialog, height, width);	    (void) wmove(dialog, cur_y, cur_x);		/* Restore cursor position */	    wrefresh(dialog);	}	moved = FALSE;		/* assume we'll not move */	next = 0;		/* ...but not scroll by a line */	key = dlg_mouse_wgetch(dialog, &fkey);	if (dlg_char_to_button(key, obj.buttons) == 0) {	    key = '\n';	    fkey = FALSE;	}	if (!fkey) {	    fkey = TRUE;	    switch (key) {	    case ESC:		result = DLG_EXIT_ESC;		continue;	    case '\n':	    case '\r':		key = KEY_ENTER;		break;	    case ' ':		key = KEY_NPAGE;		break;	    case '0':		key = KEY_BEG;		break;	    case 'B':	    case 'b':		key = KEY_PPAGE;		break;	    case 'g':		key = KEY_HOME;		break;	    case 'G':		key = KEY_END;		break;	    case 'H':	    case 'h':		key = KEY_LEFT;		break;	    case 'K':	    case 'k':		key = KEY_UP;		break;	    case 'J':	    case 'j':		key = KEY_DOWN;		break;	    case 'L':	    case 'l':		key = KEY_RIGHT;		break;	    case '/':		/* Forward search */	    case 'n':		/* Repeat forward search */	    case '?':		/* Backward search */	    case 'N':		/* Repeat backward search */		moved = perform_search(&obj, height, width, key, search_term);		fkey = FALSE;		break;	    default:		fkey = FALSE;		break;	    }	}	if (fkey) {	    switch (key) {	    default:		if (key >= M_EVENT)		    result = DLG_EXIT_OK;		break;	    case KEY_ENTER:		result = DLG_EXIT_OK;		break;	    case KEY_HOME:	/* First page */		if (!obj.begin_reached) {		    obj.begin_reached = 1;		    /* First page not in buffer? */		    fpos = ftell_obj(&obj);		    if (fpos > obj.fd_bytes_read) {			/* Yes, we have to read it in */			lseek_obj(&obj, 0, SEEK_SET);			read_high(&obj, BUF_SIZE);		    }		    obj.in_buf = 0;		    moved = TRUE;		}		break;	    case KEY_END:	/* Last page */	    case KEY_LL:		obj.end_reached = TRUE;		/* Last page not in buffer? */		fpos = ftell_obj(&obj);		if (fpos < obj.file_size) {		    /* Yes, we have to read it in */		    lseek_obj(&obj, -BUF_SIZE, SEEK_END);		    read_high(&obj, BUF_SIZE);		}		obj.in_buf = obj.bytes_read;		back_lines(&obj, height - 4);		moved = TRUE;		break;	    case KEY_UP:	/* Previous line */		if (!obj.begin_reached) {		    back_lines(&obj, obj.page_length + 1);		    next = 1;		    moved = TRUE;		}		break;	    case KEY_PPAGE:	/* Previous page */	    case M_EVENT + KEY_PPAGE:		if (!obj.begin_reached) {		    back_lines(&obj, obj.page_length + height - 4);		    moved = TRUE;		}		break;	    case KEY_DOWN:	/* Next line */		if (!obj.end_reached) {		    obj.begin_reached = 0;		    next = -1;		    moved = TRUE;		}		break;	    case KEY_NPAGE:	/* Next page */	    case M_EVENT + KEY_NPAGE:		if (!obj.end_reached) {		    obj.begin_reached = 0;		    moved = TRUE;		}		break;	    case KEY_BEG:	/* Beginning of line */		if (obj.hscroll > 0) {		    obj.hscroll = 0;		    /* Reprint current page to scroll horizontally */		    back_lines(&obj, obj.page_length);		    moved = TRUE;		}		break;	    case KEY_LEFT:	/* Scroll left */		if (obj.hscroll > 0) {		    obj.hscroll--;		    /* Reprint current page to scroll horizontally */		    back_lines(&obj, obj.page_length);		    moved = TRUE;		}		break;	    case KEY_RIGHT:	/* Scroll right */		if (obj.hscroll < MAX_LEN) {		    obj.hscroll++;		    /* Reprint current page to scroll horizontally */		    back_lines(&obj, obj.page_length);		    moved = TRUE;		}		break;	    }	}    }    dlg_del_window(dialog);    free(obj.buf);    (void) close(obj.fd);    dlg_mouse_free_regions();    return result;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -