📄 uitextedit.c
字号:
/*********************************************************
FILE: uiTextEdit.c
Basic Window Widget : TextEdit
Copyright (c) 2001, Reality Technology CO. LTD.
AUTHOR: Cangers <gh_chan@sina.com>
HISTORY: >2001-10-24
Last rebuild in 020326 to resolve the scroll can't get to the end line
**********************************************************/
/**************************************************************
INCLUDE FILE
***************************************************************/
#include <pr2k.h>
#include <uiwnd.h>
#include <typedefine.h>
#include <uiGui_cfg.h>
#include <uiGraph.h>
#include <uiUtility.h>
#include <uicontrol.h>
#include <uiCaret.h>
#include <stdio.h>
#include <stdlib.h>
#include <uiSw_kbd.h>
#include <uiScroll.h>
#include <uiTimer.h>
#include <uiTextEdit.h>
#include <keypad.h>
#define TEXT_VISIVLE_LINENUM ((bottom+1-top-ptTextEdit->m_Margin_Top-ptTextEdit->m_Margin_Bottom)/ptTextEdit->m_LineHeight)
/*************************<<PRIVATE DEC>>**************************/
static POPUP_FUNC_TYPE *PopupPtrFunc = NULL;
static HNDL _FocusHandle_Text=0;
static char _PASTE_TEXT_BUFF[1024];
//------------------------------------------------------------------------
static int _guiTextEdit_Action(HNDL hTextEdit , WORD Pen_Type, WORD x , WORD y);
static int _guiTextEdit_Paint( HNDL hTextEdit,BOOL bShowCursor );
static int _guiAdjustText(HNDL hTextEdit);
static int _guiDealText(HNDL hTextEdit,BOOL bMalloc);
//static int _guiAdjustLineCount(HNDL hTextEdit);
static int _guiTextEdit_DelChar(HNDL hTextEdit ,short nPos);
static int _guiTextEdit_BackDelChar(HNDL hTextEdit,short nPos );
static int _guiTextEdit_InsertChar(HNDL hTextEdit ,const BYTE *pChar,short nPos);
static int _guiTextEdit_DeSelect( HNDL hTextEdit );
static int _guiTextEdit_ShowCursorByPos(HNDL hTextEdit,short nPos);
static int _guiText_SetCursorPos(HNDL hTextEdit,short x, short y);
static char guiGetCellChar( const BYTE *pText,WORD *wCellLen,WORD wCharGap);
static short _guiText_GetWordIx(const BYTE *pText,WORD Index,WORD wCharGap,WORD wStartx);
static int _guiTextEdit_DealOverlapChar(HNDL hTextEdit,BYTE *pChar);
static STATUS _guiTextEdit_DealStyleVal( HNDL hTextEdit, WORD style );
static STATUS _guiTextEdit_Delete( HNDL hTextEdit );
static STATUS _guiTextEdit_Show( HNDL hTextEdit );
#define SINGLECHAR 0
#define HEADWORD 1
#define TAILWORD 2
/* Kevin for long touch */
#ifdef __WIN32__
#define MIN_TOUCH_COUNT 5
#else
#define MIN_TOUCH_COUNT 40/* RTC 64Hz, so 96 = 1.5sec */
#endif
#define LONG_TOUCH_BOUNDARY 4
typedef struct LongTouchStruct
{
WORD x1;
WORD x2;
WORD y1;
WORD y2;
WORD Counter;
unsigned char BeTouchFlag;
} LongTouchType;
LongTouchType LongTouch;
/* End of Kevin */
// -1: error, 0:SINGLECHAR, 1:HEADWORD, 2:TAILWORD,
static int _str_IsWord(BYTE *pStr, int pos)
{
int len, curPos=0;
len = strlen((char *)pStr);
if(pos>len)
return -1;
while(curPos<=pos)
{
if(pStr[curPos]>0x80)
{
if(curPos==pos-1)
return TAILWORD;
if(curPos==pos)
return HEADWORD;
curPos += 2;
}
else
{
if(curPos==pos)
return SINGLECHAR;
curPos++;
}
}
}
/*************************<<PUBLIC FUN>>****************************/
DLL_EXP(HNDL) guiTextEdit_Create( WORD left, WORD top, WORD right, WORD bottom , short maxLen,WORD style)
{
TTEXTEDIT *ptTextEdit;
short i;
if(right <= left || bottom <= top)
return 0;
guiEnterWCS() ;
#ifdef _CGH_DEBUG
_debugDisplayMemInfo("create");
#endif
ptTextEdit=(TTEXTEDIT *)kernelMalloc(sizeof(TTEXTEDIT));
if( ptTextEdit == NULL)
{
guiExitWCS() ;
return 0;
}
memset( ptTextEdit,0,sizeof(TTEXTEDIT));
ptTextEdit->base.handle =(HNDL) ptTextEdit;//hTextEdit is the pointer which point to this structure,identify the control
ptTextEdit->base.checkFlag = GUI_CONTROL_CHECK_FLAG;//9296 this field would be a special value, it's able to check,the hTextEdit available or not
ptTextEdit->base.left = left;
ptTextEdit->base.top = top;
ptTextEdit->base.right = right;
ptTextEdit->base.bottom = bottom;
ptTextEdit->base.type = CONTROL_TEXTFIELD; // indicate the type of the control.
ptTextEdit->base.style = style;
ptTextEdit->base.status = 0; //ACTIVE or not
ptTextEdit->base.vportHandle = NULL;
ptTextEdit->base.container = NULL;
ptTextEdit->base.font = GUI_DEFAULT_FONT;
ptTextEdit->m_Alignment = ALIGNMENT_LEFT; //single
ptTextEdit->m_bPassword = FALSE; //single
ptTextEdit->m_EchoChar = '*';
if(ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE)
ptTextEdit->m_buff_LineCount = 1;
else
{
ptTextEdit->m_buff_LineCount = maxLen/((right-left+1)/14);
if(ptTextEdit->m_buff_LineCount<120)
ptTextEdit->m_buff_LineCount = 120;
else if(ptTextEdit->m_buff_LineCount>500)
{
kernelFree(ptTextEdit);
guiExitWCS();
return 0;
}
}
ptTextEdit->m_pLineInfo = (TTEXTLINEINFO *)kernelMalloc(ptTextEdit->m_buff_LineCount*sizeof(TTEXTLINEINFO));
if(ptTextEdit->m_pLineInfo == NULL)
{
kernelFree(ptTextEdit);
guiExitWCS();
return 0;
}
memset( ptTextEdit->m_pLineInfo,0,ptTextEdit->m_buff_LineCount*sizeof(TTEXTLINEINFO));
for(i=0;i<ptTextEdit->m_buff_LineCount;i++)
ptTextEdit->m_pLineInfo[i].wLineIndex = -1;
ptTextEdit->m_LineCount = 1;
ptTextEdit->m_CursorPos = 0;
ptTextEdit->m_CursorLineNum =0;
ptTextEdit->m_LineColor = GUI_BLACK;
ptTextEdit->m_TextColor = GUI_BLACK;
ptTextEdit->m_UnderlineStyle = UNDERLINE_NONE;
ptTextEdit->m_LineHeight = DEFAULT_LINE_HEIGHT;
ptTextEdit->m_CharGap = 1;
ptTextEdit->m_MaxLength = maxLen;
ptTextEdit->m_TopLineNum = 0;
ptTextEdit->m_bReadOnly = FALSE;
ptTextEdit->m_bRebuid = 0;
ptTextEdit->m_bScrollActive = FALSE;
ptTextEdit->m_bScrollEnable = TRUE;
ptTextEdit->m_bWordWrap = TRUE;
ptTextEdit->m_DynamicMax = 0;
ptTextEdit->m_CaretWidth = 0;
if(ptTextEdit->base.style&TEXTEDIT_NOBORDER)
{
ptTextEdit->m_Margin_Bottom = 0;
ptTextEdit->m_Margin_Left = 0;
ptTextEdit->m_Margin_Right = 0;
ptTextEdit->m_Margin_Top = 0;
}
else
{
ptTextEdit->m_Margin_Bottom = 1;
ptTextEdit->m_Margin_Left = 2;
ptTextEdit->m_Margin_Right = 2;
ptTextEdit->m_Margin_Top = 1;
}
ptTextEdit->m_MarkBegin = -1;
ptTextEdit->m_MarkEnd = -1;
ptTextEdit->m_init_LineCount = ((ptTextEdit->base.bottom-ptTextEdit->base.top+1-ptTextEdit->m_Margin_Top-ptTextEdit->m_Margin_Bottom)/ptTextEdit->m_LineHeight);
ptTextEdit->m_pText = NULL;
ptTextEdit->m_pText = (char *)kernelMalloc(ptTextEdit->m_MaxLength+1);
if(ptTextEdit->m_pText == NULL)
{
kernelFree(ptTextEdit);
kernelFree(ptTextEdit->m_pLineInfo);
ptTextEdit->m_pLineInfo = 0;
ptTextEdit->m_pText = NULL;
ptTextEdit=0;
guiExitWCS();
return 0;
}
memset( ptTextEdit->m_pText,0,ptTextEdit->m_MaxLength+1);
ptTextEdit->m_VScroll = (HNDL)guiScroll_Create(right-_SCROLLBAR_WIDTH_,top+1,bottom-1,1,(bottom-top-4)/ptTextEdit->m_LineHeight,0);
if(ptTextEdit->m_VScroll == NULL)
{
kernelFree(ptTextEdit->m_pText);
ptTextEdit->m_pText = NULL;
kernelFree(ptTextEdit->m_pLineInfo);
ptTextEdit->m_pLineInfo = 0;
kernelFree(ptTextEdit);
ptTextEdit = NULL;
guiExitWCS();
return 0;
}
ptTextEdit->base.actionFun =(PF_ACTION )_guiTextEdit_Action;
ptTextEdit->base.showFun =(PF_SHOW) _guiTextEdit_Show;
ptTextEdit->base.delFun =(PF_DELETE) _guiTextEdit_Delete;
guiExitWCS();
#ifdef _CGH_DEBUG
_debugDisplayMemInfo("create ok");
#endif
_guiTextEdit_DealStyleVal( (HNDL)ptTextEdit, ptTextEdit->base.style );
return (HNDL) ptTextEdit;
}
//==========================================================
static STATUS _guiTextEdit_Delete( HNDL hTextEdit ) //OK
{
TTEXTEDIT *ptTextEdit;
if(hTextEdit == NULL)
{
return STATUS_ERR;
}
guiEnterWCS() ;
ptTextEdit=(TTEXTEDIT *)hTextEdit;
if(ptTextEdit->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
{
guiExitWCS();
return STATUS_ERR;
}
#ifdef _CGH_DEBUG
_debugDisplayMemInfo("dele...");
#endif
if(_FocusHandle_Text == hTextEdit)
guiTextEdit_LostFocus( ) ;
if(ptTextEdit->m_pText)
kernelFree(ptTextEdit->m_pText);
ptTextEdit->m_pText = NULL;
if(ptTextEdit->m_pLineInfo)
kernelFree( ptTextEdit->m_pLineInfo) ;
ptTextEdit->m_pLineInfo = 0;
if(ptTextEdit->m_VScroll)
((TGuiControl *)ptTextEdit->m_VScroll)->delFun(ptTextEdit->m_VScroll);
if(hTextEdit)
kernelFree((TTEXTEDIT *)hTextEdit);
hTextEdit =0;
ptTextEdit->base.checkFlag =0;
guiExitWCS() ;
#ifdef _CGH_DEBUG
_debugDisplayMemInfo("del ok");
#endif
return STATUS_OK;
}
//==========================================================
static STATUS _guiTextEdit_Show( HNDL hTextEdit )
{
TTEXTEDIT *ptTextEdit;
short nTEMP;
if(hTextEdit == NULL)
{
return STATUS_ERR;
}
guiEnterWCS();
ptTextEdit=(TTEXTEDIT *)hTextEdit;
if(ptTextEdit->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
{
guiExitWCS();
return STATUS_ERR;
}
if(ptTextEdit->base.container)
{
((TGuiControl *)ptTextEdit->m_VScroll)->container = ptTextEdit->base.container;
}
else if(ptTextEdit->base.vportHandle)
{
((TGuiControl *)ptTextEdit->m_VScroll)->vportHandle = ptTextEdit->base.vportHandle;
}
guiPushFont(guiGetFont()) ;
guiSetFont(ptTextEdit->base.font) ;
if(ptTextEdit->m_LineHeight <= guiGetStringHeight())
{
nTEMP = ptTextEdit->m_init_LineCount*ptTextEdit->m_LineHeight;
ptTextEdit->m_LineHeight = guiGetStringHeight()+1;
ptTextEdit->m_init_LineCount = nTEMP/ptTextEdit->m_LineHeight;
}
guiPopFont();
if(_guiAdjustText(hTextEdit) == STATUS_ERR)
{
guiExitWCS();
return STATUS_ERR;
}
if(!guiControl_IsVisible(hTextEdit))
{
guiExitWCS();
return STATUS_ERR;
}
_guiTextEdit_Paint(hTextEdit,1);
guiExitWCS();
return STATUS_OK;
}
//=========================================================
DLL_EXP(STATUS) guiTextEdit_SetText( HNDL hTextEdit, const char *pszText) //ok
{
TTEXTEDIT *ptTextEdit;
int i=0;
if(hTextEdit == NULL)
{
return STATUS_ERR;
}
guiEnterWCS() ;
ptTextEdit=(TTEXTEDIT *)hTextEdit;
if(ptTextEdit->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
{
guiExitWCS();
return STATUS_ERR;
}
//if(ptTextEdit->m_bPassword && (ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE))
{
// guiExitWCS();
// return STATUS_ERR;
}
memset( ptTextEdit->m_pText,0,ptTextEdit->m_MaxLength+1);
for(i=0;pszText && *pszText;pszText++)
{
if(i>=ptTextEdit->m_MaxLength)
break;
if(ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE)
{
if(*pszText == '\n' || *pszText == '\r')
break;
}
ptTextEdit->m_pText[i] = *pszText;
i++;
}
ptTextEdit->m_TxtLength=i;/* Kevin */
ptTextEdit->m_CursorPos=i;/* Kevin */
ptTextEdit->m_CursorLineNum = 0;
ptTextEdit->m_TopLineNum = 0;
if(guiControl_IsVisible(hTextEdit))
{
if(_guiAdjustText( hTextEdit) != STATUS_ERR)
_guiTextEdit_Show( hTextEdit );
}
guiExitWCS() ;
return STATUS_OK;
}
//================================================================================
static STATUS _guiTextEdit_DealStyleVal( HNDL hTextEdit, WORD style )
{
TTEXTEDIT *ptTextEdit;
if(hTextEdit == NULL)
{
return STATUS_ERR;
}
guiEnterWCS() ;
ptTextEdit=(TTEXTEDIT *)hTextEdit;
if(ptTextEdit->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
{
guiExitWCS();
return STATUS_ERR;
}
if(!(style&TEXTEDIT_SINGLE_LINE))
{
if(style&TEXTEDIT_SCROLL_NONE)
ptTextEdit->m_bScrollEnable = 0;
else
ptTextEdit->m_bScrollEnable = 1;
if(style&TEXTEDIT_WRAP_LINE)
ptTextEdit->m_bWordWrap = 0;
else
ptTextEdit->m_bWordWrap = 1;
}
if(style&TEXTEDIT_READONLY)
ptTextEdit->m_bReadOnly = 1;
else
ptTextEdit->m_bReadOnly = 0;
if(style&TEXTEDIT_UNDERLINE_SOLID)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -