void SelectRow(DmOpenRef db, Int16 row) { FormPtr form = FrmGetActiveForm(); if (FormIsNot(form, FormMain)) return; TablePtr table = (TablePtr) GetObjectPtr(form, SMSTable); g_CurrentSelection = row; TblMarkRowInvalid(table, row); TblRedrawTable(table); UpdatePos(db); }
void SelectNextRow(DmOpenRef db, Int16 step) { UInt16 oldPage = g_CurrentPage; UInt16 oldSel = g_CurrentSelection; CalculateNextRow(db, step); if (g_CurrentPage == oldPage) { if (oldSel != g_CurrentSelection) { FormPtr form = FrmGetActiveForm(); if (!FormIsNot(form, FormMain)) { TablePtr table = (TablePtr) GetObjectPtr(form, SMSTable); TblMarkRowInvalid(table, oldSel); TblMarkRowInvalid(table, g_CurrentSelection); TblRedrawTable(table); } } } else { GotoPage(db, g_CurrentPage); } UpdatePos(db); }
void UpdatePostsTable(FormPtr pForm, UInt16 numberOfRows) { UInt16 rowsToDraw; UInt16 obj = FrmGetObjectIndex(pForm, PostListTable); TablePtr table = (TablePtr)FrmGetObjectPtr(pForm, obj); char* icon[PostListMaxRows] = { "*", "*", "*", "*", "*", "*", "*", "*", "*", "*" }; char* userName[PostListMaxRows] = { "Sam", "Max", "Jess", "Polly", "Pete", "Ken", "Ello", "Brian", "Oli", "Test" }; char* postPreview[PostListMaxRows] = { "This is a post preview...", "This is a post preview...", "This is a post preview...", "This is a post preview...", "This is a post preview...", "This is a post preview...", "This is a post preview...", "This is a post preview...", "This is a post preview...", "This is a post preview..." }; register int i; if (numberOfRows > PostListMaxRows) { AlertPrintf3( "Number of posts exceeded the limit. Reducing to 10.", NULL, NULL); rowsToDraw = PostListMaxRows; } else { rowsToDraw = numberOfRows; } for (i = 0; i < rowsToDraw; i++) { TblSetItemStyle(table, i, 0, labelTableItem); TblSetItemStyle(table, i, 1, labelTableItem); TblSetItemStyle(table, i, 2, labelTableItem); TblSetItemPtr(table, i, 0, icon[i]); TblSetItemPtr(table, i, 1, userName[i]); TblSetItemPtr(table, i, 2, postPreview[i]); TblSetRowUsable(table, i, true); //OS3.5: TblSetRowMasked(table, i, ((i%2) == 0) ? true : false); // TblSetRowSelectable(table, i, ((i%2) == 0) ? false : true); TblMarkRowInvalid(table, i); } for (i = 0; i < PostListColumns; i++) { TblSetColumnUsable(table, i, true); } // TblSetRowUsable(table, 0, false); // TblRedrawTable(table); // FrmUpdateForm (Table, 0); TblRedrawTable(table); }
Boolean ExamsFormHandleEvent(EventPtr event) { FormPtr frm=FrmGetActiveForm(); Boolean handled = false; Boolean categoryEdited, reDraw=false; UInt16 category, numRecords; ControlType *ctl; UInt32 *recordList; if (event->eType == ctlSelectEvent) { // button handling switch (event->data.ctlSelect.controlID) { case BUTTON_ex_back: handled=true; FrmGotoForm(FORM_main); break; case BUTTON_ex_add: handled=true; if (CountCourses() > 0) { gExamsLastSelRowUID=0; FrmPopupForm(FORM_exam_details); } else { FrmAlert(ALERT_nocourses); } break; case BUTTON_ex_edit: handled=true; gExamsLastSelRowUID=TblGetRowData(GetObjectPtr(TABLE_exams), gExamsSelRow); FrmPopupForm(FORM_exam_details); break; case BUTTON_ex_note: { UInt16 index=0; handled=true; gExamsLastSelRowUID=TblGetRowData(GetObjectPtr(TABLE_exams), gExamsSelRow); DmFindRecordByID(DatabaseGetRefN(DB_MAIN), gExamsLastSelRowUID, &index); NoteSet(index, FORM_exams); FrmPopupForm(NewNoteView); break; } case BUTTON_ex_del: handled=true; gExamsLastSelRowUID=TblGetRowData(GetObjectPtr(TABLE_exams), gExamsSelRow); ExamDelete(); break; case BUTTON_ex_beam: handled=true; gExamsLastSelRowUID=TblGetRowData(GetObjectPtr(TABLE_exams), gExamsSelRow); ExamBeam(); break; case LIST_ex_cat_trigger: handled=true; category=DatabaseGetCat(); numRecords=DmNumRecordsInCategory(DatabaseGetRef(), DELETE_CATEGORY); recordList=(UInt32 *)MemPtrNew(numRecords * sizeof(UInt32)); CatPreEdit(numRecords, recordList); categoryEdited = CategorySelect(DatabaseGetRef(), frm, LIST_ex_cat_trigger, LIST_ex_cat, false, &category, gCategoryName, 0, STRING_cat_edit); // categoryDefaultEditCategoryString if (categoryEdited || (category != DatabaseGetCat())) { reDraw=true; DatabaseSetCat(category); ctl = GetObjectPtr(LIST_ex_cat_trigger); CategoryGetName(DatabaseGetRef(), category, gCategoryName); CategorySetTriggerLabel(ctl, gCategoryName); } CatPostEdit(numRecords, recordList); if (reDraw) { gExamsOffset=0; gExamsSelRow=0; FrmUpdateForm(FORM_exams, frmRedrawUpdateCode); } if (recordList != NULL) MemPtrFree((MemPtr)recordList); break; default: break; } } else if (event->eType == tblEnterEvent) { UInt16 i; if (event->data.tblEnter.column == EXCOL_DONE) { handled=false; } else if (event->data.tblEnter.column == EXCOL_NOTE) { MemHandle m; Boolean hasNote=false; gExamsSelRow=event->data.tblEnter.row; for (i=0; i < TblGetNumberOfRows(event->data.tblEnter.pTable); ++i) { RectangleType r; TblGetItemBounds(event->data.tblEnter.pTable, i, EXCOL_SELI, &r); TableDrawSelection(event->data.tblEnter.pTable, i, event->data.tblEnter.column, &r); } m = DmQueryRecord(DatabaseGetRefN(DB_MAIN), TblGetRowID(event->data.tblEnter.pTable, event->data.tblEnter.row)); if (m) { ExamDBRecord *ex = (ExamDBRecord *)MemHandleLock(m); if (ex->note) hasNote = true; else hasNote = false; MemHandleUnlock(m); } if (hasNote) { Coord newPointX, newPointY; Boolean isPenDown=false, drawn=false; RectangleType fieldBounds; IndexedColorType curForeColor, curBackColor, curTextColor; Char noteSymb[2] = { GADGET_NOTESYMBOL, 0 }; FontID oldFont; EvtGetPen(&newPointX, &newPointY, &isPenDown); TblGetItemBounds(event->data.tblEnter.pTable, event->data.tblEnter.row, EXCOL_NOTE, &fieldBounds); oldFont = FntSetFont(symbolFont); while (isPenDown){ if (! drawn && RctPtInRectangle(newPointX, newPointY, &fieldBounds)) { curForeColor = WinSetForeColor(UIColorGetTableEntryIndex(UIObjectSelectedForeground)); curBackColor = WinSetBackColor(UIColorGetTableEntryIndex(UIObjectSelectedFill)); curTextColor = WinSetTextColor(UIColorGetTableEntryIndex(UIObjectSelectedForeground)); TNDrawCharsToFitWidth(noteSymb, &fieldBounds); WinSetForeColor(curForeColor); WinSetForeColor(curBackColor); WinSetForeColor(curTextColor); drawn = true; } else if (drawn && ! RctPtInRectangle(newPointX, newPointY, &fieldBounds)) { curForeColor = WinSetForeColor(UIColorGetTableEntryIndex(UIObjectForeground)); curBackColor = WinSetBackColor(UIColorGetTableEntryIndex(UIObjectFill)); curTextColor = WinSetTextColor(UIColorGetTableEntryIndex(UIObjectForeground)); TNDrawCharsToFitWidth(noteSymb, &fieldBounds); WinSetForeColor(curForeColor); WinSetForeColor(curBackColor); WinSetForeColor(curTextColor); drawn = false; } EvtGetPen(&newPointX, &newPointY, &isPenDown); } FntSetFont(oldFont); } else { handled = true; } } else { gExamsSelRow=event->data.tblEnter.row; for (i=0; i < TblGetNumberOfRows(event->data.tblEnter.pTable); ++i) { RectangleType r; TblGetItemBounds(event->data.tblEnter.pTable, i, EXCOL_SELI, &r); TableDrawSelection(event->data.tblEnter.pTable, i, event->data.tblEnter.column, &r); } handled=true; } } else if (event->eType == tblSelectEvent) { if (event->data.tblEnter.column == EXCOL_DONE) { MemHandle mex; ExamDBRecord *ex; Boolean done=(TblGetItemInt(event->data.tblSelect.pTable, event->data.tblSelect.row, event->data.tblSelect.column) == 0) ? false : true; UInt16 flags, index=TblGetRowID(event->data.tblSelect.pTable, event->data.tblSelect.row); mex=DmGetRecord(DatabaseGetRefN(DB_MAIN), index); ex = MemHandleLock(mex); flags = ex->flags; if (done) { flags |= EX_FLAG_DONE; } else { flags &= (EX_FLAG_DONE ^ 0xFFFF); } DmWrite(ex, offsetof(ExamDBRecord, flags), &flags, sizeof(flags)); DmReleaseRecord(DatabaseGetRefN(DB_MAIN), index, false); TblMarkRowInvalid(event->data.tblSelect.pTable, event->data.tblSelect.row); TblRedrawTable(event->data.tblSelect.pTable); MemHandleUnlock(mex); } else if (event->data.tblEnter.column == EXCOL_NOTE) { ControlType *ctl=GetObjectPtr(BUTTON_ex_note); // Don't need code twice, just read ctlSelect Event for BUTTON_ex_note CtlHitControl(ctl); } handled=true; } else if (event->eType == ctlRepeatEvent) { // Repeat buttons pressed if( event->data.ctlRepeat.controlID == REPEAT_ex_up ) gExamsOffset -= 1; else gExamsOffset += 1; ExamsTableInit(); TblMarkTableInvalid(GetObjectPtr(TABLE_exams)); TblRedrawTable(GetObjectPtr(TABLE_exams)); } else if (event->eType == keyDownEvent) { // We have a hard button assigned and it was pressed if (TxtCharIsHardKey(event->data.keyDown.modifiers, event->data.keyDown.chr)) { if (! (event->data.keyDown.modifiers & poweredOnKeyMask)) { FrmGotoForm(FORM_main); handled = true; } } } else if (event->eType == menuOpenEvent) { return HandleMenuOpenEvent(event); } else if (event->eType == menuEvent) { // forwarding of menu events return HandleMenuEvent(event->data.menu.itemID); } else if (event->eType == frmOpenEvent) { // initializes and draws the form ControlType *ctl; gExamsOffset=0; ExamsTableInit(); FrmDrawForm (frm); ctl = GetObjectPtr(LIST_ex_cat_trigger); CategoryGetName (DatabaseGetRef(), DatabaseGetCat(), gCategoryName); CategorySetTriggerLabel (ctl, gCategoryName); handled = true; } else if (event->eType == frmUpdateEvent) { // redraws the form if needed gExamsOffset=0; ExamsTableInit(); FrmDrawForm(frm); handled = false; } else if (event->eType == frmCloseEvent) { // this is done if form is closed // TblEraseTable(GetObjectPtr(TABLE_exams)); // ExamsFormFree(); FrmEraseForm(frm); } return (handled); }
static void ExamsTableInit(void) { TableType *table=GetObjectPtr(TABLE_exams); UInt16 i, j; MemHandle m; UInt16 index=0; gExamsSelRow = 0; for (i=0; i < TblGetNumberOfRows(table); ++i) { TblSetItemStyle(table, i, EXCOL_DONE, checkboxTableItem); TblSetItemStyle(table, i, EXCOL_COURSE, customTableItem); TblSetItemStyle(table, i, EXCOL_NOTE, customTableItem); TblSetItemStyle(table, i, EXCOL_DATE, customTableItem); TblSetItemStyle(table, i, EXCOL_TIME, customTableItem); TblSetItemStyle(table, i, EXCOL_SELI, customTableItem); } TblSetColumnSpacing(table, EXCOL_DONE, 2); TblSetColumnSpacing(table, EXCOL_COURSE, 1); TblSetColumnSpacing(table, EXCOL_NOTE, 3); TblSetColumnSpacing(table, EXCOL_DATE, 1); TblSetColumnSpacing(table, EXCOL_TIME, 3); TblSetColumnUsable(table, EXCOL_DONE, true); TblSetColumnUsable(table, EXCOL_COURSE, true); TblSetColumnUsable(table, EXCOL_NOTE, true); TblSetColumnUsable(table, EXCOL_DATE, true); TblSetColumnUsable(table, EXCOL_TIME, true); TblSetColumnUsable(table, EXCOL_SELI, true); for (i=0; i < TblGetNumberOfRows(table); ++i) { TblSetRowUsable(table, i, false); } TblSetCustomDrawProcedure(table, EXCOL_COURSE, TableDrawData); TblSetCustomDrawProcedure(table, EXCOL_NOTE, TableDrawData); TblSetCustomDrawProcedure(table, EXCOL_DATE, TableDrawData); TblSetCustomDrawProcedure(table, EXCOL_TIME, TableDrawData); TblSetCustomDrawProcedure(table, EXCOL_SELI, TableDrawSelection); i = 0; j = 0; while ((i < EX_MAX_ROWS) && (m = DmQueryNextInCategory(DatabaseGetRefN(DB_MAIN), &index, DatabaseGetCat()))) { UInt32 uid=0; ExamDBRecord *ex; DmRecordInfo(DatabaseGetRefN(DB_MAIN), index, NULL, &uid, NULL); ex = MemHandleLock(m); if (ex->type == TYPE_EXAM) { // We have an exam, insert if above current offset if (j >= gExamsOffset) { UInt16 done = ex->flags & EX_FLAG_DONE; TblInsertRow(table, i); TblSetRowID(table, i, index); TblSetRowData(table, i, uid); if (uid == gExamsLastSelRowUID) gExamsSelRow = i; TblSetRowUsable(table, i, true); TblMarkRowInvalid(table, i); TblSetItemInt(table, i, EXCOL_DONE, done); i += 1; } j += 1; } MemHandleUnlock(m); index += 1; } // Check if there are displayed exams. If there are not, hide the // buttons for edit/delete/beam, otherwise show if (i > 0) { CtlShowControl(GetObjectPtr(BUTTON_ex_edit)); CtlShowControl(GetObjectPtr(BUTTON_ex_del)); CtlShowControl(GetObjectPtr(BUTTON_ex_beam)); CtlShowControl(GetObjectPtr(BUTTON_ex_note)); } else { CtlHideControl(GetObjectPtr(BUTTON_ex_edit)); CtlHideControl(GetObjectPtr(BUTTON_ex_del)); CtlHideControl(GetObjectPtr(BUTTON_ex_beam)); CtlHideControl(GetObjectPtr(BUTTON_ex_note)); } // decide and (show/hide) whether to have enabled or disabled down button // There must be another record, otherwise our course we assigned this exam to would // not exist, that should never happen. But to cover my future mistakes // index has been increased one in the loop. if ( (m = DmQueryNextInCategory(DatabaseGetRefN(DB_MAIN), &index, DatabaseGetCat())) != NULL) { // We have more records, are there exams? Char *s; s = MemHandleLock(m); // Since the DB is sorted we do not need to search for exams but just check the next // record. If it is not an exam record there won't be any later! if (s[0] == TYPE_EXAM) { CtlHideControl(GetObjectPtr(REPEAT_ex_down_dis)); CtlShowControl(GetObjectPtr(REPEAT_ex_down)); } else { CtlHideControl(GetObjectPtr(REPEAT_ex_down)); CtlShowControl(GetObjectPtr(REPEAT_ex_down_dis)); } MemHandleUnlock(m); } else { CtlHideControl(GetObjectPtr(REPEAT_ex_down)); CtlShowControl(GetObjectPtr(REPEAT_ex_down_dis)); } // decide (and show/hide) whether to have enabled or disabled up button if (gExamsOffset > 0) { CtlHideControl(GetObjectPtr(REPEAT_ex_up_dis)); CtlShowControl(GetObjectPtr(REPEAT_ex_up)); } else { CtlHideControl(GetObjectPtr(REPEAT_ex_up)); CtlShowControl(GetObjectPtr(REPEAT_ex_up_dis)); } }