📄 uitextedit.c
字号:
{
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 + -