/* File Manager 1.0 * * This code is copyright Andrew Howlett 1998 * under the terms of the GNU Public License. * * by Andrew Howlett * howlett@iosphere.net * March 1998 */ #pragma pack(2) #include #include #include #include "fileman.h" /*********************************************************************** * Structures for this module **********************************************************************/ /*********************************************************************** * Global variables for this module **********************************************************************/ int TopRow = 0; int NumDatabases = 0; int Help_page = 0; int Show_database_index = 0; /*********************************************************************** * Prototypes for internal functions **********************************************************************/ static int StartApplication(void); static void EventLoop(void); static Boolean FileListEventHandler(EventPtr event); static void FileListDrawForm(void); static void FileListDrawCell(VoidPtr tableP, Word row, Word column, RectanglePtr bounds); static void FileListScroll(int direction); static Boolean MenuEventHandler(EventPtr event); static Boolean ShowDatabaseEventHandler(EventPtr event); static void ShowDatabaseDrawForm(void); static Boolean ShowCardEventHandler(EventPtr event); static void ShowCardDrawForm(void); static Boolean HelpEventHandler(EventPtr event); static void LoadHelpPage(void); /* **************************************************************************** ***** ***** ***** Pilot Main ***** ***** ***** **************************************************************************** */ DWord PilotMain (Word cmd, Ptr cmdPBP, Word launchFlags) { int error; if (cmd == sysAppLaunchCmdNormalLaunch) { error = StartApplication(); if (error) return error; EventLoop(); } return 0; } static int StartApplication(void) { TopRow = 0; NumDatabases = DmNumDatabases(0); FrmGotoForm(formID_FileList); } /* **************************************************************************** ***** ***** ***** Event Loop ***** ***** ***** **************************************************************************** */ static void EventLoop(void) { short err; int formID; FormPtr form; EventType event; do { EvtGetEvent(&event, 0); if (SysHandleEvent(&event)) continue; if (MenuHandleEvent((void *)0, &event, &err)) continue; if (event.eType == frmLoadEvent) { formID = event.data.frmLoad.formID; form = FrmInitForm(formID); FrmSetActiveForm(form); switch (formID) { case formID_FileList: FrmSetEventHandler(form, FileListEventHandler); break; case formID_Help: FrmSetEventHandler(form, HelpEventHandler); break; case formID_ShowDatabase: FrmSetEventHandler(form, ShowDatabaseEventHandler); break; case formID_ShowCard: FrmSetEventHandler(form, ShowCardEventHandler); break; } } FrmDispatchEvent(&event); } while(event.eType != appStopEvent); } /* **************************************************************************** ***** ***** ***** File List Event Handler ***** ***** ***** **************************************************************************** */ static Boolean FileListEventHandler(EventPtr event) { int handled; switch (event->eType) { case frmOpenEvent: FileListDrawForm(); break; case keyDownEvent: if (event->data.keyDown.chr == pageUpChr) { FileListScroll (pageUpChr); FileListDrawForm(); handled = true; } else if (event->data.keyDown.chr == pageDownChr) { FileListScroll (pageDownChr); FileListDrawForm(); handled = true; } break; case tblSelectEvent: Show_database_index = TopRow + event->data.tblSelect.row; FrmGotoForm(formID_ShowDatabase); handled = true; break; case menuEvent: MenuEventHandler(event); handled = true; break; default: return 0; } return handled; } static void FileListDrawForm(void) { FormPtr frm; TablePtr tableP; UInt dbIndex; Word row, numRows; int currFont; char string[30]; WinEraseWindow(); frm = FrmGetActiveForm(); tableP = FrmGetObjectPtr (frm, FrmGetObjectIndex (frm, tableID_FileList)); if (NumDatabases == 0) { FrmDrawForm (frm); return; } dbIndex = TopRow; numRows = TblGetNumberOfRows (tableP); TblSetRowData(tableP, 1, TopRow); for (row = 0; row < numRows; row++, dbIndex++) { if (dbIndex < NumDatabases) { TblSetItemStyle (tableP, row, 0, customTableItem); TblSetItemStyle (tableP, row, 1, customTableItem); TblSetItemStyle (tableP, row, 2, customTableItem); TblSetItemStyle (tableP, row, 3, customTableItem); TblSetItemStyle (tableP, row, 4, customTableItem); TblSetRowUsable (tableP, row, true); TblMarkRowInvalid (tableP, row); } else { TblSetRowUsable (tableP, row, false); } } TblSetCustomDrawProcedure (tableP, 0, FileListDrawCell); TblSetCustomDrawProcedure (tableP, 1, FileListDrawCell); TblSetCustomDrawProcedure (tableP, 2, FileListDrawCell); TblSetCustomDrawProcedure (tableP, 3, FileListDrawCell); TblSetCustomDrawProcedure (tableP, 4, FileListDrawCell); TblSetColumnUsable (tableP, 0, true); TblSetColumnUsable (tableP, 1, true); TblSetColumnUsable (tableP, 2, true); TblSetColumnUsable (tableP, 3, true); TblSetColumnUsable (tableP, 4, true); FrmDrawForm (frm); currFont = FntSetFont (0); StrIToA(string, NumDatabases); StrCat(string, " databases on card 0"); WinDrawChars(string, StrLen(string), 0, 149); FntSetFont (currFont); // Restore the font. } /*********************************************************************** * * Trim String To Fit Cell * * I don't want to use the FntCharsInWidth function for two reasons: * * 1. The use of a boolean causes strange problems with GCC * 2. I want "..." to appear at the end of the string if truncated * **********************************************************************/ void TrimStringToFitCell (char *string, int cell_width_pixels) { if (FntCharsWidth(string, StrLen(string)) > cell_width_pixels) { cell_width_pixels -= 6; do { string[StrLen(string) - 1] = 0; } while (FntCharsWidth(string, StrLen(string)) > cell_width_pixels); StrCat(string, "..."); } } static void FileListDrawCell(VoidPtr tableP, Word row, Word column, RectanglePtr bounds) { DWord dbID; short font; char DBName[32], *display_string, string[5]; short TextLen; FontID currFont; unsigned long type, creator, RowTop; unsigned short attributes; RowTop = TblGetRowData(tableP, 1); dbID = DmGetDatabase (0, RowTop + row); DmDatabaseInfo (0, dbID, (char *) &DBName, &attributes, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &type, &creator); switch (column) { case 0: // column 0 shows index StrIToA(string, RowTop+row); display_string = string; TextLen = StrLen(string); font = 0; break; case 1: // column 1 shows Res/Data character if (attributes && dmHdrAttrResDB) string[0] = 'R'; else string[0]='D'; display_string = string; TextLen = 1; font = 1; break; case 2: // column 2 shows type display_string = (char *) &type; TextLen = 4; font = 0; break; case 3: // column 3 shows creatorID display_string = (char *) &creator; TextLen = 4; font = 0; break; case 4: // column 4 shows dbName display_string = (char *) &DBName; TrimStringToFitCell(display_string, bounds->extent.x - 2); TextLen = StrLen(DBName); font = 0; break; } currFont = FntSetFont (font); WinDrawChars(display_string, TextLen, bounds->topLeft.x, bounds->topLeft.y); FntSetFont (currFont); // Restore the font. } static void FileListScroll (int direction) { TablePtr tableP; Word numRows; FormPtr frm; frm = FrmGetActiveForm(); tableP = FrmGetObjectPtr (frm, FrmGetObjectIndex (frm, tableID_FileList)); numRows = TblGetNumberOfRows (tableP); if (direction == pageUpChr) TopRow = TopRow - numRows; else TopRow = TopRow + numRows; if ((TopRow + numRows) >= NumDatabases) TopRow = NumDatabases - numRows; if (TopRow < 0) TopRow = 0; } /* **************************************************************************** ***** ***** ***** Menu Event Handler ***** ***** ***** **************************************************************************** */ static Boolean MenuEventHandler(EventPtr e) { switch (e->data.menu.itemID) { case menuitemID_Help: FrmGotoForm(formID_Help); break; case menuitemID_About: FrmAlert(alertID_About); break; case menuitemID_ShowCard: FrmGotoForm(formID_ShowCard); break; default: return false; } return true; } /* **************************************************************************** ***** ***** ***** Show Database Event Handler ***** ***** ***** **************************************************************************** */ static Boolean ShowDatabaseEventHandler(EventPtr event) { switch (event->eType) { case frmOpenEvent: ShowDatabaseDrawForm(); break; case ctlSelectEvent: if (event->data.ctlEnter.controlID== buttonID_ShowDatabaseDone) FrmGotoForm(formID_FileList); break; default: return false; } return true; } /* **************************************************************************** ***** ***** ***** Show Database Draw Form ***** ***** ***** **************************************************************************** */ static void ShowDatabaseDrawForm(void) { FormPtr frm; DWord dbID; char DBName[32], string[20]; unsigned long type, creator, numRecords, totalBytes, dataBytes; unsigned short attributes; dbID = DmGetDatabase (0, Show_database_index); DmDatabaseInfo (0, dbID, (char *) &DBName, &attributes, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &type, &creator); DmDatabaseSize (0, dbID, &numRecords, &totalBytes, &dataBytes); frm = FrmGetActiveForm(); FrmDrawForm(frm); FrmCopyTitle (frm, DBName); FntSetFont(0); StrIToA(string, (long) Show_database_index); WinDrawChars(string, StrLen(string), 30, 20); StrIToA(string, (long) numRecords); WinDrawChars(string, StrLen(string), 125, 20); WinDrawChars((char*) &type, 4, 35, 35); WinDrawChars((char*) &creator, 4, 105, 35); StrIToA(string, totalBytes); WinDrawChars(string, StrLen(string), 35, 65); StrIToA(string, dataBytes); WinDrawChars(string, StrLen(string), 110, 65); FntSetFont(4); if (attributes & dmHdrAttrResDB) string[0] = 1; else string[0] = 0; WinDrawChars(string, 1, 55, 95); if (attributes & dmHdrAttrReadOnly) string[0] = 1; else string[0] = 0; WinDrawChars(string, 1, 130, 95); if (attributes & dmHdrAttrAppInfoDirty) string[0] = 1; else string[0] = 0; WinDrawChars(string, 1, 67, 110); if (attributes & dmHdrAttrBackup) string[0] = 1; else string[0] = 0; WinDrawChars(string, 1, 118, 110); if (attributes & dmHdrAttrOpen) string[0] = 1; else string[0] = 0; WinDrawChars(string, 1, 40, 125); StrIToA(string, attributes); } /* **************************************************************************** ***** ***** ***** Show Card Event Handler ***** ***** ***** **************************************************************************** */ static Boolean ShowCardEventHandler(EventPtr event) { switch (event->eType) { case frmOpenEvent: ShowCardDrawForm(); break; case ctlSelectEvent: if (event->data.ctlEnter.controlID== buttonID_ShowCardDone) FrmGotoForm(formID_FileList); break; default: return false; } return true; } /* **************************************************************************** ***** ***** ***** Show Card Event Handler ***** ***** ***** **************************************************************************** */ static void ShowCardDrawForm(void) { char cardName[32], manuName[32], string[20]; unsigned short version; unsigned long crDate, romSize, ramSize, freeBytes; MemCardInfo ( 0, (char*) &cardName, (char*) &manuName, &version, &crDate, &romSize, &ramSize, &freeBytes); FrmDrawForm(FrmGetActiveForm()); FntSetFont(0); WinDrawChars(cardName, StrLen(cardName), 60, 20); WinDrawChars(manuName, StrLen(manuName), 75, 35); StrIToA(string, (long) version); WinDrawChars(string, StrLen(string), 60, 50); StrIToA(string, crDate); WinDrawChars(string, StrLen(string), 75, 65); StrIToA(string, romSize); WinDrawChars(string, StrLen(string), 60, 80); StrIToA(string, ramSize); WinDrawChars(string, StrLen(string), 60, 95); StrIToA(string, freeBytes); WinDrawChars(string, StrLen(string), 60, 110); } /* **************************************************************************** ***** ***** ***** Help Event Handler ***** ***** ***** **************************************************************************** */ static Boolean HelpEventHandler(EventPtr event) { FormPtr frm; FieldPtr field; frm = FrmGetActiveForm(); switch (event->eType) { case frmOpenEvent: FrmDrawForm(frm); Help_page = 0; LoadHelpPage(); break; case ctlSelectEvent: // A control button was pressed and released. if (event->data.ctlEnter.controlID== buttonID_HelpDone) { FrmGotoForm(formID_FileList); field = FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, fieldID_Help)); FldSetTextHandle(field, NULL); return true; } if (event->data.ctlEnter.controlID== buttonID_HelpNext && Help_page < maxHelpPage) Help_page++; if (event->data.ctlEnter.controlID== buttonID_HelpPrev && Help_page > 0) Help_page--; LoadHelpPage(); break; default: return false; } return true; } /* **************************************************************************** ***** ***** ***** Load Help Page ***** ***** ***** **************************************************************************** */ static void LoadHelpPage(void) { FormPtr form; VoidHand text; FieldPtr field; ControlPtr button; form = FrmGetActiveForm(); field = FrmGetObjectPtr(form, FrmGetObjectIndex(form, fieldID_Help)); FldEraseField(field); text = DmGet1Resource(1951618130, stringID_HelpPage0 + Help_page); //1951618130 = tSTR DmReleaseResource(text); FldSetTextHandle(field, (Handle) text); FldMakeFullyVisible(field); FldDrawField(field); button = FrmGetObjectPtr(form, FrmGetObjectIndex(form, buttonID_HelpNext)); if (Help_page == maxHelpPage) CtlHideControl(button); else CtlShowControl(button); button = FrmGetObjectPtr(form, FrmGetObjectIndex(form, buttonID_HelpPrev)); if (Help_page == 0) CtlHideControl(button); else CtlShowControl(button); }