⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 topmenu.c

📁 linux 下类似于TC功能的编译器,但还没有完成,希望大家共同研究
💻 C
字号:
#include "topmenu.h"int TopMenu::InitTopMenu(int Y,int X,int Height,int Width,int Color,int Shadow,int FontStyle,int WinType,char *Title){	int i;	int maxwidth;	if(InitBaseWindow(Y,X,Height,Width,Color,Shadow,FontStyle,WinType,Title)==FALSE)		return FALSE;	keypad(basewin,TRUE);	wborder(basewin,' ',' ',' ',' ',' ',' ',' ',' ');	itemcount=ARRAY_SIZE(TopMenuList);	items = (ITEM **)calloc(itemcount, sizeof(ITEM *));	itemwidth=0;	for(i = 0; i < itemcount; ++i)	{		items[i] = new_item(TopMenuList[i],NULL);		item_opts_on(items[i], O_SELECTABLE);		maxwidth = strlen(TopMenuList[i]);		itemwidth = (itemwidth>maxwidth)?(itemwidth):(maxwidth);	}	items[itemcount] = (ITEM *)NULL;	menu = new_menu((ITEM **)items);	set_menu_fore(menu, COLOR_PAIR(Color) | A_REVERSE);	set_menu_back(menu, COLOR_PAIR(Color));	set_menu_mark(menu, "");	set_menu_win(menu, basewin);	set_menu_sub(menu, derwin(basewin, 1,COLS,0,0));	set_menu_format(menu, 1, itemcount);	menu_opts_on(menu, O_SHOWDESC);	post_menu(menu);	wrefresh(basewin);	active=FALSE;	curitem=0;	cursubitem=0;	return TRUE;}int  TopMenu::Active(int item){	if(active!=TRUE)	{		active=TRUE;		ShowSubMenu((item>=0)?(item):(curitem));	}	return active;}int  TopMenu::Active(){	active=TRUE;	ShowSubMenu(curitem);	return active;}int  TopMenu::IsActive(){	return active;}int  TopMenu::LostActive(){	active=FALSE;	DestroySubMenu(curitem);		return active;}void TopMenu::DestroyTopMenu(){	int i;	DestroySubMenu(curitem);	if(items!=NULL)	{		for(i = 0; i < itemcount; ++i)		{			if(items[i]!=NULL)			{				free_item(items[i]);				items[i]=NULL;			}		}		items=NULL;	}	if(menu!=NULL)	{		unpost_menu(menu);		free_menu(menu);		menu=NULL;	}	DestroyBaseWindow();	}int  TopMenu::MenuDriver(int key){	int ret=0; 	switch(key)        {		case KEY_LEFT:						if (--curitem<0)			{				ret=menu_driver(menu, REQ_LAST_ITEM);				DestroySubMenu(curitem+1);				curitem=itemcount-1;				//ShowSubMenu(curitem);				}			else				{				ret = menu_driver(menu, REQ_LEFT_ITEM);				DestroySubMenu(curitem+1);				//ShowSubMenu(curitem);			}		        wrefresh(basewin);			ret=UPDATE_CODEAREA | ACTIVE_TOPMENU;			break;		case KEY_RIGHT:			if (++curitem>=itemcount)			{				ret=menu_driver(menu, REQ_FIRST_ITEM);				DestroySubMenu(curitem-1);				curitem=0;				//ShowSubMenu(curitem);			}			else				{				ret = menu_driver(menu, REQ_RIGHT_ITEM);				DestroySubMenu(curitem-1);				//ShowSubMenu(curitem);			}		        wrefresh(basewin);			ret=UPDATE_CODEAREA | ACTIVE_TOPMENU;			break;		case KEY_UP:			if(--cursubitem<0)			{				cursubitem=item_count(submenu)-1;				ret = menu_driver(submenu,REQ_LAST_ITEM);			}			else			{				ret = menu_driver(submenu, REQ_UP_ITEM);			}			wrefresh(subwin);			break;		case KEY_DOWN:			if(++cursubitem>=item_count(submenu))			{				cursubitem=0;				ret = menu_driver(submenu,REQ_FIRST_ITEM);			}			else			{				ret = menu_driver(submenu, REQ_DOWN_ITEM);			}			wrefresh(subwin);			break;		case KEY_F(2):			LostActive();			wrefresh(subwin);			ret = ACTIVE_CODEAREA;			break;		case 10://KEY_ENTER			ret = MenuSelected((curitem+1)*10+(cursubitem+1));			break;	}	return ret;}void TopMenu::ShowSubMenu(){	ShowSubMenu(curitem);}void TopMenu::ShowSubMenu(int item){	int beginy,beginx;	int width=0,maxwidth=0;	int i;	beginy = 1;	beginx = (item)*itemwidth + item+1;	subitemscount=SubMenuCount[item];	subitems = (ITEM **)calloc(subitemscount+1, sizeof(ITEM *));	for(i = 0; i < subitemscount; ++i)	{		subitems[i] = new_item(SubMenuList[item][i], NULL);		width=strlen(SubMenuList[item][i]);		maxwidth=(maxwidth>width)?(maxwidth):(width);	}   	subitems[subitemscount] = (ITEM *)NULL;	submenu = new_menu((ITEM **)subitems);	set_menu_fore(submenu, COLOR_PAIR(GetColor()) | A_REVERSE);	set_menu_back(submenu, COLOR_PAIR(GetColor()));	subwin = newwin(subitemscount+2,maxwidth+3,beginy,beginx);	SET_STYLE(subwin,GetColor());	keypad(subwin, TRUE);	set_menu_win(submenu, subwin);	set_menu_sub(submenu, derwin(subwin, subitemscount,maxwidth+1, 1, 1));	set_menu_mark(submenu, "*");	box(subwin, 0, 0);	post_menu(submenu);	cursubitem=0;	wrefresh(subwin);}void TopMenu::DestroySubMenu(int item){	int i;	if (submenu!=NULL)	{		unpost_menu(submenu);		free_menu(submenu);		submenu=NULL;	}	if(subitems!=NULL)		for(i = 0; i <=subitemscount; i++)		{			if(subitems[i]!=NULL)			{				free_item(subitems[i]);					subitems[i]=NULL;			}		}	if (subwin!=NULL)	{		CLOSE_STYLE(subwin,GetColor());		wborder(subwin,' ',' ',' ',' ',' ',' ',' ',' ');		wrefresh(subwin);		delwin(subwin);	}	subitemscount=0;	submenu=NULL;	subwin=NULL;	subitems=NULL;}int  TopMenu::MenuSelected(int menuID){	int ret=0;	switch(menuID)	{		case MENU_FILE_NEW:			msg.fileobj.type=DIALOG_FILENEW;			ret = UPDATE_CODEAREA| FILE_DIALOG|UPDATE_STATUS;			break;		case MENU_FILE_OPEN:			LostActive();			wrefresh(subwin);			msg.fileobj.type=DIALOG_FILEOPEN;			ret = UPDATE_CODEAREA| FILE_DIALOG|UPDATE_STATUS;			break;		case MENU_FILE_SAVE:			LostActive();			wrefresh(subwin);			msg.fileobj.type=DIALOG_FILESAVE;			ret = UPDATE_CODEAREA| FILE_DIALOG|UPDATE_STATUS;			break;		case MENU_FILE_SAVEAS:			LostActive();			wrefresh(subwin);			msg.fileobj.type=DIALOG_FILESAVEAS;			ret = UPDATE_CODEAREA| FILE_DIALOG|UPDATE_STATUS;			break;		case MENU_FILE_SHELL:			def_prog_mode();			endwin();			system("/bin/bash");			reset_prog_mode();			ret = REFRESH_ALLWINDOWS;			break;		case MENU_FILE_EXIT:			ret = EXIT_APPLICATION;			break;		case MENU_EDIT_CUT:			break;		case MENU_EDIT_COPY:			break;		case MENU_EDIT_PASTER:			break;		case MENU_EDIT_DEL://del selected block		{			LostActive();			wrefresh(subwin);			msg.blockop.type=BLOCKDEL;			ret= BLOCK_OPERATE | UPDATE_STATUS;			break;		}		case MENU_EDIT_FIND:			LostActive();			wrefresh(subwin);			msg.fileobj.type=DIALOG_EDITFIND;			ret = UPDATE_CODEAREA| EDIT_DIALOG | UPDATE_STATUS;			break;		case MENU_EDIT_SELECTALL:			LostActive();			wrefresh(subwin);			msg.fileobj.type=DIALOG_EDITSELECTALL;			ret = UPDATE_CODEAREA | EDIT_DIALOG | UPDATE_STATUS;			break;		case MENU_EDIT_REPLACE:			LostActive();			wrefresh(subwin);			msg.fileobj.type=DIALOG_EDITREPLACE;			ret = UPDATE_CODEAREA | EDIT_DIALOG | UPDATE_STATUS;			break;		case MENU_EDIT_SELECT:			LostActive();			wrefresh(subwin);			msg.fileobj.type=DIALOG_EDITSELECT;			ret = UPDATE_CODEAREA | EDIT_DIALOG | UPDATE_STATUS;			break;		case MENU_EDIT_UNSELECT:			break;		case MENU_CODE_INDENT:		{			msg.toolobj.type=TOOLS_INDENT;			ret = UPDATE_CODEAREA | CODE_TOOLS | UPDATE_STATUS | ACTIVE_CODEAREA;			break;		}		case MENU_CODE_AUTOMAKE:		{			msg.toolobj.type=TOOLS_AUTOMAKE;			ret = UPDATE_CODEAREA | CODE_TOOLS | UPDATE_STATUS | ACTIVE_CODEAREA;			break;		}		case MENU_CODE_AUTOCONF:			break;		case MENU_BUILD_BUILD:						break;		case MENU_BUILD_STRACE:			break;		case MENU_BUILD_DEBUG:			break;		case MENU_BUILD_STEPIN:			break;		case MENU_BUILD_STEPOUT:			break;		case MENU_BUILD_STEPOVER:			break;		case MENU_BUILD_WATCH:			break;		case MENU_BUILD_MEMORY:			break;		case MENU_SET_OPTION:			break;		case MENU_SET_CUSTOM:			break;		case MENU_SET_EDITOR:					break;		case MENU_SET_LANGUAGE:			break;		case MENU_SET_FORMAT:			break;		case MENU_SET_DIRECTORY:			break;		case MENU_SET_BACKGROUND:			break;		case MENU_HELP_ABOUT:			ret = SHOW_ABOUT_DIALOG;			break;		case MENU_HELP_HELP:			ret = SHOW_HELP_DIALOG;			break;		default:			ret = -1;	}	return ret;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -