📄 listwnd.c
字号:
//////////////////////////////////////////////////////////////////////////
//listwnd.c
//////////////////////////////////////////////////////////////////////////
#include "ListWnd.h"
static void ListWndUpdate(ListWnd* pthis);
static boolean ListWnd_HandleCommandEvent(ListWnd* pthis,uint16 wParam,uint32 dwParam);
static boolean ListWnd_HandleKeyEvent(ListWnd* pthis,uint16 wParam);
static boolean ListWnd_HandlePenEvent(ListWnd* pthis,AEEEvent eCode,uint32 dwParam);
/************************************************************************
初始化文件浏览界面数据,只能被调用一次。
@pthis文件浏览界面内部数据结构。
@pMe程序的核心数据。
@返回初始化是否成功。
************************************************************************/
boolean ListWndNew(ListWnd* pthis,MFileMgr* pMe)
{
pthis->pMe=pMe;
pthis->list=NULL;
pthis->curDir=(char*)MALLOC(sizeof(char)*MAX_FILE_NAME);
if (pthis->curDir == NULL) {
return FALSE;
}
if (SUCCESS != ISHELL_CreateInstance(pthis->pMe->a.m_pIShell,AEECLSID_FILEMGR,
(void**)&pthis->pMgr))
{
FREEIF(pthis->curDir);
return FALSE;
}
STRCPY(pthis->curDir,ROOT_NAME);
return TRUE;
}
/************************************************************************
创建文件浏览界面。
@pthis文件浏览界面内部数据。
@返回界面创建失败或成功。
************************************************************************/
boolean ListWndOpen(ListWnd* pthis)
{
IFileMgr *pMgr=NULL;
FileInfo fi;
CtlAddItem addItem;
char resImage[AEE_MAX_FILE_NAME]={0};
AEECHAR dtext[AEE_MAX_FILE_NAME]={0};
uint16 i=0;
AEERect rect;
IBitmap *srcbmp=NULL;
IBitmap *dstbmp=NULL;
uint16 fh=0; //font height
uint16 fw=0; //font width
STRCPY(resImage,RES_FILE);
if (SUCCESS != ISHELL_CreateInstance(pthis->pMe->a.m_pIShell,AEECLSID_MENUCTL,
(void**)&pthis->list))
{
return FALSE;
}
srcbmp=ISHELL_LoadBitmap(pthis->pMe->a.m_pIShell,TITLE_BAR_BMP);
IDISPLAY_GetDeviceBitmap(pthis->pMe->a.m_pIDisplay,&dstbmp)
//draw titlebar
if ((srcbmp!=NULL) && (dstbmp!=NULL)) {
IBITMAP_Bltln(dstbmp,0,0,pthis->pMe->xScreen,16,srcbmp,0,0,AEE_RO_TRANSPARENT);
}
if ((fh=IDisplay_GetFontMetrics(pthis->pMe->a.m_pIDisplay,
AEE_FONT_NORMAL,NULL,NULL)) == EFAILED) {
fh=15; //set default font height.
}
//set menu rect
rect.x=0;
rect.y=16;
rect.dx=pthis->pMe->xScreen;
rect.dy=pthis->pMe->yScreen-16-fh-1;
IMENUCTL_SetRect(pthis->list,&rect);
IFILEMGR_EnumInit(pthis->pMgr,pthis->curDir,TRUE); //add folder item
while (IFILEMGR_EnumNext(pthis->pMe,&fi) == TRUE) {
STRTOWSTR(dtext,fi.szName,sizeof(dtext));
addItem.pszResImage=resImage;
addItem.wImage=IDI_BMP_FOLDER;
addItem.pText=dtext;
addItem.wItemID=IDM_BASE+i;
i++;
IMENUCTL_AddItemEx(pthis->list,&addItem);
}
IFILEMGR_EnumInit(pthis->pMgr,pthis->curDir,FALSE);
while (IFILEMGR_EnumNext(pthis->pMe,&fi) == TRUE) { // add file item
{
STRTOWSTR(dtext,fi.szName,sizeof(dtext));
addItem.pszResImage=resImage;
addItem.wImage=IDI_BMP_FILE;
addItem.pText=dtext;
addItem.wItemID=IDM_BASE+i;
i++;
IMENUCTL_AddItemEx(pthis->list,&addItem);
}
// draw softkey text
MEMSET(dtext,0,sizeof(dtext));
if (0 != ISHELL_LoadResString(pthis->pMe->a.m_pIShell,RES_FILE,
IDS_SOFTKEY_SELECT,dtext,sizeof(dtext))) {
IDISPLAY_DrawText(pthis->pMe->a.m_pIDisplay,AEE_FONT_NORMAL,dtext,-1,0,
rect.dy+1,0,0);
}
if (0 != ISHELL_LoadResString(pthis->pMe->a.m_pIShell,RES_FILE,
IDS_SOFTKEY_EXIT,dtext,sizeof(dtext))) {
if ((fw=IDISPLAY_MeasuaseText(pthis->pMe->a.m_pIDisplay,AEE_FONT_NORMAL,dtext))
== 0) {
fw=20; //set default widht 20;
}
IDISPLAY_DrawText(pthis->pMe->a.m_pIDisplay,AEE_FONT_NORMAL,
dtext,-1,pthis->pMe->xScreen-fw,rect.dy+1,0,0);
}
ListWndUpdate(pthis);
}
/************************************************************************
更新屏幕.
@pthis文件浏览界面数据结构。
************************************************************************/
void ListWndUpdate(ListWnd *pthis)
{
IMENUCTL_SetActive(pthis->list);
IMENUCTL_Redraw(pthis->list);
}
/************************************************************************
文件浏览窗口事件处理。
@pthis文件浏览窗口内部数据结构。
@eCode事件的类型。
@wParam,dwParam事件附带的数据。
@返回是否对事件进行了处理。
************************************************************************/
boolean ListWnd_HandleEvent(ListWnd *pthis,AEEEvent eCode,uint16 wParam,uint32 dwParam)
{
switch(eCode) {
case EVT_COMMAND:
return ListWnd_HandleCommandEvent(pthis,wParam,dwParam);
case EVT_KEY:
if ((wParam==EVK_SOFT1) || (wParam==EVK_SOFT2) || (wParam==EVK_LEFT) ||
(wParam==EVK_RIGHT))
{
return ListWnd_HandleKeyEvent(pthis,wParam);
}
else
{
return IMENUCTL_HandleEvent(pthis->list,eCode,wParam,dwParam);
}
case EVT_PEN_DOWN:
case EVT_PEN_UP:
case EVT_PEN_MOVE:
return ListWnd_HandlePenEvent(pthis,dwParam);
case EVT_APP_SUSPEND:
return TRUE;
case EVT_APP_RESUME:
ListWnd_Update(pthis);
return TRUE;
default:
return IMENUCTL_HandleEvent(pthis->list,eCode,wParam,dwParam);
}
return FALSE;
}
/************************************************************************
处理命令事件。
@phtis文件浏览窗口内部数据结构。
@wParam命令id。
@dwParam命令附带的数据。
@返回是否对命名进行了处理。
************************************************************************/
static boolean ListWnd_HandleCommandEvent(ListWnd* pthis,uint16 wPram,uint32 dwParam)
{
uint16 sel=0;
CtlAddItem item;
char p[AEE_MAX_FILE_NAME]={0};
IMENUCTL_GetItem(pthis->list,wPram,&item);
WSTRTOSTR(p,item.pText,sizeof(p));
// if which you selected is folder then go into it
// else do nothing.
if (item.wImage == IDI_BMP_FOLDER) {
STRCAT(pthis->curDir,p);
STRCAT(pthis->curDir,"/");
ListWndOpen(pthis);
}
return TRUE;
}
/************************************************************************
处理用户按键事件。
@pthis文件浏览界面内部数据结构。
@wParam按键的代码。
************************************************************************/
static boolean ListWnd_HandleKeyEvent(ListWnd* pthis,uint16 wParam)
{
uint16 sel=0;
uint16 len=0;
CtlAddItem item;
char *p[AEE_MAX_FILE_NAME]={0};
switch(wParam) {
case EVK_SOFT1:
//open menu.
break;
case EVK_SOFT2:
ISHELL_CloseApplet(pthis->pMe->a.m_pIShell,FALSE);
return TRUE;
case EVK_LEFT:
len=STRLEN(pthis->curDir);
if (len <= ROOT_NAME_LENGTH) { //at the root folder.
return TRUE;
}
else
{
*(pthis->curDir+len)='\0'; // dunke the '/'
*((char*)BASENAME(pthis->curDir))='\0';
ListWndOpen(pthis);
}
return TRUE;
case EVK_RIGHT:
if ((sel=IMENUCTL_GetSel(pthis->list)) != 0) {
IMENUCTL_GetItem(pthis->list,sel,&item);
if (item.wImage == IDI_BMP_FOLDER)
{
WSTRTOSTR(p,item.pText,sizeof(p));
STRCAT(pthis->curDir,p);
STRCAT(pthis->curDir,"/");
ListWndOpen(pthis);
}
}
return TRUE;
default:
return FALSE;
}
return FALSE;
}
/************************************************************************
处理触摸笔事件.
@pthis文件浏览器内部数据。
@dwPram低16位是y坐标,高16位是x坐标。
@返回是否对消息进行了处理。
************************************************************************/
static boolean ListWnd_HandlePenEvent(ListWnd* pthis,AEEEvent eCode,uint32 dwParam)
{
uint32 x=0;
uint32 y=0;
AEERect rect;
x=dwParam>>16;
y=dwParam&(0x0000ffff);
IMENUCTL_GetRect(pthis->list,&rect);
switch(eCode) {
case EVT_PEN_DOWN:
if ((x <= rect.dx/2) && (y>= rect.dy)) {
ListWnd_HandleKeyEvent(pthis,EVK_SOFT1);
}
if ((x >= rect.dx/2) && (y>= rect.dy)) {
ListWnd_HandleKeyEvent(pthis,EVK_SOFT2);
}
break;
case EVT_PEN_UP:
break;
case EVT_PEN_MOVE:
break;
default:
}
return TRUE;
}
/************************************************************************
释放ListWnd_Open函数分配的内存。关闭文件浏览窗口。
@pthis文件浏览界面内部数据结构。
************************************************************************/
void ListWnd_Close(ListWnd* pthis)
{
IMENUCTL_Release(pthis->list);
pthis->list=NULL;
}
/************************************************************************
释放ListWnd_New函数分配的内存.
@pthis文件浏览界面内部数据。
************************************************************************/
void ListWnd_Release(ListWnd* pthis)
{
FREEIF(pthis->curDir);
IFILEMGR_Release(pthis->pMgr);
pthis->pMgr=NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -