asix_ed.c
来自「一个操作系统源代码 用于嵌入式设备 在Vc++环境下仿真 成功移植到多款处理器上」· C语言 代码 · 共 1,876 行 · 第 1/4 页
C
1,876 行
if( isChinese( wparam ) || isprint( wparam ) )
{
if( edctrl->style & ES_READONLY || ( edctrl->style & ES_NUMBER && !isdigit( wparam ) ) )
break;
newPos = InsertChar( edctrl->pbuf, edctrl->curCursorPos, wparam, &edctrl->strLen, edctrl->bufSize );
if( newPos == NULL )
break;
offset = ( *(edctrl->curCursorPos) & 0x80 ) ? CHINESE_CHAR_WIDTH : ENGLISH_CHAR_WIDTH;
edctrl->curCursorPos = newPos;
width = pmatrix->vector[edctrl->curColumn].x - pmatrix->vector[0].x;
if( width + offset > edctrl->width -4 )
{
pmatrix->len = edctrl->curColumn;
pmatrix->w = width;
MoveRight( edctrl, 1 );
edctrl->curColumn = pmatrix->len;
}
else
{
edctrl->curColumn++;
OrgnizeMatrix( edctrl, edctrl->curLine, 0 );
}
UpdateInputArea( edctrl, edctrl->curLine, 0 );
}
else
{
switch( wparam )
{
case ESCAPE: // ESC(sed)
if( edctrl->style & ES_READONLY )
break;
// 清除所有输入,刷新显示(sed)
edctrl->pbuf[0] = '\0';
edctrl->curCursorPos = edctrl->pbuf;
//edctrl->curLineHead = edctrl->pbuf;
edctrl->curColumn = 0;
pmatrix->lineHead = edctrl->pbuf;
edctrl->strLen = 0;
OrgnizeMatrix( edctrl, 0, 0 );
UpdateInputArea( edctrl, 0, 0 );
break;
case MOVE_LEFT: // 光标左移一个字符(sed)
curLineHead = pmatrix->lineHead;
if( edctrl->curColumn == 0 ) // 光标在行首(sed)
{
if( MoveLeft( edctrl, 1 ) == ASIX_OK )
{
edctrl->curCursorPos = pmatrix->lineHead;
UpdateInputArea( edctrl, edctrl->curLine, 0 );
}
}
else // 光标不在行首(sed)
{
// 光标左移一个字符(sed)
edctrl->curColumn--;
dispx = edctrl->pmatrix[0].vector[edctrl->curColumn].x;
if( *(edctrl->curCursorPos -1) & 0x80 )
{
edctrl->curCursorPos -= 2;
dispy = edctrl->y + ( edctrl->lineHeight - CHINESE_CHAR_HEIGHT )/2;
}
else
{
edctrl->curCursorPos -= 1;
dispy = edctrl->y + ( edctrl->lineHeight - ENGLISH_CHAR_HEIGHT )/2;
}
SetCursorPosition( hGC, dispx, dispy );
}
break;
case MOVE_RIGHT: // 光标右移一个字符(sed)
// 光标在字符串尾(sed)
if( *( edctrl->curCursorPos ) == '\0' )
break;
// 光标不在字符串尾,重新确定光标位置(sed)
cLen = ( *edctrl->curCursorPos & 0x80 ) ? 2 : 1;
edctrl->curCursorPos += cLen;
pmatrix = &edctrl->pmatrix[0];
if( edctrl->curColumn == pmatrix->len )
{
if( MoveRight( edctrl, 1 ) == ASIX_OK )
{
edctrl->curColumn = pmatrix->len;
UpdateInputArea( edctrl, edctrl->curLine, 0 );
}
}
else
{
// 光标右移(sed)
edctrl->curColumn++;
dispx = edctrl->pmatrix[0].vector[edctrl->curColumn].x;
if( *(edctrl->curCursorPos -1) & 0x80 )
dispy = edctrl->y + ( edctrl->lineHeight - CHINESE_CHAR_HEIGHT )/2;
else
dispy = edctrl->y + ( edctrl->lineHeight - ENGLISH_CHAR_HEIGHT )/2;
SetCursorPosition( hGC, dispx, dispy );
}
break;
case BACKSPACE: // BackSpace
if( edctrl->style & ES_READONLY )
break;
// 光标在字符串首(sed)
if( edctrl->curCursorPos == edctrl->pbuf )
break;
// 删除前一个字符(sed)
pmatrix = &edctrl->pmatrix[0];
cLen = (*(edctrl->curCursorPos -1)& 0x80 )? 2 : 1;
strcpy( edctrl->curCursorPos - cLen, edctrl->curCursorPos );
edctrl->curCursorPos -= cLen;
edctrl->strLen -= cLen;
if( edctrl->curColumn != 0 )
{
curLineHead = pmatrix->lineHead;
width = pmatrix->w - ( cLen == 2 ? CHINESE_CHAR_WIDTH : ENGLISH_CHAR_WIDTH );
}
else
{
curLineHead = edctrl->curCursorPos;
width = 0;
}
while( curLineHead != edctrl->pbuf && width <= edctrl->width -4 )
{
cLen = ( *(curLineHead-1) & 0x80 ) ? 2 : 1;
curLineHead -= cLen;
width += ( cLen == 2 ? CHINESE_CHAR_WIDTH : ENGLISH_CHAR_WIDTH );
}
if( width > edctrl->width -4 )
curLineHead += cLen;
pmatrix->lineHead = curLineHead;
FillVector( edctrl, curLineHead, 0, &offset );
i = 0;
while( pmatrix->lineHead + pmatrix->vector[i].index != edctrl->curCursorPos )
i++;
edctrl->curColumn = i;
UpdateInputArea( edctrl, 0, 0 );
break;
case DELETE: // Delete(sed)
if( edctrl->style & ES_READONLY )
break;
if( *edctrl->curCursorPos == '\0' ) // cursor at the end of string
break;
pmatrix = &edctrl->pmatrix[0];
curLineHead = pmatrix->lineHead;
cLen = (*edctrl->curCursorPos & 0x80 )? 2 : 1;
strcpy( edctrl->curCursorPos, edctrl->curCursorPos + cLen );
edctrl->strLen -= cLen;
FillVector( edctrl, curLineHead, 0, &offset );
width = pmatrix->w;
while( curLineHead != edctrl->pbuf && width <= edctrl->width -4 )
{
cLen = ( *(curLineHead-1) & 0x80 ) ? 2 : 1;
curLineHead -= cLen;
width += ( cLen == 2 ? CHINESE_CHAR_WIDTH : ENGLISH_CHAR_WIDTH );
}
if( curLineHead != edctrl->pbuf )
curLineHead += cLen;
pmatrix->lineHead = curLineHead;
FillVector( edctrl, curLineHead, 0, &offset );
i = 0;
while( pmatrix->lineHead + pmatrix->vector[i].index != edctrl->curCursorPos )
i++;
edctrl->curColumn = i;
UpdateInputArea( edctrl, 0, 0 );
break;
default:
break;
}
}
break;
case WM_HSCROLL: // 水平滚动(sed)
pmatrix = &edctrl->pmatrix[0];
curLineHead = pmatrix->lineHead;
switch( wparam )
{
case SB_LINELEFT: // 行左移若干字符(sed)
cLen = ( ( *(edctrl->curCursorPos -1) ) & 0x80 )? CHINESE_CHAR_WIDTH : ENGLISH_CHAR_WIDTH;
offset = ( cLen + pmatrix->w - edctrl->width +4 );
if( pmatrix->vector[1].x < pmatrix->vector[0].x + offset )
{
curLineHead += pmatrix->vector[2].index;
edctrl->curColumn-- ;
}
else
{
curLineHead += pmatrix->vector[1].index;
}
break;
case SB_LINERIGHT: // 行右移若干字符(sed)
while( curLineHead != edctrl->pbuf && pmatrix->w <= edctrl->width -4 )
{
cLen = ( *(curLineHead-1) & 0x80 ) ? 2 : 1;
curLineHead -= cLen;
edctrl->curColumn++;
pmatrix->len++;
pmatrix->w += ( cLen == 2 ? CHINESE_CHAR_WIDTH : ENGLISH_CHAR_WIDTH );
}
if( curLineHead != edctrl->pbuf )
{
curLineHead += cLen;
edctrl->curColumn--;
pmatrix->len--;
}
break;
default:
return ASIX_OK;
}
// 刷新显示(sed)
pmatrix->lineHead = curLineHead;
OrgnizeMatrix( edctrl, 0, 0 );
edctrl->curCursorPos = curLineHead + pmatrix->vector[edctrl->curColumn].index;
UpdateInputArea( edctrl, 0, 0 );
break;
case WM_GETFOCUS:
dispx = edctrl->pmatrix[0].vector[edctrl->pmatrix[0].len].x;
dispy = edctrl->pmatrix[0].y + ( edctrl->lineHeight - ENGLISH_CHAR_HEIGHT )/2;
CreateCursor( hGC, dispx, dispy, 1, ENGLISH_CHAR_HEIGHT, ASIX_CURSOR_ON, EDITOR_CURSOR_FREQUENCE, CURSOR_THREAD );
// asix_edprintf( "GetFocus" );
break;
case WM_LOOSEFOCUS:
FreeCursor( hGC );
// asix_edprintf( "LooseFocus" );
break;
case WM_PENDOWN:
if( GetFocus() != edctrl->windowid )
SetFocus( edctrl->windowid );
break;
case WM_PENXY:
break;
case WM_PENUP:
pmatrix = &edctrl->pmatrix[0];
curLineHead = pmatrix->lineHead;
LocateCursorPos( edctrl );
edctrl->curCursorPos = curLineHead + pmatrix->vector[edctrl->curColumn].index;
if( edctrl->curColumn == 0 )
p = edctrl->curCursorPos;
else
p = edctrl->curCursorPos -1;
charHeight = (*p) & 0x80 ? CHINESE_CHAR_HEIGHT : ENGLISH_CHAR_HEIGHT;
dispx = pmatrix->vector[edctrl->curColumn].x;
dispy = pmatrix->y + ( edctrl->lineHeight - charHeight )/2;
SetCursorPosition( hGC, dispx, dispy );
break;
default:
break;
}
return ASIX_OK;
}
STATUS MultiEdMsgProc( U16 asix_msg, struct ed_ctrl *edctrl, void *data, U16 wparam, void *reserved )
{
U32 hGC;
MSG ed_msg;
S8 *newPos, *curLineHead;
U16 offset, cLen;
U8 *p;
U16 dispx, dispy;
U16 i, k,endLine;
struct char_matrix *pmatrix;
// struct char_pos *vector;
U16 charHeight;
hGC = GetGC();
memset( &ed_msg, 0x0, sizeof(MSG) );
ed_msg.messageType = ASIX_MESSAGE;
//SWITCH_1:
switch( asix_msg )
{
case WM_CHAR:
if( isChinese( wparam ) || isprint( wparam ) )
{
if( edctrl->style & ES_READONLY || ( edctrl->style & ES_NUMBER && !isdigit( wparam ) ) )
break; // break switch_1 'asix_msg'
newPos = InsertChar( edctrl->pbuf, edctrl->curCursorPos, wparam, &edctrl->strLen, edctrl->bufSize );
if( newPos == NULL )
break; // break switch_1 'asix_msg'
if( isChinese( wparam ) )
offset = CHINESE_CHAR_WIDTH;
else
offset = ENGLISH_CHAR_WIDTH;
pmatrix = &edctrl->pmatrix[edctrl->curLine];
// if( edctrl->curColumn == pmatrix->len && pmatrix->w + offset >= edctrl->width -4 )
if( pmatrix->vector[edctrl->curColumn].x - pmatrix->x + offset >= edctrl->width -2 )
{
// 光标在行尾,不够显示
edctrl->curColumn = 1;
if( edctrl->curLine == edctrl->curPage + edctrl->pageLine -1 )
{
// 当前行是页尾,下移一行
edctrl->curCursorPos = newPos;
if( JumpDown( edctrl, 1 ) == ASIX_OK )
{
SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
pmatrix = &edctrl->pmatrix[edctrl->curLine];
if( pmatrix->len <= edctrl->curColumn )
edctrl->curColumn = pmatrix->len;
edctrl->curCursorPos = pmatrix->lineHead + pmatrix->vector[edctrl->curColumn].index;
UpdateInputArea( edctrl, edctrl->curPage, 0 );
}
return ASIX_OK;
}
edctrl->curCursorPos = newPos;
OrgnizeMatrix( edctrl, edctrl->curLine, 0 );
edctrl->curLine++;
UpdateInputArea( edctrl, (U16)(edctrl->curLine-1), 0 );
//AdjustCursorDisp( hGC );
}
else
{
if( pmatrix->lineHead == NULL )
pmatrix->lineHead = edctrl->curCursorPos;
edctrl->curCursorPos = newPos;
edctrl->curColumn += 1;
OrgnizeMatrix( edctrl, edctrl->curLine, 0 );
UpdateInputArea( edctrl, edctrl->curLine, 0 );
}
}
else
{
//SWITCH_2:
switch( wparam )
{
case '\r': // 0x0d
if( edctrl->style & ES_READONLY )
break; // break switch_2 'wparam'
newPos = InsertChar( edctrl->pbuf, edctrl->curCursorPos, wparam, &edctrl->strLen, edctrl->bufSize );
if( newPos == NULL )
break; // break switch_2 'wparam'
edctrl->curCursorPos = newPos;
pmatrix = &edctrl->pmatrix[edctrl->curLine];
if( edctrl->curLine == edctrl->curPage + edctrl->pageLine -1 )
{
// 当前行是页尾,下移一行
// edctrl->curCursorPos = newPos;
edctrl->curColumn = 0;
if( JumpDown( edctrl, 1 ) == ASIX_OK )
{
SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
pmatrix = &edctrl->pmatrix[edctrl->curLine];
UpdateInputArea( edctrl, edctrl->curPage, 0 );
}
return ASIX_OK;
}
// 换行
OrgnizeMatrix( edctrl, edctrl->curLine, 0 );
edctrl->curLine++;
edctrl->curColumn = 0;
UpdateInputArea( edctrl, (U16)(edctrl->curLine-1), 0 );
break; // break switch_2 'wparam'
case ESCAPE: // ESC
if( edctrl->style & ES_READONLY )
break; // break switch_2 'wparam'
// 清除所有输入,刷新显示(med)
if( edctrl->curPage != 0 )
{
// 当前页不是首页
for( i = 0; i < edctrl->pageLine; i++ )
{
edctrl->pmatrix[i].vector = edctrl->pmatrix[edctrl->curPage + i].vector;
edctrl->pmatrix[i].y = edctrl->pmatrix[edctrl->curPage + i].y;
edctrl->pmatrix[edctrl->curPage + i].vector = NULL;
edctrl->pmatrix[i].lineHead = NULL;
}
}
edctrl->pbuf[0] = '\0';
edctrl->maxPage = 0;
edctrl->curCursorPos = edctrl->pbuf;
edctrl->curLine = 0;
edctrl->curColumn = 0;
edctrl->curPage = 0;
edctrl->pmatrix[0].lineHead = edctrl->pbuf;
edctrl->strLen = 0;
OrgnizeMatrix( edctrl, 0, 0 );
UpdateInputArea( edctrl, 0, 0 );
SetScrollRange( edctrl->sbid, 0, edctrl->maxPage );
SetScrollPos( edctrl->sbid, 0, 0, 0 );
break; // break switch_2 'wparam'
case MOVE_LEFT: // 光标左移一个字符(med)
pmatrix = &edctrl->pmatrix[edctrl->curLine];
curLineHead = pmatrix->lineHead;
// 光标在字符串首(med)
if( edctrl->curCursorPos == edctrl->pbuf )
break; // break switch_2 'wparam'
newPos = edctrl->curCursorPos -1;
cLen = ( *newPos & 0x80 ) ? 2 : 1;
edctrl->curCursorPos -= cLen;
if( edctrl->curColumn == 0 ) // 光标在行首(med)
{
// 页首,上移一行(med)
if( edctrl->curLine == edctrl->curPage )
{
if( JumpUp( edctrl, 1 ) == ASIX_OK )
{
SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
pmatrix = &edctrl->pmatrix[edctrl->curLine];
if( pmatrix->lineHead + pmatrix->vector[pmatrix->len].index == edctrl->curCursorPos )
edctrl->curColumn = pmatrix->len;
else
edctrl->curColumn = pmatrix->len -1;
UpdateInputArea( edctrl, edctrl->curPage, 0 );
}
return ASIX_OK;
}
else
{
edctrl->curLine--;
SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
pmatrix = &edctrl->pmatrix[edctrl->curLine];
if( pmatrix->lineHead + pmatrix->vector[pmatrix->len].index == edctrl->curCursorPos )
edctrl->curColumn = pmatrix->len;
else
edctrl->curColumn = pmatrix->len -1;
}
}
else
edctrl->curColumn--;
pmatrix = &edctrl->pmatrix[edctrl->curLine];
edctrl->curCursorPos = pmatrix->lineHead + pmatrix->vector[edctrl->curColumn].index;
if( edctrl->curColumn == 0 )
p = pmatrix->lineHead;
else
p = pmatrix->lineHead + pmatrix->vector[edctrl->curColumn-1].index;
cLen = (*p & 0x80) ? CHINESE_CHAR_HEIGHT : ENGLISH_CHAR_HEIGHT;
dispx = pmatrix->vector[edctrl->curColumn].x;
dispy = pmatrix->y + ( edctrl->lineHeight - cLen )/2;
SetCursorPosition( hGC, dispx, dispy );
break; // break switch_2 'wparam'
case MOVE_RIGHT: // 光标右移一个字符(med)
// 光标在字符串尾(med)
if( *( edctrl->curCursorPos ) == '\0' )
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?