asix_ed.c

来自「一个操作系统源代码 用于嵌入式设备 在Vc++环境下仿真 成功移植到多款处理器上」· C语言 代码 · 共 1,876 行 · 第 1/4 页

C
1,876
字号
			if( isChinese( wparam ) || isprint( wparam ) )
			{
				if( edctrl->style & ES_READONLY || ( edctrl->style & ES_NUMBER && !isdigit( wparam ) ) )
					break;

				newPos = InsertChar( edctrl->pbuf, edctrl->curCursorPos, wparam, &edctrl->strLen, edctrl->bufSize );
				if( newPos == NULL )
					break;
				
				offset = ( *(edctrl->curCursorPos) & 0x80 ) ? CHINESE_CHAR_WIDTH : ENGLISH_CHAR_WIDTH;
				edctrl->curCursorPos = newPos;
				
				width = pmatrix->vector[edctrl->curColumn].x - pmatrix->vector[0].x;
				if( width + offset > edctrl->width -4 )
				{
					pmatrix->len = edctrl->curColumn;
					pmatrix->w = width;
					MoveRight( edctrl, 1 );
					edctrl->curColumn = pmatrix->len;
				}
				else
				{
					edctrl->curColumn++;
					OrgnizeMatrix( edctrl, edctrl->curLine, 0 );
				}
				UpdateInputArea( edctrl, edctrl->curLine, 0 );
			}
			else
			{
				switch( wparam )
				{
					case ESCAPE: // ESC(sed)
						if( edctrl->style & ES_READONLY )
							break;

						// 清除所有输入,刷新显示(sed)
						edctrl->pbuf[0] = '\0';
						edctrl->curCursorPos = edctrl->pbuf;
						//edctrl->curLineHead = edctrl->pbuf;
						edctrl->curColumn = 0;
						pmatrix->lineHead = edctrl->pbuf;
						edctrl->strLen = 0;
						
						OrgnizeMatrix( edctrl, 0, 0 );
						UpdateInputArea( edctrl, 0, 0 );						
						break;
					case MOVE_LEFT:		// 光标左移一个字符(sed)
						curLineHead = pmatrix->lineHead;
						if( edctrl->curColumn == 0 )	// 光标在行首(sed)
						{
							if( MoveLeft( edctrl, 1 ) == ASIX_OK )
							{
								edctrl->curCursorPos = pmatrix->lineHead;
								UpdateInputArea( edctrl, edctrl->curLine, 0 );
							}
						}
						else	// 光标不在行首(sed)
						{
							// 光标左移一个字符(sed)
							edctrl->curColumn--;
							dispx = edctrl->pmatrix[0].vector[edctrl->curColumn].x;
							if( *(edctrl->curCursorPos -1) & 0x80 )
							{
								edctrl->curCursorPos -= 2;
								dispy = edctrl->y + ( edctrl->lineHeight - CHINESE_CHAR_HEIGHT )/2;
							}
							else
							{
								edctrl->curCursorPos -= 1;
								dispy = edctrl->y + ( edctrl->lineHeight - ENGLISH_CHAR_HEIGHT )/2;
							}
															
							SetCursorPosition( hGC, dispx, dispy );
						}
						break;
					case MOVE_RIGHT:	// 光标右移一个字符(sed)
						// 光标在字符串尾(sed)
						if( *( edctrl->curCursorPos ) == '\0' )	
							break;

						// 光标不在字符串尾,重新确定光标位置(sed)
						cLen = ( *edctrl->curCursorPos & 0x80 ) ? 2 : 1;
						edctrl->curCursorPos += cLen;

						pmatrix = &edctrl->pmatrix[0];
						if( edctrl->curColumn == pmatrix->len )
						{
							if( MoveRight( edctrl, 1 ) == ASIX_OK )
							{
								edctrl->curColumn = pmatrix->len;
								UpdateInputArea( edctrl, edctrl->curLine, 0 );
							}
						}
						else
						{								
							// 光标右移(sed)
							edctrl->curColumn++;
							dispx = edctrl->pmatrix[0].vector[edctrl->curColumn].x;
							if( *(edctrl->curCursorPos -1) & 0x80 )
								dispy = edctrl->y + ( edctrl->lineHeight - CHINESE_CHAR_HEIGHT )/2;
							else
								dispy = edctrl->y + ( edctrl->lineHeight - ENGLISH_CHAR_HEIGHT )/2;
							SetCursorPosition( hGC, dispx, dispy );
						}
						break;
					case BACKSPACE: // BackSpace
						if( edctrl->style & ES_READONLY )
							break;

						// 光标在字符串首(sed)
						if( edctrl->curCursorPos == edctrl->pbuf )
							break;
						
						// 删除前一个字符(sed)
						pmatrix = &edctrl->pmatrix[0];
						cLen = (*(edctrl->curCursorPos -1)& 0x80 )? 2 : 1;
						strcpy( edctrl->curCursorPos - cLen, edctrl->curCursorPos );
						edctrl->curCursorPos -= cLen;
						edctrl->strLen -= cLen;
						if( edctrl->curColumn != 0 )
						{	
							curLineHead = pmatrix->lineHead;
							width = pmatrix->w - ( cLen == 2 ? CHINESE_CHAR_WIDTH : ENGLISH_CHAR_WIDTH );
						}
						else
						{
							curLineHead = edctrl->curCursorPos;
							width = 0;
						}

						while( curLineHead != edctrl->pbuf && width <= edctrl->width -4 )
						{
							cLen = ( *(curLineHead-1) & 0x80 ) ? 2 : 1;
							curLineHead -= cLen;
							width += ( cLen == 2 ? CHINESE_CHAR_WIDTH : ENGLISH_CHAR_WIDTH );
						}
						if( width > edctrl->width -4 )
							curLineHead += cLen;
						
						pmatrix->lineHead = curLineHead;
						FillVector( edctrl, curLineHead, 0, &offset );
						i = 0;
						while( pmatrix->lineHead + pmatrix->vector[i].index != edctrl->curCursorPos )
							i++;
						edctrl->curColumn = i;
						UpdateInputArea( edctrl, 0, 0 );
						break;
					case DELETE: // Delete(sed)
						if( edctrl->style & ES_READONLY )
							break;

						if( *edctrl->curCursorPos == '\0' )	// cursor at the end of string
							break;
						
						pmatrix = &edctrl->pmatrix[0];
						curLineHead = pmatrix->lineHead;
						
						cLen = (*edctrl->curCursorPos & 0x80 )? 2 : 1;
						strcpy( edctrl->curCursorPos, edctrl->curCursorPos + cLen );
						edctrl->strLen -= cLen;
						
						FillVector( edctrl, curLineHead, 0, &offset );
						width = pmatrix->w;
						while( curLineHead != edctrl->pbuf && width <= edctrl->width -4 )
						{
							cLen = ( *(curLineHead-1) & 0x80 ) ? 2 : 1;
							curLineHead -= cLen;
							width += ( cLen == 2 ? CHINESE_CHAR_WIDTH : ENGLISH_CHAR_WIDTH );
						}
						if( curLineHead != edctrl->pbuf )
							curLineHead += cLen;
						
						pmatrix->lineHead = curLineHead;
						FillVector( edctrl, curLineHead, 0, &offset );
						i = 0;
						while( pmatrix->lineHead + pmatrix->vector[i].index != edctrl->curCursorPos )
							i++;
						edctrl->curColumn = i;
						UpdateInputArea( edctrl, 0, 0 );
						break;
					default:
						break;
				}
			}
			break;
		case WM_HSCROLL:	// 水平滚动(sed)
			pmatrix = &edctrl->pmatrix[0];
			curLineHead = pmatrix->lineHead;
			switch( wparam )
			{
				case SB_LINELEFT:	// 行左移若干字符(sed)
					cLen = ( ( *(edctrl->curCursorPos -1) ) & 0x80 )? CHINESE_CHAR_WIDTH : ENGLISH_CHAR_WIDTH;
					offset = ( cLen + pmatrix->w - edctrl->width +4 );
					
					if( pmatrix->vector[1].x < pmatrix->vector[0].x + offset )
					{
						curLineHead += pmatrix->vector[2].index;
						edctrl->curColumn-- ;
					}
					else
					{
						curLineHead += pmatrix->vector[1].index;
					}
					break;
				case SB_LINERIGHT:	// 行右移若干字符(sed)
					while( curLineHead != edctrl->pbuf && pmatrix->w <= edctrl->width -4 )
					{
						cLen = ( *(curLineHead-1) & 0x80 ) ? 2 : 1;
						curLineHead -= cLen;
						edctrl->curColumn++;
						pmatrix->len++;
						pmatrix->w += ( cLen == 2 ? CHINESE_CHAR_WIDTH : ENGLISH_CHAR_WIDTH );
					}
					if( curLineHead != edctrl->pbuf )
					{
						curLineHead += cLen;
						edctrl->curColumn--;
						pmatrix->len--;
					}
					break;
				default:
					return ASIX_OK;
			}
			// 刷新显示(sed)
			pmatrix->lineHead = curLineHead;
			OrgnizeMatrix( edctrl, 0, 0 );
			edctrl->curCursorPos = curLineHead + pmatrix->vector[edctrl->curColumn].index;
			UpdateInputArea( edctrl, 0, 0 );						
			break;
		case WM_GETFOCUS:				
			dispx = edctrl->pmatrix[0].vector[edctrl->pmatrix[0].len].x;
			dispy = edctrl->pmatrix[0].y + ( edctrl->lineHeight - ENGLISH_CHAR_HEIGHT )/2;
			CreateCursor( hGC, dispx, dispy, 1, ENGLISH_CHAR_HEIGHT, ASIX_CURSOR_ON, EDITOR_CURSOR_FREQUENCE, CURSOR_THREAD );
//			asix_edprintf( "GetFocus" );
			break;
		case WM_LOOSEFOCUS:
			FreeCursor( hGC );			
//			asix_edprintf( "LooseFocus" );
			break;
		case WM_PENDOWN:
			if( GetFocus() != edctrl->windowid )
				SetFocus( edctrl->windowid );
			break;
		case WM_PENXY:
			break;
		case WM_PENUP:
			pmatrix = &edctrl->pmatrix[0];
			curLineHead = pmatrix->lineHead;
			LocateCursorPos( edctrl );
			edctrl->curCursorPos = curLineHead + pmatrix->vector[edctrl->curColumn].index;
			
			if( edctrl->curColumn == 0 )
				p = edctrl->curCursorPos;
			else
				p = edctrl->curCursorPos -1;
			charHeight = (*p) & 0x80 ? CHINESE_CHAR_HEIGHT : ENGLISH_CHAR_HEIGHT;

			dispx = pmatrix->vector[edctrl->curColumn].x;
			dispy = pmatrix->y + ( edctrl->lineHeight - charHeight )/2;
			SetCursorPosition(	hGC, dispx, dispy );
			break;
		default:
			break;
	}

	return ASIX_OK;
}

STATUS MultiEdMsgProc( U16 asix_msg, struct ed_ctrl *edctrl, void *data, U16 wparam, void *reserved )
{
	U32				hGC;
	MSG				ed_msg; 
	S8				*newPos, *curLineHead;
	U16				offset, cLen;
	U8				*p;
	U16				dispx, dispy;
	U16				i, k,endLine;
	struct char_matrix	*pmatrix;
//	struct char_pos		*vector;
	U16				charHeight;
	
	hGC = GetGC();

	memset( &ed_msg, 0x0, sizeof(MSG) );
	ed_msg.messageType = ASIX_MESSAGE;

//SWITCH_1:	
	switch( asix_msg )
	{
		case WM_CHAR:
			if( isChinese( wparam ) || isprint( wparam ) )
			{
				if( edctrl->style & ES_READONLY || ( edctrl->style & ES_NUMBER && !isdigit( wparam ) ) )
					break;	// break switch_1 'asix_msg'

				newPos = InsertChar( edctrl->pbuf, edctrl->curCursorPos, wparam, &edctrl->strLen, edctrl->bufSize );
				if( newPos == NULL )
					break;	// break switch_1 'asix_msg'
				
				if( isChinese( wparam ) )
					offset = CHINESE_CHAR_WIDTH;
				else
					offset = ENGLISH_CHAR_WIDTH;
				
				pmatrix = &edctrl->pmatrix[edctrl->curLine];
//				if( edctrl->curColumn == pmatrix->len && pmatrix->w + offset >= edctrl->width -4 )
				if( pmatrix->vector[edctrl->curColumn].x - pmatrix->x + offset >= edctrl->width -2 )
				{
					// 光标在行尾,不够显示
					edctrl->curColumn = 1;
					if( edctrl->curLine == edctrl->curPage + edctrl->pageLine -1 )
					{
						// 当前行是页尾,下移一行
						edctrl->curCursorPos = newPos;
						
						if( JumpDown( edctrl, 1 ) == ASIX_OK )
						{
							SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
							pmatrix = &edctrl->pmatrix[edctrl->curLine];
							if( pmatrix->len <= edctrl->curColumn )
								edctrl->curColumn = pmatrix->len;
							edctrl->curCursorPos = pmatrix->lineHead + pmatrix->vector[edctrl->curColumn].index;
							
							UpdateInputArea( edctrl, edctrl->curPage, 0 );
						}
						return ASIX_OK;
					}
					edctrl->curCursorPos = newPos;
					OrgnizeMatrix( edctrl, edctrl->curLine, 0 );
					edctrl->curLine++;
					UpdateInputArea( edctrl, (U16)(edctrl->curLine-1), 0 );
					//AdjustCursorDisp( hGC );
				}
				else
				{
					if( pmatrix->lineHead == NULL )
						pmatrix->lineHead = edctrl->curCursorPos;
					edctrl->curCursorPos = newPos;
					edctrl->curColumn += 1;
					OrgnizeMatrix( edctrl, edctrl->curLine, 0 );
					UpdateInputArea( edctrl, edctrl->curLine, 0 );
				}
				
			}
			else
			{
//SWITCH_2:		
				switch( wparam )
				{
					case '\r':	// 0x0d
						if( edctrl->style & ES_READONLY )
							break;	// break switch_2 'wparam'

						newPos = InsertChar( edctrl->pbuf, edctrl->curCursorPos, wparam, &edctrl->strLen, edctrl->bufSize );
						if( newPos == NULL )
							break;	// break switch_2 'wparam'
											
						edctrl->curCursorPos = newPos;
						pmatrix = &edctrl->pmatrix[edctrl->curLine];
						if( edctrl->curLine == edctrl->curPage + edctrl->pageLine -1 )
						{
							// 当前行是页尾,下移一行
//							edctrl->curCursorPos = newPos;
							edctrl->curColumn = 0;
							
							if( JumpDown( edctrl, 1 ) == ASIX_OK )
							{
								SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
								pmatrix = &edctrl->pmatrix[edctrl->curLine];
								
								UpdateInputArea( edctrl, edctrl->curPage, 0 );
							}
							return ASIX_OK;
						}
						// 换行
						OrgnizeMatrix( edctrl, edctrl->curLine, 0 );
						edctrl->curLine++;
						edctrl->curColumn = 0;
						UpdateInputArea( edctrl, (U16)(edctrl->curLine-1), 0 );
						break;	// break switch_2 'wparam'
					case ESCAPE: // ESC
						if( edctrl->style & ES_READONLY )
							break;	// break switch_2 'wparam'

						// 清除所有输入,刷新显示(med)						
						if( edctrl->curPage != 0 )
						{
							// 当前页不是首页
							for( i = 0; i < edctrl->pageLine; i++ )
							{
								edctrl->pmatrix[i].vector = edctrl->pmatrix[edctrl->curPage + i].vector;
								edctrl->pmatrix[i].y = edctrl->pmatrix[edctrl->curPage + i].y;
								edctrl->pmatrix[edctrl->curPage + i].vector = NULL;
								edctrl->pmatrix[i].lineHead = NULL;
							}
						}

						edctrl->pbuf[0] = '\0';
						edctrl->maxPage = 0;
						edctrl->curCursorPos = edctrl->pbuf;
						edctrl->curLine = 0;
						edctrl->curColumn = 0;
						edctrl->curPage = 0;
						edctrl->pmatrix[0].lineHead = edctrl->pbuf;
						edctrl->strLen = 0;
						
						OrgnizeMatrix( edctrl, 0, 0 );
						UpdateInputArea( edctrl, 0, 0 );
						SetScrollRange( edctrl->sbid, 0, edctrl->maxPage );
						SetScrollPos( edctrl->sbid, 0, 0, 0 );
						
						break;	// break switch_2 'wparam'
					case MOVE_LEFT:		// 光标左移一个字符(med)
						pmatrix = &edctrl->pmatrix[edctrl->curLine];
						curLineHead = pmatrix->lineHead;
						// 光标在字符串首(med)
						if( edctrl->curCursorPos == edctrl->pbuf )	
							break;	// break switch_2 'wparam'

						newPos = edctrl->curCursorPos -1;
						cLen = ( *newPos & 0x80 ) ? 2 : 1;
						edctrl->curCursorPos -= cLen;

						if( edctrl->curColumn == 0 )	// 光标在行首(med)
						{							
							// 页首,上移一行(med)
							if( edctrl->curLine == edctrl->curPage )
							{

								if( JumpUp( edctrl, 1 ) == ASIX_OK )
								{					
									SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
									pmatrix = &edctrl->pmatrix[edctrl->curLine];
									if( pmatrix->lineHead + pmatrix->vector[pmatrix->len].index == edctrl->curCursorPos )
										edctrl->curColumn = pmatrix->len;
									else
										edctrl->curColumn = pmatrix->len -1;								
									UpdateInputArea( edctrl, edctrl->curPage, 0 );
								}
								return ASIX_OK;
							}
							else
							{
								edctrl->curLine--;
								SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
								pmatrix = &edctrl->pmatrix[edctrl->curLine];
								if( pmatrix->lineHead + pmatrix->vector[pmatrix->len].index == edctrl->curCursorPos )
									edctrl->curColumn = pmatrix->len;
								else
									edctrl->curColumn = pmatrix->len -1;								
							}
						}
						else	
							edctrl->curColumn--;
															
						pmatrix = &edctrl->pmatrix[edctrl->curLine];
						edctrl->curCursorPos = pmatrix->lineHead + pmatrix->vector[edctrl->curColumn].index;
						if( edctrl->curColumn == 0 )
							p = pmatrix->lineHead;
						else
							p = pmatrix->lineHead + pmatrix->vector[edctrl->curColumn-1].index;
						cLen = (*p & 0x80) ? CHINESE_CHAR_HEIGHT : ENGLISH_CHAR_HEIGHT;
						dispx = pmatrix->vector[edctrl->curColumn].x;
						dispy = pmatrix->y + ( edctrl->lineHeight - cLen )/2;
						SetCursorPosition( hGC, dispx, dispy );
						break;	// break switch_2 'wparam'
					case MOVE_RIGHT:	// 光标右移一个字符(med)
						// 光标在字符串尾(med)
						if( *( edctrl->curCursorPos ) == '\0' )

⌨️ 快捷键说明

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