This is IcaoController.m in view mode; [Download] [Up]
#include <sys/types.h>
#include <ansi/ctype.h>
#include <bsd/pwd.h>
#import "IcaoController.h"
#import <appkit/appkit.h>
#import "IcaoDefinitions.h"
#import "IcaoObjects.h"
#import "mapdraw.h"
#import "MapController.h"
#import "PrefController.h"
#import "MarginPageLayout.h"
#import "MailSpeaker.h"
@implementation IcaoController
+ initialize
{
static NXDefaultsVector IcaoDefaults =
{{IPD_RUNWAYUNIT, "2"},
{IPD_ELEVATIONUNIT, "1"},
{IPD_RANGEUNIT, "4"},
{IPD_AUTOLAUNCH, "0"},
{IPD_ONSTARTUP, "1"},
{IPD_STARTUPFILE, "/foo.iwp"},
{IPD_ONLOADING, "1"},
{IPD_PROJECTIONTYPE, "1"},
{IPD_OPTIMIZEMONO, "1"},
{IPD_RUBBERUNIT, "4"},
{IPD_AUTOUNIT, "4"},
{IPD_AUTOROUTE, "104 44 385 276 0 0 956 768 "},
{IPD_SUGGESTUNIT, "3"},
{NULL, NULL}};
NXRegisterDefaults(APPNAME, IcaoDefaults);
return self;
}
- (BOOL)setPort
{
/* Should call this before any remote message to make sure Mail.app is
/ running and mailSpeaker 's port is current. Get named port ' Mail '.
/ This will launch Mail.app if not already.Get named port 'MailSendDemo'
/ (this is the one we will actually talk to).Set mailSpeaker 's port to be this one.
*/
port_t mailPort = NXPortFromName("Mail", NULL);
if (mailPort == PORT_NULL)
{
(NXRunAlertPanel("Accessing Mail", "Unable to connect to Mail.app",
NULL, NULL, NULL));
return NO;
}
mailPort = NXPortFromName("MailSendDemo", NULL);
if (mailPort == PORT_NULL)
{
(NXRunAlertPanel("Accessing Mail", "Unable to connect to Mail.app",
NULL, NULL, NULL));
return NO;
}
[mailSpeaker setSendPort:mailPort];
return YES;
}
- (const char *)user
{
static char *username = (char *)0;
struct passwd *pwdentry;
static char ubuf[128];
char *pc;
pwdentry = getpwnam(NXUserName());
username = ((pwdentry) ? pwdentry->pw_gecos : "");
/*
* extended GECOS field handling, Detlev Droege,
* droege@informatik.uni-koblenz.de, December 1991
*/
if (pc = index(username, ','))
*pc = 0; /* strip ','-part of gecos field, clobbers
* pw_gecos !! */
if (index(username, '&'))
{
/* do '&' expansion */
pc = ubuf;
while (*username)
{
if (*username == '&')
{
strcpy(pc, pwdentry->pw_name);
*pc = toupper(*pc);
while (*pc)
pc++; /* == pc += strlen(..->pw_name) */
}
else
*pc++ = *username;
username++;
}
*pc = 0;
username = ubuf;
}
return (const char *)username;
}
- routeAdjust
{
return routeAdjust;
}
- (BOOL)menuActive:menuCell
{
BOOL shouldBeEnabled;
shouldBeEnabled = [[[NXApp mainWindow] delegate]
isKindOf:[MapController class]];
if ([menuCell isEnabled] != shouldBeEnabled)
{
/*
* Menu cell is either enabled and shouldn't be, or it is not enabled and
* should be. In any event, set the correct state.
*/
[menuCell setEnabled:shouldBeEnabled];
return YES; /* redisplay */
}
return NO; /* no change */
}
- (BOOL)switchAutorouteMenu:menuCell
{
BOOL shouldBeEnabled;
shouldBeEnabled = [[[NXApp mainWindow] delegate]
isKindOf:[MapController class]];
if (shouldBeEnabled)
shouldBeEnabled = [[[NXApp mainWindow] delegate] canAutoroute];
if ([menuCell isEnabled] != shouldBeEnabled)
{
/*
* Menu cell is either enabled and shouldn't be, or it is not enabled and
* should be. In any event, set the correct state.
*/
[menuCell setEnabled:shouldBeEnabled];
return YES; /* redisplay */
}
return NO; /* no change */
}
- showPreferencesPanel:sender
{
if (!prefPanel)
{
if ([NXApp loadNibSection:"Preferences.nib" owner:self] == nil)
return nil;
}
[prefPanel makeKeyAndOrderFront:sender];
return self;
}
- showInfoPanel:sender
{
if (!infoPanel)
{
if ([NXApp loadNibSection:"Info.nib" owner:self] == nil)
return nil;
}
[self updateInfoPanel];
[infoPanel makeKeyAndOrderFront:sender];
return self;
}
- updateInfoPanel;
{
char infoText[256];
if (infoPanel)
{
sprintf(infoText, NXLS("Currently %i objects in database,\nof which %i are currently visible."), objectno + 1, db_visible);
[howManyObjects setStringValue:infoText];
}
return self;
}
- mapChanged:sender;
{
//[[[mapWindow delegate] displayButton] setEnabled:NO];
[self updateInfoPanel];
return self;
}
- showLegalPanel:sender
{
if (!legalPanel)
if ([NXApp loadNibSection:"Legal.nib" owner:self] == nil)
return nil;
[legalPanel makeKeyAndOrderFront:sender];
return self;
}
- sendComments:sender
{
char body[4096];
int winNum;
if ([self setPort])
{
sprintf(body, (const char *)NXLS("msg_comments"), VERSION,[self user]);
[mailSpeaker openSend:&winNum];
[mailSpeaker setTo:NXLS("to_address") inWindow :winNum];
[mailSpeaker setCc:NXLS("cc_address") inWindow :winNum];
[mailSpeaker setSubject:NXLS("msg_icaocom") inWindow :winNum];
[mailSpeaker setBody:(const char *)body inWindow:winNum];
}
return self;
}
- openMapWindow:sender
{
id openPanel;
char *types[3] = {"worldpart", "iwp", NULL};
openPanel = [OpenPanel new];
[openPanel allowMultipleFiles:NO];
[openPanel chooseDirectories:NO];
if ([openPanel runModalForTypes:types])
{
[self openMapWindowFromFile:[openPanel filename]];
if (mapWindow)
[mapWindow makeKeyAndOrderFront:self];
}
return self;
}
- openMapWindowFromFile:(const char *)filename
{
if ([NXApp loadNibSection:"MapWindow.nib" owner:self] == nil)
return nil;
if ([[mapWindow delegate] setupFromFile:filename])
{
[mapWindow setTitleAsFilename:filename];
}
else
{
[mapWindow performClose:self];
mapWindow = nil;
}
return self;
}
@end
@implementation IcaoController(ApplicationDelegate)
- appDidInit:sender
{
id toolsMenu = [toolsSubmenuCell target];
int val;
const char *name;
int sendIt = NO;
/* Setting the AutoUpdate Messages for the MenuCells */
[printCell setUpdateAction:@selector(menuActive:) forMenu :[NXApp mainMenu]];
[visibleObjectsCell setUpdateAction:@selector(menuActive:)
forMenu :toolsMenu];
[autoRouterCell setUpdateAction:@selector(switchAutorouteMenu:)
forMenu :toolsMenu];
[suggestTriangleCell setUpdateAction:@selector(menuActive:)
forMenu :toolsMenu];
[NXApp setAutoupdate:YES];
[NXApp loadNibSection:"PageLayoutAccessory.nib"
owner:[MarginPageLayout new]];
val = atoi(NXGetDefaultValue(APPNAME, IPD_ONSTARTUP));
switch (val)
{
case 1:
name = NXGetDefaultValue(APPNAME, IPD_STARTUPFILE);
if (name)
[self openMapWindowFromFile:name];
break;
case 2:
break;
}
[[PrintPanel new] setAccessoryView:routeAdjust];
/* Set routeAdjust to the PopupButton */
routeAdjust = [[[[[[routeAdjust contentView] subviews] objectAt:0]
contentView] subviews] objectAt:0];
if (!strcmp(NXGetDefaultValue([NXApp appName], "NXAutoLaunch"), "YES")
&& atoi(NXGetDefaultValue(APPNAME, IPD_AUTOLAUNCH)))
[NXApp hide:self];
else
if (mapWindow)
[mapWindow makeKeyAndOrderFront:self];
if (!(NXGetDefaultValue(APPNAME, IPD_NEWUSER)))
{
if (!NXReadDefault("Icao", "Default Mapfile"))
{
switch (NXRunAlertPanel(MSG_TITLE, MSG_INFO, MSG_OK, MSG_NOTYET, MSG_NO))
{
case NX_ALERTDEFAULT:
sendIt = YES;
case NX_ALERTOTHER:
NXWriteDefault(APPNAME, IPD_NEWUSER, VERSION);
break;
case NX_ALERTALTERNATE:
NXWriteDefault(APPNAME, IPD_NEWUSER, KIND_OF);
break;
}
}
else /* this is for the 0.6 to 0.7 update only. */
{
switch (NXRunAlertPanel(MSG_TITLE, MSG_UPDATE, NXLS("Yes"), NXLS("No"), NULL
,0.6, VERSION, NXLS("new_in_0.7")))
{
case NX_ALERTDEFAULT:
sendIt = YES;
case NX_ALERTALTERNATE:
NXWriteDefault(APPNAME, IPD_NEWUSER, VERSION);
break;
}
}
}
else
{
if (strcmp(NXGetDefaultValue(APPNAME, IPD_NEWUSER), KIND_OF) == 0)
{
switch (NXRunAlertPanel(MSG_TITLE, MSG_LATER, NXLS("Yes"), NXLS("No"), NULL))
{
case NX_ALERTDEFAULT:
sendIt = YES;
case NX_ALERTALTERNATE:
NXWriteDefault(APPNAME, IPD_NEWUSER, VERSION);
break;
}
}
else /* general update... to be rewritten. */
{
float former_version = atof(NXGetDefaultValue(APPNAME, IPD_NEWUSER));
if (former_version < (float)atof(VERSION))
{
switch (NXRunAlertPanel(MSG_TITLE, MSG_UPDATE, NXLS("Yes"), NXLS("No"), NULL
,former_version, VERSION, NXLS("new_in_0.7")))
{
case NX_ALERTDEFAULT:
sendIt = YES;
case NX_ALERTALTERNATE:
NXWriteDefault(APPNAME, IPD_NEWUSER, VERSION);
break;
}
}
}
}
if (sendIt)
{
char body[4096];
int winNum;
if ([self setPort])
{
sprintf(body, (const char *)NXLS("msg_response"), VERSION,[self user]);
[mailSpeaker openSend:&winNum];
[mailSpeaker setTo:NXLS("to_address") inWindow :winNum];
[mailSpeaker setCc:NXLS("cc_address") inWindow :winNum];
[mailSpeaker setSubject:NXLS("msg_i_use_it") inWindow :winNum];
[mailSpeaker setBody:(const char *)body inWindow:winNum];
}
}
return self;
}
- (BOOL)appAcceptsAnotherFile:sender
{
return YES;
}
- (int)appOpenFile:(const char *)filename type:(const char *)aType
{
[self openMapWindowFromFile:filename];
return YES;
}
- appWillTerminate:sender
{
List *windowList = [NXApp windowList];
int i;
id currentObject;
for (i = 0; i < [windowList count]; i++)
{
currentObject = [[windowList objectAt:i] delegate];
if ([currentObject isKindOfClassNamed:"MapController"])
[currentObject appWillTerminate:sender];
}
return self;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.