#import #import "Controller.h" #import "gnuviewController.h" #import "GnuView.h" @implementation Controller - (id) activeTerm { return activeTerm; } - appDidInit:sender { id prInfo; NXRect *paperRect; static NXDefaultsVector GnuTermDefaults = { {"Width", "400"}, {"Height", "300"}, {"Backing", "Buffered"}, {NULL} }; activeTerm = keyTerm = nil; myConnection = [NXConnection registerRoot:self withName:"gnuplotServer"]; [myConnection runFromAppKit]; prInfo = [NXApp printInfo]; paperRect = (NXRect *) [prInfo paperRect]; [prInfo setOrientation:NX_LANDSCAPE andAdjust:YES]; [prInfo setHorizCentered:YES]; [prInfo setVertCentered:YES]; /* Get user Preferences */ NXRegisterDefaults("GnuTerm", GnuTermDefaults); [DefaultSize setStringValue:NXGetDefaultValue("GnuTerm","Width") at:0]; [DefaultSize setStringValue:NXGetDefaultValue("GnuTerm","Height") at:1]; if (!strcmp(NXGetDefaultValue("GnuTerm","Backing"), "Buffered")) { backing = NX_BUFFERED; [useBufferedSwitch setState:YES]; } else { backing = NX_RETAINED; [useBufferedSwitch setState:NO]; } gvList = [[List new] initCount:10]; return self; } - newGnuTerm:sender { NXRect frame; if ([gvList indexOf:keyTerm] != NX_NOT_IN_LIST) { [[keyTerm window] getFrame: &frame]; NX_X(&frame) += 24; NX_Y(&frame) -= 24; } else { NX_WIDTH(&frame) = atof(NXGetDefaultValue("GnuTerm","Width")); NX_HEIGHT(&frame) = atof(NXGetDefaultValue("GnuTerm","Height")); NX_X(&frame) = 200; NX_Y(&frame) = 350; } if ([NXApp loadNibSection: "gnuview.nib" owner: self] == nil) { return nil; } // fprintf(stderr,"newGnuTerm: %g x %g\n",NX_WIDTH(&frame),NX_HEIGHT(&frame)); [[activeTerm window] setBackingType:backing]; [[activeTerm window] placeWindowAndDisplay: &frame]; [self setKeyTerm:activeTerm]; [gvList addObject:activeTerm]; ++wcnt; return activeTerm; } - setActiveTerm:(id) newTerm { if (activeTerm != nil) [activeTerm deactivate:self]; activeTerm = newTerm; [activeTerm GVactivate:self]; return self; } - printPScodeInKey:sender { [[keyTerm gnuView] printPSCode:sender]; return self; } - setKeyTerm:newTerm { keyTerm = newTerm; [NameField setStringValue:[[keyTerm window] title]]; [NameField selectText:self]; return self; } - setKeyTitle:sender { [[keyTerm window] setTitle:[NameField stringValue]]; [[NameField window] performClose:self]; return self; } - executePScode:(char *)PSstring termTitle:(char *)title { int i, cnt; id test; char buf[50]; //fprintf(stderr, "Request for window: %s\n", title); if (*title) { /* If the window exists, use it */ cnt = [gvList count]; for (i=0; i < cnt; ++i) { test = [gvList objectAt:i]; if ( !strcmp([[test window] title], title)) { if (test != activeTerm) [self setActiveTerm:test]; break; } } /* O.K., it doesn't exist, what now? */ if (i == cnt) { [self newGnuTerm:self]; [[activeTerm window] setTitle: title]; } } else { if (activeTerm == nil) { [self newGnuTerm:self]; sprintf(buf, "gnuplot %d", wcnt); [[activeTerm window] setTitle: buf]; } } [[activeTerm window] makeKeyAndOrderFront: nil]; [[activeTerm gnuView] executePS:PSstring]; return activeTerm; } - termWillClose:sender { [gvList removeObject:sender]; if (activeTerm == sender) activeTerm =nil; return self; } - setDefaultGTSize:sender { NXRect frame; if (sender == useKeyButton) { fprintf(stderr, "useKey\n"); if ([gvList indexOf:keyTerm] != NX_NOT_IN_LIST) { [[keyTerm window] getFrame: &frame]; [DefaultSize setFloatValue:NX_WIDTH(&frame) at:0]; [DefaultSize setFloatValue:NX_HEIGHT(&frame) at:1]; } } NXWriteDefault("GnuTerm", "Width", [DefaultSize stringValueAt:0]); NXWriteDefault("GnuTerm", "Height", [DefaultSize stringValueAt:1]); fprintf(stderr, "setDefaultGTSize: %s x %s\n", [DefaultSize stringValueAt:0],[DefaultSize stringValueAt:1]); return self; } - setUseBuffered:sender { if ([sender state] == YES) { backing = NX_BUFFERED; NXWriteDefault("GnuTerm", "Backing", "Buffered"); } else { backing = NX_RETAINED; NXWriteDefault("GnuTerm", "Backing", "Retained"); } [[activeTerm window] setBackingType:backing]; return self; } - closeAll:sender { while([gvList count]) [[[gvList objectAt:0] window] performClose:self]; return self; } - miniaturizeAll:sender { int i, cnt; cnt = [gvList count]; for (i=0; i < cnt; ++i) [[[gvList objectAt:i] window] performMiniaturize:self]; return self; } @end