// twist.c // // This source is the main() file for Twistory. // // by John D. de Boer #include "twist.h" #include "twindow.h" extern bool RecordingPicture; extern StepGlobs Step; extern int LINEWINDS,MAPWINDS,INFOWINDS,GENWINDS,THISWINDS; extern window *AboutWind,*WarnWind,*FindWind, *LineWind[],*MapWind[],*InfoWind[],*GenWind[],*ThisWind[]; GlobalOpts Opt; // user preferences void *Sel, // the user selection *Was; // what the selection was before the last mousedown in a window content MenuRef FileMenu, // the File menu, which can be displayed by the Wait window PPopupMenu, // contextual menu for people EPopupMenu; // contextual menu for events IBNibRef Nib; // the Interface Builder nib file static TTTTask Task; // the (currently modal but future threaded) file-reading task // Utility int StackableWindows(void) { return LINEWINDS + MAPWINDS + GENWINDS + THISWINDS + INFOWINDS; } int AnimatedWindows(void) { return LINEWINDS + MAPWINDS; } static void OpenTTTDoc(FSRef *FSR) { if (!openfile(FSR,/*'TEXT',*/&(Task.file))) return; CloseAllGens(); PurgeGenCalcs(); InitTTTTask(&Task); } static void OpenTTTDialog(void) { if (!openexistingfile('TEXT',&(Task.file))) return; CloseAllGens(); PurgeGenCalcs(); RedisplayAll(); InitTTTTask(&Task); } static void OpenDeltaDialog(void) { file F; if (!CanDoDelta()) { error("A database must be loaded before another can be assessed."); return; } if (!openexistingfile('TEXT',&F)) return; DoDeltaTask(&F); } static void OnQuit(void) { SaveWhichInArray(); RecordMapPrefs(); WritePreferences(); quit(); } bool Highlight(window *W, void *V) { if (!W) return 0; return V && V==Sel && !W->printing && !RecordingPicture; } static void TileWindows(bool Horz) { int i; for (i=0;iprint); allowitem(W,'FiFu',W!=NULL && W->pdfsize); allowitem(W,'svas',W!=NULL); allowitem(W,'WiHo',LINEWINDS || MAPWINDS); allowitem(W,'WiVe',LINEWINDS || MAPWINDS); adjustwindowmenu(WindMenu,3); } bool FileCommand(window *W, UInt32 C) { window *WSel; switch (C) { case 'abou': revealwindow(AboutWind); return 1; case 'FiTi': if (LINEWINDS>0) revealwindow(LineWind[0]); else AddLineWindow(); return 1; case 'FiMa': AddMapWindow(); return 1; case 'FiIn': SwitchToInfo(); return 1; case 'FiGe': SwitchToGen(); return 1; case 'FiDa': AddThisWindow(); return 1; case 'FiFi': BringFindToFront(); return 1; case 'clos': closewindow(W); return 1; case 'open': OpenTTTDialog(); return 1; case 'FiSt': revealwindow(WarnWind); return 1; case 'FiPu': SaveWhichInArray(); CloseAllImages(); CloseAllInfo(); CloseAllGens(); CloseAllThis(); PurgeFindInfo(); Sel=NULL; Purge(); RedisplayAll(); return 1; case 'FiDe': OpenDeltaDialog(); return 1; case 'page': pagesetup(W); return 1; case 'prnt': printwindow(W); return 1; case 'FiFu': savepdf(W,"Untitled.pdf",1); return 1; case 'svas': savepdf(W,"Untitled.pdf",0); return 1; case 'WiHo': TileWindows(1); return 1; case 'WiVe': TileWindows(0); return 1; } WSel=windowchoice(C); if (WSel) { revealwindow(WSel); return 1; } if (SizeCommand(W,C)) return 1; if (SortCommand(W,C)) return 1; if (FilterCommand(W,C)) return 1; return 0; } // The menus in general static void MenusInit(void) { InitFileMenu(); } // Contextual Menus bool PersonPopup(window *W, point Pt, bool Time, bool Map, bool Info, bool Gen, Person *P) { long ITEM; Point Q; if (!W || !P) return 0; Q.h=Pt.x; Q.v= height(W->page) - Pt.y; itemenable(PPopupMenu,1,Time); itemenable(PPopupMenu,2,Map); itemenable(PPopupMenu,3,Info); itemenable(PPopupMenu,4,Gen); localtoglobal(W->wmw,&Q); Q.v-=10; ITEM=PopUpMenuSelect(PPopupMenu,Q.v,Q.h,1); switch (ITEM & 0xFFF) { case 1: SwitchToTimeLine(); return 1; case 2: SwitchToMap(); return 1; case 3: SwitchToInfo(); return 1; case 4: SwitchToGen(); return 1; } return 0; } bool EventPopup(window *W, point Pt, bool Time, bool Map, bool Info, Event *E) { Person *Assoc; long ITEM; Point Q; if (!W || !E) return 0; Assoc=E->pers; Q.h=Pt.x; Q.v= height(W->page) - Pt.y; itemenable(EPopupMenu,1,Time); itemenable(EPopupMenu,2,Map); itemenable(EPopupMenu,3,Info); itemenable(EPopupMenu,4,Assoc!=NULL); localtoglobal(W->wmw,&Q); Q.v-=10; ITEM=PopUpMenuSelect(EPopupMenu,Q.v,Q.h,1); switch (ITEM & 0xFFF) { case 1: SwitchToTimeLine(); return 1; case 2: SwitchToMap(); return 1; case 3: SwitchToInfo(); return 1; case 4: Sel=Assoc; SwitchToInfo(); return 1; } return 0; } // The GUI static void InitTwistory(void) { InitTime(); InitPlaces(); InitOccs(); InitPeople(); InitTypes(); InitEvents(); InitWhich(0,0/*PEOPLEMENU,EVENTMENU*/); InitSpheres(); InitGlobe(); InitTwIcon(); InitWarnings(); InitTTT(); } static void InitGlobalOptions(void) { Opt.coord=0; Opt.unc=1; Opt.onmap=0; Opt.thin=0; Opt.ticon=0; Opt.flag=0; Opt.dyn=0; Opt.ticks=0; Opt.always=0; Opt.alt=0; Opt.term=0; Opt.region=0; Opt.gpvoy=0; Opt.fill=1; Opt.focus=0; Opt.size=10; Opt.age=0; Opt.fullnam=0; Opt.elide=1; Opt.pink=1; Opt.round=0; Opt.italic=0; Opt.trip=2; Opt.group=4; } static void InitGUI(void) { InitGlobalOptions(); InitAboutWindow(); initprint(); InitLineViews(); InitMapViews(); InitSizeMenu(); InitSortMenu(); InitGenViews(); InitThisViews(); InitInfoViews(); InitImageViews(); InitFindWindow(); MenusInit(); installmenus(NULL,NULL,&SetUpFileMenu,&AdjustFileMenu,&FileCommand); InitRedraw(); } static long LAST; // time of last TimeSteps() call static void TwistIdle(void) { window *W; long NOW; if (!Task.done) { DoTTTTask(&Task); return; } if (!Task.finished) { DoTTTTask(&Task); if (Task.finished) { if (LINEWINDS==0) AddLineWindow(); if (MAPWINDS==0) AddMapWindow(); RedisplayAll(); } return; } W=frontmost(); // if (app in background) return?; NOW=TickCount(); if (Step.running && NOW > LAST + 60) { LAST=NOW; TimeSteps(Step.running); if (Opt.focus) MaintainFocus(); Redisplay(); if (!Step.running && W && IsMapWindow(W)) AdjustMapControlState(W,0); return; } //if (IsInfoWindow(W)) InfoIdle(W); } int main(void) { OSStatus err; initmacintosh(); initreferenceframe("Twistory"); installcore(&OpenTTTDialog,&OnQuit,&OpenTTTDoc,NULL); inittd(); err=CreateNibReference(CFSTR("twistory"),&Nib); InitTwistory(); InitGUI(); DisposeNibReference(Nib); postwindowmenus(NULL); ReadPreferences(); Sel=NULL; Was=NULL; Task.done=1; Task.finished=1; //testcalend(); LAST=TickCount(); installidle(&TwistIdle); RunApplicationEventLoop(); return 0; }