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

📄 medit.c

📁 在ecos 下mingui 的移植开发
💻 C
📖 第 1 页 / 共 5 页
字号:
					// 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 + -