This is Text.m in view mode; [Download] [Up]
/* File: Text.m - (Interactive) Unix shell version of Text
*
* By: Gerben Wierda (gerben@rna.indiv.nluug.nl)
* As inspired by Christopher Lane (lane@sumex-aim.stanford.edu)
*
* Date: 2 may 1993
*
* Modified:
* [17-Feb-96 TRH] Fix for Application option munching (like -NXHost).
* [12-Mar-96 TRH] add -V -H -A options; add EditMenu keyEquiv support.
* [24-Mar-96 TRH] add -m option; handle RTF files.
* (BUG: cannot yet detect RTF piped in from stdin.)
*
* Copyright: 1993,1996 by R&A
*
* This program may be distributed without restriction.
*/
// A very long line to see if everyhting is displayed OK. A very long line to see if everyhting is displayed OK. A very long line to see if everyhting is displayed OK.
#define KEY_EQUIVALENTS \
"terminate:", 'q',
#define USES_APPICON
#define USES_KEYEQUIV
#import "ShellPanel.h"
#define TIMEOUT 30
#define DEFAULTWIDTH 400
#define DEFAULTHEIGHT 400
#define DEFAULTX 150
#define DEFAULTY 750
#define USAGE "\
usage: %s [-F] [-m] [-t title] [-x xpos -y ypos] [-w width -h height] [-T seconds] [-V] [-H] file...\n"
#define HELP "\
options:\n\
-F order front\n\
-m use monospaced (fixed-pitch) font\n\
-t title set title (default: name of file)\n\
-x xpos\n\
-y ypos set origin of window, in screen coordinates (default "STRINGIZE(DEFAULTX)"x"STRINGIZE(DEFAULTY)")\n\
-w width\n\
-h height set size of window, in pixels (default "STRINGIZE(DEFAULTWIDTH)"x"STRINGIZE(DEFAULTHEIGHT)")\n\
-T seconds timeout in seconds, 0 means wait indefinitely (default "STRINGIZE(TIMEOUT)")\n\
-V print version string and exit\n\
-H this help\n\
"
@interface TextApp : Application
{
int windowcount;
}
- initWindow;
- appDidInit:sender;
@end
@implementation TextApp : Application
- initWindow
{
Window *window;
NXRect windowrect;
NXSetRect( &windowrect, DEFAULTX, DEFAULTY,
DEFAULTWIDTH, DEFAULTHEIGHT);
window = [[Window alloc]
initContent: &windowrect
style: NX_RESIZEBARSTYLE
backing: NX_BUFFERED
buttonMask: NX_CLOSEBUTTONMASK
defer: NO];
[window setContentView:[[ScrollView alloc] initFrame:&windowrect]];
[[window contentView] setDocView:[[Text alloc] initFrame:&windowrect]];
++windowcount;
return window;
}
- appDidInit:sender
{
[[self appIcon] orderOut:self];
return self;
}
@end
void timer(DPSTimedEntry teNumber, double now, int status) { exit(status); }
BOOL isRichTextStream(NXStream *stream)
{
static const char magic[] = "{\\rtf0";
char buf[sizeof magic -1];
long n;
/* This isn't really kosher because it knows about NXStream internals,
but we'll use it anyway since it is mentioned in the documentation
(GeneralRef/03_Common/Functions/CommonFunctions.rtf - NXSeek()). */
if (!(stream->flags & NX_CANSEEK)) return NO;
// XXX This also means that we cannot detect piped-in RTF. Sigh...
n = NXRead(stream, buf, sizeof buf);
NXSeek(stream, -n, NX_FROMCURRENT);
return (n == sizeof buf && strncmp(buf, magic, sizeof buf) == 0);
}
void main(int argc, char *argv[])
{
BOOL orderFront = NO;
const char *title = NULL;
double timeout = TIMEOUT;
BOOL monoFont = NO;
const char *iconFile = NULL;
int option, status = EXIT_SUCCESS;
NXPoint topleft = { DEFAULTX, DEFAULTY };
NXSize size = { DEFAULTWIDTH, DEFAULTHEIGHT };
NXApp = [TextApp new];
argc = NXArgc, argv = NXArgv; // Application may munch options.
while ((option = getopt(argc, argv, "Fc:t:x:y:w:h:X:Y:T:i:mVH")) != EOF)
{
switch (option)
{
// XXX What's `c' supposed to be doing?
case 'F': orderFront = YES; break;
case 't': title = optarg; break;
case 'x': topleft.x = atof(optarg); break;
case 'y': topleft.y = atof(optarg); break;
case 'X': // backward compatibility.
case 'w': size.width = atof(optarg); break;
case 'Y': // backward compatibility.
case 'h': size.height = atof(optarg); break;
case 'T': timeout = atol(optarg); break;
case 'm': monoFont = YES; break;
case 'i': iconFile = optarg; break;
case 'V': status = EXIT_VERSION; break;
case 'H': status = EXIT_HELP; break;
default : status = EXIT_USAGE;
}
}
if (optind == argc) status = EXIT_USAGE;
HandleUsageHelpVersion(status, USAGE, HELP);
SetAppIconToFile(iconFile);
ProvideKeyEquivalents();
{
DPSTimedEntry teNumber = NULL;
NXStream *stream = NULL;
id previousWindow = nil;
float xdisplacement = 0.0;
float ydisplacement = 0.0;
if (monoFont)
{
// Use default fixed-pitch font of default size.
[Text setDefaultFont:
[Font userFixedPitchFontOfSize:0 matrix:NX_FLIPPEDMATRIX]];
}
for (; optind < argc; optind++)
{
BOOL isstdin = (strcmp( argv[optind], "-") == 0);
if (stream = (!isstdin ?
NXMapFile( argv[optind], NX_READWRITE) :
NXOpenFile(fileno( stdin), NX_READONLY)))
{
NXRect windowrect, textrect;
id window;
id scrollview;
id text;
// XXX Most of this stuff should be moved to -initWindow...
window = [NXApp initWindow];
[window setDelegate:NXApp];
scrollview = [window contentView];
text = [scrollview docView];
if (title == NULL && !isstdin)
[window setTitleAsFilename:argv[optind]];
else
[window setTitle:(title? title : isstdin ? "<<stdin>>" : "")];
[window displayBorder];
[window setBackgroundGray:NX_LTGRAY];
[window sizeWindow:size.width :size.height];
[window moveTopLeftTo:topleft.x :topleft.y];
if (xdisplacement != 0.0 ||
ydisplacement != 0.0)
{
[window getFrame:&windowrect];
windowrect.origin.x += xdisplacement;
windowrect.origin.y += ydisplacement;
[window moveTo:windowrect.origin.x :windowrect.origin.y];
}
xdisplacement += 18.0;
ydisplacement -= 18.0;
[scrollview setVertScrollerRequired:YES];
[scrollview setHorizScrollerRequired:NO];
[scrollview getContentSize:&textrect.size];
[text setHorizResizable:NO];
[text setVertResizable:YES];
[text setMinSize:&textrect.size];
[text sizeTo:textrect.size.width :textrect.size.height];
[text setOpaque:YES];
[text setEditable:NO];
if (isRichTextStream(stream))
{
[text setMonoFont:NO];
[text readRichText:stream];
}
else
{
[text readText:stream];
[text sizeToFit];
}
if (previousWindow)
{
[window orderWindow:NX_BELOW
relativeTo:[previousWindow windowNum]];
}
else if (orderFront)
{
[window orderFrontRegardless];
}
else
{
[window orderFront:nil];
}
[window display];
if (!isstdin)
NXCloseMemory( stream, NX_FREEBUFFER);
else
NXClose( stream);
previousWindow = window;
}
}
if (timeout)
{
teNumber = DPSAddTimedEntry( timeout,
(DPSTimedEntryProc) &timer,
(void *) EXIT_FAILURE,
NX_BASETHRESHOLD);
}
[NXApp run];
if(timeout) DPSRemoveTimedEntry(teNumber);
}
[NXApp free];
exit(status);
}
@interface TextApp(WindowDelegate)
- windowWillClose:sender;
- windowDidResize:sender;
@end
@implementation TextApp(WindowDelegate)
- windowWillClose:sender
{
if (--windowcount <= 0)
{
[NXApp terminate:nil];
}
return self;
}
- windowDidResize:sender
{
NXRect textrect;
[[sender contentView] getContentSize:&textrect.size];
[[[sender contentView] docView] setMinSize:&textrect.size];
[[[sender contentView] docView]
sizeTo:textrect.size.width :textrect.size.height];
[[[sender contentView] docView] sizeToFit];
// [sender display];
return self;
}
@end
@interface TextApp(TextDelegate)
@end
@implementation TextApp(TextDelegate)
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.