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

📄 uiviewport.c

📁 嵌入工linux开发的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************
        INCLUDE FILE
***************************************************************/

#include <pr2k.h>
#include <uiwnd.h>

#include <uigraph.h>
#include <uiScroll.h>
#include <uiCallback.h>
#include <uiCaret.h>
#include <uiviewport.h>
#include <keypad.h>


static HNDL gh_ActiveCtrl = NULL;   // active control 
static int gi_PenMoveOut_Flag = 0 ; // move out of active control 
static int gi_ReEnterVport_Flag=0;

HNDL _guiViewport_SearchControl(HNDL hVport,WORD wNewX,WORD wNewY)
{
	TViewport * pVport;
	TGuiControl *pCtrl;
	struct dLinkList *pLinkList;

	pVport=(TViewport *)hVport;
	pLinkList=&pVport->tControlList;

	if(pVport->hVScroll)
	{
		pCtrl=(TGuiControl *)pVport->hVScroll;
		if(wNewX>=pCtrl->left&&wNewX<=pCtrl->right+1&&wNewY>=pCtrl->top&&wNewY<=pCtrl->bottom)
		{
			return pVport->hVScroll;
		}
	}

	if(pVport->hHScroll)
	{
		pCtrl=(TGuiControl *)pVport->hHScroll;
		if(wNewX>=pCtrl->left&&wNewX<=pCtrl->right&&wNewY>=pCtrl->top&&wNewY<=pCtrl->bottom+1)
		{
			return pVport->hHScroll;
		}
	}

	return guiSearchControl(pLinkList, wNewX, wNewY) ;

}

void _guiViewport_DealScroll(HNDL hVport,HNDL hActiveCtrl)
{
	WORD wNewX,wNewY;
	TViewport *pVport;

	pVport=(TViewport *)hVport;

	if(pVport->hVScroll==hActiveCtrl)
	{
		wNewX=pVport->iCurrentLeft;
		wNewY=guiScroll_GetPos(pVport->hVScroll)*pVport->wVScroll_Dot;
		
		if(wNewY!=pVport->iCurrentTop)
		{
			guiViewport_Move(hVport,wNewX,wNewY);
		}
	}
	else if(pVport->hHScroll==hActiveCtrl)
	{
		wNewY=pVport->iCurrentTop;
		wNewX=guiScroll_GetPos(pVport->hHScroll)*pVport->wHScroll_Dot;
		
		if(wNewX!=pVport->iCurrentLeft)
		{
			guiViewport_Move(hVport,wNewX,wNewY);
		}
	}
}

void guiViewport_Action(HNDL hVport,WORD msg,WORD x,WORD y)
{
	short n;
	WORD wNewX,wNewY;

	HNDL hCtrl;
	TViewport * pVport;
	TGuiControl *pCtrl;
	TGuiMessage tempMsg;
	PTGUISCROLL ptScroll;
	
	pVport=(TViewport *)hVport;

	guiEnterWCS();

	if(guiControl_QueryIsActive(hVport)==FALSE)
	{
		guiExitWCS();
		return ;
	}

	if(msg==PENUP||msg==PENDOWN||msg==PENMOVE||msg==PENROVE)
	{
		//coordinate convert;
		wNewX=x-pVport->base.left+pVport->iCurrentLeft;
		wNewY=y-pVport->base.top+pVport->iCurrentTop;
	}

	switch(msg)
	{
	case PENDOWN:
		if(gi_PenMoveOut_Flag&&gi_ReEnterVport_Flag==0)
		{
			gh_ActiveCtrl=0;
			gi_PenMoveOut_Flag=0;
		}
		if (gh_ActiveCtrl == 0)
		{
			gh_ActiveCtrl = _guiViewport_SearchControl(hVport,wNewX,wNewY);
			if(gh_ActiveCtrl != 0)
			{
				// disable key event
				guiSetKeypadLock(1);
				
				// disable cursor blinking in textfield
				// for {PENMOVE, PENROVE, PENDOWN} event
				//tong				pdaTextField_DisableCursor();
				
				pCtrl = (TGuiControl *)gh_ActiveCtrl;
				// 呼叫这个control的action call back function 
				(pCtrl->actionFun)(gh_ActiveCtrl, PENDOWN,wNewX, wNewY) ;

				_guiViewport_DealScroll(hVport,gh_ActiveCtrl);
			}
			else
			{
				tempMsg.messageType=VPORT_PEN_DOWN;
				tempMsg.handle=hVport;
				tempMsg.x=wNewX;
				tempMsg.y=wNewY;
				_guiEnqueue(gpTopWindow->messageQueue,&tempMsg);
				
			} 
		}
		break;    

	case PENUP:
		if (gh_ActiveCtrl != 0)
		{
			 hCtrl= _guiViewport_SearchControl(hVport,wNewX,wNewY) ;
			if ( hCtrl==gh_ActiveCtrl )
			{
				pCtrl = (TGuiControl *)hCtrl;
				// 呼叫这个control的action callback function 
				(pCtrl->actionFun)(hCtrl, PENUP,wNewX, wNewY) ;

				_guiViewport_DealScroll(hVport,gh_ActiveCtrl);
				// try to re-enable cursor
				//pdaTextField_EnableCursor();
			}

			gh_ActiveCtrl = 0;
			gi_PenMoveOut_Flag = 0;

			// enable key event
			guiSetKeypadLock(0);
			
		}
		else
		{
			tempMsg.messageType=VPORT_PEN_UP;
			tempMsg.handle=hVport;
			tempMsg.x=wNewX;
			tempMsg.y=wNewY;
			_guiEnqueue(gpTopWindow->messageQueue,&tempMsg);
			
		}   
		break;    
		
	case PENMOVE:
		
		if (gh_ActiveCtrl != 0)
		{
			
			// disable cursor blinking in textfield
			// for {PENMOVE, PENROVE, PENDOWN} event
			//pdaTextField_DisableCursor();
			hCtrl = _guiViewport_SearchControl(hVport,wNewX,wNewY) ;
			
			if ( hCtrl==gh_ActiveCtrl )
			{
				
				if (gi_PenMoveOut_Flag==1)
				{
					tempMsg.messageType = CONTROL_ENTER;
					tempMsg.handle = gh_ActiveCtrl;
					_guiEnqueue(gpTopWindow->messageQueue, &tempMsg) ;
					gi_PenMoveOut_Flag = 0;
					
					pCtrl = (TGuiControl *)gh_ActiveCtrl;
					// re-enable control
					(pCtrl->actionFun)(gh_ActiveCtrl, PENDOWN,wNewX, wNewY) ;

					_guiViewport_DealScroll(hVport,gh_ActiveCtrl);
					break;
				}
				
				pCtrl = (TGuiControl *)gh_ActiveCtrl;
				// 呼叫这个control的action callback function 
				(pCtrl->actionFun)(gh_ActiveCtrl, PENMOVE,wNewX, wNewY) ;

				_guiViewport_DealScroll(hVport,gh_ActiveCtrl);
				
			} 
			else 
			{
				// PENROVE 只会送一次
				if (gi_PenMoveOut_Flag==0)
				{
					tempMsg.messageType = CONTROL_EXIT;
					tempMsg.handle = gh_ActiveCtrl;
					_guiEnqueue(gpTopWindow->messageQueue, &tempMsg) ;
					gi_PenMoveOut_Flag = 1;
					
					pCtrl = (TGuiControl *)gh_ActiveCtrl;
					// 呼叫这个control的action callback function 
					(pCtrl->actionFun)(gh_ActiveCtrl, PENROVE,wNewX, wNewY) ;

					_guiViewport_DealScroll(hVport,gh_ActiveCtrl);
				}
			
			}
		}
		else
		{
			tempMsg.messageType=VPORT_PEN_MOVE;
			tempMsg.handle=hVport;
			tempMsg.x=wNewX;
			tempMsg.y=wNewY;
			_guiEnqueue(gpTopWindow->messageQueue,&tempMsg);
			
		}   
		break;

	case PENROVE:
		gi_ReEnterVport_Flag=0;
		if (gh_ActiveCtrl != 0&&gi_PenMoveOut_Flag==0)
		{
			tempMsg.messageType = CONTROL_EXIT;
			tempMsg.handle = gh_ActiveCtrl;
			_guiEnqueue(gpTopWindow->messageQueue, &tempMsg) ;
			gi_PenMoveOut_Flag = 1;
			
			pCtrl = (TGuiControl *)gh_ActiveCtrl;
			// 呼叫这个control的action callback function 
			(pCtrl->actionFun)(gh_ActiveCtrl, PENROVE,wNewX, wNewY) ;
		}
		
		break;    

	case PENREENTER:
		gi_ReEnterVport_Flag=1;
		break;
	
	//deal hardkey;
	case KEYPAD_CLICK:
		switch(x)
		{
		case  HARDKEY_UP:
			if(pVport->hVScroll)
			{
				n=guiScroll_GetPos(pVport->hVScroll);
				if(n>0)
				{
					guiScroll_SetPos(pVport->hVScroll,(WORD)(n-1));					

					_guiViewport_DealScroll(hVport,pVport->hVScroll);
				}
			}
			break;
		case HARDKEY_DOWN:
			if(pVport->hVScroll)
			{
				n=guiScroll_GetPos(pVport->hVScroll);
				if(n>=0)
				{
					guiScroll_SetPos(pVport->hVScroll,(WORD)(n+1));
					_guiViewport_DealScroll(hVport,pVport->hVScroll);
				}
			}
			break;
		case  HARDKEY_LEFT:
			if(pVport->hHScroll)
			{
				n=guiScroll_GetPos(pVport->hHScroll);
				if(n>0)
				{
					guiScroll_SetPos(pVport->hHScroll,(WORD)(n-1));
					_guiViewport_DealScroll(hVport,pVport->hHScroll);
				}
			}
			break;
		case HARDKEY_RIGHT:
			if(pVport->hHScroll)
			{
				n=guiScroll_GetPos(pVport->hHScroll);
				if(n>=0)
				{
					guiScroll_SetPos(pVport->hHScroll,(WORD)(n+1));
					_guiViewport_DealScroll(hVport,pVport->hHScroll);
				}
			}
			break;
		default:
			break;
		}
	default:
		break;
	} // switch

	guiExitWCS();
	return;

}

/*	create new Viewport */
DLL_EXP(HNDL) guiViewport_Create( WORD wLeft, WORD wTop,WORD wRight,WORD wBottom,WORD wStyle)
{
	WORD wExt;
	TViewport *pVport;

	pVport=(TViewport *)sc_malloc(sizeof(TViewport));
	if(pVport==NULL)
	{
		return NULL;
	}

	//Initialize base;
	pVport->base.handle=(HNDL)pVport;
	pVport->base.left=wLeft;
	pVport->base.top=wTop;
	pVport->base.right=wRight;
	pVport->base.bottom=wBottom;
	pVport->base.type=CONTROL_VIEWPORT;
	pVport->base.style=wStyle;
	pVport->base.status=0;
	pVport->base.showFun=guiViewport_Show;
	pVport->base.delFun=guiViewport_Delete;
	pVport->base.actionFun=guiViewport_Action;
	pVport->base.container=NULL;
	pVport->base.vportHandle=NULL;
	pVport->base.checkFlag=GUI_CONTROL_CHECK_FLAG;

	//Initialize pVprot;
	pVport->iCurrentLeft=0;
	pVport->iCurrentTop=0;
	pVport->iVirtualHeight=0;
	pVport->iVirtualWidth=0;

	//initialize control list;
	initDLinkList(&pVport->tControlList);

	//create vertical scrollbar
	if(wStyle&VPORT_V_SCROLLBAR)
	{
		wExt=wBottom-wTop-1;
		if(wStyle&VPORT_H_SCROLLBAR)
		{
			wExt-=_SCROLLBAR_WIDTH_;
		}

		pVport->wVScroll_Dot=1;
		pVport->wVScroll_Page=wExt/pVport->wVScroll_Dot;
		pVport->hVScroll=guiScroll_Create(wRight-wLeft-_SCROLLBAR_WIDTH_,1,wExt,pVport->iVirtualHeight/pVport->wVScroll_Dot,pVport->wVScroll_Page,0);
		if(pVport->hVScroll)
		{
			((TGuiControl *)pVport->hVScroll)->vportHandle=(HNDL)pVport;
			//guiControl_Enable(pVport->hVScroll);
		}
	}
	else
	{
		pVport->hVScroll=0;
	}

	//create horizontal scrollbar
	if(wStyle&VPORT_H_SCROLLBAR)
	{
		wExt=wRight-wLeft-1;
		if(wStyle&VPORT_V_SCROLLBAR)
		{
			wExt-=_SCROLLBAR_WIDTH_;
		}

		pVport->wHScroll_Dot=1;
		pVport->wHScroll_Page=wExt/pVport->wHScroll_Dot;
		pVport->hHScroll=guiScroll_Create(1,wBottom-wTop-_SCROLLBAR_WIDTH_,wExt,pVport->iVirtualWidth/pVport->wHScroll_Dot,pVport->wHScroll_Page,SCROLL_HORIZONTAL);

		if(pVport->hHScroll)
		{
			((TGuiControl *)pVport->hHScroll)->vportHandle=(HNDL)pVport;
			//guiControl_Enable(pVport->hHScroll);
		}
	}
	else
	{
		pVport->hHScroll=0;
	}

	

	return (HNDL)pVport;
}

/*	delete viewport */
DLL_EXP(int) guiViewport_Delete( HNDL handle )
{
	struct dLinkList  *pControlList;
	TGuiControl *pCtrl;
	TViewport *pVport;

	pVport=(TViewport *)handle;
	guiEnterWCS();

	//check handle is or not valid;
	if(pVport->base.checkFlag!=GUI_CONTROL_CHECK_FLAG)
	{
		guiExitWCS();
		return STATUS_ERR;
	}

	if(pVport->base.type!=CONTROL_VIEWPORT)
	{
		guiExitWCS();
		return STATUS_ERR;
	}


	//delete control list;
	pControlList=pVport->tControlList.back;
	while(pControlList!=NULL)
	{
		pCtrl=(TGuiControl *)pControlList->elementPointer;

		if(pCtrl!=NULL)
		{
			pCtrl->delFun((HNDL)pCtrl);
		}

		pControlList=pControlList->back;
	}
	freeDLinkList(&pVport->tControlList);


	//delete scrollbar
	if(pVport->hHScroll!=NULL)
	{
		((TGUISCROLL *)pVport->hHScroll)->base.delFun(pVport->hHScroll);
	}
	if(pVport->hVScroll!=NULL)
	{
		((TGUISCROLL *)pVport->hVScroll)->base.delFun(pVport->hVScroll);
	}

	//free viewport
	pVport->base.checkFlag=0;
	sc_free(pVport);

	guiExitWCS();
	return STATUS_OK;
}

/*	enable viewport */
DLL_EXP(int) guiViewport_Show( HNDL hVport )
{
	WORD wExt;
	int left,top,right,bottom,gap;
	HNDL hContainer;

	TViewport *pVport;
	TGUISCROLL *pScroll;

	pVport=(TViewport *)hVport;
	guiEnterWCS();
	
	if(pVport->base.checkFlag!=GUI_CONTROL_CHECK_FLAG||guiControl_IsVisible(hVport)==FALSE)
	{
		guiExitWCS();
		return STATUS_ERR;
	}

	pVport=(TViewport *)hVport;
	
	hContainer=pVport->base.container;

	if((pVport->base.style&VPORT_NONE_BORDER)==0)
	{
		left=pVport->base.left;
		top=pVport->base.top;
		right=pVport->base.right;
		bottom=pVport->base.bottom;
		
		guiDrawLine(hContainer,left,top,left,bottom,GUI_BLACK,0);
		guiDrawLine(hContainer,right,top,right,bottom,GUI_BLACK,0);
		guiDrawLine(hContainer,left,top,right,top,GUI_BLACK,0);
		guiDrawLine(hContainer,left,bottom,right,bottom,GUI_BLACK,0);
	}

/*	if((pVport->base.style&VPORT_NONE_BORDER)==0)
	{
		left=0;
		top=0;
		right=pVport->base.right-pVport->base.left;
		bottom=pVport->base.bottom-pVport->base.top;
		
		guiDrawLine(hVport,left,top,left,bottom,GUI_BLACK,0);
		guiDrawLine(hVport,right,top,right,bottom,GUI_BLACK,0);
		guiDrawLine(hVport,left,top,right,top,GUI_BLACK,0);
		guiDrawLine(hVport,left,bottom,right,bottom,GUI_BLACK,0);
	}
*/
	//get rectangle's coordinate of viewport related viewport original point;
	left=pVport->iCurrentLeft;
	top=pVport->iCurrentTop;
	right=left+(pVport->base.right-pVport->base.left);
	bottom=top+(pVport->base.bottom-pVport->base.top);

	if(pVport->hVScroll)
	{
		pScroll=(TGUISCROLL *)pVport->hVScroll;

		gap=1;
		if(pVport->hHScroll)
		{
			gap+=_SCROLLBAR_WIDTH_;

⌨️ 快捷键说明

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