MemeveyPro-m68k/MainApp.cpp

297 lines
6.8 KiB
C++

#include "MainApp.h"
DialogPtr _mainDialog;
char _run = 1; //Set this to 0 when it's time to quit.
pascal void ButtonFrameProc(DialogRef dlg, DialogItemIndex itemNo){
DialogItemType type;
Handle itemH;
Rect box;
GetDialogItem(dlg, 1, &type, &itemH, &box);
InsetRect(&box, -4, -4);
PenSize(3,3);
FrameRoundRect(&box,16,16);
}
void PresentAboutBox(){
DialogRef aboutDialog = GetNewDialog(dlogAbout, 0, (WindowPtr)-1);
DialogItemType type;
Handle itemH;
Rect box;
GetDialogItem(aboutDialog, 2, &type, &itemH, &box);
SetDialogItem(aboutDialog, 2, type, (Handle) NewUserItemUPP(&ButtonFrameProc), &box);
MacSetPort(aboutDialog);
UpdateDialog(aboutDialog, aboutDialog->visRgn);
short item;
do {
ModalDialog(NULL, &item);
} while(item != 1);
FlushEvents(everyEvent, 0);
DisposeWindow(aboutDialog);
MacSetPort(_mainDialog);
}
void PresentAutojerkResult(){
DialogPtr autojerkResultDialog = GetNewDialog(dlogAutojerkResult, 0, (WindowPtr)-1);
DialogItemType type;
Handle itemH;
Rect box;
short item;
GetDialogItem(autojerkResultDialog, 2, &type, &itemH, &box);
SetDialogItem(autojerkResultDialog, 2, type, (Handle) NewUserItemUPP(&ButtonFrameProc), &box);
MacSetPort(autojerkResultDialog);
UpdateDialog(autojerkResultDialog, autojerkResultDialog->visRgn);
SelectWindow(autojerkResultDialog);
/*The strings you pass in the parameters to ParamText cannot contain the special strings
^0 through ^3, or else the procedure will enter an endless loop of substitutions in
versions of system software earlier than 7.1.*/
if (!_markov.isInitialized()){
//Return an error eventually.
ParamText("\pThe Markov Object has not been initialized yet. Try opening a file.","\p","\p","\p");
do {
ModalDialog(NULL, &item);
} while(item != 1);
} else {
//ParamText(myString,myString,myString,myString);
ParamText("\pThe code to actually generate stuff hasn't been written yet...","\p","\p","\p");
do {
ModalDialog(NULL, &item);
} while(item != 1);
}
FlushEvents(everyEvent, 0);
DisposeWindow(autojerkResultDialog);
MacSetPort(_mainDialog);
}
void PresentUnimplementedDlog(){
//CautionAlert(alrtUnimplemented, NULL);
}
void PresentMainDlog(){
//_mainDialog = GetNewWindow(windMain, 0, (WindowPtr)-1);
_mainDialog = GetNewDialog(dlogMain, 0, (WindowPtr)-1);
//SwitchDITL(ditlMain);
//Do anything else.
}
//Changes the UI of the main dialog.
//This lets us keep one dialog box around and just change its guts.
//The only problem is that I have never gotten this to work, so...
/*
void SwitchDITL(short int toDitlID){
_activeDITL = toDitlID;
MacSetPort(_mainDialog);
EraseRgn(_mainDialog->visRgn);
ForeColor(whiteColor);
ShortenDITL(_mainDialog, CountDITL(_mainDialog));
Handle newDitl = GetResource('DITL', _activeDITL);
AppendDITL(_mainDialog, newDitl, overlayDITL);
ReleaseResource(newDitl);
UpdateDialog(_mainDialog, _mainDialog->visRgn);
}
*/
//
// Event Processing
//
void EventLoop(){
EventRecord event;
//For now, present the main dialog here.
PresentMainDlog();
//Essentially, the app's main loop.
while (_run){
if (WaitNextEvent(everyEvent, &event, 0, NULL)){
//On an event, process it.
HandleEvent(&event);
} else {
//Background tasks.
//Here, we could do something else.
}
}
//For the "Crash Computer" option: Just try opening a DITL/DLOG that doesn't exist, or something :thonk:
}
//Handle a single event.
void HandleEvent(EventRecord *eventPtr){
char eventChar;
switch (eventPtr->what){
case keyDown:
//No commands here yet...
break;
case autoKey:
eventChar = eventPtr->message & charCodeMask;
if ((eventPtr->modifiers & cmdKey) != 0) HandleMenuChoice(MenuKey(eventChar));
break;
case mouseDown:
HandleMouseDown(eventPtr);
break;
case updateEvt:
HandleUpdate(eventPtr);
break;
case kHighLevelEvent:
AEProcessAppleEvent(eventPtr);
break;
}
}
//Handle a mouse click event.
void HandleMouseDown(EventRecord *eventPtr){
WindowPtr window;
short int part;
long menuChoice;
part = FindWindow(eventPtr->where, &window);
switch (part){
case inMenuBar:
//If it's in the menu bar.
menuChoice = MenuSelect(eventPtr->where);
HandleMenuChoice(menuChoice);
break;
case inContent:
//If it's in the content of the window. Todo.
if (window != FrontWindow()) SelectWindow(window);
HandleInContent(eventPtr);
break;
case inDrag:
if (window == FrontWindow())
DragWindow(window, eventPtr->where, &qd.screenBits.bounds);
break;
case inGoAway: //with "goAway" being the close box
if (TrackGoAway(window, eventPtr->where)){
//We can do other things here, but for now...
QuitApp();
}
break;
}
}
//Handle a menu selection.
void HandleMenuChoice(long menuChoice){
Str255 str;
WindowRef w;
short menuID = menuChoice >> 16;
short menuItem = menuChoice & 0xFFFF;
if (menuID == menuApple){ //Handle stuff in the Apple Menu
if (menuItem == menuitemAbout) PresentAboutBox();
else {
//If it's not the about box, it's another external app that we should let the OS handle.
GetMenuItemText(MacGetMenu(menuApple), menuItem, str);
OpenDeskAcc(str);
}
}
else if (menuID == menuUser){
switch (menuItem){
case menuitemQuit:
QuitApp();
break;
default:
PresentUnimplementedDlog();
break;
}
}
else if (menuID == menuAutojerk){
switch (menuItem){
case menuitemAutojerkGenerate:
PresentAutojerkResult();
break;
case menuitemAutojerkOpenFile:
Point origin;
origin.h = 80;
origin.v = 80;
OpenAutojerkSourceFile(origin);
break;
default:
PresentUnimplementedDlog();
break;
}
}
else {
PresentUnimplementedDlog();
}
HiliteMenu(0);
}
void HandleUpdate(EventRecord *eventPtr){
if (_mainDialog == FrontWindow()){
BeginUpdate(_mainDialog);
//Update the content of the window here.
UpdateDialog(_mainDialog, _mainDialog->visRgn);
EndUpdate(_mainDialog);
}
}
void HandleInContent(EventRecord *eventPtr){
//Todo
WindowPtr window;
DialogPtr dialog;
short part, item;
part = FindWindow(eventPtr->where, &window);
//SelectWindow(window); //Bring the clicked window to the front.
//Drag the window if CMD is held down.
if ((eventPtr->modifiers & cmdKey) != 0) DragWindow(window, eventPtr->where, &qd.screenBits.bounds);
if (DialogSelect(eventPtr, &dialog, &item)){
if (dialog == _mainDialog) DragWindow(window, eventPtr->where, &qd.screenBits.bounds); //We'll do something more here later...
else {} //Do nothing for now
}
}
void QuitApp(){
_run = 0; //Now, the EventLoop will stop.
//Do any clean-up here.
//CloseWindow(_mainDialog);
CloseDialog(_mainDialog);
//ExitToShell();
//For now, there isn't much else to do.
}