📄 mledit.c
字号:
edtScanCodeEnd( HWND hWnd){ char pStrDisp[LEN_MLEDIT_LINEBUFFER]; PMLEditData pEditData; PLineData pLineData; int iLineNumber; int x, y; int iStartPos; PWindowsTree pWin; pWin = (PWindowsTree)hWnd; pEditData = (PMLEditData)pWin->dwData; iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos; if(!edtGetBoxTopLineInfo(pEditData,&pLineData,&iStartPos)) return false; if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp)) return false; pEditData->iCaretXPos = strlen(pStrDisp); edtSetEditPos(hWnd); edtCalCaretPos(hWnd,&x,&y); SetCaretPos(hWnd,x,y); return true;}//==================== LEFT ========================static BOOLedtScanCodeLeft( HWND hWnd){ char pStrDisp[LEN_MLEDIT_LINEBUFFER]; int x, y; PMLEditData pEditData; PLineData pLineData; int iStartPos, iLineNumber; BOOL bScroll; PWindowsTree pWin; pWin = (PWindowsTree)hWnd; bScroll = false; pEditData = (PMLEditData)pWin->dwData; if(!pEditData) return false; //get string if(!edtGetBoxTopLineInfo(pEditData,&pLineData, &iStartPos)) return false; iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos; if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp)) return false; if(pEditData->iCaretXPos != 0){ if(edtIsACCharBeforePos(pStrDisp + pEditData->iCaretXPos)) pEditData->iCaretXPos -= 2; else pEditData->iCaretXPos -= 1; } else{//have to move caret to the previous line if(iLineNumber == pEditData->iDispPos){//caret at top line of the editbox if(pEditData->iDispPos == 0) return true; else{ pEditData->iDispPos -- ; if(!edtGetBoxTopLineInfo(pEditData, &pLineData, &iStartPos)) return false; iLineNumber = pEditData->iDispPos; if(!edtGetDispString(&pLineData, iLineNumber, pStrDisp)) return false; pEditData->iCaretXPos = strlen(pStrDisp); bScroll = true; } } else{//caret not at top line of the editbox pEditData->iCaretYPos -- ; //if(!edtGetBoxTopLineInfo(pEditData,&pLineData,&iStartPos)) // return false; iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos; if(!edtGetDispString(&pLineData, iLineNumber, pStrDisp)) return false; pEditData->iCaretXPos = strlen(pStrDisp); } } if(bScroll){ edtReCalTopLine(hWnd); edtSetVScrollInfo(hWnd, pEditData, true); InvalidateRect(hWnd,NULL,true); } edtSetEditPos(hWnd); edtCalCaretPos(hWnd,&x,&y); SetCaretPos(hWnd,x,y); return true;}//==================== RIGHT========================static BOOLedtScanCodeRight( HWND hWnd){ int x,y; char pStrDisp[LEN_MLEDIT_LINEBUFFER]; PMLEditData pEditData; PLineData pLineData; int iStartPos; int iLineNumber; PWindowsTree pWin; pWin = (PWindowsTree)hWnd; BOOL bScroll; bScroll = false; pEditData = (PMLEditData)(pWin->dwData); if(!pEditData) return false; //get string if(!edtGetBoxTopLineInfo(pEditData,&pLineData, &iStartPos)) return false; iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos; if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp)) return false; if(pEditData->iCaretXPos == (int)strlen(pStrDisp)){//move to next line if(pEditData->iDispPos + pEditData->iCaretYPos + 1 >= pEditData->iTotalLines) return true;//already at the end else{ pEditData->iCaretXPos = 0; if(pEditData->iCaretYPos + 2 > pEditData->iDispLines){ //pEditData->iCaretYPos += 1; //don't increase the value of caret y pos pEditData->iDispPos += 1; bScroll = true; } else pEditData->iCaretYPos += 1; } } else{ if(edtIsACChar(pEditData->pEditPos)) pEditData->iCaretXPos += 2; else pEditData->iCaretXPos += 1; } if(bScroll){ edtReCalTopLine(hWnd); edtSetVScrollInfo(hWnd, pEditData, true); InvalidateRect(hWnd,NULL,true); } edtSetEditPos(hWnd); edtCalCaretPos(hWnd,&x,&y); SetCaretPos(hWnd,x,y); return true;}static BOOLedtReCalCaretXPos( PMLEditData pEditData, int iPrevCaretYPos, int *px){ char pStrDisp[LEN_MLEDIT_LINEBUFFER]; int iLineNumber, iStartPos; PLineData pLineData; int iCharNumber, iByteNumber; int x; //get string if(!edtGetBoxTopLineInfo(pEditData,&pLineData, &iStartPos)) return false; iLineNumber = pEditData->iDispPos + iPrevCaretYPos; if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp)) return false; //Get character number iCharNumber = iByteNumber = 0; while(iByteNumber < pEditData->iCaretXPos){ if(edtIsACChar(pStrDisp + iCharNumber)) iByteNumber += 2; else iByteNumber += 1; iCharNumber += 1; } iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos; if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp)) return false; x = iByteNumber = 0; while(x < iCharNumber){ if(!*(pStrDisp + iByteNumber)) break; if(edtIsACChar(pStrDisp + iByteNumber)) iByteNumber += 2; else iByteNumber += 1; x += 1; } *px = iByteNumber; return true;}static BOOLedtReCalCaretXPosNoRef( PMLEditData pEditData, int *px){ char pStrDisp[LEN_MLEDIT_LINEBUFFER]; int iLineNumber, iStartPos; PLineData pLineData; int x; //get string if(!edtGetBoxTopLineInfo(pEditData,&pLineData, &iStartPos)) return false; iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos; if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp)) return false; x = 0; while(x < pEditData->iCaretXPos){ if(!*(pStrDisp + x)) break; if(edtIsACChar(pStrDisp + x)) x += 2; else x += 1; } *px = x; return true;}//==================== UP ========================static BOOLedtScanCodeUp( HWND hWnd){ int x,y; PMLEditData pEditData; PWindowsTree pWin; pWin = (PWindowsTree)hWnd; BOOL bScroll; bScroll = false; pEditData = (PMLEditData)(pWin->dwData); if(!pEditData) return false; if(pEditData->iCaretYPos == 0){//at top line of edit box if(pEditData->iDispPos == 0) return true; else{ pEditData->iDispPos -- ; bScroll = true; } } else{ pEditData->iCaretYPos -- ; } //recalculate caret x position if(!edtReCalCaretXPos(pEditData, pEditData->iCaretYPos + 1, &x)) return false; pEditData->iCaretXPos = x; if(bScroll){ edtReCalTopLine(hWnd); edtSetVScrollInfo(hWnd, pEditData, true); InvalidateRect(hWnd,NULL,true); } edtSetEditPos(hWnd); edtCalCaretPos(hWnd,&x,&y); SetCaretPos(hWnd,x,y); return true;}//==================== Down ========================static BOOLedtScanCodeDown( HWND hWnd){ int x,y; PMLEditData pEditData; PWindowsTree pWin; pWin = (PWindowsTree)hWnd; BOOL bScroll; bScroll = false; pEditData = (PMLEditData)(pWin->dwData); if(!pEditData) return false; if(pEditData->iCaretYPos + 2 > pEditData->iDispLines){//caret at bottom of the edit box if(pEditData->iDispPos + pEditData->iCaretYPos + 1 >= pEditData->iTotalLines) return true;//already at the end else{ pEditData->iDispPos += 1; bScroll = true; } } else{//caret not at bottom of the edit box pEditData->iCaretYPos += 1; } //recalculate caret x position if(!edtReCalCaretXPos(pEditData, pEditData->iCaretYPos - 1, &x)) return false; pEditData->iCaretXPos = x; if(bScroll){ edtReCalTopLine(hWnd); edtSetVScrollInfo(hWnd, pEditData, true); InvalidateRect(hWnd,NULL,true); } edtSetEditPos(hWnd); edtCalCaretPos(hWnd,&x,&y); SetCaretPos(hWnd,x,y); return true;}//==================== Ins ========================static BOOLedtScanCodeIns( HWND hWnd){ PMLEditData pEditData; PWindowsTree pWin; pWin = (PWindowsTree)hWnd; pEditData = (PMLEditData)pWin->dwData; if(!pEditData) return false; pEditData->dwStatus ^= EST_REPLACE; return true;}static BOOLedtReIndexDataAfterDelWrapLine( PMLEditData pEditData, PLineData pCurLineData){ pCurLineData->iWrapLineNumber -= 1; pCurLineData->WrapStartPos[pCurLineData->iWrapLineNumber] = 0; pEditData->iTotalLines -= 1; pCurLineData = pCurLineData->pNext; while(pCurLineData){ pCurLineData->iLineNumber -= 1; pCurLineData = pCurLineData->pNext; } return true;}static BOOLedtReIndexDataAfterDelChar( PMLEditData pEditData, PLineData pCurLineData){ PLineData pLineData; int iWrapLines; char* pLine; int iChars, iPos; int iDecrease; pLine = pCurLineData->pString; iChars = 0; iWrapLines = 0; iPos = 0; while(*pLine){ if(edtIsACChar(pLine)){ iChars += 2; if(iChars > pEditData->iDispChars){ pCurLineData->WrapStartPos[iWrapLines] = iPos; iWrapLines ++; iChars = 2; } iPos += 2; pLine += 2; } else { iChars += 1; if(iChars > pEditData->iDispChars){ pCurLineData->WrapStartPos[iWrapLines] = iPos; iWrapLines ++; iChars = 1; } iPos += 1; pLine += 1; } } if(iWrapLines != pCurLineData->iWrapLineNumber){ iDecrease = pCurLineData->iWrapLineNumber - iWrapLines; pCurLineData->iWrapLineNumber = iWrapLines; pLineData = pCurLineData->pNext; while(pLineData){ pLineData->iLineNumber -= iDecrease; pLineData = pLineData->pNext; } pEditData->iTotalLines -= iDecrease; } return true;}//recalculate pCurLineData line wrap position//and recode the line numberstatic BOOLedtReIndexDataAfterDelLine( PMLEditData pEditData, PLineData pCurLineData){ PLineData pLineData; int iChars, iWrapLines, iPos; char* pLine; int iDecrease; //recalculate pCurLinedata line wrap position pLine = pCurLineData->pString; iChars = 0; iWrapLines = 0; iPos = 0; while(*pLine){ if(edtIsACChar(pLine)){ iChars += 2; if(iChars > pEditData->iDispChars){ pCurLineData->WrapStartPos[iWrapLines] = iPos; iWrapLines ++; iChars = 2; } iPos += 2; pLine += 2; } else { iChars += 1; if(iChars > pEditData->iDispChars){ pCurLineData->WrapStartPos[iWrapLines] = iPos; iWrapLines ++; iChars = 1; } iPos += 1; pLine += 1; } } pCurLineData->iWrapLineNumber = iWrapLines; pLineData = pCurLineData->pNext; if(!pLineData){ pEditData->iTotalLines = pCurLineData->iLineNumber + pCurLineData->iWrapLineNumber + 1; return true; } iDecrease = pLineData->iLineNumber - (pCurLineData->iLineNumber + pCurLineData->iWrapLineNumber + 1); if(!iDecrease) return true; while(pLineData){ pLineData->iLineNumber -= iDecrease; pLineData = pLineData->pNext; } pEditData->iTotalLines -= iDecrease; return true;}static BOOLedtCombineAdjLine( PMLEditData pEditData, PLineData pLineData){ PLineData pNextLineData; pNextLineData = pLineData->pNext; if(!pNextLineData) return false; if(pNextLineData->pNext){//pNextLineData is not the end of the link table pLineData->pNext = pNextLineData->pNext; pNextLineData->pNext->pPrev = pLineData; } else{//pNextLineData is at the end of the link table pLineData->pNext = NULL; } strcat(pLineData->pString, pNextLineData->pString); free(pNextLineData); edtReIndexDataAfterDelLine(pEditData,pLineData); return true;}//==================== Del ========================static BOOLedtScanCodeDel( HWND hWnd){ int iStartPos; char pStrDisp[LEN_MLEDIT_LINEBUFFER]; char* pString; int iLineNumber, iLen; int x, y; int iWinHeight, iWinWidth; RECT rtInvalid; PMLEditData pEditData; PLineData pLineData, pPrevLineData; PWindowsTree pWin; pWin = (PWindowsTree)hWnd; BOOL bChange; BOOL bScroll; bChange = false; bScroll = false; pEditData = (PMLEditData)(pWin->dwData); if(!pEditData) return false; if(!edtGetCurLineData(pEditData,&pLineData)) return false; if(edtIsCaretAtLineEnd(pEditData)){ if(!pLineData->pNext){//at the end of all text if(strlen(pLineData->pString)==0){ //if it's not the last left line, remove it pPrevLineData = pLineData->pPrev; if(pPrevLineData){ if(pEditData->pDispPointer == pLineData) pEditData->pDispPointer = pPrevLineData; pPrevLineData->pNext = NULL; free(pLineData); pLineData = NULL; pEditData->iTotalLines -= 1; } //process caret position if(pEditData->iCaretYPos){ pEditData->iCaretYPos -= 1; if(!edtGetBoxTopLineInfo(pEditData,&pLineData,&iStartPos)) return false; iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos; if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp)) return false; pEditData->iCaretXPos = strlen(pStrDisp); } else{//caret at top line of the box if(pEditData->iDispPos){ pEditData->iDispPos --; bScroll = true; if(!edtGetBoxTopLineInfo(pEditData,&pLineData,&iStartPos)) return false; iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos; if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp)) return false; pEditData->iCaretXPos = strlen(pStrDisp); } else{//this is the last left line. //no action } } } } else{//not at the end of all text //combine the next line to the current line edtCombineAdjLine(pEditData, pLineData); } } else{//not at line end //delete a character at current position pString = pEditData->pEditPos; if(edtIsACChar(pString)) iLen = 2; else iLen = 1; while(1){ *pString = *(pString+iLen); if(!*(pString+iLen)) break; pString ++; } pEditData->iTotalLen -= iLen; iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos; if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp)) return false; if(strlen(pStrDisp) == 0){ if((pEditData->iDispPos + pEditData->iCaretYPos + 1 == pEditData->iTotalLines) && (strlen(pLineData->pString) !=0 )){//for caret y pos beyond the text content scale //move caret to end of upper line //but if current pLineData is empty after del this character, //reserver this empty line and do not move caret to the upper line if(pEditData->iCaretYPos){ pEditData->iCaretYPos --; } else if(pEditData->iDispPos){ pEditData->iDispPos -= 1; bScroll = true; } iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos; if(!edtGetBoxTopLineInfo(pEditData,&pLineData,&iStartPos)) return false; if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -