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

📄 medit.c

📁 开放源码实时操作系统源码.
💻 C
📖 第 1 页 / 共 4 页
字号:
					if(pMLEditData->linesDisp < pMLEditData->MaxlinesDisp)
					{
						pMLEditData->EndlineDisp++;
						pMLEditData->linesDisp++;
					}
					else if(pMLEditData->editLine == pMLEditData->EndlineDisp) 
					{
						pMLEditData->StartlineDisp++;
						pMLEditData->EndlineDisp++;
					}
					pMLEditData->editLine++;
					pMLEditData->lines++;
                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd) 
                            + pMLEditData->leftMargin, 
                        (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
							+pMLEditData->topMargin);
    	            InvalidateRect (hWnd, NULL, FALSE);
        	        return 0;
				}
                case VK_HOME: 	/* SCANCODE_HOME: */
				{
					PLINEDATA temp;
                    if (pMLEditData->editPos == 0)
                        return 0;

                    pMLEditData->editPos  = 0;
                    pMLEditData->caretPos = 0;

                    SetCaretPos (pMLEditData->leftMargin, 
                        (pMLEditData->editLine-pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
							+pMLEditData->topMargin);
					temp = GetLineData(pMLEditData,pMLEditData->editLine);	
                    if (pMLEditData->dispPos != 0)
					{
						pMLEditData->dispPos = 0;
					    InvalidateRect (hWnd, NULL, FALSE);
					}
               		return 0;
            	}
                case VK_END: /* SCANCODE_END: */
                {
                    int newStartPos;
                    pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
                    if (pMLEditData->editPos == pLineData->dataEnd)
                        return 0;
                    newStartPos = edtGetStartDispPosAtEnd (hWnd, pLineData);
                    
                    pMLEditData->editPos = pLineData->dataEnd;
                    pMLEditData->caretPos = pMLEditData->editPos - newStartPos;
                    
                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                            + pMLEditData->leftMargin, 
						(pMLEditData->editLine-pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
	                        + pMLEditData->topMargin);

                    if (pMLEditData->dispPos != newStartPos)
                        InvalidateRect (hWnd, NULL, FALSE);
					pMLEditData->dispPos = newStartPos;
                }
                return 0;

                case VK_LEFT: /* SCANCODE_CURSORBLOCKLEFT: */
                {
                    BOOL bScroll = FALSE;
                    int  scrollStep,newStartPos;
					PLINEDATA temp;
					pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
                    if (pMLEditData->editPos == 0 )
					{
						temp = pLineData->previous;
						if(temp && pMLEditData->editLine > pMLEditData->StartlineDisp)
						{
							pMLEditData->editLine --;						
							pMLEditData->editPos = temp->dataEnd; 
		                    newStartPos = edtGetStartDispPosAtEnd (hWnd, temp);
                    		pMLEditData->caretPos = pMLEditData->editPos - newStartPos;
                    		if (pMLEditData->dispPos != newStartPos)
							{
								pMLEditData->dispPos = newStartPos;
								bScroll = TRUE;
							}
						}
						else
	                        return 0;
					}
					else
                    {	if (edtIsACCharBeforePosition (pLineData->buffer, 
                                    pLineData->dataEnd,
                        	    pMLEditData->editPos)) {
                        	scrollStep = 2;
                        	pMLEditData->editPos -= 2;
                    	}
                    	else {
                       	 	scrollStep = 1;
                        	pMLEditData->editPos --;
                    	}

                    	pMLEditData->caretPos -= scrollStep;
                    	if (pMLEditData->caretPos == 0 
                        	    && pMLEditData->editPos != 0) {

                        	bScroll = TRUE;

                        	if (edtIsACCharBeforePosition (pLineData->buffer, 
                                    pLineData->dataEnd,
                            	    pMLEditData->editPos)) {
                           		pMLEditData->dispPos -= 2;
                            	pMLEditData->caretPos = 2;
                        	}
                        	else {
								pMLEditData->dispPos--;							
	                            pMLEditData->caretPos = 1;
    	                    }
        	            }
            	        else if (pMLEditData->caretPos < 0) {
							pMLEditData->dispPos = 0;
                    	    pMLEditData->caretPos = 0;
                    	}
                    }    
                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd) 
                            + pMLEditData->leftMargin, 
						(pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
                        	+ pMLEditData->topMargin);

                    if (bScroll)
                        InvalidateRect (hWnd, NULL, FALSE);
                }
                return 0;
                
		case VK_RIGHT: /* SCANCODE_CURSORBLOCKRIGHT: */
                {
                    BOOL bScroll = FALSE;
                    int  scrollStep, moveStep;
					PLINEDATA temp;

					pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
                    if (pMLEditData->editPos == pLineData->dataEnd)
					{
						temp = pLineData->next;
						if(temp)
						{
							pMLEditData->editLine++;
							pMLEditData->editPos  = 0;
							pMLEditData->caretPos = 0;	
							if(pMLEditData->dispPos !=0)
							{
								pMLEditData->dispPos  = 0;
								bScroll = TRUE;
							}
						}
						else
	                        return 0;
					}
					else
                    {	
						if (edtIsACCharAtPosition (pLineData->buffer, 
                        	        pLineData->dataEnd,
                            	    pMLEditData->dispPos)) {
              	            if (edtIsACCharAtPosition (pLineData->buffer, 
                                    pLineData->dataEnd,
                                    pMLEditData->editPos)) {
                      	        scrollStep = 2;
                        	    moveStep = 2;
                            	pMLEditData->editPos  += 2;
                        	}
                        	else {
                            	scrollStep = 2;
	                            moveStep = 1;
    	                        pMLEditData->editPos ++;
        	                }
            	        }
                	    else {
                    	    if (edtIsACCharAtPosition (pLineData->buffer, 
                        	            pLineData->dataEnd,
                            	        pMLEditData->editPos)) {
                                    
	                            if (edtIsACCharAtPosition (pLineData->buffer, 
    	                                pLineData->dataEnd,
        	                            pMLEditData->dispPos + 1))
            	                    scrollStep = 3;
                	            else
                    	            scrollStep = 2;
	
    	                        moveStep = 2;
        	                    pMLEditData->editPos += 2;
            	            }
                	        else {
                    	        scrollStep = 1;
                        	    moveStep = 1;
                            	pMLEditData->editPos ++;
	                        }
    	                }

        	            pMLEditData->caretPos += moveStep;
            	        if (pMLEditData->caretPos * GetSysCharWidth (hWnd) 
                	            > edtGetOutWidth (hWnd)) {
                    	    bScroll = TRUE;
                        	pMLEditData->dispPos += scrollStep;
	                        pMLEditData->caretPos = 
    	                        pMLEditData->editPos - pMLEditData->dispPos;
        	            }
					}
                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd) 
                            + pMLEditData->leftMargin, 
                        (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight (hWnd) 
                        	+ pMLEditData->topMargin);

                    if (bScroll)
                        InvalidateRect (hWnd, NULL, FALSE);
                }
                return 0;
               	
		case VK_UP: /* SCANCODE_CURSORBLOCKUP: */
		{
                    BOOL bScroll = FALSE;
                    int  newStartPos;
					PLINEDATA temp;
					pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
					temp = pLineData->previous; 
					if(pMLEditData->editLine == 0)
						return 0;
					else if (pMLEditData->editLine == pMLEditData->StartlineDisp)
					{
						bScroll = TRUE;
						pMLEditData->StartlineDisp--;
						pMLEditData->EndlineDisp--;	
					}
					pMLEditData->editLine--;

					if( pMLEditData->editPos >= temp->dataEnd ) 
					{
						pMLEditData->editPos = temp->dataEnd;
						pMLEditData->dispPos = 0;
	                   	newStartPos = edtGetStartDispPosAtEnd (hWnd, temp);
               			pMLEditData->dispPos =  newStartPos;
						pMLEditData->caretPos = pMLEditData->editPos - newStartPos;
						bScroll = TRUE;
					}				
					else 
					{
       			   		newStartPos = edtGetOffset(hWnd, pMLEditData,temp,
                   				pMLEditData->caretPos * GetSysCharWidth (hWnd) 
                       			+ pMLEditData->leftMargin);
						if(!edtIsACCharFromBegin(temp->buffer,temp->dataEnd,
								pMLEditData->dispPos))
						{
							bScroll = TRUE;
							pMLEditData->dispPos--;
        			   		newStartPos = edtGetOffset(hWnd, pMLEditData,temp,
                      				pMLEditData->caretPos * GetSysCharWidth (hWnd) 
                          			+ pMLEditData->leftMargin+GetSysCharWidth(hWnd)/2);
						}
	   	        	    pMLEditData->editPos = newStartPos + pMLEditData->dispPos;
   		    	        pMLEditData->caretPos = newStartPos;
					}
                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd) 
                            + pMLEditData->leftMargin, 
					    (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
                            + pMLEditData->topMargin);
					if(bScroll)
						InvalidateRect(hWnd,NULL,FALSE);	
				}
				break;
		case VK_DOWN: /* SCANCODE_CURSORBLOCKDOWN: */
		{
                    BOOL bScroll = FALSE;
                    int  newStartPos;
					PLINEDATA temp;
					pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
					temp = pLineData->next; 
					if(pMLEditData->editLine == pMLEditData->lines-1)
						return 0;
					else if (pMLEditData->editLine == pMLEditData->EndlineDisp)
					{
						bScroll = TRUE;
						pMLEditData->StartlineDisp++;
						pMLEditData->EndlineDisp++;	
					}
					pMLEditData->editLine++;

					if( pMLEditData->editPos >= temp->dataEnd ) 
					{
						pMLEditData->editPos = temp->dataEnd;
						pMLEditData->dispPos = 0;
	                   	newStartPos = edtGetStartDispPosAtEnd (hWnd, temp);
               			pMLEditData->dispPos =  newStartPos;
						pMLEditData->caretPos = pMLEditData->editPos - newStartPos;
						bScroll = TRUE;
					}				
					else 
					{
       			   		newStartPos = edtGetOffset(hWnd, pMLEditData,temp,
                   				pMLEditData->caretPos * GetSysCharWidth (hWnd) 
                       			+ pMLEditData->leftMargin);
						if(!edtIsACCharFromBegin(temp->buffer,temp->dataEnd,
								pMLEditData->dispPos))
						{
							bScroll = TRUE;
							pMLEditData->dispPos--;
           			   		newStartPos = edtGetOffset(hWnd, pMLEditData,temp,
                       				pMLEditData->caretPos * GetSysCharWidth (hWnd) 
                           			+ pMLEditData->leftMargin+GetSysCharWidth(hWnd)/2);
						}
	   	        	    pMLEditData->editPos = newStartPos + pMLEditData->dispPos;
   		    	        pMLEditData->caretPos = newStartPos;
					}
                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd) 
                            + pMLEditData->leftMargin, 
					    (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
                            + pMLEditData->topMargin);
					if(bScroll)
						InvalidateRect(hWnd,NULL,FALSE);	
		
				}
				break;
                case VK_INSERT: /* SCANCODE_INSERT: */
					dw = GetWindowAdditionalData(hWnd);	
                    dw ^= EST_REPLACE;
					SetWindowAdditionalData(hWnd,dw);
                break;

                case VK_DELETE: /* SCANCODE_REMOVE: */
				{
					PLINEDATA temp;
					int leftLen;
					pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
                    if ((GetWindowAdditionalData(hWnd) & EST_READONLY) ){
#if 0	/* fix: no ping() */
                        ping ();
#endif
                        return 0;
                    }
                   	temp = pLineData->next; 
					if (pLineData->dataEnd == pMLEditData->editPos && 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;
							}
							if(pMLEditData->lines <= pMLEditData->MaxlinesDisp)
							{
								pMLEditData->EndlineDisp--;
								pMLEditData->linesDisp--;
							}
							if(pMLEditData->EndlineDisp >= pMLEditData->lines-1)		
							{
								pMLEditData->EndlineDisp--;
								if(pMLEditData->StartlineDisp !=0)
									pMLEditData->StartlineDisp--;
								else
									pMLEditData->linesDisp--;
							}
							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';
						}
					}
					else if (pMLEditData->editPos != pLineData->dataEnd)
					{	
	                    if (edtIsACCharAtPosition (pLineData->buffer, 
    	                                pLineData->dataEnd,
        	                            pMLEditData->editPos))
	                        deleted = 2;
    	                else
        	                deleted = 1;
                        
            	        for (i = pMLEditData->editPos; 
                	            i < pLineData->dataEnd - deleted;
                    	        i++)
 	                       pLineData->buffer [i] 
    	                        = pLineData->buffer [i + deleted];

        	            pLineData->dataEnd -= deleted;
						pLineData->buffer[pLineData->dataEnd] = '\0';
					}
                	bChange = TRUE;
                    InvalidateRect (hWnd, NULL,FALSE);
				}
                break;

                case VK_BACK: /* SCANCODE_BACKSPACE: */
				{
					PLINEDATA temp;
					int leftLen,tempEnd;
                    if ((GetWindowAdditionalData(hWnd) & EST_READONLY) ){
#if 0	 /* fix: no Ping() */
                        Ping ();
#endif
                        return 0;
                    }
					pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
					temp = pLineData->previous;	
					if (pMLEditData->editPos == 0 && temp)
					{
						tempEnd = temp->dataEnd;
						if(pLineData->dataEnd + temp->dataEnd <= LEN_MLEDIT_BUFFER)	
						{
							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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -