This is Main.m in view mode; [Download] [Up]
/* Generated by Interface Builder */
#import "Main.h"
#import <appkit/Text.h>
#import <appkit/Panel.h>
#import <appkit/Window.h>
#import <appkit/ScrollView.h>
#import <appkit/Listener.h>
#import <appkit/Button.h>
#import <appkit/Matrix.h>
#import <appkit/Pasteboard.h>
#import <streams/streams.h>
#import <defaults.h>
#include <sys/file.h>
#include <stdio.h>
#import <libc.h>
#define APPNAME "Notes"
char path[1024] = "";
// The application listener.
id listener;
// Definitions for the default insertion position
#define START 1
#define END 0
// Default insertion position.
int insertPos;
// Has the app been initialized.
int init=0;
// Were we autolaunched?
int justauto=0;
// Should we display the main window?
int shouldshow;
// Have we displayed the main window?
int hasshown = 0;
@implementation Main
/* Intercept termination to write text and defaults.*/
- terminate:sender
{
[self writeText];
[self writePrefs];
return [super terminate:sender];
}
/* If the user logs out, we get these rather than the terminate message.*/
- app:sender powerOffIn:(int)ms andSave:(int)aFlag
{
[self writeText];
return self;
}
- powerOff:(NXEvent *)theEvent
{
[self writeText];
return self;
}
/* Set self as the services handler.*/
- appDidInit:sender
{
listener = [NXApp appListener];
[listener setServicesDelegate:self];
return self;
}
/* Actual initialization, is called every time the application activates.*/
- doinit
{
/* Perform initialization only if this is the first time.*/
if (init==0)
{
/* Register defaults.*/
static NXDefaultsVector Defaults = {
{"InsertPosition", "START"},
{"WindowFrame", "360 350 500 250"},
{"NXAutoLaunch", "NO"},
{NULL}
};
NXRegisterDefaults(APPNAME, Defaults);
/* Get the defaults and the text.*/
[self readPrefs];
[self readText];
/*
Decide if we should display the window.
We don't show if and only if the app has just been autolaunched and the
text is empty.
*/
shouldshow = !(justauto && ([self textlength]==0));
init++;
}
return self;
}
/* The number of characters in the text.*/
- (int)textlength
{
return [text textLength];
}
- (int)activateSelf:(BOOL)flag
{
/* Make sure initialization has been performed.*/
[self doinit];
/*
If we're supposed to display the window, and haven't yet done so, then
display it.
*/
if (shouldshow)
if (!hasshown)
{
[window makeKeyAndOrderFront:self];
hasshown = !hasshown;
}
/*
From now on, we should always bring the window to the front when
activated.
*/
shouldshow = 1;
return [super activateSelf:flag];
}
/* From the menu.*/
- quitNoSave:sender
{
int ok;
/* If the text has been editted, ask for confirmation, otherwise go ahead.*/
if ([window isDocEdited])
ok = NXRunAlertPanel(APPNAME, "Quit without saving text?", "Quit", "Cancel", NULL)==NX_ALERTDEFAULT;
else
ok = 1;
if (ok) [super terminate:sender];
return self;
}
- save:sender
{
[self writeText];
[text becomeFirstResponder];
[text setSel:0:0];
return self;
}
- reload:sender
{
int ok;
/* If the text has been edited, confirm reload, otherwise go ahead.*/
if ([window isDocEdited])
ok = NXRunAlertPanel(APPNAME, "Reload text?\nAny changes will be lost.", "Reload", "Cancel", NULL)==NX_ALERTDEFAULT;
else
ok = 1;
if (ok) [self readText];
return self;
}
- print:sender
{
[text printPSCode:sender];
return self;
}
/* Buttons on the prefs panel.*/
- okPrefs:sender
{
[self takePrefsFromInterface];
[NXApp stopModal];
[prefsPanel orderOut:self];
return self;
}
- revertPrefs:sender
{
[self setPrefsInterface];
return self;
}
- cancelPrefs:sender
{
[NXApp stopModal];
[prefsPanel orderOut:self];
return self;
}
/* Display the prefs panel.*/
- showPrefs:sender
{
[self setPrefsInterface];
[NXApp runModalFor:prefsPanel];
return self;
}
/* Set up the prefs panel according to the current values of the defaults.*/
- setPrefsInterface
{
[enabledSwitch setState:NXIsServicesMenuItemEnabled("Note") ? 1 : 0];
[positions selectCellAt:insertPos:0];
return self;
}
/* Set the new values of the defaults according to the prefs panel.*/
- takePrefsFromInterface
{
NXSetServicesMenuItemEnabled("Note",[enabledSwitch state]);
if ([startSwitch state])
insertPos = START;
else
insertPos = END;
return self;
}
/* Get the defaults.*/
- readPrefs
{
char const *def;
int x,y,h,w;
NXRect frame;
/* Location of the text window.*/
def = NXGetDefaultValue(APPNAME, "WindowFrame");
sscanf(def, "%i %i %i %i", &x, &y, &w, &h);
/* Position the window.*/
frame = (NXRect){{x,y},{w,h}};
[window placeWindow:&frame];
/* Insertion position.*/
def = NXGetDefaultValue(APPNAME, "InsertPosition");
if (strcmp(def, "START")==0)
insertPos = START;
else
insertPos = END;
/* Were we autolaunched?.*/
def = NXGetDefaultValue(APPNAME, "NXAutoLaunch");
justauto = strcmp(def, "YES")==0;
return self;
}
/* Read the text from the file in the user's home dir.*/
- readText
{
int fd;
NXStream *st;
// Find the file in the user's home directory.
sprintf(path, "%s/.Notes", getenv("HOME"));
fd = open(path, O_RDONLY, 0);
if (fd >= 0)
{
if ((st = NXOpenFile(fd, NX_READONLY)) != 0)
{
[text readRichText:st];
[text sizeToFit];
NXClose(st);
}
close(fd);
}
/* Adjust interface.*/
[window setDocEdited:NO];
[text becomeFirstResponder];
[text setSel:0:0];
return self;
}
/* Store the defaults.*/
- writePrefs
{
int x,y,h,w;
NXRect frame;
char def[100];
NXWriteDefault(APPNAME, "InsertPosition",(insertPos==START)?"START":"END");
[window getFrame:&frame];
x = frame.origin.x;
y = frame.origin.y;
w = frame.size.width;
h = frame.size.height;
sprintf(def, "%i %i %i %i", x,y,w,h);
NXWriteDefault(APPNAME, "WindowFrame", def);
return self;
}
/* Write the text into the file in the user's home directory.*/
- writeText
{
int fd;
NXStream *st;
fd = open(path, O_WRONLY | O_CREAT, 0xfff);
if (fd >= 0)
{
if ((st = NXOpenFile(fd, NX_WRITEONLY)) != 0)
{
[text writeRichText:st];
NXClose(st);
}
close(fd);
}
[window setDocEdited:NO];
return self;
}
/* Handle the note service.*/
- note:(id)pb userData:(const char *)udata error:(char **)ermsg
{
int tlength;
NXSelPt start,end;
/* Determine if there is a selection in the text window.*/
[text getSel:&start:&end];
/* If there isn't, so set a selection according to preference.*/
if (start.cp==end.cp || start.cp < 0)
{
if (insertPos==START)
{
[text setSel:0:0];
[text replaceSel:"\n"];
[text setSel:0:0];
}
else
{
tlength = [text textLength];
[text setSel:tlength:tlength];
[text replaceSel:"\n"];
[text setSel:tlength+1:tlength+1];
}
}
/* Now replace the selection with the pasteboard data.*/
[text readSelectionFromPasteboard:pb];
return self;
}
/* Set the close button to edited state.*/
- (BOOL)textWillChange:sender
{
[window setDocEdited:YES];
return NO;
}
/*
Intercept the outlet initialization to find the text object that is the subview of the scolling text, adn set us self as the text's delegate.
*/
- setScroll:anObject
{
scroll = anObject;
text = [scroll docView];
[text setDelegate:self];
[self setDelegate:self];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.