win_select.ec
来自「在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便」· EC 代码 · 共 1,097 行 · 第 1/2 页
EC
1,097 行
/*******************************************************
* 程序名: win_select.ec 窗口选择处理函数
* 功 能: 用于界面输入时弹出选择窗口
*
* 周国祥 2001/04/29 增加inq_select()函数,
*
* 周国祥 2002/04/09 从public.ec中分离出来
* 周国祥 2002/05/06 修改bitmap_select()并将之
* 从../XXX_ADM/pubname.c中
* 移入
*
*******************************************************/
#include <stdio.h>
#include <curses.h>
#include "mytools.h"
#include "bitmap.h"
EXEC SQL INCLUDE sqlca;
EXEC SQL WHENEVER SQLERROR CALL error_handler;
EXEC SQL WHENEVER SQLWARNING CALL warning_handler;
EXEC SQL WHENEVER NOT FOUND CALL notfound_handler;
$char sqlstring[2000];
$include "db_struct.h";
/*
* 弹出查询窗口进行选择
* 必须两个字段,一般为code,name
* sql_str形式:select code, name from table_name
*/
inq_select(char *sql_str, char *sel_code, char *sel_name)
{
$char code[20];
$char name[80];
int code_len = 0, name_len = 0;
$char sqlstring[1024];
char scr_dump_file[80];
int c, cc;
WINDOW *w, *boxw;
int row, col, srow, scol;
int i, j, oi;
int win_lines, win_cols;
char redraw = 0;
$int max_recno;
$int tmp_recno;
$int fst_recno;
strcpy(sqlstring, sql_str);
$prepare inquery_p FROM :sqlstring;
$declare inquery_cur scroll cursor for inquery_p;
$open inquery_cur;
if (SQLCODE) {
errcall(ERROR, "open cursor for %s.(%d)", sqlstring, SQLCODE);
return(-1);
}
/*
* 计算总记录数,及code,name的最大长度,以便确定窗口大小
*/
max_recno = 0;
while (1) {
$fetch inquery_cur INTO :code, :name;
if (SQLCODE)
break;
max_recno ++;
DelSpace(code);
if (strlen(code) > code_len)
code_len = strlen(code);
DelSpace(name);
if (strlen(name) > name_len)
name_len = strlen(name);
}
if (max_recno == 0) {
errcall(DEBUG, "inq_select no any entries");
return(-2);
}
if (code_len % 2) /* 使其为偶数 */
code_len ++;
win_cols = code_len + name_len + 2 + 2 + 2;
if (win_cols < 16)
win_cols = 16;
if (win_cols > COLS - 12)
return(-3);
win_lines = 8;
srow = 5;
scol = COLS - win_cols - 8;
sprintf( scr_dump_file, "/tmp/.inq_select.%d", getpid() );
scr_dump ( scr_dump_file );
boxw = newwin(win_lines+2+2, win_cols+4, srow-1, scol-2);
w = newwin(win_lines+2, win_cols, srow, scol);
zut_win_wboxclear(boxw, 1);
wrefresh(boxw);
for (i = 0; i < win_lines; i++) {
tmp_recno = i + 1;
$fetch absolute $tmp_recno inquery_cur into :code, :name;
if (SQLCODE)
break;
DelSpace(code);
DelSpace(name);
mvwprintw(w, i, 2, "%-*s", code_len, code);
mvwprintw(w, i, 2+code_len+2, "%-*s", name_len, name);
}
mvwprintw(w, win_lines+1, 2, "%-*s", win_cols-2, "↑↓移动 ESC退出");
i = 0;
mvwprintw(w, i, 0, "→");
oi = 0;
fst_recno = 1;
redraw = 0;
keypad(w, TRUE);
while (1) {
mvwprintw(w, i, 0, "→");
wrefresh(w);
switch (wgetch(w)) {
case KEY_UP:
case KEY_LEFT:
if (i == 0) {
if (fst_recno == 1) {
beep();
wattron(w, A_REVERSE);
mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到第一条. ");
wattroff(w, A_REVERSE);
continue;
}
fst_recno--;
redraw = 1;
} else
i--;
break;
case KEY_DOWN:
case KEY_RIGHT:
if (fst_recno + i == max_recno) {
beep();
wattron(w, A_REVERSE);
mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到最后一条.");
wattroff(w, A_REVERSE);
continue;
}
if (i == win_lines-1) {
if (fst_recno+win_lines-1 == max_recno) {
beep();
wattron(w, A_REVERSE);
mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到最后一条.");
wattroff(w, A_REVERSE);
continue;
}
fst_recno++;
redraw = 1;
} else
i++;
break;
#ifdef STAR500
case KEY_F(12):
#else
case KEY_PPAGE:
#endif
if (fst_recno == 1) {
beep();
wattron(w, A_REVERSE);
mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到第一页. ");
wattroff(w, A_REVERSE);
continue;
}
fst_recno -= win_lines;
if (fst_recno <= 0)
fst_recno = 1;
/*
i = 0;
*/
redraw = 1;
break;
#ifdef STAR500
case KEY_F(13):
#else
case KEY_NPAGE:
#endif
if (fst_recno + win_lines >= max_recno) {
beep();
wattron(w, A_REVERSE);
mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到最后一页.");
wattroff(w, A_REVERSE);
continue;
}
fst_recno += win_lines;
if (i + fst_recno >= max_recno) {
/* 最后一页调整i */
i = max_recno - fst_recno;
}
/*
i = 0;
*/
redraw = 1;
break;
case KEY_F(4):
case '\n':
case '\r':
/*================== WuBin 2001-6-22 10:39 ======Start==============*/
tmp_recno = fst_recno+i;
$fetch absolute $tmp_recno inquery_cur into :code, :name;
/*===========================2001-6-22 10:39=======End==============*/
$close inquery_cur;
DelSpace(code);
DelSpace(name);
strcpy(sel_code, code);
strcpy(sel_name, name);
delwin(w);
delwin(boxw);
scr_restore ( scr_dump_file );
unlink ( scr_dump_file );
return(0);
case '\033':
$close inquery_cur;
strcpy(sel_code, "");
strcpy(sel_name, "");
delwin(w);
delwin(boxw);
scr_restore ( scr_dump_file );
unlink ( scr_dump_file );
return(-3);
default:
beep();
continue;
}
mvwprintw(w, win_lines, 0, "%-*s", win_cols, " ");
mvwprintw(w, oi, 0, " ");
wrefresh(w);
oi = i;
if (redraw == 0) {
continue;
}
for (j = 0; j < win_lines; j++) {
tmp_recno = fst_recno + j;
$fetch absolute $tmp_recno inquery_cur into :code, :name;
if (SQLCODE) {
mvwprintw(w, j, 0, "%-*s", win_cols, " ");
continue;
}
mvwprintw(w, j, 2, "%-*s", code_len, code);
mvwprintw(w, j, 2+code_len+2, "%-*s", name_len, name);
redraw = 0;
}
}
}
/*
* 根据主键名(以','号分隔)及键值(以','号分隔)
* 构造WHERE串
*/
int make_where_str(where_str, key, keyval)
char *where_str, *key, *keyval;
{
int i, cnt;
char key_str[256], keyval_str[256];
char tmpbuf[256], tmpbuf1[31], tmpbuf2[31];;
strcpy(key_str, key);
if (key_str[strlen(key) - 1] != ',')
strcat(key_str, ",");
strcpy(keyval_str, keyval);
if (keyval_str[strlen(keyval) - 1] != ',')
strcat(keyval_str, ",");
strcpy(where_str, " 1=1 ");
cnt = zut_get_seperate(key_str, ',');
if (cnt != zut_get_seperate(keyval_str, ',')) {
return(-1);
}
for (i = 0; i < cnt; i++) {
zut_get_fld(key_str, i, tmpbuf1, ',');
zut_get_fld(keyval_str, i, tmpbuf2, ',');
sprintf(tmpbuf, " and %s=\'%s\'", tmpbuf1, tmpbuf2);
strcat(where_str, tmpbuf);
}
return(0);
}
/*
* 弹出查询窗口进行选择
* 必需两个字段,一般为code,name
* sql_str形式:select code, name from table_name
*/
int int_select(char *sql_str, int sel_code, char *sel_name)
{
$int code;
$char name[80];
int code_len = 6, name_len = 0;
$char sqlstring[1024];
char scr_dump_file[80];
int c, cc;
WINDOW *w, *boxw;
int row, col, srow, scol;
int i, j, oi;
int win_lines, win_cols;
char redraw = 0;
$int max_recno;
$int tmp_recno;
$int fst_recno;
strcpy(sqlstring, sql_str);
$prepare inquery_select FROM :sqlstring;
$declare inquery_cur_select scroll cursor for inquery_select;
$open inquery_cur_select;
if (SQLCODE)
return(-1);
/*
* 计算总记录数,及name的最大长度,以便确定窗口大小
*/
max_recno = 0;
while (1) {
$fetch inquery_cur_select INTO :code, :name;
if (SQLCODE)
break;
max_recno ++;
DelSpace(name);
if (strlen(name) > name_len)
name_len = strlen(name);
}
if (max_recno == 0) {
return(-2);
}
win_cols = code_len + name_len + 2 + 2 + 2;
if (win_cols < 16)
win_cols = 16;
if (win_cols > COLS - 12)
return(-3);
win_lines = 8;
srow = 5;
scol = COLS - win_cols - 8;
sprintf( scr_dump_file, "/tmp/.int_select.%d", getpid() );
scr_dump ( scr_dump_file );
boxw = newwin(win_lines+2+2, win_cols+4, srow-1, scol-2);
w = newwin(win_lines+2, win_cols, srow, scol);
zut_win_wboxclear(boxw, 1);
wrefresh(boxw);
for (i = 0; i < win_lines; i++) {
tmp_recno = i + 1;
$fetch absolute $tmp_recno inquery_cur_select into :code, :name;
if (SQLCODE)
break;
DelSpace(name);
mvwprintw(w, i, 2, "%-*d", code_len, code);
mvwprintw(w, i, 2+code_len+2, "-*%s", name_len, name);
}
mvwprintw(w, win_lines+1, 2, "↑↓移动 ESC退出");
i = 0;
mvwprintw(w, i, 0, "→");
oi = 0;
fst_recno = 1;
redraw = 0;
keypad(w, TRUE);
while (1) {
mvwprintw(w, i, 0, "→");
wrefresh(w);
switch (wgetch(w)) {
case KEY_UP:
case KEY_LEFT:
if (i == 0) {
if (fst_recno == 1) {
beep();
wattron(w, A_REVERSE);
mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到第一条. ");
wattroff(w, A_REVERSE);
continue;
}
fst_recno--;
redraw = 1;
} else
i--;
break;
case KEY_DOWN:
case KEY_RIGHT:
if (fst_recno + i == max_recno) {
beep();
wattron(w, A_REVERSE);
mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到最后一条.");
wattroff(w, A_REVERSE);
continue;
}
if (i == win_lines-1) {
if (fst_recno+win_lines-1 == max_recno) {
beep();
wattron(w, A_REVERSE);
mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到最后一条.");
wattroff(w, A_REVERSE);
continue;
}
fst_recno++;
redraw = 1;
} else
i++;
break;
#ifdef STAR500
case KEY_F(12):
#else
case KEY_PPAGE:
#endif
if (fst_recno == 1) {
beep();
wattron(w, A_REVERSE);
mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到第一页. ");
wattroff(w, A_REVERSE);
continue;
}
fst_recno -= win_lines;
if (fst_recno <= 0)
fst_recno = 1;
/*
i = 0;
*/
redraw = 1;
break;
#ifdef STAR500
case KEY_F(13):
#else
case KEY_NPAGE:
#endif
if (fst_recno + win_lines >= max_recno) {
beep();
wattron(w, A_REVERSE);
mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到最后一页.");
wattroff(w, A_REVERSE);
continue;
}
fst_recno += win_lines;
if (i + fst_recno >= max_recno) {
/* 最后一页调整i */
i = max_recno - fst_recno;
}
redraw = 1;
break;
case KEY_F(4):
case '\n':
case '\r':
/*================== WuBin 2001-6-22 10:39 ======Start==============*/
tmp_recno = fst_recno+i;
$fetch absolute $tmp_recno inquery_cur_select into :code, :name;
/*===========================2001-6-22 10:39=======End==============*/
$close inquery_cur_select;
DelSpace(name);
sel_code = code;
strcpy(sel_name, name);
delwin(w);
delwin(boxw);
scr_restore ( scr_dump_file );
unlink ( scr_dump_file );
return(0);
case '\033':
$close inquery_cur_select;
sel_code = 0;
strcpy(sel_name, "");
delwin(w);
delwin(boxw);
scr_restore ( scr_dump_file );
unlink ( scr_dump_file );
return(-1);
default:
beep();
continue;
}
mvwprintw(w, win_lines, 0, "%-*s", win_cols, " ");
mvwprintw(w, oi, 0, " ");
wrefresh(w);
oi = i;
if (redraw == 0) {
continue;
}
for (j = 0; j < win_lines; j++) {
tmp_recno = fst_recno + j;
$fetch absolute $tmp_recno inquery_cur_select into :code, :name;
if (SQLCODE) {
mvwprintw(w, j, 0, "%-*s", win_cols, " ");
continue;
}
mvwprintw(w, j, 2, "%-*d", code_len, code);
mvwprintw(w, j, 2+code_len+2, "-*%s", name_len, name);
redraw = 0;
}
}
}
/*
* 弹出查询窗口进行选择
* 每个记录需三个字段,一般为number,chinese,macro_def,一般只用前两个字段
* bit_struct的位图结构在bitmap.h中定义
* Added Wubin
* ZGX--Move from ../BTS_ADM/pubname.c
*/
int bitmap_select(bit_map, bit_struct )
char *bit_map; /* 所要选择的位图名 */
struct bitmap_struct *bit_struct; /* 所要选择的位图名的结构名称 */
{
char *bit_flag;
char bit_number[3]; /* 标号 */
char bit_chinese[30]; /* 中文描述 */
char bit_macro_def[30]; /* 对应宏定义 */
int number_len = 0, chinese_len = 0;
char scr_dump_file[80];
int c, cc;
WINDOW *w, *boxw;
int row, col, srow, scol;
int ii, i, j, oi;
int win_lines, win_cols;
char redraw = 0;
int max_recno;
int tmp_recno;
int fst_recno;
/*
* 计算总记录数,及number,chinese的最大长度,以便确定窗口大小
*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?