📄 chinesemate.c
字号:
}
}
}
}
MemHandleUnlock(fldNameTextHandle);
FldSetTextHandle(fldNamePtr, fldNameTextHandle);
FldDrawField(fldNamePtr);
if (nameOffset > 0)
{
FldSetSelection(fldNamePtr, 0, 1);
curSel = 0;
curSelEnd = 1;
}
}
//close database
DmCloseDatabase(dbRef);
DmCloseDatabase(pydbRef);
}
else if (event.data.keyDown.chr == 0x0008)
{
curChar = 0;
ExitEventLoop = true;
}
}
else
{
SysHandleEvent(&event);
}
}while (event.eType != appStopEvent && ! ExitEventLoop);
fldKeyTextHandle = FldGetTextHandle(fldKeyPtr);
FldSetTextHandle(fldKeyPtr, NULL);
MemHandleFree(fldKeyTextHandle);
fldNameTextHandle = FldGetTextHandle(fldNamePtr);
FldSetTextHandle(fldNamePtr, NULL);
MemHandleFree(fldNameTextHandle);
return curChar;
}
static UInt16 fiEventLoop(Char * str)
{
EventType event;
UInt16 error;
FormType * frmP;
FieldType * fldPuncPtr;
FieldType * fldDateTimePtr;
ListType * lstQuickTextPtr;
//ControlType * labQuickTextTipPtr;
MemHandle fldTextHandle = 0;
MemHandle lstArrayHandle = 0;
Char ** lstItemStr;
Char * fldPuncTextPtr;
Char * fldDateTimeTextPtr;
Char * DateBuf;
Char * TimeBuf;
Char * SecondBuf;
UInt8 curObject;
UInt32 curSysTime;
DateTimeType curDateTime;
Boolean keyHandled;
UInt16 curSel = 0;
UInt16 curSelEnd = 2;
Boolean QuickTextExist = true;
DmOpenRef * dbRef;
UInt16 RecCount = 0;
UInt16 lstBufSize;
MemHandle recH;
UInt16 recSize;
Char * recP;
Char * lstBuf = 0;
UInt16 i;
UInt16 j;
UInt16 lstItem = 0;
Boolean exit = false;
//Init
frmP = FrmGetActiveForm();
fldPuncPtr = (FieldType *)FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, fldPunc));
fldDateTimePtr = (FieldType *)FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, fldDateTime));
lstQuickTextPtr = (ListType *)FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, lstQuickText));
//labQuickTextTipPtr = (ControlType *)FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, labQuickTextTip));
dbRef = DmOpenDatabaseByTypeCreator('SMqt', 'HsCh', dmModeReadOnly);
if (DmGetLastErr())
{
QuickTextExist = false;
}
else
{
RecCount = DmNumRecordsInCategory(dbRef, dmAllCategories);
lstBufSize = 0;
lstBuf = MemPtrNew(5120); //5KB memory should be enough.
if (! lstBuf) //Not Enough Memory
{
DmCloseDatabase(dbRef);
return 1;
}
for (i = 0; i < RecCount; i ++)
{
recH = DmQueryRecord(dbRef, i);
recP = MemHandleLock(recH);
recSize = StrLen(recP);
for (j = 0; j < recSize; j ++)
{
lstBuf[lstBufSize] = recP[j];
lstBufSize ++;
}
lstBuf[lstBufSize] = 0x00;
lstBufSize ++;
MemHandleUnlock(recH);
}
lstBufSize --;
MemPtrResize(lstBuf, lstBufSize);
lstArrayHandle = SysFormPointerArrayToStrings(lstBuf, RecCount);
lstItemStr = MemHandleLock(lstArrayHandle);
LstSetListChoices (lstQuickTextPtr, lstItemStr, RecCount);
DmCloseDatabase(dbRef);
}
LstSetSelection(lstQuickTextPtr, noListSelection);
//LstEraseList(lstQuickTextPtr);
//CtlDrawControl(labQuickTextTipPtr);
fldTextHandle = MemHandleNew(15);
fldPuncTextPtr = MemHandleLock(fldTextHandle);
//~: 0xA1AB
//々: 0xA1A9
// : 0xA1A1
//♂: 0xA1E1
//♀: 0xA1E2
fldPuncTextPtr[0] = 0xA1; fldPuncTextPtr[1] = 0xAB; fldPuncTextPtr[2] = 0x20;
fldPuncTextPtr[3] = 0xA1; fldPuncTextPtr[4] = 0xA9; fldPuncTextPtr[5] = 0x20;
fldPuncTextPtr[6] = 0xA1; fldPuncTextPtr[7] = 0xA1; fldPuncTextPtr[8] = 0x20;
fldPuncTextPtr[9] = 0xA1; fldPuncTextPtr[10] = 0xE1; fldPuncTextPtr[11] = 0x20;
fldPuncTextPtr[12] = 0xA1; fldPuncTextPtr[13] = 0xE2; fldPuncTextPtr[14] = 0x00;
MemHandleUnlock(fldTextHandle);
FldSetTextHandle(fldPuncPtr, fldTextHandle);
FldDrawField(fldPuncPtr);
FldSetSelection(fldPuncPtr, curSel, curSelEnd);
fldTextHandle = MemHandleNew(100);
fldDateTimeTextPtr = MemHandleLock(fldTextHandle);
fldDateTimeTextPtr[0] = 0x00; fldDateTimeTextPtr[99] = 0x00;
DateBuf = MemPtrNew(dateStringLength);
TimeBuf = MemPtrNew(timeStringLength);
SecondBuf = MemPtrNew(maxStrIToALen);
TimSecondsToDateTime(TimGetSeconds(), &curDateTime);
DateToAscii(curDateTime.month, curDateTime.day, curDateTime.year, dfYMDWithDashes, DateBuf);
TimeToAscii(curDateTime.hour, curDateTime.minute, tfColon24h, TimeBuf);
StrIToA(SecondBuf, (UInt32) curDateTime.second);
StrCat(fldDateTimeTextPtr, DateBuf);
StrCat(fldDateTimeTextPtr, " \0");
StrCat(fldDateTimeTextPtr, TimeBuf);
StrCat(fldDateTimeTextPtr, ":");
StrCat(fldDateTimeTextPtr, SecondBuf);
//StrCat(fldDateTimeTextPtr, "\0");
MemHandleUnlock(fldTextHandle);
FldSetTextHandle(fldDateTimePtr, fldTextHandle);
FldDrawField(fldDateTimePtr);
curObject = 0;
curSysTime = TimGetSeconds();
do
{
/* change timeout if you need periodic nilEvents */
EvtGetEvent(&event, 100);
//Refresh time at every 60 sec.
if ((TimGetSeconds() - curSysTime) >= 1)
{
curSysTime = TimGetSeconds();
fldTextHandle = FldGetTextHandle(fldDateTimePtr);
FldSetTextHandle(fldDateTimePtr, NULL);
fldDateTimeTextPtr = MemHandleLock(fldTextHandle);
TimSecondsToDateTime(TimGetSeconds(), &curDateTime);
DateToAscii(curDateTime.month, curDateTime.day, curDateTime.year, dfYMDWithDashes, DateBuf);
TimeToAscii(curDateTime.hour, curDateTime.minute, tfColon24h, TimeBuf);
StrIToA(SecondBuf, (UInt32) curDateTime.second);
fldDateTimeTextPtr[0] = 0x00;
StrCat(fldDateTimeTextPtr, DateBuf);
StrCat(fldDateTimeTextPtr, " \0");
StrCat(fldDateTimeTextPtr, TimeBuf);
StrCat(fldDateTimeTextPtr, ":");
StrCat(fldDateTimeTextPtr, SecondBuf);
//StrCat(fldDateTimeTextPtr, "\0");
MemHandleUnlock(fldTextHandle);
FldSetTextHandle(fldDateTimePtr, fldTextHandle);
FldDrawField(fldDateTimePtr);
if (curObject == 1)
{
FldSetSelection(fldDateTimePtr, 0, FldGetTextLength(fldDateTimePtr));
}
}
keyHandled = false;
if (event.eType == keyDownEvent)
{
if (EvtKeydownIsVirtual(&event)) //FiveWay Nav Check
{
if (IsFiveWayNavEvent(&event))
{
if (NavKeyPressed(&event, Right) && curObject == 0)
{
keyHandled = true;
if (curSel < 15)
{
fldTextHandle = FldGetTextHandle(fldPuncPtr);
fldPuncTextPtr = MemHandleLock(fldTextHandle);
FldSetTextHandle(fldPuncPtr, NULL);
curSel += 3;
if (curSel >= 15)
{
curSel -= 3;
}
curSelEnd = curSel + 2;
MemHandleUnlock(fldTextHandle);
FldSetTextHandle(fldPuncPtr, fldTextHandle);
FldDrawField(fldPuncPtr);
FldSetSelection(fldPuncPtr, curSel, curSelEnd);
}
}
else if (NavKeyPressed(&event, Left) && curSel > 0 && curObject == 0)
{
keyHandled = true;
fldTextHandle = FldGetTextHandle(fldPuncPtr);
fldPuncTextPtr = MemHandleLock(fldTextHandle);
FldSetTextHandle(fldPuncPtr, NULL);
curSelEnd = curSel - 1;
curSel -= 3;
MemHandleUnlock(fldTextHandle);
FldSetTextHandle(fldPuncPtr, fldTextHandle);
FldDrawField(fldPuncPtr);
FldSetSelection(fldPuncPtr, curSel, curSelEnd);
}
else if ((NavKeyPressed(&event, Up) || event.data.keyDown.chr == 11) && curObject > 0)
{
keyHandled = true;
if (lstItem == 0)
{
if (curObject == 2) //QuickText -> DateTime
{
LstSetSelection(lstQuickTextPtr, noListSelection);
//LstEraseList(lstQuickTextPtr);
//CtlDrawControl(labQuickTextTipPtr);
FldSetSelection(fldDateTimePtr, 0, FldGetTextLength(fldDateTimePtr));
curObject --;
}
else if (curObject == 1) //DateTime -> Punc
{
FldSetSelection(fldDateTimePtr, 0, 0);
FldSetSelection(fldPuncPtr, 0, 2);
curSel = 0;
curSelEnd = 2;
curObject --;
}
}
else
{
lstItem --;
LstSetSelection(lstQuickTextPtr, lstItem);
}
}
else if ((NavKeyPressed(&event, Down) || event.data.keyDown.chr == 12))
{
keyHandled = true;
if (curObject == 0) //Punc -> DateTime
{
FldSetSelection(fldPuncPtr, 0, 0);
FldSetSelection(fldDateTimePtr, 0, FldGetTextLength(fldDateTimePtr));
curObject ++;
}
else if (curObject == 1 && QuickTextExist) //DateTime -> QuickText
{
FldSetSelection(fldDateTimePtr, 0, 0);
LstSetSelection(lstQuickTextPtr, 0);
curObject ++;
}
else if (curObject == 2 && lstItem < RecCount)
{
lstItem ++;
if (lstItem == RecCount)
{
lstItem --;
}
LstSetSelection(lstQuickTextPtr, lstItem);
}
}
else if (NavKeyPressed(&event, Select))
{
keyHandled = true;
if (curObject == 2) //Return QuickText
{
StrCat(str, LstGetSelectionText(lstQuickTextPtr, LstGetSelection(lstQuickTextPtr)));
}
else if (curObject == 1) //Return DateTime
{
StrCat(str, FldGetTextPtr(fldDateTimePtr));
}
else if (curObject == 0)
{
fldPuncTextPtr = FldGetTextPtr(fldPuncPtr);
str[0] = fldPuncTextPtr[curSel];
str[1] = fldPuncTextPtr[curSel + 1];
str[2] = 0x00;
}
StrCat(str, "\0");
exit = true;
}
}
}
else if (event.data.keyDown.chr == 0x0008) //Backspace, Quit
{
exit = true;
}
}
if (! keyHandled)
{
if (! SysHandleEvent(&event))
{
if (! MenuHandleEvent(0, &event, &error))
{
FrmDispatchEvent(&event);
}
}
}
/*else
{
MemSet(&event, sizeof(EventType), 0);
event.eType = nilEvent;
}*/
} while (event.eType != appStopEvent && ! exit);
fldTextHandle = FldGetTextHandle(fldPuncPtr);
FldSetTextHandle(fldPuncPtr, NULL);
MemHandleFree(fldTextHandle);
fldTextHandle = FldGetTextHandle(fldDateTimePtr);
FldSetTextHandle(fldDateTimePtr, NULL);
MemHandleFree(fldTextHandle);
MemPtrFree(DateBuf);
MemPtrFree(TimeBuf);
MemPtrFree(SecondBuf);
if (QuickTextExist)
{
MemHandleUnlock(lstArrayHandle);
MemHandleFree(lstArrayHandle);
MemPtrFree(lstBuf);
}
return 0;
}
static Boolean MainFormDoCommand(UInt16 command)
{
Boolean handled = false;
FormType * pForm;
switch (command) {
case 1002:
pForm = FrmInitForm(AboutForm);
FrmDoDialog(pForm); // Display the About Box.
FrmDeleteForm(pForm);
handled = true;
break;
}
return handled;
}
static Boolean MainFormHandleEvent(EventType * eventP)
{
Boolean handled = false;
FormType * frmP;
LocalID dbID;
UInt16 cardNo;
UInt16 pSize;
ChineseMatePref * cpf; //改为指针以便作为消息的参数(2005-11-15)。
UInt32 cpfAddr;
switch (eventP->eType)
{
case menuEvent:
return MainFormDoCommand(eventP->data.menu.itemID);
break;
case frmOpenEvent:
handled = true;
break;
case frmUpdateEvent:
/*
* To do any custom drawing here, first call
* FrmDrawForm(), then do your drawing, and
* then set handled to true.
*/
break;
case ctlSelectEvent:
{
if (eventP->data.ctlSelect.controlID == pbtnEnableCM)
{
frmP = FrmGetActiveForm();
SysCurAppDatabase(&cardNo, &dbID);
FtrGet(appFileCreator, 0, &cpfAddr);
cpf = (ChineseMatePref *) cpfAddr;
cpf->cmActived = false;
cpf->power = true;
pSize = sizeof(ChineseMatePref);
PrefSetAppPreferences(appFileCreator, appPrefID, appPrefVersionNum, cpf, pSize, true);
SysNotifyRegister(cardNo, dbID, sysNotifyAppLaunchingEvent, NULL, sysNotifyNormalPriority, cpf);
handled = true;
}
else if (eventP->data.ctlSelect.controlID == pbtnDisableCM)
{
SysCurAppDatabase(&cardNo, &dbID);
SysNotifyUnregister(cardNo, dbID, sysNotifyAppLaunchingEvent, sysNotifyNormalPriority);
//SysNotifyUnregister(cardNo, dbID, sysNotifyVirtualCharHandlingEvent, sysNotifyNormalPriority);
FtrGet(appFileCreator, 0, &cpfAddr);
cpf = (ChineseMatePref *) cpfAddr;
cpf->cmActived = false;
cpf->power = false;
pSize = sizeof(ChineseMatePref);
PrefSetAppPreferences(appFileCreator, appPrefID, appPrefVersionNum, cpf, pSize, true);
/*MemPtrFree(cpf);
FtrSet(appFileCreator, 0, 0);*/
handled = true;
}
else if (eventP->data.ctlSelect.controlID == cbNativeSeach)
{
FtrGet(appFileCreator, 0, &cpfAddr);
cpf = (ChineseMatePref *) cpfAddr;
cpf->nativeSeach = (! cpf->nativeSeach);
pSize = sizeof(ChineseMatePref);
PrefSetAppPreferences(appFileCreator, appPrefID, appPrefVersionNum, cpf, pSize, true);
handled = true;
}
else if (eventP->data.ctlSelect.controlID == cbFastSearch)
{
FtrGet(appFileCreator, 0, &cpfAddr);
cpf = (ChineseMatePref *) cpfAddr;
cpf->fsMode = (! cpf->fsMode);
pSize = sizeof(ChineseMatePref);
PrefSetAppPreferences(appFileCreator, appPrefID, appPrefVersionNum, cpf, pSize, true);
handled = true;
}
else if (eventP->data.ctlSelect.controlID == cbEnableFI)
{
frmP = FrmGetActiveForm();
FtrGet(appFileCreator, 0, &cpfAddr);
cpf = (ChineseMatePref *) cpfAddr;
cpf->fiEnabled = (! cpf->fiEnabled);
pSize = sizeof(ChineseMatePref);
PrefSetAppPreferences(appFileCreator, appPrefID, appPrefVersionNum, cpf, pSize, true);
SysCurAppDatabase(&cardNo, &dbID);
if (cpf->fiEnabled)
{
SysNotifyRegister(cardNo, dbID, sysNotifyVirtualCharHandlingEvent, NULL, sysNotifyNormalPriority, cpf);
}
else
{
SysNotifyUnregister(cardNo, dbID, sysNotifyVirtualCharHandlingEvent, sysNotifyNormalPriority);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -