📄 medit.c
字号:
pLineData->lineNO = lineNO++;
}
pMLEditData->lines = lineNO;
if (dwStyle & ES_AUTOWRAP)
pMLEditData->linesDisp = MIN (pMLEditData->wraplines, pMLEditData->MaxlinesDisp);
else
pMLEditData->linesDisp = MIN (lineNO , pMLEditData->MaxlinesDisp);
pMLEditData->EndlineDisp = pMLEditData->StartlineDisp + pMLEditData->linesDisp -1;
}
PLINEDATA GetLineData(PMLEDITDATA pMLEditData,int lineNO)
{
PLINEDATA pLineData=pMLEditData->head;
for (; pLineData; pLineData=pLineData->next)
{
if(pLineData->lineNO==lineNO)
return pLineData;
}
return NULL;
}
int GetMaxLen (HWND hWnd, PMLEDITDATA pMLEditData)
{
int i;
PLINEDATA pLineData = pMLEditData->head;
i = 0;
while (pLineData)
{
edtGetLineInfo (hWnd, pLineData);
if (pMLEditData->sz.cx > i)
i = pMLEditData->sz.cx;
pLineData = pLineData->next;
}
return i;
}
// get the valid unit position in the array
// according to the pos
// which is relative to the original point of current line (0)
static int edtGetNewvPos (HWND hWnd, PLINEDATA pLineData , int pos)
{
int i = 0;
int dist = MAX_IMPOSSIBLE;
int newdist = 0;
PMLEDITDATA pMLEditData = (PMLEDITDATA) GetWindowAdditionalData2(hWnd);
edtGetLineInfo (hWnd, pLineData);
if (pos < 0) return -1;
if (pos > pMLEditData->sz.cx) return -2;
for (i=0; i<pMLEditData->fit_chars + 1; i++) {
newdist = pos - pMLEditData->dx_chars[i];
if (newdist > 0 && newdist < dist)
dist = newdist;
else
return i;
}
return 0;
}
static void edtSetScrollInfo (HWND hWnd, PMLEDITDATA pMLEditData, BOOL fRedraw)
{
SCROLLINFO si;
PLINEDATA pLineData;
RECT rc;
int viLn;
// Vscroll
GetClientRect (hWnd, &rc);
viLn = (rc.bottom - rc.top - pMLEditData->topMargin - pMLEditData->bottomMargin) / pMLEditData->lineHeight;
si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;
if ((GetWindowStyle(hWnd)) & ES_AUTOWRAP)
si.nMax = pMLEditData->wraplines - 1;
else
si.nMax = pMLEditData->lines - 1;
si.nMin = 0;
si.nPage = MIN (pMLEditData->EndlineDisp - pMLEditData->StartlineDisp + 1, viLn);
si.nPos = pMLEditData->StartlineDisp;
if ((si.nMax < viLn) && (!si.nPos)) {
si.nMax = 100;
si.nMin = 0;
si.nPage = 10;
si.nPos = 0;
SetScrollInfo (hWnd, SB_VERT, &si, fRedraw);
// EnableScrollBar (hWnd, SB_VERT, FALSE);
} else {
SetScrollInfo (hWnd, SB_VERT, &si, fRedraw);
// EnableScrollBar (hWnd, SB_VERT, TRUE);
}
if ((GetWindowStyle(hWnd)) & ES_AUTOWRAP)
{
EnableScrollBar (hWnd, SB_HORZ, FALSE);
return;
}
// Hscroll
pLineData = GetLineData(pMLEditData, pMLEditData->editLine);
si.nMax = GetMaxLen(hWnd, pMLEditData) - 1;
si.nMin = 0;
si.nPage = edtGetOutWidth (hWnd);
edtGetLineInfo (hWnd, pLineData);
si.nPos = pMLEditData->dispPos;
if (si.nMax < si.nPage && (!si.nPos)) {
si.nMax = 100;
si.nMin = 0;
si.nPage = 10;
si.nPos = 0;
SetScrollInfo (hWnd, SB_HORZ, &si, fRedraw);
// EnableScrollBar (hWnd, SB_HORZ, FALSE);
} else {
SetScrollInfo (hWnd, SB_HORZ, &si, fRedraw);
// EnableScrollBar (hWnd, SB_HORZ, TRUE);
}
}
int edtGetLineNums (PMLEDITDATA pMLEditData, int curline, int* line, int* wrapLine)
{
PLINEDATA pLineData = pMLEditData->head;
int startline = 0;
if (!curline)
{
*line = 0;
*wrapLine = 0;
return 0;
}
for (; pLineData; pLineData=pLineData->next)
{
if (startline+pLineData->nwrapline-1 >= curline)
{
*line = pLineData->lineNO;
*wrapLine = curline - startline;
return 0;
}
startline +=pLineData->nwrapline;
}
return -1;
}
// to set the Caret to a valid pos
BOOL edtGetCaretValid (HWND hWnd, int lineNO, int olddispPos, int newOff/*of caret*/)
{
int line, wrapline;
int dist = MAX_IMPOSSIBLE;
int i, newdist = 0;
PLINEDATA temp;
PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
if (GetWindowStyle(hWnd) & ES_AUTOWRAP)
{
edtGetLineNums (pMLEditData, lineNO, &line, &wrapline);
temp = GetLineData (pMLEditData, line);
edtGetLineInfo (hWnd, temp);
if( newOff >= pMLEditData->dx_chars[temp->wrapStartPos[wrapline+1]]
- pMLEditData->dx_chars[temp->wrapStartPos[wrapline]])
{
if (wrapline < temp->nwrapline-1)
pMLEditData->veditPos = temp->wrapStartPos[wrapline+1]-1;
else
pMLEditData->veditPos = temp->wrapStartPos[wrapline+1];
}else {
newOff += pMLEditData->dx_chars[temp->wrapStartPos[wrapline]];
for (i=temp->wrapStartPos[wrapline]; i<temp->wrapStartPos[wrapline+1]+1; i++) {
newdist = newOff - pMLEditData->dx_chars[i];
if (newdist > 0 && newdist < dist)
dist = newdist;
else {
pMLEditData->veditPos =i;
return FALSE;
}
}
}
}else {
temp = GetLineData (pMLEditData, lineNO);
edtGetLineInfo (hWnd, temp);
if( olddispPos > pMLEditData->sz.cx )
{
pMLEditData->veditPos = pMLEditData->fit_chars;
pMLEditData->vdispPos = edtGetStartDispPosAtEnd (hWnd, temp);
return TRUE;
}else {
pMLEditData->veditPos = edtGetNewvPos (hWnd, temp, newOff);
if (pMLEditData->veditPos == -2)
pMLEditData->veditPos = pMLEditData->fit_chars;
pMLEditData->vdispPos = edtGetNewvPos (hWnd, temp, olddispPos);
if (olddispPos != pMLEditData->dx_chars[pMLEditData->vdispPos])
return TRUE;
}
}
return FALSE;
}
void edtSetCaretPos (HWND hWnd)
{
int line = 0, wrapline = 0;
PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
PLINEDATA temp;
if (GetWindowStyle(hWnd) & ES_AUTOWRAP)
{
edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline);
temp = GetLineData (pMLEditData, line);
edtGetLineInfo (hWnd, temp);
SetCaretPos (hWnd,
pMLEditData->dx_chars[pMLEditData->veditPos]
- pMLEditData->dx_chars[temp->wrapStartPos[wrapline]]
+ pMLEditData->leftMargin,
(pMLEditData->editLine-pMLEditData->StartlineDisp) * pMLEditData->lineHeight
+ pMLEditData->topMargin);
}else {
temp = GetLineData (pMLEditData, pMLEditData->editLine);
edtGetLineInfo (hWnd, temp);
SetCaretPos (hWnd,
pMLEditData->dx_chars[pMLEditData->veditPos]
- pMLEditData->dx_chars[pMLEditData->vdispPos]
+ pMLEditData->leftMargin,
(pMLEditData->editLine-pMLEditData->StartlineDisp) * pMLEditData->lineHeight
+ pMLEditData->topMargin);
}
}
void edtPosProc (HWND hWnd)
{
int line, wrapline;
PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
PLINEDATA pLineData;
if (pMLEditData->diff) {
pMLEditData->editLine = pMLEditData->realeditLine;
pMLEditData->vdispPos = pMLEditData->realdispPos;
pMLEditData->dispPos = pMLEditData->dx_chars[pMLEditData->vdispPos];
pMLEditData->StartlineDisp = pMLEditData->realStartLine;
pMLEditData->EndlineDisp = pMLEditData->realEndLine;
pMLEditData->diff = FALSE;
if (GetWindowStyle(hWnd) & ES_AUTOWRAP)
{
edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline);
pLineData = GetLineData(pMLEditData, line);
}else
pLineData= GetLineData(pMLEditData, pMLEditData->editLine);
//FIXME
edtGetLineInfo (hWnd, pLineData);
ActiveCaret (hWnd);
pMLEditData->bSCROLL = TRUE;
}else
pMLEditData->bSCROLL = FALSE;
}
/* add end*/
static int edtOnCreate (HWND hWnd)
{
PMLEDITDATA pMLEditData = NULL;
DWORD dwStyle = GetWindowStyle(hWnd);
if (!(pMLEditData = malloc (sizeof (MLEDITDATA)))) {
return -1;
}
SetWindowAdditionalData2 (hWnd,(DWORD)pMLEditData);
pMLEditData->lineHeight = GetWindowFont (hWnd)->size;
if (dwStyle & ES_BASELINE)
pMLEditData->lineHeight += 2;
if (!CreateCaret (hWnd, NULL, 1, pMLEditData->lineHeight))
{
free (pMLEditData);
return -1;
}
pMLEditData->status = 0;
pMLEditData->curtotalLen = 0;
pMLEditData->totalLimit = 100*LEN_MLEDIT_BUFFER;
pMLEditData->lineLimit = LEN_MLEDIT_BUFFER;
pMLEditData->editLine = 0;
pMLEditData->veditPos = 0;
pMLEditData->dispPos = 0;
pMLEditData->vdispPos = 0;
pMLEditData->MaxlinesDisp = 0;
pMLEditData->linesDisp = 0;
pMLEditData->StartlineDisp = 0;
pMLEditData->EndlineDisp = 0;
MLEditInitBuffer (hWnd, pMLEditData, GetWindowCaption(hWnd), dwStyle);
#if 0
pMLEditData->selStartPos = 0;
pMLEditData->selEndPos = 0;
#endif
pMLEditData->passwdChar = '*';
pMLEditData->leftMargin = MARGIN_MEDIT_LEFT;
pMLEditData->topMargin = MARGIN_MEDIT_TOP;
pMLEditData->rightMargin = MARGIN_MEDIT_RIGHT;
pMLEditData->bottomMargin = MARGIN_MEDIT_BOTTOM;
pMLEditData->pos_chars = (int*)malloc(LEN_MLEDIT_BUFFER*sizeof(int));
pMLEditData->dx_chars = (int*)malloc(LEN_MLEDIT_BUFFER*sizeof(int));
memset (pMLEditData->pos_chars, 0, LEN_MLEDIT_BUFFER*sizeof(int));
memset (pMLEditData->dx_chars , 0, LEN_MLEDIT_BUFFER*sizeof(int));
pMLEditData->fit_chars = 0;
pMLEditData->realdispPos = 0;
pMLEditData->realStartLine = 0;
pMLEditData->realEndLine = 0;
pMLEditData->diff = FALSE;
pMLEditData->bSCROLL = FALSE;
pMLEditData->wraplines = 0;
//SetWindowAdditionalData2 (hWnd,(DWORD)pMLEditData);
return 0;
}
static void edtOnSizeChanged (HWND hWnd, RECT *clientRect)
{
DWORD dwStyle = GetWindowStyle(hWnd);
PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
pMLEditData->MaxlinesDisp = (RECTHP(clientRect) - pMLEditData->topMargin
- pMLEditData->bottomMargin)
/ pMLEditData->lineHeight;
if (pMLEditData->MaxlinesDisp < 0)
pMLEditData->MaxlinesDisp = 0;
if (dwStyle & ES_AUTOWRAP && pMLEditData->head)
{
PLINEDATA pLineData = pMLEditData->head;
pMLEditData->wraplines = 0;
for (; pLineData; pLineData = pLineData->next)
{
calcLineInfo (hWnd, pMLEditData, pLineData);
pMLEditData->wraplines += pLineData->nwrapline;
}
}
if (dwStyle & ES_AUTOWRAP)
pMLEditData->linesDisp = MIN (pMLEditData->MaxlinesDisp, pMLEditData->wraplines);
else
pMLEditData->linesDisp = MIN (pMLEditData->MaxlinesDisp, pMLEditData->lines);
pMLEditData->StartlineDisp = 0;
pMLEditData->EndlineDisp = pMLEditData->StartlineDisp + pMLEditData->linesDisp - 1;
pMLEditData->editLine = 0;
pMLEditData->dispPos = 0;
edtSetScrollInfo (hWnd, pMLEditData, TRUE);
}
static void edtOnPaint (HWND hWnd)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -