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

📄 uitextedit.c

📁 嵌入工linux开发的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
        }
        else
            ptTextEdit->m_TxtLength--;
        val = 1;
    }
    else
    {
        if(ptTextEdit->m_TxtLength>1)
        for(i =nPos;i<ptTextEdit->m_TxtLength;i++)
            ptTextEdit->m_pText[i] = ptTextEdit->m_pText[i+2];
        if(nPos == 0 && ptTextEdit->m_TxtLength==0)
        {
           ptTextEdit->m_pText[0] = '\0';
        }
        else
            ptTextEdit->m_TxtLength -= 2;
        val = 2;
    }

    ptTextEdit->m_pText[ptTextEdit->m_TxtLength] = '\0';

    guiExitWCS() ;

	return val;
}

//=============================================================
static int _guiTextEdit_BackDelChar(HNDL hTextEdit,short nPos )
{
    TTEXTEDIT  *ptTextEdit;
    int val=0;
	int isWord;

	if(hTextEdit == NULL)
	{
    return STATUS_ERR;
    }
    guiEnterWCS() ;
	ptTextEdit=(TTEXTEDIT *)hTextEdit;
    if(ptTextEdit->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
	{
		guiExitWCS();
	return STATUS_ERR;
	}
    if(nPos<=0)
    {
		guiExitWCS();
	    return STATUS_ERR;
	}

	isWord = _str_IsWord((BYTE *)ptTextEdit->m_pText, nPos-1);
    if((isWord==SINGLECHAR && (BYTE)ptTextEdit->m_pText[nPos-1]!=0x0A)
    || ((BYTE)ptTextEdit->m_pText[nPos-1]==0x0A && (BYTE)ptTextEdit->m_pText[nPos-2] !=0x0D))
//    if(((BYTE)ptTextEdit->m_pText[nPos-1] < 0x80 && (BYTE)ptTextEdit->m_pText[nPos-1]!=0x0A)
//    || ((BYTE)ptTextEdit->m_pText[nPos-1]==0x0A && (BYTE)ptTextEdit->m_pText[nPos-2] !=0x0D))
    {
        val = _guiTextEdit_DelChar(hTextEdit,nPos-1);
        if(val)
            ptTextEdit->m_CursorPos--;
    }
    else
    {
       if(nPos<2)
        {
		    guiExitWCS();
	        return STATUS_ERR;
	    }
       val = _guiTextEdit_DelChar(hTextEdit,nPos-2);
       if(val)
            ptTextEdit->m_CursorPos -=2;
    }

    guiExitWCS() ;
	return 1;
}

//=================================================================
static int _guiTextEdit_ShowCursorByXY(HNDL hTextEdit,WORD x,WORD y,BOOL bShow)
{
    TTEXTEDIT  *ptTextEdit;
	TTEXTLINEINFO *pLineInfo;
    BYTE *Ptext=0,iSetOK=0;
    int  left=0,right=0,top=0,bottom=0;
    int  xPos=0,yPos=0;
    short i,j,n,k;
    WORD  wWordWidth=0,wStartPos;
    char iFlag=0;

	if(hTextEdit == NULL)
	{
    return STATUS_ERR;
    }
    //if(!guiControl_IsVisible(hTextEdit))
    //{
	//return STATUS_ERR;
    //}
    guiEnterWCS() ;
	ptTextEdit=(TTEXTEDIT *)hTextEdit;
    if(ptTextEdit->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
	{
		guiExitWCS();
       return STATUS_ERR;
	}
    if(ptTextEdit->m_bReadOnly)
    {
       guiExitWCS();
       return STATUS_ERR;
	}

    left = 0;
    right = ptTextEdit->base.right-ptTextEdit->base.left;
    top = 0;
    bottom = ptTextEdit->base.bottom - ptTextEdit->base.top;

    if(x<=(left) || x>=(right)
        || y<=(top) || y>=(bottom))
    {
		guiExitWCS();
       return STATUS_ERR;
	}

    for(i = ptTextEdit->m_TopLineNum;(i<ptTextEdit->m_LineCount) && i<(ptTextEdit->m_TopLineNum+TEXT_VISIVLE_LINENUM);i++)
    {
        if(y >= ((i-ptTextEdit->m_TopLineNum)*ptTextEdit->m_LineHeight+ptTextEdit->m_Margin_Top)
            && y < ((i+1-ptTextEdit->m_TopLineNum)*ptTextEdit->m_LineHeight+ptTextEdit->m_Margin_Top))
        {
            pLineInfo = &ptTextEdit->m_pLineInfo[i];

		//tong	if(pLineInfo->wLineIndex>=0)
            {
                Ptext = (BYTE *)ptTextEdit->m_pText;
                for(k=0;k<pLineInfo->wPs_Txt &&  *Ptext;k++,Ptext++);
                wStartPos = ptTextEdit->m_init_LineSX;
                wWordWidth = 0;

                while(*Ptext == 13 || *Ptext == 10)
                {
                    Ptext++;
                }
                for(j=0;(j<pLineInfo->wCharCount ||(pLineInfo->wCharCount==0 && j==0)) ;)
                {
                    if(ptTextEdit->m_bPassword && (ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE))
                    {
                        iFlag = 0;
                        wWordWidth = guiGetCharWidth(ptTextEdit->m_EchoChar)+ptTextEdit->m_CharGap;
                    }else
                        iFlag = guiGetCellChar( Ptext,&wWordWidth,ptTextEdit->m_CharGap);

                    if(x<=(wStartPos+wWordWidth/2))
                    {
                        ptTextEdit->m_CursorPos = pLineInfo->wPs_Txt + j;
                        if(ptTextEdit->m_bPassword && (ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE))
                        {
                            xPos = ptTextEdit->m_init_LineSX+
                                (ptTextEdit->m_CursorPos)*(guiGetCharWidth(ptTextEdit->m_EchoChar)
                                +ptTextEdit->m_CharGap)-ptTextEdit->m_CaretWidth;
                        }
				        else
                            xPos = wStartPos-ptTextEdit->m_CaretWidth;
				        yPos = (i-ptTextEdit->m_TopLineNum)*ptTextEdit->m_LineHeight+ptTextEdit->m_Margin_Top+1;
                        iSetOK = 1;
                        break;
                    }
                    wStartPos += wWordWidth;
                    if(iFlag==0)
                    {j++;Ptext++;}
                    else if(iFlag==1)
                    {Ptext++;Ptext++;j+=2;}
                    else
                    {j++;Ptext++;continue;}

                }

                if(!iSetOK)
                {
                    ptTextEdit->m_CursorPos = pLineInfo->wPs_Txt + pLineInfo->wCharCount;
                    if(pLineInfo->wCharCount==0)
                    {
                        wStartPos = ptTextEdit->m_init_LineSX;
                    }
                    if(ptTextEdit->m_bPassword && (ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE))
                    {
                        xPos = ptTextEdit->m_init_LineSX+
                            strlen(ptTextEdit->m_pText)*(guiGetCharWidth(ptTextEdit->m_EchoChar)
                            +ptTextEdit->m_CharGap)-ptTextEdit->m_CaretWidth;
                    }
                    else
					    xPos = wStartPos-ptTextEdit->m_CaretWidth;
					yPos = (i-ptTextEdit->m_TopLineNum)*ptTextEdit->m_LineHeight+ptTextEdit->m_Margin_Top+1;
                    iSetOK = 1;
                }
           }
        }

    }

	if(bShow && hTextEdit == _FocusHandle_Text)
	{
        ptTextEdit->m_bRebuid = 1;
        if(!iSetOK)
            _guiTextEdit_ShowCursorByPos(hTextEdit,ptTextEdit->m_CursorPos);
        else
        {
            guiCaret_Hide(  );
            _guiText_SetCursorPos(hTextEdit,xPos, yPos);

        }
	}

    guiExitWCS();
    return 1;
}

//=================================================================
static int _guiTextEdit_ShowCursorByPos(HNDL hTextEdit,short nPos)
{
    TTEXTEDIT  *ptTextEdit;
    TTEXTLINEINFO *pLineInfo;
    int  left=0,right=0,top=0,bottom=0;
    int View_Left,View_Top,View_Right,View_Bottom,ret;
    int CurrentLeft, CurrentTop;
    BYTE *Ptext=0;
    int  xPos,yPos;
    short i,k;

	if(hTextEdit == NULL)
	{
        return STATUS_ERR;
    }
    //if(!guiControl_IsVisible(hTextEdit))
    //{
	 //   return STATUS_ERR;
    //}
    guiEnterWCS() ;
	ptTextEdit=(TTEXTEDIT *)hTextEdit;
    if(ptTextEdit->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
	{
		guiExitWCS();
       return STATUS_ERR;
	}
    if(ptTextEdit->m_bReadOnly)
    {
        guiExitWCS();
       return STATUS_ERR;
	}

    left = 0;
    right = ptTextEdit->base.right-ptTextEdit->base.left;
    top = 0;
    bottom = ptTextEdit->base.bottom - ptTextEdit->base.top;

    if(nPos<0 || nPos > (ptTextEdit->m_TxtLength+1))  //cgh
    {
		guiExitWCS();
       return STATUS_ERR;
	}
    //TEXT_SHOWCARET_AGAIN:
    for(i = ptTextEdit->m_TopLineNum;(i<ptTextEdit->m_LineCount) && i<(ptTextEdit->m_TopLineNum+TEXT_VISIVLE_LINENUM);i++)
    {
        pLineInfo = &ptTextEdit->m_pLineInfo[i];
        /*tong
		if(pLineInfo->wLineIndex<0)
		{
			break;
		}
		*/
        Ptext = (BYTE *)ptTextEdit->m_pText;
        for(k=0;k<pLineInfo->wPs_Txt &&  *Ptext;k++,Ptext++);

        if(i<=(ptTextEdit->m_LineCount-1) )//&& i<=((bottom+1-top-ptTextEdit->m_Margin_Top-ptTextEdit->m_Margin_Bottom)/ptTextEdit->m_LineHeight-1))
        {
            if((nPos>=pLineInfo->wPs_Txt && (nPos<= (pLineInfo->wPs_Txt+pLineInfo->wCharCount) &&pLineInfo->wCharCount)|| (pLineInfo->wCharCount ==0 && ptTextEdit->m_CursorLineNum ==i)))
            {
                if(ptTextEdit->m_bPassword && (ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE))
                {
                    xPos = ptTextEdit->m_init_LineSX+
                        (nPos)*(guiGetCharWidth(ptTextEdit->m_EchoChar)
                        +ptTextEdit->m_CharGap)-ptTextEdit->m_CaretWidth;
                }
                else
                {
                    if(pLineInfo->wCharCount == 0)
                        xPos = ptTextEdit->m_init_LineSX-ptTextEdit->m_CaretWidth;
                    else
                        xPos = _guiText_GetWordIx(Ptext,nPos-pLineInfo->wPs_Txt,ptTextEdit->m_CharGap,ptTextEdit->m_init_LineSX)-ptTextEdit->m_CaretWidth;
                }

                yPos = (i-ptTextEdit->m_TopLineNum)*ptTextEdit->m_LineHeight+ptTextEdit->m_Margin_Top+1;
                _guiText_SetCursorPos(hTextEdit,xPos, yPos);
                //
                /*
                if(ptTextEdit->base.vportHandle && ptTextEdit->m_bRebuid)
                {
                    ret=_guiGetHandleView(ptTextEdit->base.vportHandle,&View_Left,&View_Top,&View_Right,&View_Bottom);
	                if(ret==STATUS_OK)
		            {
                        _guiConvertXY(hTextEdit, &xPos, &yPos);

                        ret=guiViewport_GetCurrentPos(ptTextEdit->base.vportHandle,&CurrentLeft,&CurrentTop);
	                    if(xPos<View_Left)
	                    {
                            guiViewport_Move(ptTextEdit->base.vportHandle,CurrentLeft-(View_Left-xPos),CurrentTop) ;
	                    }
                        else if(xPos+(ptTextEdit->m_CaretWidth-1)>View_Right)
	                    {
                            guiViewport_Move(ptTextEdit->base.vportHandle,CurrentLeft+(xPos+(ptTextEdit->m_CaretWidth-1-View_Right)),CurrentTop) ;
	                    }
                        else if(yPos<View_Top)
	                    {
                            guiViewport_Move(ptTextEdit->base.vportHandle,CurrentLeft,CurrentTop-(View_Top-yPos)) ;
	                    }
                        else if((yPos+GET_CURSOR_HEIGHT(hTextEdit)-1)>=View_Bottom)
	                    {
                            guiViewport_Move(ptTextEdit->base.vportHandle,CurrentLeft,CurrentTop+((yPos+GET_CURSOR_HEIGHT(hTextEdit))-View_Bottom)+1) ;
	                    }
                       // && left+(ptTextEdit->m_CaretWidth-1)<=View_Right && top>=View_Top && (top+GET_CURSOR_HEIGHT(hTextEdit)-1)<View_Bottom)
                    }
                }*/
                ptTextEdit->m_bRebuid = 0;
                //
                break;
            }
       }
    }

	guiExitWCS();
    return 1;
}
//==============================================================================
static int _guiTextEdit_DealOverlapChar(HNDL hTextEdit,BYTE *pChar)
{
    TTEXTEDIT     *ptTextEdit;
    TTEXTLINEINFO *pLineInfo;
    int  left=0,right=0,top=0,bottom=0;
    BYTE *Ptext=0;
    int  xPos,yPos;
    short i,nPos;
    WORD wCellLen;

	if(hTextEdit == NULL)
	{
        return STATUS_ERR;
    }

	ptTextEdit=(TTEXTEDIT *)hTextEdit;
    if(ptTextEdit->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
	{
	    return STATUS_ERR;
	}

    nPos = ptTextEdit->m_CursorPos;
    pLineInfo = &ptTextEdit->m_pLineInfo[ptTextEdit->m_CursorLineNum] ;
    /*tong
	if(pLineInfo->wLineIndex<0)
	{
		return STATUS_ERR;
	}
	*/
    Ptext = (BYTE*)ptTextEdit->m_pText;
    for(i=0;i<pLineInfo->wPs_Txt && *Ptext;i++,Ptext++);

    guiPushFont(ptTextEdit->base.font);
    guiGetCellChar((BYTE *)pChar,&wCellLen,ptTextEdit->m_CharGap);
    guiPopFont();

    if(ptTextEdit->m_bPassword && (ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE))
    {
        xPos = //ptTextEdit->m_init_LineSX+
            (pLineInfo->wCharCount+1)*(guiGetCharWidth(ptTextEdit->m_EchoChar)
            +ptTextEdit->m_CharGap);
    }
    else
        xPos = _guiText_GetWordIx(Ptext,pLineInfo->wCharCount,ptTextEdit->m_CharGap,0/*ptTextEdit->m_init_LineSX*/)+wCellLen;

    yPos = (ptTextEdit->m_CursorLineNum-ptTextEdit->m_TopLineNum+1)*ptTextEdit->m_LineHeight+ptTextEdit->m_Margin_Top+2;
    if(xPos>ptTextEdit->m_MaxWidth_Line/*(ptTextEdit->base.right-ptTextEdit->base.left-ptTextEdit->m_Margin_Right)*/)
    {
         if((ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE))
             return 1;

         if((!(ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE)) && (!ptTextEdit->m_bScrollEnable && !ptTextEdit->m_DynamicMax))
         {
            if(yPos>(ptTextEdit->base.bottom-ptTextEdit->base.top-ptTextEdit->m_Margin_Bottom-GET_CURSOR_HEIGHT(hTextEdit)+2))
            {
                return 1;
            }
         }
    }
	return 0;
}
//==============================================================================
static short _guiTextEdit_GetCursorPos(HNDL hTextEdit)
{
    TTEXTEDIT     *ptTextEdit;


	if(hTextEdit == NULL)
	{
    return STATUS_ERR;
    }

	ptTextEdit=(TTEXTEDIT *)hTextEdit;
    if(ptTextEdit->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
	{
	return STATUS_ERR;
	}

	return ptTextEdit->m_CursorPos;
}

//==================================================================
//return 1 chinese, 0 english, wCellLen get the lenght,3 0x0d 4 0x0a
static char guiGetCellChar( const BYTE *pText,WORD *wCellLen,WORD wCharGap)
{
	int len, count;
	BYTE *p;
    char iflag;

	len = 0;
	p = (BYTE *)pText;
	iflag = 0;
	count = 0;

	while(*(p))
	{
		if(*(p) == 0x0D )
        {
            len = 0;
            *wCellLen = len;
            return 3;
        }
        else if(*(p) == 0x0A)
        {
            len = 0;
            *wCellLen = len;
            return 4;
        }
        else if(*(p)=='\t')
        {
            *(p) = ' ';
        }

        if(iflag)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -