📄 tool1.c
字号:
#include "./apmenu.h"static int CXH; /*****TREELIST的显示次序*****//***** 新生成一个树形控件*****/TREE_CONTROL *init_treecontrol( win, y, x, h, w, fn_color, bk_color,sefn_color,sebk_color)WINDOW *win;int y;int x;int h;int w;int bk_color; int fn_color;int sebk_color;int sefn_color;{ TREE_CONTROL *tree = (TREE_CONTROL *)malloc(sizeof(TREE_CONTROL)); tree->win = win; tree->y = y; tree->x = x; tree->w = w; tree->h = h; tree->bk_color=bk_color; tree->fn_color=fn_color; tree->sebk_color=sebk_color; tree->sefn_color=sefn_color; tree->i = 0; tree->col = 1; tree->scr_col = 1; tree->num = 0; tree->startitem = (TREE_ITEM *)NULL ; tree->curitem = (TREE_ITEM *)NULL ; tree->list = (TREE_LIST *)NULL; tree->moveproc = NULL; return( tree );}/***** ADD ITEM TO 树形控件***/TREE_ITEM *tree_add_item( tree, curlink , text, link, levelflag )TREE_CONTROL *tree;TREE_ITEM *curlink;char *text;void *link;int levelflag; /*** levelflag=1:新层 ****/{ int len; TREE_ITEM *clink = NULL; TREE_ITEM *ln = NULL; if ( curlink == NULL && tree->startitem != NULL ) { printf( "Init the TREE have error: there are more than one NULL point appear ! \n" ) ; return; } clink = (TREE_ITEM *) malloc(sizeof(TREE_ITEM)); len = strlen(text)>TREE_TEXT_LEN?TREE_TEXT_LEN:strlen(text); strmove( clink->text , text, len); clink->link = link; clink->nextlink = (TREE_ITEM *)NULL; clink->nextlevellink = (TREE_ITEM *)NULL; tree->curitem = clink; if ( curlink == ( TREE_ITEM *) NULL ) { /**** 链 首 *****/ tree->startitem = clink; clink->level = 1; clink->openflag = 1; clink->prelevellink = (TREE_ITEM *)NULL; clink->prelink = NULL; } else { if ( levelflag == 1 ){ /*****下一层*****/ clink->level = curlink->level+1; if( curlink->nextlevellink != NULL ){ /*** 该层已包括子层 ******/ ln = curlink->nextlevellink ; while( ln->nextlink != NULL ) ln = ln->nextlink; ln->nextlink = clink; ln->nextlink->prelevellink = curlink; ln->nextlink->prelink = ln; } else { curlink->nextlevellink = clink; clink->prelevellink = curlink; clink->prelink = NULL; } clink->openflag = 1; } else { clink->level = curlink->level; curlink->nextlink = clink; clink->prelink = curlink; clink->prelevellink = curlink->prelevellink; if ( clink->level == 1 ) /**第一层打开标志**/ clink->openflag = 1; else clink->openflag = 1; } } tree->num ++; return( clink );}/***** 外部接口: 树形控件的运行***/do_tree( tree )TREE_CONTROL *tree;{ int ch, col, scr_col, flag = 0; int bz ; show_treecontrol ( tree, tree->col, tree->scr_col ); while(1) { col = tree->col ; scr_col = tree->scr_col; bz = 0; ch = f_getch(); if (ch== Key_end){ show_treecontrol(tree,col,0 ); flag = 1; } if ( tree->keydownproc!=NULL ) { if ((*tree->keydownproc)(tree,ch)==0) bz = 1 ; } if ( bz == 0 ){ switch (ch) { case Key_enter: if ( tree->enterproc!=NULL ) (*tree->enterproc)(tree); break; case Key_up: if ( scr_col == 1 ) { if ( col > 1 ) show_treecontrol(tree,col-1,scr_col ); } else show_treecontrol(tree,col,scr_col-1 ); if ( tree->moveproc!=NULL ) (*tree->moveproc)(tree); break; case Key_pageup: if( col > tree->h ) { col = col - tree->h ; show_treecontrol(tree,col,scr_col ); } else if (col > 1 ) { col = 1; show_treecontrol(tree,col,scr_col ); } else if ( col == 1 ) { scr_col = 1; show_treecontrol(tree,col,scr_col ); } if ( tree->moveproc!=NULL ) (*tree->moveproc)(tree); break; case Key_pagedown: if( col <= tree->n - tree->h ){ if( col> tree->n - 2* tree->h && col<= tree->n - tree->h) col = tree->n - tree->h + 1 ; else col = col + tree->h ; show_treecontrol(tree,col,scr_col ); } else show_treecontrol(tree,col, tree->h>tree->n?tree->n:tree->h ); if ( tree->moveproc!=NULL ) (*tree->moveproc)(tree); break; case Key_down: if ( scr_col == tree->h ) { if ( ( col+scr_col )<= tree->n ) show_treecontrol(tree,col+1,scr_col ); } else { if ( ( col+scr_col )<= tree->n ) show_treecontrol(tree,col,scr_col+1 ); } if ( tree->moveproc!=NULL ) (*tree->moveproc)(tree); break; case Key_left: unexpand_tree( tree ); if ( tree->moveproc!=NULL ) (*tree->moveproc)(tree); break; case Key_right: expand_tree( tree ); if ( tree->moveproc!=NULL ) (*tree->moveproc)(tree); break; case Key_end: show_treecontrol(tree,col,0 ); flag = 1; } } if ( flag == 1 ) break; }}/*** 在屏幕上显示树形控件***/show_tree( tree ) TREE_CONTROL *tree;{ show_treecontrol( tree, tree->col, 0 );}/*** 在屏幕上显示树形控件**** nscroll: 从第几行开始显示 ** nselect: 选中行*/show_treecontrol( tree, nscroll,nselect )TREE_CONTROL *tree;int nscroll; int nselect; { int i, j, k,l,len, level; char tail[256],s[512],text[TREE_TEXT_LEN+1]; TREE_LIST *list; TREE_ITEM *item; wsetcolor( tree->win, tree->fn_color, tree->bk_color ); list = tree->list; j = 0; /**** j 是可显示的第几条 ****/ l = 0; /**** l 是在屏幕上可显示的第几条 ****/ for ( i = 0; i < tree->num; i ++ ) { if ( list[i].visible == 1 ) { j ++; if ( j >=nscroll && ( l < tree->h ) ) { /********** 绘ITEM *************/ l ++; level = list[i].level; strcpy( text, list[i].item->text ); *tail = '\0'; item = list[i].item; for ( k = 1; k <= level-1 ; k++) { /***** 生成TEXT前的线条 *****/ if ( k < level -1 ) { if ( item == (TREE_ITEM *)NULL) f_strcat( tail, " " ); else { item=item->prelevellink; if(item->nextlink== (TREE_ITEM *)NULL) f_strcat(tail," " ); else f_strcat( tail,"│ "); } } else if ( k == level -1 ) { if ( tree->list[i].item->nextlink == (TREE_ITEM *) NULL ) strcat( tail, "└" ); else strcat( tail, "├" ); if (tree->list[i].item->nextlevellink == (TREE_ITEM *) NULL ) strcat( tail, "--" ); else strcat( tail, "*>" ); } } if ( (level-1)*4 > tree->w ) strmove( s, tail,tree->w ); else strcpy( s, tail ); mvwaddstr(tree->win,tree->y+l-1,tree->x, s ); len = strlen(text); if (( len + (level-1) *4 ) > tree->w ) if( tree->w >= (level-1)*4 ) strmove( s, tree->list[i].item->text, tree->w - (level-1)*4 ); else *s = '\0'; else strcpy( s,text ); if ( nselect == l ) { /***选中行*****/ wsetcolor( tree->win, tree->sefn_color, tree->sebk_color ); mvwaddstr(tree->win,tree->y+l-1, tree->x+(level-1)*4 , s ); wsetcolor( tree->win, tree->fn_color, tree->bk_color ); } else mvwaddstr(tree->win,tree->y+l-1, tree->x+(level-1)*4 , s ); *s = '\0'; for (k = (level-1)*2+len; k < tree->w;k++) strcat( s, " " ); mvwaddstr(tree->win,tree->y+l-1, tree->x+(level-1)*4+len , s ); } } /* if ( l >= tree->h ) break; */ } if ( l < tree->h ) { *s = '\0'; for ( k = 1; k<= tree->w ;k++ ) strcat( s, " " ); for( k = l+1 ; k<=tree->h ; k ++ ) mvwaddstr(tree->win,tree->y+k-1,tree->x, s );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -