Просмотр исходного кода

Merge pull request #3 from JaviSoto/feature/custom-global-entries

Added an API to register custom entries to the Globals table view controller
Ryan Olson лет назад: 12
Родитель
Сommit
d4b8f5eba5

+ 1 - 1
Classes/Explorer Toolbar/FLEXExplorerViewController.m

@@ -471,7 +471,7 @@ typedef NS_ENUM(NSUInteger, FLEXExplorerMode) {
 {
     FLEXGlobalsTableViewController *globalsViewController = [[FLEXGlobalsTableViewController alloc] init];
     globalsViewController.delegate = self;
-    globalsViewController.applicationWindow = [[UIApplication sharedApplication] keyWindow];
+    [FLEXGlobalsTableViewController setApplicationWindow:[[UIApplication sharedApplication] keyWindow]];
     UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:globalsViewController];
     [self makeKeyAndPresentViewController:navigationController animated:YES completion:nil];
 }

+ 16 - 0
Classes/Explorer Toolbar/FLEXManager+Private.h

@@ -0,0 +1,16 @@
+//
+//  FLEXManager+Private.h
+//  PebbleApp
+//
+//  Created by Javier Soto on 7/26/14.
+//  Copyright (c) 2014 Pebble Technology. All rights reserved.
+//
+
+#import "FLEXManager.h"
+
+@interface FLEXManager ()
+
+/// An array of FLEXGlobalsTableViewControllerEntry objects that have been registered by the user.
+@property (nonatomic, readonly, strong) NSArray *userGlobalEntries;
+
+@end

+ 11 - 0
Classes/Explorer Toolbar/FLEXManager.h

@@ -17,4 +17,15 @@
 - (void)showExplorer;
 - (void)hideExplorer;
 
+#pragma mark - Extensions
+
+/// Adds an entry at the bottom of the list of Global State items. Call this method before this view controller is displayed.
+/// @param entryName The string to be displayed in the cell.
+/// @param objectFutureBlock When you tap on the row, information about the object returned by this block will be displayed.
+/// Passing a block that returns an object allows you to display information about an object whose actual pointer may change at runtime (e.g. +currentUser)
+/// @note This method must be called from the main thread.
+/// The objectFutureBlock will be invoked from the main thread and may return nil.
+/// @note The passed block will be copied and retain for the duration of the application, you may want to use __weak references.
+- (void)registerGlobalEntryWithName:(NSString *)entryName objectFutureBlock:(id(^)(void))objectFutureBlock;
+
 @end

+ 24 - 0
Classes/Explorer Toolbar/FLEXManager.m

@@ -9,12 +9,17 @@
 #import "FLEXManager.h"
 #import "FLEXExplorerViewController.h"
 #import "FLEXWindow.h"
+#import "FLEXGlobalsTableViewControllerEntry.h"
+#import "FLEXObjectExplorerFactory.h"
+#import "FLEXObjectExplorerViewController.h"
 
 @interface FLEXManager () <FLEXWindowEventDelegate, FLEXExplorerViewControllerDelegate>
 
 @property (nonatomic, strong) FLEXWindow *explorerWindow;
 @property (nonatomic, strong) FLEXExplorerViewController *explorerViewController;
 
+@property (nonatomic, readonly, strong) NSMutableArray *userGlobalEntries;
+
 @end
 
 @implementation FLEXManager
@@ -76,4 +81,23 @@
     [self hideExplorer];
 }
 
+
+#pragma mark - Extensions
+
+- (void)registerGlobalEntryWithName:(NSString *)entryName objectFutureBlock:(id (^)(void))objectFutureBlock
+{
+    NSParameterAssert(entryName);
+    NSParameterAssert(objectFutureBlock);
+    NSAssert([NSThread isMainThread], @"This method must be called from the main thread.");
+
+    entryName = entryName.copy;
+    FLEXGlobalsTableViewControllerEntry *entry = [FLEXGlobalsTableViewControllerEntry entryWithNameFuture:^NSString *{
+        return entryName;
+    } viewControllerFuture:^UIViewController *{
+        return [FLEXObjectExplorerFactory explorerViewControllerForObject:objectFutureBlock()];
+    }];
+
+    [self.userGlobalEntries addObject:entry];
+}
+
 @end

+ 1 - 1
Classes/Global State Explorers/FLEXGlobalsTableViewController.h

@@ -16,7 +16,7 @@
 
 /// We pretend that one of the app's windows is still the key window, even though the explorer window may have become key.
 /// We want to display debug state about the application, not about this tool.
-@property (nonatomic, strong) UIWindow *applicationWindow;
++ (void)setApplicationWindow:(UIWindow *)applicationWindow;
 
 @end
 

+ 174 - 132
Classes/Global State Explorers/FLEXGlobalsTableViewController.m

@@ -14,11 +14,16 @@
 #import "FLEXObjectExplorerFactory.h"
 #import "FLEXLiveObjectsTableViewController.h"
 #import "FLEXFileBrowserTableViewController.h"
+#import "FLEXGlobalsTableViewControllerEntry.h"
+#import "FLEXManager+Private.h"
+
+static __weak UIWindow *s_applicationWindow = nil;
 
 typedef NS_ENUM(NSUInteger, FLEXGlobalsRow) {
-    FLEXGlobalsRowAppClasses,
-    FLEXGlobalsRowSystemLibraries,
     FLEXGlobalsRowLiveObjects,
+    FLEXGlobalsRowFileBrowser,
+    FLEXGlobalsRowSystemLibraries,
+    FLEXGlobalsRowAppClasses,
     FLEXGlobalsRowAppDelegate,
     FLEXGlobalsRowRootViewController,
     FLEXGlobalsRowUserDefaults,
@@ -26,170 +31,207 @@ typedef NS_ENUM(NSUInteger, FLEXGlobalsRow) {
     FLEXGlobalsRowKeyWindow,
     FLEXGlobalsRowMainScreen,
     FLEXGlobalsRowCurrentDevice,
-    FLEXGlobalsRowFileBrowser
+    FLEXGlobalsRowCount
 };
 
 @interface FLEXGlobalsTableViewController ()
 
-@property (nonatomic, strong) NSArray *rows;
+/// [FLEXGlobalsTableViewControllerEntry *]
+@property (nonatomic, readonly, copy) NSArray *entries;
 
 @end
 
 @implementation FLEXGlobalsTableViewController
 
+/// [FLEXGlobalsTableViewControllerEntry *]
++ (NSArray *)defaultGlobalEntries
+{
+    NSMutableArray *defaultGlobalEntries = [NSMutableArray array];
+
+    for (FLEXGlobalsRow defaultRowIndex = 0; defaultRowIndex < FLEXGlobalsRowCount; defaultRowIndex++) {
+        FLEXGlobalsTableViewControllerEntryNameFuture titleFuture = nil;
+        FLEXGlobalsTableViewControllerViewControllerFuture viewControllerFuture = nil;
+
+        switch (defaultRowIndex) {
+            case FLEXGlobalsRowAppClasses:
+                titleFuture = ^NSString *{
+                    return [NSString stringWithFormat:@"📕  %@ Classes", [FLEXUtility applicationName]];
+                };
+                viewControllerFuture = ^UIViewController *{
+                    FLEXClassesTableViewController *classesViewController = [[FLEXClassesTableViewController alloc] init];
+                    classesViewController.binaryImageName = [FLEXUtility applicationImageName];
+
+                    return classesViewController;
+                };
+                break;
+
+            case FLEXGlobalsRowSystemLibraries: {
+                NSString *titleString = @"📚  System Libraries";
+                titleFuture = ^NSString *{
+                    return titleString;
+                };
+                viewControllerFuture = ^UIViewController *{
+                    FLEXLibrariesTableViewController *librariesViewController = [[FLEXLibrariesTableViewController alloc] init];
+                    librariesViewController.title = titleString;
+
+                    return librariesViewController;
+                };
+                break;
+            }
+
+            case FLEXGlobalsRowLiveObjects:
+                titleFuture = ^NSString *{
+                    return @"💩  Heap Objects";
+                };
+                viewControllerFuture = ^UIViewController *{
+                    return [[FLEXLiveObjectsTableViewController alloc] init];
+                };
+
+                break;
+
+            case FLEXGlobalsRowAppDelegate:
+                titleFuture = ^NSString *{
+                    return [NSString stringWithFormat:@"👉  %@", [[[UIApplication sharedApplication] delegate] class]];
+                };
+                viewControllerFuture = ^UIViewController *{
+                    id <UIApplicationDelegate> appDelegate = [[UIApplication sharedApplication] delegate];
+                    return [FLEXObjectExplorerFactory explorerViewControllerForObject:appDelegate];
+                };
+                break;
+
+            case FLEXGlobalsRowRootViewController:
+                titleFuture = ^NSString *{
+                    return [NSString stringWithFormat:@"🌴  %@", [[s_applicationWindow rootViewController] class]];
+                };
+                viewControllerFuture = ^UIViewController *{
+                    UIViewController *rootViewController = [s_applicationWindow rootViewController];
+                    return [FLEXObjectExplorerFactory explorerViewControllerForObject:rootViewController];
+                };
+                break;
+
+            case FLEXGlobalsRowUserDefaults:
+                titleFuture = ^NSString *{
+                    return @"🚶  +[NSUserDefaults standardUserDefaults]";
+                };
+                viewControllerFuture = ^UIViewController *{
+                    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
+                    return [FLEXObjectExplorerFactory explorerViewControllerForObject:standardUserDefaults];
+                };
+                break;
+
+            case FLEXGlobalsRowApplication:
+                titleFuture = ^NSString *{
+                    return @"💾  +[UIApplication sharedApplication]";
+                };
+                viewControllerFuture = ^UIViewController *{
+                    UIApplication *sharedApplication = [UIApplication sharedApplication];
+                    return [FLEXObjectExplorerFactory explorerViewControllerForObject:sharedApplication];
+                };
+                break;
+
+            case FLEXGlobalsRowKeyWindow:
+                titleFuture = ^NSString *{
+                    return @"🔑  -[UIApplication keyWindow]";
+                };
+                viewControllerFuture = ^UIViewController *{
+                    return [FLEXObjectExplorerFactory explorerViewControllerForObject:s_applicationWindow];
+                };
+                break;
+
+            case FLEXGlobalsRowMainScreen:
+                titleFuture = ^NSString *{
+                    return @"💻  +[UIScreen mainScreen]";
+                };
+                viewControllerFuture = ^UIViewController *{
+                    UIScreen *mainScreen = [UIScreen mainScreen];
+                    return [FLEXObjectExplorerFactory explorerViewControllerForObject:mainScreen];
+                };
+                break;
+
+            case FLEXGlobalsRowCurrentDevice:
+                titleFuture = ^NSString *{
+                    return @"📱  +[UIDevice currentDevice]";
+                };
+                viewControllerFuture = ^UIViewController *{
+                    UIDevice *currentDevice = [UIDevice currentDevice];
+                    return [FLEXObjectExplorerFactory explorerViewControllerForObject:currentDevice];
+                };
+                break;
+
+            case FLEXGlobalsRowFileBrowser:
+                titleFuture = ^NSString *{
+                    return @"📁  File Browser";
+                };
+                viewControllerFuture = ^UIViewController *{
+                    return [[FLEXFileBrowserTableViewController alloc] init];
+                };
+                break;
+            case FLEXGlobalsRowCount:
+                break;
+        }
+
+        NSParameterAssert(titleFuture);
+        NSParameterAssert(viewControllerFuture);
+
+        [defaultGlobalEntries addObject:[FLEXGlobalsTableViewControllerEntry entryWithNameFuture:titleFuture viewControllerFuture:viewControllerFuture]];
+    }
+
+    return defaultGlobalEntries;
+}
+
 - (id)initWithStyle:(UITableViewStyle)style
 {
     self = [super initWithStyle:style];
     if (self) {
         self.title = @"🌎  Global State";
+        _entries = [[[self class] defaultGlobalEntries] arrayByAddingObjectsFromArray:[FLEXManager sharedManager].userGlobalEntries];
     }
     return self;
 }
 
+#pragma mark - Public
+
++ (void)setApplicationWindow:(UIWindow *)applicationWindow
+{
+    s_applicationWindow = applicationWindow;
+}
+
+#pragma mark - UIViewController
+
 - (void)viewDidLoad
 {
     [super viewDidLoad];
-
-    self.rows = @[@(FLEXGlobalsRowLiveObjects),
-                  @(FLEXGlobalsRowFileBrowser),
-                  @(FLEXGlobalsRowSystemLibraries),
-                  @(FLEXGlobalsRowAppClasses),
-                  @(FLEXGlobalsRowAppDelegate),
-                  @(FLEXGlobalsRowRootViewController),
-                  @(FLEXGlobalsRowUserDefaults),
-                  @(FLEXGlobalsRowApplication),
-                  @(FLEXGlobalsRowKeyWindow),
-                  @(FLEXGlobalsRowMainScreen),
-                  @(FLEXGlobalsRowCurrentDevice)];
     
     self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(donePressed:)];
 }
 
+#pragma mark -
+
 - (void)donePressed:(id)sender
 {
     [self.delegate globalsViewControllerDidFinish:self];
 }
 
-
 #pragma mark - Table Data Helpers
 
-- (FLEXGlobalsRow)rowTypeAtIndexPath:(NSIndexPath *)indexPath
+- (FLEXGlobalsTableViewControllerEntry *)globalEntryAtIndexPath:(NSIndexPath *)indexPath
 {
-    return [[self.rows objectAtIndex:indexPath.row] unsignedIntegerValue];
+    return self.entries[indexPath.row];
 }
 
-- (NSString *)titleForRowType:(FLEXGlobalsRow)rowType
+- (NSString *)titleForRowAtIndexPath:(NSIndexPath *)indexPath
 {
-    NSString *title = nil;
-    switch (rowType) {
-        case FLEXGlobalsRowAppClasses:
-            title = [NSString stringWithFormat:@"📕  %@ Classes", [FLEXUtility applicationName]];
-            break;
-            
-        case FLEXGlobalsRowSystemLibraries:
-            title = @"📚  System Libraries";
-            break;
-        
-        case FLEXGlobalsRowLiveObjects:
-            title = @"💩  Heap Objects";
-            break;
-            
-        case FLEXGlobalsRowAppDelegate:
-            title = [NSString stringWithFormat:@"👉  %@", [[[UIApplication sharedApplication] delegate] class]];
-            break;
-            
-        case FLEXGlobalsRowRootViewController:
-            title = [NSString stringWithFormat:@"🌴  %@", [[self.applicationWindow rootViewController] class]];
-            break;
-            
-        case FLEXGlobalsRowUserDefaults:
-            title = @"🚶  +[NSUserDefaults standardUserDefaults]";
-            break;
-            
-        case FLEXGlobalsRowApplication:
-            title = @"💾  +[UIApplication sharedApplication]";
-            break;
-            
-        case FLEXGlobalsRowKeyWindow:
-            title = @"🔑  -[UIApplication keyWindow]";
-            break;
-            
-        case FLEXGlobalsRowMainScreen:
-            title = @"💻  +[UIScreen mainScreen]";
-            break;
-            
-        case FLEXGlobalsRowCurrentDevice:
-            title = @"📱  +[UIDevice currentDevice]";
-            break;
-            
-        case FLEXGlobalsRowFileBrowser:
-            title = @"📁  File Browser";
-            break;
-    }
-    return title;
+    FLEXGlobalsTableViewControllerEntry *entry = [self globalEntryAtIndexPath:indexPath];
+
+    return entry.entryNameFuture();
 }
 
-- (UIViewController *)drillDownViewControllerForRowType:(FLEXGlobalsRow)rowType
+- (UIViewController *)viewControllerToPushForRowAtIndexPath:(NSIndexPath *)indexPath
 {
-    UIViewController *viewController = nil;
-    switch (rowType) {
-        case FLEXGlobalsRowAppClasses: {
-            FLEXClassesTableViewController *classesViewController = [[FLEXClassesTableViewController alloc] init];
-            classesViewController.binaryImageName = [FLEXUtility applicationImageName];
-            viewController = classesViewController;
-        } break;
-            
-        case FLEXGlobalsRowSystemLibraries: {
-            FLEXLibrariesTableViewController *librariesViewController = [[FLEXLibrariesTableViewController alloc] init];
-            librariesViewController.title = [self titleForRowType:FLEXGlobalsRowSystemLibraries];
-            viewController = librariesViewController;
-        } break;
-            
-        case FLEXGlobalsRowLiveObjects: {
-            viewController = [[FLEXLiveObjectsTableViewController alloc] init];
-        } break;
-            
-        case FLEXGlobalsRowAppDelegate: {
-            id <UIApplicationDelegate> appDelegate = [[UIApplication sharedApplication] delegate];
-            viewController = [FLEXObjectExplorerFactory explorerViewControllerForObject:appDelegate];
-        } break;
-            
-        case FLEXGlobalsRowRootViewController: {
-            UIViewController *rootViewController = [self.applicationWindow rootViewController];
-            viewController = [FLEXObjectExplorerFactory explorerViewControllerForObject:rootViewController];
-        } break;
-            
-        case FLEXGlobalsRowUserDefaults: {
-            NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
-            viewController = [FLEXObjectExplorerFactory explorerViewControllerForObject:standardUserDefaults];
-        } break;
-            
-        case FLEXGlobalsRowApplication: {
-            UIApplication *sharedApplication = [UIApplication sharedApplication];
-            viewController = [FLEXObjectExplorerFactory explorerViewControllerForObject:sharedApplication];
-        } break;
-            
-        case FLEXGlobalsRowKeyWindow: {
-            viewController = [FLEXObjectExplorerFactory explorerViewControllerForObject:self.applicationWindow];
-        } break;
-            
-        case FLEXGlobalsRowMainScreen: {
-            UIScreen *mainScreen = [UIScreen mainScreen];
-            viewController = [FLEXObjectExplorerFactory explorerViewControllerForObject:mainScreen];
-        } break;
-            
-        case FLEXGlobalsRowCurrentDevice: {
-            UIDevice *currentDevice = [UIDevice currentDevice];
-            viewController = [FLEXObjectExplorerFactory explorerViewControllerForObject:currentDevice];
-        } break;
-            
-        case FLEXGlobalsRowFileBrowser: {
-            viewController = [[FLEXFileBrowserTableViewController alloc] init];
-        }
-    }
-    return viewController;
-}
+    FLEXGlobalsTableViewControllerEntry *entry = [self globalEntryAtIndexPath:indexPath];
 
+    return entry.viewControllerFuture();
+}
 
 #pragma mark - Table View Data Source
 
@@ -200,7 +242,7 @@ typedef NS_ENUM(NSUInteger, FLEXGlobalsRow) {
 
 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 {
-    return [self.rows count];
+    return [self.entries count];
 }
 
 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
@@ -212,8 +254,8 @@ typedef NS_ENUM(NSUInteger, FLEXGlobalsRow) {
         cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
         cell.textLabel.font = [FLEXUtility defaultTableViewCellLabelFont];
     }
-    FLEXGlobalsRow rowType = [self rowTypeAtIndexPath:indexPath];
-    cell.textLabel.text = [self titleForRowType:rowType];
+
+    cell.textLabel.text = [self titleForRowAtIndexPath:indexPath];
     
     return cell;
 }
@@ -223,9 +265,9 @@ typedef NS_ENUM(NSUInteger, FLEXGlobalsRow) {
 
 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
 {
-    FLEXGlobalsRow rowType = [self rowTypeAtIndexPath:indexPath];
-    UIViewController *drillDownViewController = [self drillDownViewControllerForRowType:rowType];
-    [self.navigationController pushViewController:drillDownViewController animated:YES];
+    UIViewController *viewControllerToPush = [self viewControllerToPushForRowAtIndexPath:indexPath];
+
+    [self.navigationController pushViewController:viewControllerToPush animated:YES];
 }
 
 @end

+ 21 - 0
Classes/Object Explorers/FLEXGlobalsTableViewControllerEntry.h

@@ -0,0 +1,21 @@
+//
+//  FLEXGlobalsTableViewControllerEntry.h
+//  UICatalog
+//
+//  Created by Javier Soto on 7/26/14.
+//  Copyright (c) 2014 f. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+typedef NSString *(^FLEXGlobalsTableViewControllerEntryNameFuture)(void);
+typedef UIViewController *(^FLEXGlobalsTableViewControllerViewControllerFuture)(void);
+
+@interface FLEXGlobalsTableViewControllerEntry : NSObject
+
+@property (nonatomic, readonly, copy) FLEXGlobalsTableViewControllerEntryNameFuture entryNameFuture;
+@property (nonatomic, readonly, copy) FLEXGlobalsTableViewControllerViewControllerFuture viewControllerFuture;
+
++ (instancetype)entryWithNameFuture:(FLEXGlobalsTableViewControllerEntryNameFuture)nameFuture viewControllerFuture:(FLEXGlobalsTableViewControllerViewControllerFuture)viewControllerFuture;
+
+@end

+ 25 - 0
Classes/Object Explorers/FLEXGlobalsTableViewControllerEntry.m

@@ -0,0 +1,25 @@
+//
+//  FLEXGlobalsTableViewControllerEntry.m
+//  UICatalog
+//
+//  Created by Javier Soto on 7/26/14.
+//  Copyright (c) 2014 f. All rights reserved.
+//
+
+#import "FLEXGlobalsTableViewControllerEntry.h"
+
+@implementation FLEXGlobalsTableViewControllerEntry
+
++ (instancetype)entryWithNameFuture:(FLEXGlobalsTableViewControllerEntryNameFuture)nameFuture viewControllerFuture:(FLEXGlobalsTableViewControllerViewControllerFuture)viewControllerFuture
+{
+    NSParameterAssert(nameFuture);
+    NSParameterAssert(viewControllerFuture);
+
+    FLEXGlobalsTableViewControllerEntry *entry = [[self alloc] init];
+    entry->_entryNameFuture = [nameFuture copy];
+    entry->_viewControllerFuture = [viewControllerFuture copy];
+
+    return entry;
+}
+
+@end

+ 16 - 0
Example/UICatalog.xcodeproj/project.pbxproj

@@ -90,6 +90,7 @@
 		944F74B5197B458C009AB039 /* FLEXHierarchyTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7484197B458C009AB039 /* FLEXHierarchyTableViewCell.m */; };
 		944F74B6197B458C009AB039 /* FLEXHierarchyTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7486197B458C009AB039 /* FLEXHierarchyTableViewController.m */; };
 		944F74B7197B458C009AB039 /* FLEXImagePreviewViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7488197B458C009AB039 /* FLEXImagePreviewViewController.m */; };
+		D03647D919847248007D2A1B /* FLEXGlobalsTableViewControllerEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = D03647D819847248007D2A1B /* FLEXGlobalsTableViewControllerEntry.m */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXFileReference section */
@@ -253,6 +254,9 @@
 		944F7486197B458C009AB039 /* FLEXHierarchyTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXHierarchyTableViewController.m; sourceTree = "<group>"; };
 		944F7487197B458C009AB039 /* FLEXImagePreviewViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXImagePreviewViewController.h; sourceTree = "<group>"; };
 		944F7488197B458C009AB039 /* FLEXImagePreviewViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXImagePreviewViewController.m; sourceTree = "<group>"; };
+		D03647D51984720F007D2A1B /* FLEXManager+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "FLEXManager+Private.h"; sourceTree = "<group>"; };
+		D03647D719847248007D2A1B /* FLEXGlobalsTableViewControllerEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXGlobalsTableViewControllerEntry.h; sourceTree = "<group>"; };
+		D03647D819847248007D2A1B /* FLEXGlobalsTableViewControllerEntry.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXGlobalsTableViewControllerEntry.m; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -441,6 +445,7 @@
 				944F7438197B458C009AB039 /* FLEXViewControllerExplorerViewController.m */,
 				944F7439197B458C009AB039 /* FLEXViewExplorerViewController.h */,
 				944F743A197B458C009AB039 /* FLEXViewExplorerViewController.m */,
+				D03647D619847235007D2A1B /* Private */,
 			);
 			name = "Object Explorers";
 			path = "../Classes/Object Explorers";
@@ -523,6 +528,7 @@
 				944F746C197B458C009AB039 /* FLEXExplorerViewController.m */,
 				944F746D197B458C009AB039 /* FLEXManager.h */,
 				944F746E197B458C009AB039 /* FLEXManager.m */,
+				D03647D51984720F007D2A1B /* FLEXManager+Private.h */,
 				944F746F197B458C009AB039 /* FLEXToolbarItem.h */,
 				944F7470197B458C009AB039 /* FLEXToolbarItem.m */,
 				944F7471197B458C009AB039 /* FLEXWindow.h */,
@@ -577,6 +583,15 @@
 			name = "FLEX Integration";
 			sourceTree = "<group>";
 		};
+		D03647D619847235007D2A1B /* Private */ = {
+			isa = PBXGroup;
+			children = (
+				D03647D719847248007D2A1B /* FLEXGlobalsTableViewControllerEntry.h */,
+				D03647D819847248007D2A1B /* FLEXGlobalsTableViewControllerEntry.m */,
+			);
+			name = Private;
+			sourceTree = "<group>";
+		};
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
@@ -706,6 +721,7 @@
 				944F74A4197B458C009AB039 /* FLEXFieldEditorView.m in Sources */,
 				944F74A7197B458C009AB039 /* FLEXMethodCallingViewController.m in Sources */,
 				535682B818F3670300BAAD62 /* AAPLSplitViewControllerDelegate.m in Sources */,
+				D03647D919847248007D2A1B /* FLEXGlobalsTableViewControllerEntry.m in Sources */,
 				535682AC18F3670300BAAD62 /* AAPLCustomSearchBarViewController.m in Sources */,
 				535682A718F3670300BAAD62 /* AAPLActionSheetViewController.m in Sources */,
 				01985ABC1984DE9500A65332 /* FLEXArgumentInputFontsPickerView.m in Sources */,