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

OpenGL

开发平台:

Visual C++

  1. //
  2. //  ScriptsController.mm
  3. //  celestia
  4. //
  5. //  Created by Da Woon Jung on 2007-05-30.
  6. //  Copyright 2007 Da Woon Jung. All rights reserved.
  7. //
  8. #import "ScriptsController.h"
  9. #import "CelestiaController.h"
  10. #import "NSString_ObjCPlusPlus.h"
  11. #import "scriptmenu.h"
  12. @interface ScriptsController(Private)
  13. + (NSDictionary *)scriptsForFolderRoot: (NSString *)root;
  14. - (void)runScript: (id)aSender;
  15. - (void)addItems: (NSDictionary *)aItems
  16.           toMenu: (NSMenu *)aMenu;
  17. @end
  18. @implementation ScriptsController
  19. + (NSDictionary *)scriptsForFolderRoot: (NSString *)root
  20. {
  21.     NSString *scriptsFolder = nil;
  22.     unsigned baseDirLevel = [[CEL_SCRIPTS_FOLDER pathComponents] count];
  23.     BOOL isAbsoluteFolder = (root && [root length] > 0);
  24.     if (isAbsoluteFolder)
  25.         scriptsFolder = [root stringByAppendingPathComponent: CEL_SCRIPTS_FOLDER];
  26.     else
  27.         scriptsFolder = CEL_SCRIPTS_FOLDER;
  28.     std::vector<ScriptMenuItem> *scripts = ScanScriptsDirectory([scriptsFolder stdString], true);
  29.     if (NULL == scripts)
  30.         return nil;
  31.     NSMutableDictionary *itemDict = [NSMutableDictionary dictionary];
  32.     NSString *title;
  33.     id path;
  34.     NSString *menuPath;
  35.     size_t i;
  36.     for (i = 0; i < scripts->size(); ++i)
  37.     {
  38.         title = [NSString stringWithStdString: (*scripts)[i].title];
  39.         path  = [NSString stringWithStdString: (*scripts)[i].filename];
  40.         menuPath = [NSString stringWithString: path];
  41.         if (isAbsoluteFolder)
  42.         {
  43.             NSRange pathRange = [menuPath rangeOfString:scriptsFolder options:NSAnchoredSearch];
  44.             if (NSNotFound != pathRange.location &&
  45.                 pathRange.location < [menuPath length])
  46.             {
  47.                 pathRange.location += pathRange.length + 1;
  48.                 pathRange.length = [menuPath length] - pathRange.length - 1;
  49.                 menuPath = [menuPath substringWithRange:pathRange];
  50.             }
  51.         }
  52.         // Build submenus for nested directories
  53.         NSArray *subPaths = [[menuPath stringByDeletingLastPathComponent] pathComponents];
  54.         if (subPaths && [subPaths count] > baseDirLevel)
  55.         {
  56.             id parentDict = itemDict;
  57.             id childDict = nil;
  58.             NSString *subDir;
  59.             for (unsigned j = baseDirLevel; j < [subPaths count]; ++j)
  60.             {
  61.                 subDir = [subPaths objectAtIndex: j];
  62.                 childDict = [parentDict objectForKey: subDir];
  63.                 if (nil == childDict)
  64.                     childDict = [NSMutableDictionary dictionary];
  65.                 [parentDict setObject: childDict forKey: subDir];
  66.                 parentDict = childDict;
  67.             }
  68.             if (childDict) [childDict setObject: path forKey: title];
  69.             continue;
  70.         }
  71.         [itemDict setObject: path forKey: title];
  72.     }
  73.     delete scripts;
  74.     return [itemDict count] > 0 ? itemDict : nil;
  75. }
  76. - (void)buildScriptMenu
  77. {
  78.     NSDictionary *itemDict = nil;
  79.     NSArray *existingResourceDirsSetting = nil;
  80.     NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
  81.     BOOL addSeparator = NO;
  82.     int count = [scriptMenu numberOfItems];
  83.     while (count-- > 0)
  84.         [scriptMenu removeItemAtIndex: 0];
  85.     if (itemDict = [ScriptsController scriptsForFolderRoot: @""])
  86.     {
  87.         [self addItems:itemDict toMenu:scriptMenu];
  88.         addSeparator = YES;
  89.     }
  90.     if ((existingResourceDirsSetting = [prefs stringArrayForKey:@"existingResourceDirs"]))
  91.     {
  92.         NSEnumerator *iter = [existingResourceDirsSetting objectEnumerator];
  93.         NSString *dir = nil;
  94.         while ((dir = [iter nextObject]))
  95.         {
  96.             if (itemDict = [ScriptsController scriptsForFolderRoot: dir])
  97.             {
  98.                 if (addSeparator)
  99.                 {
  100.                     [scriptMenu addItem: [NSMenuItem separatorItem]];
  101.                     addSeparator = NO;
  102.                 }
  103.                 [self addItems:[NSDictionary dictionaryWithObject:itemDict forKey:[dir stringByAbbreviatingWithTildeInPath]] toMenu:scriptMenu];
  104.             }
  105.         }
  106.     }
  107. }
  108. - (void)addItems: (NSDictionary *)aItems
  109.           toMenu: (NSMenu *)aMenu
  110. {
  111.     NSMenuItem *mi;
  112.     id item;
  113.     NSString *title;
  114.     NSArray *titles = [[aItems allKeys] sortedArrayUsingSelector: @selector(localizedCaseInsensitiveCompare:)];
  115.     for (unsigned i = 0; i < [titles count]; ++i)
  116.     {
  117.         title = [titles objectAtIndex: i];
  118.         mi = [aMenu addItemWithTitle: title
  119.                               action: @selector(runScript:)
  120.                        keyEquivalent: @""];
  121.         if (mi)
  122.         {
  123.             item = [aItems objectForKey: title];
  124.             if ([item respondsToSelector: @selector(objectForKey:)])
  125.             {
  126.                 [mi setAction: nil];
  127.                 NSMenu *subMenu = [[[NSMenu alloc] initWithTitle: title] autorelease];
  128.                 [self addItems: item toMenu: subMenu];
  129.                 [mi setSubmenu: subMenu];
  130.             }
  131.             else
  132.             {
  133.                 [mi setTarget: self];
  134.                 [mi setRepresentedObject: item];
  135.             }
  136.         }
  137.     }
  138. }
  139. - (void)runScript: (id)aSender
  140. {
  141.     if (aSender && [aSender respondsToSelector: @selector(representedObject)])
  142.     {
  143.         CelestiaController *controller = [CelestiaController shared];
  144.         id filename = [aSender representedObject];
  145.         if (filename)
  146.         {
  147.             [controller runScript: filename];
  148.         }
  149.     }
  150. }
  151. @end