This is MapController.m in view mode; [Download] [Up]
#import "MapController.h" #import <appkit/appkit.h> #import "IcaoMap.h" #import "IcaoDefinitions.h" #import "IcaoObjects.h" #import "mapdraw.h" #import "mapobjects.h" #import "router.h" #import "RouteController.h" #import "IcaoController.h" @implementation MapController extern FILE *yyin; extern void callRestartIfNeeded(FILE *file); extern yyparse(); - routeController { return routeController; } - mapView { return mapView; } - mapWindow { return mapWindow; } - displayButton { return displayButton; } - scalePopup { return scalePopup; } - (NXZone *)mapZone { return mapData.mapZone; } - copyDataFromGlobal { if (mapData.mapZone != theZone) { fprintf(stderr, "MapController: zone pointer does not match.\n"); } mapData.map_origin = map_origin; mapData.map_scale = map_scale; mapData.map_zeromeridian = map_zeromeridian; mapData.top = top; mapData.left = left; mapData.bottom = bottom; mapData.right = right; mapData.topleft = topleft; mapData.topright = topright; mapData.bottomleft = bottomleft; mapData.bottomright = bottomright; mapData.map_width = map_width; mapData.map_height = map_height; mapData.mapWidth = mapWidth; mapData.mapHeight = mapHeight; mapData.mapWidthcm = mapWidthcm; mapData.mapHeightcm = mapHeightcm; mapData.originx = originx; mapData.originy = originy; mapData.scalefactor = scalefactor; mapData.mercatorscale = mercatorscale; mapData.map_projection = map_projection; mapData.v1 = v1; mapData.v2 = v2; mapData.objectlist = objectlist; mapData.objectno = objectno; mapData.nametable = nametable; mapData.tableentries = tableentries; mapData.namearray = namearray; mapData.db_objects = db_objects; mapData.db_visible = db_visible; mapData.drawroutenumpoints = drawroutenumpoints; mapData.visiblenumber = visiblenumber; memcpy(mapData.drawroutepoints, drawroutepoints, 100*sizeof(LOCATION)); memcpy(mapData.visiblelist, visiblelist, 100*sizeof(int)); return self; } - copyDataToGlobal { theZone = mapData.mapZone; map_origin = mapData.map_origin; map_scale = mapData.map_scale; map_zeromeridian = mapData.map_zeromeridian; top = mapData.top; left = mapData.left; bottom = mapData.bottom; right = mapData.right; topleft = mapData.topleft; topright = mapData.topright; bottomleft = mapData.bottomleft; bottomright = mapData.bottomright; map_width = mapData.map_width; map_height = mapData.map_height; mapWidth = mapData.mapWidth; mapHeight = mapData.mapHeight; mapWidthcm = mapData.mapWidthcm; mapHeightcm = mapData.mapHeightcm; originx = mapData.originx; originy = mapData.originy; scalefactor = mapData.scalefactor; mercatorscale = mapData.mercatorscale; map_projection = mapData.map_projection; v1 = mapData.v1; v2 = mapData.v2; objectlist = mapData.objectlist; objectno = mapData.objectno; nametable = mapData.nametable; tableentries = mapData.tableentries; namearray = mapData.namearray; db_objects = mapData.db_objects; db_visible = mapData.db_visible; drawroutenumpoints = mapData.drawroutenumpoints; visiblenumber = mapData.visiblenumber; memcpy(drawroutepoints, mapData.drawroutepoints, 100*sizeof(LOCATION)); memcpy(visiblelist, mapData.visiblelist, 100*sizeof(int)); [[NXApp delegate] mapChanged:self]; return self; } - setup { return [self setupFromFile:""]; } - setupFromFile:(const char*)filename { FILE *input; NXRect frame; int i; id popup; char scaleString[32]; char defaultFile[MAXPATHLEN+1]; theZone = NXCreateZone(vm_page_size, vm_page_size, NO); NXNameZone(theZone, strrchr(filename, '/')?strrchr(filename, '/'):filename); input = fopen(filename, "rb"); if (input && strlen(filename)) yyin = input; else { printf(NXLS("Could not find input file %s - using AC.iwp!\n"), filename); if (![[NXBundle mainBundle] getPath: defaultFile forResource: MC_DEFAULTMAPFILE ofType: NULL]) { NXRunAlertPanel(NXLS("Alert") , "Couldn't even find the internal Mapfile %s.\nWill abort now", "OK" , NULL, NULL, MC_DEFAULTMAPFILE); return nil; } else { input = fopen(defaultFile, "rb"); if (input) yyin = input; else { NXRunAlertPanel(NXLS("Alert") , "Couldn't even open the internal Mapfile %s.\nWill abort now" , "OK", NULL, NULL, defaultFile); return nil; } } } objects_init(); callRestartIfNeeded(yyin); i = yyparse(); fclose(yyin); /* i == 0 means no error */ if (i) { return nil; } sort_objects(); [mapView getBounds:&frame]; mapWidth = frame.size.width; mapHeight = frame.size.height; mapWidthcm = [mapView widthCmFrom:mapWidth]; mapHeightcm = [mapView heightCmFrom:mapHeight]; map_setscale(scales[5]); map_projection = atoi(NXGetDefaultValue(APPNAME, IPD_PROJECTIONTYPE)); [projectionPopup setTitle: [[[[projectionPopup target] itemList] findCellWithTag:map_projection] title]]; mapData.mapZone = theZone; [self copyDataFromGlobal]; map_initcoord(); [self displayMap]; popup = [scalePopup target]; for (i = 0; i < numscales; i++) { sprintf(scaleString, "1 : %d", scales[i]); [popup addItem:scaleString]; } [popup removeItemAt:0]; [scalePopup setTitle:[[[popup itemList] cellAt:5:0] title]]; [popup setTarget:self]; [popup setAction:@selector(scaleChanged:)]; popup = [projectionPopup target]; [popup setTarget:self]; [popup setAction:@selector(projectionChanged:)]; [objectBrowser setTarget:self]; [objectBrowser setAction:@selector(objectClicked:)]; [objectBrowser setDoubleAction:@selector(objectDoubleClicked:)]; [objectBrowser acceptArrowKeys:YES andSendActionMessages:YES]; [objectBrowser loadColumnZero]; return self; } - displayMap { /* * inform someone, that the map has changed * Has it really ? */ [mapView display]; return self; } - scaleChanged:sender { /* * scale popup handling */ map_setscale(scales[ [[[scalePopup cell] target] indexOfItem: [[[scalePopup cell] target] selectedItem]]]); map_initcoord(); [self displayMap]; return self; } - projectionChanged:sender { /* * projection popup handling */ map_projection = [[sender selectedCell] tag]; map_initcoord(); [self displayMap]; return self; } - selectInBrowser:(const char *)aString { int pos; NXRect cellFrame, columnFrame; id matrix; pos = objectThatMatches(aString); if (pos == -1) pos = 0; matrix = [objectBrowser matrixInColumn:0]; [matrix getCellFrame:&cellFrame at:pos:0]; if ([objectBrowser getFrame:&columnFrame ofInsideOfColumn:0]) { [matrix convertRect:&columnFrame fromView:objectBrowser]; NX_HEIGHT(&cellFrame)= NX_HEIGHT(&columnFrame); NX_Y(&cellFrame) -= NX_HEIGHT(&columnFrame)/2; [matrix scrollRectToVisible:&cellFrame]; } else /* this hopefully never get invoked */ [matrix scrollCellToVisible:pos:0]; [matrix selectCellAt:pos:0]; [objectBrowser display]; return self; } - objectClicked:sender { id responder = [mapWindow firstResponder]; if ([responder respondsTo:@selector(replaceSel:)]) { [responder setNoWrap]; [responder selectAll:self]; if (([[objectBrowser matrixInColumn:0] selectedRow]) && ([[objectBrowser matrixInColumn:0] selectedRow] != -1)) { [responder replaceSel:[[objectBrowser selectedCell] stringValue]]; currentroute[0] = objectfromnamelist( [[objectBrowser matrixInColumn:0] selectedRow]); } else [responder replaceSel:""]; [responder selectAll:self]; [routeController setNewTakeoff:[routeTO stringValue]]; [self displayMap]; } return self; } - objectDoubleClicked:sender { OBJECT *object; int pos; pos = [[objectBrowser matrixInColumn:0] selectedRow]; object = objectfromnamelist(pos); if (object) { map_origin = object->location; map_initcoord(); [self displayMap]; } return self; } - getNewTypes:sender { int i; for (i = 0; i < numvis; i++) { visobj[i] = [[typeMatrix cellAt:i:0] state]; } [displayButton setEnabled:YES]; return self; } - setNewRoute:(BOOL)redraw TO:(const char*)TO via:(const char*)via1 via:(const char*)via2 via:(const char*)via3 dest:(const char*)dest { [routeTO setStringValue:TO]; [[routeVia cellAt:1:0] setStringValue:via1]; [[routeVia cellAt:2:0] setStringValue:via2]; [[routeVia cellAt:3:0] setStringValue:via3]; [routeDest setStringValue:dest]; [self displayMap:self]; return self; } - displayMap:sender { if ([sender isEqual:displayButton]) { [displayButton setEnabled:NO]; [mapView bufferNeedsUpdate]; } map_initcoord(); [self displayMap]; return self; } - showObjectsPanel:sender { int i; id doc = [typeScroller docView]; NXRect frame; if (!objectsPanel) { if ([NXApp loadNibSection:"VisibleObjects.nib" owner:self] == nil) return nil; else { [typeScroller setAutoresizeSubviews:YES]; [[typeMatrix setAutosizeCells:YES] setAutoscroll:YES]; [[typeMatrix setTarget:self] setAction:@selector(getNewTypes:)]; while ([typeMatrix cellCount]) [typeMatrix removeRowAt:0 andFree:YES]; for (i = 0; i < numvis; i++) { [[typeMatrix addRow] sizeToCells]; [[typeMatrix cellAt:i:0] setState:visobj[i]]; [[typeMatrix cellAt:i:0] setTitle:visstring[i]]; } [doc getFrame:&frame]; frame.size.height = [typeMatrix cellCount] * 17; [doc setFrame:&frame]; [typeScroller display]; } } [objectsPanel makeKeyAndOrderFront:sender]; return self; } - showSoaringPanel:sender { [routeController setNewTakeoff:[routeTO stringValue]]; [[routeController soaringPanel] makeKeyAndOrderFront:sender]; return self; } - routeVia { return routeVia; } - (BOOL)canAutoroute { return([routeController canAutoroute]); } - tryToAutoroute:sender { return ([routeController tryToAutoroute:sender]); } - printMap:sender { /* Just to sure the buffer is uptodate */ [mapView display]; /* Check if there is a route*/ if ((drawroutenumpoints >= 2) || (([routeTO stringValue][0] != '\000') && ([routeDest stringValue][0] != '\000'))) { [[[NXApp delegate] routeAdjust] setEnabled: YES]; if ([mapView showsRoute]) [[[NXApp delegate] routeAdjust] setTitle: [[[[[[NXApp delegate] routeAdjust] target] itemList] findCellWithTag:ADJUST_ROUTE] title]]; else [[[NXApp delegate] routeAdjust] setTitle: [[[[[[NXApp delegate] routeAdjust] target] itemList] findCellWithTag:KEEP_SCALE] title]]; } else { [[[[[[NXApp delegate] routeAdjust] setEnabled: NO] target] itemList] selectCellWithTag: KEEP_SCALE]; } [mapView printPSCode:self]; return self; } - appWillTerminate:sender { [routeController appWillTerminate:sender]; return self; } - free { theZone = NULL; NXDestroyZone(mapData.mapZone); return [super free]; } @end @implementation MapController(WindowDelegate) - windowDidBecomeMain:sender { return [mapView setMyTrackingRect: YES]; } - windowDidResignMain:sender { return [mapView setMyTrackingRect: NO]; } - windowWillMiniaturize:sender toMiniwindow:miniwindow { /* * Tell Miniwindow to use IcaoIcon */ [sender setMiniwindowIcon:NXLS("IcaoIcon")]; /* to remove the InfoPopUp if it is visible */ [mapView removeInfoPopUp]; /* Clear the trackingRect */ [mapView setMyTrackingRect: NO]; /* The return Value is ignored by the sender */ return self; } - windowDidDeminiaturize:sender { [mapView setMyTrackingRect: YES]; return self; } - windowWillClose:sender { [sender setDelegate:nil]; [self free]; return sender; } @end @implementation MapController(BrowserDelegate) - (int)browser:sender getNumRowsInColumn:(int)column { return tableentries; } - browser:sender loadCell:cell atRow:(int)row inColumn:(int)column { [cell setStringValue:namearray[row]]; [cell setLeaf:YES]; [cell setLoaded:YES]; return self; } @end @implementation MapController(TextDelegate) - textDidGetKeys:textObject isEmpty:(BOOL)flag { char *buf; int len; len = [textObject byteLength] + 1; buf = malloc(len); [textObject getSubstring:buf start:0 length:len]; [self selectInBrowser:buf]; free(buf); return self; } - (BOOL)textWillEnd:textObject { char *contents; contents = malloc([textObject byteLength]+1); /* * Since getSubstring doesn't always return anything, we need to make sure * that contents equals "" */ contents[0] = '\000'; [textObject getSubstring:contents start:0 length:[textObject charLength]]; /* If anything is in the field */ if (strcmp(contents,"")) { [self selectInBrowser:contents]; free(contents); contents = malloc(strlen([[objectBrowser selectedCell] stringValue])+1); strcpy(contents, [[objectBrowser selectedCell] stringValue]); if (!strcmp(contents, IO_CLEARENTRY)) contents[0] = '\000'; [textObject setText:contents]; [routeController setNewTakeoff:[routeTO stringValue]]; [self displayMap]; } free(contents); return NO; // this means Text may End (Why NO ?) } @end @implementation MapController(NXNibNotification) - awakeFromNib { if (!routeController) { if ([NXApp loadNibSection: "SuggestTriangle.nib" owner:self] == nil) return nil; } return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.