#include "TMenu.h"
#include "gvalue.h"
#include "gType.h"
#include "GraphLow.h"
#include "GraphBase.h"
#include "GlobalString.h"
#include "ImageData.h"

#define Icon16_Up		1
#define Icon16_Down	2

#define MainShowFont	24

#define SubShowFont	24

#define SubShowHeight	32

#define SubTextLeft	24

static const unsigned char SavePassWord[32] = "9910232250266023\0";

/*

const char StrMainMenuName[28] = {"系统设置"};

const char StrMainMenu[8][20] = {
	"设备注册",
	"设备定义",
	"联动公式",
	"网络设置",
	"工作模式",
	"密码设置",
	"其他设置",
	"清除故障从机"
};

const char StrSubMenuItem[48][40] = {
	//0
	"设备追加注册",
	"全部更新注册",
	"板卡更新注册",
	"手动增加设备",
	"手动减少设备",
	
	//5
	"总线设备定义",
	"手动盘定义",
	"多线盘定义",
	"广播/电话盘定义",
	"联网控制器定义",
	"自定义设备类型",
	"回路注释定义",
	"工程名称",
	
	//13
	"新建联动公式",
	"修改联动公式",
	"删除联动公式",
	
	//16
	"本机地址设置",
	"通讯板设置",
	
	//18
	"调试模式设置",
	"广播同步设置",
	"预警功能设置",
	"火警输出设置",
	"接地检查设置",
	"显示盘静音设置",
	"控制器静音设置",
	"声光报警器反馈设置",
	
	//26
	"权限I级密码设置",
	"权限II级密码设置",
	"权限III级密码设置",
	"权限IV级密码设置-最高",
	"气体密码设置",
	
	//31
	"定点调试",
	"数字化设备调试",
	"修改设备编码",
	"重码检测",
	"探测器污染补偿",
	"探测器清洗修正",
	"REV0",
	"REV1",
	"REV2",
	"REV3"
	
	//41	
};
*/



const char StrMainMenuName[28] = {"系统设置"};


const char StrMainMenu[12][36]={
	//"1.操作权限登录",
	"1.本机",
	"2.历史事件",
	"3.工程",
	"4.回路",
	"5.手动控制盘",
	"6.联动",
	"7.局域网",
	"8.数据传输",
	"9.高级设计",
	"*,--------",
	"*,--------"
};

const char StrMainMenuEn[12][36]={
	//"1.操作权限登录",
	"1.Local Machine",
	"2.Histroy Message",
	"3.Project",
	"4.Loop",
	"5.App Keypad Boards",
	"6.Linkage",
	"7.LAN",
	"8.Data Transfer",
	"9.Data Setting",
	"*,--------",
	"*,--------"
};

//const xxxx MenuActionList_0[4] ={ActLoginII, ActLoginIII, ActLoginIV, Null0};
//const char StrSubMenu_0  [SubItemCount_0]  [32]={
	//"权限登录",	1111_  1=allow 0=NotAllow S=BySet
//	"1110_1.II级权限登录",
//	"1110_2.III级权限登录",
//	"1110_3.退出登录",
//};

//const xxxx MenuActionList_1[12] ={ActQueDevice, ActQueRegAddr, ActQueMaskDevice, ActQueConfig, ActQueInterLink, ActQueInterLink4Pad, ActQueNetwork, Null1};
const char StrSubMenu_0  [SubItemCount_0]  [SubItemTextLen]={
	//"查询信息", 1111_  1=allow 0=NotAllow S=BySet
	/*"S110_1.注册信息",
	"S110_2.设备状态",
	"S110_3.屏蔽部件",
	"S110_4.注释信息",
	"S110_5.本机配置",
	"S110_6.网络配置",
	"S110_7.联动编程",
	"S110_8.总线盘编程",
	"S110_9.多线盘配置信息",*/
	
	"1110_1.硬件",
	"1110_2.电源",
	"1110_3.打印机",
	"0110_4.日期时间",
	"1110_5.密码",
	"1110_6.屏保",
	"1110_7.语言/Language"
};

const char StrSubMenu_0_En  [SubItemCount_0]  [SubItemTextLen]={
	//"查询信息", 1111_  1=allow 0=NotAllow S=BySet
	/*"S110_1.注册信息",
	"S110_2.设备状态",
	"S110_3.屏蔽部件",
	"S110_4.注释信息",
	"S110_5.本机配置",
	"S110_6.网络配置",
	"S110_7.联动编程",
	"S110_8.总线盘编程",
	"S110_9.多线盘配置信息",*/
	
	"1110_1.Hardware",
	"1110_2.Power Suppy Info",
	"1110_3.Printer",
	"0110_4.Date and time",
	"1110_5.Password",
	"1110_6.Screen Saver",
	"1110_7.Language/语言"
};

//const xxxx MenuActionList_2[12] ={ActQueMsgAll, ActQueMsgAlarm, ActQueMsgInterLink, ActQueMsgFault, ActQueMsgOperator, ActQueMsgMonitor, Null2};
const char StrSubMenu_1  [SubItemCount_1]  [SubItemTextLen]={
	//"查询历史记录", 1111_  1=allow 0=NotAllow S=BySet
	/*"S110_1.全部事件",
	"S110_2.火警事件",
	"S110_3.联动事件",
	"S110_4.故障事件",
	"S110_5.操作事件",
	"S110_6.监管事件",
	"S110_7.打印事件"*/
	
	"1110_1.全部事件",
	"1110_2.报警事件",
	"1110_3.联动事件",
	"1110_4.监管事件",
	"1110_5.故障事件",
	"1110_6.操作事件",
	"1110_7.打印事件"
};

const char StrSubMenu_1_En  [SubItemCount_1]  [SubItemTextLen]={
	//"查询历史记录", 1111_  1=allow 0=NotAllow S=BySet
	/*"S110_1.全部事件",
	"S110_2.火警事件",
	"S110_3.联动事件",
	"S110_4.故障事件",
	"S110_5.操作事件",
	"S110_6.监管事件",
	"S110_7.打印事件"*/
	
	"1110_1.All",
	"1110_2.Alarm",
	"1110_3.Linkage",
	"1110_4.Supervision",
	"1110_5.Fault",
	"1110_6.Operation",
	"1110_7.Print"
};

//const xxxx MenuActionList_3[12] ={ActQueValue, ActQueMsgAlarm, ActQueMsgInterLink, ActQueMsgFault, ActQueMsgOperator, ActQueMsgMonitor, Null3};
const char StrSubMenu_2  [SubItemCount_2]  [SubItemTextLen]={
	//"通用设置", 1111_  1=allow 0=NotAllow S=BySet
	"1110_1.工程信息",
	"1110_2.维保提醒",
	"1110_3.运行模式",
	"1110_4.系统授权",
	"1110_5.设计数量",
	"1110_6.按回路查询模块输出检线",	//"1110_6.批量设置模块输出检线",
	"1110_7.按回路查询烟感灵敏度",	//"1110_7.批量设置烟感灵敏度",
	"1110_8.按回路查询声光",		//"1110_8.批量设置声光",
	"1110_9.层显信息下载",
};

const char StrSubMenu_2_En  [SubItemCount_2]  [SubItemTextLen]={
	//"通用设置", 1111_  1=allow 0=NotAllow S=BySet
	"1110_1.Information",
	"1110_2.Maintenance",
	"1110_3.Operating State",
	"1110_4.System Authorized",
	"1110_5.Designed Numbers",
	"1110_6.Output Line Inspection",
	"1110_7.Smoke Det Sensitivity",
	"1110_8.Acoustooptic Parameter",
	"1110_9.Floor Display KeyPad Cfg",
};

//const xxxx MenuActionList_4[12] ={ActDeviceSetup, guiQueMsgAlarm, guiQueMsgInterLink, guiQueMsgFault, guiQueMsgOperator, guiQueMsgMonitor, Null4};
const char StrSubMenu_3  [SubItemCount_3]  [SubItemTextLen]={
	//"系统调试", 1111_  1=allow 0=NotAllow S=BySet
	
	/*"0010_1.探测器模拟曲线",
	"0010_2.回路设备运行状态",
	"0010_3.回路设备实时数据",
	"0010_4.回路设备在线配置",
	"0010_5.回路设备运行电压",
	"0010_6.回路设备手动启动",
	"0S10_7.回路设备状态",
	"0010_8.回路重号检测",
	"0010_9.设备地址变更",
	"0010_0.模拟运行与操作"*/
	
	"1110_1.注册数据",
	"1110_2.状态总览",
	"1110_3.部件数据",
	"1110_4.部件控制",
	"1110_5.自动注册",
	"1110_6.手动注册",
	"1110_7.部件屏蔽",
	"1110_8.重码检测",
	"1110_9.部件分类数量",
	"1110_0.注释编辑"
};

const char StrSubMenu_3_En  [SubItemCount_3]  [SubItemTextLen]={
	//"系统调试", 1111_  1=allow 0=NotAllow S=BySet
	
	/*"0010_1.探测器模拟曲线",
	"0010_2.回路设备运行状态",
	"0010_3.回路设备实时数据",
	"0010_4.回路设备在线配置",
	"0010_5.回路设备运行电压",
	"0010_6.回路设备手动启动",
	"0S10_7.回路设备状态",
	"0010_8.回路重号检测",
	"0010_9.设备地址变更",
	"0010_0.模拟运行与操作"*/
	
	"1110_1.Registration Information",
	"1110_2.Overview",
	"1110_3.Device Information",
	"1110_4.Device Control",
	"1110_5.Auto Register",
	"1110_6.Manual Register",
	"1110_7.Device Blocking",
	"1110_8.Duplicate Addr Check",
	"1110_9.Device Types Count",
	"1110_0.Device Annotation"
};

const char StrSubMenu_4  [SubItemCount_4]  [SubItemTextLen]={
	//"系统设置", 1111_  1=allow 0=NotAllow S=BySet
	"1110_1.手动控制盘信息",
	"1110_2.多线盘配置",
	"1110_3.总线盘配置"
};

const char StrSubMenu_4_En  [SubItemCount_4]  [SubItemTextLen]={
	//"系统设置", 1111_  1=allow 0=NotAllow S=BySet
	"1110_1.App Keypad Boards Info",
	"1110_2.Direct Keypad Boards Cfg",
	"1110_3.Bus Keypad Boards Cfg"
};

const char StrSubMenu_5  [SubItemCount_5]  [SubItemTextLen]={
	//"系统安装", 1111_  1=allow 0=NotAllow S=BySet
	"1110_1.编程查询",
	"1110_2.编程输入",
	"1110_3.广播控制",
	"1110_4.手/自动控制状态",
	"1110_5.联动设备控制总线FECBUS",
	"1110_6.分区编辑",
	"1110_7.二次码编辑(按回路)",
	"1110_8.二次码编辑(按分区)"
};

const char StrSubMenu_5_En  [SubItemCount_5]  [SubItemTextLen]={
	//"系统安装", 1111_  1=allow 0=NotAllow S=BySet
	"1110_1.Linkage Expressions List",
	"1110_2.Linkage Expressions Edit",
	"1110_3.Broadcast Config",
	"1110_4.Manual-Auto Switch",
	"1110_5.FECBus Setting",
	"1110_6.Zone Setting",
	"1110_7.Aux ID Setting(Loop)",
	"1110_8.Aux ID Setting(Zone)"
};

const char StrSubMenu_6  [SubItemCount_6]  [SubItemTextLen]={
	//"网络设置" 1111_  1=allow 0=NotAllow S=BySet
	"1110 1.组网信息",
	"1110_2.本机模式与注册",
	"1110_3.网络屏蔽",
	"1110_4.消防控制室图形显示装置"
};

const char StrSubMenu_6_En  [SubItemCount_6]  [SubItemTextLen]={
	//"网络设置" 1111_  1=allow 0=NotAllow S=BySet
	"1110 1.Network Information",
	"1110_2.Local Setting",
	"1110_3.Network ID Mask",
	"1110_4.Graphic Display Setting"
};

const char StrSubMenu_7  [SubItemCount_7]  [SubItemTextLen]={
	//本机   1=allow 0=NotAllow S=BySet
	"1110_1.在线调试",
	"0010_2.U盘传输",
	"0010_3.蓝牙连接",
	"0010_4.WIFI连接",
	"0010_5.传输装置",
	"0010_6.固件升级",
};

const char StrSubMenu_7_En  [SubItemCount_7]  [SubItemTextLen]={
	//本机   1=allow 0=NotAllow S=BySet
	"1110_1.Online Test",
	"0010_2.USB Disk Config",
	"0010_3.Blue Tooth",
	"0010_4.WIFI Setting",
	"0010_5.Transmission Setting",
	"0010_6.Firmware Upgrade",
};

const char StrSubMenu_8  [SubItemCount_8]  [SubItemTextLen]={
	//高级设置
	"0010_1.清除注册数据",
	"0010_2.清除联动编程",
	"0010_3.清除注释信息",
	"0010_4.恢复出厂设置"
};

const char StrSubMenu_8_En  [SubItemCount_8]  [SubItemTextLen]={
	//高级设置
	"1110_1.Clear Registered Data",
	"1110_2.Clear Linkage Expressions",
	"1110_3.Clear All Descriptions",
	"1110_4.Restore Factory Setting"
};

const char StrSubMenu_9  [SubItemCount_9]  [SubItemTextLen]={
	//"出厂设置， 隐藏",
	"0010_1.生产过程检验信息",
	"0010_2.清除全部配置信息",
	"0010_3.清除全部历史事件",
};

const unsigned char SubMenuItem_Count[12] = {
	SubItemCount_0,
	SubItemCount_1,
	SubItemCount_2,
	SubItemCount_3,
	SubItemCount_4,
	SubItemCount_5,
	SubItemCount_6,
	SubItemCount_7,
	SubItemCount_8,
	SubItemCount_9,
	SubItemCount_0,
	SubItemCount_0	
};

const char *const pPermissionText[MainItemCount] ={
	&StrSubMenu_0[0][0],
	&StrSubMenu_1[0][0],
	&StrSubMenu_2[0][0],
	&StrSubMenu_3[0][0],
	&StrSubMenu_4[0][0],
	&StrSubMenu_5[0][0],
	&StrSubMenu_6[0][0],
	&StrSubMenu_7[0][0],
	&StrSubMenu_8[0][0],
};

const unsigned short Main_Top[12] = {

	56,
	102,
	148,
	194,
	240,
	
	286,
	332,
	378,
};

const unsigned short Main_Bottom[12] = {
	
	98,
	144,
	190,
	236,
	282,
	
	328,
	374,
	420,
};

const unsigned short Sub_Top[16] = {
	//   320 / 8 / = 40, 
56,
92,
128,
164,
200,
	
236,
272,
308,
344,
380
	
};

const unsigned short Sub_Bottom[16] = {
	//   320 / 8 / = 40, 
88,
124,
160,
196,
232,
	
268,
304,
340,
376,
412

};



void TMenu::Init(int x1, int y1, int x2, int y2)
{
	unsigned int i,j,x;
	//0 level
	BorderWidth = 2;
	BorderColor = 0x00343242;	
			
	MainBound.Set(x1,y1,299,y2);
	SubBound.Set(300,y1,x2,y2);
	
	BevelOuter = bvRaised;
	if(BevelOuter == bvRaised){
		MainContent.Set(x1 +1, 	y1 +1,	297,	y2-2);
		SubContent.Set(301, 	y1 +1,	797,	y2-2);
	}else{
		MainContent.Set(x1 +2, 	y1 +2,	297,	y2-2);
		SubContent.Set(301, 	y1 +2,	797,	y2-2);
	}
	
	MainFontSize = 24;
	SubFontSize = 24;
	
	MainIndexOnTop = 0;
	SelectedMainIndex = 0;
	SelectedSubIndex = 0;
	LastMainIndex =0xFF;
	LastSubIndex =0xFF;
	ActiveLevel = 0;
	NeedRedraw =0;
	
	Active = 0;
	OnAction = 0;
	IsHasActive2 = 0;
			
	LoadText();
	LoadPermission(0);
}

void 	TMenu::LoadText(void)
{
	unsigned int i;
	//1 level
	for(i=0; i<MainItemCount; i++){
		if(LanguageEnCn==0)
			MainItemList[i].fName = StrMainMenu[i];
		else 
			MainItemList[i].fName = StrMainMenuEn[i];
	}
	
	//2 level
	for(i=0; i<SubItemCount_0; i++){
		if(LanguageEnCn==0)
			SubItemList[0][i].fName = StrSubMenu_0[i];
		else
			SubItemList[0][i].fName = StrSubMenu_0_En[i];
	}

	for(i=0; i<SubItemCount_1; i++){
		if(LanguageEnCn==0)
			SubItemList[1][i].fName = StrSubMenu_1[i];
		else
			SubItemList[1][i].fName = StrSubMenu_1_En[i];
	}
	

	for(i=0; i<SubItemCount_2; i++){
		if(LanguageEnCn==0)
			SubItemList[2][i].fName = StrSubMenu_2[i];
		else
			SubItemList[2][i].fName = StrSubMenu_2_En[i];
	}
	
	for(i=0; i<SubItemCount_3; i++){
		if(LanguageEnCn==0)
			SubItemList[3][i].fName = StrSubMenu_3[i];
		else
			SubItemList[3][i].fName = StrSubMenu_3_En[i];
	}
	
	for(i=0; i<SubItemCount_4; i++){
		if(LanguageEnCn==0)
			SubItemList[4][i].fName = StrSubMenu_4[i];
		else
			SubItemList[4][i].fName = StrSubMenu_4_En[i];
	}
	
	for(i=0; i<SubItemCount_5; i++){
		if(LanguageEnCn==0)
			SubItemList[5][i].fName = StrSubMenu_5[i];
		else
			SubItemList[5][i].fName = StrSubMenu_5_En[i];
	}
	
	for(i=0; i<SubItemCount_6; i++){
		if(LanguageEnCn==0)
			SubItemList[6][i].fName = StrSubMenu_6[i];
		else
			SubItemList[6][i].fName = StrSubMenu_6_En[i];
	}
	
	for(i=0; i<SubItemCount_7; i++){
		if(LanguageEnCn==0)
			SubItemList[7][i].fName = StrSubMenu_7[i];
		else
			SubItemList[7][i].fName = StrSubMenu_7_En[i];
	}
	
	for(i=0; i<SubItemCount_8; i++){
		if(LanguageEnCn==0)
			SubItemList[8][i].fName = StrSubMenu_8[i];
		else
			SubItemList[8][i].fName = StrSubMenu_8_En[i];
	}
	
	for(i=0; i<SubItemCount_9; i++){
		if(LanguageEnCn==0)
			SubItemList[9][i].fName = StrSubMenu_9[i];
		else
			SubItemList[9][i].fName = StrSubMenu_9[i];
	}
	
	//for(i=0; i<SubItemCount_10; i++){
	//	SubItemList[10][i].fName = StrSubMenu_10[i];
	//}
}


void TMenu::SelfDraw(void)
{
	unsigned int LeftClr, RightClr;
	
	#define MenuLevelSelectedCLR		clMaroon
	#define MenuLevelCLR			clWhite

	#define MENU_BG_COLOR			clTeal
	#define MENU_ITEM_SELECTED_BG_CLR	clBlue
	#define MENU_ITEM_BG_CLR		clTeal

	#define MENU_SELECTED_TEXT_CLR	clNearWhite
	#define MENU_TEXT_CLR			clNearBlack
	
	if(BevelOuter == bvRaised){
		VertLineRender(MainBound.Left,	MainBound.Top, 		MainBound.Height -1,	0xFFFFFFFF);
		VertLineRender(MainBound.Right -1,	MainBound.Top +1,		MainBound.Height -2,	0xFF808080);
		VertLineRender(MainBound.Right,	MainBound.Top,		MainBound.Height,		0xFF404040);
	
		HorizLineRender(MainBound.Left, 	MainBound.Top, 		MainBound.Width - 1, 	0xFFFFFFFF);
		HorizLineRender(MainBound.Left +1, 	MainBound.Bottom -1,  	MainBound.Width - 2, 	0xFF808080);
		HorizLineRender(MainBound.Left,	MainBound.Bottom,		MainBound.Width,		0xFF404040);
		
		VertLineRender(SubBound.Left,		SubBound.Top, 		SubBound.Height -1,	0xFFFFFFFF);
		VertLineRender(SubBound.Right -1,	SubBound.Top +1,		SubBound.Height -2,	0xFF808080);
		VertLineRender(SubBound.Right,	SubBound.Top,		SubBound.Height,		0xFF404040);
	
		HorizLineRender(SubBound.Left, 	SubBound.Top, 		SubBound.Width - 1, 	0xFFFFFFFF);
		HorizLineRender(SubBound.Left +1, 	SubBound.Bottom -1,  	SubBound.Width - 2, 	0xFF808080);
		HorizLineRender(SubBound.Left,	SubBound.Bottom,		SubBound.Width,		0xFF404040);
	
	}else{
		VertLineRender(MainBound.Left,	MainBound.Top, 	MainBound.Height-1,	0xFF808080);
		HorizLineRender(MainBound.Left,	MainBound.Top, 	MainBound.Width-1,	0xFF808080);
		VertLineRender(MainBound.Left+1,	MainBound.Top+1, 	MainBound.Height-2,	0xFF404040);
		HorizLineRender(MainBound.Left+1,	MainBound.Top+1, 	MainBound.Width-2,	0xFF404040);
		VertLineRender(MainBound.Right-1,	MainBound.Top+1, 	MainBound.Height-2,	0xFFD4D0C8);
		HorizLineRender(MainBound.Left+1,	MainBound.Bottom-1, 	MainBound.Width-2,	0xFFD4D0C8);
		VertLineRender(MainBound.Right,	MainBound.Top, 	  MainBound.Height,	0xFFFFFFFF);
		HorizLineRender(MainBound.Left,	MainBound.Bottom, MainBound.Width,	0xFFFFFFFF);
		
		
		VertLineRender(SubBound.Left,	SubBound.Top, 	SubBound.Height-1,	0xFF808080);
		HorizLineRender(SubBound.Left,	SubBound.Top, 	SubBound.Width-1,	0xFF808080);
		VertLineRender(SubBound.Left+1,	SubBound.Top+1, 	SubBound.Height-2,	0xFF404040);
		HorizLineRender(SubBound.Left+1,	SubBound.Top+1, 	SubBound.Width-2,	0xFF404040);
		VertLineRender(SubBound.Right-1,	SubBound.Top+1, 	SubBound.Height-2,	0xFFD4D0C8);
		HorizLineRender(SubBound.Left+1,	SubBound.Bottom-1, 	SubBound.Width-2,	0xFFD4D0C8);
		VertLineRender(SubBound.Right,	SubBound.Top, 	  SubBound.Height,	0xFFFFFFFF);
		HorizLineRender(SubBound.Left,	SubBound.Bottom, SubBound.Width,	0xFFFFFFFF);		
	}
	/*if(ActiveLevel == 0){
		LeftClr = MenuLevelSelectedCLR;
		RightClr = MenuLevelCLR;
	}else
	if(ActiveLevel == 1){
		LeftClr = MenuLevelCLR;
		RightClr = MenuLevelSelectedCLR ;
	}else{
		ActiveLevel = 0;
		SelectedMainIndex = 0;
		SelectedSubIndex = 0;
		LeftClr = MenuLevelSelectedCLR;
		RightClr = MenuLevelCLR;
	}*/
	RectFillRender(MainContent.Left, MainContent.Top, MainContent.Right, MainContent.Bottom, clFrmFace);
	RectFillRender(SubContent.Left, SubContent.Top, SubContent.Right, SubContent.Bottom, clFrmFace);
	
	if(ActiveLevel == 0){
	//	RectFillRender(MainContent.Left, MainContent.Top, MainContent.Right, MainContent.Bottom, MENU_SELECTED_BG_COLOR);
	}else{
	//	RectFillRender(MainContent.Left, MainContent.Top, MainContent.Right, MainContent.Bottom, MENU_BG_COLOR);
	}
}

void TMenu::MainDraw(void)
{
	#define MainShowCount	8
	#define MainTextLeft	24

	#define MainLeft		20
	#define MainRight		270
	#define MainWidth		251
	#define MainHeight	42
	#define MainConLeft	22
	#define MainConRight	268
	
	#define MainIconLeft	272
	#define MainIconRight	296
	
	#define MainFixLeft	276
	#define MainFixRight	292
	#define MainTFixTop 	40
	#define MainTFixBottom 	56
	#define MainBFixTop 	422
	#define MainBFixBottom 	438
	
	unsigned int i;
	unsigned int aIdx;
	if( (ActiveLevel != 0) && (ActiveLevel != 1) )ActiveLevel = 0;
	if(ActiveLevel == 0){
		if(IconList != nullptr){
			IconList->Render(16,Icon16_Up  , MainFixLeft, MainTFixTop);
			IconList->Render(16,Icon16_Down, MainFixLeft, MainBFixTop);
		}
	}else{
		RectFillRender(MainFixLeft, MainTFixTop, MainFixRight, MainTFixBottom, clFrmFace);
		RectFillRender(MainFixLeft, MainBFixTop, MainFixRight, MainBFixBottom, clFrmFace);
	}
	aIdx = MainIndexOnTop;
	for(i=0; i< MainShowCount; i++){
		RectFillRender(MainIconLeft, Main_Top[i], MainIconRight, Main_Bottom[i], clFrmFace);
		
		if(SelectedMainIndex == aIdx){
			VertLineRender(MainLeft,	Main_Top[i], 	MainHeight-1,	0xFF808080);
			HorizLineRender(MainLeft,	Main_Top[i], 	MainWidth-1,	0xFF808080);
		
			VertLineRender(MainLeft+1,	Main_Top[i]+1, 	MainHeight-2,	0xFF404040);
			HorizLineRender(MainLeft+1,	Main_Top[i]+1, 	MainWidth-2,	0xFF404040);
	
			VertLineRender(MainRight-1,	Main_Top[i]+1, 	MainHeight-2,	0xFFD4D0C8);
			HorizLineRender(MainLeft+1,	Main_Bottom[i]-1, MainWidth-2,	0xFFD4D0C8);

			VertLineRender(MainRight,	Main_Top[i], 	MainHeight,		0xFFFFFFFF);
			HorizLineRender(MainLeft,	Main_Bottom[i], 	MainWidth,		0xFFFFFFFF);
			
			if(ActiveLevel == 0){
				if(IconList != nullptr)IconList->Render(24, 0, MainIconLeft ,Main_Top[i]+10);
				RectFillRender(MainConLeft, Main_Top[i]+2, MainConRight, Main_Bottom[i]-2, clMaroon);
			}else{
				if(IconList != nullptr)IconList->Render(24, 9, MainIconLeft ,Main_Top[i]+10);
				RectFillRender(MainConLeft, Main_Top[i]+2, MainConRight, Main_Bottom[i]-2, clNearTeal);
			}

			TextRender_string24(MainConLeft+16, Main_Top[i]+12, MENU_SELECTED_TEXT_CLR, MainItemList[aIdx].fName);
			
		}else{
			RectFillRender(MainLeft, Main_Top[i], MainRight, Main_Bottom[i], MENU_BG_COLOR);
			RectFillRender(MainIconLeft ,Main_Top[i]+10, MainIconRight, Main_Bottom[i], clFrmFace);
			TextRender_string24(MainLeft+10, Main_Top[i]+9, MENU_TEXT_CLR, MainItemList[aIdx].fName);
		}
		
		aIdx++;
	}
}

void TMenu::SubDraw(void)
{
	
	#define SubShowCount	10
	
	#define Sub_Sel_EN_BG_CLR		clSkyBlue
	#define Sub_Sel_DIS_BG_CLR		clLtGray
	#define Sub_EN_BG_CLR			clTeal	
	#define Sub_DIS_BG_CLR			clOlive

	#define Sub_TEXT_Sel_EN_CLR		clNearWhite
	#define Sub_TEXT_Sel_DIS_CLR		clGray
	#define Sub_TEXT_EN_CLR			clNearBlack	
	#define Sub_TEXT_DIS_CLR		clGray

	#define Sub_Static_CLR			clGray
	#define Sub_Static_Text_CLR		clOlive 
	
	#define SubLeft		340
	#define SubRight		780
	
	#define SubIconLeft	308
	#define SubIconRight	332
	
	#define SubFixLeft	312
	#define SubFixRight	328
	#define SubTFixTop 	40
	#define SubTFixBottom 	56
	#define SubBFixTop 	422
	#define SubBFixBottom 	438
	
	#define SubSelRectLeft  332
	#define SubSelRectRight  782
	int i;
	unsigned int Tidx, Mid,Sid;
	unsigned int Lstart, Lend, aClr;
	if( (ActiveLevel != 0) && (ActiveLevel != 1) )ActiveLevel = 0;
	for(i=0; i<SubShowCount; i++){
		RectRender(SubSelRectLeft, 	Sub_Top[i], 		SubSelRectLeft +6,  Sub_Top[i] +6 , 2, clFrmFace);
		RectRender(SubSelRectLeft, 	Sub_Bottom[i]-6, 		SubSelRectLeft +6,  Sub_Bottom[i], 2, clFrmFace);
		RectRender(SubSelRectRight, 	Sub_Top[i], 		SubSelRectRight +6,  Sub_Top[i] +6, 2,  clFrmFace);
		RectRender(SubSelRectRight, 	Sub_Bottom[i]-6, 		SubSelRectRight +6,  Sub_Bottom[i], 2,  clFrmFace);	
		RectRender(SubSelRectLeft+1, 	Sub_Top[i]+1, 		SubSelRectLeft +5,  Sub_Top[i] +5 , 2, clFrmFace);
		RectRender(SubSelRectLeft+1, 	Sub_Bottom[i]-5, 		SubSelRectLeft +5,  Sub_Bottom[i]-1, 2, clFrmFace);
		RectRender(SubSelRectRight+1, Sub_Top[i]+1, 		SubSelRectRight +5,  Sub_Top[i] +5, 2,  clFrmFace);
		RectRender(SubSelRectRight+1, Sub_Bottom[i]-5, 		SubSelRectRight +5,  Sub_Bottom[i]-1, 2,  clFrmFace);
		
		RectFillRender(SubIconLeft, Sub_Top[i], SubRight, Sub_Bottom[i], clFrmFace);
	}
	if(ActiveLevel == 1){
		if(IconList != nullptr){
			IconList->Render(16,Icon16_Up  , SubFixLeft, SubTFixTop);
			IconList->Render(16,Icon16_Down, SubFixLeft, SubBFixTop);
		}
	}else{
		RectFillRender(SubFixLeft, SubTFixTop, SubFixRight, SubTFixBottom, clFrmFace);
		RectFillRender(SubFixLeft, SubBFixTop, SubFixRight, SubBFixBottom, clFrmFace);
	}
	Lstart = (SubShowCount - SubMenuItem_Count[SelectedMainIndex]) / 2; 
	//sp = 0;
	Tidx = 0;
	Lstart = 0;
	for(i=Lstart; i<SubShowCount; i++){
		if(Tidx < SubMenuItem_Count[SelectedMainIndex]){
			if(Tidx == SelectedSubIndex){
				if(ActiveLevel == 1)aClr =clMaroon; else aClr = clNearTeal;
				RectRender(SubSelRectLeft, 	Sub_Top[i], 		SubSelRectLeft +6,  Sub_Top[i] +6 , 2,aClr);
				RectRender(SubSelRectLeft, 	Sub_Bottom[i]-6, 		SubSelRectLeft +6,  Sub_Bottom[i], 2, aClr);
				RectRender(SubSelRectRight, 	Sub_Top[i], 		SubSelRectRight +6,  Sub_Top[i] +6, 2, aClr);
				RectRender(SubSelRectRight, 	Sub_Bottom[i]-6, 		SubSelRectRight +6,  Sub_Bottom[i], 2, aClr);
				RectRender(SubSelRectLeft+1, 	Sub_Top[i]+1, 		SubSelRectLeft +5,  Sub_Top[i] +5 , 2, aClr);
				RectRender(SubSelRectLeft+1, 	Sub_Bottom[i]-5, 		SubSelRectLeft +5,  Sub_Bottom[i]-1, 2, aClr);
				RectRender(SubSelRectRight+1, Sub_Top[i]+1, 		SubSelRectRight +5,  Sub_Top[i] +5, 2,  aClr);
				RectRender(SubSelRectRight+1, Sub_Bottom[i]-5, 		SubSelRectRight +5,  Sub_Bottom[i]-1, 2,  aClr);

				if(SubItemList[SelectedMainIndex][Tidx].Enable){
					if(IconList != nullptr)	IconList->Render(24,dIcon24_Allow1, SubIconLeft, Sub_Top[i]+6);
					RectFillRender(SubLeft, Sub_Top[i], SubRight, Sub_Bottom[i], aClr);
					TextRender_string24(SubLeft+6, Sub_Top[i]+6, clWhite, &SubItemList[SelectedMainIndex][Tidx].fName[5]);
				}else{
					if(IconList != nullptr)	IconList->Render(24,dIcon24_NotAllow1, SubIconLeft, Sub_Top[i]+6);
					RectFillRender(SubLeft, Sub_Top[i], SubRight, Sub_Bottom[i], aClr);
					TextRender_string24(SubLeft+6, Sub_Top[i]+6, clWhite, &SubItemList[SelectedMainIndex][Tidx].fName[5]);
				}
			}else{
				if(SubItemList[SelectedMainIndex][Tidx].Enable){
					if(IconList != nullptr)	IconList->Render(24,dIcon24_Allow1, SubIconLeft, Sub_Top[i]+6);
					RectFillRender(SubLeft, Sub_Top[i], SubRight, Sub_Bottom[i], clTeal);
					TextRender_string24(SubLeft+6, Sub_Top[i]+6, clNearBlack, &SubItemList[SelectedMainIndex][Tidx].fName[5]);
				}else{
					if(IconList != nullptr)	IconList->Render(24,dIcon24_NotAllow1, SubIconLeft, Sub_Top[i]+6);
					RectFillRender(SubLeft, Sub_Top[i], SubRight, Sub_Bottom[i], clTeal);
					TextRender_string24(SubLeft+6, Sub_Top[i]+6, clNearBlack, &SubItemList[SelectedMainIndex][Tidx].fName[5]);
				}
			}
			Lend = Lstart + Tidx;
			Tidx++;
		}else{
			break;
		}
	}
	/*if(Lstart >0){
		if(SelectedMainIndex > 0){
			//get prv MainIndex
			Mid = SelectedMainIndex - 1;
			Sid = SubMenuItem_Count[Mid] -1;
			for(i=Lstart-1; i>-1; i--){
				if(Sid>0){
					RectFillRender(SubLeft + 40, Sub_Top[i], SubRight, Sub_Bottom[i], clGray);
					TextRender_string24(SubLeft + 46, Sub_Top[i]+6, clNearBlack, &SubItemList[Mid][Sid].fName[5]);
					Sid--;
				}
			}
		}
	}
	if(Lend < SubShowCount){
		if(SelectedMainIndex < (MainItemCount - 1)){
			//get Next MainIndex
			Mid = SelectedMainIndex + 1;
			Sid = 0;
			for(i=Lend+1; i<SubShowCount; i++){
				if(Sid < (SubMenuItem_Count[Mid])){
					RectFillRender(SubLeft + 40, Sub_Top[i], SubRight, Sub_Bottom[i], clGray);
					TextRender_string24(SubLeft +46, Sub_Top[i]+6, clNearBlack, &SubItemList[Mid][Sid].fName[5]);
					Sid++;
				}
			}
		}		
	}*/
}

void TMenu::Check4ReDraw(void)
{
	if(NeedFullRedraw){
		SelfDraw();
		MainDraw();
		SubDraw();	
		NeedFullRedraw = 0;
	}else
	if(NeedRedraw){
		MainDraw();
		SubDraw();	
		NeedRedraw = 0;
	}
}

void TMenu::FullRedraw(void)
{
	SelfDraw();
	MainDraw();
	SubDraw();	
	NeedFullRedraw = 0;
	if(IsBlockPermission){
		PmsIntervene4Gui.ReDraw4GuiRecall();
	}
}

void TMenu::Show(void)
{
	SelfDraw();
	MainDraw();
	SubDraw();
	Active = 1;
	IsHasActive2 = 0;

	LoadPermission(SystemPermission);	
}

void TMenu::ReDraw(void)
{
	MainDraw();
	SubDraw();
	Active = 1;
}

void TMenu::LoadPermission(unsigned int aPms)
{
	unsigned int i,j, BitX;
	if(aPms > 3)return;
	Permisson = aPms;
	if( (aPms <1) || (aPms >3) ){
		Permisson = 1;
	}
	BitX = Permisson -1;
	if(1){
		for(j=0; j<MainItemCount; j++){
			for(i=0; i<SubMenuItem_Count[j]; i++){
				if(SubItemList[j][i].fName[BitX] == '1' ){
					SubItemList[j][i].Enable = 1;
				}else
				if(SubItemList[j][i].fName[BitX] == 'S'){
					//this is By set , read setting inf
				}else{
					SubItemList[j][i].Enable = 0;
				}
			}
		}
	}
}

void TMenu::LoginBlock(int aPms)
{
	if(aPms == 2){
		//aPanel->GuiLoginIIIShow();
		PmsIntervene4Gui.Show4Gui(200, 200, 400, 140, 2);
	}else
	if(aPms == 3){
		//aPanel->GuiLoginIIIShow();
		PmsIntervene4Gui.Show4Gui(200, 200, 400, 140, 3);
	}
}

void TMenu::GoAction()
{
	if(SelectedMainIndex == 0){
		ActList_0 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_0_Call(ActList_0)){
			ActiveLevel = 2;
			OnAction = 1;
			IsHasActive2 = 1;
		}						
	}else
	if(SelectedMainIndex == 1){
		ActList_1 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_1_Call(ActList_1)){
			ActiveLevel = 2;
			OnAction = 1;
			IsHasActive2 = 1;
		}
	}else
	if(SelectedMainIndex == 2){
		ActList_2 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_2_Call(ActList_2)){
			ActiveLevel = 2;
			OnAction = 1;
			IsHasActive2 = 1;
		}
	}else
	if(SelectedMainIndex == 3){
		ActList_3 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_3_Call(ActList_3)){
			ActiveLevel = 2;
			OnAction = 1;
			IsHasActive2 = 1;
		}
	}else
	if(SelectedMainIndex == 4){
		ActList_4 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_4_Call(ActList_4)){
			ActiveLevel = 2;
			OnAction = 1;
			IsHasActive2 = 1;
		}
	}else 
	if(SelectedMainIndex == 5){
		ActList_5 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_5_Call(ActList_5)){
			ActiveLevel = 2;
			OnAction = 1;
			IsHasActive2 = 1;
		}
	}else
	if(SelectedMainIndex == 6){
		ActList_6 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_6_Call(ActList_6)){
			ActiveLevel = 2;
			OnAction = 1;
			IsHasActive2 = 1;
		}
	}else
	if(SelectedMainIndex == 7){
		ActList_7 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_7_Call(ActList_7)){
			ActiveLevel = 2;
			OnAction = 1;
			IsHasActive2 = 1;
		}
	}else
	if(SelectedMainIndex == 8){
		ActList_8 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_8_Call(ActList_8)){
			ActiveLevel = 2;
			OnAction = 1;
			IsHasActive2 = 1;
		}
	}else
	if(SelectedMainIndex == 9){
		ActList_9 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_9_Call(ActList_9)){
			ActiveLevel = 2;
			OnAction = 1;
			IsHasActive2 = 1;
		}
	}/*else
	if(SelectedMainIndex == 10){
		ActList_10 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_10_Call(ActList_10)){
			ActiveLevel = 2;
		}
	}*/	
}

void TMenu::CheckPermission()
{
	int NeedPms;
	const char *p;
	char aPmsChar[4];
	unsigned int OffsetCnt;
	unsigned int aVal;
	
	aVal = SelectedSubIndex;
	OffsetCnt = aVal * SubItemTextLen;
	p = pPermissionText[SelectedMainIndex];
	p += OffsetCnt;
	aPmsChar[0] = static_cast<char>(*p++);
	aPmsChar[1] = static_cast<char>(*p++);
	aPmsChar[2] = static_cast<char>(*p++);
	aPmsChar[3] = static_cast<char>(*p++);

	if(aPmsChar[0] == '1'){
		NeedPms = 1;
	}else
	if(aPmsChar[1] == '1'){
		NeedPms = 2;
	}else
	if(aPmsChar[2] == '1'){
		NeedPms = 3;
	}else{
		NeedPms = 4;
	}

	if(SystemPermission < NeedPms){
		if(NeedPms == 2){
			IsBlockPermission = 1;
			PmsIntervene4Gui.Show4Gui(200, 200, 400, 140, 2);
			NeedingPermission = 2;
		}else
		if(NeedPms == 3){
			IsBlockPermission = 1;
			PmsIntervene4Gui.Show4Gui(200, 200, 400, 140, 3);
			NeedingPermission = 3;
		}
	}
}

void TMenu::CheckSystemPermissionII()
{
	unsigned int Len,i, Cok, Cing;
	Len = aPanel->Edit[0].Str.GetLength();
	if(Len <6)return;
	if(Len >12)return;
	Cok = 0;
	Cing = 1;
	if(Len == CtlCenter.PassWordII.Len){
		for(i=0; i<Len; i++){
			if(aPanel->Edit[0].Str.Text[i] != CtlCenter.PassWordII.Content[i]){
				Cing = 0;
			}
		}
		if(Cing){
			Cok = 1;
			if( (NeedingPermission >1) && (NeedingPermission < 4) ){
				SystemPermission = NeedingPermission;
			}else{
				SystemPermission = 2;
			}
			SystemPermissionTick = 0;
		}
	}
}

void TMenu::CheckSystemPermissionIII()
{
	unsigned int Len,i, Cok, Cing;
	Len = aPanel->Edit[0].Str.GetLength();
	
	if(Len == 16){
		Cok =0;
		for(i=0; i<16; i++){
			if(SavePassWord[i] == aPanel->Edit[0].Str.Text[i])Cok++;
		}
		if(Cok == 16){
			SystemPermission = 3;
			SystemPermissionTick = 0;
		}
		return;
	}
	
	if(Len <6)return;
	if(Len >12)return;
	Cok = 0;
	Cing = 1;
	if(Len == CtlCenter.PassWordIII.Len){
		for(i=0; i<Len; i++){
			if(aPanel->Edit[0].Str.Text[i] != CtlCenter.PassWordIII.Content[i]){
				Cing = 0;
			}
		}
		if(Cing){
			Cok = 1;
			if( (NeedingPermission >1) && (NeedingPermission < 4) ){
				SystemPermission = NeedingPermission;
			}else{
				SystemPermission = 3;
			}
			SystemPermissionTick = 0;
		}
	}
}


TGuiMsgReturn TMenu::KeyIn(unsigned char aKey)
{
	TGuiMsgReturn aMsg = guiMsgNone;
	TGuiMsgReturn PmsRtnMsg;
	unsigned char aNum, NewInx;
	if(IsBlockPermission){
		PmsRtnMsg = PmsIntervene4Gui.KeyIn(aKey);
		if(PmsRtnMsg == guiMsgOkAndReturn){
			//Enter And Run Go
			IsBlockPermission = 0;
			SystemPermissionTick = 0;
			MainMenu.LoadPermission(SystemPermission);
			GoAction();
		}else
		if(PmsRtnMsg == guiMsgReturn){
			//Not Enter Redraw
			IsBlockPermission = 0;
			NeedFullRedraw = 1;
		}
		Check4ReDraw();
		return guiMsgNone;
	}
	/*if(IsBlockPermission){
		if(VK_RETURN == aKey){
			IsBlockPermission =0;
			NeedFullRedraw = 1;
		}else{
			if(NeedingPermission == 2){
				aMsg = aPanel->GuiLoginII_KeyIn(aKey);
				aPanel->Edit[0].Show();
				if(aMsg == guiMsgOkAndReturn){
					CheckSystemPermissionII();
					CheckSystemPermissionIII();
					if(SystemPermission >= 2){
						SystemPermissionTick = 0;
						IsBlockPermission =0;
						MainMenu.LoadPermission(SystemPermission);
						GoAction();
					}else{
						aPanel->GuiLoginPasswdErrShow();
					}
				}	
			}else
			if(NeedingPermission == 3){
				aMsg = aPanel->GuiLoginIII_KeyIn(aKey);
				aPanel->Edit[0].Show();
				if(aMsg == guiMsgOkAndReturn){
					CheckSystemPermissionIII();
					if(SystemPermission >= 3){
						SystemPermissionTick = 0;
						IsBlockPermission =0;
						MainMenu.LoadPermission(SystemPermission);
						GoAction();
					}else{
						aPanel->GuiLoginPasswdErrShow();
					}
				}
			}
		}
		Check4ReDraw();
		return guiMsgNone;
	}*/
	
	if(ActiveLevel == 0){
		switch(aKey){
			case '1':
			case '2':
			case '3':
			case '4':
			case '5':
			case '6':
			case '7':
			case '8':
			case '9':
				if(aKey == '0'){
					aNum = aKey - '0' + 10;
				}else{
					aNum = aKey - '0';
				}
				NewInx = aNum -1;
				if(NewInx < MainItemCount){
					if(SelectedMainIndex == NewInx){
						SelectedSubIndex = 0;
						ActiveLevel = 1;
						IsHasActive2 = 0;
					}else{
						SelectedMainIndex = NewInx;
						if(SelectedMainIndex < 8){
							MainIndexOnTop = 0;
						}else{
							MainIndexOnTop = 1;
						}
					}
					SelectedSubIndex = 0;
					NeedRedraw = 1;
				}
				break;
		}
	}else
	if(ActiveLevel == 1){
		switch(aKey){
			case '0':
			case '1':
			case '2':
			case '3':
			case '4':
			case '5':
			case '6':
			case '7':
			case '8':
			case '9':
				if(aKey == '0'){
					aNum = aKey - '0' + 10;
				}else{
					aNum = aKey - '0';
				}
				NewInx = aNum -1;
				if(NewInx < SubMenuItem_Count[SelectedMainIndex]){
					if(SelectedSubIndex == NewInx){
						CheckPermission();
						if(IsBlockPermission == 0)
							GoAction();
					}else{
						SelectedSubIndex = NewInx;
						NeedRedraw = 1;
					}
				}
				break;
		}
	}

	if(ActiveLevel == 2){
		if(SelectedMainIndex == 0){
			ActList_0 = static_cast<unsigned char>(SelectedSubIndex);
			if(guiMsgReturn == ActList_0_ToDo(aKey)){
				ActiveLevel = 1;
				NeedFullRedraw = 1;
				OnAction = 0;
			}				
		}else
		if(SelectedMainIndex == 1){
			ActList_1 = static_cast<unsigned char>(SelectedSubIndex);
			if(guiMsgReturn == ActList_1_ToDo(aKey)){
				ActiveLevel = 1;
				NeedFullRedraw = 1;
				OnAction = 0;
			}
		}else
		if(SelectedMainIndex == 2){
			ActList_2 = static_cast<unsigned char>(SelectedSubIndex);
			if(guiMsgReturn == ActList_2_ToDo(aKey)){
				ActiveLevel = 1;
				NeedFullRedraw = 1;
				OnAction = 0;
			}
		}else
		if(SelectedMainIndex == 3){
			ActList_3 = static_cast<unsigned char>(SelectedSubIndex);
			if(guiMsgReturn == ActList_3_ToDo(aKey)){
				ActiveLevel = 1;
				NeedFullRedraw = 1;
				OnAction = 0;
			}
		}else
		if(SelectedMainIndex == 4){
			ActList_4 = static_cast<unsigned char>(SelectedSubIndex);
			if(guiMsgReturn == ActList_4_ToDo(aKey)){
				ActiveLevel = 1;
				NeedFullRedraw = 1;
				OnAction = 0;
			}
		}else 
		if(SelectedMainIndex == 5){
			ActList_5 = static_cast<unsigned char>(SelectedSubIndex);
			if(guiMsgReturn == ActList_5_ToDo(aKey)){
				ActiveLevel = 1;
				NeedFullRedraw = 1;
				OnAction = 0;
			}
		}else
		if(SelectedMainIndex == 6){
			ActList_6 = static_cast<unsigned char>(SelectedSubIndex);
			if(guiMsgReturn == ActList_6_ToDo(aKey)){
				ActiveLevel = 1;
				NeedFullRedraw = 1;
				OnAction = 0;
			}
		}else
		if(SelectedMainIndex == 7){
			ActList_7 = static_cast<unsigned char>(SelectedSubIndex);
			if(guiMsgReturn == ActList_7_ToDo(aKey)){
				ActiveLevel = 1;
				NeedFullRedraw = 1;
				OnAction = 0;
			}
		}else
		if(SelectedMainIndex == 8){
			ActList_8 = static_cast<unsigned char>(SelectedSubIndex);
			if(guiMsgReturn == ActList_8_ToDo(aKey)){
				ActiveLevel = 1;
				NeedFullRedraw = 1;
				OnAction = 0;
			}
		}else
		if(SelectedMainIndex == 9){
			ActList_9 = static_cast<unsigned char>(SelectedSubIndex);
			if(guiMsgReturn == ActList_9_ToDo(aKey)){
				ActiveLevel = 1;
				NeedFullRedraw = 1;
				OnAction = 0;
			}
		}/*else
		if(SelectedMainIndex == 10){
			ActList_10 = static_cast<unsigned char>(SelectedSubIndex);
			if(guiMsgReturn == ActList_10_ToDo(aKey)){
				ActiveLevel = 1;
				NeedFullRedraw = 1;
			}
		}*/	
		Check4ReDraw();
		return aMsg;
	}
		
	if(VK_LEFT == aKey){
		if(ActiveLevel == 1){
			ActiveLevel = 0;
			NeedRedraw = 1;
		}
	}else
	if(VK_RIGHT == aKey){
		if(ActiveLevel == 0){
			ActiveLevel = 1;
			NeedRedraw = 1;
		}		
	}else
	if(VK_UP == aKey){
		if(ActiveLevel == 0){
			if(SelectedMainIndex > 0){
				SelectedMainIndex--;
				SelectedSubIndex = 0;
				NeedRedraw = 1;
				if(SelectedMainIndex < MainIndexOnTop){
					MainIndexOnTop--;
				}					
			}
		}else
		if(ActiveLevel == 1){
			if(SelectedSubIndex > 0){
				SelectedSubIndex--;
				NeedRedraw = 1;
			}else{
				if(SelectedMainIndex > 0){
					SelectedMainIndex--;
					SelectedSubIndex = SubMenuItem_Count[SelectedMainIndex] - 1;
					NeedRedraw = 1;
					if(SelectedMainIndex < MainIndexOnTop){
						MainIndexOnTop--;
					}
				}
			}
		}
	}else
	if(VK_DOWN == aKey){
		if(ActiveLevel == 0){
			if(  SelectedMainIndex < (MainItemCount - 1)  ){
				SelectedMainIndex++;
				SelectedSubIndex = 0;
				NeedRedraw = 1;
				if(SelectedMainIndex > (MainIndexOnTop + MainShowCount - 1)){
					MainIndexOnTop++;
				}
			}
		}else
		if(ActiveLevel == 1){
			if(  SelectedSubIndex < (SubMenuItem_Count[SelectedMainIndex]-1)  ){
				SelectedSubIndex++;
				NeedRedraw = 1;
			}else{
				if(SelectedMainIndex < (MainItemCount - 1)){
					SelectedMainIndex++;
					SelectedSubIndex = 0;
					NeedRedraw = 1;
					if(SelectedMainIndex > (MainIndexOnTop + MainShowCount - 1)){
						MainIndexOnTop++;
					}
				}
			}
		}		
	}else
	if(VK_RETURN == aKey){
		if(ActiveLevel == 0){
			IsBlockPermission = 0;
			Active = 0;
			OnAction = 0;
			aMsg = guiMsgReturn;
		}else
		if(ActiveLevel == 1){
			IsBlockPermission = 0;
			ActiveLevel = 0;
			NeedRedraw = 1;
			OnAction = 0;
		}else
		if(ActiveLevel == 2){
			
		}else{
			NeedRedraw = 1;
		}
	}else
	if(VK_MENU == aKey){
		//NeedRedraw = 1;
	}else
	if(VK_EXECUTE == aKey){
		if(ActiveLevel == 0){
			ActiveLevel = 1;
			NeedRedraw = 1;
		}else
		if(ActiveLevel == 1){
			CheckPermission();
			if(IsBlockPermission == 0)
				GoAction();
		}
	}
	
	Check4ReDraw();
	
	return aMsg;
}

void TMenu::Hide()
{
	IsBlockPermission = 0;
	Active = 0;
	OnAction = 0;
	if(IsHasActive2){
		IsHasActive2 = 0;
		ExtReqExit();
	}
	ActiveLevel = 0;
}

void TMenu::FullRedrawFrm(int Prm)
{
	if(SelectedMainIndex == 0){
		ActList_0 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_0_RedrawCallBack(Prm)){

		}
	}else
	if(SelectedMainIndex == 1){
		ActList_1 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_1_RedrawCallBack(Prm)){

		}

	}else
	if(SelectedMainIndex == 2){
		ActList_2 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_2_RedrawCallBack(Prm)){

		}

	}else
	if(SelectedMainIndex == 3){
		ActList_3 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_3_RedrawCallBack(Prm)){

		}

	}else
	if(SelectedMainIndex == 4){
		ActList_4 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_4_RedrawCallBack(Prm)){

		}

	}else 
	if(SelectedMainIndex == 5){
		ActList_5 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_5_RedrawCallBack(Prm)){

		}

	}else
	if(SelectedMainIndex == 6){
		ActList_6 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_6_RedrawCallBack(Prm)){

		}

	}else
	if(SelectedMainIndex == 7){
		ActList_7 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_7_RedrawCallBack(Prm)){

		}

	}else
	if(SelectedMainIndex == 8){
		ActList_8 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_8_RedrawCallBack(Prm)){

		}
	}else
	if(SelectedMainIndex == 9){
		ActList_9 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_9_RedrawCallBack(Prm)){

		}
	}
}

void TMenu::ExtReqExit()
{
	if(SelectedMainIndex == 0){
		ActList_0 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_0_CallBack(ActList_0)){

		}
		
	}else
	if(SelectedMainIndex == 1){
		ActList_1 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_1_CallBack(ActList_1)){

		}

	}else
	if(SelectedMainIndex == 2){
		ActList_2 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_2_CallBack(ActList_2)){

		}

	}else
	if(SelectedMainIndex == 3){
		ActList_3 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_3_CallBack(ActList_3)){

		}

	}else
	if(SelectedMainIndex == 4){
		ActList_4 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_4_CallBack(ActList_4)){

		}

	}else 
	if(SelectedMainIndex == 5){
		ActList_5 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_5_CallBack(ActList_5)){

		}

	}else
	if(SelectedMainIndex == 6){
		ActList_6 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_6_CallBack(ActList_6)){

		}

	}else
	if(SelectedMainIndex == 7){
		ActList_7 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_7_CallBack(ActList_7)){

		}

	}else
	if(SelectedMainIndex == 8){
		ActList_8 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_8_CallBack(ActList_8)){

		}

	}else
	if(SelectedMainIndex == 9){
		ActList_9 = static_cast<unsigned char>(SelectedSubIndex);
		if(ActList_9_CallBack(ActList_9)){

		}

	}
}






