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

📄 uitextedit.c

📁 嵌入工linux开发的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
		{
			count++;
			len += guiGetWordWidth()+wCharGap;
            break;
		}
		else
		{
			if(*p<0x80)
			{
				len += guiGetCharWidth(*p)+wCharGap;
				count++;
                break;
			}
			else
			{
				iflag = 1;
                p++;
			}
		}
	}
    *wCellLen = len;
	return(iflag);
}

//=================================================================
static short _guiText_GetWordIx(const BYTE *pText,WORD Index,WORD wCharGap,WORD wStartx)
{
    short i;
    BYTE *pchar;
    WORD Ret=0,wWordWidth=0;
    char iflag=0;

//    if(pchar == 0 ) return -1;
    pchar = (BYTE*)pText;

    for(i=0;i<=Index ;)
    {
        if(*pchar==13 || *pchar==10)
            pchar++;
        if(i==0)
            Ret = wStartx;
        else
            Ret +=wWordWidth;

        iflag = guiGetCellChar( pchar,&wWordWidth, wCharGap);
        if(iflag ==0) { i++;pchar++;}
        if(iflag==1)  {i+=2;pchar++;pchar++;}
    }

    return Ret;
}
//=================================================================
static int _guiAdjustText(HNDL hTextEdit)  //ok
{
    TTEXTEDIT  *ptTextEdit;
    WORD       left=0,right=0,top=0,bottom=0,wBeginPos;
    short      nheight=0,old_ln;


	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_bReadOnly)
        ptTextEdit->m_CaretWidth = CURSOR_WIDTH;
    else ptTextEdit->m_CaretWidth = 0;
    if(ptTextEdit->m_pLineInfo == NULL)
    {
		guiExitWCS();
	    return STATUS_ERR;
	}
    left = 0;
    right = ptTextEdit->base.right-ptTextEdit->base.left;
    top = 0;
    bottom = ptTextEdit->base.bottom - ptTextEdit->base.top;

    if(ptTextEdit->m_bScrollActive && ptTextEdit->m_bScrollEnable)
        ptTextEdit->m_MaxWidth_Line = ptTextEdit->base.right - ptTextEdit->base.left+1
                        -ptTextEdit->m_Margin_Left-ptTextEdit->m_Margin_Right-_SCROLLBAR_WIDTH_-ptTextEdit->m_CaretWidth;

    else
        ptTextEdit->m_MaxWidth_Line = ptTextEdit->base.right - ptTextEdit->base.left+1
                        -ptTextEdit->m_Margin_Left-ptTextEdit->m_Margin_Right-ptTextEdit->m_CaretWidth;

    wBeginPos = ptTextEdit->base.bottom;
    old_ln = ptTextEdit->m_LineCount;
    guiPushFont(ptTextEdit->base.font) ;
    //dynamic adjust bottom
    if(ptTextEdit->m_DynamicMax && (!(ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE)))
    {
        if(_guiDealText( hTextEdit,0) == STATUS_ERR)
        {
		    guiExitWCS();
	        return STATUS_ERR;
	    }
        if(old_ln > ptTextEdit->m_LineCount)
        if(guiControl_QueryIsVisible(hTextEdit))
        {
            guiCaret_Hide(  );
            guiClearBlock(hTextEdit, left,top,right,bottom,GUI_WHITE,REPLACE_STYLE);
        }
        if(ptTextEdit->m_LineCount < ptTextEdit->m_DynamicMax)
        {

            if(ptTextEdit->m_LineCount>=ptTextEdit->m_init_LineCount)
                ptTextEdit->base.bottom = ptTextEdit->base.top + ptTextEdit->m_LineCount*ptTextEdit->m_LineHeight+ptTextEdit->m_Margin_Top+ptTextEdit->m_Margin_Bottom+1;
        }
        else
        {
            ptTextEdit->base.bottom = ptTextEdit->base.top +ptTextEdit->m_DynamicMax*ptTextEdit->m_LineHeight
                                                         +ptTextEdit->m_Margin_Top+ptTextEdit->m_Margin_Bottom+2;

        }
        ((TGUISCROLL *)ptTextEdit->m_VScroll)->base.bottom = ptTextEdit->base.top +ptTextEdit->m_DynamicMax*ptTextEdit->m_LineHeight-1
                                                        +ptTextEdit->m_Margin_Top+ptTextEdit->m_Margin_Bottom+1;
    }
    if(_guiDealText( hTextEdit,0) == STATUS_ERR)
    {
		guiExitWCS();
	    return STATUS_ERR;
	}

    if((ptTextEdit->m_DynamicMax && ptTextEdit->m_LineCount > ptTextEdit->m_DynamicMax)
        || (!ptTextEdit->m_DynamicMax && ptTextEdit->m_LineCount >((ptTextEdit->base.bottom - ptTextEdit->base.top +1-ptTextEdit->m_Margin_Top-ptTextEdit->m_Margin_Bottom)/ptTextEdit->m_LineHeight) )
        && (!(ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE)) && ptTextEdit->m_bScrollEnable)
    {
        ptTextEdit->m_bScrollActive = 1;
    }
    else
    {
        ptTextEdit->m_bScrollActive = 0;
        ptTextEdit->m_TopLineNum = 0;
    }

    if(ptTextEdit->m_bScrollActive && ptTextEdit->m_bScrollEnable)
        ptTextEdit->m_MaxWidth_Line = ptTextEdit->base.right - ptTextEdit->base.left+1
                        -ptTextEdit->m_Margin_Left-ptTextEdit->m_Margin_Right-_SCROLLBAR_WIDTH_-ptTextEdit->m_CaretWidth;

    else
        ptTextEdit->m_MaxWidth_Line = ptTextEdit->base.right - ptTextEdit->base.left+1
                        -ptTextEdit->m_Margin_Left-ptTextEdit->m_Margin_Right-ptTextEdit->m_CaretWidth;

   if(_guiDealText( hTextEdit,1) == STATUS_ERR)
    {
		guiExitWCS();
	    return STATUS_ERR;
	}

    //adjust vport

    if((!(ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE)) && ptTextEdit->m_DynamicMax)
        if(ptTextEdit->base.bottom != wBeginPos)
        {
            if(ptTextEdit->base.vportHandle)
            {
                nheight = ptTextEdit->base.bottom - wBeginPos;
                if(nheight>=ptTextEdit->m_LineHeight ||nheight<=(0-ptTextEdit->m_LineHeight) )
                guiViewport_MoveControlFromPos(ptTextEdit->base.vportHandle,wBeginPos,nheight,VPORT_V_SCROLLBAR);
            }
        }
        guiPopFont();
    guiExitWCS();
    return 1;
}

//==================================================================
static BOOL _guiText_WordWrap(const BYTE *pszstr,short *nCount,const short nCharGap,const short nLimitWidth,const short nVisibleMax)  //ok
{
    BYTE *pstr;
    char iFlag,ikFlag=0;
    WORD wCellLen=0;
    WORD i=0,nWordLen=0;

	pstr = (BYTE *)pszstr;
    i = 0;
    if(*pstr=='\r'||*pstr == '\n'||*pstr == ' ' || *pstr =='\t'|| *pstr =='\0')
        return 0;

    while(pstr && *pstr)
    {
        if(*pstr=='\r'||*pstr == '\n'|| *pstr =='\0')
            break;
        if(*pstr =='\t' || *pstr ==' ')
            ikFlag = 1;
        iFlag = guiGetCellChar( pstr,&wCellLen,nCharGap);
        if(iFlag==0 )
        {
            i++;
            pstr++;
            nWordLen += wCellLen;
        }
        else if(iFlag==1)
        {
            i++;
            i++;
            pstr++;
            pstr++;
            nWordLen += wCellLen;
        }
        if(ikFlag == 1)
            break;

    }
    *nCount = i;
    if(nWordLen>nVisibleMax)
        return 0;
    return ((nWordLen-nCharGap) > nLimitWidth? 1:0);

}

//==================================================================
static int _guiDealText(HNDL hTextEdit,BOOL bMalloc)  //ok
{
    TTEXTEDIT  *ptTextEdit;
    //TTEXTLINEINFO *ptTxtInfo,*pInfo;
    int itemplen,i;
    WORD wCellLen,wLineCellCount,wpsNextline=0,wStartPos;
    WORD  left=0,right=0,top=0,bottom=0;
    char iFlag,bWrap=0;
    BYTE *pCh;
    short nStrCut=0;
    short nLimitWidth,nWrapCount=0;
    short  nSx=0;
    short  nStrWidth_LINE=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_pLineInfo == NULL)
    {
		guiExitWCS();
	    return STATUS_ERR;
	}
    left = 0;
    right = ptTextEdit->base.right-ptTextEdit->base.left;
    top = 0;
    bottom = ptTextEdit->base.bottom - ptTextEdit->base.top;

    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;
    i=0;
    ptTextEdit->m_pLineInfo[0].wLineIndex = 0;
    ptTextEdit->m_LineCount = 1;
    ptTextEdit->m_init_LineSX = ptTextEdit->m_CaretWidth + ptTextEdit->m_Margin_Left;
    wStartPos = ptTextEdit->m_init_LineSX;
    itemplen = strlen(ptTextEdit->m_pText);

    pCh = (BYTE *)ptTextEdit->m_pText;
    ptTextEdit->m_TxtLength = 0;
    wLineCellCount = 0;

    if((ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE))
    {
        if(ptTextEdit->m_bPassword && (ptTextEdit->base.style & TEXTEDIT_SINGLE_LINE))
        {
            nStrWidth_LINE = (strlen(ptTextEdit->m_pText))*(guiGetCharWidth(ptTextEdit->m_EchoChar)
                +ptTextEdit->m_CharGap);
        }
        else
            nStrWidth_LINE = _guiText_GetWordIx((BYTE*)ptTextEdit->m_pText,sizeof(ptTextEdit->m_pText),ptTextEdit->m_CharGap,0);
        if(ptTextEdit->m_Alignment == ALIGNMENT_CENTER)
        {
             //if(nStrWidth_LINE < ptTextEdit->m_MaxWidth_Line)
             ptTextEdit->m_init_LineSX = getAlignCenter(ptTextEdit->m_CaretWidth + ptTextEdit->m_Margin_Left, right-ptTextEdit->m_Margin_Right, nStrWidth_LINE)-1;

        }
        else if(ptTextEdit->m_Alignment == ALIGNMENT_RIGHT)
        {
            //if(nStrWidth_LINE < ptTextEdit->m_MaxWidth_Line)
                ptTextEdit->m_init_LineSX = getAlignRight(left+ptTextEdit->m_Margin_Left,right-ptTextEdit->m_Margin_Right, nStrWidth_LINE);

        }
        wStartPos = ptTextEdit->m_init_LineSX;
        for(i = 0;i<=ptTextEdit->m_MaxLength;i++)
        {
            if(ptTextEdit->m_TxtLength>=ptTextEdit->m_MaxLength
                    || i>=itemplen
                    || wStartPos > ptTextEdit->m_MaxWidth_Line
                    ||*(pCh)=='\0')
            {
                ptTextEdit->m_pLineInfo[0].wPs_Txt = 0;
                ptTextEdit->m_CursorLineNum =0;
                break;
            }
            if(wLineCellCount==0)
                wStartPos = ptTextEdit->m_init_LineSX;
            else //if(wLineCellCount >= 1)
                wStartPos += wCellLen;
            iFlag = guiGetCellChar( pCh,&wCellLen,ptTextEdit->m_CharGap);
            if(ptTextEdit->m_bPassword && iFlag == 0)
            {
                wCellLen = guiGetCharWidth(ptTextEdit->m_EchoChar);
            }
            if(iFlag == 0)
            {
                pCh++;
                ptTextEdit->m_TxtLength++;
                ptTextEdit->m_pLineInfo[0].wCharCount++;
                //ptTextEdit->m_pLineInfo[0].wWordCount++;
            }
            else if(iFlag == 1)
            {
                pCh+=2;
                ptTextEdit->m_TxtLength+=2;
                ptTextEdit->m_pLineInfo[0].wCharCount +=2;
                //ptTextEdit->m_pLineInfo[0].wWordCount++;

            }
            else if(iFlag == 3||iFlag == 4)
            {
                pCh++;
                ptTextEdit->m_TxtLength++;
                continue;
            }

            wLineCellCount++;
        }

    }
    else //mult line
    {

        nLimitWidth = ptTextEdit->m_MaxWidth_Line;
        for(i = 0; ;i++)
        {
            if(ptTextEdit->m_TxtLength>=(ptTextEdit->m_MaxLength) ||*(pCh)==0 || ptTextEdit->m_TxtLength>itemplen)
            {

                if(ptTextEdit->m_pLineInfo[ptTextEdit->m_LineCount-1].wLineIndex == 0)
                    ptTextEdit->m_pLineInfo[ptTextEdit->m_LineCount-1].wPs_Txt = 0;
                else
                    ptTextEdit->m_pLineInfo[ptTextEdit->m_LineCount-1].wPs_Txt = wpsNextline;
                wpsNextline = ptTextEdit->m_TxtLength;
                if(ptTextEdit->m_CursorPos>=ptTextEdit->m_pLineInfo[ptTextEdit->m_LineCount-1].wPs_Txt
                    && ptTextEdit->m_CursorPos<=(ptTextEdit->m_pLineInfo[ptTextEdit->m_LineCount-1].wPs_Txt+ptTextEdit->m_pLineInfo[ptTextEdit->m_LineCount-1].wCharCount))
                {
                    ptTextEdit->m_CursorLineNum = ptTextEdit->m_pLineInfo[ptTextEdit->m_LineCount-1].wLineIndex;
                }
                if(wLineCellCount==0)
                    wStartPos = ptTextEdit->m_init_LineSX;
                else //if(wLineCellCount >= 1)
                    wStartPos += wCellLen;
                break;
            }
            if(nWrapCount<0) nWrapCount = 0;
            if(ptTextEdit->m_bWordWrap && !nWrapCount)
            {
                bWrap = _guiText_WordWrap(pCh,&nWrapCount,ptTextEdit->m_CharGap, nLimitWidth,ptTextEdit->m_MaxWidth_Line);
                if(bWrap==1 && nWrapCount)
                {
                    if(ptTextEdit->m_pLineInfo[ptTextEdit->m_LineCount-1].wLineIndex == 0)
                        ptTextEdit->m_pLineInfo[ptTextEdit->m_LineCount-1].wPs_Txt = 0;
                    else
                        ptTextEdit->m_pLineInfo[ptTextEdit->m_LineCount-1].wPs_Txt = wpsNextline;
                    wpsNextline = ptTextEdit->m_TxtLength;
                    if(ptTextEdit->m_CursorPos>=ptTextEdit->m_pLineInfo[ptTextEdit->m_LineCount-1].wPs_Txt
                        && ptTextEdit->m_CursorPos<=(ptTextEdit->m_pLineInfo[ptTextEdit->m_LineCount-1].wPs_Txt+ptTextEdit->m_pLineInfo[ptTextEdit->m_LineCount-1].wCharCount))
                    {
                        ptTextEdit->m_CursorLineNum = ptTextEdit->m_pLineInfo[ptTextEdit->m_LineCount-1].wLineIndex;
                    }
                   // ptTxtInfo->wStartPos[wLineCellCount] = ptTxtInfo->wStartPos[wLineCellCount-1]
				//										    + ptTxtInfo->wCharLen[wLineCellCount-1];


                    wLineCellCount = 0;
                    ptTextEdit->m_pLineInfo[ptTextEdit->m_LineCount].wLineIndex = ptTextEdit->m_LineCount;

                    if((ptTextEdit->m_LineCount+1)>ptTextEdit->m_buff_LineCount)
                    {
                         guiExitWCS() ;
	                     return 1;
                    }
                    ptTextEdit->m_LineCount ++;
                    nLimitWidth = ptTextEdit->m_MaxWidth_Line;
                    bWrap = 0;

                    continue;
                }
            }

            iFlag = guiGetCellChar( pCh,&wCellLen,ptTextEdit->m_CharGap);
            if(iFlag == 0)
            {
                pCh++;
                ptTextEdit->m_TxtLength++;
                ptTextEdit->m_pLineInfo[ptTextEdit->m_LineCount-1].wCharCount++;

                nLimitWidth -= wCellLen;
                nWrapCount--;
            }
            else if(iFlag == 1)
            {
                pCh+=2;
                ptTextEdit->m_TxtLength+=2;
                ptTextEdit->m_pLineInfo[ptTextEdit->m_LineCount-1].wCharCount+=2;

                nLimitWidth -= wCellLen;
                nWrapCount--;
                nWrapCount--;
            }

            if(iFlag == 1 || iFlag == 0)
            {

				//ptTextEdit->m_pLineInfo[ptTextEdit->m_LineCount-1].wWordCount++;
                if(wLineCellCount==0)
                    wStartPos = ptTextEdit->m_init_LineSX;
                else //if(wLineCellCount >= 1)
                    wStartPos += wCellLen;

                //feed line for full line
                if((wStartPos+wCellLen)>ptTextEdit->m_MaxWidth_Line )
                {

                    if(iFlag == 1) nStrCut = 2;
                    else           nStrCut = 1;

                    if(ptTextEdit->m_pLineInfo[ptTextEdit->m_LineCount-1].wLineIndex == 0)
                        ptTextEdit->m_pLineInfo[ptTextEdit->m_LineCount-1].wPs_Txt = 0;
                    else
                        ptTextEdit->m_pLineInfo[ptTextEdit->m_LineCount-1].wPs_Txt = wpsNextline;
                    ptTextEdit->m_TxtLength -=nStrCut;
                    wpsNextline = ptTextEdit->m_TxtLength;
                    ptTextEdit->m_pLineInfo[ptText

⌨️ 快捷键说明

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