Menu_Extensions.m
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:10k
源码类别:

OpenGL

开发平台:

Visual C++

  1. //
  2. //  Menu_Extensions.m
  3. //  celestia
  4. //
  5. //  Created by Da Woon Jung on 12/9/07.
  6. //  Copyright (C) 2007, Celestia Development Team
  7. //
  8. #import "Menu_Extensions.h"
  9. #import "CelestiaSelection.h"
  10. #import "BrowserItem.h"
  11. #import "CelestiaSettings.h"
  12. @implementation NSMenu (CelestiaMenu)
  13. - (int) indexOfItemWithLocalizableTitle: (NSString *) aTitle
  14. {
  15.     int index = [self indexOfItemWithTitle: NSLocalizedString(aTitle,@"")];
  16.     if (index < 0)
  17.         index = [self indexOfItemWithTitle: aTitle];
  18.     return index;
  19. }
  20. - (void) removeRefMarkItems
  21. {
  22.     int index;
  23.     index = [self indexOfItemWithTitle: NSLocalizedStringFromTable(@"Reference Vectors",@"po",@"")];
  24.     if (index >= 0) [self removeItemAtIndex: index];
  25. }
  26. - (void) removePlanetarySystemItem
  27. {
  28.     int satMenuIndex = [self indexOfItemWithTitle:
  29.         NSLocalizedStringFromTable(@"Satellites",@"po",@"")];
  30.     if (satMenuIndex < 0)
  31.         satMenuIndex = [self indexOfItemWithTitle:
  32.             NSLocalizedStringFromTable(@"Orbiting Bodies",@"po",@"")];
  33.     if (satMenuIndex < 0)
  34.         satMenuIndex = [self indexOfItemWithTitle: NSLocalizedStringFromTable(@"Planets",@"po",@"")];
  35.     if (satMenuIndex >= 0)
  36.         [self removeItemAtIndex: satMenuIndex];
  37. }
  38. - (void) removeAltSurfaceItem
  39. {
  40.     int surfMenuIndex = [self indexOfItemWithLocalizableTitle:
  41.         @"Show Alternate Surface" ];
  42.     if (surfMenuIndex >= 0)
  43.         [self removeItemAtIndex: surfMenuIndex];
  44. }
  45. - (BOOL) insertRefMarkItemsForSelection: (CelestiaSelection *) aSelection
  46.                                 atIndex: (int) aIndex
  47. {
  48.     BOOL result    = NO;
  49.     NSMenuItem *mi = nil;
  50.     id target      = nil;
  51.     CelestiaSettings *settings = [CelestiaSettings shared];
  52.     if ([aSelection body])
  53.     {
  54.         target = [aSelection body];
  55.         mi = [[[NSMenuItem alloc] initWithTitle: NSLocalizedStringFromTable(@"Reference Vectors",@"po",@"") action: nil keyEquivalent: @""] autorelease];
  56.         NSMenu *refMarksMenu = [[[NSMenu alloc ] initWithTitle: @"Reference Vectors" ] autorelease];
  57.         [mi setSubmenu: refMarksMenu];
  58.         if (mi)
  59.         {
  60.             [self insertItem: mi atIndex: aIndex];
  61.         }                
  62.         
  63.         mi = [[[NSMenuItem alloc] initWithTitle: NSLocalizedStringFromTable(@"Show Body Axes",@"po",@"") action: nil keyEquivalent: @""] autorelease];
  64.         if (mi)
  65.         {
  66.             [mi setTag: 1000];
  67.             [refMarksMenu addItem: mi];
  68.             [settings scanForKeys: mi];
  69.         }
  70.         mi = [[[NSMenuItem alloc] initWithTitle: NSLocalizedStringFromTable(@"Show Frame Axes",@"po",@"") action: nil keyEquivalent: @""] autorelease];
  71.         if (mi)
  72.         {
  73.             [mi setTag: 1001];
  74.             [refMarksMenu addItem: mi];
  75.             [settings scanForKeys: mi];
  76.         }
  77.         mi = [[[NSMenuItem alloc] initWithTitle: NSLocalizedStringFromTable(@"Show Sun Direction",@"po",@"") action: nil keyEquivalent: @""] autorelease];
  78.         if (mi)
  79.         {
  80.             [mi setTag: 1002];
  81.             [refMarksMenu addItem: mi];
  82.             [settings scanForKeys: mi];
  83.         }
  84.         mi = [[[NSMenuItem alloc] initWithTitle: NSLocalizedStringFromTable(@"Show Velocity Vector",@"po",@"") action: nil keyEquivalent: @""] autorelease];
  85.         if (mi)
  86.         {
  87.             [mi setTag: 1003];
  88.             [refMarksMenu addItem: mi];
  89.             [settings scanForKeys: mi];
  90.         }
  91.         mi = [[[NSMenuItem alloc] initWithTitle: NSLocalizedStringFromTable(@"Show Planetographic Grid",@"po",@"") action: nil keyEquivalent: @""] autorelease];
  92.         if (mi)
  93.         {
  94.             [mi setTag: 1004];
  95.             [refMarksMenu addItem: mi];
  96.             [settings scanForKeys: mi];
  97.         }        
  98.         mi = [[[NSMenuItem alloc] initWithTitle: NSLocalizedStringFromTable(@"Show Terminator",@"po",@"") action: nil keyEquivalent: @""] autorelease];
  99.         if (mi)
  100.         {
  101.             [mi setTag: 1005];
  102.             [refMarksMenu addItem: mi];
  103.             [settings scanForKeys: mi];
  104.         }                
  105.         result = YES;
  106.     }
  107.     return result;
  108. }
  109. - (BOOL) insertPlanetarySystemItemForSelection: (CelestiaSelection *) aSelection
  110.                                         target: (id) aTarget
  111.                                        atIndex: (int) aIndex
  112. {
  113.     BOOL result = NO;
  114.     NSMenuItem *mi = nil;
  115.     id browseItem;
  116.     if ([aSelection body])
  117.     {
  118.         browseItem = [[[BrowserItem alloc] initWithCelestiaBody: [aSelection body]] autorelease];
  119.         [BrowserItem addChildrenToBody: browseItem];
  120.         NSArray *children = [browseItem allChildNames];
  121.         if (children && [children count] > 0)
  122.         {
  123.             mi = [[[NSMenuItem alloc] initWithTitle: NSLocalizedStringFromTable(@"Satellites",@"po",@"") action: nil keyEquivalent: @""] autorelease];
  124.             [mi addPlanetarySystemMenuForItem: browseItem
  125.                                        target: aTarget
  126.                                        action: @selector(selectSatellite:)];
  127.         }
  128.     }
  129.     else if ([aSelection star])
  130.     {
  131.         browseItem = [[[BrowserItem alloc] initWithCelestiaStar: [aSelection star]] autorelease];
  132.         [BrowserItem addChildrenToStar: browseItem];
  133.         NSArray *children = [browseItem allChildNames];
  134.         if (children && [children count] > 0)
  135.         {
  136.             NSString *satMenuItemName = [[browseItem name] isEqualToString: @"Sol"] ?
  137.             @"Orbiting Bodies" : @"Planets";
  138.             mi = [[[NSMenuItem alloc] initWithTitle: NSLocalizedStringFromTable(satMenuItemName,@"po",@"") action: nil keyEquivalent: @""] autorelease];
  139.             [mi addPlanetarySystemMenuForItem: browseItem
  140.                                        target: aTarget
  141.                                        action: @selector(selectSatellite:)];
  142.         }
  143.     }
  144.     if (mi && [[mi submenu] numberOfItems] > 0)
  145.     {
  146.         [self insertItem: mi atIndex: aIndex];
  147.         result = YES;
  148.     }
  149.     return result;
  150. }
  151. - (BOOL) insertAltSurfaceItemForSelection: (CelestiaSelection *) aSelection
  152.                                    target: (id) aTarget
  153.                                   atIndex: (int) aIndex
  154. {
  155.     BOOL result = NO;
  156.     NSMenuItem *mi = nil;
  157.     if ([aSelection body])
  158.     {
  159.         NSArray *surfaces = [[aSelection body] alternateSurfaceNames];
  160.         if (surfaces && [surfaces count] > 0)
  161.         {
  162.             mi = [[[NSMenuItem alloc] initWithTitle:
  163.   NSLocalizedString(@"Show Alternate Surface",@"") action: nil
  164.                                       keyEquivalent: @""] autorelease];
  165.             [mi addAltSurfaceMenuWithNames: surfaces
  166.                                     target: aTarget
  167.                                     action: @selector(activateMenuItem:)];
  168.             if (mi && [[mi submenu] numberOfItems] > 0)
  169.             {
  170.                 [self insertItem: mi atIndex: aIndex];
  171.                 result = YES;
  172.             }
  173.         }
  174.     }
  175.     return result;
  176. }
  177. @end
  178. @implementation NSMenuItem (CelestiaMenu)
  179. - (void) addPlanetarySystemMenuForItem: (BrowserItem *) browseItem
  180.                                 target: (id)  target
  181.                                 action: (SEL) action
  182. {
  183.     NSMenu *satMenu;
  184.     id childName;
  185.     id child;
  186.     id childChildren;
  187.     unsigned childCount = 0;
  188.     BOOL loneChild = NO;
  189.     NSString *locationsName = NSLocalizedStringFromTable(@"Locations",@"po",@"");
  190.     NSArray *children = [browseItem allChildNames];
  191.     NSEnumerator *childEnum = [children objectEnumerator];
  192.     while ((childName = [childEnum nextObject]))
  193.         if (![childName isEqualToString: locationsName]) ++childCount;
  194.     loneChild = (childCount == 1);
  195.     satMenu = [[[NSMenu alloc ] initWithTitle: @"Satellites" ] autorelease];
  196.     [self setSubmenu: satMenu];
  197.     childEnum = [children objectEnumerator];
  198.     while ((childName = [childEnum nextObject]))
  199.     {
  200.         if ([childName isEqualToString: locationsName])
  201.             continue;
  202.         NSMenuItem *satMenuItem;
  203.         child = [browseItem childNamed: childName];
  204.         if (child)
  205.         {
  206.             childChildren = [child allChildNames];
  207.             // Don't create a submenu for a single item
  208.             if (loneChild)
  209.             {
  210.                 satMenuItem = self;
  211.             }
  212.             else
  213.             {
  214.                 satMenuItem = [[[NSMenuItem alloc] initWithTitle: childName action: nil keyEquivalent: @""] autorelease];
  215.                 [satMenuItem setRepresentedObject: [child body] ];
  216.                 [satMenuItem setTarget: target];
  217.                 [satMenu addItem: satMenuItem];
  218.             }
  219.             if (childChildren && [childChildren count] > 0)
  220.             {
  221.                 NSMenu *subMenu = [[[NSMenu alloc ] initWithTitle: @"children" ] autorelease];
  222.                 NSMenuItem *subMenuItem;
  223.                 id subChildName;
  224.                 id subChild;
  225.                 NSEnumerator *subEnum = [childChildren objectEnumerator];
  226.                 while ((subChildName = [subEnum nextObject]))
  227.                 {
  228.                     subChild = [child childNamed: subChildName];
  229.                     if (subChild)
  230.                     {
  231.                         subMenuItem = [[[NSMenuItem alloc] initWithTitle: subChildName action: action keyEquivalent: @""] autorelease];
  232.                         [subMenuItem setRepresentedObject: [subChild body] ];
  233.                         [subMenuItem setTarget: target];
  234.                         [subMenu addItem: subMenuItem];
  235.                     }
  236.                 }
  237.                 [satMenuItem setSubmenu: subMenu];
  238.             }
  239.             else
  240.             {
  241.                 [satMenuItem setAction: action];
  242.             }
  243.         }
  244.     }
  245. }
  246. - (void) addAltSurfaceMenuWithNames: (NSArray *) surfaces
  247.                              target: (id)  target
  248.                              action: (SEL) action
  249. {
  250.     NSMenu *surfaceMenu = [[NSMenu alloc ] initWithTitle: @"altsurf" ];
  251.     [ self setEnabled: YES ];
  252.     NSMenuItem *newItem = [[NSMenuItem alloc] initWithTitle: NSLocalizedString(@"default",@"") action: action keyEquivalent: @""];
  253.     [newItem setTag:    600 ];
  254.     [newItem setTarget: target ];
  255.     [ surfaceMenu addItem: newItem ];
  256.     unsigned i;
  257.     for (i = 0; i < [surfaces count]; ++i)
  258.     {
  259.         newItem = [[NSMenuItem alloc] initWithTitle: NSLocalizedStringFromTable([surfaces objectAtIndex: i],@"po",@"") action: action keyEquivalent: @""];
  260.         [newItem setTag:     601+i ];
  261.         [newItem setTarget:  target ];
  262.         [ surfaceMenu addItem: newItem ];
  263.     }
  264.     [ self setSubmenu: surfaceMenu ];
  265.     [ surfaceMenu update ];
  266. }
  267. @end