#include #include "main.h" #include "file_interface.h" #include "file.h" SFReply data_sfr; extern int data_dirty = FALSE; extern int data_valid = FALSE; static MenuHandle menu_file; static void do_init(void); static void do_request_exit(void); static void do_menu_select(void); static void do_about(void); static void do_finder_selection(void); static int menu_file_new(void); static int menu_file_open(void); static int menu_file_close(void); static int menu_file_save(void); static int menu_file_save_as(void); static int menu_file_revert(void); static int alert_yes_cancel_no(StringPtr s0,StringPtr s1,StringPtr s2,StringPtr s3); static int mocked_up_alert_yes_cancel_no(StringPtr s0,StringPtr s1,StringPtr s2,StringPtr s3); extern void file_interface_action(int action) { switch (action) { case GPA_ABOUT: do_about(); break; case GPA_INIT: do_init(); break; case GPA_REQUEST_EXIT: do_request_exit(); break; case GPA_MENU_SELECT: do_menu_select(); break; case GPA_FINDER: do_finder_selection(); break; } } static void do_about(void) { Point p; GetPen(&p); TextFont(times); TextSize(12); DrawString("\pfile interface"); TextFont(monaco); TextSize(9); DrawString("\p version 1.0"); MoveTo(p.h,p.v+14); } static void do_request_exit(void) { if (!menu_file_close()) GPA_action(GPA_CANCEL_EXIT); } static void do_init(void) { menu_file = GetMHandle(GPA_MENU_FILE); AppendMenu(menu_file,"\pNew"); AppendMenu(menu_file,"\pOpen..."); AppendMenu(menu_file,"\pClose"); AppendMenu(menu_file,"\p-"); AppendMenu(menu_file,"\pSave"); AppendMenu(menu_file,"\pSave As..."); AppendMenu(menu_file,"\pRevert"); data_sfr.fName[0] = 8; data_sfr.fName[1] = 'u'; data_sfr.fName[2] = 'n'; data_sfr.fName[3] = 't'; data_sfr.fName[4] = 'i'; data_sfr.fName[5] = 't'; data_sfr.fName[6] = 'l'; data_sfr.fName[7] = 'e'; data_sfr.fName[8] = 'd'; } static void do_menu_select(void) { Str255 name; int id = HiWord(GPA_menuSelect); int item = LoWord(GPA_menuSelect); if (GetMHandle(id) == menu_file) { GetItem(menu_file,item,name); if (0) ; else if (EqualString("\pNew",name,1,1)) menu_file_new(); else if (EqualString("\pOpen...",name,1,1)) menu_file_open(); else if (EqualString("\pClose",name,1,1)) menu_file_close(); else if (EqualString("\pSave",name,1,1)) menu_file_save(); else if (EqualString("\pSave As...",name,1,1)) menu_file_save_as(); else if (EqualString("\pRevert",name,1,1)) menu_file_revert(); } } extern void click_close_box(void) { menu_file_close(); } static int menu_file_close(void) { if (!data_valid) return TRUE; if (data_dirty) { switch (alert_yes_cancel_no("\pSave changes to '",data_sfr.fName,"\p' before closing?","\p")) { case cancel: return FALSE; case ok: if (!menu_file_save_as()) return FALSE; } } clear_file(); data_sfr.fName[0] = 8; data_sfr.fName[1] = 'u'; data_sfr.fName[2] = 'n'; data_sfr.fName[3] = 't'; data_sfr.fName[4] = 'i'; data_sfr.fName[5] = 't'; data_sfr.fName[6] = 'l'; data_sfr.fName[7] = 'e'; data_sfr.fName[8] = 'd'; data_dirty = FALSE; data_valid = FALSE; return TRUE; } static int menu_file_open(void) { SFReply temp_sfr; Point p = {90,90}; SFTypeList types = {'TEXT'}; if (!menu_file_close()) return FALSE; SFGetFile(p,"\p",0,1,types,0,&temp_sfr); if (!temp_sfr.good) return FALSE; data_sfr = temp_sfr; if (!read_file()) return FALSE; data_dirty = FALSE; data_valid = TRUE; return TRUE; } static int menu_file_new(void) { if (!menu_file_close()) return FALSE; clear_file(); data_dirty = FALSE; data_valid = TRUE; return TRUE; } static int menu_file_save(void) { if (!data_valid) return FALSE; if (!data_dirty) return FALSE; if (!data_sfr.good) return menu_file_save_as(); if (!write_file()) return FALSE; data_dirty = FALSE; return TRUE; } static int menu_file_save_as(void) { SFReply temp_sfr; Point p = {90,90}; if (!data_valid) return FALSE; temp_sfr = data_sfr; SFPutFile(p,"\pSave file:",data_sfr.fName,0,&temp_sfr); if (!temp_sfr.good) return FALSE; data_sfr = temp_sfr; if (!write_file()) return FALSE; data_dirty = FALSE; return TRUE; } static int menu_file_revert(void) { if (!data_valid) return FALSE; if (!menu_file_close()) return FALSE; if (!read_file()) return FALSE; data_dirty = FALSE; data_valid = TRUE; return TRUE; } static int alert_yes_cancel_no(StringPtr s0,StringPtr s1,StringPtr s2,StringPtr s3) { DialogPtr theDialog; short item; SetCursor(&arrow); theDialog = GetNewDialog(128,0,(WindowPtr)-1); if (!theDialog) { return mocked_up_alert_yes_cancel_no(s0,s1,s2,s3); } ParamText(s0,s1,s2,s3); ModalDialog(0,&item); DisposeDialog(theDialog); return item; } #define BTN 3 static int mocked_up_alert_yes_cancel_no(StringPtr s0,StringPtr s1,StringPtr s2,StringPtr s3) { WindowPtr w; int ret; Rect btn_r[BTN]; unsigned char *btn_s[BTN] = {"\p Yes","\p Cancel","\p No"}; Point p; SetCursor(&arrow); { Rect r; r.top = 90; r.bottom = r.top + 50; r.left = 90; r.right = r.left+450; w = NewCWindow(0,&r,"\p",1,dBoxProc,0,0,0); SelectWindow(w); SetPort(w); BackColor(yellowColor); EraseRect(&w->portRect); BackColor(whiteColor); TextFont(systemFont); TextSize(12); MoveTo(8,15); DrawString(s0); DrawString(s1); DrawString(s2); DrawString(s3); } btn_r[BTN-1].top = 25; btn_r[BTN-1].bottom = btn_r[BTN-1].top+22; btn_r[BTN-1].left = 5; btn_r[BTN-1].right = btn_r[BTN-1].left+90; for (ret = BTN-2; ret >= 0; ret--) { btn_r[ret] = btn_r[ret+1]; OffsetRect(&btn_r[ret],100,0); } for (ret = 0; ret < BTN; ret++) { EraseRoundRect(&btn_r[ret],10,10); FrameRoundRect(&btn_r[ret],10,10); MoveTo(btn_r[ret].left+5,btn_r[ret].bottom-7); DrawString(btn_s[ret]); } while (Button()) ; ret = 0; while (ret == 0) { int in = FALSE; while (Button()) { GetMouse(&p); for (ret = BTN; ret > 0; ret--) { if (PtInRect(p,&btn_r[ret-1])) break; } if (ret == 0) break; while (Button()) { GetMouse(&p); if (PtInRect(p,&btn_r[ret-1]) ^ in) { InvertRoundRect(&btn_r[ret-1],10,10); in^=TRUE; } } if (!in) ret = 0; } } DisposeWindow(w); FlushEvents(mDownMask|mUpMask,0); return ret; } static void do_finder_selection(void) { int n; short message; short count; AppFile theFile; CountAppFiles(&message,&count); if (message == appOpen) { for (n = 1; n <= count; n++) { GetAppFiles(n,&theFile); memcpy(data_sfr.fName,theFile.fName,theFile.fName[0]+1); data_sfr.vRefNum = theFile.vRefNum; data_sfr.fType = theFile.fType; data_sfr.version = theFile.versNum; data_sfr.good = TRUE; ClrAppFiles(n); if (read_file()) { data_dirty = FALSE; data_valid = TRUE; } } } if (message == appPrint) { SysBeep(1); } }