📄 disp_menu.c
字号:
#include <stdio.h>
#include <ctype.h>
#include <varargs.h>
#include "db_struct_c.h"
#include "mytools.h"
#include "menu.h"
#include "main_menu.h"
#include "tool.h"
#include "color.h"
#include "macro_def.h"
#define ITEMS 256
extern char G_oper_no[];
extern struct screen_st scr;
extern char power_bak[ITEMS];
int Access = 0, item_all;
int G_start_menu_no;
int G_maxy, G_maxx, G_begy, G_begx;
extern WINDOW *pHeaderWin;
extern WINDOW *pTailWin;
extern WINDOW *pMenuWin;
int disp_table_screen();
/*
* 显示菜单项
* 参数:item_no -- SMenuItem[]之下标
* flag -- 标志。若为1,则反视显示。
* 若菜单项之power为0,则以灰色显示,以示不可用
*/
void DispItem0(wWin, iItemNo, iFlag)
WINDOW *wWin;
int iItemNo;
int iFlag;
{
char sName[WIDTH1+1];
int iLen;
strcpy(sName, SMenuItem[iItemNo].sName);
/*
* 若菜单项名的最后一位是数字(??),则显示时去掉
*/
iLen = strlen(sName) - 1;
if (isdigit(sName[iLen]))
sName[iLen] = 0;
if (SMenuItem[iItemNo].iPower) {
if (iFlag) {
wstandout(wWin);
wprintw(wWin, " %s ", sName);
wstandend(wWin);
} else
wprintw(wWin, " %s ", sName);
} else {
if ( !SMenuItem[iItemNo].iPower || Access) {
if (iFlag) {
wattron(wWin, BLUE_RED);
wprintw(wWin, " %s ", sName);
wattroff(wWin, BLUE_RED);
} else {
wattron(wWin, RED_BLUE);
wprintw(wWin, " %s ", sName);
wattroff(wWin, RED_BLUE);
}
}
}
}
/*
* 纵向显示菜单项
* 参数:item_no -- SMenuItem[]之下标
* flag -- 标志。若为1,则反视显示。
* 若菜单项之power为0,则以灰色显示,以示不可用
*/
void DispItem1(wWin, iItemNo, iFlag)
WINDOW *wWin;
int iItemNo;
int iFlag;
{
char sName[WIDTH1+1];
int iLen;
strcpy(sName, SMenuItem[iItemNo].sName);
iLen = strlen(sName) - 1;
if (isdigit(sName[iLen]))
sName[iLen] = 0;
if (SMenuItem[iItemNo].iPower) {
if (iFlag) {
wstandout(wWin);
wprintw(wWin, "%s", sName);
wstandend(wWin);
} else
wprintw(wWin, "%s", sName);
} else {
if ( !SMenuItem[iItemNo].iPower || Access) {
if (iFlag) {
wattron(wWin, BLUE_RED);
wprintw(wWin, "%s", sName);
// printw( "%s", sName);
wattroff(wWin, BLUE_RED);
}
else {
wattron(wWin, RED_BLUE);
wprintw(wWin, "%s", sName);
// printw( "%s", sName);
wattroff(wWin, RED_BLUE);
refresh();
}
}
}
}
/*
* 接受光标移动键, 显示相应信息
* 入口: 菜单号, 选择项号, 信息文件句柄
* 出口: 被激活的选择项号
* 出口条件: 接收的是回车键
*/
int DispMenu(wWin, iMenuNo, iItem_no, pMenuFile)
WINDOW *wWin;
int iMenuNo, *iItem_no;
FILE *pMenuFile;
{
int iRet ;
if ( InitItemInfo( wWin, iMenuNo, pMenuFile) < 0 )
return(ERR_MENU);
if (SMenu[iMenuNo].iDispFormat == 0)
iRet = DispMenu0(wWin, iMenuNo, iItem_no);
else{
iRet = DispMenu1(wWin, iMenuNo, iItem_no);
}
return(iRet);
}
/*
* 横向显示
*/
int DispMenu0(wWin, iMenuNo, iItemNo)
WINDOW *wWin;
int iMenuNo, *iItemNo;
{
int c, i, j, iCurrItem, iRet;
iCurrItem = *iItemNo;
iRet = 0;
DispMenuItem0( wWin, iMenuNo, iCurrItem );
do {
c = getkey(wWin); /*接受选择*/
switch (c) {
case CTRL_W:
if (Access || (iCurrItem == -1)) continue;
if (!iMenuNo)
FunKeyHelp(SMenuItem[SMenu[iMenuNo].iMenuItemSet[iCurrItem]].sName + 2);
else
FunKeyHelp(SMenu[iMenuNo].sMenuName);
break;
case CTRL_L: /* Redraw screen 刷新屏幕 */
wrefresh( curscr );
break;
case LEFT:
if (iCurrItem == -1)
continue;
j = iCurrItem;
while (1) {
if (iCurrItem == 0)
iCurrItem = item_all;
else
iCurrItem--;
i = SMenu[iMenuNo].iMenuItemSet[iCurrItem];
if (Access && power_bak[i]) break;
if (!Access && SMenuItem[i].iPower)
break;
}
if (j == iCurrItem)
continue;
break;
case SPACE:
if (Access) {
i = SMenu[iMenuNo].iMenuItemSet[iCurrItem];
SMenuItem[i].iPower = !SMenuItem[i].iPower;
break;
}
case RIGHT:
if (iCurrItem == -1) continue;
j = iCurrItem;
while (1) {
iCurrItem = (iCurrItem + 1) % (item_all + 1);
i = SMenu[iMenuNo].iMenuItemSet[iCurrItem];
if (Access && power_bak[i]) break;
if (!Access && SMenuItem[i].iPower) break;
}
if (j == iCurrItem) continue;
break;
case ENTER:
case CR:
if (Access) {
i = SMenu[iMenuNo].iMenuItemSet[iCurrItem];
if (SMenuItem[i].mproc && SMenuItem[i].cProcType == 'M')
continue;
}
if (iCurrItem == -1) continue;
*iItemNo = iCurrItem;
iRet = 1;
break;
case ESCAPE:
if (Access)
return(ERR_MENU);
if (iMenuNo == 0)
return(ERR_MENU);
iCurrItem = item_all;
*iItemNo = item_all;
/*
* 主菜单及主菜单为横向时的子菜单,
* ESC键须清屏
*/
if(iMenuNo == 0 || iMenuNo == 1 && SMenu[1].iDispFormat == 0) {
ClearMenu(wWin, iMenuNo);
DispMenuItem0( wWin, iMenuNo, iCurrItem );
return(ERR_MENU);
}
iRet = 1;
break;
case UP:
case PGUP:
if (Access || (iMenuNo == 0) || iMenuNo == 1 && SMenu[1].iDispFormat == 0/*主菜单横排 */)
continue;
sql_previous();
break;
case DOWN:
case PGDN:
if (Access || (iMenuNo == 0) || iMenuNo == 1 && SMenu[1].iDispFormat == 0)
continue;
sql_next();
break;
case HOME:
if (Access || (iMenuNo == 0) || iMenuNo == 1 && SMenu[1].iDispFormat == 0)
continue;
sql_first();
break;
case END:
if (Access || (iMenuNo == 0) || iMenuNo == 1 && SMenu[1].iDispFormat == 0)
continue;
sql_last();
break;
default:
if (iCurrItem == -1)
continue;
for (i = 0; i <= item_all; i++) {
j = SMenu[iMenuNo].iMenuItemSet[i];
if (c == SMenuItem[j].cFirstChar ) {
if (!Access && !SMenuItem[j].iPower)
continue;
iCurrItem = i;
*iItemNo = iCurrItem;
iRet = 1;
break;
}
}
if (i > item_all)
continue;
break;
}
DispMenuItem0( wWin, iMenuNo, iCurrItem );
} while (iRet == 0);
return( NORMAL );
}
/*
* 纵向显示
*/
int DispMenu1(wWin, iMenuNo, iItemNo)
WINDOW *wWin;
int iMenuNo, *iItemNo;
{
int c, i, j, iCurrItem, iRet;
int iStatus;
iCurrItem = *iItemNo;
iRet = 0;
iStatus = NORMAL;
DispMenuItem1( wWin, iMenuNo, iCurrItem );
do {
c = getkey(wWin); /*接受选择*/
switch (c) {
case CTRL_W:
if (Access || (iCurrItem == -1)) continue;
FunKeyHelp(SMenuItem[SMenu[iMenuNo].iMenuItemSet[iCurrItem]].sName + 2);
break;
case CTRL_L: /* Redraw screen */
wrefresh( curscr );
break;
case ESCAPE:
*iItemNo = iCurrItem;
iStatus = CLOSE;
ClearMenu(wWin, iMenuNo);
iRet = 1;
break;
case LEFT:
/** 父菜单横向排列才有效 **/
i = SMenuActiveStatus[iMenuNo].iFatherMenu;
if (SMenu[i].iDispFormat == 0) {
j = SMenuActiveStatus[i].iItem;
while (1) {
j++;
if (SMenu[i].iMenuItemSet[j] == -1) j = 0;
if (Access && power_bak[i]) break;
if (!Access && SMenuItem[SMenu[i].iMenuItemSet[j]].iPower)
break;
}
if (j == SMenuActiveStatus[i].iItem) continue;
iStatus = OPEN_LEFT;
} else
iStatus = CLOSE;
*iItemNo = iCurrItem;
ClearMenu(wWin, iMenuNo);
iRet = 1;
break;
case RIGHT:
/** 父菜单横向排列才有效 **/
i = SMenuActiveStatus[iMenuNo].iFatherMenu;
if (SMenu[i].iDispFormat == 0) {
j = SMenuActiveStatus[i].iItem;
while (1) {
j++;
if (SMenu[i].iMenuItemSet[j] == -1) j = 0;
if (Access && power_bak[i]) break;
if (!Access && SMenuItem[SMenu[i].iMenuItemSet[j]].iPower)
break;
}
if (j == SMenuActiveStatus[i].iItem) continue;
iStatus = OPEN_RIGHT;
} else
iStatus = CLOSE;
*iItemNo = iCurrItem;
ClearMenu(wWin, iMenuNo);
iRet = 1;
break;
case UP:
if (iCurrItem == -1) continue;
j = iCurrItem;
while (1) {
if (iCurrItem == 0) iCurrItem = item_all;
else iCurrItem--;
i = SMenu[iMenuNo].iMenuItemSet[iCurrItem];
if (Access && power_bak[i]) break;
if (!Access && SMenuItem[i].iPower) break;
}
if (j == iCurrItem) continue;
break;
case SPACE:
if (Access) {
i = SMenu[iMenuNo].iMenuItemSet[iCurrItem];
SMenuItem[i].iPower = !SMenuItem[i].iPower;
break;
}
case DOWN:
if (iCurrItem == -1) continue;
j = iCurrItem;
while (1) {
iCurrItem = (iCurrItem + 1) % (item_all + 1);
i = SMenu[iMenuNo].iMenuItemSet[iCurrItem];
if (Access && power_bak[i]) break;
if (!Access && SMenuItem[i].iPower) break;
}
if (j == iCurrItem) continue;
break;
case ENTER:
case CR:
if (Access) {
i = SMenu[iMenuNo].iMenuItemSet[iCurrItem];
if (SMenuItem[i].mproc &&
SMenuItem[i].iChildMenu) continue;
}
if (iCurrItem == -1) continue;
*iItemNo = iCurrItem;
iRet = 1;
break;
default:
if (iCurrItem == -1) continue;
for (i = 0; i <= item_all; i++) {
j = SMenu[iMenuNo].iMenuItemSet[i];
if (c == SMenuItem[j].cFirstChar ) {
if (!Access && !SMenuItem[j].iPower)
continue;
iCurrItem = i;
*iItemNo = iCurrItem;
iRet = 1;
break;
}
}
if (i > item_all) continue;
break;
}
if ( iStatus == NORMAL ) {
DispMenuItem1( wWin, iMenuNo, iCurrItem );
}
} while (iRet == 0);
return(iStatus);
}
/*
* 功能: 初始化菜单项信息
* 入口: 菜单号, 菜单信息文件句柄
* 出口: 菜单选择项名
* 选择项说明
* 选择项首字母
* 选择项的帮助文件索引
* 当前选择项所在行的首尾项号
*/
int InitItemInfo( wWin, iMenuNo, pMenuFile)
WINDOW *wWin;
int iMenuNo;
FILE *pMenuFile;
{
int c, i, j, iItemHead;
int iDispLen, iLen, iLen1, iLen2;
char sMenuName[20];
/*
* 从配置文件里读取菜单项信息,(名字可每次不同)
*/
if (GetItemInfo(iMenuNo, pMenuFile) < 0) {
errcall(ERROR, "get_item_info ERROR! please check file match.menu!");
return(-1);
}
/*
* 获取窗口参数G_maxy,G_maxx,G_begy,G_begx
*/
GetWinParam(wWin);
for ( i = 0; i < MAXITEM; i++)
SItemInfo[i].iHeadItem = SItemInfo[i].iTailItem = -1;
iDispLen = G_maxx - strlen(sMenuName) - 2 - 4; /*显示长度*/
/** 5 room for ... **/
i = iLen = iItemHead = iLen2 = 0;
do {
strcpy(sMenuName,
SMenuItem[SMenu[iMenuNo].iMenuItemSet[i]].sName);
iLen1 = strlen(sMenuName);
if (isdigit(sMenuName[iLen1 - 1])) iLen1--;
if (iLen1 > iLen2)
iLen2 = iLen1;
if (iLen + 2 + iLen1 > iDispLen) {
for (j = iItemHead ; j <= i - 1; j++) {
SItemInfo[j].iHeadItem = iItemHead;
SItemInfo[j].iTailItem = i - 1;
}
iItemHead = i;
iLen = 2 + 6 + iLen1;
} else
iLen += 2 + iLen1;
} while ( SMenu[iMenuNo].iMenuItemSet[++i] != -1 );
item_all = i - 1;
for ( i = 0; i <= item_all; i++) {
if (SItemInfo[i].iHeadItem == -1)
SItemInfo[i].iHeadItem = iItemHead;
if (SItemInfo[i].iTailItem == -1)
SItemInfo[i].iTailItem = item_all;
}
SMenuActiveStatus[iMenuNo].y = SMenu[iMenuNo].iLocateY;
SMenuActiveStatus[iMenuNo].x = SMenu[iMenuNo].iLocateX;
SMenuActiveStatus[iMenuNo].l = iLen2;
SMenuActiveStatus[iMenuNo].h = item_all + 1;
if (SMenu[iMenuNo].iDispFormat == 1)
return;
iLen2 = SMenu[iMenuNo].iLocateX;
for (i = 0; i <= item_all; i++) {
j = SMenu[iMenuNo].iMenuItemSet[i];
iLen2 = iLen2 + (strlen(SMenuItem[j].sName) + 2);
if (iLen2 > COLS -6) {
SMenuActiveStatus[iMenuNo].iPageItem = i;
return;
}
}
SMenuActiveStatus[iMenuNo].iPageItem = 0;
return;
}
/*
* 功能: 显示主菜单
* 入口: 当前选择项号
*/
int DispMainMenu(wWin, iCurrItem)
WINDOW *wWin;
int iCurrItem;
{
int i;
int iLen;
int iMenuItem;
char sBuf[256];
iLen = 0;
for (i = 0; i < MAXITEM; i++) {
iMenuItem = SMenu[0].iMenuItemSet[i];
if (iMenuItem == -1)
break;
if (iLen < strlen(SMenuItem[iMenuItem].sName));
iLen = strlen(SMenuItem[iMenuItem].sName);
}
if (iLen % 2 != 0)
iLen++;
for (i = 0; i < MAXITEM; i++) {
iMenuItem = SMenu[0].iMenuItemSet[i];
if (iMenuItem == -1)
break;
wmove(wWin, 2, iLen + i * 4);
DispItem0(wWin, SMenu[0].iMenuItemSet[i], (iCurrItem == i));
}
wmove(wWin, 3, 0);
wprintw(wWin, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
if (iCurrItem != -1) {
i = SMenu[0].iMenuItemSet[iCurrItem];
if (SMenuItem[i].iPower) {
if (!Access) {
sprintf(sBuf, "%s %s", G_comp, G_tele);
PromptBottomRight(LINES-1, 2, 1, sBuf);
}
PromptBottom(LINES-1, 1, 0, SMenuItem[i].sText);
}
}
wrefresh(wWin);
return(0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -