285 lines
10 KiB
Plaintext
285 lines
10 KiB
Plaintext
//
|
|
// Menu_Extensions.m
|
|
// celestia
|
|
//
|
|
// Created by Da Woon Jung on 12/9/07.
|
|
// Copyright (C) 2007, Celestia Development Team
|
|
//
|
|
|
|
#import "Menu_Extensions.h"
|
|
#import "CelestiaSelection.h"
|
|
#import "BrowserItem.h"
|
|
#import "CelestiaSettings.h"
|
|
#include <celutil/util.h>
|
|
|
|
@implementation NSMenu (CelestiaMenu)
|
|
- (NSInteger) indexOfItemWithLocalizableTitle: (NSString *) aTitle
|
|
{
|
|
NSInteger index = [self indexOfItemWithTitle: NSLocalizedString(aTitle,@"")];
|
|
if (index < 0)
|
|
index = [self indexOfItemWithTitle: aTitle];
|
|
return index;
|
|
}
|
|
|
|
- (void) removeRefMarkItems
|
|
{
|
|
NSInteger index;
|
|
index = [self indexOfItemWithTitle:[NSString stringWithUTF8String:_("Reference Vectors")]];
|
|
if (index >= 0) [self removeItemAtIndex: index];
|
|
}
|
|
|
|
- (void) removePlanetarySystemItem
|
|
{
|
|
NSInteger satMenuIndex = [self indexOfItemWithTitle:
|
|
[NSString stringWithUTF8String:_("Satellites")]];
|
|
if (satMenuIndex < 0)
|
|
satMenuIndex = [self indexOfItemWithTitle:
|
|
[NSString stringWithUTF8String:_("Orbiting Bodies")]];
|
|
if (satMenuIndex < 0)
|
|
satMenuIndex = [self indexOfItemWithTitle:[NSString stringWithUTF8String:_("Planets")]];
|
|
if (satMenuIndex >= 0)
|
|
[self removeItemAtIndex: satMenuIndex];
|
|
}
|
|
|
|
- (void) removeAltSurfaceItem
|
|
{
|
|
NSInteger surfMenuIndex = [self indexOfItemWithLocalizableTitle:
|
|
@"Show Alternate Surface" ];
|
|
if (surfMenuIndex >= 0)
|
|
[self removeItemAtIndex: surfMenuIndex];
|
|
}
|
|
|
|
- (BOOL) insertRefMarkItemsForSelection: (CelestiaSelection *) aSelection
|
|
atIndex: (NSInteger) aIndex
|
|
{
|
|
BOOL result = NO;
|
|
NSMenuItem *mi = nil;
|
|
id target = nil;
|
|
CelestiaSettings *settings = [CelestiaSettings shared];
|
|
|
|
if ([aSelection body])
|
|
{
|
|
target = [aSelection body];
|
|
mi = [[NSMenuItem alloc] initWithTitle:[NSString stringWithUTF8String:_("Reference Vectors")] action: nil keyEquivalent: @""];
|
|
NSMenu *refMarksMenu = [[NSMenu alloc] initWithTitle: @"Reference Vectors" ];
|
|
[mi setSubmenu: refMarksMenu];
|
|
if (mi)
|
|
{
|
|
[self insertItem: mi atIndex: aIndex];
|
|
}
|
|
|
|
mi = [[NSMenuItem alloc] initWithTitle:[NSString stringWithUTF8String:_("Show Body Axes")] action: nil keyEquivalent: @""];
|
|
if (mi)
|
|
{
|
|
[mi setTag: 1000];
|
|
[refMarksMenu addItem: mi];
|
|
[settings scanForKeys: mi];
|
|
}
|
|
mi = [[NSMenuItem alloc] initWithTitle:[NSString stringWithUTF8String:_("Show Frame Axes")] action: nil keyEquivalent: @""];
|
|
if (mi)
|
|
{
|
|
[mi setTag: 1001];
|
|
[refMarksMenu addItem: mi];
|
|
[settings scanForKeys: mi];
|
|
}
|
|
mi = [[NSMenuItem alloc] initWithTitle:[NSString stringWithUTF8String:_("Show Sun Direction")] action: nil keyEquivalent: @""];
|
|
if (mi)
|
|
{
|
|
[mi setTag: 1002];
|
|
[refMarksMenu addItem: mi];
|
|
[settings scanForKeys: mi];
|
|
}
|
|
mi = [[NSMenuItem alloc] initWithTitle:[NSString stringWithUTF8String:_("Show Velocity Vector")] action: nil keyEquivalent: @""];
|
|
if (mi)
|
|
{
|
|
[mi setTag: 1003];
|
|
[refMarksMenu addItem: mi];
|
|
[settings scanForKeys: mi];
|
|
}
|
|
mi = [[NSMenuItem alloc] initWithTitle:[NSString stringWithUTF8String:_("Show Planetographic Grid")] action: nil keyEquivalent: @""];
|
|
if (mi)
|
|
{
|
|
[mi setTag: 1004];
|
|
[refMarksMenu addItem: mi];
|
|
[settings scanForKeys: mi];
|
|
}
|
|
mi = [[NSMenuItem alloc] initWithTitle:[NSString stringWithUTF8String:_("Show Terminator")] action: nil keyEquivalent: @""];
|
|
if (mi)
|
|
{
|
|
[mi setTag: 1005];
|
|
[refMarksMenu addItem: mi];
|
|
[settings scanForKeys: mi];
|
|
}
|
|
result = YES;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
- (BOOL) insertPlanetarySystemItemForSelection: (CelestiaSelection *) aSelection
|
|
target: (id) aTarget
|
|
atIndex: (NSInteger) aIndex
|
|
{
|
|
BOOL result = NO;
|
|
NSMenuItem *mi = nil;
|
|
id browseItem;
|
|
if ([aSelection body])
|
|
{
|
|
browseItem = [[BrowserItem alloc] initWithCelestiaBody: [aSelection body]];
|
|
[BrowserItem addChildrenToBody: browseItem];
|
|
NSArray *children = [browseItem allChildNames];
|
|
if (children && [children count] > 0)
|
|
{
|
|
mi = [[NSMenuItem alloc] initWithTitle:[NSString stringWithUTF8String:_("Satellites")] action: nil keyEquivalent: @""];
|
|
[mi addPlanetarySystemMenuForItem: browseItem
|
|
target: aTarget
|
|
action: @selector(selectSatellite:)];
|
|
}
|
|
}
|
|
else if ([aSelection star])
|
|
{
|
|
browseItem = [[BrowserItem alloc] initWithCelestiaStar: [aSelection star]];
|
|
[BrowserItem addChildrenToStar: browseItem];
|
|
NSArray *children = [browseItem allChildNames];
|
|
if (children && [children count] > 0)
|
|
{
|
|
NSString *satMenuItemName = [[browseItem name] isEqualToString: @"Sol"] ?
|
|
@"Orbiting Bodies" : @"Planets";
|
|
mi = [[NSMenuItem alloc] initWithTitle:[NSString stringWithUTF8String:_([satMenuItemName UTF8String])] action: nil keyEquivalent: @""];
|
|
[mi addPlanetarySystemMenuForItem: browseItem
|
|
target: aTarget
|
|
action: @selector(selectSatellite:)];
|
|
}
|
|
}
|
|
if (mi && [[mi submenu] numberOfItems] > 0)
|
|
{
|
|
[self insertItem: mi atIndex: aIndex];
|
|
result = YES;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
- (BOOL) insertAltSurfaceItemForSelection: (CelestiaSelection *) aSelection
|
|
target: (id) aTarget
|
|
atIndex: (NSInteger) aIndex
|
|
{
|
|
BOOL result = NO;
|
|
NSMenuItem *mi = nil;
|
|
if ([aSelection body])
|
|
{
|
|
NSArray *surfaces = [[aSelection body] alternateSurfaceNames];
|
|
if (surfaces && [surfaces count] > 0)
|
|
{
|
|
mi = [[NSMenuItem alloc] initWithTitle:
|
|
NSLocalizedString(@"Show Alternate Surface",@"") action: nil
|
|
keyEquivalent: @""];
|
|
[mi addAltSurfaceMenuWithNames: surfaces
|
|
target: aTarget
|
|
action: @selector(activateMenuItem:)];
|
|
if (mi && [[mi submenu] numberOfItems] > 0)
|
|
{
|
|
[self insertItem: mi atIndex: aIndex];
|
|
result = YES;
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
@end
|
|
|
|
|
|
@implementation NSMenuItem (CelestiaMenu)
|
|
- (void) addPlanetarySystemMenuForItem: (BrowserItem *) browseItem
|
|
target: (id) target
|
|
action: (SEL) action
|
|
{
|
|
NSMenu *satMenu;
|
|
id childName;
|
|
id child;
|
|
NSArray *childChildren;
|
|
unsigned childCount = 0;
|
|
BOOL loneChild = NO;
|
|
NSString *locationsName =[NSString stringWithUTF8String:_("Locations")];
|
|
NSArray *children = [browseItem allChildNames];
|
|
NSEnumerator *childEnum = [children objectEnumerator];
|
|
|
|
while ((childName = [childEnum nextObject]))
|
|
if (![childName isEqualToString: locationsName]) ++childCount;
|
|
loneChild = (childCount == 1);
|
|
|
|
satMenu = [[NSMenu alloc] initWithTitle: @"Satellites" ];
|
|
[self setSubmenu: satMenu];
|
|
|
|
childEnum = [children objectEnumerator];
|
|
while ((childName = [childEnum nextObject]))
|
|
{
|
|
if ([childName isEqualToString: locationsName])
|
|
continue;
|
|
NSMenuItem *satMenuItem;
|
|
child = [browseItem childNamed: childName];
|
|
if (child)
|
|
{
|
|
childChildren = [child allChildNames];
|
|
// Don't create a submenu for a single item
|
|
if (loneChild)
|
|
{
|
|
satMenuItem = self;
|
|
}
|
|
else
|
|
{
|
|
satMenuItem = [[NSMenuItem alloc] initWithTitle: childName action: nil keyEquivalent: @""];
|
|
[satMenuItem setRepresentedObject: [child body] ];
|
|
[satMenuItem setTarget: target];
|
|
[satMenu addItem: satMenuItem];
|
|
}
|
|
|
|
if (childChildren && [childChildren count] > 0)
|
|
{
|
|
NSMenu *subMenu = [[NSMenu alloc] initWithTitle: @"children" ];
|
|
NSMenuItem *subMenuItem;
|
|
id subChildName;
|
|
id subChild;
|
|
NSEnumerator *subEnum = [childChildren objectEnumerator];
|
|
while ((subChildName = [subEnum nextObject]))
|
|
{
|
|
subChild = [child childNamed: subChildName];
|
|
if (subChild)
|
|
{
|
|
subMenuItem = [[NSMenuItem alloc] initWithTitle: subChildName action: action keyEquivalent: @""];
|
|
[subMenuItem setRepresentedObject: [subChild body] ];
|
|
[subMenuItem setTarget: target];
|
|
[subMenu addItem: subMenuItem];
|
|
}
|
|
}
|
|
[satMenuItem setSubmenu: subMenu];
|
|
}
|
|
else
|
|
{
|
|
[satMenuItem setAction: action];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
- (void) addAltSurfaceMenuWithNames: (NSArray *) surfaces
|
|
target: (id) target
|
|
action: (SEL) action
|
|
{
|
|
NSMenu *surfaceMenu = [[NSMenu alloc ] initWithTitle: @"altsurf" ];
|
|
[ self setEnabled: YES ];
|
|
NSMenuItem *newItem = [[NSMenuItem alloc] initWithTitle: NSLocalizedString(@"default",@"") action: action keyEquivalent: @""];
|
|
[newItem setTag: 1100 ];
|
|
[newItem setTarget: target ];
|
|
[ surfaceMenu addItem: newItem ];
|
|
unsigned i;
|
|
for (i = 0; i < [surfaces count]; ++i)
|
|
{
|
|
newItem = [[NSMenuItem alloc] initWithTitle:[NSString stringWithUTF8String:_([[surfaces objectAtIndex: i] UTF8String])] action: action keyEquivalent: @""];
|
|
[newItem setTag: 1101+i ];
|
|
[newItem setTarget: target ];
|
|
[ surfaceMenu addItem: newItem ];
|
|
}
|
|
[ self setSubmenu: surfaceMenu ];
|
|
[ surfaceMenu update ];
|
|
}
|
|
@end
|