[BACK]Return to MyDocument.m CVS log [TXT][DIR] Up to [local] / OpenXM / src / cfep

Annotation of OpenXM/src/cfep/MyDocument.m, Revision 1.1

1.1     ! takayama    1: //
        !             2: //  MyDocument.m
        !             3: //  cfep
        !             4: //
        !             5: //  Created by Nobuki Takayama
        !             6: //  Copyright (c) 2006 OpenXM.org
        !             7: //
        !             8:
        !             9: // [self setDefaultPeer BASH] or [self setDefaultPeer OX_TEXMACS]
        !            10:
        !            11: #include <signal.h>
        !            12: #import "MyDocument.h"
        !            13: #import "MyOutputWindowController.h"
        !            14: #import "MyOpenGLController.h"
        !            15:
        !            16: int myDebug=0;
        !            17: static int myDocumentSaidTheMessageAboutX = 0;
        !            18:
        !            19:
        !            20: @implementation MyDocument
        !            21:
        !            22: - (void)dealloc {
        !            23:     MyOutputWindowController *mowc;
        !            24:     if (myDebug) NSLog(@"dealloc of MyDocument.\n");
        !            25:        if (myDebug) NSLog(@"retainCount of task=%d\n",[task retainCount]); // why is it 2?
        !            26:        [self closeMyModel];
        !            27:        // [task dealloc];  //BUG. if we do this, error happens.
        !            28:        mowc = [MyOutputWindowController sharedMyOutputWindowController: self];
        !            29:        if (mowc != nil) [mowc closeMyOutputWindow: self];
        !            30:        if (errorLines) { [errorLines autorelease]; errorLines = nil; }
        !            31:
        !            32:        [myDecoder dealloc];
        !            33:
        !            34:        [dataFromFile release];
        !            35:        [rtfDataFromFile release];
        !            36:        [textDataFromFile release];
        !            37:        if (myDebug) NSLog(@"Done: dealloc of MyDocument.\n");
        !            38:     [super dealloc];
        !            39: }
        !            40:
        !            41: // The name of the nib file to load for this document.
        !            42: - (NSString *)windowNibName
        !            43: {
        !            44:     return @"MyDocument";
        !            45: }
        !            46:
        !            47: // Loads up the data when the nib file is loaded.
        !            48: - (void)windowControllerDidLoadNib:(NSWindowController *)aController {
        !            49:     [super windowControllerDidLoadNib:aController];
        !            50:
        !            51:     if (dataFromFile) {
        !            52:         [self loadtextViewWithData:dataFromFile];
        !            53:         [dataFromFile release];
        !            54:         dataFromFile = nil;
        !            55:     } else if (rtfDataFromFile) {
        !            56:            [self loadtextViewWithRTFData: rtfDataFromFile];
        !            57:                [rtfDataFromFile release];
        !            58:                rtfDataFromFile = nil;
        !            59:        } else if (textDataFromFile) {
        !            60:            [self loadtextViewWithTextData: textDataFromFile];
        !            61:                [textDataFromFile release];
        !            62:                textDataFromFile = nil;
        !            63:        }
        !            64:     [self addMenuExec]; // adding the execution menu.
        !            65:     [textViewIn setAllowsUndo:YES];
        !            66:        [self sayTheMessageAboutX];
        !            67:        [self initAux];
        !            68: }
        !            69:
        !            70: // Load the view with data given an NSData.
        !            71: - (void)loadtextViewWithData:(NSData *)data {
        !            72:     [textViewIn replaceCharactersInRange:NSMakeRange(0, [[textViewIn string] length]) withRTFD:data];
        !            73: }
        !            74: - (void)loadtextViewWithRTFData:(NSData *)data {
        !            75:     [textViewIn replaceCharactersInRange:NSMakeRange(0, [[textViewIn string] length]) withRTF:data];
        !            76: }
        !            77: -(void) loadtextViewWithTextData:(NSData *)data {
        !            78:       [textViewIn replaceCharactersInRange: NSMakeRange(0,[[textViewIn string] length])
        !            79:           withString:[NSString stringWithCString: [data bytes]  encoding:NSUTF8StringEncoding]];
        !            80: }
        !            81:
        !            82: // Return an NSData representation of our document's view.
        !            83: - (NSData *)dataRepresentationOfType:(NSString *)aType {
        !            84:    if ([@"RTFWithGraphics" compare: aType] == NSOrderedSame) {
        !            85:      return [textViewIn RTFDFromRange:NSMakeRange(0, [[textViewIn string] length])];
        !            86:    }else if ([@"RTF" compare: aType] == NSOrderedSame) {
        !            87:      return [textViewIn RTFFromRange:NSMakeRange(0, [[textViewIn string] length])];
        !            88:    }else {
        !            89:      return [[textViewIn string] dataUsingEncoding: NSUTF8StringEncoding];
        !            90:    }
        !            91: }
        !            92:
        !            93: // If we're loading from a file just retain the data and it will be
        !            94: //  loaded when windowControllerDidLoadNib is invoked. If not, go
        !            95: //  ahead and load the view with the data.
        !            96: // These paths are separate in order to support Revert where the
        !            97: //  data is reloaded but the nib is not.
        !            98: - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType {
        !            99:    if ([@"RTFWithGraphics" compare: aType] == NSOrderedSame) {
        !           100:     if (textViewIn)
        !           101:         [self loadtextViewWithData:data];
        !           102:     else
        !           103:         dataFromFile = [data retain];
        !           104:    }else if ([@"RTF" compare: aType] == NSOrderedSame) {
        !           105:     if (textViewIn)
        !           106:         [self loadtextViewWithRTFData:data];
        !           107:     else
        !           108:         rtfDataFromFile = [data retain];
        !           109:    }else{
        !           110:      if (textViewIn)
        !           111:            [self loadtextViewWithTextData: data];
        !           112:      else
        !           113:            textDataFromFile = [data retain];
        !           114:    }
        !           115:
        !           116:     return YES;
        !           117: }
        !           118:
        !           119: // =======================================================================
        !           120:
        !           121: -(void) initAux {
        !           122:     static int serial;
        !           123:     MyEnvironment *myEnvironment;
        !           124:        myDocumentKey = [@"myDocumentNo" stringByAppendingString: [NSString stringWithFormat: @"%d",(++serial)]];
        !           125:        [myDocumentKey retain];
        !           126:
        !           127:        onlySelectedArea = 0;
        !           128:        notebookMode = 0;  // or = 1; // experimental.
        !           129:        oxEngine = 0; // experimental. For select engine menu.
        !           130:        errorLines = [NSMutableArray arrayWithCapacity: 10]; [errorLines retain];
        !           131:        debugMyTunnel = 0;
        !           132:        task = nil;
        !           133:        myEnvironment = [[MyEnvironment alloc] init]; [myEnvironment retain];
        !           134:
        !           135:        myDefaultTypingAttributes = [myEnvironment getMyDefaultTypingAttributes];
        !           136:        [myDefaultTypingAttributes retain];
        !           137:        [textViewIn setTypingAttributes: myDefaultTypingAttributes];
        !           138:
        !           139:        myDecoder = [[MyDecoder alloc] init]; [myDecoder retain];
        !           140:
        !           141:        [self openMyModel: myEnvironment ];
        !           142: }
        !           143: -(int) getMyDocumentKey { return myDocumentKey; }
        !           144:
        !           145: -(id) openMyModel: (MyEnvironment *) myEnvironment {
        !           146:     [myEnvironment showForDebug]; // for debug.
        !           147:     OpenXM_HOME= [myEnvironment getOpenXM_HOME];
        !           148:        [OpenXM_HOME retain]; // without these SIGSEGV
        !           149:        inputCounter = outputCounter = 0;
        !           150:        redirectPrint = 0;
        !           151:        peer = [myEnvironment getPeer];
        !           152:        peerStartupString = [myEnvironment getPeerStartupString];
        !           153:        [peerStartupString retain];
        !           154:        peerEndEvaluteMark = [myEnvironment getPeerEndEvaluateMark];
        !           155:        [peerEndEvaluteMark retain];
        !           156:
        !           157:        [self stopIndicator];
        !           158:        // Initialization to call /bin/bash
        !           159:     outboundPipe = [NSPipe pipe];  // since autorelease is called in pipe.
        !           160:        inboundPipe   = [NSPipe pipe];
        !           161:        errPipe      = [NSPipe pipe];
        !           162:        [outboundPipe retain]; [inboundPipe retain]; [errPipe retain];
        !           163:        outboundFileHandle = [outboundPipe fileHandleForWriting];
        !           164:        inboundFileHandle  = [inboundPipe  fileHandleForReading];
        !           165:        errFileHandle     = [errPipe      fileHandleForReading];
        !           166:
        !           167:        NSLog(@"Starting /bin/bash\n");
        !           168:        task = [[NSTask alloc] init];
        !           169:     [task setStandardInput: outboundPipe];
        !           170:        [task setStandardOutput: inboundPipe];
        !           171:        [task setStandardError:  errPipe];
        !           172:        [task setEnvironment: [myEnvironment getMyUnixEnvironment]];
        !           173:        //[task setArguments: [NSArray arrayWithObject: @"http://www.google.com"]];
        !           174:        //[task setLaunchPath: @"/usr/bin/open"];
        !           175:        //[task setLaunchPath: @"/Users/NobukiTakayama/OX4/OpenXM/bin/asir"];
        !           176:        //[task setLaunchPath: @"/bin/date"];
        !           177:        [task setLaunchPath: @"/bin/bash"];
        !           178:     // launch will be done after nib is loaded.
        !           179:     @try {  // version >= 10.3,  add option in info
        !           180:        [task launch];
        !           181:     } @catch (NSException *exception) {
        !           182:        NSLog(@"init task launch Caught %@: %@", [exception name], [exception reason]);
        !           183:     } @finally {
        !           184:        NSLog(@"/bin/bash is started.\n");
        !           185:           // fprintf(stderr,"pid = %d\n",[task processIdentifier]);
        !           186:           signal(SIGPIPE,SIG_IGN); //BUG. non-cocoa way.
        !           187:           [self oxEvaluateString: peerStartupString withMark: FALSE];
        !           188:     }
        !           189:
        !           190:        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(readInboundData:)
        !           191:       name:NSFileHandleDataAvailableNotification object: inboundFileHandle];
        !           192:     [inboundFileHandle waitForDataInBackgroundAndNotify];
        !           193:        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(readErrData:)
        !           194:       name:NSFileHandleDataAvailableNotification object: errFileHandle];
        !           195:     [errFileHandle waitForDataInBackgroundAndNotify];
        !           196:
        !           197:        return self;
        !           198: }
        !           199:
        !           200: - (void) closeMyModel {
        !           201:   [self stopIndicator];
        !           202:   if (task == nil) {
        !           203:     NSLog(@"closeMyModel. Task is not running.\n"); return ;
        !           204:   }
        !           205:   [[NSNotificationCenter defaultCenter] removeObserver:self
        !           206:       name:NSFileHandleDataAvailableNotification object: inboundFileHandle];
        !           207:   [[NSNotificationCenter defaultCenter] removeObserver:self
        !           208:       name:NSFileHandleDataAvailableNotification object: errFileHandle];
        !           209:
        !           210:   [inboundFileHandle closeFile];
        !           211:   [outboundFileHandle closeFile];
        !           212:   [errFileHandle closeFile];
        !           213:   [task terminate];
        !           214:   task = nil; //BUG. memory leak?
        !           215:   NSLog(@"Terminated the child process.\n");
        !           216: }
        !           217:
        !           218: -(id) restartMyModel: (enum peer_type)  peerType {
        !           219:     MyEnvironment *myEnvironment;
        !           220:     [self closeMyModel];
        !           221:        myEnvironment = [[MyEnvironment alloc] initFor: peerType];  //BUG. leak memory?
        !           222:        [myEnvironment retain];
        !           223:     [myEnvironment showForDebug]; // for debug.
        !           224:        [self openMyModel: myEnvironment ];
        !           225:     return self;
        !           226: }
        !           227:
        !           228: // messenges
        !           229: -(void) sayTheMessageAboutX {
        !           230:   NSLog(@"myDocumentSaidTheMessageAboutX=%d\n",myDocumentSaidTheMessageAboutX);
        !           231:   if (!myDocumentSaidTheMessageAboutX) {
        !           232:     if ([MyEnvironment checkX] != 1)
        !           233:           [self messageDialog:
        !           234:             NSLocalizedString(@"A few commands (plot, ...) cannot be used, because X11 is not running.",nil) with: 0];
        !           235:        myDocumentSaidTheMessageAboutX = 1;
        !           236:   }
        !           237: }
        !           238:
        !           239: - (IBAction) oxEvaluate:(id) sender {
        !           240:   NSString* cmd0;
        !           241:   NSMutableString *cmd;
        !           242:   NSRange r;
        !           243:
        !           244:   if (inEvaluation) {
        !           245:         NSLog(@"In evaluatioin. ");
        !           246:      [self messageDialog: NSLocalizedString(@"Evaluating...",nil) with: 0];
        !           247:         return;
        !           248:   }
        !           249:   if (notebookMode) doInsertNewInputCell=0;
        !           250:   else [[MyOutputWindowController sharedMyOutputWindowController: self] showUp];
        !           251:   ox_texmacs_level=0;
        !           252:   [self clearLines];
        !           253:
        !           254:   [textViewIn setTypingAttributes: myDefaultTypingAttributes];
        !           255:
        !           256:   if (notebookMode) {
        !           257:     cmd0 = [self getContentsOfInputCell];
        !           258:        [self prepareOutputCell];
        !           259:   }else if (onlySelectedArea) {
        !           260:     r = [textViewIn selectedRange];
        !           261:        // NSLog(@"r=(%d,%d)\n",r.location,r.length);
        !           262:     cmd0 = [textViewIn string];
        !           263:        if (r.length != 0) {
        !           264:                cmd0= [cmd0 substringWithRange: r];
        !           265:        }else{
        !           266:            int pos;
        !           267:            r = [cmd0 lineRangeForRange: r];
        !           268:                pos = r.location+r.length;
        !           269:                [textViewIn setSelectedRange: r]; // select the range containing the insertion point.
        !           270:                if (pos < [cmd0 length]) {
        !           271:           [textViewIn replaceCharactersInRange: NSMakeRange(pos+1,0) withString: @""];
        !           272:                }else{
        !           273:           [textViewIn replaceCharactersInRange: NSMakeRange(pos,0) withString: @"\n"];
        !           274:                }
        !           275:                cmd0 = [cmd0 substringWithRange:r ];
        !           276:        }
        !           277:   }else{
        !           278:     cmd0 = [textViewIn string];
        !           279:     MyOutputWindowController *mc;
        !           280:     mc = [MyOutputWindowController sharedMyOutputWindowController: self];
        !           281:     [mc clearOutputWindow];
        !           282:   }
        !           283:   cmd = [NSMutableString stringWithString: cmd0 ];
        !           284:
        !           285:   [self changeInputCounterField: 1];
        !           286:   if (peer == OX_TEXMACS) [self startIndicator];
        !           287:   [self oxEvaluateString: cmd withMark: TRUE];
        !           288:   [self changeOutputCounterField: 1];
        !           289: }
        !           290:
        !           291: - (IBAction) oxInterrupt:(id) sender {
        !           292:
        !           293:   NSAlert *alert = [[NSAlert alloc] init];
        !           294:   [alert addButtonWithTitle: NSLocalizedString(@"OK",nil)];
        !           295:   [alert addButtonWithTitle: NSLocalizedString(@"Cancel",nil)];
        !           296:   [alert setMessageText: NSLocalizedString(@"Interrupt the ox server?",nil)];
        !           297:   [alert setInformativeText:NSLocalizedString(@"The OX-RFC-100 interruption protocol is used.",nil)];
        !           298:   [alert setAlertStyle:NSWarningAlertStyle];
        !           299:   if ([alert runModal] != NSAlertFirstButtonReturn) {
        !           300:     // Cancel clicked, return.
        !           301:     return;
        !           302:   }
        !           303:   [alert release];
        !           304:
        !           305:   fprintf(stderr,"Trying to interrupt.\n");
        !           306:   [task interrupt];
        !           307:   inputCounter = outputCounter = 0;
        !           308:   [self stopIndicator];
        !           309:   [myDecoder reset];
        !           310: }
        !           311: -(IBAction) oxRenderOutput: (id) sender {
        !           312:   [self messageDialog: @"oxRenderOutput has not been implemented." with: 0];
        !           313: }
        !           314:
        !           315: -(IBAction) oxEvaluateSelected: (id) sender {
        !           316:   // try or test something here
        !           317:    // end of try or test.
        !           318:    // fprintf(stderr,"OnlySelectedArea\n");
        !           319:   if (notebookMode && (onlySelectedArea == 0)) {
        !           320:     [self messageDialog: NSLocalizedString(@"Selection will be ignored in the notebook style.",nil) with: 0];
        !           321:   }
        !           322:   if (onlySelectedArea) onlySelectedArea = 0; else onlySelectedArea = 1;
        !           323: }
        !           324:
        !           325: -(IBAction) oxEvaluateRegisteredString: (id) sender {
        !           326:   int ans;
        !           327:   NSAlert *alert = [[NSAlert alloc] init];
        !           328:   [alert addButtonWithTitle: NSLocalizedString(@"Cancel",nil)];
        !           329:   [alert addButtonWithTitle: NSLocalizedString(@"unix shell",nil)];
        !           330:   [alert addButtonWithTitle: NSLocalizedString(@"Risa/Asir",nil)];
        !           331:   [alert setMessageText: NSLocalizedString(@"Restart the computation server?",nil)];
        !           332:   //[alert setInformativeText:NSLocalizedString(@"",nil)];
        !           333:   [alert setAlertStyle:NSWarningAlertStyle];
        !           334:   ans = [alert runModal];
        !           335:   [alert release];
        !           336:   if (ans == NSAlertFirstButtonReturn) {
        !           337:     // Cancel clicked, return.
        !           338:     return ;
        !           339:   } else if (ans == NSAlertSecondButtonReturn) {
        !           340:        [self restartMyModel: BASH];
        !           341:     inputCounter = outputCounter = 0;
        !           342:        return ;
        !           343:   }else{
        !           344:     [self restartMyModel: OX_TEXMACS];
        !           345:     inputCounter = outputCounter = 0;
        !           346:        [myDecoder reset];
        !           347:     return;
        !           348:   }
        !           349: }
        !           350:
        !           351: -(IBAction) checkSelectedArea: (id) sender {
        !           352:   int ans;
        !           353:   ans = [self selectIllegalCharacter];
        !           354:   if (ans) return;
        !           355:   [self selectBlockForward];
        !           356: }
        !           357:
        !           358: -(int) oxEvaluateString: (NSString *) cmd withMark: (BOOL) yes {
        !           359:   NSData* cmdInData;
        !           360:   NSLog(@"Evaluating...  ");
        !           361:   NSLog(@"%@",cmd);
        !           362:   // Evaluation is here.
        !           363:   cmdInData = [cmd dataUsingEncoding: NSUTF8StringEncoding];
        !           364:   @try {
        !           365:     //todo  if (yes) [outboundFileHandle writeData: peerStartEvaluateMark];
        !           366:     [outboundFileHandle writeData: cmdInData];
        !           367:     if (yes) [outboundFileHandle writeData: peerEndEvaluteMark];
        !           368:   } @catch (NSException *exception) {
        !           369:       NSLog(@"oxEvalluateString Caught %@: %@", [exception name], [exception reason]);
        !           370:       [self messageDialog: NSLocalizedString(@"Error: Engine is not responding.",nil) with: 0];
        !           371:          return -1;
        !           372:   } @finally {
        !           373:       NSLog(@"writeData suceeded.\n");
        !           374:   }
        !           375:   // [NSThread sleepUntilDate: [NSDate dateWithTimeIntervalSinceNow: 10.0]];
        !           376:   NSLog(@"\nDone.\n");
        !           377:   return 0;
        !           378: }
        !           379:
        !           380: - (void) outputString: (NSString *) amt {
        !           381:   NSRange myRange = NSMakeRange([[textViewOut textStorage] length],0);
        !           382:   if (myDebug) NSLog(@"Get in outputString\n");
        !           383:   [textViewOut replaceCharactersInRange: myRange withString: amt];
        !           384:   [textViewOut scrollRangeToVisible: NSMakeRange([[textViewOut textStorage] length],0)];
        !           385:   //[textViewOut replaceCharactersInRange: NSMakeRange(0,NSMakeRange(0,[textViewOut length])) withString: amt];
        !           386:   if (notebookMode) [self outputStringInNotebookMode: amt];
        !           387:   else {
        !           388:     MyOutputWindowController *mc;
        !           389:     mc = [MyOutputWindowController sharedMyOutputWindowController: self];
        !           390:     [mc outputStringToOutputWindow: amt];
        !           391:   }
        !           392: }
        !           393: - (void) outputErrorString: (NSString *) amt {
        !           394:   int oldEnd;
        !           395:   int newEnd;
        !           396:   oldEnd = [[textViewOut textStorage] length];
        !           397:   NSRange myRange = NSMakeRange(oldEnd,0);
        !           398:   [textViewOut replaceCharactersInRange: myRange withString: amt];
        !           399:   newEnd = [[textViewOut textStorage] length];
        !           400:   [textViewOut setTextColor: [NSColor orangeColor] range: NSMakeRange(oldEnd,newEnd-oldEnd)];
        !           401:   [textViewOut scrollRangeToVisible: NSMakeRange(newEnd,0)];
        !           402: }
        !           403:
        !           404: - (void) printErrorMessage: (NSString *) amt {
        !           405:   MyOutputWindowController *mc;
        !           406:   if (notebookMode) [self outputErrorStringInNotebookMode: amt];
        !           407:   else {
        !           408:     mc = [MyOutputWindowController sharedMyOutputWindowController: self];
        !           409:     [mc printErrorMessageToOutputWindow: amt];
        !           410:   }
        !           411: }
        !           412: -(void)outputStringInNotebookMode: (NSString *)msg {
        !           413:   [self outputStringInNotebookMode: msg withColor: [NSColor blueColor]];
        !           414: }
        !           415: -(void)outputErrorStringInNotebookMode: (NSString *)msg {
        !           416:   [self outputStringInNotebookMode: msg withColor: [NSColor redColor]];
        !           417: }
        !           418: -(void)outputStringInNotebookMode: (NSString *)msg withColor: (NSColor *)color{
        !           419:   NSRange range;
        !           420:   int insertPos;
        !           421:   range=[textViewIn selectedRange];
        !           422:   insertPos = range.location+range.length;
        !           423:   range = NSMakeRange(insertPos,0);
        !           424:   [textViewIn replaceCharactersInRange: range withString: msg];
        !           425:   range = NSMakeRange(insertPos,[msg length]);
        !           426:   [textViewIn setTextColor: color range: range];
        !           427:   range=NSMakeRange(range.location+range.length,0);
        !           428:   [textViewIn scrollRangeToVisible: range];
        !           429:   [textViewIn setSelectedRange: range];
        !           430:  @synchronized(self) {
        !           431:   if (doInsertNewInputCell) {
        !           432:     if (![self getOutOfOutputCell]) [self insertInputCell];
        !           433:        doInsertNewInputCell = 0;
        !           434:   }
        !           435:  }
        !           436: }
        !           437:
        !           438: -(IBAction) clearTextViewOut: (id) sender {
        !           439:   NSRange myRange = NSMakeRange(0,[[textViewOut textStorage] length]);
        !           440:   [textViewOut replaceCharactersInRange: myRange withString: @""];
        !           441:   [textViewOut replaceCharactersInRange: NSMakeRange(0,0) withString: @" \n \n \n"];
        !           442:   [textViewOut scrollRangeToVisible: NSMakeRange(0,[[textViewOut textStorage] length])];
        !           443: }
        !           444:
        !           445: - (void) messageDialog: (NSString *)msg with: (int) no {
        !           446:   char s[256];
        !           447:   NSAlert *alert = [[NSAlert alloc] init];
        !           448:   sprintf(s,"%d",no);
        !           449:   [alert addButtonWithTitle: @"OK"];
        !           450:   [alert setMessageText: msg] ;
        !           451:   if (no) [alert setInformativeText: [NSString stringWithCString: (const char *) s]];
        !           452:   [alert setAlertStyle:NSWarningAlertStyle];
        !           453:   [alert runModal];
        !           454:   [alert release];
        !           455: }
        !           456:
        !           457: -(void) printDocument: (id) sender {
        !           458:   int status;
        !           459:   NSAlert *alert = [[NSAlert alloc] init];
        !           460:   [alert addButtonWithTitle:NSLocalizedString(@"Cancel",nil)];
        !           461:   [alert addButtonWithTitle:NSLocalizedString(@"Print output view",nil)];
        !           462:   [alert addButtonWithTitle:NSLocalizedString(@"Print input view",nil)];
        !           463:   [alert setMessageText:NSLocalizedString(@"Which view will you print?",nil)];
        !           464:   [alert setAlertStyle:NSWarningAlertStyle];
        !           465:   status = [alert runModal];
        !           466:   switch(status) {
        !           467:     case NSAlertThirdButtonReturn:
        !           468:                [textViewIn print: sender]; break;
        !           469:     case NSAlertSecondButtonReturn:
        !           470:            [textViewOut print: sender]; break;
        !           471:        default:
        !           472:     // Cancel clicked, return.
        !           473:                return;
        !           474:   }
        !           475:   [alert release];
        !           476: }
        !           477:
        !           478: -(void) showHelp: (id)sender {
        !           479:    BOOL ans;
        !           480:    NSString *path=nil;
        !           481:    //bug. temporary.
        !           482:    path = [OpenXM_HOME stringByAppendingString: @"/doc/cfep/intro-ja.html"];
        !           483:
        !           484:    ans = [[NSWorkspace sharedWorkspace] openFile:path withApplication: @"Help Viewer"];
        !           485:    if (ans != YES) {
        !           486:       [self messageDialog: NSLocalizedString(@"Help file is not found at cfep.app/OpenXM/doc/cfep",nil) with: 0];
        !           487:    }
        !           488: }
        !           489:
        !           490: -(void) changeInputCounterField: (int) inc {
        !           491:   NSString *ss;
        !           492:   ss = [NSString stringWithFormat: NSLocalizedString(@"Input%d",nil), inputCounter];
        !           493:   [inputCounterField setStringValue: ss];
        !           494:   inputCounter += inc;
        !           495:   return;
        !           496: }
        !           497: -(void) changeOutputCounterField: (int) inc {
        !           498:   NSString *ss;
        !           499:   ss = [NSString stringWithFormat: NSLocalizedString(@"Out%d",nil),outputCounter];
        !           500:   [outputCounterField setStringValue: ss];
        !           501:   outputCounter += inc;
        !           502:   return;
        !           503: }
        !           504: -(void) changeOutputCounterFieldWithString: (NSString *) ss {
        !           505:   [outputCounterField setStringValue: ss];
        !           506:   return;
        !           507: }
        !           508:
        !           509: -(void) startIndicator {
        !           510:   if (inEvaluation) return ;
        !           511:   inEvaluation = 1;
        !           512:   [myIndicator startAnimation: self];
        !           513: }
        !           514: -(void) stopIndicator {
        !           515:   if (inEvaluation == 0) return ;
        !           516:   inEvaluation = 0;
        !           517:   [myIndicator stopAnimation: self];
        !           518: }
        !           519:
        !           520:
        !           521: int debugInbound = 0;
        !           522: - (void)readInboundData:(NSNotification*)aNotification
        !           523: {
        !           524:   static int state=0;
        !           525:   static int u0 = 0;
        !           526:   static int u1 = 0;
        !           527:   static int u2 = 0;
        !           528:   int n,i,j,k;
        !           529:   unsigned char *d;
        !           530:   unsigned char *d2;
        !           531:   int c;
        !           532:   NSMutableString* inboundString;
        !           533:   NSData* data;
        !           534:   NSMutableData* data2;
        !           535:   NSString *act;
        !           536:   int channel;
        !           537:   @synchronized (self) {
        !           538:     if (debugInbound) NSLog(@"Reading inboudData\n");
        !           539:     data=[ inboundFileHandle availableData ];
        !           540:     n = [data length]; d = (unsigned char *)[data bytes];
        !           541:     if (debugInbound) NSLog(@"n=%d\n",n);
        !           542: //     if (n < 30) { for (k=0; k<n; k++) printf("%2x ",d[k]); printf("\n"); }
        !           543:     if (n == 0) { NSLog(@"Broken pipe?\n"); [self messageDialog: @"Error: Engine is not responding." with: 0]; return ; }
        !           544:     data2 = [NSMutableData dataWithCapacity: (n+4)];
        !           545:     d2 = (unsigned char *)[data2 mutableBytes];
        !           546:     i = 0;  d2[i] = 0;
        !           547:     for (j = 0; j< n; j++) {
        !           548:       c = d[j];
        !           549:       if (c == END_OF_EVALUATION_OF_OX_TEXMACS) {
        !           550:         [self stopIndicator];
        !           551:                ox_texmacs_level--;
        !           552:                if (ox_texmacs_level <= 0) doInsertNewInputCell = 1;
        !           553:       } else if (c == START_OF_RESULT_OF_OX_TEXMACS) {
        !           554:            ox_texmacs_level++;
        !           555:          }
        !           556:       switch(state) {
        !           557:       case 1:
        !           558:         u1 = d[j];
        !           559:         d2[i] = u0; i++; d2[i] = u1; i++; d2[i] = 0;
        !           560:         state = 0; break;
        !           561:       case 2:
        !           562:         u1 = d[j]; state = 3; break;
        !           563:       case 3:
        !           564:         u2 = d[j];
        !           565:         d2[i] = u0; i++; d2[i] = u1; i++; d2[i] = u2; i++ ; d2[i] = 0;
        !           566:         state = 0; break;
        !           567:       case 4:  // MYDECODER
        !           568:         u1 = d[j]; state = 5; break;
        !           569:       case 5:
        !           570:         u2 = d[j];
        !           571:         c = ((u0 & 0x3) << 6) | (((u1 & 0x7) << 3) & 0x38) | (u2 & 0x7);
        !           572:         // NSLog(@"|%2x| ",c);  // send it to myDecoder
        !           573:                act = [myDecoder myDecoder: c from: self];
        !           574:                if (act != nil) {
        !           575:                  if (debugMyTunnel) [self outputErrorString: act]; // for debug.
        !           576:           channel = [myDecoder getChannel];
        !           577:           if (channel == 0) [self errorActionFor: act];
        !           578:                  else if (channel == 1) [self openGLActionFor: act];
        !           579:                  else if (channel == 2) [self openGLInitActionFor: act];
        !           580:         }
        !           581:         state = 0; break;
        !           582:       default:
        !           583:         c=d[j];
        !           584:         if ((c >> 5) == UTF8_2) { u0=c ; state=1; }
        !           585:         else if ((c >> 4) == UTF8_3) { u0 =c ; state = 2; }
        !           586:         else if ((c >> 2) == MYDECODER) { u0=c; state = 4; }
        !           587:         else if ( c & 0x80) {
        !           588:           state = 0; NSLog(@"err|%2x| ",c);
        !           589:         }else {
        !           590:           if (c > 5) {
        !           591:             d2[i] = c; i++; d2[i] = 0; state = 0;
        !           592:           }
        !           593:         }
        !           594:       }
        !           595:     }
        !           596:   }
        !           597:   if (i) {
        !           598:     inboundString = [NSString stringWithCString: d2 encoding: NSUTF8StringEncoding];
        !           599:     [self outputString: inboundString];  // do this out of the synchronized session.
        !           600:   }
        !           601:
        !           602:   if (n) [[aNotification object] waitForDataInBackgroundAndNotify];
        !           603: }
        !           604:
        !           605:
        !           606: - (void)readErrData:(NSNotification*)aNotification
        !           607: {
        !           608:   int n,i,j;
        !           609: #define MD_SIZE 5000
        !           610:   unsigned char *d;
        !           611:   int c;
        !           612:   NSMutableString* inboundString;
        !           613:   NSData*  inboundData ;
        !           614:   @synchronized (self) {
        !           615:   inboundString = [NSMutableString stringWithCapacity: (MD_SIZE+2)];
        !           616:
        !           617:   // NSLog(@"(err) Reading inboudData\n");
        !           618:   inboundData=[ errFileHandle availableData ];
        !           619:   n = [inboundData length]; d = (unsigned char *)[inboundData bytes];
        !           620:   i = 0;
        !           621:   while (i < n ) {
        !           622:     for (j = 0; j<MD_SIZE ; j++ ) {
        !           623:           c = d[i];   // putchar(c);
        !           624:           [inboundString appendString: [NSString stringWithFormat: @"%c", (c & 0x7f)]  ];
        !           625:           i++; if (i >= n) { j++; break;}
        !           626:        }
        !           627:        // NSLog( [NSString stringWithFormat: @"i=%d, j=%d\n", i, j] );
        !           628:        j++;
        !           629: //    NSLog(@"%@", inboundString );
        !           630:     [self outputErrorString: inboundString];
        !           631:     inboundString = [NSMutableString stringWithCapacity: (MD_SIZE+2)] ;
        !           632:   }
        !           633:   }
        !           634:   if (n) [[aNotification object] waitForDataInBackgroundAndNotify];
        !           635:
        !           636: }
        !           637:
        !           638: -(int) specialCharacterInNotebookMode: (int) c {
        !           639:   if (!notebookMode) return 0;
        !           640:   if (c == BEGIN_INPUT_CELL) return 1;
        !           641:   else if (c==BEGIN_OUTPUT_CELL) return 1;
        !           642:   else if (c==END_INPUT_CELL) return 1;
        !           643:   else if (c==END_OUTPUT_CELL) return 1;
        !           644:   return 0;
        !           645: }
        !           646: -(int) selectIllegalCharacter {
        !           647:   NSRange r;
        !           648:   NSString *in;
        !           649:   int i, n;
        !           650:   int state,offset;
        !           651:   int c,c2;
        !           652:   // 1: in /*
        !           653:   // 2: in //
        !           654:   // 3: in "
        !           655:   // 4: in '
        !           656:   in = [textViewIn string];
        !           657:   r = [textViewIn selectedRange];
        !           658:   //NSLog(@"%d, %d\n",r.location, r.length);
        !           659:   if (r.length < 1) {
        !           660:     offset = 0;
        !           661:     n = [in length];
        !           662:   }else{
        !           663:     offset = r.location;
        !           664:     n = offset + r.length;
        !           665:   }
        !           666:   state = 0;
        !           667:   for (i=offset; i<n; i++) {
        !           668:     c = [in characterAtIndex: i];  // NSLog(@"|%04x| ",c);
        !           669:     if (i != n-1) c2 = [in characterAtIndex: (i+1)];
        !           670:     else c2 = 0;
        !           671:     switch (state) {
        !           672:     case 0:
        !           673:       if ((c == 0x1b)) {
        !           674:         [textViewIn setSelectedRange: NSMakeRange(i,1)];
        !           675:         [self outputErrorString:
        !           676:                 NSLocalizedString(@"Error: Illegal control character.\n",nil)];
        !           677:         return 1;
        !           678:       }
        !           679:       if ((c > 0x7e) && (![self specialCharacterInNotebookMode: c])) {
        !           680:         [textViewIn setSelectedRange: NSMakeRange(i,1)];
        !           681:         [self outputErrorString:
        !           682:                 NSLocalizedString(@"Error: Program part must be written only by ascii characters.\n",nil)];
        !           683:         return 1;
        !           684:       }
        !           685:       if (((c == '/') && (c2 == '*')) || (notebookMode && (c == BEGIN_OUTPUT_CELL))) {
        !           686:         i++; state = 1;
        !           687:       }else if ((c == '/') && (c2 == '/')) {
        !           688:         i++; state = 2;
        !           689:       }else if (c == '"') {
        !           690:         state = 3;
        !           691:       }else if (c == '\'') {
        !           692:         state = 4;
        !           693:       }else state=0;
        !           694:       break;
        !           695:     case 1:
        !           696:       if (((c == '*') && (c2 == '/')) || (notebookMode && (c2 == END_OUTPUT_CELL))) {
        !           697:         i++; state = 0;
        !           698:       }
        !           699:       break;
        !           700:     case 2:
        !           701:       if (c == '\n') state = 0;
        !           702:       break;
        !           703:     case 3:
        !           704:       if (c == '"') state = 0;
        !           705:       else if (c == '\\') {
        !           706:         i++; //BUG. skip only one letter.
        !           707:       }
        !           708:       break;
        !           709:     case 4:
        !           710:       if (c == '\'') state = 0;
        !           711:       else if (c == '\\') {
        !           712:         i++; //BUG. skip only one letter.
        !           713:       }
        !           714:       break;
        !           715:     }
        !           716:   }
        !           717: //  [self outputErrorString: @"No illegal character.\n"];
        !           718:   return 0;
        !           719: }
        !           720:
        !           721: -(NSRange) selectBlockForward {
        !           722:   NSRange r;
        !           723:   NSRange ans;
        !           724:   NSString *in;
        !           725:   int i, n;
        !           726:   int first, last,offset, state;
        !           727:   int c,c2;
        !           728:   static int prevStart = -1;
        !           729:
        !           730:   first = last = 0;
        !           731:   ans = NSMakeRange(0,0);
        !           732:
        !           733:   // 1: in /*
        !           734:   // 2: in //
        !           735:   // 3: in "
        !           736:   // 4: in '
        !           737:   in = [textViewIn string];
        !           738:   r = [textViewIn selectedRange];
        !           739:   if (r.length < 1) {
        !           740:     offset = 0;
        !           741:   } else {
        !           742:     offset = r.location;
        !           743:   }
        !           744:   if (offset == prevStart) {
        !           745:     offset = offset+1;
        !           746:   }
        !           747:   n = [in length];
        !           748:   if (offset >= n) offset = 0;
        !           749:   state = 0;
        !           750:   for (i=offset; i<n; i++) {
        !           751:     c = [in characterAtIndex: i];
        !           752:     if (i != n-1) c2 = [in characterAtIndex: (i+1)];
        !           753:     else c2 = 0;
        !           754:     switch (state) {
        !           755:     case 0:
        !           756:       if (c == '{') {
        !           757:         ans=[self selectBlockForwardFrom: i with: c and: '}'];
        !           758:                if (prevStart != ans.location) { prevStart = ans.location; }
        !           759:                return ans;
        !           760:       }else if (c == '(') {
        !           761:         ans=[self selectBlockForwardFrom: i with: c and: ')'];
        !           762:                if (prevStart != ans.location) { prevStart = ans.location; }
        !           763:                return ans;
        !           764:       }else if (c == '[') {
        !           765:         ans=[self selectBlockForwardFrom: i with: c and: ']'];
        !           766:                if (prevStart != ans.location) { prevStart = ans.location; }
        !           767:                return ans;
        !           768:          }
        !           769:       if ((c == '/') && (c2 == '*')) {
        !           770:         i++; state = 1;
        !           771:       }else if ((c == '/') && (c2 == '/')) {
        !           772:         i++; state = 2;
        !           773:       }else if (c == '"') {
        !           774:         state = 3;
        !           775:       }else if (c == '\'') {
        !           776:         state = 4;
        !           777:       }else state=0;
        !           778:       break;
        !           779:     case 1:
        !           780:       if ((c == '*') && (c2 == '/')) {
        !           781:         i++; state = 0;
        !           782:       }
        !           783:       break;
        !           784:     case 2:
        !           785:       if (c == '\n') state = 0;
        !           786:       break;
        !           787:     case 3:
        !           788:       if (c == '"') state = 0;
        !           789:       else if (c == '\\') {
        !           790:         i++; //BUG. skip only one letter.
        !           791:       }
        !           792:       break;
        !           793:     case 4:
        !           794:       if (c == '\'') state = 0;
        !           795:       else if (c == '\\') {
        !           796:         i++; //BUG. skip only one letter.
        !           797:       }
        !           798:       break;
        !           799:     }
        !           800:   }
        !           801:   return ans;
        !           802: }
        !           803: -(NSRange) selectBlockForwardFrom: (int) offset with: (int) first and: (int) last {
        !           804:   NSRange r;
        !           805:   NSRange ans;
        !           806:   NSString *in;
        !           807:   int i, n;
        !           808:   int state;
        !           809:   int c,c2;
        !           810:   int level;
        !           811:   int startpos;
        !           812:
        !           813:   level = 0;
        !           814:   ans = NSMakeRange(0,0);
        !           815:
        !           816:   // 1: in /*
        !           817:   // 2: in //
        !           818:   // 3: in "
        !           819:   // 4: in '
        !           820:   in = [textViewIn string];
        !           821:   r = [textViewIn selectedRange];
        !           822:   n = [in length];
        !           823:   state = 0;
        !           824:   for (i=offset; i<n; i++) {
        !           825:     c = [in characterAtIndex: i];
        !           826:     if (i != n-1) c2 = [in characterAtIndex: (i+1)];
        !           827:     else c2 = 0;
        !           828:     switch (state) {
        !           829:     case 0:
        !           830:       if (level == 0) {
        !           831:         if (c == first) {
        !           832:           level = 1; startpos = i;
        !           833:         }
        !           834:       } else if (level > 0) {
        !           835:         if (c == first) level++;
        !           836:         else if (c == last) level--;
        !           837:         else ;
        !           838:         if (level == 0) {
        !           839:           ans = NSMakeRange(startpos, i+1-startpos);
        !           840:           [textViewIn setSelectedRange: ans];
        !           841:           [textViewIn scrollRangeToVisible: NSMakeRange(startpos,0)];
        !           842:           return ans;
        !           843:         }
        !           844:       }
        !           845:
        !           846:       if ((c == '/') && (c2 == '*')) {
        !           847:         i++; state = 1;
        !           848:       }else if ((c == '/') && (c2 == '/')) {
        !           849:         i++; state = 2;
        !           850:       }else if (c == '"') {
        !           851:         state = 3;
        !           852:       }else if (c == '\'') {
        !           853:         state = 4;
        !           854:       }else state=0;
        !           855:       break;
        !           856:     case 1:
        !           857:       if ((c == '*') && (c2 == '/')) {
        !           858:         i++; state = 0;
        !           859:       }
        !           860:       break;
        !           861:     case 2:
        !           862:       if (c == '\n') state = 0;
        !           863:       break;
        !           864:     case 3:
        !           865:       if (c == '"') state = 0;
        !           866:       else if (c == '\\') {
        !           867:         i++; //BUG. skip only one letter.
        !           868:       }
        !           869:       break;
        !           870:     case 4:
        !           871:       if (c == '\'') state = 0;
        !           872:       else if (c == '\\') {
        !           873:         i++; //BUG. skip only one letter.
        !           874:       }
        !           875:       break;
        !           876:     }
        !           877:   }
        !           878:   if (level > 0) {
        !           879:     [self outputErrorString: NSLocalizedString(@"Error: No right parenthesis.\n",nil)] ;
        !           880:     [textViewIn setSelectedRange: NSMakeRange(startpos,n-startpos)];
        !           881:     ans = NSMakeRange(startpos,-1);
        !           882:     return ans;
        !           883:   }
        !           884:   return ans;
        !           885: }
        !           886:
        !           887: -(void) errorActionFor: (NSString *)cmd
        !           888: {
        !           889:   NSArray *a;
        !           890:   NSRange r;
        !           891:   static NSRange r2;
        !           892:   static NSRange r3;
        !           893:   static int r2IsSet;
        !           894:   static int r3IsSet;
        !           895:   NSString *s;
        !           896:   int line,i, currentLine;
        !           897:   // NSLog(@"cmd=%@\n",cmd);
        !           898:   if ([cmd hasPrefix: @"Begin"] == YES) {
        !           899:      r3IsSet = 0; r2IsSet = 0;
        !           900:   }else if ([cmd hasPrefix: @"End"] == YES) {
        !           901:      if (r2IsSet) {
        !           902:        [textViewIn setSelectedRange: r2];
        !           903:        [textViewIn scrollRangeToVisible: r2];
        !           904:            r2IsSet = 0;
        !           905:      }
        !           906:      if (r3IsSet) {  //gotoLine, xyz is stronger than findAndSelect.
        !           907:         [textViewIn setSelectedRange: r3];
        !           908:         [textViewIn scrollRangeToVisible: r3];
        !           909:                r3IsSet = 0;
        !           910:         }
        !           911:   }else if ([cmd hasPrefix: @"findAndSelect"] == YES) {
        !           912:     a = [cmd componentsSeparatedByString: @", "];
        !           913:        if ([a count] > 1) {
        !           914:          a = [[a objectAtIndex: 1] componentsSeparatedByString: @"\n"];
        !           915:          s = [a objectAtIndex: 0];
        !           916:       r2 = [[textViewIn string] rangeOfString: s];
        !           917:          r2IsSet = 1;
        !           918:          // selection will be done in End.
        !           919:          [self printErrorMessage: [NSLocalizedString(@"Error in executing ",nil) stringByAppendingString: s]];
        !           920:          [self printErrorMessage: @"\n"];
        !           921:        }
        !           922:   }else if ([cmd hasPrefix: @"findAndShow"] == YES) {
        !           923:     a = [cmd componentsSeparatedByString: @", "];
        !           924:        if ([a count] > 1) {
        !           925:          a = [[a objectAtIndex: 1] componentsSeparatedByString: @"\n"];
        !           926:          s = [a objectAtIndex: 0];
        !           927:          [self printErrorMessage: [NSLocalizedString(@"Error in executing ",nil) stringByAppendingString: s]];
        !           928:          [self printErrorMessage: @"\n"];
        !           929:        }
        !           930:   }else if ([cmd hasPrefix: @"printErrorMessage"] == YES) {
        !           931:     a = [cmd componentsSeparatedByString: @"ErrorMessage, "];
        !           932:        if ([a count] > 1) {
        !           933:          s = [a objectAtIndex: 1];
        !           934:          [self printErrorMessage: [NSLocalizedString(@"Error: ",nil) stringByAppendingString: s]];
        !           935:          [self printErrorMessage: @"\n"];
        !           936:     }
        !           937:   }else if ([cmd hasPrefix: @"gotoLine"] == YES) {
        !           938:     a = [cmd componentsSeparatedByString: @"Line, "];
        !           939:        if ([a count] > 1) {
        !           940:          s = [a objectAtIndex: 1];
        !           941:       [self printErrorMessage: [NSLocalizedString(@"Error at ",nil) stringByAppendingString: s]];
        !           942:       [self printErrorMessage: @"\n"];
        !           943:          line = [s intValue];
        !           944:          [self addLine: line];
        !           945:          // move the selection to the line.
        !           946:          i = [self gotoLine: line];
        !           947:          if (i >= 0) {
        !           948:                  r3 = NSMakeRange(i,0);   // NSLog(@"Goto the location=%d\n",i);
        !           949:                  r3IsSet = 1;
        !           950:          }
        !           951:     }
        !           952:   }
        !           953: }
        !           954:
        !           955: -(void) clearLines {
        !           956:   [errorLines removeAllObjects];
        !           957:   [self nextLine: -1];
        !           958: }
        !           959: -(void) addLine: (int) n {
        !           960:   [errorLines addObject: [NSNumber numberWithInt: n]];
        !           961: }
        !           962: -(int) nextLine: (int) n {
        !           963:   static int p = 0;
        !           964:   int v;
        !           965:   if (n < 0) { p = 0; return -1; }
        !           966:   if (p < [errorLines count]) ; else { p = 0; return -1;}
        !           967:   v = [[errorLines objectAtIndex: p] intValue];
        !           968:   p++;
        !           969:   return v;
        !           970: }
        !           971: -(int) gotoLine: (int) line {
        !           972:       NSString *s;
        !           973:          NSRange r;
        !           974:          NSRange r3;
        !           975:          int currentLine,i;
        !           976:          // move the selection to the line line.
        !           977:          s = [textViewIn string];
        !           978:          if (onlySelectedArea || notebookMode) r = [textViewIn selectedRange];
        !           979:          else r = NSMakeRange(0,[s length]);
        !           980:          // NSLog(@"r.location=%d",r.location);
        !           981:          currentLine = 1;
        !           982:          for (i=r.location; i< r.location+r.length; i++) {
        !           983:            if (currentLine == line) {
        !           984:                  r3 = NSMakeRange(i,0);   // NSLog(@"Goto the location=%d\n",i);
        !           985:           [textViewIn setSelectedRange: r3 ];
        !           986:           [textViewIn scrollRangeToVisible: r3];
        !           987:                  return i; // set r3IsSet
        !           988:                  break;
        !           989:                }
        !           990:            if ([s characterAtIndex: i] == '\n') ++currentLine;
        !           991:          }
        !           992:          return -1;
        !           993: }
        !           994: -(int) gotoNextError: (id) sender{
        !           995:   int n;
        !           996:   n = [self nextLine: 0];
        !           997:   if (n >= 0) { [self gotoLine: n]; return n;}
        !           998:   else return -1;
        !           999: }
        !          1000:
        !          1001: /* act= 0;[glRectf,-0.5, ...] */
        !          1002: -(int) openGLActionFor: (NSString *)act {
        !          1003:   NSArray *a;
        !          1004:   int gid;
        !          1005:   a=[act componentsSeparatedByString: @";"];
        !          1006:   if ([a count] < 2) {
        !          1007:     [self printErrorMessage: @"Invalid format in openGLActionFor. gid and command must be separated by ;\n"];
        !          1008:        return -1;
        !          1009:   }
        !          1010:   gid = [[a objectAtIndex: 0] intValue];
        !          1011:   [MyOpenGLController addOglComm: [a objectAtIndex: 1] to: gid from: self];
        !          1012:   return 0;
        !          1013: }
        !          1014: -(int) openGLInitActionFor: (NSString *) act {
        !          1015:   NSArray *a;
        !          1016:   int gid;
        !          1017:   a=[act componentsSeparatedByString: @";"];
        !          1018:   if ([a count] < 2) {
        !          1019:     [self printErrorMessage: @"Invalid format in openGLInitActionFor. gid and command must be separated by ;\n"];
        !          1020:        return -1;
        !          1021:   }
        !          1022:   gid = [[a objectAtIndex: 0] intValue];
        !          1023:   [MyOpenGLController addOglInitComm: [a objectAtIndex: 1] to: gid from: self];
        !          1024:   return 0;
        !          1025: }
        !          1026:
        !          1027: -(void) setBasicStyle: (id) sender {
        !          1028:   notebookMode = 0;
        !          1029:   [self updateInterfaceStyleMenu];
        !          1030: }
        !          1031: -(void) setNotebookStyle: (id) sender {
        !          1032:   notebookMode = 1;
        !          1033:   [self updateInterfaceStyleMenu];
        !          1034:   [self insertInputCell];
        !          1035: }
        !          1036: -(void) updateInterfaceStyleMenu {
        !          1037:   if (!menuItemNotebookMode) return;
        !          1038:   if (!menuItemBasicMode) return;
        !          1039:   if (notebookMode) {
        !          1040:     [menuItemNotebookMode setState: NSOnState];
        !          1041:        [menuItemBasicMode setState: NSOffState];
        !          1042:   }else        {
        !          1043:     [menuItemNotebookMode setState: NSOffState];
        !          1044:        [menuItemBasicMode setState: NSOnState];
        !          1045:   }
        !          1046: }
        !          1047: -(void) setEngineRisaAsir: (id) sender {
        !          1048:   oxEngine = 0;
        !          1049:   [self updateSelectEngineMenu];
        !          1050:   [self oxEvaluateString: @"!asir;" withMark: TRUE];
        !          1051: }
        !          1052: -(void) setEngineKanSm1: (id) sender {
        !          1053:   oxEngine = 1;
        !          1054:   [self updateSelectEngineMenu];
        !          1055:   [self oxEvaluateString: @"!sm1;" withMark: TRUE];
        !          1056: }
        !          1057: -(void) updateSelectEngineMenu {
        !          1058:   if (!menuItemRisaAsir) return;
        !          1059:   if (!menuItemKanSm1) return;
        !          1060:   if (oxEngine == 0) {
        !          1061:     [menuItemRisaAsir setState: NSOnState];
        !          1062:        [menuItemKanSm1 setState: NSOffState];
        !          1063:   }else        if (oxEngine == 1) {
        !          1064:     [menuItemRisaAsir setState: NSOffState];
        !          1065:        [menuItemKanSm1 setState: NSOnState];
        !          1066:   }
        !          1067: }
        !          1068: -(void) setDebugMyTunnel: (id) sender {
        !          1069:   if (debugMyTunnel) {
        !          1070:     debugMyTunnel = 0;
        !          1071:        if (menuItemOutputDebugMessages) [menuItemOutputDebugMessages setState: NSOffState];
        !          1072:   } else {
        !          1073:     debugMyTunnel = 1;
        !          1074:        if (menuItemOutputDebugMessages) [menuItemOutputDebugMessages setState: NSOnState];
        !          1075:   }
        !          1076:   [MyUtil setDebugMyUtil];
        !          1077: }
        !          1078: -(void) mytest: (id) sender {
        !          1079:   // Add code here for testing.
        !          1080:   int n;
        !          1081:   n=[self gotoNextError: nil];
        !          1082:   NSLog(@"error line=%d\n",n);
        !          1083: }
        !          1084: -(void) addMenuExec {
        !          1085:   static int done=0;
        !          1086:   NSMenu *menuItem;
        !          1087:   NSMenu *menuExec;
        !          1088:   NSMenuItem *menuItemEvaluate;
        !          1089:   NSMenuItem *menuItemInterrupt;
        !          1090:   NSMenuItem *menuItemInterfaceStyle;
        !          1091:   NSMenuItem *menuItemSelectEngine;
        !          1092:   NSMenuItem *menuItemGotoNextError;
        !          1093:   NSMenuItem *menuItemForTest;
        !          1094:   if (done) return;
        !          1095:   done = 1;
        !          1096:   // oxEvalute
        !          1097:   menuExec = [[[NSMenu alloc] init] autorelease];
        !          1098:   [menuExec setTitle: NSLocalizedString(@"Execution",nil)];
        !          1099:   menuItemEvaluate = [[[NSMenuItem alloc] init] autorelease];
        !          1100:   [menuItemEvaluate setTitle: NSLocalizedString(@"Evaluate",nil)];
        !          1101:   [menuItemEvaluate setAction: @selector(oxEvaluate:)];
        !          1102:   [menuItemEvaluate setTarget: [[NSApp mainWindow] document]];
        !          1103:   [menuItemEvaluate setKeyEquivalentModifierMask: NSCommandKeyMask];
        !          1104:   [menuItemEvaluate setKeyEquivalent: @"\n"];
        !          1105:   [menuExec addItem: menuItemEvaluate];
        !          1106:   // oxInterrupt
        !          1107:   menuItemInterrupt = [[[NSMenuItem alloc] init] autorelease];
        !          1108:   [menuItemInterrupt setTitle: NSLocalizedString(@"Interrupt",nil)];
        !          1109:   [menuItemInterrupt setAction: @selector(oxInterrupt:)];
        !          1110:   [menuItemInterrupt setTarget: [[NSApp mainWindow] document]];  // do not use self.
        !          1111:   [menuExec addItem: menuItemInterrupt];
        !          1112:
        !          1113:   // gotoNextError
        !          1114:   menuItemGotoNextError = [[[NSMenuItem alloc] init] autorelease];
        !          1115:   [menuItemGotoNextError setTitle: NSLocalizedString(@"Next error line",nil)];
        !          1116:   [menuItemGotoNextError setAction: @selector(gotoNextError:)];
        !          1117:   [menuItemGotoNextError setTarget: [[NSApp mainWindow] document]];
        !          1118:   [menuExec addItem: menuItemGotoNextError];
        !          1119:
        !          1120:   // gotoNextError
        !          1121:   menuItemOutputDebugMessages = [[[NSMenuItem alloc] init] autorelease];
        !          1122:   [menuItemOutputDebugMessages setTitle: NSLocalizedString(@"Output debug messages",nil)];
        !          1123:   [menuItemOutputDebugMessages setAction: @selector(setDebugMyTunnel:)];
        !          1124:   [menuItemOutputDebugMessages setTarget: [[NSApp mainWindow] document]];
        !          1125:   [menuExec addItem: menuItemOutputDebugMessages];
        !          1126:
        !          1127:   // interface style
        !          1128:   NSMenu *submenuInterfaceItem = [[[NSMenu alloc] init] autorelease];
        !          1129:     // basic-like
        !          1130:   NSMenuItem *menuItemBasicLike = [[[NSMenuItem alloc] init] autorelease];
        !          1131:   [menuItemBasicLike setTitle: NSLocalizedString(@"BASIC-like",nil)];
        !          1132:   [menuItemBasicLike setAction: @selector(setBasicStyle:)];
        !          1133:   [menuItemBasicLike setTarget: [[NSApp mainWindow] document]];
        !          1134:   menuItemBasicMode = menuItemBasicLike;
        !          1135:   [submenuInterfaceItem addItem: menuItemBasicLike];
        !          1136:     // notebook-like
        !          1137:   NSMenuItem *menuItemNotebookLike = [[[NSMenuItem alloc] init] autorelease];
        !          1138:   [menuItemNotebookLike setTitle: NSLocalizedString(@"Notebook-like",nil)];
        !          1139:   [menuItemNotebookLike setAction: @selector(setNotebookStyle:)];
        !          1140:   [menuItemNotebookLike setTarget: [[NSApp mainWindow] document]];
        !          1141:   menuItemNotebookMode = menuItemNotebookLike;
        !          1142:   [submenuInterfaceItem addItem: menuItemNotebookLike];
        !          1143:
        !          1144:   menuItemInterfaceStyle = [[[NSMenuItem alloc] init] autorelease];
        !          1145:   [menuItemInterfaceStyle setTitle: NSLocalizedString(@"Interface style",nil)];
        !          1146:   [menuItemInterfaceStyle setSubmenu: submenuInterfaceItem];
        !          1147:   [menuExec addItem: menuItemInterfaceStyle];
        !          1148:   [self updateInterfaceStyleMenu];
        !          1149:
        !          1150:     // select engine
        !          1151:   NSMenu *submenuSelectEngineItem = [[[NSMenu alloc] init] autorelease];
        !          1152:     // asir
        !          1153:   menuItemRisaAsir = [[[NSMenuItem alloc] init] autorelease];
        !          1154:   [menuItemRisaAsir setTitle: NSLocalizedString(@"Risa/Asir",nil)];
        !          1155:   [menuItemRisaAsir setAction: @selector(setEngineRisaAsir:)];
        !          1156:   [menuItemRisaAsir setTarget: [[NSApp mainWindow] document]];
        !          1157:   [submenuSelectEngineItem addItem: menuItemRisaAsir];
        !          1158:     // notebook-like
        !          1159:   menuItemKanSm1 = [[[NSMenuItem alloc] init] autorelease];
        !          1160:   [menuItemKanSm1 setTitle: NSLocalizedString(@"Kan/sm1",nil)];
        !          1161:   [menuItemKanSm1 setAction: @selector(setEngineKanSm1:)];
        !          1162:   [menuItemKanSm1 setTarget: [[NSApp mainWindow] document]];
        !          1163:   [submenuSelectEngineItem addItem: menuItemKanSm1];
        !          1164:
        !          1165:   menuItemSelectEngine = [[[NSMenuItem alloc] init] autorelease];
        !          1166:   [menuItemSelectEngine setTitle: NSLocalizedString(@"Select engine",nil)];
        !          1167:   [menuItemSelectEngine setSubmenu: submenuSelectEngineItem];
        !          1168:   [menuExec addItem: menuItemSelectEngine];
        !          1169:   [self updateSelectEngineMenu];
        !          1170:
        !          1171:
        !          1172:   // test
        !          1173:   menuItemForTest = [[[NSMenuItem alloc] init] autorelease];
        !          1174:   [menuItemForTest setTitle: NSLocalizedString(@"For test",nil)];
        !          1175:   [menuItemForTest setAction: @selector(mytest:)];
        !          1176:   [menuItemForTest setTarget: [[NSApp mainWindow] document]];
        !          1177:   [menuExec addItem: menuItemForTest];
        !          1178:
        !          1179:   menuItem = [[[NSMenuItem alloc] init] autorelease];
        !          1180:   [[NSApp mainMenu] insertItem: menuItem atIndex: 4];
        !          1181:   [menuItem setSubmenu: menuExec];
        !          1182: }
        !          1183:
        !          1184: -(void) insertInputCell {
        !          1185:   NSRange r;
        !          1186:   NSString *ic;
        !          1187:   unichar uu[2];
        !          1188:   uu[0] = BEGIN_INPUT_CELL; uu[1] = END_INPUT_CELL;
        !          1189:   r = [textViewIn selectedRange]; r.length=0;
        !          1190:   ic = [NSString stringWithCharacters: uu length: 2];
        !          1191:   // NSLog(@"insertInputCell: r.location=%d, r.length=%d, %@\n",r.location,r.length,ic);
        !          1192:   [textViewIn replaceCharactersInRange: r withString: ic];
        !          1193:   r.location = r.location+1; r.length = 0;
        !          1194:   [textViewIn setSelectedRange: r ];
        !          1195:   r.location = r.location-1; r.length = 2;
        !          1196:   [textViewIn setTextColor: [NSColor blackColor] range: r];
        !          1197: }
        !          1198: -(NSString *) getContentsOfInputCell {
        !          1199:     int start,end,i,n;
        !          1200:        NSString *cmd0;
        !          1201:        NSRange r;
        !          1202:     cmd0 = [textViewIn string];
        !          1203:        start=0; end = n = [cmd0 length]; if (end > 0) end--;
        !          1204:     r = [textViewIn selectedRange];
        !          1205:        if (r.location < n) i = r.location; else i = n-1;
        !          1206:        if (i < 0) i=0;
        !          1207:        for (; i>=0; i--) {
        !          1208:          if ([cmd0 characterAtIndex: i] == BEGIN_INPUT_CELL) {
        !          1209:            start = i+1; break;
        !          1210:          }
        !          1211:        }
        !          1212:        for (i=start; i<n; i++) {
        !          1213:          if ([cmd0 characterAtIndex: i] == END_INPUT_CELL) {
        !          1214:            end = i-1; break;
        !          1215:          }
        !          1216:        }
        !          1217:        // NSLog(@"start=%d, end=%d\n",start,end);
        !          1218:        r.location = start; r.length = end-start+1;
        !          1219:        if (r.length > 0) {
        !          1220:                cmd0= [cmd0 substringWithRange: r];
        !          1221:        }else{
        !          1222:            cmd0 = @"";
        !          1223:        }
        !          1224:        if (end+2 <= n) r.location=end+2;
        !          1225:        r.length = 0;
        !          1226:        [textViewIn setSelectedRange: r];
        !          1227:     return cmd0;
        !          1228: }
        !          1229: // return 1 if there is the next inputCell
        !          1230: -(int) getOutOfOutputCell {
        !          1231:     int start,end,i,n;
        !          1232:        NSString *cmd0;
        !          1233:        NSRange r;
        !          1234:     cmd0 = [textViewIn string];
        !          1235:        n = [cmd0 length];
        !          1236:     r = [textViewIn selectedRange];
        !          1237:        start = r.location;
        !          1238:        // NSLog(@"r.location=%d, r.length=%d\n",r.location,r.length);
        !          1239:        if (r.location < n) i = r.location; else i = n-1;
        !          1240:        if (i>0) i--;
        !          1241:        for (; i<n; i++) {
        !          1242:          if ([cmd0 characterAtIndex: i] == END_OUTPUT_CELL) {
        !          1243:            start = i+1; break;
        !          1244:          }else if ([cmd0 characterAtIndex: i] == BEGIN_INPUT_CELL) {
        !          1245:            r.location = i+1; r.length=0;
        !          1246:                [textViewIn setSelectedRange: r];  [textViewIn scrollRangeToVisible: r];
        !          1247:                return 1;
        !          1248:          }else if ([cmd0 characterAtIndex: i] == END_INPUT_CELL) {
        !          1249:            r.location = i-1; r.length=0;
        !          1250:                [textViewIn setSelectedRange: r];  [textViewIn scrollRangeToVisible: r];
        !          1251:                return 1;
        !          1252:          }
        !          1253:        }
        !          1254:        r.location = start; r.length = 0;
        !          1255:        [textViewIn setSelectedRange: r];
        !          1256:
        !          1257:        for (i = start; i<n; i++) {
        !          1258:       // Try to find the next input cell.
        !          1259:          if ([cmd0 characterAtIndex: i] == BEGIN_INPUT_CELL) {
        !          1260:            r.location = i+1; r.length = 0;
        !          1261:                [textViewIn setSelectedRange: r];  [textViewIn scrollRangeToVisible: r];
        !          1262:                return 1;
        !          1263:          }else if ([cmd0 characterAtIndex: i] == END_INPUT_CELL) {
        !          1264:            // We are inside an input cell.
        !          1265:            r.location = i-1; r.length = 0;
        !          1266:                [textViewIn setSelectedRange: r]; [textViewIn scrollRangeToVisible: r];
        !          1267:                return 1;
        !          1268:          }
        !          1269:        }
        !          1270:        return 0;
        !          1271: }
        !          1272: -(void) prepareOutputCell {
        !          1273:   int start,end,i,j,n,m;
        !          1274:   NSString *cmd0;
        !          1275:   NSString *ic;
        !          1276:   unichar uu[7];
        !          1277:        NSRange r;
        !          1278:        start = -1; end = -1;
        !          1279:     cmd0 = [textViewIn string];
        !          1280:        n = [cmd0 length];
        !          1281:     r = [textViewIn selectedRange];
        !          1282:        i = r.location;
        !          1283:        if (i < 0) i = 0;
        !          1284:        if (i >= n) i = n-1;
        !          1285:        for (; i<n; i++) {
        !          1286:          if ([cmd0 characterAtIndex: i] == BEGIN_OUTPUT_CELL) {
        !          1287:            start = i;
        !          1288:                for (j=i; j>=0; j--) {
        !          1289:                  if ([cmd0 characterAtIndex: j] <= ' ') {
        !          1290:                    start = j;
        !          1291:                  }     else {
        !          1292:                    if (start>0) start--;
        !          1293:                    break;
        !          1294:              }
        !          1295:                }
        !          1296:                break;
        !          1297:          }else if ([cmd0 characterAtIndex: i] == BEGIN_INPUT_CELL) {
        !          1298:            start = i-1;
        !          1299:                if (start < 0) start = 0;
        !          1300:                end = -2;
        !          1301:                break;
        !          1302:          }
        !          1303:        }
        !          1304:        if (end == -2) {
        !          1305:          r.location = start; r.length=0;
        !          1306:        }else{
        !          1307:          end = start;
        !          1308:          i = start; if (i < 0) i = 0;
        !          1309:          for (; i<n; i++) {
        !          1310:            if ([cmd0 characterAtIndex: i] == END_OUTPUT_CELL) {
        !          1311:              end = i; break;
        !          1312:            }
        !          1313:          }
        !          1314:       if ((start == -1) || (end == -1)) {
        !          1315:            r.location = n; r.length=0;
        !          1316:       }else{
        !          1317:         r.location = start; r.length = end-start+1;
        !          1318:          }
        !          1319:        }
        !          1320:     [textViewIn replaceCharactersInRange: r withString: @""];
        !          1321:
        !          1322:   uu[0] = '\n';
        !          1323:   uu[1] = BEGIN_OUTPUT_CELL; uu[2] = END_OUTPUT_CELL;
        !          1324:   m = 3;
        !          1325:   // If there is no next input cell, add a new one.
        !          1326:   for (i=r.location; i<n; i++) {
        !          1327:     if ([cmd0 characterAtIndex:i] == BEGIN_INPUT_CELL) {
        !          1328:       break;
        !          1329:        }
        !          1330:   }
        !          1331:   if ((i == n) || (r.location >= n)) {
        !          1332:          uu[3] = '\n'; uu[4] = BEGIN_INPUT_CELL; uu[5] = END_INPUT_CELL; m=6;
        !          1333:   }
        !          1334:   // NSLog(@"prepareOutputCell start=%d, length=%d, m=%d\n",start,r.length,m);
        !          1335:   r.length = 0;
        !          1336:   ic = [NSString stringWithCharacters: uu length: m];
        !          1337:   [textViewIn replaceCharactersInRange: r withString: ic];
        !          1338:   r.location = r.location+2; r.length = 0;
        !          1339:   [textViewIn setSelectedRange: r ];
        !          1340: }
        !          1341: @end

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>