📄 editwinproc.c
字号:
/***************************************************************************
Copyright (C) 2005 SHENZHEN MEIJIN CO.LTD
FILE NAME: EditWinProc.C
MODULE NAME: Edit
DESCRIPTION: 编辑器按键和字符输入的处理函数
对外函数声明:
内部函数声明:
编辑器字符串(字符)输入操作
VOID __EditAddStringProc(MEdit *hEditWin, UINT8* pData, UINT uDataLen);
删除字符(mark)子程序
VOID __EditDeleteProc(MEdit* hEditWin, BOOL bSendDataChange );
按键消息处理
BOOL __EditKeyProcess(MEdit* pEdit, UINT uKey, BOOL bCanEdit);
处理编辑器行列变化的子程序
VOID __EditLineRowChange(MEdit *hEditWin,UINT uOldDspLen,BOOL bScrnStart,BOOL bReDraw);
**************************************************************************
DTAE AUTHOR VERSION REMARKS
=========== ========== ========= ======================================
2006-11-31 gaolinhui V1.0 create
***************************************************************************/
#include "kernel.h"
#include "EditIn.h"
extern EdtCmdEx g_mEdtCmdEx; //编辑器的扩展命令类型
extern CMDEXP g_mEditCmdParam;
/****************************************************************************/
/* FUNCTION: __EditBeforCanMarkMemDist */
/* DESCRIPTION:找到前一可MARK字符/单词的位置 */
/* INPUTS: pEdit - 编辑器句柄 */
/* pData - 整个字符串的起始地址 */
/* uPos - 要搜索的起始地址 */
/* OUTPUTS: NONE */
/* RETURN: 返回距离当前位置的距离 */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* Xie 2001-04-23 创建初始版本 */
/****************************************************************************/
UINT __EditBeforCanMarkMemDist(MEdit* pEdit, UINT8 *pData, UINT uPos)
{
UINT uLen, uWordLen, uPreCanMarkPos;
BOOL bPreIsLetter;
if( uPos == 0 )
{
return 0;
}
uLen = 0;
uWordLen = 0;
uPreCanMarkPos = uPos;
bPreIsLetter = FALSE;
do
{
uLen += uWordLen;
if( pData[uLen] != CHAR_RETURN )
uPreCanMarkPos = uLen;
__EditGetCharLength(pEdit->pmEditInfo->wFontID, &pData[uLen], &uWordLen, (UINT*)NULL);
/*if( uWordLen == 0 )
break;*/
}while( uLen + uWordLen < uPos );
return (uPos - uPreCanMarkPos);
}
/****************************************************************************/
/* FUNCTION: __EditAfterCanMarkMemPos */
/* DESCRIPTION:找到后一可MARK字符/单词的位置 */
/* INPUTS: pEdit - 编辑器句柄 */
/* pData - 整个字符串的起始地址 */
/* OUTPUTS: NONE */
/* RETURN: 返回距离当前位置的距离 */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* Xie 2001-04-23 创建初始版本 */
/****************************************************************************/
UINT __EditAfterCanMarkMemPos(MEdit *pEdit, UINT8 *pData)
{
UINT uLen, uWordLen, uPreCanMarkPos;
BOOL bPreIsLetter;
uLen = 0;
uWordLen = 0;
uPreCanMarkPos = 0;
bPreIsLetter = FALSE;
while( pData[uLen] != 0 )
{
__EditGetCharLength(pEdit->pmEditInfo->wFontID, &pData[uLen], &uWordLen, (UINT*)NULL);
bPreIsLetter = FALSE;
uLen += uWordLen;
if( (pData[uLen] != CHAR_RETURN) && (pData[uLen] != 0) )
{
return uLen;
}
}
return 0;
}
/****************************************************************************/
/* FUNCTION: __EditWinProcKeyMark */
/* DESCRIPTION:处理按键的MARK块操作 */
/* INPUTS: hEditWin - 编辑窗口句柄 */
/* pEvent - 要处理的按键消息 */
/* bCanEdit - 是否可编辑 */
/* OUTPUTS: NONE */
/* RETURN: 设置成功返回TRUE,否则返回FALSE */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* Xie 2001-04-23 创建初始版本 */
/****************************************************************************/
INT __EditWinProcKeyMark(MEdit *hEditWin, UINT uKey, BOOL bCanEdit)
{
BOOL bShiftDown;
UINT8 *pData;
UINT uCursorMem;
UINT uPreLen, uTemp,uKeyValue;
UINT16 wFontID;
BOOL bIsMarking, bMultiLine;
UINT8 byTempChar;
BOOL bHaveProc;
INT nRet = 0;
if( hEditWin->pmEditInfo->wState & OF_EDITOR_NOMARK )
return nRet; //如果不允许MARK操作,则不继续进行下面的操作
if( hEditWin->pmEditInfo->wState & OF_EDITOR_PASSWORD )
return nRet; //密码编辑中不允许MARK操作,则不继续进行下面的操作
uKeyValue = READKB_VALUE(uKey);
bShiftDown = READKB_SHIFTMASK(uKey);
wFontID = hEditWin->pmEditInfo->wFontID;
bIsMarking = (hEditWin->pmEditInfo->m_Block.uBlkHead != hEditWin->pmEditInfo->m_Block.uBlkTail);
uCursorMem = hEditWin->pmEditInfo->m_CurSor.uCursorMem; /*光标内存位置*/
if( bCanEdit )
{
if( !bShiftDown )
return nRet; //可编辑状态下只有当同时按下了SHIFT键时,才能进行MARK操作;
if( !bIsMarking )
{ /*如果为开始MARK状态,即之前不是MARK状态,则表示从当前光标位置开始MARK*/
hEditWin->pmEditInfo->m_Block.uBlkHead = uCursorMem;
hEditWin->pmEditInfo->m_Block.uBlkTail = uCursorMem;
}
}
else
{
if( !bIsMarking )
{
if( !bShiftDown || (uKeyValue != MVK_RIGHT) )
return nRet;
}
}
pData = hEditWin->pmEditInfo->pBuf;
bMultiLine = (hEditWin->pmEditInfo->wState & OF_EDITOR_MULTILINE);
bHaveProc = FALSE;
//处理左移方向键
if( uKeyValue == MVK_LEFT )
{ /*计算光标处前一字符的显示长度*/
if( uCursorMem > 0 )
{
uPreLen = __EditGetPreCharMemLen(wFontID, pData, uCursorMem);
hEditWin->pmEditInfo->m_CurSor.uCursorMem = uCursorMem - uPreLen;
bHaveProc = TRUE;
}
else// if( bShiftDown ) //如果所有的左移键都清除,则光标是第一个字符时左移也不取消MARK块
bHaveProc = TRUE;
}
//处理右移方向键
else if( uKeyValue == MVK_RIGHT )
{
if( !bCanEdit && !bIsMarking ) //只读非MARK状态,则开始MARK;
{
//pData = hEditWin->pScrnStart;
hEditWin->pmEditInfo->m_CurSor.uCursorMem = (UINT)(hEditWin->pmEditInfo->pScrnStart - hEditWin->pmEditInfo->pBuf);
bHaveProc = TRUE;
}
else
{
pData += uCursorMem;
/*当当前位置字符不是结尾字符时,才有移动的可能*/
while( *pData != 0 )
{ //计算新的光标位置
//先得到当前光标位置字符的内存长度
__EditGetCharLength( wFontID, pData, &uTemp, NULL );
if( !bCanEdit )
{
byTempChar = *(pData + uTemp);
if( byTempChar == 0 )
break; //只读状态不能移到最后一个字符之后
}
hEditWin->pmEditInfo->m_CurSor.uCursorMem = uCursorMem + uTemp;
bHaveProc = TRUE;
break;
}
}
//if( bShiftDown )
// pEvent->dwMsgType = EV_NOTHING;
}
//对于上、下、翻页键,只有多行编辑时才能处理
else if( bMultiLine )
{ /*只有多行编辑才有对上下按键的操作*/
UINT uDspLines, uDspCols;/*每屏可显示的行数和每行可显示的列数*/
UINT uOldStart, uDataLines;
INT nCurLine, nCurCol;
//// 2003.11.20 ////
INT nCurLineBak;
////////////////////
uDspCols = (hEditWin->uWidth / __EditGetAsciiFontWidth(wFontID));
/*编辑器一行能显示的列数*/
uDspLines = __EditGetRectLineNum(wFontID, hEditWin->uHeight, hEditWin->pmEditInfo->uRowSpace );/*每屏能显示的行数*/
uOldStart = hEditWin->pmEditInfo->uStart;
uDataLines = hEditWin->pmEditInfo->uDataLines;
__EditMemColToCursor(hEditWin, uCursorMem, &nCurLine, &nCurCol, FALSE, TRUE);
//// 2003.11.20 ////
nCurLineBak = nCurLine;
////////////////////
switch( uKeyValue )
{
case MVK_UP:
if( (nCurLine == 0) && (uOldStart == 0 ) )
{
if( bShiftDown )
break; /*光标在第一行,不能往上移动*/
}
bHaveProc = TRUE; //否则一定可以处理向上键
if( nCurLine > 0 ) //如果光标能上移一行,则优先移光标
nCurLine -= 1;
else //if( uOldStart > 0 )
{ /*否则,如果光标在第一行,则上翻一行*/
hEditWin->pmEditInfo->uStart = uOldStart - 1;
__EditGetScrnStart(hEditWin, uOldStart);
}
__EditCursorToMemCol(hEditWin, &nCurLine, &nCurCol, uDspCols);
break;
case MVK_DOWN:
if( (nCurLine < (INT)(uDspLines-1)) && (uOldStart + nCurLine + 1 < uDataLines) )
{ /*如果光标能下移一行*/
nCurLine += 1;
}
else if( uOldStart + uDspLines < uDataLines )
{ /*否则,如果光标在最后一行,则下翻一行*/
hEditWin->pmEditInfo->uStart = uOldStart + 1;
__EditGetScrnStart(hEditWin, uOldStart);
}
else //???这里是否需要判断由连续MARK转为单个MARK的情况,则此时需要处理
{
break;
}
__EditCursorToMemCol(hEditWin, &nCurLine, &nCurCol, uDspCols);
if( !bCanEdit )
{
byTempChar = *(pData + hEditWin->pmEditInfo->m_CurSor.uCursorMem);
if( byTempChar == 0)
{ //只读状态不能移到最后一个字符之后
uTemp = __EditGetPreCharMemLen( wFontID,
pData + uCursorMem, hEditWin->pmEditInfo->m_CurSor.uCursorMem - uCursorMem );
hEditWin->pmEditInfo->m_CurSor.uCursorMem -= uTemp;
//// 2003.11.20 ////
if( (uTemp == 1) && (pData[hEditWin->pmEditInfo->m_CurSor.uCursorMem] == CHAR_RETURN) &&
(nCurLineBak == (INT)(uDspLines-2)) )
{
//__EditMemColToCursor(hEditWin, hEditWin->uCursorMem, &nCurLine, &nCurCol, FALSE, TRUE);
break;
}
////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -