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

📄 chinesemate.c

📁 palm os 上的中文伴侣源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
//百家姓-Treo650
static WChar LastNameHandler(ChineseMatePref * cPref, FormType * frmP)
{
	EventType	event;
	FieldType	* fldKeyPtr;
	FieldType	* fldNamePtr;
	MemHandle	fldKeyTextHandle;
	MemHandle	fldNameTextHandle;
	Char		* fldKeyTextPtr;
	Char		* fldNameTextPtr;
	Char		curKey = 0x00;
	Boolean		ExitEventLoop = false;
	DmOpenRef	* dbRef;
	DmOpenRef	* pydbRef;
	UInt16		dbCount = 0;
	WChar		curChar = 0;
	WChar		prvChar;
	UInt16		nameOffset;
	UInt16		curSel;
	UInt16		curSelEnd;
	UInt16		maxNameLen;
	Boolean		keyHandled;
	UInt16		i;
	UInt16		seachI;
	UInt16		endI;
	
	//Init Field
	fldKeyPtr = (FieldType *)FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, fldLNKey));
	fldKeyTextHandle = MemHandleNew(2);
	if (! fldKeyTextHandle) //err check
	{
		FrmAlert(errMemError);
		return 0;
	}
	fldKeyTextPtr = (Char *)MemHandleLock(fldKeyTextHandle);
	fldKeyTextPtr[0] = 0x00; fldKeyTextPtr[1] = 0x00;
	MemHandleUnlock(fldKeyTextHandle);
	FldSetTextHandle(fldKeyPtr, fldKeyTextHandle);
	
	fldNamePtr = (FieldType *)FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, fldName));
	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', 'PAdd', 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 = 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)GetFirstChar(dbRef, seachI) <= 128)
						{
							if (seachI < dbCount)
							{
								seachI ++;
								i = (seachI << 1) - dbCount;
							}
							else
							{
								break;
							}
						}
						if (seachI == dbCount) //边界值退出
						{
							curChar = 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(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 = 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 = 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 = 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 = 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;

⌨️ 快捷键说明

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