This is Controller.m in view mode; [Download] [Up]
#import "Controller.h" #import "ARTDoc.h" #import "Pattern.h" #import "ART_Animator.h" #include <stdio.h> #import <appkit/Application.h> #import <appkit/OpenPanel.h> #import <appkit/appkit.h> #import <appkit/Button.h> #import <appkit/Panel.h> #import <appkit/publicWraps.h> /* for NXBeep() */ #import <sys/param.h> /* for MAXPATHLEN */ #import <string.h> #import <objc/NXStringTable.h> static Window *findDocWindow(const char *name); static char pathname[1024]; BOOL rand_mode; BOOL getOpenPath(char *buf, char const *theType) { static id openPanel = nil; char const *fileTypes[2] = {0,0}; int opr; char *p; if (!openPanel) openPanel = [OpenPanel new]; if (theType && *theType) fileTypes[0] = theType; [NXApp setAutoupdate:NO]; if (p = rindex(buf,'/')) *p='\0'; if (*buf) opr = [openPanel runModalForDirectory:buf file:NULL types:fileTypes]; else //strcpy(buf,NXHomeDirectory()); opr = [openPanel runModalForDirectory:buf file:NULL types:fileTypes]; if (opr) { strcpy(buf,[openPanel filename]); [NXApp setAutoupdate:YES]; return YES; } else { [NXApp setAutoupdate:YES]; return NO; } } static BOOL getSavePath(char *buf, char const *defaultPath, View *accessory) { static id savePanel = nil; BOOL ok; char dirName[1024], fileName[256]; if (!savePanel) { const char *const types[2] = {"art", NULL}; savePanel = [SavePanel new]; [savePanel setRequiredFileType:types[0]]; } // [savePanel setAccessoryView:accessory]; [NXApp setAutoupdate:NO]; if (defaultPath && *defaultPath) { char *p; strcpy(dirName,defaultPath); if (p = rindex(dirName,'/')) { strcpy(fileName, p+1); *p = '\0'; } else { strcpy(fileName,defaultPath); fileName[0] = '\0'; } ok = [savePanel runModalForDirectory:dirName file:fileName]; } else ok = [savePanel runModal]; [NXApp setAutoupdate:YES]; if (ok) { strcpy(buf,[savePanel filename]); return YES; } else return NO; } @implementation Controller - init { [super init]; [controlPanel removeFromEventMask:(NX_KEYDOWNMASK|NX_KEYUPMASK)]; [controlPanel setFloatingPanel:YES]; Pat=[[Pattern new] init]; rand_mode=YES; [NXApp loadNibSection:"ARTAnimator.nib" owner:self]; [Animator initdisplay]; return self; } - appDidInit:sender { [PatFileName setStringValue:STRTAB("no patternfile loaded")]; [DimQuan setStringValue: " "]; [self lookCTRL]; return self; } - info:sender { if (!infoPanel) [NXApp loadNibSection:"InfoPanel.nib" owner:self]; [infoPanel makeKeyAndOrderFront:NULL]; return self; } - newARTDoc:sender { if ([Pat fileName]) { static char filenamebuf[MAXPATHLEN+1]; [self stopAll]; strcpy(filenamebuf, [[OpenPanel new] directory]); strcat(filenamebuf,STRTAB("/UNTITLED")); [self setDocument:[[ARTDoc alloc] init]]; [currentDocument setFileName:filenamebuf]; } else NXRunAlertPanel(STRTAB("no Pat open"), STRTAB("Open Pat first"), STRTAB("bad new OK"), NULL, NULL); return self; } - openFile:(char *)fileName { id newDocument; newDocument = [[ARTDoc alloc] initFromFile:fileName]; [newDocument setFileName:fileName]; [self setDocument:newDocument]; return self; } - open:sender { if ([Pat fileName]) { if (getOpenPath(pathname,"art")) { [self stopAll]; [self openFile:pathname]; } } else NXRunAlertPanel(STRTAB("Open Doc no Pat"), STRTAB("first open Pat"), STRTAB("bad open OK"), NULL, NULL); return self; } - saveAs:sender { char pathname[1024]; id doc = currentDocument; if (doc && getSavePath(pathname,[doc fileName],nil)) { [doc setFileName:pathname]; [doc save:sender]; } return self; } - save:sender { [self stopAll]; if (currentDocument) { if ([currentDocument fileName] && strcmp(strrchr([currentDocument fileName],'/'), STRTAB("/UNTITLED") ) ) [currentDocument save:sender]; else [self saveAs:sender]; } return self; } - saveAll:sender { id winList; int i; int count=0; [self stopAll]; winList=[NXApp windowList]; i=[winList count]; while (i--) { id win=[winList objectAt:i]; id delegate=[win delegate]; if (delegate && [delegate isKindOf:[ARTDoc class]]) { [win makeKeyAndOrderFront:nil]; [delegate save:win]; } } return self; } - saveLTMdat:sender { [self stopAll]; if (currentDocument) { if ([currentDocument fileName] && strcmp(strrchr([currentDocument fileName],'/'), STRTAB("/UNTITLED") ) ) [currentDocument creatLTMdat:sender]; } return self; } - openPatFile:(char *)fileName { char buf[256]; int dim=0; int quan=0; char *p; id winList; int i; [Pat setFileName:fileName]; strcpy(buf,fileName); if (p = rindex(buf,'/')) { strcpy(buf, p+1); *p = '\0'; } else buf[0]='\0'; if (![Pat load:self]) { buf[0]='\0'; [Pat setFileName:buf]; return self; } quan=[Pat Quantity], dim=[Pat Dimension]; [PatFileName setStringValue: buf]; sprintf(buf,STRTAB("%d patterns of %d"),quan,dim); [DimQuan setStringValue: buf]; // perform every ARTDoc to rezize it's SearchArray winList=[NXApp windowList]; i=[winList count]; while (i--) { id win=[winList objectAt:i]; id delegate=[win delegate]; if (delegate && [delegate isKindOf:[ARTDoc class]]) [delegate setSearchArray]; } return self; } - openPat:sender { if (getOpenPath(pathname,"pattern")) { [self stopAll]; [self openPatFile:pathname]; // switch to a corresponding document or open a new one if ( ![currentDocument matchWithPat] ) { currentDocument=[self nextMatchDoc]; // if there is no other matching doc open new one if (!currentDocument) [self newARTDoc:nil]; } } return self; } - setDocument:aDocument { currentDocument = aDocument; return self; } - MisMatchAlert { NXRunAlertPanel( STRTAB("ART Alert"), STRTAB("ART modul doesn't match"), STRTAB("OK"), NULL, NULL); return self; } - nextMatchDoc { id winList; int i; winList=[NXApp windowList]; // looking in the application windowlist for a matching one // or return nil for no match i=[winList count]; while (i--) { id win=[winList objectAt:i]; id delegate=[win delegate]; if (delegate && [delegate isKindOf:[ARTDoc class]]) if ([delegate matchWithPat]) { // make it main and return [win makeKeyAndOrderFront:nil]; return delegate; } } return nil; } - (int)countEditedWindows { id winList; int i; int count=0; winList=[NXApp windowList]; i=[winList count]; while (i--) { if ([[winList objectAt:i] isDocEdited]) count++; } return count; } - document { return currentDocument; } - (BOOL)Rand_sel { return ( 0==[[selectMtx selectedCell] tag] ) ? YES:NO; } - (BOOL)Pat_step { return ( 0==[[stepMtx selectedCell] tag] ) ? YES:NO; } - setStopState { [stopButton setState:0]; return self; } - setGoState { [stopButton setState:1]; return self; } -stopAll { id winList; int i; winList=[NXApp windowList]; i=[winList count]; while (i--) { id win=[winList objectAt:i]; id delegate=[win delegate]; if (delegate && [delegate isKindOf:[ARTDoc class]]) [delegate set_stop]; } [self setStopState]; return self; } - stop_go:sender { if (currentDocument) if ([currentDocument matchWithPat]) if ([stopButton state]) { [animatorPanel orderFront:nil]; [currentDocument set_go]; } else [currentDocument set_stop]; else NXBeep(); return self; } - lookCTRL { [stepButton setEnabled:NO]; [stopButton setEnabled:NO]; return self; } - unlookCTRL { [stepButton setEnabled:YES]; [stopButton setEnabled:YES]; return self; } - step:sender { if (currentDocument) if ([currentDocument matchWithPat]) if ([self Pat_step]) { [stepButton setEnabled:NO]; [currentDocument stepPattern]; [stepButton setEnabled:YES]; } else [currentDocument step:self]; else NXBeep(); return self; } - checkDocument { char buf[256]; char *p; if (currentDocument) if ([currentDocument fileName]) { strcpy(buf,[currentDocument fileName]); if (p = rindex(buf,'/')) { strcpy(buf, p+1); *p = '\0'; } else buf[0]='\0'; if ([currentDocument matchWithPat]) strcat(buf," match"); else strcat(buf," not match"); } else sprintf(buf,"no name"); else sprintf(buf,"no document"); [PatFileName setStringValue: buf]; return self; } - appDidUpdate:sender { // [self checkDocument]; if ([[NXApp windowList] count]==0) [self lookCTRL]; return self; } - appDidHide:sender { return self; } - appDidBecomeActive:sender { id win; [animatorPanel orderFront:nil]; [controlPanel orderFront:nil]; if (currentDocument) if (win = findDocWindow([currentDocument fileName])) [win makeKeyAndOrderFront:self]; // [win orderFront:self]; return self; } - appDidResignActive:sender { return self; } - appWillTerminate:sender { if ([self countEditedWindows]>0) { int q=NXRunAlertPanel( STRTAB("ART Quit"), STRTAB("ART Quit message"), STRTAB("review unsaved"), STRTAB("quit anyway"), STRTAB("Cancel")); if (q==1) { int i=0; id winList; winList=[NXApp windowList]; i=[winList count]; while (i--) { id win=[winList objectAt:i]; if ([[win delegate] isKindOf:[ARTDoc class]]) [win performClose:nil]; } return self; } if (q==-1) return nil; } return self; } - Animator_id { return Animator; } - Pattern_id { return Pat; } - stringTable { return stringTable; } - (int)appOpenFile:(const char *)path type:(const char *)type { BOOL success = NO; Window *win; strcpy(pathname,path); if (type) { // pattern file if (!strcmp(type, "pattern")) { [self openPatFile:pathname]; success = YES; } // ARTDoc file else { if (!strcmp(type, "art")) { // does the file exist already if (win = findDocWindow(path)) { [win makeKeyAndOrderFront:self]; success = YES; } // on ergo open form file else { if ([self openFile:pathname]) success = YES ; } } } } if (!success) { NXRunAlertPanel( STRTAB("open alert title"), STRTAB("open alert message"), STRTAB("OK"), NULL,NULL,path); } return success; } /* This says we can accept any number of appOpenFile:type: messages. */ - (BOOL)appAcceptsAnotherFile:sender { return YES; } static Window *findDocWindow(const char *name) { int count; id document; Window *window; List *windowList; const char *realPath; const char *otherRealPath; char realPathBuf[MAXPATHLEN+1]; windowList = [NXApp windowList]; count = [windowList count]-1; realPath=name; // realPath = realpath(name, realPathBuf) ? realPathBuf : name; while (count--) { window = [windowList objectAt:count]; document = [window delegate]; if (document && ([document isKindOf:[ARTDoc class]]) ) { otherRealPath = [document fileName]; if (otherRealPath && !strcmp(otherRealPath, realPath)) return window; } } return nil; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.