brw_mark.c

来自「好记星的控件,包括button,list,对文件操作」· C语言 代码 · 共 786 行 · 第 1/2 页

C
786
字号
/**************************************************************************
                                                                          
              Copyright (C) 2005 SHENZHEN MEIJIN CO.LTD                   
                                                                          
 FILE NAME:   brw_mark.C                                                      
 MODULE NAME: browser                                                        
 DESCRIPTION: 浏览器对mark相关的函数
 对外函数声明:
		BrowserMarkKeyProcess	mark按键处理
		BrowserMarkWordMemLen	Mark块内存长度
		BrowserGetNewCursor		确定mark位置



		
**************************************************************************
    DTAE       AUTHOR     VERSION                 REMARKS                 
 =========== ==========  =========  ======================================
 2006-3-5    gaolinhui    V1.0					create                               
***************************************************************************/
#include "kernel.h"
#include "BrowserIn.h"

			
/************************************************************************/
/* 函数名称: BrowserMarkKeyProcess                                        */
/* 函数描述: 按键处理函数	                                            */
/* 当前版本: 1.0                                                        */
/* 作    者: gaolinhui                                                      */
/* 输入参数:                                                            */
/*			handle			- 对象句柄									*/
/*			pEvent			- 消息指针									*/
/* 输出参数:                                                            */
/*          NONE					                                    */
/* 返回值  :                                                            */
/*          消息处理返回值                                              */
/* 更改记录:                                                            */
/* =====================================================================*/
/*    日期       人员       版本   描述                                 */
/* =====================================================================*/
/* 2006-3-1    gaolinhui      1.0    创建	                                */
/************************************************************************/
INT BrowserMarkKeyProcess(MBrowser *handle, UINT uEvent, UINT uParam)
{
	UINT		bIsMarking;
	UINT8 		*pNewCursor, *pOldCursor, *pCurrent, *pStart, 
                    *pOldEnd, *pOldStart;
	UINT32		dwLine, dwTopLine, dwLineNum;
	UINT16		wCol;
	BOOL		bShifKey;
	UINT		uKey;


	/*是否有MARK属性*/
	if (!(handle->pBrwInfo->wOptions & BROWSER_OPTION_MARK))
	{
		return 0L;
	}
	/*MARK开始位置*/
	pStart = handle->pBrwInfo->pMarkStart;
	pOldStart = handle->pBrwInfo->pMarkStart;
	/*MARK结束位置*/
	pOldEnd = handle->pBrwInfo->pMarkEnd;
	/*MARK当前位置*/
	pOldCursor = handle->pBrwInfo->pMarkCur;		
	uKey =  READKB_VALUE(uParam);
	bShifKey = READKB_SHIFTMASK(uParam);


    /*是否在MARK状态?*/
	bIsMarking = (handle->pBrwInfo->wStates & BROWSER_STATE_MARKING);
    if (!bIsMarking)
    {
		/*非MARK状态*/
        if ((uKey == MVK_RIGHT) /*&& bShifKey*/)
        {
			/*右键MARK屏幕第一个单元*/
			MsgSend2((APGUI_STRUCT_MODEL*)handle, EVENT_COMMAND, CM_BROWSER_MARKSTART);
			return 1;
        }
		else if ((uKey == MVK_LEFT) /*&& bShifKey*/)
		{
			/*左键MARK屏幕最后一个单元*/
			MsgSend2((APGUI_STRUCT_MODEL*)handle,EVENT_COMMAND,CM_BROWSER_MARKEND);

			return 1;
		}
        else
        {
            return 0L;
        }
    }	
	/*MARK状态下的处理*/
    /*得到新的位置*/
	pNewCursor = BrowserGetNewCursor(handle, pOldCursor, uKey);
	if (pNewCursor == (UINT8*)NULL)
	{
		if(uKey == MVK_LEFT || uKey == MVK_RIGHT)
			MsgSend2((APGUI_STRUCT_MODEL*)handle,EVENT_COMMAND, CM_BROWSER_CANCELMARK);
		return 1;
	}

	pCurrent = pNewCursor;
	if (bShifKey)
	{
		pCurrent = BrowserGetRealCursor(handle, pNewCursor, pOldCursor);
	}
	BrowserPosToLineCol(handle, pCurrent, &dwLine, &wCol);
	dwTopLine = handle->pBrwInfo->dwTopLine;
	dwLineNum = BrowserPageLineSum(handle,dwTopLine);
    /*MRAK不可以超出屏幕范围*/
	if (dwTopLine > dwLine)
	{
		if(uKey == MVK_LEFT || uKey == MVK_RIGHT)
			MsgSend2((APGUI_STRUCT_MODEL*)handle,EVENT_COMMAND, CM_BROWSER_CANCELMARK);
		return 1;
	}
	else if (dwLine > dwTopLine + dwLineNum - 1)
	{
		if(uKey == MVK_LEFT || uKey == MVK_RIGHT)
			MsgSend2((APGUI_STRUCT_MODEL*)handle,EVENT_COMMAND, CM_BROWSER_CANCELMARK);
		return 1;
	}
	
	/*取消以前的MARK块*/
	BrowserMarkPage(handle);
	if (!bShifKey)
	{
		/*没有shift键组合,则MARK下一个单元*/
		handle->pBrwInfo->pMarkStart = pCurrent;
		handle->pBrwInfo->pMarkEnd = pCurrent 
                        + BrowserMarkWordMemLen(pCurrent);
	}
	else
	{
		/*有shift键组合,则连续MARK*/
		/*调整MARK范围*/
		pNewCursor = pCurrent + BrowserMarkWordMemLen(pCurrent);
		if ((pOldStart < pNewCursor) && (pNewCursor <= pOldEnd))
		{
			/*新的结束位置在以前MARK块中间*/
			if (pOldCursor == pStart)
			{
				/*当前MARK位置和MARK开始位置相同,表示在SHIFT组和MARK中*/
				handle->pBrwInfo->pMarkStart = pCurrent;
			}
			else
			{
				handle->pBrwInfo->pMarkEnd = pCurrent 
                           + BrowserMarkWordMemLen(pCurrent);
			}
		}
		else
		{
			if (pNewCursor <= pStart)
			{
				handle->pBrwInfo->pMarkStart = pCurrent;
			}
			else
			{
				handle->pBrwInfo->pMarkEnd = pCurrent 
                          + BrowserMarkWordMemLen(pCurrent);
			}
		}
	}
    /*调整新的MARK位置*/
	handle->pBrwInfo->pMarkCur = pCurrent;

	BrowserMarkPage(handle);
	return 1;
}




/************************************************************************/
/* 函数名称: BrowserMarkWordMemLen                                        */
/* 函数描述: MARK块内存长度	                                            */
/* 当前版本: 1.0                                                        */
/* 作    者: gaolinhui                                                      */
/* 输入参数:                                                            */
/*			pCurrent		- 数据指针									*/
/* 输出参数:                                                            */
/*          NONE					                                    */
/* 返回值  :                                                            */
/*          内存长度                                                    */
/* 更改记录:                                                            */
/* =====================================================================*/
/*    日期       人员       版本   描述                                 */
/* =====================================================================*/
/* 2006-3-1    gaolinhui      1.0    创建	                                */
/************************************************************************/
UINT16 BrowserMarkWordMemLen(UINT8 *pCurrent)
{
	UINT16	wTmp, wLen;
    UINT uChar,uChar2;

	wLen = 0;
	while (wTmp = BrowserJudgeMarkAbility(pCurrent))
	{
        uChar = *pCurrent;
        uChar2 = *(pCurrent + 1);
		if ((wTmp == 2) && !BrowserJudgeUserFont(pCurrent))
		{
			/*单个汉字是一个MARK单元,也是一个MARK单元的结束标记*/
			if (wLen == 0)
			{
				wLen = 2;
			}
			break;
		}
		else
		{
			wLen += wTmp;
		}		
		pCurrent += wTmp;
	}
	return wLen;
}


/************************************************************************/
/* 函数名称: BrowserGetNewCursor                                          */
/* 函数描述: 确定MARK位置	                                            */
/* 当前版本: 1.0                                                        */
/* 作    者: gaolinhui                                                      */
/* 输入参数:                                                            */
/*			handle			- 对象句柄									*/
/*			pOldCursor		- 数据指针									*/
/*			wDir			- MARK方向									*/
/* 输出参数:                                                            */
/*          NONE					                                    */
/* 返回值  :                                                            */
/*          新位置	                                                    */
/* 更改记录:                                                            */
/* =====================================================================*/
/*    日期       人员       版本   描述                                 */
/* =====================================================================*/
/* 2006-3-1    gaolinhui      1.0    创建	                                */
/************************************************************************/
UINT8* BrowserGetNewCursor(MBrowser *handle, UINT8 *pOldCursor, UINT uDir)
{
	UINT8		*pCursor,*pCheck;
	UINT32		dwLine, dwCursorLine;
	UINT16		wCol, wCursorCol;
    UINT32      totalLine,i = 0;

	BrowserPosToLineCol(handle, pOldCursor, &dwLine, &wCol);
	pCursor = pOldCursor;
    totalLine = handle->pBrwInfo->dwTotalLine;

	switch (uDir)
	{
		case	MVK_LEFT:							/*左键*/
			pCursor = BrowserLocateMarkPosition(handle, 
                                    pOldCursor, BROWSER_GO_BACKWARD);
			break;

		case	MVK_RIGHT:						/*右键*/
			pOldCursor += BrowserMarkWordMemLen(pOldCursor);
			pCursor = BrowserLocateMarkPosition(handle, 
                                    pOldCursor, BROWSER_GO_FORWARD);
			break;

		case	MVK_UP:							/*上键*/
			if (dwLine != 0)
			{
				UINT8 *pTemp;

				/*上一行对应数据位置*/
				pCursor = BrowserLineColToPos(handle, dwLine - 1, wCol);
				/*园整行列位置*/
				pCursor = BrowserLocateMarkPosition(handle, pCursor,
					BROWSER_GO_FORWARD);
				if (pCursor == NULL)
				{
					break;
				}
				BrowserPosToLineCol(handle, pCursor, &dwCursorLine, 
                                    &wCursorCol);
				/*得到新位置*/
				while (dwCursorLine >= dwLine)
				{
					pCheck = pCursor;
					pCursor = BrowserLocateMarkPosition(handle, pCursor, 
                                     BROWSER_GO_BACKWARD);
					if ((pCursor == NULL) || (pCheck == pCursor))
					{
						pCursor = NULL;
						break;
					}
					BrowserPosToLineCol(handle, pCursor, &dwCursorLine, 
						&wCursorCol);
				}
				pTemp = BrowserLocateMarkPosition(handle, 
					pOldCursor, BROWSER_GO_BACKWARD);
				if (pTemp && pCursor && (pTemp < pCursor))
				{
					pCursor = pTemp;
				}
			}
			break;

		case	MVK_DOWN:							/*下键*/
			if (dwLine < totalLine - 1)
			{
				UINT8 *pTemp;

				/*下一行对应位置*/
				pCursor = BrowserLineColToPos(handle, dwLine + 1, wCol);
				if (pCursor == NULL)
				{
					pOldCursor += BrowserMarkWordMemLen(pOldCursor);
					pCursor = BrowserLocateMarkPosition(handle, 
						pOldCursor, BROWSER_GO_FORWARD);
					break;
				}
				pCursor = BrowserLocateMarkPosition(handle, 
					pCursor, BROWSER_GO_FORWARD);
				if (pCursor == NULL)
				{
					do {
						if (!BrowserJudgeMarkAbility(pOldCursor)) {
							break;
						}
						pOldCursor += BrowserMarkWordMemLen(pOldCursor);
						pCursor = BrowserLocateMarkPosition(handle, pOldCursor, BROWSER_GO_FORWARD);
					} while (pCursor);
					break;
				}
				BrowserPosToLineCol(handle, pCursor, &dwCursorLine, 
					&wCursorCol);
				if (dwCursorLine > (dwLine + 1))
				{
					pCursor = BrowserLocateMarkPosition(handle, 
						pCursor, BROWSER_GO_BACKWARD);
					if (pCursor == NULL)
					{
						break;
					}
				}
				pTemp = pOldCursor;
				pTemp += BrowserMarkWordMemLen(pOldCursor);
				while (pCursor < pTemp)
				{
					pCursor = BrowserLineColToPos(handle, dwLine + i, wCol);
					if (pCursor == NULL)
					{
						break;
					}
					i ++;
				}
				pCursor = BrowserLocateMarkPosition(handle, 
					pCursor, BROWSER_GO_FORWARD);
				if (pCursor == NULL)
				{
					break;
				}
				BrowserPosToLineCol(handle, pCursor, &dwCursorLine, 
					&wCursorCol);
				/*得到新位置*/
				while (dwCursorLine <= dwLine)
				{
					pCheck = pCursor;
					pCursor += BrowserMarkWordMemLen(pCursor);
					pCursor = BrowserLocateMarkPosition(handle, pCursor, 
						BROWSER_GO_FORWARD);
					if ((pCursor == NULL) || (pCursor == pCheck))
					{
						pCursor = NULL;
						break;
					}
					BrowserPosToLineCol(handle, pCursor, &dwCursorLine, 
						&wCursorCol);
				}
			}
			break;

		default:
			break;
	}
	return pCursor;
}



/************************************************************************/
/* 函数名称: BrowserGetRealCursor                                         */
/* 函数描述: 连续MARK时候的具体位置                                     */
/* 当前版本: 1.0                                                        */
/* 作    者: gaolinhui                                                      */
/* 输入参数:                                                            */
/*			handle			- 对象句柄									*/

⌨️ 快捷键说明

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