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

📄 listwnd.c

📁 brew 文件浏览器实现,是纯c编写的
💻 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 + -