// add this line to include_actions.h : GPA_ACTION(edit_action); //#define DEBUG 1 #include #include #include "main.h" #include "file_interface.h" #include "file.h" #include "edit.h" #include "progress.h" #include "hack.h" static MenuHandle menu_edit = 0; static MenuHandle menu_control = 0; static WindowPtr window = 0; static int run_flag = FALSE; static void do_loop(void); static void maintain_cursor(void); static void do_set_about(void); static void do_about(void); static void do_init(void); static void do_exit(void); static void do_menu_select(void); static void do_find_window(void); static void do_event(void); static void do_keydown(void); static void menu_control_run(void); static void menu_control_stop(void); static void draw_window(void); static void redraw_window(void); static void click_window(Point p, int modifiers); static int cursor_moved(Point old_p, Point new_p); extern void edit_action(int action) { switch (action) { case GPA_LOOP: do_loop(); break; case GPA_MENU_SELECT: do_menu_select(); break; case GPA_FIND_WINDOW: do_find_window(); break; case GPA_EVENT: do_event(); break; case GPA_KEYDOWN: do_keydown(); break; case GPA_ABOUT: do_about(); break; case GPA_SET_ABOUT: do_set_about(); break; case GPA_INIT: do_init(); break; case GPA_EXIT: do_exit(); break; } } static void do_set_about(void) { strcat(GPA_about,"EEPROM blaster "); } static void do_about(void) { Point p; GetPen(&p); MoveTo(p.h,p.v+6); TextFont(times); TextSize(24); DrawString("\pEEPROM blaster"); TextFont(monaco); TextSize(9); DrawString("\p version 1.0"); MoveTo(p.h,p.v+20); } static void do_loop(void) { if (run_flag) run_flag = hack(); if (image_dirty) { redraw_window(); image_dirty = FALSE; } maintain_cursor(); } static void maintain_cursor(void) { Point p; static Cursor *cross = 0; if (!window) return; { GrafPtr port; GetPort(&port); SetPort(window); GetMouse(&p); SetPort(port); } if (PtInRect(p,&window->portRect)) { if (!cross) { CursHandle cursH; cursH = GetCursor(crossCursor); HLock((Handle)cursH); cross = (Cursor*) NewPtr(sizeof(Cursor)); *cross = **cursH; DisposeHandle((Handle)cursH); } SetCursor(cross); } else { SetCursor(&arrow); } } static void do_init(void) { int n; menu_edit = NewMenu(GPA_nextFreeMenuId++,"\pEdit"); InsertMenu(menu_edit,0); menu_control = NewMenu(GPA_nextFreeMenuId++,"\pControl"); InsertMenu(menu_control,0); AppendMenu(menu_control,"\pRun/R"); AppendMenu(menu_control,"\pStop/S"); { Rect r; r = screenBits.bounds; InsetRect(&r,20,40); OffsetRect(&r,0,10); window = NewCWindow(0,&r,"\p",TRUE,zoomDocProc,0,TRUE,0); SetPort(window); TextFont(geneva); TextSize(9); SetRect(&r,9999,9999,9999,9999); } clear_file(); } static void do_exit(void) { } static void do_menu_select(void) { Str255 name; int id = HiWord(GPA_menuSelect); int item = LoWord(GPA_menuSelect); if (GetMHandle(id) == menu_control) { GetItem(menu_control,item,name); if (0) ; else if (EqualString("\pRun",name,1,1)) menu_control_run(); else if (EqualString("\pStop",name,1,1)) menu_control_stop(); } if (GetMHandle(id) == menu_edit) { GetItem(menu_edit,item,name); if (0) ; } } static void do_find_window(void) { Point pt; switch (GPA_event.what) { case mouseDown: if (GPA_findWindowPtr == window) { switch (GPA_findWindow) { case inContent: pt = GPA_event.where; GlobalToLocal(&pt); click_window(pt,GPA_event.modifiers); return; case inGoAway: break; case inZoomIn: case inZoomOut: case inGrow: InvalRect(&window->portRect); break; } } break; } } static void do_event(void) { switch (GPA_event.what) { case updateEvt: if ((WindowPtr)GPA_event.message == window) { GrafPtr savePort; GetPort(&savePort); SetPort(window); BeginUpdate(window); draw_window(); DrawGrowIcon(window); UpdtControl(window,window->visRgn); EndUpdate(window); SetPort(savePort); return; } } } static void do_keydown(void) { switch (GPA_event.message & charCodeMask) { case 0x08: // delete break; } } static void draw_window(void) { Rect r; Str15 s; EraseRect(&window->portRect); if (!iconH) return; TextSize(18); TextFont(times); MoveTo(20,20); NumToString(icon_number,s); DrawString(s); MoveTo(120,20); NumToString(frame_number,s); DrawString(s); SetRect(&r,30,30,30+8*32,30+8*32); PlotIcon(&r,iconH); } static void click_window(Point p, int modifiers) { } static int cursor_moved(Point old_p, Point new_p) { static long t = 0; static int looking = TRUE; if (t < TickCount()) looking = TRUE; t = TickCount() + 3; if (looking) { int big = FALSE; if (old_p.h < new_p.h - 3) big = TRUE; if (old_p.h > new_p.h + 3) big = TRUE; if (old_p.v < new_p.v - 3) big = TRUE; if (old_p.v > new_p.v + 3) big = TRUE; if (!big) return FALSE; looking = FALSE; return TRUE; } if (old_p.h == new_p.h && old_p.v == new_p.v) return FALSE; return TRUE; } static void redraw_window(void) { SetPort(window); InvalRect(&window->portRect); } static int dialog_get_one_text(StringPtr value, StringPtr prompt) { DialogPtr theDialog; short item; SetCursor(&arrow); theDialog = GetNewDialog(129,0,(WindowPtr)-1); if (!theDialog) { return FALSE; } { ParamText(prompt,"\p","\p","\p"); } { short iType; Handle iHandle; Rect iRect; GetDItem(theDialog,3,&iType,&iHandle,&iRect); SetIText(iHandle,value); SelIText(theDialog,3,0,32767); } while (TRUE) { ModalDialog(0,&item); if (item == ok) break; if (item == cancel) break; } if (item == ok) { short iType; Handle iHandle; Rect iRect; Str255 prev; memcpy(prev,value,value[0]+1); GetDItem(theDialog,3,&iType,&iHandle,&iRect); GetIText(iHandle,value); if (EqualString(prev,value,TRUE,TRUE)) item = cancel; } DisposeDialog(theDialog); return (item == ok); } static int dialog_get_two_text(StringPtr value, StringPtr name, StringPtr prompt) { DialogPtr theDialog; short item; SetCursor(&arrow); theDialog = GetNewDialog(130,0,(WindowPtr)-1); if (!theDialog) { return FALSE; } { ParamText(prompt,"\p","\p","\p"); } { short iType; Handle iHandle; Rect iRect; GetDItem(theDialog,3,&iType,&iHandle,&iRect); SetIText(iHandle,name); SelIText(theDialog,3,0,32767); GetDItem(theDialog,5,&iType,&iHandle,&iRect); SetIText(iHandle,value); SelIText(theDialog,5,0,32767); } while (TRUE) { ModalDialog(0,&item); if (item == ok) break; if (item == cancel) break; } if (item == ok) { short iType; Handle iHandle; Rect iRect; Str255 prev; item = cancel; memcpy(prev,name,name[0]+1); GetDItem(theDialog,3,&iType,&iHandle,&iRect); GetIText(iHandle,name); if (!EqualString(prev,name,TRUE,TRUE)) item = ok; memcpy(prev,value,value[0]+1); GetDItem(theDialog,5,&iType,&iHandle,&iRect); GetIText(iHandle,value); if (!EqualString(prev,value,TRUE,TRUE)) item = ok; } DisposeDialog(theDialog); return (item == ok); } extern int read_file(void) { } extern int write_file(void) { } extern int clear_file(void) { } static void menu_control_run(void) { run_flag = TRUE; } static void menu_control_stop(void) { run_flag = FALSE; }