/******************************************************************************** * File Name: ListBox.c * Function Describe: ListBox 控件 * Relate Module: GUI.c * Writer: Shliangwen * Date: 2016-1-8 *******************************************************************************/ #include "ListBoxSMS.h" #include "gui.h" #include "ListBox.h" #include "board.h" #include "log.h" #include "uiEntry.h" #define BOX_UP MKEY_VALUE_UP #define BOX_DOWN MKEY_VALUE_DOWN #define BOX_EXIT MKEY_VALUE_ESC void SwitchNextPageSMS(struct SUT_LIST_BOX *p,char up_down); void ListBoxShowBarSMS(struct SUT_LIST_BOX *p,REV_ENUM rev); void ListBoxShowSMS(struct SUT_LIST_BOX *p); void ListBoxInitSMS(SUT_LIST_BOX *p,unsigned short totalnum,const char **iconlist,char unicode) { unsigned char i,ch; p->totalnum = totalnum; p->notehandle = 1; p->handle = 0; //unicode p->unicode=unicode; //icon i=0; p->icon=iconlist; while(iicon[i][0]; if(ch==0) break; i++; } p->iconnum=i; p->up_down_flag='d'; GetPagePreMessage(p,1,'d'); } void ListBoxItemNumShowSMS(unsigned short curIndex, unsigned short total) { char buf[11]; unsigned char len1,len2; static unsigned short len; //如果短信条数允许超过了127条就要修改变量宽度了 if(curIndex < 10) len1=1; else if(curIndex < 100) len1=2; else if(curIndex < 1000) len1=3; else len1=4; if(total < 10) len2=1; else if(total < 100) len2=2; else if(total < 1000) len2=3; else len2 = 4; snprintf(buf, sizeof(buf), "%d-%d", curIndex, total); if(len != (len1+len2)){ len = len1+len2; //GuiClearArea(GLCD_WIDTH-8*(4+4+2),STATUS_BAR_HEIGH,7*8,16); //44 guiFillRect(GLCD_WIDTH-8*(4+4+1),UI_STATUS_ITEM_Y,GLCD_WIDTH,UI_STATUS_ITEM_Y+12,guiGetForeColor()); } guiShowStr(GLCD_WIDTH-8*(len1+len2+2),UI_STATUS_ITEM_Y+1,buf,FONT_MODE_12X12, REVERSED_NO, guiGetBackColor(), guiGetForeColor()); } /******************************************************************************** ListBoxShowItem *******************************************************************************/ void ListBoxShowItemSMS(struct SUT_LIST_BOX *p,unsigned short handle) { unsigned short len; unsigned short x,y,hand; unsigned char buf[LIST_ITEM_TEXT_LEN_MAX+3]; char str[LIST_ITEM_TEXT_LEN_MAX+1]; char f; hand=handle % LIST_ROW; x=LIST_TOPX; y=LIST_TOPY+hand*16; //换页时清理干净 guiClearArea(x,y,LIST_BAR_LEN+16,16,guiGetBackColor()); memset(buf,0,sizeof(buf)); if(p->unicode){ buf[LIST_ITEM_TEXT_LEN_MAX+2]=0; }else{ //strncpy((char *)buf,p->item[handle],sizeof(buf)); strncpy((char *)buf,p->boxinfo[handle].item,sizeof(buf)); buf[LIST_ITEM_TEXT_LEN_MAX+2]=0; } //截取并适当补.. StrIntercept(str,(char *)buf,LIST_ITEM_TEXT_LEN_MAX); if(p->icon!=NULL){//有图标 //f= p->features[handle]; if(p->boxinfo[handle].features >= p->iconnum) { MSG_INFO(1,"LB1"); f=0; } else f= p->boxinfo[handle].features; //f=0; //#error "f expired!" guiShowBmp(x,y,p->icon[f]); guiShowStr(x+16,y,str,FONT_MODE_12X12, REVERSED_NO, COLOR_BLACK, guiGetBackColor()); }else{//无图标 guiShowStr(x,y,str,FONT_MODE_12X12, REVERSED_NO, COLOR_BLACK, guiGetBackColor()); } } /******************************************************************************** * Function:ListBoxShowBar * display a bar *******************************************************************************/ void ListBoxShowBarSMS(struct SUT_LIST_BOX *p,REV_ENUM rev) { unsigned char x,y,h,handle; char str[LIST_ITEM_TEXT_LEN_MAX+1]; x=LIST_TOPX; if(p->icon!=NULL){//有图标 x+=16; } handle=p->handle; y=LIST_TOPY+handle*16; if(REVERSED_YES==rev)guiFillRect(x,y,x+LIST_BAR_LEN,y+11,COLOR_STATUS_BAR);// else guiFillRect(x,y,x+LIST_BAR_LEN,y+11,guiGetBackColor()); //113 StrIntercept(str,p->boxinfo[p->handle].item,LIST_ITEM_TEXT_LEN_MAX); guiShowStr(x, y,str,FONT_MODE_12X12, rev, COLOR_STATUS_BAR, guiGetBackColor()); } /******************************************************************************** * Function:ListBoxShow * display ListBox *******************************************************************************/ void ListBoxShowSMS(struct SUT_LIST_BOX *p) { unsigned char i,j; unsigned short x,y; if(p->itemnum==0) return; for(i=0;i= p->itemnum) { y=LIST_TOPY+i*16; guiClearArea(LIST_TOPX,y,LIST_BAR_LEN+18,16,guiGetBackColor()); }else ListBoxShowItemSMS(p,i); } if(p->up_down_flag=='u') p->handle=p->itemnum-1; ListBoxShowBarSMS(p,REVERSED_YES); x=GLCD_WIDTH-17; if(p->totalnum > LIST_ROW) guiDrawArrow(x+8,LIST_TOPY,8,ARROW_UP,COLOR_STATUS_BAR);//向上箭头 else guiClearArea(x,LIST_TOPY,16,8,guiGetBackColor()); y=LIST_TOPY+LIST_ROW*16; if(p->totalnum > LIST_ROW) guiDrawArrow(x+8,y,8,ARROW_DOWN,COLOR_STATUS_BAR);//向下箭头 else guiClearArea(x,y-8,16,8,guiGetBackColor()); } /******************************************************************************** ListBoxResponse ListBox控件的键盘响应处理 底层 *******************************************************************************/ unsigned long ListBoxResponseSMS(SUT_LIST_BOX *p) { unsigned char temp; unsigned long keyValue=getKeyValue(); if(p->itemnum==0)return keyValue; switch(keyValue) { case BOX_UP: ListBoxShowBarSMS(p,REVERSED_NO);//清上一条 p->notehandle--; if(p->notehandle == 0) p->notehandle = p->totalnum; if(p->handle == 0) { if(p->totalnum > LIST_ROW) { GetPagePreMessage(p,0,'u'); p->pageChange=1; }else p->handle=p->itemnum-1; }else p->handle --; if(p->pageChange) p->pageChange=0; else ListBoxShowBarSMS(p,REVERSED_YES); ListBoxItemNumShowSMS(p->notehandle,p->totalnum); break; case BOX_DOWN: ListBoxShowBarSMS(p,REVERSED_NO);//清上一条 p->handle ++; p->notehandle++; if(p->notehandle > p->totalnum) p->notehandle=1; if(p->handle>=p-> itemnum) { if(p->totalnum > LIST_ROW) { GetPagePreMessage(p,0,'d'); p->pageChange=1;//page change }else p->handle=0; } if(p->pageChange) p->pageChange=0; else ListBoxShowBarSMS(p,REVERSED_YES); ListBoxItemNumShowSMS(p->notehandle,p->totalnum); break; case BOX_EXIT: return keyValue; break; default: return keyValue; break; } return 0; }