⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uitextedit.c

📁 嵌入工linux开发的源码
💻 C
📖 第 1 页 / 共 5 页
字号:

/*********************************************************
    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 + -