This is RouteMap.m in view mode; [Download] [Up]
#import "RouteMap.h"
#import <appkit/appkit.h>
#import "IcaoController.h"
#import "mapobjects.h"
@implementation RouteMap
- initFrame:(const NXRect *)frameRect
{
[super initFrame:frameRect];
drawInternalRoute = NO;
showsRoute = YES;
return self;
}
/* routine that draws any route (from drawroutepoints) */
- drawRoute
{
int i, x1, y1, x2, y2;
if (drawroutenumpoints > 1) /* a single point doesn't make a route */
{
gp_setcolor(RED);
gp_setlinestyle(3, SOLID);
internal2window(drawroutepoints[0], &x1, &y1);
for (i = 1; i < drawroutenumpoints; i++)
{
internal2window(drawroutepoints[i], &x2, &y2);
gp_drawline(x1, y1, x2, y2);
x1 = x2;
y1 = y2;
}
}
return self;
}
- fillGlobalRoute
{
if (!drawInternalRoute)
{
drawroutenumpoints = 0;
/*
* We must get the Objects belonging to the Route from the T/O, VIA...
* DEST TextFieldCells here, because the Fields themself are changed at
* muliply points in the program. This is of course a subject to change
*/
if ([takeOff stringValue][0] != '\000')
{
drawroutepoints[drawroutenumpoints++]
= objectfromnamelist(
objectThatMatches([takeOff stringValue]))->location;
if ([via1 stringValue][0] != '\000')
drawroutepoints[drawroutenumpoints++]
= objectfromnamelist(
objectThatMatches([via1 stringValue]))->location;
if ([via2 stringValue][0] != '\000')
drawroutepoints[drawroutenumpoints++]
= objectfromnamelist(
objectThatMatches([via2 stringValue]))->location;
if ([via3 stringValue][0] != '\000')
drawroutepoints[drawroutenumpoints++]
= objectfromnamelist(
objectThatMatches([via3 stringValue]))->location;
if ([destination stringValue][0] != '\000')
drawroutepoints[drawroutenumpoints++]
= objectfromnamelist(
objectThatMatches([destination stringValue]))->location;
}
}
if (drawroutenumpoints >= 2)
return self;
else
return nil;
}
- drawSelf:(const NXRect *)rects :(int)rectCount;
{
[super drawSelf:rects :rectCount];
if (showsRoute)
{
if ([self fillGlobalRoute])
return[self drawRoute];
else
return nil;
}
else
return self;
}
- setDrawInternalRoute:(BOOL)flag
{
drawInternalRoute = flag;
[self display];
return self;
}
- setShowsRoute:(BOOL)flag
{
if (flag != showsRoute)
{
showsRoute = flag;
[self display];
}
return self;
}
/* Querying the RouteView */
- (BOOL)showsRoute
{
return showsRoute;
}
- takeShowsRouteFrom:sender
{
return [self setShowsRoute:[sender state]];
}
- makeRouteFit:(BOOL)forPrinting
{
LOCATION topleft, botright, a, b;
double heightNM, widthNM, scalehor, scalever;
BOOL orientation;
int i;
/* Check if there is a route and set it */
if ([self fillGlobalRoute])
{
/* find extension of area to be printed */
topleft = drawroutepoints[0];
botright = drawroutepoints[0];
for (i = 1; i < drawroutenumpoints; i++)
{
if (drawroutepoints[i].longitude < topleft.longitude)
topleft.longitude = drawroutepoints[i].longitude;
if (drawroutepoints[i].latitude < topleft.latitude)
topleft.latitude = drawroutepoints[i].latitude;
if (drawroutepoints[i].longitude > botright.longitude)
botright.longitude = drawroutepoints[i].longitude;
if (drawroutepoints[i].latitude > botright.latitude)
botright.latitude = drawroutepoints[i].latitude;
}
/* calc width and height of map in NM */
a.longitude = b.longitude = topleft.longitude;
a.latitude = topleft.latitude;
b.latitude = botright.latitude;
heightNM = distance(a, b);
b.longitude = botright.longitude;
b.latitude = topleft.latitude;
widthNM = distance(a, b);
if (forPrinting)
{
/* Space for the MarginData */
NXCoord mTop, mLeft, mRight, mBottom;
PrintInfo *printInfo = [NXApp printInfo];
NXSize pageSize;
/* suggest either landscape (YES) or portrait (NO) */
orientation = (widthNM > heightNM);
[[NXApp printInfo] setOrientation:(orientation ? NX_LANDSCAPE : NX_PORTRAIT)
andAdjust :YES];
[printInfo getMarginLeft:&mLeft right:&mRight top:&mTop bottom:&mBottom];
pageSize = [printInfo paperRect]->size;
pageSize.width -= (mLeft + mRight);
pageSize.height -= (mBottom + mTop);
//[self sizeTo:pageSize.width:pageSize.height];
/* now we need to find a scale that makes everything fit: */
scalehor = widthNM * 185200 / POINT2CM(pageSize.width);
scalever = heightNM * 185200 / POINT2CM(pageSize.height);
map_scale = (long)((scalehor > scalever) ? scalehor : scalever);
map_scale = (long)(map_scale * 1.1);
/* make this map_scale take effect */
map_setscale(map_scale);
}
else
{
scalehor = widthNM * 185200 / [self widthCmFrom:NX_WIDTH(&frame)];
scalever = heightNM * 185200 / [self heightCmFrom:NX_HEIGHT(&frame)];
map_scale = (long)((scalehor > scalever) ? scalehor : scalever);
/* Now search a Scale in the of scales > than map_scale */
map_setscale(map_scale);
if (scale < numscales - 1)
map_scale = scales[++scale];
else
map_scale = scales[scale];
}
/* last but not least: choose map origin so that everything will fit */
map_origin.longitude = (long)((topleft.longitude + botright.longitude) / 2);
map_origin.latitude = (long)((topleft.latitude + botright.latitude) / 2);
map_initcoord();
}
return self;
}
@end
@implementation RouteMap(Printing)
- openSpoolFile:(char *)filename
{
Matrix *popUp;
[self setAutodisplay:NO];
oldOrientation = [[NXApp printInfo] orientation];
popUp = [[[[NXApp delegate] routeAdjust] target] itemList];
if (!strcmp([[[NXApp delegate] routeAdjust] title]
,[[popUp findCellWithTag:ADJUST_ROUTE] title]))
[self makeRouteFit:YES];
return[super openSpoolFile:filename];
}
- endPSOutput
{
/* Get all the data from the buffer */
map_origin = bufferData.theOrigin;
map_scale = bufferData.scale;
map_projection = bufferData.projection;
map_origin = bufferData.theOrigin;
map_origin = bufferData.theOrigin;
/* What about the zeroMeridian ? */
[super endPSOutput];
[[NXApp printInfo] setOrientation:oldOrientation andAdjust:YES];
return self;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.