📄 sugarmemobrowse.c
字号:
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 + -