📄 medit.c
字号:
if (pMLEditData->veditPos == pMLEditData->fit_chars) // end of the paragraph
{
bScroll = TRUE;
if (pMLEditData->editLine == pMLEditData->wraplines-1) return 0;
temp = pLineData->next;
pMLEditData->wraplines -= pLineData->nwrapline;
pMLEditData->curtotalLen --;
if (temp)
pMLEditData->wraplines -= pLineData->next->nwrapline;
if(pLineData->dataEnd + temp->dataEnd <= LEN_MLEDIT_BUFFER)
{
memcpy(pLineData->buffer+pLineData->dataEnd,temp->buffer,temp->dataEnd);
pLineData->dataEnd += temp->dataEnd;
pLineData->buffer[pLineData->dataEnd] = '\0';
if(temp->next)
{
pLineData->next = temp->next;
temp->next->previous = pLineData;
}
else
pLineData->next = NULL;
free(temp);
temp = pLineData->next;
while (temp)
{
temp->lineNO--;
temp = temp->next;
}
edtGetLineInfo (hWnd, pLineData);
}
else if (temp->dataEnd > 0)
{
leftLen = LEN_MLEDIT_BUFFER - pLineData->dataEnd;
memcpy(pLineData->buffer+pLineData->dataEnd,temp->buffer,leftLen);
pLineData->dataEnd +=leftLen;
pLineData->buffer[pLineData->dataEnd] = '\0';
memcpy(temp->buffer,temp->buffer+leftLen,temp->dataEnd-leftLen);
temp->dataEnd -= leftLen;
temp->buffer[temp->dataEnd] = '\0';
}
calcLineInfo (hWnd, pMLEditData, pLineData);
edtGetLineInfo (hWnd, pLineData);
pMLEditData->lines--;
pMLEditData->wraplines += pLineData->nwrapline;
}else {
deleted = pMLEditData->pos_chars[pMLEditData->veditPos + 1]
- pMLEditData->pos_chars[pMLEditData->veditPos];
pMLEditData->curtotalLen -= deleted;
for (i = pMLEditData->pos_chars[pMLEditData->veditPos];
i < pLineData->dataEnd - deleted;
i++)
pLineData->buffer [i]
= pLineData->buffer [i + deleted];
pLineData->dataEnd -= deleted;
if (pLineData->dataEnd == 0) {
pMLEditData->fit_chars = 0;
pMLEditData->pos_chars[0] = 0;
pMLEditData->dx_chars[0] = 0;
}
pLineData->buffer[pLineData->dataEnd] = '\0';
pMLEditData->wraplines -= pLineData->nwrapline;
calcLineInfo (hWnd, pMLEditData, pLineData);
pMLEditData->wraplines += pLineData->nwrapline;
edtGetLineInfo (hWnd, pLineData);
if (wrapline == oldnwrapline - 1)
InvRect.left = pMLEditData->dx_chars[pMLEditData->veditPos]
- pMLEditData->dx_chars[pLineData->wrapStartPos[wrapline]]
+ pMLEditData->leftMargin - 1;
if (oldnwrapline == pLineData->nwrapline)
InvRect.bottom = InvRect.top + pMLEditData->lineHeight
*(pLineData->nwrapline-wrapline);
}
pMLEditData->EndlineDisp = MIN (pMLEditData->StartlineDisp
+ pMLEditData->MaxlinesDisp - 1,
pMLEditData->wraplines - 1);
pMLEditData->linesDisp = pMLEditData->EndlineDisp
- pMLEditData->StartlineDisp + 1;
if (wrapline == pLineData->nwrapline /*&& pLineData->nwrapline != 1*/
&& pMLEditData->veditPos == pMLEditData->fit_chars)
{
pMLEditData->editLine--;
if (pMLEditData->editLine < pMLEditData->StartlineDisp)
{
bScroll = TRUE;
pMLEditData->StartlineDisp--;
pMLEditData->EndlineDisp = MIN (pMLEditData->StartlineDisp +
pMLEditData->MaxlinesDisp -1,
pMLEditData->EndlineDisp);
pMLEditData->linesDisp = pMLEditData->EndlineDisp
- pMLEditData->StartlineDisp + 1;
}
}
if (oldnwrapline != pLineData->nwrapline)
bScroll = TRUE;
edtSetCaretPos (hWnd);
//FIXME
if (bScroll) {
edtSetScrollInfo (hWnd, pMLEditData, TRUE);
InvalidateRect (hWnd, &InvRect,TRUE);
}
if (pMLEditData->bSCROLL)
InvalidateRect (hWnd, NULL, TRUE);
NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_CHANGE);
return 0;
}
temp = pLineData->next;
if (pMLEditData->veditPos == pMLEditData->fit_chars && temp)
{
if(pLineData->dataEnd + temp->dataEnd <= LEN_MLEDIT_BUFFER)
{
pMLEditData->curtotalLen --;
memcpy(pLineData->buffer+pLineData->dataEnd,temp->buffer,temp->dataEnd);
pLineData->dataEnd += temp->dataEnd;
pLineData->buffer[pLineData->dataEnd] = '\0';
if(temp->next)
{
pLineData->next = temp->next;
temp->next->previous = pLineData;
}
else
pLineData->next = NULL;
free(temp);
temp = pLineData->next;
while (temp)
{
temp->lineNO--;
temp = temp->next;
}
edtGetLineInfo (hWnd, pLineData);
if(pMLEditData->EndlineDisp >= pMLEditData->lines-1)
{
// added by leon to optimize display
if ((pMLEditData->EndlineDisp == pMLEditData->lines -1)
&& (pMLEditData->StartlineDisp != 0)) {
InvRect.bottom = (pMLEditData->editLine - pMLEditData->StartlineDisp + 1)
* pMLEditData->lineHeight + pMLEditData->topMargin;
}else {
InvRect.top = (pMLEditData->editLine - pMLEditData->StartlineDisp)
* pMLEditData->lineHeight + pMLEditData->topMargin;
}
// added by leon to optimize display
if(pMLEditData->StartlineDisp !=0)
{
pMLEditData->StartlineDisp--;
pMLEditData->EndlineDisp = MIN ( pMLEditData->lines-1,
pMLEditData->StartlineDisp+pMLEditData->MaxlinesDisp -1);
} else
pMLEditData->EndlineDisp--;
pMLEditData->linesDisp = pMLEditData->EndlineDisp -
pMLEditData->StartlineDisp+1;
}
else if (pMLEditData->lines <= pMLEditData->MaxlinesDisp)
{
pMLEditData->EndlineDisp--;
pMLEditData->linesDisp = pMLEditData->EndlineDisp -
pMLEditData->StartlineDisp+1;
}
pMLEditData->lines--;
} else if (temp->dataEnd > 0)
{
leftLen = LEN_MLEDIT_BUFFER - pLineData->dataEnd;
memcpy(pLineData->buffer+pLineData->dataEnd,temp->buffer,leftLen);
pLineData->dataEnd +=leftLen;
pLineData->buffer[pLineData->dataEnd] = '\0';
memcpy(temp->buffer,temp->buffer+leftLen,temp->dataEnd-leftLen);
temp->dataEnd -=leftLen;
temp->buffer[temp->dataEnd] = '\0';
// added by leon to optimize display
InvRect.top = (pMLEditData->editLine - pMLEditData->StartlineDisp)
* pMLEditData->lineHeight + pMLEditData->topMargin;
// added by leon to optimize display
}
}
else if (pMLEditData->veditPos != pMLEditData->fit_chars)
{
edtGetLineInfo (hWnd, GetLineData (pMLEditData, pMLEditData->editLine));
deleted = pMLEditData->pos_chars[pMLEditData->veditPos + 1]
- pMLEditData->pos_chars[pMLEditData->veditPos];
pMLEditData->curtotalLen -= deleted;
for (i = pMLEditData->pos_chars[pMLEditData->veditPos];
i < pLineData->dataEnd - deleted;
i++)
pLineData->buffer [i]
= pLineData->buffer [i + deleted];
pLineData->dataEnd -= deleted;
if (pLineData->dataEnd == 0) {
pMLEditData->fit_chars = 0;
pMLEditData->pos_chars[0] = 0;
pMLEditData->dx_chars[0] = 0;
}
pLineData->buffer[pLineData->dataEnd] = '\0';
// only current line to redraw
if (pMLEditData->EndlineDisp <= pMLEditData->lines - 1) {
InvRect.left = pMLEditData->dx_chars[pMLEditData->veditPos]
- pMLEditData->dx_chars[pMLEditData->vdispPos]
+ pMLEditData->leftMargin - 1;
InvRect.top = (pMLEditData->editLine - pMLEditData->StartlineDisp)
* pMLEditData->lineHeight
+ pMLEditData->topMargin;
InvRect.bottom = InvRect.top + pMLEditData->lineHeight * 2;
}
}
else {
InvRect.left = InvRect.top = InvRect.right = InvRect.bottom = 0;
Ping ();
}
edtGetLineInfo (hWnd, GetLineData (pMLEditData, pMLEditData->editLine));
pMLEditData->dispPos = pMLEditData->dx_chars[pMLEditData->vdispPos];
edtSetCaretPos (hWnd);
InvalidateRect (hWnd, &InvRect,TRUE);
edtSetScrollInfo (hWnd, pMLEditData, TRUE);
if (pMLEditData->bSCROLL)
InvalidateRect (hWnd, NULL, TRUE);
NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_CHANGE);
return 0;
}
static int edtKeyBackspace (HWND hWnd)
{
DWORD dwStyle = GetWindowStyle(hWnd);
PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
PLINEDATA pLineData;
PLINEDATA temp;
int leftLen,tempEnd;
int oldnwrapline;
BOOL bScroll = FALSE;
RECT InvRect;
int deleted, i;
int line, wrapline;
GetClientRect (hWnd, &InvRect);
//InvRect.left = pMLEditData->leftMargin - 1;
if (dwStyle & ES_READONLY) {
Ping ();
return 0;
}
edtPosProc (hWnd);
if (dwStyle & ES_AUTOWRAP)
{
edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline);
pLineData = GetLineData(pMLEditData, line);
} else
pLineData = GetLineData(pMLEditData, pMLEditData->editLine);
edtGetLineInfo (hWnd,pLineData);
temp = pLineData->previous;
if (!temp && !(pMLEditData->veditPos)) return 0;
if (dwStyle & ES_AUTOWRAP)
{
oldnwrapline = pLineData->nwrapline;
/*-----------------------------*/
if (pMLEditData->veditPos == 0 && temp)
{
pMLEditData->wraplines -= pLineData->nwrapline + temp->nwrapline;
pMLEditData->curtotalLen --;
tempEnd = temp->dataEnd;
edtGetLineInfo (hWnd, temp);
if(pLineData->dataEnd + temp->dataEnd <= LEN_MLEDIT_BUFFER)
{
pMLEditData->veditPos = pMLEditData->fit_chars;
memcpy(temp->buffer+temp->dataEnd,pLineData->buffer,pLineData->dataEnd);
temp->dataEnd +=pLineData->dataEnd;
temp->buffer[temp->dataEnd] = '\0';
if(pLineData->next)
{
temp->next = pLineData->next;
pLineData->next->previous = temp;
} else
temp->next = NULL;
free(pLineData);
pLineData = temp;
temp = temp->next;
while(temp)
{
temp->lineNO--;
temp = temp->next;
}
pMLEditData->lines--;
if (pMLEditData->editLine == pMLEditData->StartlineDisp)
{
pMLEditData->StartlineDisp--;
bScroll = TRUE;
} /*else if ( pMLEditData->EndlineDisp == pMLEditData->wraplines-1) {
if( pMLEditData->StartlineDisp != 0)
pMLEditData->StartlineDisp--;
}*/
calcLineInfo (hWnd, pMLEditData, pLineData);
pMLEditData->wraplines += pLineData->nwrapline;
pMLEditData->EndlineDisp = MIN (pMLEditData->wraplines - 1,
pMLEditData->StartlineDisp
+ pMLEditData->MaxlinesDisp - 1 );
pMLEditData->linesDisp = pMLEditData->EndlineDisp
- pMLEditData->StartlineDisp + 1;
pMLEditData->editLine--;
}
else if (pLineData->dataEnd > 0)
{
pMLEditData->wraplines -= pLineData->nwrapline + temp->nwrapline;
pMLEditData->veditPos = pMLEditData->fit_chars;
leftLen = LEN_MLEDIT_BUFFER - temp->dataEnd;
memcpy(temp->buffer+temp->dataEnd,pLineData->buffer,leftLen);
temp->dataEnd +=leftLen;
temp->buffer[temp->dataEnd] = '\0';
memcpy(pLineData->buffer,pLineData->buffer+leftLen,pLineData->dataEnd-leftLen);
pLineData->dataEnd -=leftLen;
pLineData->buffer[pLineData->dataEnd] = '\0';
pMLEditData->editLine--;
calcLineInfo (hWnd, pMLEditData, pLineData);
calcLineInfo (hWnd, pMLEditData, temp);
pMLEditData->wraplines += pLineData->nwrapline + temp->nwrapline;
}
InvRect.top = (pMLEditData->editLine - pMLEditData->StartlineDisp)
* pMLEditData->lineHeight
+ pMLEditData->topMargin;
} else if (pMLEditData->veditPos != 0 ) {// not the head
pMLEditData->wraplines -= pLineData->nwrapline;
deleted = pMLEditData->pos_chars[pMLEditData->veditPos]
- pMLEditData->pos_chars[pMLEditData->veditPos - 1];
pMLEditData->curtotalLen -= deleted;
for (i = pMLEditData->pos_chars[pMLEditData->veditPos];
i < pLineData->dataEnd;
i++)
pLineData->buffer[i - deleted] = pLineData->buffer[i];
pLineData->dataEnd -= deleted;
pMLEditData->veditPos -= 1;
pLineData->buffer[pLineData->dataEnd] = '\0';
calcLineInfo (hWnd, pMLEditData, pLineData);
InvRect.top = (pMLEditData->editLine - pMLEditData->StartlineDisp)
* pMLEditData->lineHeight
+ pMLEditData->topMargin;
if (oldnwrapline == pLineData->nwrapline)
{
if (wrapline =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -