📄 input_tool.c
字号:
/********************************************************************
*
* 周国祥 2001/04/29 修改屏幕输入处理部分
* 放开FLD_FORM,FLD_VIEW以及NOEDIT
* 等的fieldcheck(),p_func()处理,
* 以便正确处理如update_date,update_time
* 等的新增时自动设置以及查询时自动显示。
*******************************************************************/
#include <curses.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include "mytools.h"
#ifdef zgx020409_modi
#include "errmesg.h"
#else
extern char *errstr[];
#endif
#include "errmesg_macro.h"
#include "tool.h"
#define SCR_NUM 200
double atof();
long atol();
extern int do_query, do_insert, do_update, do_delete;
#ifdef zgx020409_del
extern int special;
#endif
void prescan();
static char str_bak[200] = "";
/* IN_ITEM() */
static int prompt_flg = 1; /* 提示行开关 0:无提示行 1:有提示行 */
static unsigned in_item_ch = ENTER; /* 置为ENTER是为了当第一个字段为只显示时
能够返回ENTER以便继续作下一个字段 */
/*
* 字段值输入函数
*
*/
int input_item(pwin,name,row,col,value,len,fieldcheck,p_func,view,flag)
WINDOW *pwin; /* 显示窗口 */
char *name; /* 名称 */
int row, col; /* 坐标 */
char *value; /* 要编辑的字符串 */
int len; /* 字符串的长度 */
int ( *fieldcheck )(); /* 字段检查函数指针 */
int ( *p_func )(); /* 字段检查函数指针 */
int view; /* 0:正常 1:不处理 2:只显示
4:密文显示 8:非空(允许ESC退出) */
int flag; /* 是否回车确认 */
{
static int OverWrite = 1;
int y = row, x = col;
char *sp = value, *p;
int result = 0;
int k, full_flag;
char buffer[128];
int locate;
noecho();
if ( view & SKIP )
return( in_item_ch );
value[len] = 0;
memset( value + strlen( value ), ' ', len - strlen( value ) );
if ( view & NOEDIT ) {
wmove( pwin, row, col );
if ( view & HIDE )
disp_pwd( pwin, value );
else
waddstr( pwin, value );
wrefresh( pwin );
#ifdef zgx010429_added
#else
/*
* 即使本字段无需输入,但仍需执行字段域值检查
*/
if ( fieldcheck ) {
if ( ( k = fieldcheck( value ) ) != SUCC ) {
wattroff( pwin, Item_Attr );
h_wpromptr( pwin, 16, errstr[k], 1, 1 );
wattron( pwin, Item_Attr );
}
}
if ( p_func ) {
if ( ( k = p_func( value ) ) != SUCC ) {
wattroff( pwin, Item_Attr );
h_wpromptr( pwin, 16, errstr[k], 1, 1 );
wattron( pwin, Item_Attr );
}
}
#endif
return( in_item_ch );
}
if ( prompt_flg == PROMPT_ON )
if ( OverWrite )
h_prompt( LINES-1, 69, "覆盖方式",0,1);
else h_prompt( LINES-1, 69, "插入方式",0,1);
wattron( pwin, Item_Attr );
wmove( pwin, row, col );
if ( view & HIDE )
disp_pwd( pwin, value );
else waddstr( pwin, value );
full_flag = 0;
keypad ( pwin, FALSE );
do {
wmove( pwin, y, x );
wrefresh( pwin );
if ( full_flag == 0 )
in_item_ch = getkey(pwin);
else in_item_ch = ENTER;
switch ( in_item_ch ) {
case INS:
OverWrite ^= 1;
wattroff( pwin, Item_Attr );
if ( prompt_flg==PROMPT_ON )
if ( OverWrite )
h_prompt( LINES-1, 69, "覆盖方式",0,1);
else h_prompt( LINES-1, 69, "插入方式",0,1);
wattron( pwin, Item_Attr );
break;
case LEFT:
if ( sp != value ) {
sp--;
x--;
}
break;
case RIGHT:
if ( * ( sp + 1 ) != 0 ) {
sp ++;
x ++;
} else
full_flag = 1;
break;
case HOME:
sp = value;
x = col;
break;
case END:
locate = len;
for ( sp = value+len-1; locate > 0 ; sp--, locate-- )
if ( *sp != ' ' ) break;
if ( locate < len ) {
x = col + locate;
sp = value + locate;
} else {
x = col + len - 1;
sp = value + len - 1;
}
break;
case UP:
result = in_item_ch;
break;
case DOWN: /* End edit of the field */
case CR:
case ENTER:
p = value + strlen(value) - 1;
if (strchr(value, ' ')) {
if (view & FULL) {
beep();
full_flag = 0;
break;
}
while ((p != value) && (*p == ' ')) p--;
if (*p == ' ') {
if (view & NOEMPTY) {
beep();
full_flag = 0;
break;
}
value[0] = 0;
}
}
if (value[0] && (view & DIGITAL)) {
while ((p != value) && isdigit(*p)) p--;
if (!isdigit(*p)) {
beep();
full_flag = 0;
break;
}
}
if ( fieldcheck )
if ( ( k = fieldcheck( value ) ) != SUCC ) {
wattroff( pwin, Item_Attr );
h_wpromptr( pwin, 16, errstr[k], 1, 1 );
wattron( pwin, Item_Attr );
if (str_bak[0])
h_winprompt( pwin, 16, 2, str_bak, 0, 0 );
// Omitted for BOC set_blank( value, len );
sp = value;
y = row;
x = col;
mvwaddstr( pwin, y, x, sp );
full_flag = 0;
break;
}
if ( p_func )
if ( ( k = p_func( value ) ) != SUCC ) {
wattroff( pwin, Item_Attr );
h_wpromptr( pwin, 16, errstr[k], 1, 1 );
wattron( pwin, Item_Attr );
if (str_bak[0]) h_winprompt( pwin, 16, 2, str_bak, 0, 0 );
// Omitted for BOC set_blank( value, len );
sp = value;
y = row;
x = col;
mvwaddstr( pwin, y, x, sp );
full_flag = 0;
break;
}
result=in_item_ch;
break;
case ESCAPE: /* Confirm and exit */
p = value + strlen(value) - 1;
if (strchr(value, ' ')) {
if (view & FULL) {
beep();
full_flag = 0;
break;
}
while ((p != value) && (*p == ' ')) p--;
if (*p == ' ') {
if (view & NOEMPTY) {
/* 非空状态时,允许ESC退出 */
result=in_item_ch;
beep();
full_flag = 0;
break;
break;
}
value[0] = 0;
}
}
if (value[0] && (view & DIGITAL)) {
while ((p != value) && isdigit(*p)) p--;
if (!isdigit(*p)) {
beep();
full_flag = 0;
break;
}
}
if ( fieldcheck )
if ( ( k = fieldcheck( value ) ) != SUCC ) {
wattroff( pwin, Item_Attr );
h_wpromptr( pwin, 16, errstr[k], 1, 1 );
wattron( pwin, Item_Attr );
if (str_bak[0]) h_winprompt( pwin, 16, 2, str_bak, 0, 0 );
// Omitted for BOC set_blank( value, len );
sp = value;
y = row;
x = col;
mvwaddstr( pwin, y, x, sp );
break;
}
if ( p_func )
if ( ( k = p_func( value ) ) != SUCC ) {
wattroff( pwin, Item_Attr );
h_wpromptr( pwin, 16, errstr[k], 1, 1 );
wattron( pwin, Item_Attr );
if (str_bak[0]) h_winprompt( pwin, 16, 2, str_bak, 0, 0 );
// Omitted for BOC set_blank( value, len );
sp = value;
y = row;
x = col;
mvwaddstr( pwin, y, x, sp );
break;
}
result=in_item_ch;
break;
case CTRL_L: /* Redraw screen */
wrefresh( curscr );
break;
case CTRL_D: /* Clears to the end of the field */
memset( sp, ' ', strlen( sp ) );
value[len] = 0;
if ( view & HIDE )
disp_pwd( pwin, sp );
else waddstr( pwin, sp );
break;
case CTRL_W: /* Help screen */
FunKeyHelp(name);
break;
case CTRL_N:
/* 弹出查询窗口 */
#ifdef zgx020409_del
if (special && do_insert)
if (strcmp(name, "card_no"))
disp_posls(tran_ls.card_no);
else
disp_posls(value);
#endif
break;
case CTRL_U: /* Quit */
case CTRL_C: /* clear all fields */
result=in_item_ch;
break;
case CTRL_X: /* Deletes current character */
memcpy( sp, sp + 1, strlen( sp ) - 1 );
sp[strlen(sp)-1] = ' ';
if ( view & HIDE )
disp_pwd( pwin, sp );
else waddstr( pwin, sp );
break;
case BS: /* Delete previous character */
/* If is begin , del itself */
if ( sp != value ) {
sp --;
x --;
}
wmove( pwin, y, x );
memcpy( sp, sp + 1, strlen( sp ) - 1 );
sp[strlen(sp)-1] = ' ';
if ( view & HIDE )
disp_pwd( pwin, sp );
else waddstr( pwin, sp );
break;
default:
if ( iscntrl( in_item_ch ) ) break;
if ( * ( sp+1 ) != 0 ) {
if ( OverWrite == 0 )
move_mem( sp+1, sp, strlen( sp )-1 );
*sp = in_item_ch;
if ( view & HIDE )
disp_pwd( pwin, sp );
else waddstr( pwin, sp );
sp ++;
x ++;
} else {
*sp = in_item_ch;
if ( view & HIDE )
disp_pwd( pwin, sp );
else waddstr( pwin, sp );
if ( flag == NOENTER ) full_flag = 1;
}
break;
}
} while( result == 0 );
wmove( pwin, row, col);
wrefresh( pwin );
/* End - Modified by Liyao, 11/19/97 */
wattroff( pwin, Item_Attr );
str_bak[0] = 0;
return( result );
}
int set_prompt( opt )
int opt;
{
prompt_flg=( opt==PROMPT_ON )? PROMPT_ON:PROMPT_OFF;
}
int disp_pwd( pwin, s )
WINDOW *pwin;
char *s;
{
int l, j, k;
l=strlen( s )-1;
for( j=l;j>=0;j-- ) {
if( *( s+j )!=' ' ) break;
}
for( k=j;k>=0;k-- ) waddch( pwin,'*' );
for( k=l-j-1;k>=0;k-- ) waddch( pwin,' ' );
}
/*
* 用于拷贝地址重叠的字符串, 且ds>ss
*/
int move_mem( ds, ss, len )
char *ds; /* 目标串 */
char *ss; /* 源串 */
int len; /* 长度 */
{
int i;
for ( i = len - 1; i >= 0; i-- )
ds[i] = ss[i];
}
/*
* 用空格清空字符串
*/
int set_blank( str, len )
char *str; /* 要清空的字符串 */
int len; /* 字符串长度 */
{
memset( str, ' ', len );
str[len]=0;
}
/*
* 指定窗口内的坐标显示提示信息
*/
int h_winprompt( pwin, row, col, ss, x, stan )
WINDOW *pwin; /* 指定窗口 */
int row, col; /* 坐标 */
char *ss; /* 提示信息 */
int x; /* 是否等待用户按键 ( 1:要 0:不要 ) */
int stan; /* 属性 1 REVERSE 2 BLINK 0 NORMAL */
{
if ( stan == 1 ) {
wattron( pwin, A_REVERSE );
mvwaddstr( pwin, row, col, ss );
wattroff( pwin, A_REVERSE );
} else if ( stan == 2 ) {
attron( A_BLINK );
mvwaddstr( pwin, row, col, ss );
attroff( A_BLINK );
} else
mvwaddstr( pwin, row, col, ss );
wrefresh(pwin);
if ( x == 1 ) {
getkey(pwin);
clear_wline_part(pwin, row, col, strlen(ss) );
}
return (0);
}
int h_wpromptr( hwin, row, ss, x, stan )
WINDOW *hwin;
int row;
char *ss;
int x, stan;
{
int col;
col = ( 80 - (int)strlen( ss ) ) / 2;
if ( col < 0 ) col = 0;
wmove( hwin, row, 0 );
wclrtoeol( hwin );
if ( stan == 1 ) {
wattron( hwin, A_REVERSE );
mvwaddstr( hwin, row, col, ss );
wattroff( hwin, A_REVERSE );
} else
mvwaddstr( hwin, row, col, ss );
wrefresh( hwin );
if ( x == 1 ) {
getkey(hwin);
wmove( hwin, row, 0 );
wclrtoeol( hwin );
}
return (0);
}
/*
* 清stdscr一行
*/
int clear_line( row )
int row;
{
move( row, 0 );
clrtoeol();
}
/*
* 清指定窗口win一行
*/
int wclear_line( pwin, row )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -