asix_ed.c

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

C
1,876
字号
						{
							edctrl->maxPage = edctrl->curPage;
							SetScrollRange( edctrl->sbid, 0, edctrl->maxPage );
							break;	// break switch_2 'wparam'
						}

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

						pmatrix = &edctrl->pmatrix[edctrl->curLine];
						if( edctrl->curColumn == pmatrix->len )
						{
							// 页尾,下移一行(med)
							edctrl->curColumn = 0;
							if( edctrl->curLine == edctrl->curPage + edctrl->pageLine -1 )
							{
								if( JumpDown( edctrl, 1 ) == ASIX_OK )
								{
									SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
									pmatrix = &edctrl->pmatrix[edctrl->curLine];
									if( pmatrix->lineHead == edctrl->curCursorPos )
										edctrl->curColumn = 0;
									else
										edctrl->curColumn = 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 == edctrl->curCursorPos )
									edctrl->curColumn = 0;
								else
									edctrl->curColumn = 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_UP:
						if( edctrl->curLine == edctrl->curPage )
						{
							if( JumpUp( edctrl, 1 ) == ASIX_ERROR )
								break;	// break switch_2 'wparam'
							SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
						}
						else
							edctrl->curLine--;
						pmatrix = &edctrl->pmatrix[edctrl->curLine];
						if( edctrl->curColumn > pmatrix->len )
							edctrl->curColumn = pmatrix->len;
						edctrl->curCursorPos = pmatrix->lineHead + pmatrix->vector[edctrl->curColumn].index;
						UpdateInputArea( edctrl, edctrl->curPage, 0 );
						break;	// break switch_2 'wparam'
					case MOVE_DOWN:
						if( edctrl->curLine == edctrl->curPage + edctrl->pageLine -1 )
						{
							if( JumpDown( edctrl, 1 ) == ASIX_ERROR )
								break;	// break switch_2 'wparam'
							SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
						}
						else
							edctrl->curLine++;
						pmatrix = &edctrl->pmatrix[edctrl->curLine];
						if( pmatrix->lineHead == NULL )
						{
							edctrl->curLine--;
							break;	// break switch_2 'wparam'
						}
						if( edctrl->curColumn > pmatrix->len )
							edctrl->curColumn = pmatrix->len;
						edctrl->curCursorPos = pmatrix->lineHead + pmatrix->vector[edctrl->curColumn].index;
						UpdateInputArea( edctrl, edctrl->curPage, 0 );
						break;	// break switch_2 'wparam'
					case BACKSPACE: // BackSpace
						if( edctrl->style & ES_READONLY )
							break;	// break switch_2 'wparam'

						// 光标在字符串首(med)
						pmatrix = &edctrl->pmatrix[edctrl->curLine];
						curLineHead = pmatrix->lineHead;
						if( edctrl->curCursorPos == edctrl->pbuf )
							break;	// break switch_2 'wparam'
						
						// 删除前一个字符(med)
						newPos = edctrl->curCursorPos -1;
						cLen = ( (*newPos) & 0x80 )? 2 : 1;		// 中文或英文字符
						if( cLen == 1 )	
						{
							// 删除的是否是换行回车符
							if( *newPos == '\r' )
								offset = 0;
							else if( *newPos == '\n')
							{
								offset = 0;
								if( *(newPos-1) == '\r' )
									cLen = 2;
							}
							else
								offset = 1;
						}
						strcpy( edctrl->curCursorPos - cLen, edctrl->curCursorPos );
						edctrl->curCursorPos -= cLen;
						edctrl->strLen -= cLen;

						if( edctrl->curColumn == 0 )	// 光标在行首
						{
							pmatrix->lineHead -= cLen;
							// 删除的是页首的前一个字符(med)
							if( edctrl->curLine == edctrl->curPage )
							{
								edctrl->curPage--;
								edctrl->pmatrix[edctrl->curPage].y = edctrl->pmatrix[edctrl->curLine].y;
								endLine = edctrl->curLine+edctrl->pageLine-1;
								edctrl->pmatrix[edctrl->curPage].vector = edctrl->pmatrix[endLine].vector;
								edctrl->pmatrix[endLine].vector = NULL;
							}
							edctrl->curLine--;
							edctrl->curColumn = edctrl->pmatrix[edctrl->curLine].len - offset;
							SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
						}
						else
							edctrl->curColumn-- ;

						OrgnizeMatrix( edctrl, edctrl->curLine, 0 );
						
						// 计算冗余空行数
						{
							U16		emptyLine = 0;

							for( i = edctrl->curPage + edctrl->pageLine -1; i > edctrl->curLine; i--, emptyLine++ )
							{
								if( edctrl->pmatrix[i].lineHead != NULL )
									break;
							}
							
							if( JumpUp( edctrl, emptyLine ) == ASIX_OK )
							{	
								edctrl->curLine++;
								UpdateInputArea( edctrl, edctrl->curPage, 0 );
							}
							else
								UpdateInputArea( edctrl, edctrl->curLine, 0 );
						}

						
						break;	// break switch_2 'wparam'
					case DELETE: // Delete(med)
						if( edctrl->style & ES_READONLY )
							break;	// break switch_2 'wparam'

						if( *edctrl->curCursorPos == '\0' )	// cursor at the end of string
							break;	// break switch_2 'wparam'
						
						cLen = (*edctrl->curCursorPos & 0x80 )? 2 : 1;
						strcpy( edctrl->curCursorPos, edctrl->curCursorPos + cLen );
						edctrl->strLen -= cLen;

						OrgnizeMatrix( edctrl, edctrl->curLine, 0 );
						UpdateInputArea( edctrl, edctrl->curLine, 0 );
						break;	// break switch_2 'wparam'
					default:
						break;	// break switch_2 'wparam'
				}
			}
//OUT_2:		
			break;	// break switch_1 'asix_msg'
		case WM_VSCROLL:	// 垂直滚动(med)
			pmatrix = &edctrl->pmatrix[0];
//SWITCH_3:	
			switch( wparam )
			{
				case SB_LINEDOWN:	// 下移一行(med)
					if( JumpDown( edctrl, 1 ) == ASIX_ERROR )
						return ASIX_OK;
					SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
					break;	// break switch_3 'wparam'
				case SB_LINEUP:	// 上移一行(med)
					if( JumpUp( edctrl, 1 ) == ASIX_ERROR )
						return ASIX_OK;					
					SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
					break;	// break switch_3 'wparam'
				case SB_PAGEDOWN:	// 向下翻一页(med)
					if( JumpDown( edctrl, edctrl->pageLine ) == ASIX_ERROR )
						return ASIX_OK;
					SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
					break;	// break switch_3 'wparam'
				case SB_PAGEUP:	// 向上翻一页(med)
					if( JumpUp( edctrl, edctrl->pageLine ) == ASIX_ERROR )
						return ASIX_OK;
					SetScrollPos( edctrl->sbid, edctrl->curPage, 0, 0 );
					break;	// break switch_3 'wparam'
				case SB_THUMBTRACK:
					k = *((U16 *)data);
					dbgoutput( "*** %d ****", k );
					if( k < edctrl->curPage )
					{
						if( JumpUp( edctrl, (U16)(edctrl->curPage - k) ) == ASIX_ERROR )
							return ASIX_OK;
					}
					else
					{
						if( JumpDown( edctrl, (U16)(k - edctrl->curPage) ) == ASIX_ERROR )
							return ASIX_OK;
					}
					break;	// break switch_3 'wparam'
				default:
					return ASIX_OK;
			}						
//OUT_3:		
			// 刷新显示(med)
			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 );
			break;	// break switch_1 'asix_msg'
		case WM_GETFOCUS:				
			pmatrix = &edctrl->pmatrix[edctrl->curLine];
			dispx = pmatrix->vector[pmatrix->len].x;
			dispy = pmatrix->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;	// break switch_1 'asix_msg'
		case WM_LOOSEFOCUS:
			FreeCursor( hGC );			
//			asix_edprintf( "LooseFocus" );
			break;	// break switch_1 'asix_msg'
		case WM_PENDOWN:
			if( GetFocus() != edctrl->windowid )
				SetFocus( edctrl->windowid );
			break;	// break switch_1 'asix_msg'
		case WM_PENXY:
			break;	// break switch_1 'asix_msg'
		case WM_PENUP:
			LocateCursorPos( edctrl );
			pmatrix = &edctrl->pmatrix[edctrl->curLine];
			edctrl->curCursorPos = pmatrix->lineHead + 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;	// break switch_1 'asix_msg'
		default:
			break;	// break switch_1 'asix_msg'
	}
//OUT_1:
	return ASIX_OK;
}

STATUS MoveLeft( struct ed_ctrl *edctrl, U16 num )
{
	U16				cLen;
	U16				i = 0;
	S8				*curLineHead;
	struct char_matrix	*pmatrix;

	pmatrix = &edctrl->pmatrix[0];
	curLineHead = pmatrix->lineHead;

	if( num == 0 || curLineHead == edctrl->pbuf )	
		return ASIX_ERROR;
				
	while( curLineHead != edctrl->pbuf && i < num )
	{
		cLen = ( *(curLineHead-1) & 0x80 ) ? 2 : 1;
		curLineHead -= cLen;
		i++;
	}

	pmatrix->lineHead = curLineHead;
	FillVector( edctrl, curLineHead, 0, &i );

	return ASIX_OK;
}

STATUS MoveRight( struct ed_ctrl *edctrl, U16 num )
{
	U16				width;
	U16				i = 0;
	S8				*curLineHead, *p;
	struct char_matrix	*pmatrix;

	pmatrix = &edctrl->pmatrix[0];
	curLineHead = pmatrix->lineHead;
	p = curLineHead + pmatrix->vector[pmatrix->len].index;

	// 字符串尾(sed)
	if( num == 0 || *p == '\0' )	
		return ASIX_ERROR;
	
	width = pmatrix->w;
	while( *p != '\0' && i < num )
	{
		if( *p & 0x80 )
		{
			width += CHINESE_CHAR_WIDTH;
			p += 2;
		}
		else
		{
			width += ENGLISH_CHAR_WIDTH;
			p++;
		}
		while( width > edctrl->width - 4 )
		{
			if( *curLineHead & 0x80 )
			{
				width -= CHINESE_CHAR_WIDTH;
				curLineHead += 2;
			}
			else
			{
				width -= ENGLISH_CHAR_WIDTH;
				curLineHead++;
			}
		}
		i++;
	}
	
	pmatrix->lineHead = curLineHead;
	FillVector( edctrl, curLineHead, 0, &i );

	return ASIX_OK;
}

STATUS JumpDown( struct ed_ctrl *edctrl, U16 num )
{
	U8				*p;
	U16				offset, index;
	U16				i, k, endLine;
	struct char_matrix	*pmatrix;

	endLine = edctrl->curPage + edctrl->pageLine -1;
	pmatrix = &edctrl->pmatrix[endLine];
	if( num == 0 || pmatrix->lineHead == NULL )
		return ASIX_ERROR;				
	FillVector( edctrl, pmatrix->lineHead, endLine, &offset );
	// 下一行行首字符
	p = pmatrix->lineHead + offset;
//	p = pmatrix->lineHead + pmatrix->vector[pmatrix->len].index;
	if( *p == '\0' )	// 文本结束符
	{
		// 未换行
		if( offset >= 1 && *(p-1) != '\r' && *(p-1) != '\n' )
			return ASIX_ERROR;
	}

	// 跳过换行符
//	if( *p == '\n' || *p == '\r' )
//		p++;

	// 重新排列行矩阵
	k = endLine;
	index = edctrl->curPage + num;
	do
	{
		k++;
		edctrl->pmatrix[k].lineHead = p;
		edctrl->pmatrix[k].vector = edctrl->pmatrix[edctrl->curPage].vector;
		//edctrl->pmatrix[edctrl->curPage].lineHead = NULL;
		edctrl->pmatrix[edctrl->curPage].vector = NULL;
		
		edctrl->curPage++;

		edctrl->pmatrix[k].x = edctrl->x +1;
		for( i = k; i >= edctrl->curPage; i-- )
		{
			edctrl->pmatrix[i].y = edctrl->pmatrix[i-1].y;
		}
		pmatrix = &edctrl->pmatrix[k];
		FillVector( edctrl, pmatrix->lineHead, k, &offset );
		p += offset;
		edctrl->curLine++;
	}while( edctrl->curPage < index && *p != '\0' );
	
	if( *p == '\0' || edctrl->maxPage < edctrl->curPage )
	{
		edctrl->maxPage = edctrl->curPage;
		SetScrollRange( edctrl->sbid, 0, edctrl->maxPage );
	}
	
	return ASIX_OK;
}

STATUS JumpUp( struct ed_ctrl *edctrl, U16 num )
{
	U16				offset, index;
	U16				i, k, endLine;
	struct char_matrix	*pmatrix;

	if( num == 0 || edctrl->curPage == 0 )
		return ASIX_ERROR;					
	
	endLine = edctrl->curPage -1;
	index = (edctrl->curPage < num) ? 0 : edctrl->curPage - num;
	do
	{
		k = edctrl->curPage + edctrl->pageLine -1;
		edctrl->pmatrix[edctrl->curPage -1].vector = edctrl->pmatrix[k].vector;
		edctrl->pmatrix[k].lineHead = NULL;
		edctrl->pmatrix[k].vector = NULL;
		
		edctrl->curPage--;
		
		for( i = edctrl->curPage; i < edctrl->curPage + edctrl->pageLine; i++ )
		{
			edctrl->pmatrix[i].y = edctrl->pmatrix[i+1].y;
		}
		
		pmatrix = &edctrl->pmatrix[edctrl->curPage];
		FillVector( edctrl, pmatrix->lineHead, edctrl->curPage, &offset );				
		edctrl->curLine--;
	}while( edctrl->curPage != 0 && edctrl->curPage > index );
	
	return ASIX_OK;
}

// functions opened to user
S8 *GetEditorStr( U32 windid, S8 *userBuf, U32 bufSize )
{
	struct ed_ctrl *edctrl;

	if( (ASIX_WINDOW *) windid == NULL )
		return NULL;

	edctrl = ((ASIX_WINDOW *) windid)->ctrl_str;
	if( edctrl == NULL || edctrl->windowid != windid || edctrl->classid != WNDCLASS_EDITOR )	// not a editor
		return NULL;
	
	if( edctrl->pbuf == NULL )
		return NULL;

	if( userBuf == NULL )
		return edctrl->pbuf;
	else
	{
		if( bufSize == 0 )
			return NULL;
		strncpy( userBuf, edctrl->pbuf, bufSize -1 );
		
		return userBuf;
	}

}

⌨️ 快捷键说明

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