This is HelpAgent.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 "HelpAgent.h"
#import "../defines.h"
#import Main_h
#import PrefAgent_h
#import <appkit/NXBrowser.h>
#import <appkit/NXBrowserCell.h>
#import <appkit/ScrollView.h>
#import <appkit/Text.h>
#import <sys/dir.h>
#import <fcntl.h>
#import <libc.h>
#import <mach.h>
#import <string.h>
#define NIBFILE1 "Help.nib"
#define NIBFILE2 "Manual.nib"
#define HELPZONENAME "HelpAgnt"
#define MINHELPWINDOWHEIGHT 95
#define MINHELPWINDOWWIDTH 400
#define MINMANWINDOWHEIGHT 130
#define MINMANWINDOWWIDTH 550
#define MANUALPANELTITLE LocalString("Scheme 7.1 Reference Manual",NULL)
#define MANUALBROWSERTITLE LocalString("Page",NULL)
#define ENTRYFORMTITLE LocalString("Search for Entry:",NULL)
#define SEARCHBUTTONTITLE LocalString("Search",NULL)
static char **addFile(const char *, char **, int);
static int compare(void *, void *);
static NXZone *helpZone=NULL;
static char **topics=NULL;
static id theAgent=nil;
@implementation HelpAgent
+ new
{
DEBUG_FUNC1(DEBUGLEVEL);
if (theAgent==nil)
{
NXZone *tempZone;
tempZone = NXCreateZone(vm_page_size, vm_page_size, YES);
DEBUG_ASSERT(tempZone!=NULL)
theAgent = self = [super allocFromZone:tempZone];
helpZone = agentZone = tempZone;
NXNameZone(agentZone, HELPZONENAME);
}
return theAgent;
}
- activateAgent:sender
{
DEBUG_FUNC1(DEBUGLEVEL);
switch ([sender tag])
{
case MENU_INFO_Help : if (!helpPanel)
{
helpPanel = LoadNIB(NIBFILE1, theAgent, agentZone);
DEBUG_ASSERT(helpPanel!=nil)
[helpPanel useOptimizedDrawing:YES];
[helpPanel setTitle:HELPPANELTITLE];
[topicsBrowser setTitle:HELPBROWSERTITLE ofColumn:BROWSERCOLUMN];
[topicsBrowser loadColumnZero];
DEBUG_ASSERT([topicsBrowser isLoaded])
}
[helpPanel makeKeyAndOrderFront:self];
break;
case MENU_INFO_Manual: if (!manualPanel)
{
manualPanel = LoadNIB(NIBFILE2, theAgent, agentZone);
DEBUG_ASSERT(manualPanel!=nil)
[manualPanel useOptimizedDrawing:YES];
#if 0
[manualPanel setTitle:MANUALPANELTITLE];
[pageBrowser setTitle:MANUALBROWSERTITLE ofColumn:BROWSERCOLUMN];
[pageBrowser setDoubleAction:@selector(manualBrowserDoubleClick:)];
[entryField setTitle:ENTRYFORMTITLE at:0];
[[entryField target] setTitle:SEARCHBUTTONTITLE];
[pageBrowser loadColumnZero];
DEBUG_ASSERT([pageBrowser isLoaded])
#endif
}
[manualPanel makeKeyAndOrderFront:self];
}
return self;
}
- helpBrowserClick:sender
{
extern char *appDirectory;
const char *topic=[[[sender matrixInColumn:BROWSERCOLUMN] selectedCell] stringValue];
DEBUG_FUNC1(DEBUGLEVEL);
if ((topic!=NULL)&&(*topic))
{
NXStream *stream;
char helpFile[strlen(appDirectory)+strlen(topic)+strlen(FILENAMETEMPLATE)+strlen(NOHELPFILE)];
sprintf(helpFile, FILENAMETEMPLATE, appDirectory, topic);
if (!(stream = NXMapFile(helpFile, NX_READONLY)))
{
sprintf(helpFile, FILENAMETEMPLATE, appDirectory, NOHELPFILE);
stream = NXMapFile(helpFile, NX_READONLY);
}
if (stream)
{
[helpPanel disableFlushWindow];
[[helpScrollView docView] readRichText:stream];
[[helpScrollView docView] scrollSelToVisible];
[[helpPanel reenableFlushWindow] flushWindow];
NXCloseMemory(stream, NX_FREEBUFFER);
}
}
return self;
}
#if 0
- manualBrowserClick:sender
{
return self;
}
- manualBrowserDoubleClick:sender;
{
const char *label=[[[sender matrixInColumn:BROWSERCOLUMN] selectedCell] stringValue];
return self;
}
#endif
- (id)helpScrollView { return helpScrollView;}
@end
@implementation HelpAgent (HelpBrowserDelegate)
- (int)browser:sender fillMatrix:matrix inColumn:(int)column
{
extern char *appDirectory;
char helpDirectory[strlen(appDirectory)+strlen(HELPDIR)];
int fd,count=0;
char **list=NULL;
DEBUG_FUNC1(DEBUGLEVEL);
sprintf(helpDirectory, HELPDIR, appDirectory);
if ((fd = open(helpDirectory, O_RDONLY, 0644))>0)
{
long basep;
char dirbuf[vm_page_size],*buf;
struct direct *dp;
int cc=getdirentries(fd, (buf = dirbuf), vm_page_size, &basep);
while (cc)
{
dp = (struct direct *)buf;
if ((dp->d_name[0])&&(dp->d_name[0]!='.'))
list = addFile(dp->d_name, list, count++);
buf += dp->d_reclen;
if (buf>=dirbuf+cc)
cc = getdirentries(fd, (buf = dirbuf), vm_page_size, &basep);
}
close(fd);
if (list)
qsort(list, count, sizeof(char *), compare);
}
if (topics)
{
int i;
for(i=0; topics[i]; i++)
NXZoneFree(agentZone, topics[i]);
NXZoneFree(agentZone, topics);
}
topics = list;
return count;
}
- browser:sender loadCell:aCell atRow:(int)row inColumn:(int)column
{
DEBUG_FUNC1(DEBUGLEVEL);
if (topics)
{
[aCell setStringValueNoCopy:topics[row]];
DEBUG_ASSERT(!NXOrderStrings((unsigned char *)[aCell stringValue], (unsigned char *)topics[row], YES, -1, NULL))
[aCell setLeaf:YES];
[aCell setLoaded:YES];
}
return self;
}
@end
@implementation HelpAgent (Delegate)
- windowWillResize:sender toSize:(NXSize *)frameSize
{
DEBUG_FUNC1(DEBUGLEVEL);
if ([sender isEqual:helpPanel])
{
if (frameSize->width<MINHELPWINDOWWIDTH)
frameSize->width = MINHELPWINDOWWIDTH;
if (frameSize->height<MINHELPWINDOWHEIGHT)
frameSize->height = MINHELPWINDOWHEIGHT;
}
else if ([sender isEqual:manualPanel])
{
if (frameSize->width<MINMANWINDOWWIDTH)
frameSize->width = MINMANWINDOWWIDTH;
if (frameSize->height<MINMANWINDOWHEIGHT)
frameSize->height = MINMANWINDOWHEIGHT;
}
return self;
}
- windowWillClose:sender
{
DEBUG_FUNC1(DEBUGLEVEL);
if ([sender isEqual:helpPanel])
helpPanel = nil;
else if ([sender isEqual:manualPanel])
manualPanel = nil;
return self;
}
@end
#define CHUNK 3
static char **addFile(const char *file, char **list, int count)
{
char *suffix;
if (!list)
list = (char **)NXZoneMalloc(helpZone, CHUNK*sizeof(char *));
DEBUG_ASSERT(list!=NULL)
if (suffix = rindex(file, '.'))
*suffix = '\0';
list[count] = NXCopyStringBufferFromZone(file, helpZone);
DEBUG_ASSERT(list[count]!=NULL)
count++;
if (!(count%CHUNK))
list = (char **)NXZoneRealloc(helpZone, list, (count+CHUNK)*sizeof(char *));
DEBUG_ASSERT(list!=NULL)
list[count] = NULL;
return list;
}
static int compare(void *arg1, void *arg2)
{
return NXOrderStrings(*((unsigned char **)arg1), *((unsigned char **)arg2), NO, -1, NULL);
}
@implementation ManualView
- initFrame:(NXRect *)aRect
{
return self;
}
- drawSelf:(const NXRect *)rects :(int)rectCount
{
return self;
}
- displayPage:(unsigned)aPage at:(int)aLocation
{
return self;
}
- generateIndex
{
return self;
}
@end
@implementation ManualView (PageBrowserDelegate)
#if 0
- (int)browser:sender fillMatrix:matrix inColumn:(int)column
{
int count;
id aCell;
DEBUG_FUNC1(DEBUGLEVEL);
for(count=0; count<[entryIndexList count]; count++)
{
[matrix addRow];
aCell = [matrix cellAt:count :0];
[aCell setStringValue:[[entryIndexList objectAt:count] entry]];
[aCell setLeaf:YES];
[aCell setLoaded:YES];
}
return count+1;
}
#endif
@end
@implementation ManualEntry
- init:(char *)anEntry page:(short)aPage line:(int)aLine label:(char *)aLabel x:(short)x y:(short)y
{
[super init];
entryName = NXCopyStringBuffer(anEntry);
absPage = aPage;
pageStartLine = aLine;
pageLabel = NXCopyStringBuffer(aLabel);
xPos = x;
yPos = y;
return self;
}
- (char *)entry { return entryName;}
- (char *)pageLabel; { return pageLabel;}
- (short)absolutePage; { return absPage;}
- (int)pageStartLine { return pageStartLine;}
- (short)xPosition; { return xPos;}
- (short)yPosition; { return yPos;}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.