📄 medit.c
字号:
// added by leon to optimize display // added by leon for scrollbars edtSetScrollInfo (hWnd, pMLEditData, TRUE); // added by leon for scrollbars } break; case SCANCODE_INSERT: pMLEditData->status ^= EST_REPLACE; break; case SCANCODE_REMOVE: { PLINEDATA temp; int leftLen; pLineData = GetLineData(pMLEditData, pMLEditData->editLine); if ((pMLEditData->status & EST_READONLY) ){ Ping (); return 0; } temp = pLineData->next; if (pMLEditData->veditPos == pMLEditData->fit_chars && temp) { 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); 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) * GetSysCharHeight() + pMLEditData->topMargin; }else { InvRect.top = (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight() + 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); pMLEditData->linesDisp = pMLEditData->EndlineDisp - pMLEditData->StartlineDisp +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) * GetSysCharHeight() + pMLEditData->topMargin; // added by leon to optimize display } } else if (pMLEditData->veditPos != pMLEditData->fit_chars) { edtGetLineInfo (hWnd, GetLineData (pMLEditData, pMLEditData->editLine)); //fprintf (stderr, "veditPos = %d\n", pMLEditData->veditPos); //fprintf (stderr, "fit_chars= %d\n", pMLEditData->fit_chars); //fprintf (stderr, "buffer = %s\n", pLineData->buffer); //fprintf (stderr, "dataEnd= %d\n", pLineData->dataEnd); //fprintf (stderr, "buffer left = %s\n", pLineData->buffer // + pMLEditData->dx_chars[pMLEditData->veditPos]); deleted = pMLEditData->pos_chars[pMLEditData->veditPos + 1] - pMLEditData->pos_chars[pMLEditData->veditPos]; //fprintf (stderr, "deleted = %d\n", 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'; //fprintf (stderr, "buffer = %s\n", pLineData->buffer); //fprintf (stderr, "dataEnd= %d\n", pLineData->dataEnd); // added by leon to optimize display // only current line to redraw //fprintf (stderr, "dx= %d\n", pMLEditData->dx_chars[pMLEditData->veditPos]); if (pMLEditData->EndlineDisp <= pMLEditData->lines - 1) { InvRect.left = pMLEditData->dx_chars[pMLEditData->veditPos] - pMLEditData->dx_chars[pMLEditData->vdispPos] + pMLEditData->leftMargin; InvRect.top = (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight()//Mneeded + pMLEditData->topMargin; InvRect.bottom = InvRect.top + GetSysCharWidth () * 2; } //fprintf (stderr, "left= %d\n",pMLEditData->dx_chars[pMLEditData->vdispPos]); } else { InvRect.left = InvRect.top = InvRect.right = InvRect.bottom = 0; Ping (); } // added by leon to optimize display edtGetLineInfo (hWnd, GetLineData (pMLEditData, pMLEditData->editLine)); bChange = TRUE; edtSetCaretPos (hWnd); InvalidateRect (hWnd, &InvRect,FALSE); // modified by leon to display // added by leon for scrollbars edtSetScrollInfo (hWnd, pMLEditData, TRUE); // added by leon for scrollbars } break; case SCANCODE_BACKSPACE: { PLINEDATA temp; int leftLen,tempEnd; if ((pMLEditData->status & EST_READONLY) ){ Ping (); return 0; } GetClientRect (hWnd, &InvRect); pLineData = GetLineData(pMLEditData,pMLEditData->editLine); temp = pLineData->previous; //the caret is at the head of current line if (pMLEditData->veditPos == 0 && temp) { tempEnd = temp->dataEnd; edtGetLineInfo (hWnd, temp); if ( pMLEditData->sz.cx < edtGetOutWidth (hWnd)) { if ( pMLEditData->lines - 1 != pMLEditData->EndlineDisp) { //partly redraw InvRect.top = (pMLEditData->editLine - pMLEditData->StartlineDisp - 1 ) * GetSysCharHeight() //Mneeded + pMLEditData->topMargin; }else { InvRect.bottom =(pMLEditData->editLine - pMLEditData->StartlineDisp + 1) * GetSysCharHeight() //Mneeded + pMLEditData->topMargin; } } // added by leon to optimize display if(pLineData->dataEnd + temp->dataEnd <= LEN_MLEDIT_BUFFER) { edtGetLineInfo (hWnd, temp); 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->StartlineDisp == pMLEditData->editLine && pMLEditData->StartlineDisp != 0) { pMLEditData->StartlineDisp--; if(pMLEditData->EndlineDisp >= pMLEditData->lines - 1 ) { pMLEditData->EndlineDisp = min(pMLEditData->lines - 1, pMLEditData->MaxlinesDisp + pMLEditData->StartlineDisp - 1 ); pMLEditData->linesDisp = pMLEditData->EndlineDisp - pMLEditData->StartlineDisp + 1; } else { pMLEditData->EndlineDisp--; pMLEditData->linesDisp = pMLEditData->EndlineDisp - pMLEditData->StartlineDisp + 1; } } else if ( pMLEditData->EndlineDisp >= pMLEditData->lines - 1 && pMLEditData->editLine != pMLEditData->StartlineDisp ) { if( pMLEditData->StartlineDisp != 0) { pMLEditData->StartlineDisp--; if(pMLEditData->EndlineDisp >= pMLEditData->lines -1) { pMLEditData->EndlineDisp--; pMLEditData->linesDisp = pMLEditData->EndlineDisp - pMLEditData->StartlineDisp + 1; } } else { pMLEditData->EndlineDisp--; pMLEditData->linesDisp = pMLEditData->EndlineDisp - pMLEditData->StartlineDisp + 1; } } pMLEditData->editLine--; } else if (pLineData->dataEnd > 0) { edtGetLineInfo (hWnd, temp); 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'; } // added by leon to fix the 'roll window' bug if (pMLEditData->veditPos > edtGetStartDispPosAtEnd(hWnd,pLineData)) pMLEditData->vdispPos = edtGetStartDispPosAtEnd(hWnd,pLineData); else { if (edtGetNewvPos (hWnd, GetLineData(pMLEditData,pMLEditData->editLine), pMLEditData->dx_chars[pMLEditData->veditPos] - edtGetOutWidth (hWnd)/4) == -1) pMLEditData->vdispPos = 0; else pMLEditData->vdispPos = edtGetNewvPos (hWnd, GetLineData(pMLEditData,pMLEditData->editLine), pMLEditData->dx_chars[pMLEditData->veditPos] - edtGetOutWidth (hWnd)/4); } // added by leon to fix the 'roll window' bug if (pMLEditData->vdispPos == pMLEditData->veditPos && pMLEditData->veditPos != 0) { if (edtGetNewvPos (hWnd, GetLineData(pMLEditData,pMLEditData->editLine), pMLEditData->dx_chars[pMLEditData->veditPos] - edtGetOutWidth (hWnd)/4) == -1) pMLEditData->vdispPos = 0; else pMLEditData->vdispPos = edtGetNewvPos (hWnd, GetLineData(pMLEditData,pMLEditData->editLine), pMLEditData->dx_chars[pMLEditData->veditPos] - edtGetOutWidth (hWnd)/4); } } // not the head else if (pMLEditData->veditPos != 0 ) { deleted = pMLEditData->pos_chars[pMLEditData->veditPos] - pMLEditData->pos_chars[pMLEditData->veditPos - 1]; for (i = pMLEditData->pos_chars[pMLEditData->veditPos]; i < pLineData->dataEnd; i++) pLineData->buffer [i - deleted] = pLineData->buffer [i]; pLineData->dataEnd -= deleted; pMLEditData->veditPos -= 1; //pMLEditData->caretPos -= deleted; pLineData->buffer[pLineData->dataEnd] = '\0'; if (pMLEditData->vdispPos == pMLEditData->veditPos) { if (edtGetNewvPos (hWnd, GetLineData(pMLEditData,pMLEditData->editLine), pMLEditData->dx_chars[pMLEditData->veditPos] - edtGetOutWidth (hWnd)/4) == -1) pMLEditData->vdispPos = 0; else pMLEditData->vdispPos = edtGetNewvPos (hWnd, GetLineData(pMLEditData,pMLEditData->editLine), pMLEditData->dx_chars[pMLEditData->veditPos] - edtGetOutWidth (hWnd)/4); }else { InvRect.left = pMLEditData->dx_chars[pMLEditData->veditPos] - pMLEditData->dx_chars[pMLEditData->vdispPos] + pMLEditData->leftMargin; InvRect.top = (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight() + pMLEditData->topMargin; InvRect.bottom = InvRect.top + GetSysCharWidth ()*2; } } // added by leon to optimize display else { InvRect.left = InvRect.top = InvRect.right = InvRect.bottom = 0; Ping (); } // added by leon to optimize display bChange = TRUE; edtSetCaretPos (hWnd); InvalidateRect (hWnd, &InvRect, FALSE);// modified by leon // added by leon for scrollbars edtSetScrollInfo (hWnd, pMLEditData, TRUE); // added by leon for scrollbars } break; // added by leon for display case SCANCODE_PAGEUP: { int olddispPos; int newOff; int LinesDisp = pMLEditData->MaxlinesDisp; olddispPos = pMLEditData->dx_chars[pMLEditData->vdispPos]; newOff = pMLEditData->dx_chars[pMLEditData->veditPos]; if (pMLEditData->StartlineDisp == 0) return 0; if (pMLEditData->StartlineDisp > LinesDisp - 1) { pMLEditData->EndlineDisp = pMLEditData->StartlineDisp; pMLEditData->StartlineDisp -= LinesDisp - 1; pMLEditData->editLine -= LinesDisp - 1; }else { pMLEditData->editLine -= pMLEditData->StartlineDisp; pMLEditData->EndlineDisp = LinesDisp -1; pMLEditData->StartlineDisp = 0; } edtGetCaretValid (hWnd, pMLEditData->editLine, olddispPos, newOff); // added by leon for scrollbars edtSetScrollInfo (hWnd, pMLEditData, TRUE); // added by leon for scrollbars InvalidateRect (hWnd, NULL, FALSE); edtSetCaretPos (hWnd); } break; case SCANCODE_PAGEDOWN: { int olddispPos; int newOff; int LinesDisp = pMLEditData->MaxlinesDisp; olddispPos = pMLEditData->dx_chars[pMLEditData->vdispPos]; newOff = pMLEditData->dx_chars[pMLEditData->veditPos]; if (pMLEditData->EndlineDisp == pMLEditData->lines -1) return 0; if (pMLEditData->lines - pMLEditData->EndlineDisp > LinesDisp - 1) { pMLEditData->StartlineDisp = pMLEditData->EndlineDisp; pMLEditData->editLine += LinesDisp - 1; pMLEditData->EndlineDisp += LinesDisp -1; }else { pMLEditData->EndlineDisp = pMLEditData->lines - 1; pMLEditData->editLine += (pMLEditData->EndlineDisp - (LinesDisp - 1)) - pMLEditData->StartlineDisp; pMLEditData->StartlineDisp = pMLEditData->EndlineDisp - (LinesDisp - 1); } edtGetCaretValid (hWnd, pMLEditData->editLine, olddispPos, newOff); // added by leon for scrollbars edtSetScrollInfo (hWnd, pMLEditData, TRUE); // added by leon for scrollbars InvalidateRect (hWnd, NULL, FALSE); edtSetCaretPos (hWnd); } break; // added by leon for display default:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -