📄 tool.c
字号:
/* * file : tool.c * script by : * recent modified by : TANG for oracle version * recent modified on : April 10, 2003 * NOTICE : functions for dropdown menu */#include "tool.h"#include <time.h>#include <termios.h>#include <unistd.h>#define MESSAGELINE 23 /* 信息显示行 */int MessageShowMode = NOM_SHOW; /* 信息显示模式 */int HasColors = FALSE; /* 是否支持彩显 */WINDOWLINK MyWinLink; /* 窗口链表首地址 */extern char OPERID[10], NAME[20];char *Bold[11] = { "━","┗","┻","┛","┣","╋","┫","┏","┳","┓","┃"};char *Regular[11] = { "─","└","┴","┘","├","┼","┤","┌","┬","┐","│"};InitWindowLink(){ WINDOWS StdScr; StdScr.win = ( WINDOW * )stdscr; StdScr.row = StdScr.col = 0; StdScr.height = 24; StdScr.width = 80; StdScr.title = NULL; MyWinLink.thiswindow = &StdScr; MyWinLink.prevwinnode = NULL; MyWinLink.nextwinnode = NULL; return TRUE;}WINDOWLINK *FindLastWindowLink(){ WINDOWLINK *LastWinLink; LastWinLink = &MyWinLink; while( LastWinLink->nextwinnode != NULL ) LastWinLink = LastWinLink->nextwinnode; return LastWinLink;}AddToWindowLink( NewWin )WINDOWS *NewWin;{ WINDOWLINK *NewWinLink; WINDOWLINK *LastWinLink; if ( ( NewWinLink = ( WINDOWLINK * )malloc( sizeof( WINDOWLINK ) ) ) != NULL ) { LastWinLink = FindLastWindowLink(); LastWinLink->nextwinnode = NewWinLink; NewWinLink->thiswindow = NewWin; NewWinLink->prevwinnode = LastWinLink; NewWinLink->nextwinnode = NULL; return TRUE; } else return FALSE;}DeleteLastWindowLink(){ WINDOWLINK *LastWinLink; LastWinLink = FindLastWindowLink(); LastWinLink->prevwinnode->nextwinnode = NULL; free( LastWinLink ); return TRUE;}DeleteFromWindowLink( thewin )WINDOWS *thewin;{ WINDOWLINK *NextWinLink; WINDOWLINK *PrevWinLink; return TRUE; }Box( int row, int col, int hight, int width, int boardtype ){ int i; if ( boardtype == NO_BOARD ) return; if ( width % 2 != 0 ) width --; if ( boardtype == BOLD_BOARD ) { mvaddstr( row, col, Bold[7] ); for( i = col + 2; i < width; i += 2 ) mvaddstr( row, i, Bold[0] ); mvaddstr( row, col + width - 2, Bold[9] ); for( i = row + 1; i < hight+row; i ++ ) { mvaddstr( i, col, Bold[10] ); mvaddstr( i, col + width - 2, Bold[10] ); } mvaddstr( row + hight - 1, col, Bold[1] ); for( i = col + 2; i < width; i += 2 ) mvaddstr( row + hight - 1, i, Bold[0] ); mvaddstr( row + hight - 1, col + width - 2, Bold[3] ); } if ( boardtype == REGULAR_BOARD ) { mvaddstr( row, col, Regular[7] ); for( i = col + 2; i < width; i += 2 ) mvaddstr( row, i, Regular[0] ); mvaddstr( row, col + width - 2, Regular[9] ); for( i = row + 1; i < hight+row; i ++ ) { mvaddstr( i, col, Regular[10] ); mvaddstr( i, col + width - 2, Regular[10] ); } mvaddstr( row + hight - 1, col, Regular[1] ); for( i = col + 2; i < width; i += 2 ) mvaddstr( row + hight - 1, i, Regular[0] ); mvaddstr( row + hight - 1, col + width - 2, Regular[3] ); } refresh();}BoxWin( win, bord )WINDOW *win;int bord;{ int i; int sx, sy; sx = win->_maxx - 2; sy = win->_maxy - 1; if ( bord == BOLD_BOARD ) { mvwaddstr( win, 0, 0, Bold[7] ); for( i = 2; i < sx; i += 2 ) mvwaddstr( win, 0, i, Bold[0] ); mvwaddstr( win, 0, sx, Bold[9] ); for( i = 1; i < sy; i ++ ) { mvwaddstr( win, i, 0, Bold[10] ); mvwaddstr( win, i, sx, Bold[10] ); } mvwaddstr( win, sy, 0, Bold[1] ); for( i = 2; i < sx; i += 2 ) mvwaddstr( win, sy, i, Bold[0] ); mvwaddstr( win, sy, sx, Bold[3] ); } if ( bord == REGULAR_BOARD ) { mvwaddstr( win, 0, 0, Regular[7] ); for( i = 2; i < sx; i += 2 ) mvwaddstr( win, 0, i, Regular[0] ); mvwaddstr( win, 0, sx, Regular[9] ); for( i = 1; i < sy; i ++ ) { mvwaddstr( win, i, 0, Regular[10] ); mvwaddstr( win, i, sx, Regular[10] ); } mvwaddstr( win, sy, 0, Regular[1] ); for( i = 2; i < sx; i += 2 ) mvwaddstr( win, sy, i, Regular[0] ); mvwaddstr( win, sy, sx, Regular[3] ); } wrefresh( win );}BoxInWin( WINDOW *win, int row, int col, int hight, int width, int boardtype ){ int i; if ( boardtype == NO_BOARD ) return; if ( width % 2 != 0 ) width --; if ( boardtype == BOLD_BOARD ) { mvwaddstr( win, row, col, Bold[7] ); for( i = col + 2; i < width; i += 2 ) mvwaddstr( win, row, i, Bold[0] ); mvwaddstr( win, row, col + width - 2, Bold[9] ); for( i = row + 1; i < hight + row; i ++ ) { mvwaddstr( win, i, col, Bold[10] ); mvwaddstr( win, i, col + width - 2, Bold[10] ); } mvwaddstr( win, row + hight - 1, col, Bold[1] ); for( i = col + 2; i < width; i += 2 ) mvwaddstr( win, row + hight - 1, i, Bold[0] ); mvwaddstr( win, row + hight - 1, col + width - 2, Bold[3] ); } if ( boardtype == REGULAR_BOARD ) { mvwaddstr( win, row, col, Regular[7] ); for( i = col + 2; i < width; i += 2 ) mvwaddstr( win, row, i, Regular[0] ); mvwaddstr( win, row, col + width - 2, Regular[9] ); for( i = row + 1; i < hight + row; i ++ ) { mvwaddstr( win, i, col, Regular[10] ); mvwaddstr( win, i, col + width - 2, Regular[10] ); } mvwaddstr( win, row + hight - 1, col, Regular[1] ); for( i = col + 2; i < width; i += 2 ) mvwaddstr( win, row + hight - 1, i, Regular[0] ); mvwaddstr( win, row + hight - 1, col + width - 2, Regular[3] ); } wrefresh( win );}Frame( int borad, short fcolor, short bcolor ){ int i; char blank[81]; memset( blank, ' ', 80 ); blank[80] = 0; if ( HasColors ) { init_pair( BACK_PATTERN, fcolor, bcolor ); attrset( A_DIM | COLOR_PAIR( BACK_PATTERN ) ); } for ( i = 1; i < 23; i ++ ) mvaddstr( i, 0, blank ); if ( borad == BOLD_BOARD ) { Box( 1, 0, MESSAGELINE - 1, 80, BOLD_BOARD ); mvaddstr( 3, 0, Bold[4] ); for( i = 2; i < 78; i += 2 ) mvaddstr( 3, i, Bold[0] ); mvaddstr( 3, 78, Bold[6] ); } if ( borad == REGULAR_BOARD ) { Box( 1, 0, MESSAGELINE - 1, 80, REGULAR_BOARD ); mvaddstr( 3, 0, Regular[4] ); for( i = 2; i < 78; i += 2 ) mvaddstr( 3, i, Regular[0] ); mvaddstr( 3, 78, Regular[6] ); } refresh();}ShowVersion( char *Version ){ if ( HasColors ) { int VerLen, pos; char ver[77]; char blank[81]; memset( ver, ' ', 76 ); memset( blank, ' ', 80 ); VerLen = strlen( Version ); if ( VerLen < 76 ) pos = 38 - VerLen / 2; memcpy( ver + pos, Version, VerLen ); ver[76] = 0; blank[80] = 0; init_pair( VERSION_PATTERN, WHITE, BLUE ); attrset( COLOR_PAIR( VERSION_PATTERN ) ); mvaddstr( 0, 0, blank ); mvaddstr( 1, 0, blank ); mvaddstr( 2, 2, ver ); mvaddstr( 2, 0, blank ); Box( 0, 0, 3, 80, REGULAR_BOARD ); } else { int VerLen, pos; char ver[79]; memset( ver, ' ', 78 ); VerLen = strlen( Version ); if ( VerLen < 78 ) pos = 39 - VerLen / 2; memcpy( ver + pos, Version, VerLen ); ver[78] = 0; standout(); mvaddstr( 0, 1, ver ); standend(); } refresh();}InitPad( win, Pad, Row, Col, PadItems, ItemNum, colorpattern )WINDOW *win;PAD *Pad;int Row, Col;ITEMS *PadItems;int ItemNum;COLORPATTERN *colorpattern;{ int col, i; Pad->row = Row; Pad->col = Col; Pad->win = win; Pad->items = PadItems; Pad->itemnum = ItemNum; Pad->lastoption = 0; if ( HasColors ) { SetColor( colorpattern ); wattrset( win, COLOR_PAIR( TEXT_PATTERN ) ); } for( i = 0; i < ItemNum; i ++ ) { if ( i == 0 ) col = Col; else col += strlen( PadItems[i-1].item ) + 1; mvwaddstr( Pad->win, Row, col, PadItems[i].item ); } wrefresh( Pad->win );}int ActivatePad( Pad )PAD *Pad;{ int i, row; int option, lastoption, choice; int *col; int Stop = FALSE; char *HotKey; row = Pad->row; lastoption = option = Pad->lastoption; if ( ( col = ( int * )malloc( Pad->itemnum * sizeof( int ) ) )== NULL) { MessageBX( "初始化菜单数组错误"); return FALSE; } for( i = 0; i < Pad->itemnum; i ++ ) { if ( i == 0 ) col[i] = Pad->col; else col[i] = col[i-1] + strlen(Pad->items[i-1].item)+1; } savetty(); cbreak(); nonl(); noecho(); keypad( Pad->win, TRUE ); if ( HasColors ) wattrset( Pad->win, COLOR_PAIR( TEXT_PATTERN ) ); else wstandend( Pad->win ); while( Stop == FALSE ) { if ( option != lastoption ) mvwaddstr( Pad->win, row, col[lastoption], Pad->items[lastoption].item ); SetMessage( Pad->items[option].message ); if ( HasColors ) wattrset( Pad->win, COLOR_PAIR( HIGHT_PATTERN ) ); else wstandout( Pad->win ); mvwaddstr( Pad->win, row, col[option], Pad->items[option].item ); if ( HasColors ) wattrset( Pad->win, COLOR_PAIR( TEXT_PATTERN ) ); else wstandend( Pad->win ); wmove( Pad->win, row, col[option] ); lastoption = option; wrefresh( Pad->win ); switch( ( choice = wgetch( Pad->win ) ) ) { case 27: /* escape*/ Pad->lastoption = option; Stop = TRUE; resetty(); break; case ' ': case '\r': case '\n': case KEY_DOWN: if ( option < 0 ) { beep(); break; } Pad->lastoption = option; if ( Pad->items[ option ].callfunc != NULL ) Pad->items[ option ].callfunc(); resetty(); return option; case KEY_RIGHT: while(option<=Pad->itemnum-2 && strlen(Pad->items[option+1].item) < 1) ++option; if ( ++ option >= Pad->itemnum ) option = 0; break; /* case KEY_UP: */ case KEY_LEFT: while(option>=1 && strlen(Pad->items[option-1].item) < 1) --option; if ( -- option < 0 ) option = Pad->itemnum - 1; break; default: for( i = 0; i < Pad->itemnum; i ++ ) { for ( HotKey = Pad->items[i].item; *HotKey == ' '; HotKey ++ ); if ( *HotKey == choice ) { option = i; break; } } } } free( col );} InitMenu( Menu, Row, Col, MenuItems, ItemNum, boardtype, colorpattern )MENU *Menu;int Row, Col;ITEMS *MenuItems;int ItemNum, boardtype;COLORPATTERN *colorpattern;{ int i, j; int width = 0; for( i = 0; i < ItemNum; i ++ ) { if ( strlen( MenuItems[i].item ) > width ) width = strlen( MenuItems[i].item ); } if ( width % 2 != 0 ) width ++; width += 4; if ( HasColors ) SetColor( colorpattern ); Menu->menuwin = CreateWindow( Row, Col, ItemNum + 2, width, boardtype, NULL, colorpattern ); Menu->menuwin->row = Row; Menu->menuwin->col = Col; Menu->menuwin->height = ItemNum + 2; Menu->menuwin->width = width; Menu->items = MenuItems; if ( HasColors ) wattrset( Menu->menuwin->win, COLOR_PAIR( BOARD_PATTERN ) ); else wstandend( Menu->menuwin->win ); if ( boardtype == BOLD_BOARD ) { for( i = 0; i < ItemNum; i ++ ) { if ( Menu->items[i].item[0] == '-' ) { mvwaddstr( Menu->menuwin->win, i + 1, 0, Bold[4] ); for( j = 2; j < Menu->menuwin->width; j += 2 ) mvwaddstr( Menu->menuwin->win, i + 1, j, Bold[0] ); mvwaddstr( Menu->menuwin->win, i + 1, Menu->menuwin->width - 2, Bold[6] ); } else { mvwaddstr( Menu->menuwin->win, i + 1, 0, Bold[10] ); if ( HasColors ) wattrset( Menu->menuwin->win, COLOR_PAIR( TEXT_PATTERN ) ); mvwaddstr( Menu->menuwin->win, i + 1, 2, Menu->items[i].item ); if ( HasColors ) wattrset( Menu->menuwin->win, COLOR_PAIR( BOARD_PATTERN ) ); mvwaddstr( Menu->menuwin->win, i + 1,Menu->menuwin->width-2, Bold[10] ); } } } if ( boardtype == REGULAR_BOARD ) { for( i = 0; i < ItemNum; i ++ ) { if ( Menu->items[i].item[0] == '-' ) { mvwaddstr( Menu->menuwin->win, i + 1, 0, Regular[4] ); for( j = 2; j < Menu->menuwin->width; j += 2 ) mvwaddstr( Menu->menuwin->win, i + 1, j, Regular[0] ); mvwaddstr( Menu->menuwin->win,i+1, Menu->menuwin->width-2, Regular[6]); } else { mvwaddstr( Menu->menuwin->win, i + 1, 0, Regular[10] ); if ( HasColors ) wattrset( Menu->menuwin->win, COLOR_PAIR( TEXT_PATTERN ) ); mvwaddstr( Menu->menuwin->win, i + 1, 2, Menu->items[i].item ); if ( HasColors ) wattrset( Menu->menuwin->win, COLOR_PAIR( BOARD_PATTERN ) ); mvwaddstr( Menu->menuwin->win,i+1,Menu->menuwin->width-2, Regular[10]); } } } wrefresh( Menu->menuwin->win );}int ActivateMenu( Menu )MENU *Menu;{ int option, lastoption; int i, choice; char *HotKey; option = lastoption = Menu->lastoption; savetty(); cbreak(); nonl(); noecho(); keypad( Menu->menuwin->win, TRUE ); if ( HasColors ) wattrset( Menu->menuwin->win, COLOR_PAIR( TEXT_PATTERN ) ); else wstandend( Menu->menuwin->win ); for( ; ; ) { if ( lastoption != option ) mvwaddstr( Menu->menuwin->win, lastoption + 1, 2, Menu->items[ lastoption ].item ); SetMessage( Menu->items[ option ].message ); if ( HasColors ) wattrset( Menu->menuwin->win, COLOR_PAIR( HIGHT_PATTERN ) ); else wstandout( Menu->menuwin->win ); mvwaddstr( Menu->menuwin->win, option + 1, 2, Menu->items[ option ].item ); if ( HasColors ) wattrset( Menu->menuwin->win, COLOR_PAIR( TEXT_PATTERN ) ); else wstandend( Menu->menuwin->win ); wmove( Menu->menuwin->win, option + 1, 2 ); lastoption = option; wrefresh( Menu->menuwin->win ); switch( ( choice = wgetch( Menu->menuwin->win ) ) ) { case 27: DeleteWindow( Menu->menuwin ); resetty(); return option; case ' ': case '\r': case '\n': if ( option < 0 ) { beep(); return FALSE; } Menu->lastoption = option; if ( Menu->items[ option ].callfunc != NULL ) { /* 函数中有系统调用时恢复界面*/ if ( Menu->items[ option ].callfunc() == SYSTEM_RET) { DeleteWindow (Menu->menuwin); resetty(); return option; } } resetty(); break; case KEY_RIGHT: DeleteWindow( Menu->menuwin ); resetty(); return option; case KEY_DOWN: do { if ( ++ option >= Menu->menuwin->height -2 ) option = 0; } while( Menu->items[ option ].item[0] == '-' ); break; case KEY_LEFT: DeleteWindow( Menu->menuwin ); resetty(); return option; case KEY_UP:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -