📄 iinputwindow.c
字号:
#include "IInputWindow.h"
#include "AEEAppGen.h"
#include "WindowStack.h"
#include "MenuList_res.h"
/////////////////////////Static Function//////////////////////
#define INPUT_TEXT_X_START 2
#define INPUT_TEXT_Y_START 0
#define INPUT_TEXT_MAX_SIZE 150
//窗口的控件
typedef enum
{
INPUT_SOFTKEYCTL=0,
INPUT_TEXT1CTL,
INPUT_TEXT2CTL
}TInputCtlType;
//软键控件的ItemId定义
typedef enum
{
INPUT_SOFTKEY_ITEM = 1,
INPUT_SOFTKEY_ITEM_INPUT_MODE,
INPUT_SOFTKEY_ITEM_DONE,
INPUT_SOFTKEY_ITEM_CANCEL
}TInputMesWinItems;
//按键事件的处理
static boolean IINPUTWINDOW_HandleKeyEvent(IInputWin* pWin,uint16 wParam);
//软键菜单的处理
static boolean IINPUTWINDOW_HandleCommandEvent(IInputWin* pWin,uint16 wParam);
//设置窗口中控件的激活状态
static boolean IINPUTWINDOW_SetActiveCtl(IInputWin* pWin,TInputCtlType nTextCtl);
/////////////////////////Public Function//////////////////////
boolean NewTextInputDialog(
//svoid *pPtr,
InputTextInfo* pTextInfo1,
InputTextInfo* pTextInfo2,
TInputDialogResp tpResponseFunction)
{
IInputWin* pWin;
AEERect Text1Rect;
AEERect Text2Rect;
AEERect softkeyRect;
AEEDeviceInfo di;
uint32 textProps;
AEEApplet* pApp=(AEEApplet*)GETAPPINSTANCE();
if(!pTextInfo1||!tpResponseFunction)
return FALSE;
//分配窗口空间
pWin=MALLOCREC(IInputWin);
if(!pWin) return FALSE;
if(IT_NUMBER==pTextInfo1->m_inputType)
pWin->m_wMode=AEE_TM_NUMBERS;
else
pWin->m_wMode=AEE_TM_LETTERS;
pWin->tpResponseFunction=tpResponseFunction;
//创建软键控件
if(SUCCESS!=ISHELL_CreateInstance(pApp->m_pIShell,AEECLSID_SOFTKEYCTL,
(void **)&(pWin->m_pSoftKeyCtl)))
{
IINPUTWINDOW_Release(pApp->m_pIShell,&pWin);
return FALSE;
}
if(AEE_TM_LETTERS==pWin->m_wMode)
IMENUCTL_AddItem(pWin->m_pSoftKeyCtl, MENULIST_RES_FILE, IDS_INPUTLETTER,INPUT_SOFTKEY_ITEM_INPUT_MODE, NULL, 0);
else
IMENUCTL_AddItem(pWin->m_pSoftKeyCtl, MENULIST_RES_FILE, IDS_INPUTNUMBER,INPUT_SOFTKEY_ITEM_INPUT_MODE, NULL, 0);
IMENUCTL_AddItem(pWin->m_pSoftKeyCtl, MENULIST_RES_FILE, IDS_CANCEL, INPUT_SOFTKEY_ITEM_CANCEL, NULL, 0);
IMENUCTL_AddItem(pWin->m_pSoftKeyCtl,MENULIST_RES_FILE, IDS_OK, INPUT_SOFTKEY_ITEM_DONE, NULL, 0);
IMENUCTL_GetRect(pWin->m_pSoftKeyCtl, &softkeyRect);
ISHELL_GetDeviceInfo(pApp->m_pIShell, &di);
//创建文本输入控件
if(SUCCESS!=ISHELL_CreateInstance(pApp->m_pIShell,AEECLSID_TEXTCTL,(void **)&(pWin->m_pText1)))
{
IINPUTWINDOW_Release(pApp->m_pIShell,&pWin);
return FALSE;
}
if(pTextInfo2&&SUCCESS!=ISHELL_CreateInstance(pApp->m_pIShell,AEECLSID_TEXTCTL,(void **)&(pWin->m_pText2)))
{
IINPUTWINDOW_Release(pApp->m_pIShell,&pWin);
return FALSE;
}
//Rect
Text1Rect.x = INPUT_TEXT_X_START;
Text1Rect.y = INPUT_TEXT_Y_START;
Text1Rect.dx = di.cxScreen-2*INPUT_TEXT_X_START;
Text1Rect.dy = (int16)(softkeyRect.y -INPUT_TEXT_Y_START-1);
if(pTextInfo2)
{
Text1Rect.dy/=2;
Text2Rect.dx=Text1Rect.dx;
Text2Rect.dy=Text1Rect.dy;
Text2Rect.x=Text1Rect.x;
Text2Rect.y=Text1Rect.y+Text1Rect.dy;
ITEXTCTL_SetRect(pWin->m_pText2, &Text2Rect);
}
ITEXTCTL_SetRect(pWin->m_pText1, &Text1Rect);
//Properties
textProps = ITEXTCTL_GetProperties(pWin->m_pText1);
textProps |= TP_FRAME;
textProps |= TP_MULTILINE;
if (IT_PASSWORD==pTextInfo1->m_inputType)
textProps |= TP_PASSWORD;
else if (IT_NUMBER==pTextInfo1->m_inputType)
textProps |= AEE_TM_NUMBERS;
ITEXTCTL_SetProperties(pWin->m_pText1,textProps);
if(pTextInfo2)
{
textProps = ITEXTCTL_GetProperties(pWin->m_pText2);
textProps |= TP_FRAME;
textProps |= TP_MULTILINE;
if (IT_PASSWORD==pTextInfo2->m_inputType)
textProps |= TP_PASSWORD;
else if (IT_NUMBER==pTextInfo2->m_inputType)
textProps |= AEE_TM_NUMBERS;
ITEXTCTL_SetProperties(pWin->m_pText2,textProps);
}
//Max Size
ITEXTCTL_SetMaxSize(pWin->m_pText1,INPUT_TEXT_MAX_SIZE);
if(pTextInfo2)
ITEXTCTL_SetMaxSize(pWin->m_pText2,INPUT_TEXT_MAX_SIZE);
//Set Text
if(pTextInfo2)
{
ITEXTCTL_SetText(pWin->m_pText2, pTextInfo2->m_pText?pTextInfo2->m_pText:(AECHAR*)"\0\0", -1);
ITEXTCTL_SetTitle(pWin->m_pText2,MENULIST_RES_FILE,IDS_INPUTTITLE,pTextInfo2->m_pTitle);
}
ITEXTCTL_SetText(pWin->m_pText1, pTextInfo1->m_pText?pTextInfo1->m_pText:(AECHAR*)"\0\0", -1);
ITEXTCTL_SetTitle(pWin->m_pText1,MENULIST_RES_FILE,IDS_INPUTTITLE,pTextInfo1->m_pTitle);
//Set Active
IINPUTWINDOW_SetActiveCtl(pWin,INPUT_SOFTKEYCTL);
//注册窗口
return IWINSTACK_OpenWindow(WAPWINID_INPUT,pWin);
}
void* IINPUTWINDOW_Create(IShell* pShell,void* pParam)
{
pShell=pShell;
return pParam;
}
boolean IINPUTWINDOW_Release(IShell* pShell,void** pWin)
{
IInputWin* pInputWin=*pWin;
if(pInputWin)
{
if(pInputWin->m_pSoftKeyCtl)
IMENUCTL_Release(pInputWin->m_pSoftKeyCtl);
if(pInputWin->m_pText1)
ITEXTCTL_Release(pInputWin->m_pText1);
if(pInputWin->m_pText2)
ITEXTCTL_Release(pInputWin->m_pText2);
FREEIF(*pWin);
}
return TRUE;
}
boolean IINPUTWINDOW_Redraw(IShell* pShell,void* pWin)
{
IInputWin* pInputWin=pWin;
AEEApplet* pApp=(AEEApplet*)GETAPPINSTANCE();
if(pInputWin&&pApp)
{
IDISPLAY_ClearScreen(pApp->m_pIDisplay);
if(pInputWin->m_pSoftKeyCtl)
IMENUCTL_Redraw(pInputWin->m_pSoftKeyCtl);
if(pInputWin->m_pText1)
ITEXTCTL_Redraw(pInputWin->m_pText1);
if(pInputWin->m_pText2)
ITEXTCTL_Redraw(pInputWin->m_pText2);
IDISPLAY_Update(pApp->m_pIDisplay);
}
return TRUE;
}
boolean IINPUTWINDOW_EventHandle(void* pWin,AEEEvent eCode, uint16 wParam, uint32 dwParam)
{
IInputWin* pInputWin=pWin;
boolean bDispatched = FALSE;
if(NULL==pInputWin) return FALSE;
switch(eCode)
{
case EVT_KEY:
bDispatched=IINPUTWINDOW_HandleKeyEvent(pWin,wParam);
break;
/* case EVT_KEY_HELD://按键长按事件
if(pInputWin->m_pText1&&ITEXTCTL_IsActive(pInputWin->m_pText1))
bDispatched=ITEXTCTL_HandleEvent(pInputWin->m_pText1,eCode,wParam,dwParam);
else if(pInputWin->m_pText2&&ITEXTCTL_IsActive(pInputWin->m_pText2))
bDispatched=ITEXTCTL_HandleEvent(pInputWin->m_pText2,eCode,wParam,dwParam);
break;*/
case EVT_COMMAND:
bDispatched=IINPUTWINDOW_HandleCommandEvent(pWin,wParam);
break;
case EVT_CHAR:
if(pInputWin->m_pText1&&ITEXTCTL_IsActive(pInputWin->m_pText1))
bDispatched=ITEXTCTL_HandleEvent(pInputWin->m_pText1,eCode,wParam,dwParam);
else if(pInputWin->m_pText2&&ITEXTCTL_IsActive(pInputWin->m_pText2))
bDispatched=ITEXTCTL_HandleEvent(pInputWin->m_pText2,eCode,wParam,dwParam);
break;
}
return bDispatched;
}
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
static boolean IINPUTWINDOW_HandleKeyEvent(IInputWin* pWin,uint16 wParam)
{
IInputWin* pInputWin=pWin;
boolean bDispatched = FALSE;
if(NULL==pInputWin) return FALSE;
//首先让当前激活的控件处理按键事件
if(pInputWin->m_pText1&&ITEXTCTL_IsActive(pInputWin->m_pText1))
bDispatched=ITEXTCTL_HandleEvent(pInputWin->m_pText1,EVT_KEY,wParam,0);
else if(pInputWin->m_pText2&&ITEXTCTL_IsActive(pInputWin->m_pText2))
bDispatched=ITEXTCTL_HandleEvent(pInputWin->m_pText2,EVT_KEY,wParam,0);
else if(pInputWin->m_pSoftKeyCtl&&IMENUCTL_IsActive(pInputWin->m_pSoftKeyCtl))
bDispatched=IMENUCTL_HandleEvent(pInputWin->m_pSoftKeyCtl,EVT_KEY,wParam,0);
if(bDispatched) return TRUE;
//如果控件对事件不做处理再执行下面操作
switch(wParam)
{
case AVK_UP:
if(IMENUCTL_IsActive(pWin->m_pSoftKeyCtl))
IINPUTWINDOW_SetActiveCtl(pWin,INPUT_TEXT2CTL);
else if(ITEXTCTL_IsActive(pWin->m_pText1))
IINPUTWINDOW_SetActiveCtl(pWin,INPUT_SOFTKEYCTL);
else
IINPUTWINDOW_SetActiveCtl(pWin,INPUT_TEXT1CTL);
bDispatched = TRUE;
break;
case AVK_DOWN:
if(ITEXTCTL_IsActive(pWin->m_pText1))
{
if (pWin->m_pText2)
IINPUTWINDOW_SetActiveCtl(pWin,INPUT_TEXT2CTL);
else
IINPUTWINDOW_SetActiveCtl(pWin,INPUT_SOFTKEYCTL);
}
else if(IMENUCTL_IsActive(pWin->m_pSoftKeyCtl))
IINPUTWINDOW_SetActiveCtl(pWin,INPUT_TEXT1CTL);
else
IINPUTWINDOW_SetActiveCtl(pWin,INPUT_SOFTKEYCTL);
bDispatched = TRUE;
break;
case AVK_CLR://关闭窗口
IWINSTACK_CloseWindow(TRUE);
bDispatched = TRUE;
break;
case AVK_SELECT:
//当软键不在激活状态时按Select会将软键设为激活
IINPUTWINDOW_SetActiveCtl(pWin,INPUT_SOFTKEYCTL);
bDispatched = TRUE;
break;
}
return bDispatched;
}
static boolean IINPUTWINDOW_HandleCommandEvent(IInputWin* pWin,uint16 wParam)
{
AEEApplet* pApp=(AEEApplet*)GETAPPINSTANCE();
IInputWin* pInputWin=pWin;
boolean bDispatched = FALSE;
if(NULL==pInputWin) return FALSE;
//
switch(wParam)
{
case INPUT_SOFTKEY_ITEM_INPUT_MODE:
break;
case INPUT_SOFTKEY_ITEM_DONE:
if(pWin->tpResponseFunction)
{
AECHAR* pText1=NULL;
AECHAR* pText2=NULL;
pText1=ITEXTCTL_GetTextPtr(pWin->m_pText1);
if(pWin->m_pText2)
pText2=ITEXTCTL_GetTextPtr(pWin->m_pText2);
pWin->tpResponseFunction(pText1,pText2, TRUE);
}
IWINSTACK_CloseWindow(TRUE);
break;
default:
IWINSTACK_CloseWindow(TRUE);
}
return TRUE;
}
static boolean IINPUTWINDOW_SetActiveCtl(IInputWin* pWin,TInputCtlType nTextCtl)
{
//当nTextCtl=INPUT_SOFTKEYCTL,不显示任何文本控件
//当text2不存在时,无论nTextCtl的值为多少,都显示text1
//当text2存在时,nTextCtl=INPUT_TEXT1CTL,显示text1,否则显示text2
switch(nTextCtl)
{
case INPUT_SOFTKEYCTL:
ITEXTCTL_SetActive(pWin->m_pText1, FALSE);
if ((pWin->m_pText2) && (ITEXTCTL_IsActive(pWin->m_pText2)))
ITEXTCTL_SetActive(pWin->m_pText2, FALSE);
IMENUCTL_SetActive(pWin->m_pSoftKeyCtl, TRUE);
IMENUCTL_SetSel(pWin->m_pSoftKeyCtl, INPUT_SOFTKEY_ITEM_INPUT_MODE);
break;
case INPUT_TEXT2CTL:
if(pWin->m_pText2)
{
ITEXTCTL_SetInputMode(pWin->m_pText2, pWin->m_wMode);
IMENUCTL_SetActive(pWin->m_pSoftKeyCtl, FALSE);
ITEXTCTL_SetActive(pWin->m_pText1, FALSE);
ITEXTCTL_SetCursorPos(pWin->m_pText2, TC_CURSOREND);
ITEXTCTL_SetActive(pWin->m_pText2, TRUE);
break;
}
default:
ITEXTCTL_SetInputMode(pWin->m_pText1, pWin->m_wMode);
IMENUCTL_SetActive(pWin->m_pSoftKeyCtl, FALSE);
if (pWin->m_pText2)
ITEXTCTL_SetActive(pWin->m_pText2, FALSE);
ITEXTCTL_SetCursorPos(pWin->m_pText1, TC_CURSOREND);
ITEXTCTL_SetActive(pWin->m_pText1, TRUE);
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -