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

📄 sugarmemobrowse.c

📁 Palm上著名的背单词软件的源码
💻 C
📖 第 1 页 / 共 2 页
字号:

void ToolsChangeCategory (UInt16 category)
{
	CurrentCategory = category;
	TopVisibleRecord = FirstWordRecord;
}

void WordListForward(Boolean byline){
	
	FormType * frmP;
	TableType * tblP = GetObjectPtr(BrowseWordListTable);
	UInt16 steps;
	UInt16 cursor;
	Int16 i;
	Boolean reachedEnd = false;

	if (tabCurrentSelected == StudyListTab){
	
		if (TopVisibleRecord + RowsInTable >= GetHeaderItemNumber(CurrentDB, LearningRecordIndex)) return; 
			
		if (byline) TopVisibleRecord ++;
		else TopVisibleRecord += RowsInTable - 1;
	
		BrowseFormLoadTable(FrmGetActiveForm());
		
		return;
	}
	
	if (byline) steps = 1;
	else steps = RowsInTable - 1;
	
	cursor = TblGetRowID(tblP, VisibleRows - 1) + 1;
	
	while (steps > 0){
		if (!SeekNextRecord(&cursor, dmSeekForward)) {
			reachedEnd = true;
			break;
		}
		
		for (i = 0; i < VisibleRows - 1; i++)
			TblSetRowID(tblP, i, TblGetRowID(tblP, i + 1));
		
		TblSetRowID(tblP, VisibleRows - 1, cursor);
		
		cursor++;
		steps--;
	}
	
	if (TopVisibleRecord == TblGetRowID(tblP, 0)) return;
	
	TopVisibleRecord = TblGetRowID(tblP, 0);
		
	TblDrawTable(tblP);
		
	if (!reachedEnd) reachedEnd = !SeekNextRecord(&cursor, dmSeekForward);
	
	frmP = FrmGetActiveForm();
	FrmUpdateScrollers(frmP, FrmGetObjectIndex(frmP, BrowseScrollUpRepeating),
		FrmGetObjectIndex(frmP, BrowseScrollDownRepeating), true, !reachedEnd);
}

void WordListBackward(Boolean byline){
	FormType * frmP;
	TableType * tblP = GetObjectPtr(BrowseWordListTable);
	UInt16 steps;
	UInt16 cursor;
	Int16 i;
	
	Boolean reachedHead = false;

	if (tabCurrentSelected == StudyListTab){
		if (byline) steps = 1;
		else steps = 10;
		
		if (TopVisibleRecord == 0) return;
		
		while (steps > 0 && TopVisibleRecord > 0){
			TopVisibleRecord--;
			steps--;
		}
	
		BrowseFormLoadTable(FrmGetActiveForm());
		
		return;
	}

	if (byline) steps = 1;
	else steps = RowsInTable - 1;
	
	cursor = TblGetRowID(tblP, 0) - 1;
	
	while (steps > 0){
		if (!SeekNextRecord(&cursor, dmSeekBackward)) {
			reachedHead = true;
			break;
		}
		
		for (i = VisibleRows - 1; i > 0; i--)
			TblSetRowID(tblP, i, TblGetRowID(tblP, i - 1));

		TblSetRowID(tblP, 0, cursor);  
		cursor--;
		steps--;
	}	
	
	if (TopVisibleRecord == TblGetRowID(tblP, 0)) return;
	
	TopVisibleRecord = TblGetRowID(tblP, 0); 
	
	TblDrawTable(tblP);
	
	if (!reachedHead)
		reachedHead = !SeekNextRecord(&cursor, dmSeekBackward);
	
	frmP = FrmGetActiveForm();
	FrmUpdateScrollers(frmP, FrmGetObjectIndex(frmP, BrowseScrollUpRepeating), 
		FrmGetObjectIndex(frmP, BrowseScrollDownRepeating), !reachedHead, true);
	
}

//Boolean 
Boolean SeekNextRecord(UInt16 * indexP, Int16 direction){
	MemHandle recordH;
	HeaderRecord* headerP;
	Boolean found = false;
	
	if (direction == dmSeekForward){
	
		while(!found) {
			
			if (DmSeekRecordInCategory(CurrentDB, indexP, 0, direction, CurrentCategory)) return false;
			
			recordH = DmQueryRecord(CurrentDB, *indexP);
			headerP = MemHandleLock(recordH);
			if (headerP -> header.allBits & HeaderMask.allBits) found = true;
			else {
				found = false;
				(*indexP)++;
			}
			
			MemHandleUnlock(recordH);
		
		} 
		return found;
	}
	
	if (direction == dmSeekBackward){
	
		while (!found){
			
			if (DmSeekRecordInCategory(CurrentDB, indexP, 0, direction, CurrentCategory)) return false;
			
			if ((*indexP)<2) return false;
			
			recordH = DmQueryRecord(CurrentDB, *indexP);
			headerP = MemHandleLock(recordH);
			
			if (headerP -> header.allBits & HeaderMask.allBits) found = true;
			else {
				found = false;
				(*indexP)--;
			}
		
			MemHandleUnlock(recordH);
	
		}
		return found;
	}
	
	return found;
}

void ChangeTab(TabSelected tab){

	FormType* frmP;
	TableType* tblP;
	ControlType* ctlP;

	frmP = FrmGetActiveForm();
	tblP = GetObjectPtr(BrowseWordListTable);
	ctlP = GetObjectPtr(BrowseNewButton);
	
	//
	if (FrmGetControlGroupSelection(frmP, 1) == frmNoSelectedControl)
		FrmSetControlGroupSelection(frmP, 1, BrowseWordListTable + 1 + tab);

	//save top visible record in current tab
	TopVisibleBackup[tabCurrentSelected] = TopVisibleRecord;
	
	//change to new tab
	tabCurrentSelected = tab;
	
	//Load top visible record in backup
	TopVisibleRecord = TopVisibleBackup[tabCurrentSelected];
	VisibleRows = 0;
	
	//prepare headermask
	switch(tabCurrentSelected){
		case RawTab:
			HeaderMask.allBits = 0;
			SetBitMacro(HeaderMask.allBits, RawQueue);
			break;
			
		case StudyListTab:
			HeaderMask.allBits = 0;
			SetBitMacro(HeaderMask.allBits, LearningQueue);
			break;
			
		case AllTab:
			HeaderMask.allBits = 0;
			SetBitMacro(HeaderMask.allBits, RawQueue);
 			SetBitMacro(HeaderMask.allBits, LearningQueue);
 			SetBitMacro(HeaderMask.allBits, TestingQueue);
 			SetBitMacro(HeaderMask.allBits, WaitingQueue);
 			break;
	}
	
	//change display
	switch(tabCurrentSelected){
		case StudyListTab:
			HideObject(BrowseSearchField);
			HideObject(BrowseCategoryPopTrigger);
			ShowObject(BrowseRemoveAllButton);
			ShowObject(BrowseShuffleButton);
			HideObject(BrowseAddAllButton);
			HideObject(BrowseNewButton);										
			break;
		
		case RawTab:
			HideObject(BrowseSearchField);
			ShowObject(BrowseCategoryPopTrigger);
			HideObject(BrowseRemoveAllButton);
			HideObject(BrowseShuffleButton);
			ShowObject(BrowseAddAllButton);
			HideObject(BrowseNewButton);			
			break;
		
		case AllTab:
			ShowObject(BrowseSearchField);
			ShowObject(BrowseCategoryPopTrigger);		
			HideObject(BrowseRemoveAllButton);
			HideObject(BrowseShuffleButton);
			HideObject(BrowseAddAllButton);
			ShowObject(BrowseNewButton);			
			break;
	}
	
	SearchFieldTicking = false;

	ClearWordListTable();
	FrmDrawForm(frmP);
	DrawTitleBar();
	
	BrowseFormLoadTable(frmP);
}

void DrawTitleBar(){
	WinPushDrawState();
	WinSetForeColor(UIColorGetTableEntryIndex(UIObjectSelectedFill));
	WinDrawLine(0, 13, 160, 13);
	WinDrawLine(0, 14, 160, 14);
	WinPopDrawState();

	//WinErasePixel(0, 0);
	//WinErasePixel(53, 0);
	//WinErasePixel(80, 0);
	//WinErasePixel(97, 0);
}

void MoveToStudyList(Int16 row){
	
	TableType * table = GetObjectPtr(BrowseWordListTable);
	UInt16 index = TblGetRowID(table, row);

	SetQueue(CurrentDB, index, LearningQueue);
	
	//first pack raw list item
	while (row < VisibleRows - 1){
		TblSetRowID(table, row, TblGetRowID(table, row + 1));
		row ++;
	}
	
	VisibleRows--;
	if (VisibleRows > 0) TopVisibleRecord = TblGetRowID(table, 0);
	
	BrowseFormLoadTable(FrmGetActiveForm());
		
}

void BatchMoveToStudyList(){

	TableType * table = GetObjectPtr(BrowseWordListTable);
	Int16 row;
	UInt16 index;
	
	if (VisibleRows == 0) return;
		
	for (row = 0; row < VisibleRows; row ++){

		index = TblGetRowID(table, row);
		SetQueue(CurrentDB, index, LearningQueue);
		
	}
	
	VisibleRows = 0;
		
	BrowseFormLoadTable(FrmGetActiveForm());
}

void MoveToRawList(Int16 row){

	TableType * table = GetObjectPtr(BrowseWordListTable);
	UInt16 index = TblGetRowID(table, row);
	SetQueue(CurrentDB, index, RawQueue);
	
	BrowseFormLoadTable(FrmGetActiveForm());
}

void BatchMoveToRawList(){

	TableType * table = GetObjectPtr(BrowseWordListTable);
	Int16 row;
	UInt16 index;
		
	if (VisibleRows == 0) return;
	
	for (row = 0; row < VisibleRows; row++){
	
		index = TblGetRowID(table, row);
		SetQueue(CurrentDB, index, RawQueue);	
	}
	
	VisibleRows = 0;
	
	BrowseFormLoadTable(FrmGetActiveForm());
}

void UpdateSearchField(){
	
	FormType* frmP;
	RectangleType bounds;
	FontID currFont, studylistFont, rawFont;
	UInt16 rawNumbers, studylistNumbers;
	Char rawStr[maxStrIToALen], studylistStr[maxStrIToALen];
	Char slash[4];
	
	UInt16 charsWidth = 0;	
	
	if ((tabCurrentSelected == RawTab) && SearchFieldTicking) return;
	
	StrPrintF(slash, "%s", " / ");
	
	rawNumbers = GetRawWordCount();
	studylistNumbers = GetHeaderItemNumber(CurrentDB, LearningRecordIndex);

	StrIToA(rawStr, rawNumbers);
	StrIToA(studylistStr, studylistNumbers);
	
	frmP = FrmGetActiveForm();
	FrmHideObject(frmP, FrmGetObjectIndex(frmP, BrowseSearchField));
	
	studylistFont = stdFont;
	rawFont = stdFont;
	if (tabCurrentSelected == StudyListTab) studylistFont = boldFont;
	if (tabCurrentSelected == RawTab) rawFont = boldFont;
	
	currFont = FntSetFont(studylistFont);
	charsWidth += FntCharsWidth(studylistStr, StrLen(studylistStr));
	
	FntSetFont(stdFont);
	charsWidth += FntCharsWidth(slash, StrLen(slash));
	
	FntSetFont(rawFont);
	charsWidth += FntCharsWidth(rawStr, StrLen(rawStr));
	
	FrmGetObjectBounds(frmP, FrmGetObjectIndex(frmP, BrowseSearchField), &bounds);
	
	if (bounds.extent.x > charsWidth)
		charsWidth = (bounds.extent.x - charsWidth) / 2;
	else 
		charsWidth = 0;
	
	WinEraseRectangle(&bounds, 0);
	
	FntSetFont(studylistFont);
	WinDrawChars(studylistStr, StrLen(studylistStr), bounds.topLeft.x + charsWidth, 
		bounds.topLeft.y + bounds.extent.y - FntLineHeight());
	charsWidth += FntCharsWidth(studylistStr, StrLen(studylistStr));
	
	FntSetFont(stdFont);
	WinDrawChars(slash, StrLen(slash), bounds.topLeft.x + charsWidth, 
		bounds.topLeft.y + bounds.extent.y - FntLineHeight());
	charsWidth += FntCharsWidth(slash, StrLen(slash));
	
	FntSetFont(rawFont);
	WinDrawChars(rawStr, StrLen(rawStr), bounds.topLeft.x + charsWidth, 
		bounds.topLeft.y + bounds.extent.y - FntLineHeight());
	
	FntSetFont(currFont);
}

/*	
void RandomNewRecord ()
{
	WordRecordType newRecord;
	WordFields i;
	UInt16 j;
	UInt16 attr;
	Err err;
	Char a, b, c, d;
	Char* pq;
	Char* pa;
	MemHandle questionH;
	MemHandle answerH;
	
	MemorizingStatus memoStatus ={2.50, //e-factor
		40, //difficulty 
		0, //total lapse
		0, //total recall
		0, //recent lapse
		0, //recent recall
		0, //step
		0, //last test
		0, //current test
		0,	//next test
		0,	//first learn
		0}; //create

	DateType today;
	UInt32 seconds;
	UInt32 seed;
	
	newRecord.header.allBits = 0;
	SetBitMacro(newRecord.header.allBits, RawQueue);
	
	newRecord.ltStatus.learningStatus = 0;
	newRecord.memoStatus = memoStatus;
	
	seconds = TimGetSeconds();
	seed = seconds;
	DateSecondsToDate(seconds, &today);
	newRecord.memoStatus.create = today;
	
	for (j = 0; j < 1000; j++){
		questionH = MemHandleNew(10);
		answerH = MemHandleNew (10);
	
		seed = seed * 241;
		a = seed % 26 + 65;
		seed = seed * 241;
		b = seed % 26 + 65;
		seed = seed * 241;
		c = seed % 26 + 65;
		seed = seed * 241;
		d = seed % 26 + 65;
	
		pq = MemHandleLock(questionH);
		StrPrintF(pq, "%c%c%c%c%c", a, b, c, d, '\0');
	
		pa = MemHandleLock(answerH);
		StrPrintF(pa, "%c%c%c%c%c", d, c, b, a, '\0');
	
		for (i = WordFieldQuestion; i < WordFieldsCount; i++)
			newRecord.field[i] = NULL;
	
		newRecord.field[WordFieldQuestion] = pq;
		newRecord.field[WordFieldAnswer] = pa;

		err = NewWordRecord(CurrentDB, &newRecord, &CurrentRecord);
		if (err)
		{
			FrmAlert(DeviceFullAlert);
			return;
		}

		// Set it's category to the category being viewed.
		// If the category is All then set the category to unfiled.
		DmRecordInfo (CurrentDB, CurrentRecord, &attr, NULL, NULL);
		attr &= ~dmRecAttrCategoryMask;
		attr |= ((CurrentCategory == dmAllCategories) ? dmUnfiledCategory :
			 CurrentCategory) | dmRecAttrDirty;
		DmSetRecordInfo (CurrentDB, CurrentRecord, &attr, NULL);
		
		IncrementRawWordCount();
				
		MemHandleUnlock(questionH);
		MemHandleUnlock(answerH);
		MemHandleFree(questionH);
		MemHandleFree(answerH);
		
	}
	// Set the global variable that determines which field is the top visible
	// field in the edit view.  Also done when New is pressed.
	TopVisibleRecord = CurrentRecord;
	VisibleRows = 0;
	
	BrowseFormLoadTable(FrmGetActiveForm());
	FrmDrawForm(FrmGetActiveForm());
}
*/

void ClearWordListTable(){
	
	TableType * tblP = GetObjectPtr(BrowseWordListTable);
	int i;
	
	for (i = 0; i < RowsInTable; i ++)
		TblSetRowUsable(tblP, i, false);

}

void InstantLookup(EventType * event){
	
	FormType * frmP = FrmGetActiveForm();
	FieldType * fldP;
	Char * fldTextP;
	UInt16 fldIndex;

	fldP = GetObjectPtr (BrowseSearchField);

	if ((tabCurrentSelected == RawTab) && !SearchFieldTicking) return;
	
	fldIndex = GetObjectIndex(BrowseSearchField);
	fldTextP = FldGetTextPtr(fldP);
	
	FrmSetFocus(frmP, fldIndex);

	if (FldHandleEvent (fldP, event) || event->eType == fldChangedEvent)
	{
		fldTextP = FldGetTextPtr(fldP);
		if (fldTextP != NULL && StrLen(fldTextP) > 0){
			TopVisibleRecord = InstantLookupPosition(CurrentDB, fldTextP);
			VisibleRows = 0;
			BrowseFormLoadTable(frmP);
		}
	}
	
	if (tabCurrentSelected == RawTab) SearchFieldIdle(fldP);
}	

void SearchFieldIdle(FieldType* fldP){

	SearchFieldTicking = true;
	SearchFieldTicks = TimGetTicks();	
		
}

//void	NumMoveToStudyList(){
//	FormType * form;
//	
//	form = FrmInitForm(NumRawForm);
//	FrmDoDialog(form);
//	FrmDeleteForm(form);
//}


void ShuffleStudyList(){

	if (DoCustomDialog("Confirm", "This operation will shuffle the study list.", false, NULL, NULL, true)){
	
		ShuffleHeaderItem(CurrentDB, LearningRecordIndex);
		BrowseFormLoadTable(FrmGetActiveForm());
	}

}

void DetectPenDown(EventType* event){
	
	FormType* frmP;
	RectangleType bounds;
	FieldType* field;
	
	frmP = FrmGetActiveForm();
	FrmGetObjectBounds(frmP, FrmGetObjectIndex(frmP, BrowseSearchField), &bounds);
	
	if (RctPtInRectangle(event->screenX, event->screenY, &bounds)){
		FrmShowObject(frmP, FrmGetObjectIndex(frmP, BrowseSearchField));
		
		field = GetObjectPtr(BrowseSearchField);
		
		FldDrawField(field);
	}
	else {
		SearchFieldTicking = false;
	//	UpdateSearchField();
	}
}

Char WordQueueToChar(HeaderQueue queue){
	
	switch (queue){
		case RawQueue:
			return 'R';
		
		case LearningQueue:
			return 'L';
		
		case TestingQueue:
			return 'T';
			
		case WaitingQueue:
			return 'W';
		
		case TestingQFlag:
		case LearningQFlag:
			return 'H';
			
		default:
			break;
	}
	
	return ' ';
}






⌨️ 快捷键说明

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