This is Main.m in view mode; [Download] [Up]
/* Copyright 1991 Gustavus Adolphus College. All rights reserved.
*
* Schematik was developed by Gustavus Adolphus College (GAC) with
* support from NeXT Computer, Inc. Permission to copy this software,
* to redistribute it, and to use it for any purpose is granted,
* subject to the following restrictions and understandings.
*
* 1. Any copy made of this software must include this copyright
* notice in full.
*
* 2. Users of this software agree to make their best efforts (a) to
* return to the GAC Mathematics and Computer Science Department any
* improvements or extensions that they make, so that these may be
* included in future releases; and (b) to inform GAC of noteworthy
* uses of this software.
*
* 3. All materials developed as a consequence of the use of this
* software shall duly acknowledge such use, in accordance with the
* usual standards of acknowledging credit in academic research.
*
* 4. GAC makes no express or implied warranty or representation of
* any kind with respect to this software, including any warranty
* that the operation of this software will be error-free. ANY
* IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
* PURPOSE IS HEREBY DISCLAIMED. GAC is under no obligation to
* provide any services, by way of maintenance, update, or otherwise.
*
* 5. In conjunction with products arising from the use of this
* material, there shall be no use of the name of Gustavus Adolphus
* College nor of any adaptation thereof in any advertising,
* promotional, or sales literature without prior written consent
* from GAC in each case.
*/
#import "Main.h"
#import "../defines.h"
#import InfoAgent_h
#import HelpAgent_h
#import PrefAgent_h
#import FindAgent_h
#import InteractionWin_h
#import DocText_h
#import SchemeProtocol_h
#import GraphicsView_h
#import <appkit/FontManager.h>
#import <appkit/Listener.h>
#import <appkit/Speaker.h>
#import <appkit/Matrix.h>
#import <appkit/NXCursor.h>
#import <appkit/OpenPanel.h>
#import <appkit/PrintInfo.h>
#import <appkit/ScrollView.h>
#import <appkit/Text.h>
#import <appkit/publicWraps.h>
#import <dpsclient/wraps.h>
#import <objc/HashTable.h>
#import <objc/List.h>
#import <sys/signal.h>
#import <mach.h>
extern void NXBeep(void);
#define ALTARROWCURSORTIFF "altcursor1"
#define ALTIBEAMCURSORTIFF "altcursor1"
#define ALTCURSORHOTSPOT {7,7}
#define NEW_ROTATENUM 5
static int numDocsOpened=0;
static BOOL terminus=NO;
@implementation Main
+ new
{
DEBUG_FUNC1(DEBUGLEVEL);
self = [super new];
prefAgent = [PrefAgent new];
if ([prefAgent useSpecialCursors])
{
NXPoint p=ALTCURSORHOTSPOT;
NXArrow = [[NXCursor alloc] initFromImage:[[NXImage alloc] initFromSection:ALTARROWCURSORTIFF]];
[NXArrow setHotSpot:&p];
NXIBeam = [[NXCursor alloc] initFromImage:[[NXImage alloc] initFromSection:ALTIBEAMCURSORTIFF]];
[NXIBeam setHotSpot:&p];
}
interactionWindow = [InteractionWin new];
[interactionWindow makeKeyAndOrderFront:self];
protocolObj = [[SchemeProtocol allocFromZone:[self zone]] init];
infoAgent = [InfoAgent new];
helpAgent = [HelpAgent new];
findAgent = [FindAgent new];
[protocolObj showRunState:INPUTSTATE];
[[NXApp printInfo] setOrientation:NX_PORTRAIT andAdjust:YES];
[[NXApp printInfo] setHorizPagination:NX_FITPAGINATION];
[[NXApp printInfo] setHorizCentered:NO];
[[NXApp printInfo] setVertCentered:NO];
[FontManager setFontPanelFactory:[MyFontPanel class]];
graphicsZone = NXCreateZone(vm_page_size, vm_page_size, YES);
graphicsViews = [[HashTable allocFromZone:graphicsZone] initKeyDesc:"i" valueDesc:"@"];
return self;
}
- info:sender
{
DEBUG_FUNC1(DEBUGLEVEL);
return [infoAgent activateAgent:[sender selectedCell]];
}
- help:sender
{
DEBUG_FUNC1(DEBUGLEVEL);
return [helpAgent activateAgent:[sender selectedCell]];
}
- manual:sender
{
DEBUG_FUNC1(DEBUGLEVEL);
return [helpAgent activateAgent:[sender selectedCell]];
}
- preferences:sender
{
DEBUG_FUNC1(DEBUGLEVEL);
return [prefAgent activateAgent:[sender selectedCell]];
}
- newDocument:sender
{
id new=[DocWin new];
NXPoint p,q;
DEBUG_FUNC1(DEBUGLEVEL);
[[prefAgent getDocOrigin:&p] getDocOffset:&q];
[new moveTo:(p.x+q.x*(numDocsOpened%NEW_ROTATENUM)) :(p.y+q.y*(numDocsOpened%NEW_ROTATENUM))];
numDocsOpened++;
return [new makeKeyAndOrderFront:self];
}
- openDocument:sender
{
id new=[DocWin performOpenFromFile:NULL];
NXPoint p,q;
DEBUG_FUNC1(DEBUGLEVEL);
if (new==nil) return self;
[[prefAgent getDocOrigin:&p] getDocOffset:&q];
[new moveTo:(p.x+q.x*(numDocsOpened%NEW_ROTATENUM)) :(p.y+q.y*(numDocsOpened%NEW_ROTATENUM))];
numDocsOpened++;
return [new makeKeyAndOrderFront:self];
}
- find:sender
{
DEBUG_FUNC1(DEBUGLEVEL);
return [findAgent activateAgent:[sender selectedCell]];
}
- findNext:sender
{
DEBUG_FUNC1(DEBUGLEVEL);
return [findAgent findForward:[sender selectedCell]];
}
- findPrevious:sender
{
DEBUG_FUNC1(DEBUGLEVEL);
return [findAgent findBackward:[sender selectedCell]];
}
- evaluate:sender
{
NXSelPt start,end;
char *theSelection;
id text;
DEBUG_FUNC1(DEBUGLEVEL);
text = [[NXApp mainWindow] textView];
if (text==nil) return self;
switch ([[sender selectedCell] tag])
{
case MENU_ACTIONS_Evaluate: if (*(theSelection = [text getSelection]))
[protocolObj send:theSelection];
else
{
[text getSel:&start :&end];
if (![text selectScope])
{
NXBeep();
break;
}
NXPing();
[protocolObj send:(theSelection = [text getSelection])];
if ([[NXApp mainWindow] isMemberOf:[DocWin class]])
[text setSel:start.cp :end.cp];
}
[protocolObj send:"\n"];
if ([prefAgent transcriptMode])
{
[text appendNewlineIfNeeded];
[protocolObj sendOutput:theSelection];
}
break;
case MENU_ACTIONS_EvalAll: [text getSel:&start :&end];
[protocolObj send:(theSelection = [text getAll])];
if ([[NXApp mainWindow] isMemberOf:[DocWin class]])
[text setSel:start.cp :end.cp];
[protocolObj send:"\n"];
if ([prefAgent transcriptMode])
{
[text appendNewlineIfNeeded];
[protocolObj sendOutput:theSelection];
}
break;
}
return self;
}
- abort:sender
{
DEBUG_FUNC1(DEBUGLEVEL);
switch ([[sender selectedCell] tag])
{
case MENU_ACTIONS_AbortTop : [protocolObj sendSignal:SIGNALABORTTOP]; break;
case MENU_ACTIONS_AbortSame : [protocolObj sendSignal:SIGNALABORTSAME]; break;
case MENU_ACTIONS_AbortPrev : [protocolObj sendSignal:SIGNALABORTPREV]; break;
case MENU_ACTIONS_Breakpoint: [protocolObj sendSignal:SIGNALBREAKPOINT]; break;
}
return self;
}
- print:sender
{
DEBUG_FUNC1(DEBUGLEVEL);
return [keyWindow print:sender];
}
- (id)findAgent { return findAgent;}
- (id)helpAgent { return helpAgent;}
- (id)prefAgent { return prefAgent;}
- (id)infoAgent { return infoAgent;}
- (id)interactionWindow { return interactionWindow;}
- (id)protocolObj { return protocolObj;}
- openGraphicsWindow:(unsigned)windowNum width:(unsigned)width height:(unsigned)height
{
NXRect r={{0.0,0.0},{width,height}};
id newGraphics=[[GraphicsView allocFromZone:graphicsZone] initFrame:&r window:windowNum];
DEBUG_FUNC1(DEBUGLEVEL);
if (newGraphics==nil)
return nil;
[graphicsViews insertKey:(const void *)windowNum value:(void *)newGraphics];
return self;
}
- closeGraphicsWindow:(unsigned)windowNum
{
DEBUG_FUNC1(DEBUGLEVEL);
[[(id)[graphicsViews valueForKey:(const void *)windowNum] window] setCloseEnabled];
[graphicsViews removeKey:(const void *)windowNum];
return self;
}
- setGraphicsWindowFlush:(unsigned)windowNum mode:(unsigned)mode
{
DEBUG_FUNC1(DEBUGLEVEL);
[(id)[graphicsViews valueForKey:(const void *)windowNum] setFlushMode:mode];
return self;
}
- printGraphicsWindow:(unsigned)windowNum
{
DEBUG_FUNC1(DEBUGLEVEL);
[(id)[graphicsViews valueForKey:(const void *)windowNum] printPSCode:self];
return self;
}
@end
@implementation Main (Subclass)
- restartSubprocess
{
[[protocolObj terminate:self withPrejudice:YES] free];
protocolObj = [[SchemeProtocol allocFromZone:[self zone]] init];
if (protocolObj==nil)
NXRunAlertPanel(SCHEMEPROCMESSAGE,PROCESSRESTARTBAD,NULL,NULL,NULL);
else
NXRunAlertPanel(SCHEMEPROCMESSAGE,PROCESSRESTARTOK,NULL,NULL,NULL);
return self;
}
- sendEvent:(NXEvent *)theEvent
{
if ((theEvent->type==NX_KEYDOWN)&&(theEvent->data.key.keyCode==73)&&(theEvent->flags&NX_NEXTCTRLKEYMASK)&&(theEvent->flags&NX_NEXTLALTKEYMASK))
[self restartSubprocess];
return [super sendEvent:theEvent];
}
@end
@implementation Main (Delegate)
- (BOOL)appAcceptsAnotherFile:sender
{
DEBUG_FUNC1(DEBUGLEVEL);
return YES;
}
- (BOOL)app:sender openFile:(const char *)file type:(const char *)aType
{
id new;
NXPoint p,q;
DEBUG_FUNC1(DEBUGLEVEL);
if (!file||((new=[DocWin performOpenFromFile:(char *)file])==nil))
return NO;
[[prefAgent getDocOrigin:&p] getDocOffset:&q];
[new moveTo:(p.x+q.x*(numDocsOpened%NEW_ROTATENUM)) :(p.y+q.y*(numDocsOpened%NEW_ROTATENUM))];
numDocsOpened++;
[new makeKeyAndOrderFront:self];
return YES;
}
- _saveUnsaved
{
id *clist=NX_ADDRESS(windowList);
id docwins=[DocWin class];
int i;
for(i=[windowList count]; i--;)
if ([clist[i] isDocEdited]&&[clist[i] isMemberOf:docwins])
{
switch (NXRunAlertPanel(QUITALERTTITLE, QUITALERTMESSAGE, QUITALERTDEFAULT, QUITALERTALTERNATE, QUITALERTOTHER))
{
case NX_ALERTOTHER : return nil;
case NX_ALERTDEFAULT : clist=NX_ADDRESS(windowList);
for(i=[windowList count]; i--;)
if ([clist[i] isMemberOf:docwins]&&![[clist[i] makeKeyAndOrderFront:self] performClose:self])
return nil;
}
break;
}
if ([interactionWindow isDocEdited]&&(i<0))
[interactionWindow makeKeyAndOrderFront:self];
switch (NXRunAlertPanel(QUITALERTTITLE, QUITALERTMESSAGE2, SAVEALERTDEFAULT, SAVEALERTALTERNATE, SAVEALERTOTHER))
{
case NX_ALERTOTHER : return nil;
case NX_ALERTDEFAULT: [interactionWindow performSave:self];
}
return self;
}
- app:sender powerOffIn:(int)ms andSave:(int)anInt
{
port_t port=NXPortFromName(NX_WORKSPACEREQUEST, NULL);
int actual;
if ((port!=PORT_NULL)&&[prefAgent confirmOnQuit])
{
[appSpeaker setSendPort:port];
if (![appSpeaker extendPowerOffBy:600000 actual:&actual])
{
BOOL confirm = [prefAgent confirmOnClose];
terminus = YES;
if (!confirm)
[prefAgent setConfirmOnClose:YES];
[self _saveUnsaved];
if (!confirm)
[prefAgent setConfirmOnClose:NO];
}
}
[protocolObj terminate:self withPrejudice:YES];
return self;
}
- appWillTerminate:sender
{
BOOL confirm = [prefAgent confirmOnClose];
if (!confirm)
[prefAgent setConfirmOnClose:YES];
if ([prefAgent confirmOnQuit]&&([self _saveUnsaved]==nil))
{
if (!confirm)
[prefAgent setConfirmOnClose:NO];
return nil;
}
terminus = YES;
[protocolObj terminate:self withPrejudice:YES];
return self;
}
@end
@implementation MyFontPanel
+ newContent:(const NXRect *)contentRect style:(int)aStyle backing:(int)bufferingType buttonMask:(int)mask defer:(BOOL)flag
{
int i;
DEBUG_FUNC1(DEBUGLEVEL);
self = [super newContent:contentRect style:aStyle backing:bufferingType buttonMask:mask defer:flag];
for(i=([families cellCount]-1); i>=0; i--)
if (NXOrderStrings((unsigned char *)[[families cellAt:i :0] stringValue], (unsigned char *)GOODFONT1, YES, -1, NULL)
&&NXOrderStrings((unsigned char *)[[families cellAt:i :0] stringValue], (unsigned char *)GOODFONT2, YES, -1, NULL))
[families removeRowAt:i andFree:YES];
[families sizeToCells];
selFont = [[[NXApp mainWindow] textView] font];
selMetrics = [selFont metrics];
return self;
}
@end
@implementation Window (PrintingExt)
- print:sender
{
id keyWindow = [NXApp keyWindow];
if ([[keyWindow contentView] hasSubviewOfKind:[GraphicsView class]])
[[[keyWindow contentView] docView] printPSCode:self];
else if ([[keyWindow contentView] hasSubviewOfKind:[ScrollView class]])
{
if (!NXOrderStrings((unsigned char *)[keyWindow title],(unsigned char *)LICENSEPANELTITLE,YES,-1,NULL))
[[[[[keyWindow contentView] subviews] objectAt:0] docView] printPSCode:self];
else if (!NXOrderStrings((unsigned char *)[keyWindow title],(unsigned char *)HELPPANELTITLE,YES,-1,NULL))
[[[[keyWindow delegate] helpScrollView] docView] printPSCode:self];
}
return self;
}
@end
@implementation View (PrintingExt)
- (BOOL)hasSubviewOfKind:aClass
{
int i;
if ([self isKindOf:aClass])
return YES;
else if ([self subviews]==nil)
return NO;
else
for(i=0; i<[subviews count]; i++)
if ([[subviews objectAt:i] hasSubviewOfKind:aClass])
return YES;
return NO;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.