asix_ed.c
来自「一个操作系统源代码 用于嵌入式设备 在Vc++环境下仿真 成功移植到多款处理器上」· C语言 代码 · 共 1,876 行 · 第 1/4 页
C
1,876 行
{
edctrl->maxPage = edctrl->curPage;
SetScrollRange( edctrl->sbid, 0, edctrl->maxPage );
break; // break switch_2 'wparam'
}
cLen = ( *edctrl->curCursorPos & 0x80 ) ? 2 : 1;
edctrl->curCursorPos += cLen;
pmatrix = &edctrl->pmatrix[edctrl->curLine];
if( edctrl->curColumn == pmatrix->len )
{
// 页尾,下移一行(med)
edctrl->curColumn = 0;
if( edctrl->curLine == edctrl->curPage + edctrl->pageLine -1 )
{
if( JumpDown( edctrl, 1 ) == ASIX_OK )
{
SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
pmatrix = &edctrl->pmatrix[edctrl->curLine];
if( pmatrix->lineHead == edctrl->curCursorPos )
edctrl->curColumn = 0;
else
edctrl->curColumn = 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 == edctrl->curCursorPos )
edctrl->curColumn = 0;
else
edctrl->curColumn = 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_UP:
if( edctrl->curLine == edctrl->curPage )
{
if( JumpUp( edctrl, 1 ) == ASIX_ERROR )
break; // break switch_2 'wparam'
SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
}
else
edctrl->curLine--;
pmatrix = &edctrl->pmatrix[edctrl->curLine];
if( edctrl->curColumn > pmatrix->len )
edctrl->curColumn = pmatrix->len;
edctrl->curCursorPos = pmatrix->lineHead + pmatrix->vector[edctrl->curColumn].index;
UpdateInputArea( edctrl, edctrl->curPage, 0 );
break; // break switch_2 'wparam'
case MOVE_DOWN:
if( edctrl->curLine == edctrl->curPage + edctrl->pageLine -1 )
{
if( JumpDown( edctrl, 1 ) == ASIX_ERROR )
break; // break switch_2 'wparam'
SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
}
else
edctrl->curLine++;
pmatrix = &edctrl->pmatrix[edctrl->curLine];
if( pmatrix->lineHead == NULL )
{
edctrl->curLine--;
break; // break switch_2 'wparam'
}
if( edctrl->curColumn > pmatrix->len )
edctrl->curColumn = pmatrix->len;
edctrl->curCursorPos = pmatrix->lineHead + pmatrix->vector[edctrl->curColumn].index;
UpdateInputArea( edctrl, edctrl->curPage, 0 );
break; // break switch_2 'wparam'
case BACKSPACE: // BackSpace
if( edctrl->style & ES_READONLY )
break; // break switch_2 'wparam'
// 光标在字符串首(med)
pmatrix = &edctrl->pmatrix[edctrl->curLine];
curLineHead = pmatrix->lineHead;
if( edctrl->curCursorPos == edctrl->pbuf )
break; // break switch_2 'wparam'
// 删除前一个字符(med)
newPos = edctrl->curCursorPos -1;
cLen = ( (*newPos) & 0x80 )? 2 : 1; // 中文或英文字符
if( cLen == 1 )
{
// 删除的是否是换行回车符
if( *newPos == '\r' )
offset = 0;
else if( *newPos == '\n')
{
offset = 0;
if( *(newPos-1) == '\r' )
cLen = 2;
}
else
offset = 1;
}
strcpy( edctrl->curCursorPos - cLen, edctrl->curCursorPos );
edctrl->curCursorPos -= cLen;
edctrl->strLen -= cLen;
if( edctrl->curColumn == 0 ) // 光标在行首
{
pmatrix->lineHead -= cLen;
// 删除的是页首的前一个字符(med)
if( edctrl->curLine == edctrl->curPage )
{
edctrl->curPage--;
edctrl->pmatrix[edctrl->curPage].y = edctrl->pmatrix[edctrl->curLine].y;
endLine = edctrl->curLine+edctrl->pageLine-1;
edctrl->pmatrix[edctrl->curPage].vector = edctrl->pmatrix[endLine].vector;
edctrl->pmatrix[endLine].vector = NULL;
}
edctrl->curLine--;
edctrl->curColumn = edctrl->pmatrix[edctrl->curLine].len - offset;
SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
}
else
edctrl->curColumn-- ;
OrgnizeMatrix( edctrl, edctrl->curLine, 0 );
// 计算冗余空行数
{
U16 emptyLine = 0;
for( i = edctrl->curPage + edctrl->pageLine -1; i > edctrl->curLine; i--, emptyLine++ )
{
if( edctrl->pmatrix[i].lineHead != NULL )
break;
}
if( JumpUp( edctrl, emptyLine ) == ASIX_OK )
{
edctrl->curLine++;
UpdateInputArea( edctrl, edctrl->curPage, 0 );
}
else
UpdateInputArea( edctrl, edctrl->curLine, 0 );
}
break; // break switch_2 'wparam'
case DELETE: // Delete(med)
if( edctrl->style & ES_READONLY )
break; // break switch_2 'wparam'
if( *edctrl->curCursorPos == '\0' ) // cursor at the end of string
break; // break switch_2 'wparam'
cLen = (*edctrl->curCursorPos & 0x80 )? 2 : 1;
strcpy( edctrl->curCursorPos, edctrl->curCursorPos + cLen );
edctrl->strLen -= cLen;
OrgnizeMatrix( edctrl, edctrl->curLine, 0 );
UpdateInputArea( edctrl, edctrl->curLine, 0 );
break; // break switch_2 'wparam'
default:
break; // break switch_2 'wparam'
}
}
//OUT_2:
break; // break switch_1 'asix_msg'
case WM_VSCROLL: // 垂直滚动(med)
pmatrix = &edctrl->pmatrix[0];
//SWITCH_3:
switch( wparam )
{
case SB_LINEDOWN: // 下移一行(med)
if( JumpDown( edctrl, 1 ) == ASIX_ERROR )
return ASIX_OK;
SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
break; // break switch_3 'wparam'
case SB_LINEUP: // 上移一行(med)
if( JumpUp( edctrl, 1 ) == ASIX_ERROR )
return ASIX_OK;
SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
break; // break switch_3 'wparam'
case SB_PAGEDOWN: // 向下翻一页(med)
if( JumpDown( edctrl, edctrl->pageLine ) == ASIX_ERROR )
return ASIX_OK;
SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
break; // break switch_3 'wparam'
case SB_PAGEUP: // 向上翻一页(med)
if( JumpUp( edctrl, edctrl->pageLine ) == ASIX_ERROR )
return ASIX_OK;
SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
break; // break switch_3 'wparam'
case SB_THUMBTRACK:
k = *((U16 *)data);
dbgoutput( "*** %d ****", k );
if( k < edctrl->curPage )
{
if( JumpUp( edctrl, (U16)(edctrl->curPage - k) ) == ASIX_ERROR )
return ASIX_OK;
}
else
{
if( JumpDown( edctrl, (U16)(k - edctrl->curPage) ) == ASIX_ERROR )
return ASIX_OK;
}
break; // break switch_3 'wparam'
default:
return ASIX_OK;
}
//OUT_3:
// 刷新显示(med)
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 );
break; // break switch_1 'asix_msg'
case WM_GETFOCUS:
pmatrix = &edctrl->pmatrix[edctrl->curLine];
dispx = pmatrix->vector[pmatrix->len].x;
dispy = pmatrix->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; // break switch_1 'asix_msg'
case WM_LOOSEFOCUS:
FreeCursor( hGC );
// asix_edprintf( "LooseFocus" );
break; // break switch_1 'asix_msg'
case WM_PENDOWN:
if( GetFocus() != edctrl->windowid )
SetFocus( edctrl->windowid );
break; // break switch_1 'asix_msg'
case WM_PENXY:
break; // break switch_1 'asix_msg'
case WM_PENUP:
LocateCursorPos( edctrl );
pmatrix = &edctrl->pmatrix[edctrl->curLine];
edctrl->curCursorPos = pmatrix->lineHead + 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; // break switch_1 'asix_msg'
default:
break; // break switch_1 'asix_msg'
}
//OUT_1:
return ASIX_OK;
}
STATUS MoveLeft( struct ed_ctrl *edctrl, U16 num )
{
U16 cLen;
U16 i = 0;
S8 *curLineHead;
struct char_matrix *pmatrix;
pmatrix = &edctrl->pmatrix[0];
curLineHead = pmatrix->lineHead;
if( num == 0 || curLineHead == edctrl->pbuf )
return ASIX_ERROR;
while( curLineHead != edctrl->pbuf && i < num )
{
cLen = ( *(curLineHead-1) & 0x80 ) ? 2 : 1;
curLineHead -= cLen;
i++;
}
pmatrix->lineHead = curLineHead;
FillVector( edctrl, curLineHead, 0, &i );
return ASIX_OK;
}
STATUS MoveRight( struct ed_ctrl *edctrl, U16 num )
{
U16 width;
U16 i = 0;
S8 *curLineHead, *p;
struct char_matrix *pmatrix;
pmatrix = &edctrl->pmatrix[0];
curLineHead = pmatrix->lineHead;
p = curLineHead + pmatrix->vector[pmatrix->len].index;
// 字符串尾(sed)
if( num == 0 || *p == '\0' )
return ASIX_ERROR;
width = pmatrix->w;
while( *p != '\0' && i < num )
{
if( *p & 0x80 )
{
width += CHINESE_CHAR_WIDTH;
p += 2;
}
else
{
width += ENGLISH_CHAR_WIDTH;
p++;
}
while( width > edctrl->width - 4 )
{
if( *curLineHead & 0x80 )
{
width -= CHINESE_CHAR_WIDTH;
curLineHead += 2;
}
else
{
width -= ENGLISH_CHAR_WIDTH;
curLineHead++;
}
}
i++;
}
pmatrix->lineHead = curLineHead;
FillVector( edctrl, curLineHead, 0, &i );
return ASIX_OK;
}
STATUS JumpDown( struct ed_ctrl *edctrl, U16 num )
{
U8 *p;
U16 offset, index;
U16 i, k, endLine;
struct char_matrix *pmatrix;
endLine = edctrl->curPage + edctrl->pageLine -1;
pmatrix = &edctrl->pmatrix[endLine];
if( num == 0 || pmatrix->lineHead == NULL )
return ASIX_ERROR;
FillVector( edctrl, pmatrix->lineHead, endLine, &offset );
// 下一行行首字符
p = pmatrix->lineHead + offset;
// p = pmatrix->lineHead + pmatrix->vector[pmatrix->len].index;
if( *p == '\0' ) // 文本结束符
{
// 未换行
if( offset >= 1 && *(p-1) != '\r' && *(p-1) != '\n' )
return ASIX_ERROR;
}
// 跳过换行符
// if( *p == '\n' || *p == '\r' )
// p++;
// 重新排列行矩阵
k = endLine;
index = edctrl->curPage + num;
do
{
k++;
edctrl->pmatrix[k].lineHead = p;
edctrl->pmatrix[k].vector = edctrl->pmatrix[edctrl->curPage].vector;
//edctrl->pmatrix[edctrl->curPage].lineHead = NULL;
edctrl->pmatrix[edctrl->curPage].vector = NULL;
edctrl->curPage++;
edctrl->pmatrix[k].x = edctrl->x +1;
for( i = k; i >= edctrl->curPage; i-- )
{
edctrl->pmatrix[i].y = edctrl->pmatrix[i-1].y;
}
pmatrix = &edctrl->pmatrix[k];
FillVector( edctrl, pmatrix->lineHead, k, &offset );
p += offset;
edctrl->curLine++;
}while( edctrl->curPage < index && *p != '\0' );
if( *p == '\0' || edctrl->maxPage < edctrl->curPage )
{
edctrl->maxPage = edctrl->curPage;
SetScrollRange( edctrl->sbid, 0, edctrl->maxPage );
}
return ASIX_OK;
}
STATUS JumpUp( struct ed_ctrl *edctrl, U16 num )
{
U16 offset, index;
U16 i, k, endLine;
struct char_matrix *pmatrix;
if( num == 0 || edctrl->curPage == 0 )
return ASIX_ERROR;
endLine = edctrl->curPage -1;
index = (edctrl->curPage < num) ? 0 : edctrl->curPage - num;
do
{
k = edctrl->curPage + edctrl->pageLine -1;
edctrl->pmatrix[edctrl->curPage -1].vector = edctrl->pmatrix[k].vector;
edctrl->pmatrix[k].lineHead = NULL;
edctrl->pmatrix[k].vector = NULL;
edctrl->curPage--;
for( i = edctrl->curPage; i < edctrl->curPage + edctrl->pageLine; i++ )
{
edctrl->pmatrix[i].y = edctrl->pmatrix[i+1].y;
}
pmatrix = &edctrl->pmatrix[edctrl->curPage];
FillVector( edctrl, pmatrix->lineHead, edctrl->curPage, &offset );
edctrl->curLine--;
}while( edctrl->curPage != 0 && edctrl->curPage > index );
return ASIX_OK;
}
// functions opened to user
S8 *GetEditorStr( U32 windid, S8 *userBuf, U32 bufSize )
{
struct ed_ctrl *edctrl;
if( (ASIX_WINDOW *) windid == NULL )
return NULL;
edctrl = ((ASIX_WINDOW *) windid)->ctrl_str;
if( edctrl == NULL || edctrl->windowid != windid || edctrl->classid != WNDCLASS_EDITOR ) // not a editor
return NULL;
if( edctrl->pbuf == NULL )
return NULL;
if( userBuf == NULL )
return edctrl->pbuf;
else
{
if( bufSize == 0 )
return NULL;
strncpy( userBuf, edctrl->pbuf, bufSize -1 );
return userBuf;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?