⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 medit.c

📁 在ADS环境下MiniGUI的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
        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 + -