📄 readbox.c
字号:
/*===========================================================================
阅读超长文本代码
包明辉 ReadBox
FILE: ReadBox.c
===========================================================================*/
#include "ReadBox.h"
//#pragma comment (lib, "jtfont.lib")
//////////////////////////////////////////////////////////////////////////
//构造
CReadBox* CReadBox_New(IFileMgr* pFileMgr , AEEApplet* pThis , AEERect* pRect , void* pvUser , uint16 ncxScreen , uint16 ncyScreen , uint16 ncyPageLn)
{
CReadBox* pRet = NULL;
if(NULL == pFileMgr || NULL == pThis || NULL == pRect || NULL == pvUser)
return NULL;
pRet = MALLOC(sizeof(CReadBox));
if(NULL == pRet)
return pRet;
MEMSET(pRet , 0 , sizeof(CReadBox));
pRet->m_eState = READBOX_STATE_NONE;
pRet->m_pThis = pThis;
pRet->m_pAPPRect = pRect;
pRet->m_ncxScreen = ncxScreen;
pRet->m_ncyScreen = ncyScreen;
pRet->m_ncyPageLn = ncyPageLn;
pRet->m_pvUser = pvUser;
pRet->m_pFileMgr = pFileMgr;
//调色表初始化
//pRet->m_colorList[0] = MAKE_RGB(0 , 0 , 255);
//pRet->m_colorList[1] = MAKE_RGB(0 , 255 , 255);
//pRet->m_colorList[2] = MAKE_RGB(51 , 255 , 0);
//pRet->m_colorList[3] = MAKE_RGB(150 , 0 , 0);
//pRet->m_colorList[4] = MAKE_RGB(255 , 255 , 0);
//pRet->m_colorList[5] = MAKE_RGB(255 , 0 , 0);
pRet->m_colorList[6] = MAKE_RGB(0 , 0 , 0);
pRet->m_colorList[7] = MAKE_RGB(255 , 255 , 255);
//pRet->m_colorList[8] = MAKE_RGB(128 , 128 , 128);
//pRet->m_colorList[9] = MAKE_RGB(204 , 0 , 255);
CReadBox_ClsReadFile(pRet);
return pRet;
}
//////////////////////////////////////////////////////////////////////////
//释放
void CReadBox_Release(CReadBox** ppReadBox)
{
if(ppReadBox && *ppReadBox)
{
FILEMAP_FREE((*ppReadBox)->m_pFileMap);
FREEIF((*ppReadBox)->m_pnListTable);
FREEIF(*ppReadBox);
*ppReadBox = NULL;
}
}
//////////////////////////////////////////////////////////////////////////
//属性及重要信息设置
//设置回调
void CReadBox_SetNotify(CReadBox* pReadBox , PFNNOTYRead pRecall)
{
if(NULL != pReadBox)
pReadBox->m_pRecall = pRecall;
}
//判断是否被激活
boolean CReadBox_IsActive(CReadBox* pReadBox)
{
if(NULL == pReadBox)
return FALSE;
return pReadBox->m_bIsActive;
}
void CReadBox_SetActive(CReadBox* pReadBox , boolean nActive)
{
if(NULL == pReadBox)
return;
pReadBox->m_bIsActive = nActive;
}
void CReadBox_SetAutoRead(CReadBox* pReadBox , boolean bIsStop)
{
if(NULL == pReadBox)
return;
pReadBox->m_bStopRead = bIsStop;
}
AECHAR* CReadBox_GetNowPtr(CReadBox* pReadBox , uint16* nCount)
{
uint16 nLenRd = 0;
if(NULL == pReadBox)
return NULL;
if((pReadBox->m_nIndex + 1) < pReadBox->m_nLtMx)
nLenRd = pReadBox->m_pnListTable[pReadBox->m_nIndex + 1] - pReadBox->m_pnListTable[pReadBox->m_nIndex];
else
nLenRd = 10;//
*(nCount) = (uint16)nLenRd - 2;
return (AECHAR*)pReadBox->m_pAENowTmp;
}
uint16 CReadBox_GetNowLab(CReadBox* pReadBox)
{
if(NULL == pReadBox)
return 0;
if(NULL == pReadBox->m_pnListTable)
return 0;
return pReadBox->m_pnListTable[pReadBox->m_nIndex];
}
//////////////////////////////////////////////////////////////////////////
//消息句柄
boolean CReadBox_HandleEvent(CReadBox* pReadBox , AEEEvent eCode , uint16 wParam , uint32 dwParam)
{
if(FALSE == pReadBox->m_bIsActive)
return FALSE;
switch(pReadBox->m_eState)
{
case READBOX_STATE_NONE:
return FALSE;
case READBOX_STATE_CRIN://建立索引。CLR停止建立索引
{
if(EVT_KEY == eCode && AVK_CLR == wParam)
{
CReadBox_ClsReadFile(pReadBox);
CReadBox_SetActive(pReadBox,FALSE);
FUN_COMMANDRUN(READRC_CREAT_IDXB , 0 , 0);
}
}
return TRUE;
case READBOX_STATE_STOK:
{
switch(eCode)
{
case EVT_MY: //这个事件是为了满足接收EVT_KEY消息,因为此类消息不能post
case EVT_KEY: //
switch(wParam)
{
case AVK_UP:
{
uint32 nGoTo = (pReadBox->m_nIndex > 1) ? (pReadBox->m_nIndex - 1) : 0;
CReadBox_GoToLine(pReadBox , nGoTo);
}
return TRUE;
case AVK_DOWN:
CReadBox_GoToLine(pReadBox , pReadBox->m_nIndex + 1);
return TRUE;
case AVK_LEFT:
{
uint32 nGoTo = (pReadBox->m_nIndex > pReadBox->m_nMaxPagLine) ? (pReadBox->m_nIndex - pReadBox->m_nMaxPagLine) : 0;
CReadBox_GoToLine(pReadBox , nGoTo);
}
return TRUE;
case AVK_RIGHT:
CReadBox_GoToLine(pReadBox , pReadBox->m_nIndex + pReadBox->m_nMaxPagLine);
return TRUE;
}
break;
}
break;
}
}
return FALSE;
}
//////////////////////////////////////////////////////////////////////////
//清楚阅读文件
void CReadBox_ClsReadFile(CReadBox* pReadBox)
{
MEMSET(pReadBox->m_szFineName , 0 , AEE_MAX_FILE_NAME);
FILEMAP_FREE(pReadBox->m_pFileMap); //关闭了文件
FREEIF(pReadBox->m_pnListTable); //释放索引表
pReadBox->m_nLtMx = 0;
pReadBox->m_nLtTa = 0;
pReadBox->m_nIndex = 0; //当前行数 //不需要分块索引
pReadBox->m_nLtTa = 0; //一共的行数
pReadBox->m_bStopRead = FALSE; //暂停自动阅读状态
//全局变量初始化
pReadBox->bFileEnd = FALSE; //当前是否为文件的结束
pReadBox->nTotalChar = 0; //初始化临时全局变量
pReadBox->m_eState = READBOX_STATE_NONE;
}
//////////////////////////////////////////////////////////////////////////
//设置阅读文件
boolean CReadBox_SetReadFile(CReadBox* pReadBox , const char* pFileName , uint16 nLabel , boolean* pBsame)//此函数如果返回TRUE会产生一个回调
{
uint32 nFilesize = 0;
uint32 nLinIxBuf = 0;
//参数检测
if(NULL == pFileName)
return FALSE;
if(NULL == pReadBox->m_pRecall)
return FALSE;
if(NULL != pBsame)
*pBsame = FALSE;
//参数检测
//判断是否为当前打开过文件
if(0 == STRCMP(pReadBox->m_szFineName , pFileName))
{
if(NULL != pBsame)
*pBsame = TRUE;
return CReadBox_GoToLabel(pReadBox , nLabel);
}
//判断是否为当前打开过文件
CReadBox_ClsReadFile(pReadBox);
STRCAT(pReadBox->m_szFineName , pFileName);
pReadBox->m_pFileMap = CFileMap_New(pReadBox->m_pFileMgr , pFileName , MapNotify , pReadBox , pReadBox->m_pThis);
if(NULL == pReadBox->m_pFileMap)
{
CReadBox_ClsReadFile(pReadBox);
return FALSE;
}
//////////////////////////////////////////////////////////////////////////
//计算索引表最大空间并分配空间
nFilesize = CFileMap_GetFileSize(pReadBox->m_pFileMap);
nLinIxBuf = (uint32)((nFilesize * READBOX_INDEXTABLE) / 100);
pReadBox->m_pnListTable = MALLOC(nLinIxBuf);
pReadBox->m_nLtMx = nLinIxBuf / sizeof(uint16);
if(pReadBox->m_nLtMx) pReadBox->m_nLtMx--;
if(NULL == pReadBox->m_pnListTable/* || pReadBox->m_nLtMx == 0*/)
{
CReadBox_ClsReadFile(pReadBox);
return FALSE;
}
MEMSET(pReadBox->m_pnListTable , 0 , nLinIxBuf);
pReadBox->nNowLabel = nLabel;
FUN_COMMANDRUN(READRC_STATE_OPEN , 0 , 0);
pReadBox->m_eState = READBOX_STATE_CRIN;
return TRUE;
}
//////////////////////////////////////////////////////////////////////////
//属性设置
boolean CReadBox_SetTextFB(CReadBox* pReadBox , uint16 nBe)
{
pReadBox->nFontH = 12;//保证不除0
pReadBox->m_nMaxScrLine = (pReadBox->m_ncyScreen / (pReadBox->nFontH + nBe)) + 1;
pReadBox->m_nMaxPagLine = (pReadBox->m_ncyPageLn / (pReadBox->nFontH + nBe)) + 1;
pReadBox->m_nBeLine = nBe;
return TRUE;
}
//////////////////////////////////////////////////////////////////////////
//根据标签获得行索引
boolean CReadBox_GoToLine(CReadBox* pReadBox , uint32 nLine)
{
uint32 nAECharIndex;
if(READBOX_STATE_STOK != pReadBox->m_eState)
return FALSE;
if(NULL == pReadBox->m_pnListTable || NULL == pReadBox->m_pFileMap)
return FALSE;
if(nLine >= pReadBox->m_nLtTa)
nLine = pReadBox->m_nLtTa - 1;
pReadBox->m_nPicY = 0; //初始化滚动屏幕
pReadBox->m_nIndex = nLine;
nAECharIndex = (uint32)pReadBox->m_pnListTable[pReadBox->m_nIndex];
return CFileMap_GetData(pReadBox->m_pFileMap , nAECharIndex * sizeof(AECHAR) , 0 , &pReadBox->bFileEnd);
}
uint16 CReadBox_GetLabel(CReadBox* pReadBox)
{
if(NULL == pReadBox->m_pnListTable)
return 0;
return pReadBox->m_pnListTable[pReadBox->m_nIndex];
}
boolean CReadBox_GoToLabel(CReadBox* pReadBox , uint16 nLabel)
{
uint32 nRet;
nRet = BinSearch(pReadBox->m_pnListTable , nLabel , pReadBox->m_nLtTa);
if(REABBOX_BINSEARCH_ERR == nRet)
return FALSE;
return CReadBox_GoToLine(pReadBox , nRet);
}
//////////////////////////////////////////////////////////////////////////
//刷新函数
void CReadBox_ReDraw(CReadBox* pReadBox)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -