📄 uiviewport.c
字号:
/**************************************************************
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 + -