This is MainController.m in view mode; [Download] [Up]
/* (c) 1992 Dirk Schwarzhans, Matthias Braun
Use under the terms of the GNU General Public License */
#import "MainController.h"
#import "pageNumber.h"
#import "VTFontInit.h"
#import <appkit/Application.h>
#import <appkit/Pasteboard.h>
#import <appkit/PrintInfo.h>
#import <appkit/nextstd.h>
#import <string.h>
@implementation MainController
- init
{
[super init];
inspector = nil;
activeContainer = nil;
windowList = [[HashTable alloc] initKeyDesc:@encode(Window *)
valueDesc:@encode(WindowContainer *)];
return self;
}
- free
{
[windowList free];
[savePanel free];
return [super free];
}
//********************
// interne Methoden
//********************
- windowServices:(BOOL)mode
{
[inspector setEnabled:mode];
// [menuSave setEnabled:mode];
// [menuSaveAs setEnabled:mode];
[menuSaveEPS setEnabled:mode];
[menuClose setEnabled:mode];
[menuCut setEnabled:mode];
[menuCopy setEnabled:mode];
[menuPaste setEnabled:mode];
[menuCopyEPS setEnabled:mode];
[menuSelectAll setEnabled:mode];
[menuPrint setEnabled:mode];
return self;
}
- (Window *)createNewWindow
{
Window *window;
VideoTextView *view;
NXRect rect;
if (activeContainer)
{
[[activeContainer window] getFrame:&rect];
activeContainer = [[WindowContainer alloc] init];
window = [activeContainer window];
[window moveTo:rect.origin.x + 20.0 :rect.origin.y - 20.0];
}
else
{
activeContainer = [[WindowContainer alloc] init];
window = [activeContainer window];
}
view = [activeContainer view];
[view setFontSize:25];
[view display];
[view setDelegate:self];
[windowList insertKey:window value:activeContainer];
[window setDelegate:self];
[window makeKeyAndOrderFront:self];
[inspector inspectView:view];
if ([windowList count] == 1)
[self windowServices:YES];
[pageSupplier setMainWindow:window];
return window;
}
// ****************************************************************
// Hier folgen die Methoden, die durch Menöpunkte aufgerufen werden
// ****************************************************************
- inspectorRequested:sender
{
BOOL mode;
mode = ([windowList count] != 0);
if (inspector == nil)
{
inspector = [[Inspector alloc] initAndEnable:mode];
if (activeContainer != nil)
[inspector inspectView:[activeContainer view]];
[inspector setDelegate:self];
}
else
[inspector makeKeyAndOrderFront:self];
return self;
}
- openNewWindow:sender
{
[self requestPage:100 subpage:0 forWindow:[self createNewWindow]];
return self;
}
- createEPSFile:sender
{
NXStream *stream;
NXRect rect;
VideoTextView *view;
tag = [pageSupplier holdPage:YES];
[savePanel setRequiredFileType:"eps"];
if([savePanel runModalForDirectory:NULL file:NULL])
{
stream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
view = [activeContainer view];
[view getBounds:&rect];
[view copyPSCodeInside:&rect to:stream];
NXSaveToFile(stream, [savePanel filename]);
NXCloseMemory(stream, NX_FREEBUFFER);
}
tag = [pageSupplier holdPage:[activeContainer isHeld]];
return self;
}
- copyAsEPS:sender
{
const char *types[] = {NXPostScriptPboardType, NULL};
tag = [pageSupplier holdPage:YES];
[[activeContainer view] writeSelectionToPasteboard:[Pasteboard new] types:types];
tag = [pageSupplier holdPage:[activeContainer isHeld]];
return self;
}
- print:sender
{
tag = [pageSupplier holdPage:YES];
[[activeContainer view] printPSCode:self];
tag = [pageSupplier holdPage:[activeContainer isHeld]];
return self;
}
- openTimePanel:sender
{
[timePanel setDelegate:self];
[timePanel makeKeyAndOrderFront:sender];
[pageSupplier requestClockMessages:YES];
return self;
}
// *****************************************
// Methoden als 'delegate' von VideoTextView
// *****************************************
- requestPage:(int)pageInt subpage:(int)subpageInt forWindow:(Window *)window
{
VTPageNumber page;
VTSubpageNumber subpage;
char title[100];
if (window == nil)
window = [self createNewWindow];
[inspector setRequestPage:pageInt];
[inspector setRequestSubpage:subpageInt];
if (subpageInt == 0)
[inspector setCareSubpage:NO];
else
[inspector setCareSubpage:YES];
VTNumbersFromInt(&page, &subpage, pageInt, subpageInt);
if (subpageInt != 0)
{
sprintf(title, "Video-TeXT: %03d.%04d wird gesucht", pageInt, subpageInt);
tag = [pageSupplier pageRequest:page subpage:subpage];
}
else
{
sprintf(title, "Video-TeXT: %03d wird gesucht", pageInt);
tag = [pageSupplier pageRequest:page];
}
[window setTitle:title];
[inspector setHoldPageSwitch:NO];
[activeContainer setHeld:NO];
return self;
}
- dontDisturb:(BOOL)mode
{
tag = [pageSupplier holdPage:mode];
[activeContainer setHeld:mode];
[inspector setHoldPageSwitch:mode];
return self;
}
// *************************************
// Methoden als 'delegate' von Inspector
// *************************************
- subpageBrowse:(int)direction
{
VTSubpageNumber subpage;
if (direction > 0)
tag = [pageSupplier nextSubpage:&subpage];
else
tag = [pageSupplier previousSubpage:&subpage];
[inspector setCareSubpage:YES];
[inspector setRequestSubpage:intFromVTSubpageNumber(subpage)];
return self;
}
- clearPageMemoryRequested
{
tag = [pageSupplier forgetAll];
[activeContainer setHeld:NO];
[inspector setHoldPageSwitch:NO];
[self requestPage:100 subpage:0 forWindow:[activeContainer window]];
return self;
}
- holdPage:(BOOL)mode;
{
tag = [pageSupplier holdPage:mode];
[activeContainer setHeld:mode];
return self;
}
- setIVTRegisters:(unsigned char)mode :(unsigned char)normDispCtrl
:(unsigned char)newsDispCtrl :(unsigned char)dispMode
{
[pageSupplier writeModeRegister:mode];
[pageSupplier writeDisplayControlRegisters:normDispCtrl :newsDispCtrl];
[pageSupplier writeDisplayModeRegister:dispMode];
return self;
}
// ****************************************
// Methoden als 'delegate' von Listener
// ****************************************
-(int)updateClock:(char *)time size:(int)bytes return:(int *)dummy
{
*dummy = 0;
[timeText setStringValue:time];
return 0;
}
-(int)updateRollingHeader:(char *)pageNumber size:(int)bytes return:(int *)dummy
{
*dummy = 0;
[inspector setIncomingPage:pageNumber];
return 0;
}
-(int)updatePageData:(char *)pageInfo size:(int)bytes return:(int *)dummy
{
VTPageNumber pageNumber;
VTSubpageNumber subpageNumber;
PagePacket *packet;
WindowContainer *container;
char title[100], number[5];
*dummy = 0;
packet = (PagePacket *)pageInfo;
if (packet->tag == tag)
{
container = [windowList valueForKey:packet->window];
[[container view] setPageData:packet->data];
strcpy(title,"Video-TeXT: ");
VTNumbersFromPageData(&pageNumber, &subpageNumber, packet->data);
stringFromVTPageNumber(number, pageNumber);
strcat(title, number);
strcat(title, ".");
stringFromVTsubpageNumber(number, subpageNumber);
strcat(title, number);
[packet->window setTitle:title];
}
return 0;
}
-(int)printError : (char *) message
{
NXLogError(message);
return 0;
}
// **********************************
// Methoden als 'delegate' von Window
// **********************************
- windowWillClose:sender
{
if (sender == timePanel)
{
[pageSupplier requestClockMessages:NO];
return self;
}
activeContainer = nil;
[windowList removeKey:sender];
if ([windowList count] == 0)
[self windowServices:NO];
tag = [pageSupplier windowClosed:sender];
return self;
}
- windowDidBecomeMain:sender
{
activeContainer = (WindowContainer *)[windowList valueForKey:sender];
[inspector inspectView:[activeContainer view]];
[inspector setHoldPageSwitch:[activeContainer isHeld]];
tag = [pageSupplier setMainWindow:sender];
return self;
}
// ***************************************
// Methoden als 'delegate' von Application
// ***************************************
- appDidInit:sender
{
PrintInfo *info;
const char * const sendTypes[] = {NXAsciiPboardType, NXPostScriptPboardType, NULL};
// bevorzugte Parameter för das Drucken einstellen
info = [NXApp printInfo];
[info setOrientation:NX_LANDSCAPE andAdjust:YES];
[info setMarginLeft:57 right:57 top:35 bottom:20];
[info setVertPagination:NX_FITPAGINATION];
[info setHorizPagination:NX_FITPAGINATION];
// Video-Text-ZeichensŮtze definieren
PSWVTFont1Init(); // Der PostScript-Kontext ist global för die Applikation...
PSWVTFont2Init(); // ...deshalb gelten diese Definitionen för alle Views.
listener = [[VTListener alloc] init];
[listener usePrivatePort];
[listener setDelegate:self];
[listener setPriority:NX_MODALRESPTHRESHOLD];
[listener addPort];
if ((pageSupplier = [[PageSupplier alloc] initPort:[listener listenPort]]) == nil)
[NXApp terminate:self];
tag = 0;
savePanel = [SavePanel new];
[NXApp registerServicesMenuSendTypes:sendTypes andReturnTypes:NULL];
[self requestPage:100 subpage:0 forWindow:[self createNewWindow]];
[self inspectorRequested:self];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.