📄 chinesemate.c
字号:
fldNameTextHandle = MemHandleNew(255);
if (! fldNameTextHandle) //err check
{
FrmAlert(errMemError);
fldKeyTextHandle = FldGetTextHandle(fldKeyPtr);
FldSetTextHandle(fldKeyPtr, NULL);
MemHandleFree(fldKeyTextHandle);
return 0;
}
fldNameTextPtr = (Char *)MemHandleLock(fldNameTextHandle);
fldNameTextPtr[0] = 0x00; fldNameTextPtr[254] = 0x00;
MemHandleUnlock(fldNameTextHandle);
FldSetTextHandle(fldNamePtr, fldNameTextHandle);
WinDrawLine(16, 2, 16, 51);
do
{
EvtGetEvent(&event, evtWaitForever);
keyHandled = false;
if (event.eType == keyDownEvent)
{
if (EvtKeydownIsVirtual(&event)) //5-Way Nav
{
if (IsFiveWayNavEvent(&event))
{
maxNameLen = FldGetTextLength(fldNamePtr);
fldNameTextHandle = FldGetTextHandle(fldNamePtr);
fldNameTextPtr = MemHandleLock(fldNameTextHandle);
FldSetTextHandle(fldNamePtr, NULL);
if (NavKeyPressed(&event, Right) && maxNameLen > 0)
{
keyHandled = true;
if (curSel < maxNameLen)
{
curSel += TxtGetNextChar(fldNameTextPtr, curSel, NULL);
curSel ++;
if (curSel >= maxNameLen)
{
curSel --;
curSel -= TxtGetPreviousChar(fldNameTextPtr, curSel, NULL);
}
}
curSelEnd = curSel + TxtGetNextChar(fldNameTextPtr, curSel, NULL);
}
else if (NavKeyPressed(&event, Left) && curSel > 0)
{
keyHandled = true;
curSel --;
curSelEnd = curSel;
curSel -= TxtGetPreviousChar(fldNameTextPtr, curSel, NULL);
}
else if ((NavKeyPressed(&event, Up) || event.data.keyDown.chr == 11) && maxNameLen > 0)
{
keyHandled = true;
i = FldWordWrap(fldNameTextPtr, 100);
if (maxNameLen > i)
{
if (GetCurLine(maxNameLen, i, curSel) > 0)
{
curSel -= i;
if (fldNameTextPtr[curSel] == 0x20)
{
curSel ++;
}
else if ((UInt8)fldNameTextPtr[curSel] > 128)
{
if (curSel > 0)
{
if ((UInt8)fldNameTextPtr[curSel - 1] > 128)
{
curSel --;
}
}
}
curSelEnd = curSel + TxtGetNextChar(fldNameTextPtr, curSel, NULL);
}
}
}
else if ((NavKeyPressed(&event, Down) || event.data.keyDown.chr == 12) && maxNameLen > 0)
{
keyHandled = true;
i = FldWordWrap(fldNameTextPtr, 100);
if (maxNameLen > i)
{
if (GetCurLine(maxNameLen, i, curSel) < GetMaxLine(maxNameLen, i))
{
curSel += i;
if (curSel >= maxNameLen)
{
curSel = maxNameLen - TxtGetPreviousChar(fldNameTextPtr, maxNameLen - 1, NULL) - 1;
}
if (fldNameTextPtr[curSel] == 0x20)
{
if (curSel > 0)
{
curSel --;
}
}
else if ((UInt8)fldNameTextPtr[curSel] > 128)
{
if (curSel > 0)
{
if ((UInt8)fldNameTextPtr[curSel - 1] > 128)
{
curSel --;
}
}
}
curSelEnd = curSel + TxtGetNextChar(fldNameTextPtr, curSel, NULL);
}
}
}
else if (NavKeyPressed(&event, Select))
{
ExitEventLoop = true;
if (curSel != curSelEnd)
{
if (((UInt8)fldNameTextPtr[curSel]) > 128)
{
curChar = ((((UInt16) fldNameTextPtr[curSel]) << 8) & 0xFF00) | (((UInt16) fldNameTextPtr[curSel + 1]) & 0x00FF);
}
else
{
curChar = (((UInt16) fldNameTextPtr[curSel]) & 0x00FF);
}
}
else
{
curChar = 0;
}
}
MemHandleUnlock(fldNameTextHandle);
FldSetTextHandle(fldNamePtr, fldNameTextHandle);
FldDrawField(fldNamePtr);
if (maxNameLen > 0 && ! ExitEventLoop)
{
FldSetSelection(fldNamePtr, curSel, curSelEnd);
}
}
}
else if ((event.data.keyDown.chr >= 97 && event.data.keyDown.chr <= 122) || event.data.keyDown.chr == 46)
{
keyHandled = true;
//Show Key
fldKeyTextHandle = FldGetTextHandle(fldKeyPtr);
fldKeyTextPtr = MemHandleLock(fldKeyTextHandle);
FldSetTextHandle(fldKeyPtr, NULL);
if (event.data.keyDown.chr != 46)
{
curKey = (Char) (event.data.keyDown.chr - 32);
fldKeyTextPtr[0] = curKey;
}
else
{
fldKeyTextPtr[0] = '.';
curKey = '.';
}
fldKeyTextPtr[1] = 0x00;
MemHandleUnlock(fldKeyTextHandle);
FldSetTextHandle(fldKeyPtr, fldKeyTextHandle);
FldDrawField(fldKeyPtr);
//Seach
//open database
dbRef = DmOpenDatabaseByTypeCreator('DATA', 'addr', dmModeReadOnly);
if (DmGetLastErr()) //err check
{
FrmAlert(errDBOpenError);
fldKeyTextHandle = FldGetTextHandle(fldKeyPtr);
FldSetTextHandle(fldKeyPtr, NULL);
MemHandleFree(fldKeyTextHandle);
fldNameTextHandle = FldGetTextHandle(fldNamePtr);
FldSetTextHandle(fldNamePtr, NULL);
MemHandleFree(fldNameTextHandle);
return 0;
}
pydbRef = DmOpenDatabaseByTypeCreator('CMPY', 'REiC', dmModeReadOnly);
if (DmGetLastErr()) //err check
{
FrmAlert(errDBOpenError);
DmCloseDatabase(dbRef);
fldKeyTextHandle = FldGetTextHandle(fldKeyPtr);
FldSetTextHandle(fldKeyPtr, NULL);
MemHandleFree(fldKeyTextHandle);
fldNameTextHandle = FldGetTextHandle(fldNamePtr);
FldSetTextHandle(fldNamePtr, NULL);
MemHandleFree(fldNameTextHandle);
return 0;
}
//search method
curSel = 0;
curSelEnd = 0;
if (event.data.keyDown.chr != 46)
{
if (cPref->nativeSeach) //native search
{
Boolean charExist;
WChar nsBuf[90]; //按照文本框最大255个字符的预设,其实最多只能容纳85个汉字
UInt16 nbSp;
dbCount = DmNumRecordsInCategory(dbRef, dmAllCategories);
fldNameTextHandle = FldGetTextHandle(fldNamePtr);
fldNameTextPtr = MemHandleLock(fldNameTextHandle);
FldSetTextHandle(fldNamePtr, NULL);
fldNameTextPtr[0] = 0x00;
fldNameTextPtr[254] = 0x00;
nameOffset = 0;
//prvChar = 0;
nsBuf[0] = 0;
for (i = 0; i < dbCount; i ++)
{
curChar = OLD_GetFirstChar(dbRef, i);
charExist = false;
nbSp = 0;
while (nsBuf[nbSp] != 0)
{
if (nsBuf[nbSp] == curChar) //该姓已存在
{
charExist = true;
break;
}
nbSp ++;
}
if (curChar > 128 && (! charExist))
{
if (GetFirstPY(curChar, pydbRef) == curKey && nameOffset < 250)
{
fldNameTextPtr[nameOffset] = (Char) ((curChar >> 8) & 0x00FF);
nameOffset ++;
fldNameTextPtr[nameOffset] = (Char) (curChar & 0x00FF);
nameOffset ++;
fldNameTextPtr[nameOffset] = 0x20;
nameOffset ++;
fldNameTextPtr[nameOffset] = 0x00;
//prvChar = curChar;
nsBuf[nbSp] = curChar;
nsBuf[nbSp + 1] = 0;
}
}
}
MemHandleUnlock(fldNameTextHandle);
FldSetTextHandle(fldNamePtr, fldNameTextHandle);
FldDrawField(fldNamePtr);
if (nameOffset > 0)
{
FldSetSelection(fldNamePtr, 0, 2);
curSel = 0;
curSelEnd = 2;
}
else
{
curSel = 0;
curSelEnd = 0;
}
}
else //bisearch
{
// 1)获取折半查找的起始值、中间值
dbCount = DmNumRecordsInCategory(dbRef, dmAllCategories) - 1; //-1以便直接参与运算
seachI = (dbCount >> 1);
i = 0;
//仅当启动CJK排序的时候才能使用折半查找,此时英文记录被排在记录集的前面,如果中间
//的记录是英文记录,则应往后搜索,直至找到第一条中文记录为止。把该条记录作为折半
//查找的起始记录i,用(dbCount+i)/2作为中间起始值。
while ((UInt16)OLD_GetFirstChar(dbRef, seachI) <= 128)
{
if (seachI < dbCount)
{
seachI ++;
i = (seachI << 1) - dbCount;
}
else
{
break;
}
}
if (seachI == dbCount) //边界值退出
{
curChar = OLD_GetFirstChar(dbRef, seachI);
if (GetFirstPY(curChar, pydbRef) == curKey) //最后一个记录符合要求
{
fldNameTextHandle = FldGetTextHandle(fldNamePtr);
fldNameTextPtr = MemHandleLock(fldNameTextHandle);
FldSetTextHandle(fldNamePtr, NULL);
fldNameTextPtr[254] = 0x00;
fldNameTextPtr[0] = (Char) ((curChar >> 8) & 0x00FF);
fldNameTextPtr[1] = (Char) (curChar & 0x00FF);
fldNameTextPtr[2] = 0x00;
MemHandleUnlock(fldNameTextHandle);
FldSetTextHandle(fldNamePtr, fldNameTextHandle);
FldDrawField(fldNamePtr);
FldSetSelection(fldNamePtr, 0, 2);
curSel = 0;
curSelEnd = 2;
}
}
else //开始折半查找
{
endI = dbCount;
do
{
if (GetFirstPY(OLD_GetFirstChar(dbRef, seachI), pydbRef) < curKey) //目标值在中间值之后
{
i = seachI;
}
else
{
endI = seachI;
}
seachI = ((endI + i) >> 1);
} while (seachI != i && seachI != 1 && seachI != endI);
if (seachI > 0) //结果可能在seachI处,也可能在seachI-1处
{
seachI --;
}
fldNameTextHandle = FldGetTextHandle(fldNamePtr);
fldNameTextPtr = MemHandleLock(fldNameTextHandle);
FldSetTextHandle(fldNamePtr, NULL);
fldNameTextPtr[0] = 0x00;
fldNameTextPtr[254] = 0x00;
nameOffset = 0;
prvChar = 0;
//遍历记录直至记录的拼音首字母大于curKey或到达数据库结尾
for (i = seachI; i <= dbCount; i ++)
{
curChar = OLD_GetFirstChar(dbRef, i);
if (curChar != prvChar)
{
if (GetFirstPY(curChar, pydbRef) == curKey && nameOffset < 250)
{
fldNameTextPtr[nameOffset] = (Char) ((curChar >> 8) & 0x00FF);
nameOffset ++;
fldNameTextPtr[nameOffset] = (Char) (curChar & 0x00FF);
nameOffset ++;
fldNameTextPtr[nameOffset] = 0x20;
nameOffset ++;
fldNameTextPtr[nameOffset] = 0x00;
prvChar = curChar;
}
else if (GetFirstPY(curChar, pydbRef) > curKey)
{
break;
}
else if (nameOffset >= 250)
{
break;
}
}
}
//检查CJK排序错误的记录
i = dbCount;
curChar = OLD_GetFirstChar(dbRef, i);
prvChar = 0;
while (curChar > 0xD7F9 && i > 0 && nameOffset < 250) //从后往前搜索
{
if (curChar != prvChar)
{
if (GetFirstPY(curChar, pydbRef) == curKey && nameOffset < 250)
{
fldNameTextPtr[nameOffset] = (Char) ((curChar >> 8) & 0x00FF);
nameOffset ++;
fldNameTextPtr[nameOffset] = (Char) (curChar & 0x00FF);;
nameOffset ++;
fldNameTextPtr[nameOffset] = 0x20;
nameOffset ++;
fldNameTextPtr[nameOffset] = 0x00;
prvChar = curChar;
}
}
i --;
curChar = OLD_GetFirstChar(dbRef, i);
}
MemHandleUnlock(fldNameTextHandle);
FldSetTextHandle(fldNamePtr, fldNameTextHandle);
FldDrawField(fldNamePtr);
if (nameOffset > 0)
{
FldSetSelection(fldNamePtr, 0, 2);
curSel = 0;
curSelEnd = 2;
}
else
{
curSel = 0;
curSelEnd = 0;
}
}
}
}
else //non-chinese
{
dbCount = DmNumRecordsInCategory(dbRef, dmAllCategories);
fldNameTextHandle = FldGetTextHandle(fldNamePtr);
fldNameTextPtr = MemHandleLock(fldNameTextHandle);
FldSetTextHandle(fldNamePtr, NULL);
fldNameTextPtr[0] = 0x00;
fldNameTextPtr[254] = 0x00;
nameOffset = 0;
prvChar = 0;
for (i = 0; i < dbCount; i ++)
{
curChar = OLD_GetFirstChar(dbRef, i);
if (curChar <= 128)
{
if (curChar != prvChar)
{
if (curChar >= 97 && curChar <= 122)
{
fldNameTextPtr[nameOffset] = (Char) ((curChar - 32) & 0x00FF);
}
else
{
fldNameTextPtr[nameOffset] = (Char) (curChar & 0x00FF);
}
nameOffset ++;
fldNameTextPtr[nameOffset] = 0x20;
nameOffset ++;
fldNameTextPtr[nameOffset] = 0x00;
prvChar = curChar;
if (nameOffset >= 250)
{
break;
}
}
}
}
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -