mirror of
https://github.com/sheumann/DiskBrowser.git
synced 2024-11-28 22:50:23 +00:00
e7230aa80e
If an older version is used, the user is warned about it but can still continue.
255 lines
7.2 KiB
C
255 lines
7.2 KiB
C
/*********************************************************************
|
|
* Disk browser window handling
|
|
*********************************************************************/
|
|
|
|
#ifdef __ORCAC__
|
|
#pragma noroot
|
|
#endif
|
|
|
|
#include <control.h>
|
|
#include <desk.h>
|
|
#include <list.h>
|
|
#include <loader.h>
|
|
#include <quickdraw.h>
|
|
#include <resources.h>
|
|
#include <window.h>
|
|
#include <tcpip.h>
|
|
#include <gsos.h>
|
|
|
|
#include <orca.h>
|
|
#include <string.h>
|
|
|
|
#include "json.h"
|
|
|
|
#include "browserwindow.h"
|
|
#include "diskbrowser.h"
|
|
#include "browserevents.h"
|
|
#include "disksearch.h"
|
|
#include "browserutil.h"
|
|
|
|
/* Rectangles outlining the buttons in the style of "default" buttons */
|
|
static Rect searchRect = {8, 305, 26, 414};
|
|
static Rect mountRect = {150, 301, 168, 414};
|
|
|
|
static char showMoreString[] = "\pShow More";
|
|
static char mountDiskString[] = "\pMount Disk";
|
|
|
|
/* Has the resource file been opened? (True while window is displayed.) */
|
|
static Boolean resourceFileOpened;
|
|
|
|
/* ID of our resource file */
|
|
static Word resourceFileID;
|
|
|
|
/* Record about our system window, to support processing by Desk Manager. */
|
|
/* See Prog. Ref. for System 6.0, page 20. */
|
|
static NDASysWindRecord sysWindRecord;
|
|
|
|
/* Is the search button (as opposed to mount) the current default? */
|
|
static Boolean defaultButtonIsSearch;
|
|
|
|
/* Search and mount button controls */
|
|
static CtlRecHndl mountButtonHandle;
|
|
static CtlRecHndl searchButtonHandle;
|
|
|
|
/* Target control ID last time we checked */
|
|
static unsigned long lastTargetCtlID = 0;
|
|
|
|
/* Is "More Results" selected in the disk list? */
|
|
static boolean moreResultsSelected = false;
|
|
|
|
|
|
static void DrawContents(void);
|
|
static void DrawButtonOutlines(boolean justChanged);
|
|
|
|
|
|
static void MarinettiVersionCheck(void) {
|
|
static boolean alreadyChecked = false;
|
|
|
|
if (!alreadyChecked) {
|
|
if (TCPIPLongVersion() < DESIRED_MARINETTI_VERSION) {
|
|
ShowErrorAlert(0, marinettiVersionWarning);
|
|
}
|
|
alreadyChecked = true;
|
|
}
|
|
}
|
|
|
|
void ShowBrowserWindow(void) {
|
|
if (windowOpened) {
|
|
SelectWindow(window);
|
|
return;
|
|
}
|
|
|
|
Word origResourceApp = GetCurResourceApp();
|
|
SetCurResourceApp(myUserID);
|
|
|
|
resourceFileID =
|
|
OpenResourceFile(readEnable, NULL, LGetPathname2(myUserID, 1));
|
|
if (toolerror()) {
|
|
resourceFileID = 0;
|
|
resourceFileOpened = false;
|
|
goto cleanup;
|
|
}
|
|
resourceFileOpened = true;
|
|
|
|
MarinettiVersionCheck();
|
|
|
|
window = NewWindow2(NULL, 0, DrawContents, NULL,
|
|
refIsResource, winDiskBrowser, rWindParam1);
|
|
if (toolerror()) {
|
|
window = NULL;
|
|
windowOpened = false;
|
|
goto cleanup;
|
|
}
|
|
windowOpened = true;
|
|
|
|
SetSysWindow(window);
|
|
|
|
AuxWindInfoRecord *auxWindInfo = GetAuxWindInfo(window);
|
|
if (toolerror()) {
|
|
CloseWindow(window);
|
|
windowOpened = false;
|
|
window = NULL;
|
|
goto cleanup;
|
|
}
|
|
|
|
memset(&sysWindRecord, sizeof(sysWindRecord), 0);
|
|
sysWindRecord.closeProc = (ProcPtr)CloseBrowserWindow;
|
|
sysWindRecord.actionProc = (ProcPtr)actionProcWrapper;
|
|
sysWindRecord.eventMask = 0xFFFF; //0x03FF;
|
|
sysWindRecord.memoryID = myUserID;
|
|
auxWindInfo->NDASysWindPtr = (Ptr)&sysWindRecord;
|
|
|
|
InitEventState();
|
|
|
|
disksListHandle = GetCtlHandleFromID(window, disksList);
|
|
mountButtonHandle = GetCtlHandleFromID(window, mountDiskButton);
|
|
searchButtonHandle = GetCtlHandleFromID(window, searchButton);
|
|
|
|
HiliteControl(inactiveHilite, disksListHandle);
|
|
HiliteControl(inactiveHilite, mountButtonHandle);
|
|
|
|
lastTargetCtlID = 0;
|
|
defaultButtonIsSearch = true;
|
|
|
|
wantToOpenWindow = 0;
|
|
|
|
moreResultsSelected = false;
|
|
|
|
diskList = malloc(DISK_LIST_MAX_LENGTH * sizeof(*diskList));
|
|
if (diskList == NULL) {
|
|
CloseWindow(window);
|
|
windowOpened = false;
|
|
window = NULL;
|
|
goto cleanup;
|
|
}
|
|
|
|
cleanup:
|
|
if (resourceFileOpened && !windowOpened) {
|
|
CloseResourceFile(resourceFileID);
|
|
resourceFileOpened = false;
|
|
}
|
|
|
|
SetCurResourceApp(origResourceApp);
|
|
}
|
|
|
|
|
|
#pragma databank 1
|
|
void CloseBrowserWindow(void) {
|
|
if (windowOpened) {
|
|
CloseWindow(window);
|
|
windowOpened = false;
|
|
window = NULL;
|
|
}
|
|
|
|
if (resourceFileOpened) {
|
|
CloseResourceFile(resourceFileID);
|
|
resourceFileOpened = false;
|
|
}
|
|
|
|
free(diskList);
|
|
|
|
FreeJSON();
|
|
}
|
|
#pragma databank 0
|
|
|
|
|
|
#pragma databank 1
|
|
static void DrawContents(void) {
|
|
Word origResourceApp = GetCurResourceApp();
|
|
SetCurResourceApp(myUserID);
|
|
|
|
PenNormal(); /* use a "normal" pen */
|
|
DrawControls(GetPort()); /* draw controls in window */
|
|
|
|
DrawButtonOutlines(false);
|
|
|
|
SetCurResourceApp(origResourceApp);
|
|
}
|
|
#pragma databank 0
|
|
|
|
|
|
/* Draw outlines of buttons as default or not, as appropriate. */
|
|
static void DrawButtonOutlines(boolean justChanged) {
|
|
PenNormal();
|
|
SetPenSize(3, 1);
|
|
if (defaultButtonIsSearch) {
|
|
FrameRRect(&searchRect, 36, 12);
|
|
if (justChanged) {
|
|
SetSolidPenPat(white);
|
|
FrameRRect(&mountRect, 36, 12);
|
|
}
|
|
} else {
|
|
FrameRRect(&mountRect, 36, 12);
|
|
if (justChanged) {
|
|
SetSolidPenPat(white);
|
|
FrameRRect(&searchRect, 36, 12);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Update state of controls based on user input */
|
|
void UpdateControlState(void) {
|
|
unsigned long targetCtlID = GetCtlID(FindTargetCtl());
|
|
if (targetCtlID != lastTargetCtlID) {
|
|
/* Make appropriate button respond to the "return" key */
|
|
lastTargetCtlID = targetCtlID;
|
|
if (targetCtlID == searchLine) {
|
|
SetCtlMoreFlags(GetCtlMoreFlags(mountButtonHandle) & 0x1FFF,
|
|
mountButtonHandle);
|
|
SetCtlMoreFlags(GetCtlMoreFlags(searchButtonHandle) | fCtlWantEvents,
|
|
searchButtonHandle);
|
|
defaultButtonIsSearch = true;
|
|
} else if (targetCtlID == disksList) {
|
|
SetCtlMoreFlags(GetCtlMoreFlags(searchButtonHandle) & 0x1FFF,
|
|
searchButtonHandle);
|
|
SetCtlMoreFlags(GetCtlMoreFlags(mountButtonHandle) | fCtlWantEvents,
|
|
mountButtonHandle);
|
|
defaultButtonIsSearch = false;
|
|
}
|
|
DrawButtonOutlines(true);
|
|
}
|
|
|
|
/* Only allow "Mount Disk" to be clicked if there is a disk selected */
|
|
unsigned currentSelection = NextMember2(0, (Handle)disksListHandle);
|
|
if (currentSelection != 0) {
|
|
if (diskList[currentSelection-1].memPtr == moreResultsString) {
|
|
if (!moreResultsSelected) {
|
|
SetCtlMoreFlags(GetCtlMoreFlags(mountButtonHandle) & 0xFFFC,
|
|
mountButtonHandle);
|
|
SetCtlTitle(showMoreString, (Handle)mountButtonHandle);
|
|
moreResultsSelected = true;
|
|
}
|
|
} else {
|
|
if (moreResultsSelected) {
|
|
SetCtlMoreFlags(GetCtlMoreFlags(mountButtonHandle) & 0xFFFC,
|
|
mountButtonHandle);
|
|
SetCtlTitle(mountDiskString, (Handle)mountButtonHandle);
|
|
moreResultsSelected = false;
|
|
}
|
|
}
|
|
HiliteControl(noHilite, mountButtonHandle);
|
|
} else {
|
|
HiliteControl(inactiveHilite, mountButtonHandle);
|
|
}
|
|
}
|