Skip to content
Browse files

Added root node. Documentation and cleanup.

  • Loading branch information...
1 parent 52dd036 commit 7966939d7a0222d48eb4e37e84fb2251109b9a56 @balthamos committed Aug 14, 2010
View
4 NerdTool/classes/AppDelegate.m
@@ -60,6 +60,10 @@ - (void)removeLoginItem:(NSString*)path;
- (BOOL)isLoginItem:(NSString*)path;
@end
+/*
+ This class gives hooks for the user to interface with
+ */
+
#pragma mark
@implementation AppDelegate
View
3 NerdTool/classes/NTOutlineView.m
@@ -23,6 +23,9 @@
#import "NTOutlineView.h"
+/*
+ This is the UI to view the tree
+ */
@implementation NTOutlineView
View
445 NerdTool/classes/NTTreeController.m
@@ -20,7 +20,7 @@
* along with NerdTool. If not, see <http://www.gnu.org/licenses/>.
*/
-// TODO plug original developer
+// TODO: plug original developer
#import "NTTreeController.h"
#import "NSTreeController_Extensions.h"
@@ -31,7 +31,7 @@
#import "NTLog.h"
#import "NTGroup.h"
#import "NTTreeNode.h"
-
+#import "NTShell.h"
@interface NTTreeController (Observer)
@end
@@ -49,50 +49,150 @@ - (NTLog *)_findNextReferenceLogFor:(NTLog *)item direction:(NSWindowOrderingMod
@end
@interface NTTreeController (TreeAccessors)
-- (NSSet *)_unorderedAllLogs;
-- (NSArray *)_allLogs;
-- (NSArray *)_allEnabledLogs;
+- (NSSet *)_allLogsUnordered;
+- (NSArray *)_allLogsOrdered;
+- (NSArray *)_allLogsEnabled;
- (NSSet *)_unorderedLogsIn:(NSSet *)ntNodes;
-- (NSArray *)_logsIn:(NSArray *)ntNodes;
+- (NSArray *)_orderedLogsIn:(NSArray *)ntNodes;
- (NSArray *)_enabledLogsIn:(NSArray *)ntNodes;
-- (NSArray *)_leafDescendantRepObjsForNodes:(NSArray *)nodes;
-- (NSArray *)_enabledLeafDescendantRepObjsForNodes:(NSArray *)nodes;
-- (NSArray *)_leafDescendantRepObjsForGroup:(NTGroup *)group;
-- (NSArray *)_enabledDescendantLogsForGroup:(NTGroup *)group;
-- (NSArray *)_leafDescendantRepObjsForNTNodes:(NSArray *)ntNodes;
+- (NSArray *)_descendantLogsForNodes:(NSArray *)nodes;
+- (NSArray *)_enabledDescendantLogsForNodes:(NSArray *)nodes;
+- (NSArray *)_NTLogsBeneathGroup:(NTGroup *)group;
+- (NSArray *)_enabledNTLogsBeneathGroup:(NTGroup *)group;
+- (NSArray *)_descendantLogsForNTNodes:(NSArray *)ntNodes;
- (NSSet *)_unorderedLeafDescendantForNTNodes:(NSSet *)ntNodes;
- (NSArray *)_leafDescendantRepObjsForIndexPaths:(NSArray *)indexPaths;
@end
-
+/**
+ * Responsible for managing the tree. Adding object(s), deleting object(s), moving object(s).
+ * It should also be able to list the contents of the tree in a simple manner.
+ * Because this class moves the logs around, it should also maintain the order
+ */
@implementation NTTreeController
@synthesize previousSelectedLogs;
#pragma mark Content Modifiers
+
+// Generates root node if we need one. Returns TRUE if it generated one, FALSE if one was already there.
+- (BOOL)generateRootObject
+{
+ BOOL generated = NO;
+ int rootNodes = [self numberOfRootNodes];
+
+ if (rootNodes <= 0)
+ {
+ // TODO: should set parent of existing nodes to ROOT
+ NTGroup *root = [NSEntityDescription insertNewObjectForEntityForName:@"Group" inManagedObjectContext:[self managedObjectContext]];
+ root.name = @"ROOT";
+ root.isSpecialGroup = [NSNumber numberWithBool:YES];
+ [self insertObject:root atArrangedObjectIndexPath:[NSIndexPath indexPathWithIndex:0]];
+ generated = TRUE;
+ }
+ else if (rootNodes > 1)
+ {
+ [NSException raise:@"MyException" format:@"There are more than one root nodes!"];
+ }
+
+ return generated;
+}
+
+- (int)numberOfRootNodes
+{
+ NSFetchRequest *request = [[NSFetchRequest alloc] init];
+ [request setEntity:[NSEntityDescription entityForName:@"Group" inManagedObjectContext:[self managedObjectContext]]];
+ [request setPredicate:[NSPredicate predicateWithFormat:@"isSpecialGroup == 1"]];
+
+ NSError *error = nil;
+ int rootNodes = [[self managedObjectContext] countForFetchRequest:request error:&error];
+
+ [request release];
+ return rootNodes;
+}
+
+- (NTGroup*)rootNode
+{
+ NSFetchRequest *request = [[NSFetchRequest alloc] init];
+ [request setEntity:[NSEntityDescription entityForName:@"Group" inManagedObjectContext:[self managedObjectContext]]];
+ [request setPredicate:[NSPredicate predicateWithFormat:@"isSpecialGroup == 1"]];
+
+ NSError* error = nil;
+ NSArray* managedObjects = [[self managedObjectContext] executeFetchRequest:request error:&error];
+
+ if(!managedObjects)
+ {
+ [NSException raise:@"MyException" format:@"Error occurred during fetch: %@",error];
+ }
+
+ NTGroup* rootItem = nil;
+ if([managedObjects count]) rootItem = [managedObjects objectAtIndex:0];
+
+ [request release];
+ return rootItem;
+}
+
+/**
+ * Inserts NTTreeNode `object' at NSIndexPath `indexPath'.
+ * @param[in] object The object to insert. A solid NTTreeNode object (NTLog or NTGroup)
+ * @param[in] indexPath Index path to insert object.
+ */
- (void)insertObject:(id)object atArrangedObjectIndexPath:(NSIndexPath *)indexPath;
{
+ if([indexPath length] == 1)
+ {
+ NTGroup *rootItem = [self rootNode];
+ if (!rootItem) [NSException raise:@"MyException" format:@"Could not find root note!"];
+ ((NTTreeNode*)object).parent = rootItem;
+ }
+
[super insertObject:object atArrangedObjectIndexPath:indexPath];
[self _updateSortOrderOfModelObjects];
- NSArray *objectArray = [self _leafDescendantRepObjsForNTNodes:[NSArray arrayWithObject:object]];
+ // TODO: objects should create themselves KVO on effectiveenabled
+ //NSArray *objectArray = [self _orderedLogsIn:[NSArray arrayWithObject:object]];
+ //[self createAndDestroyLogsIfNecessary:objectArray];
- [self createAndDestroyLogsIfNecessary:objectArray];
- [self moveNodeWindows:objectArray];
+ // make sure that log windows are moved after their windos have been
+ // initialized. Otherwise, we "move" the windows, then create them
+ //[self moveNodeWindows:objectArray];
}
+/**
+ * Inserts multiple NTTreeNode `objects' at multiple NSIndexPath's `indexPaths'.
+ * @param[in] objects An array of solid NTTreeNode objects (NTLog or NTGroup) to insert.
+ * @param[in] indexPath An array of index paths to insert objects.
+ */
- (void)insertObjects:(NSArray *)objects atArrangedObjectIndexPaths:(NSArray *)indexPaths;
{
+ NTGroup *rootItem = [self rootNode];
+ for (NSIndexPath *path in indexPaths)
+ {
+ if ([path length] == 1)
+ {
+ static NSUInteger i = 0;
+ id object = [objects objectAtIndex:i];
+ if (!rootItem) [NSException raise:@"MyException" format:@"Could not find root note!"];
+ ((NTTreeNode*)object).parent = rootItem;
+ i++;
+ }
+ }
[super insertObjects:objects atArrangedObjectIndexPaths:indexPaths];
[self _updateSortOrderOfModelObjects];
- NSArray *objectArray = [self _leafDescendantRepObjsForNTNodes:objects];
+ // TODO: objects should create themselves KVO on effectiveenabled
+ //NSArray *objectArray = [self _orderedLogsIn:objects];
+ //[self createAndDestroyLogsIfNecessary:objectArray];
- [self createAndDestroyLogsIfNecessary:objectArray];
- [self moveNodeWindows:objectArray];
+ //[self moveNodeWindows:objectArray];
}
+/**
+ * Removes object located at NSIndexPath `indexPath'.
+ * This function should not be called directly.
+ * @param[in] indexPath NSIndexPath to object to remove
+ */
- (void)removeObjectAtArrangedObjectIndexPath:(NSIndexPath *)indexPath;
{
NSArray *objectArray = [self _leafDescendantRepObjsForIndexPaths:[NSArray arrayWithObject:indexPath]];
@@ -103,6 +203,11 @@ - (void)removeObjectAtArrangedObjectIndexPath:(NSIndexPath *)indexPath;
[objectArray makeObjectsPerformSelector:@selector(destroyLog)];
}
+/**
+ * Removes objects located at NSIndexPath's `indexPaths'.
+ * This function should not be called directly.
+ * @param[in] indexPaths NSArray of NSIndexPath's of objects to remove
+ */
- (void)removeObjectsAtArrangedObjectIndexPaths:(NSArray *)indexPaths;
{
NSArray *objectArray = [self _leafDescendantRepObjsForIndexPaths:indexPaths];
@@ -113,25 +218,45 @@ - (void)removeObjectsAtArrangedObjectIndexPaths:(NSArray *)indexPaths;
[objectArray makeObjectsPerformSelector:@selector(destroyLog)];
}
+/**
+ * Moves NSTreeNode `node' to NSIndexPath `indexPath'.
+ * @param[in] node NSTreeNode to move.
+ * @param[in] indexPath NSIndexPath of where to move `node'.
+ */
- (void)moveNode:(NSTreeNode *)node toIndexPath:(NSIndexPath *)indexPath;
{
[super moveNode:node toIndexPath:indexPath];
- [self _updateSortOrderOfModelObjects];
+ [self _updateSortOrderOfModelObjects];
+
+ NSArray *enabledArray = [self _enabledDescendantLogsForNodes:[NSArray arrayWithObject:node]];
+ NSArray *allArray = [self _descendantLogsForNodes:[NSArray arrayWithObject:node]];
+
+ //[self createAndDestroyLogsIfNecessary:allArray];
+ //[self moveNodeWindows:enabledArray];
}
+/**
+ * Moves all NSTreeNodes `nodes' to NSIndexPath `indexPath'.
+ * @param[in] nodes NSArray of NSTreeNode's to move.
+ * @param[in] indexPath NSIndexPath of where to move `nodes'.
+ */
- (void)moveNodes:(NSArray *)nodes toIndexPath:(NSIndexPath *)indexPath;
{
[super moveNodes:nodes toIndexPath:indexPath];
[self _updateSortOrderOfModelObjects];
- // !!!: uncomment
- //NSArray *enabledArray = [self _enabledLeafDescendantRepObjsForNodes:nodes];
- //NSArray *allArray = [self _leafDescendantRepObjsForNodes:nodes];
+ NSArray *enabledArray = [self _enabledDescendantLogsForNodes:nodes];
+ NSArray *allArray = [self _descendantLogsForNodes:nodes];
//[self createAndDestroyLogsIfNecessary:allArray];
//[self moveNodeWindows:enabledArray];
}
+/**
+ * Updates sort order of all NTTreeNode objects.
+ * This takes the entire opaque NSTreeNode tree structure, pulls each
+ * representive object and assigns a sort index.
+ */
- (void)_updateSortOrderOfModelObjects
{
for (NSTreeNode *node in [self flattenedNodes])
@@ -148,6 +273,7 @@ - (void)awakeFromNib
[self addObserver:self forKeyPath:@"selectedObjects" options:0 context:nil];
[self addObserver:self forKeyPath:@"arrangedObjects" options:NSKeyValueObservingOptionOld context:nil];
[self addObserver:self forKeyPath:@"effectiveEnabled" options:0 context:nil];
+ [self generateRootObject];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
@@ -201,7 +327,7 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N
return;
}
- if (![[self _unorderedAllLogs] containsObject:item]) return;
+ if (![[self _allLogsUnordered] containsObject:item]) return;
}
// TODO: GCD Blocking canidate
@@ -221,7 +347,7 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N
if (once) return;
once = TRUE;
- NSArray *logArray = [self _allLogs];
+ NSArray *logArray = [self _allLogsOrdered];
[self createAndDestroyLogsIfNecessary:logArray];
[self moveNodeWindows:logArray];
}
@@ -237,34 +363,45 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N
@implementation NTTreeController(LogManipulation)
-// Take an array of NTLogs and create/destroy their log processes as needed
+/**
+ * Take an array of NTLogs and create/destroy their log processes as needed.
+ * @param[in] logs An array of NTLogs to create or destroy.
+ */
- (void)createAndDestroyLogsIfNecessary:(NSArray *)logs
{
for (NTLog *log in logs)
{
- if (![log.enabled boolValue] || ![[log parentHierarchyEnabled] boolValue]) [log destroyLogProcess];
- else if ([log.enabled boolValue])
+ if (log.effectiveEnabled)
{
[log createLogProcess];
[log updateWindowIncludingTimer:YES];
if ([[self selectedObjects] containsObject:log]) [log setHighlighted:YES from:self];
}
+ else [log destroyLogProcess];
}
}
-// Takes an NTLog and positions it's window correctly with respect to windows of other NTLogs
+/**
+ * Takes an NTLog and positions it's window correctly with respect to windows of other NTLogs.
+ * Using this function requires the node be enabled.
+ * TODO: Does `node' need to have an active window as well?
+ * @param[in] node NTLog to put into position.
+ */
- (void)moveNodeWindow:(NTLog *)node
{
- if (!node || ![node.enabled boolValue]) return;
-
// since we are only moving one node, we can use all the logs for reference
- [self moveNodeWindow:node usingRefLogs:[self _allEnabledLogs]];
+ [self moveNodeWindow:node usingRefLogs:[self _allLogsEnabled]];
}
-// Moves a single NTLog into position, but restricts the references to which it can position the window against to `refLogs'.
+/**
+ * Moves a single NTLog into position, but restricts the references to which it can position the window against to `refLogs'.
+ * @param[in] node NTLog to put into position.
+ * @param[in] refLogs An array of NTLogs to use as a reference position. This
+ * array must be properly ordered.
+ */
- (void)moveNodeWindow:(NTLog *)node usingRefLogs:(NSArray *)refLogs
{
- if (!node || ![node.enabled boolValue]) return;
+ if (!node || !node.effectiveEnabled) return;
NTLog *refLog = nil;
NSWindowOrderingMode direction = NSWindowAbove;
@@ -274,21 +411,25 @@ - (void)moveNodeWindow:(NTLog *)node usingRefLogs:(NSArray *)refLogs
else [node front];
}
-// Takes an array of NTLogs and positions their windows correctly without using logs from `nodes'. This method assures that while moving groups of NTLogs, they will not be placed with a bad reference.
+/**
+ * Takes an array of NTLogs and positions their windows correctly without using logs from `nodes'.
+ * This method assures that while moving groups of NTLogs, they will not be placed with a bad reference.
+ * @param[in] An array of NTLogs to move properly into position.
+ */
- (void)moveNodeWindows:(NSArray *)nodes
{
- if (!nodes) return;
+ if (!nodes || [nodes count] <= 0) return;
// find all canidates
- NSArray *allLogs = [self _allEnabledLogs];
+ NSArray *allLogs = [self _allLogsEnabled];
NSMutableArray *refLogs = [NSMutableArray array];
NSMutableArray *nodesToKeep = [NSMutableArray array];
NSMutableArray *nodesToDelete = [NSMutableArray array];
NSEnumerator *e = [nodes reverseObjectEnumerator];
for (NTLog *node in e)
{
- if (![node.enabled boolValue]) continue;
+ if (!node.effectiveEnabled) continue;
[refLogs setArray:allLogs]; // reset our refs
[nodesToKeep addObject:node]; // every time we run through this loop, we gain another reference log to use
@@ -301,12 +442,74 @@ - (void)moveNodeWindows:(NSArray *)nodes
}
}
+- (void)moveNodeWindows1:(NSArray *)nodes allNodes:(NSArray *)allNodes
+{
+ if (!nodes || [nodes count] <= 0) return;
+
+ // find all canidates
+ NSArray *allLogs = allNodes;
+ NSMutableArray *refLogs = [NSMutableArray array];
+ NSMutableArray *nodesToKeep = [NSMutableArray array];
+ NSMutableArray *nodesToDelete = [NSMutableArray array];
+ NSEnumerator *e = [nodes reverseObjectEnumerator];
+ for (NTLog *node in allLogs)
+ {
+ if (!node.effectiveEnabled) continue;
+
+ [refLogs setArray:allLogs]; // reset our refs
+ [nodesToKeep addObject:node]; // every time we run through this loop, we gain another reference log to use
+
+ [nodesToDelete setArray:nodes];
+ [nodesToDelete removeObjectsInArray:nodesToKeep]; // protect the nodes we want to keep
+ [refLogs removeObjectsInArray:nodesToDelete]; // kill the rest from our refs
+
+ [self moveNodeWindow:node usingRefLogs:refLogs];
+ }
+}
+
+- (void)moveNodeWindows2:(NSArray *)nodes allNodes:(NSArray *)allNodes
+{
+ if (!nodes || [nodes count] <= 0) return;
+
+ // find all canidates
+ NSArray *allLogs = allNodes;
+ NSEnumerator *e = [nodes reverseObjectEnumerator];
+ for (NTLog *node in allLogs)
+ {
+ if (!node.effectiveEnabled) continue;
+ [node front];
+ }
+}
+
@end
@implementation NTTreeController (NodeProperties)
-// return the closest NTLog in `refLogs' to NTLog `item'. Direction is changed to the relative position of the returned NTLog to NTLog `item'
-- (NTLog *)_findNextReferenceLogFor:(NTLog *)item direction:(NSWindowOrderingMode*)direction usingRefLogs:(NSArray *)refLogs
+
+/**
+ * Finds closest neighboring NTLog to the NTLog `item'.
+ * Given a flat, ordered array representation of a tree structure (containing only NTLogs), this function will return a reference NTLog to the input `item', and include a reference direction (if the closest log is either above or below `item').
+ * This function checks for top references before bottom references.
+ * It is also important to note that in order for an NTLog in `refLogs' to be considered a neighbor, it **must** have an active window. The main purpose of this function is to facilitate window ordering, so a neighbor with no active window is useless to us.
+ * Example. `item' = foo. `refLogs' is as follows:
+ *
+ * - EnabledLog1
+ * - EnabledLog2
+ * - DisabledLog1
+ * - DisabledLog2
+ * - foo
+ * - EnabledLog3
+ * - DisabledLog3
+ * - DisabledLog4
+ *
+ * The function would return `EnabledLog2' with a `direction' of NSWindowBelow. Note that even though EnabledLog3 is closer, EnabledLog2 is returned because the code checks the top of the array first.
+ *
+ * @param[in] item The base NTLog. Must exist in `refLogs'.
+ * @param[in] refLogs Neighboring NTLogs to `item'. This is ordered array that represents the flattened tree structure.
+ * @param[out] direction Pointer that will contain the relative position of the neighboring log. This is where the base object is with respect to the returned object.
+ * @returns NTLog that is closest to the base NTLog.
+ */
+- (NTLog *)_findNextReferenceLogFor:(NTLog *)item direction:(NSWindowOrderingMode *)direction usingRefLogs:(NSArray *)refLogs
{
// find which part of the array is good for us to use
int baseLogIndex = [refLogs indexOfObject:item];
@@ -337,7 +540,10 @@ - (NTLog *)_findNextReferenceLogFor:(NTLog *)item direction:(NSWindowOrderingMod
return nil;
}
-// Block statement to test for a good reference log
+/**
+ * A GCD Block statement for finding logs with active windowControllers.
+ * This function is used primarily by _findNextReferenceLogFor
+ */
- (BOOL (^)(id obj, NSUInteger idx, BOOL *stop))_blockTestingForRefLog
{
return [[^(id obj, NSUInteger idx, BOOL *stop)
@@ -357,149 +563,153 @@ - (NTLog *)_findNextReferenceLogFor:(NTLog *)item direction:(NSWindowOrderingMod
@implementation NTTreeController (TreeAccessors)
-// Returns an unordered set of all NTLog objects
-- (NSSet *)_unorderedAllLogs
+/**
+ * Returns an unordered set of all NTLog objects.
+ * @returns Unordered set of all NTLog objects in the tree.
+ */
+- (NSSet *)_allLogsUnordered
{
return [self _unorderedLogsIn:[self content]];
}
-// Returns a sorted array of all NTLog objects
-- (NSArray *)_allLogs
+/**
+ * Returns an ordered (sorted) array of all NTLog objects.
+ * @returns Ordered (sorted) array of all NTLog objects in the tree.
+ */
+- (NSArray *)_allLogsOrdered
{
- return [self _logsIn:[self content]];
+ return [self _orderedLogsIn:[self content]];
}
-// Returns a sorted array of all effective enabled NTLog objects
-- (NSArray *)_allEnabledLogs
+/**
+ * Returns an ordered (sorted) array of all effective enabled NTLog objects.
+ * @returns Ordered (sorted) array of all effective enabled NTLog objects in the tree.
+ */
+- (NSArray *)_allLogsEnabled
{
return [self _enabledLogsIn:[self content]];
}
-// Returns an unordered set of NTLogs that descend from the set `ntNodes' (inclusive)
+/**
+ * Returns an unordered set of all NTLog objects that descend from the set `ntNodes' (inclusive).
+ * @param[in] ntNodes An NSSet of NTNodes to flatten
+ * @returns Unordered set of all NTLog objects in `ntNodes'.
+ */
- (NSSet *)_unorderedLogsIn:(NSSet *)ntNodes
{
NSMutableSet *set = [NSMutableSet set];
for (NTTreeNode *ntNode in ntNodes)
{
- [set unionSet:[ntNode unorderedDescendants]];
+ if ([ntNode.isLeaf boolValue]) [set addObject:ntNode];
+ else [set unionSet:[ntNode unorderedDescendants]];
}
return [[set copy] autorelease];
}
-// Returns an ordered array of NTLogs that descend from the array `ntNodes' (inclusive)
-- (NSArray *)_logsIn:(NSArray *)ntNodes
+/**
+ * Returns an ordered (sorted) array of all NTLog objects that descend from the set `ntNodes' (inclusive).
+ * @param[in] ntNodes An NSArray of NTNodes to flatten.
+ * @returns Ordered (sorted) array of all NTLog objects in `ntNodes'.
+ */
+- (NSArray *)_orderedLogsIn:(NSArray *)ntNodes
{
NSMutableArray *array = [NSMutableArray array];
for (NTTreeNode *ntNode in ntNodes)
{
- [array addObjectsFromArray:[ntNode orderedDescendants]];
+ if ([ntNode.isLeaf boolValue]) [array addObject:ntNode];
+ else [array addObjectsFromArray:[ntNode orderedDescendants]];
}
return [[array copy] autorelease];
}
-// Returns an ordered array of effective enabled NTLogs that descend from the array `ntNodes' (inclusive)
+/**
+ * Returns an ordered (sorted) array of all effective enabled NTLog objects that descend from the set `ntNodes' (inclusive).
+ * @param[in] ntNodes An NSArray of NTNodes to flatten.
+ * @returns Ordered (sorted) array of all effective enabled NTLog objects in `ntNodes'.
+ */
- (NSArray *)_enabledLogsIn:(NSArray *)ntNodes
{
NSMutableArray *array = [NSMutableArray array];
for (NTTreeNode *ntNode in ntNodes)
{
- [array addObjectsFromArray:[ntNode orderedEnabledDescendants]];
+ if ([ntNode.isLeaf boolValue]) [array addObject:ntNode];
+ else [array addObjectsFromArray:[ntNode orderedEnabledDescendants]];
}
return [[array copy] autorelease];
}
-- (NTTreeNode *)objectAtIndexPath:(NSIndexPath *)indexPath
-{
- NSArray *object = [self content];
- int i;
- for (i=0; i < [indexPath length]; i++)
- {
- object = [object objectAtIndex:[indexPath indexAtPosition:i]];
- }
-}
-
#pragma mark (NSTreeNode) Node Leaf Descendants
-// a (sorted) array of all NTLog objects that descend from the array of NSTreeNode `nodes'
-- (NSArray *)_leafDescendantRepObjsForNodes:(NSArray *)nodes
+/**
+ * Returns a sorted array of all NTLog objects that descend from the array of opaque NSTreeNode `nodes'.
+ * This operation is inclusive.
+ *
+ * Example
+ *
+ * - Group1
+ * - Log1
+ * - Log2
+ * - Log3
+ * - Group2
+ * - Group3
+ * - Log4
+ * - Log5
+ * - Log6
+ * - Group3
+ * - Log6
+ * - Log7
+ * - Log8
+ * - Log9
+ *
+ * For `nodes' Group2, Group3, and Log8, this function returns the represented objects
+ * for logs 4-8 (which will be NTLogs).
+ *
+ * TODO: What happens if the same node is in the array multiple times? Empty
+ * array? Null array?
+ *
+ * @param[in] nodes An array of nodes to pull represented objects from.
+ * @returns Ordered (sorted) array of NTLog objects.
+ */
+- (NSArray *)_descendantLogsForNodes:(NSArray *)nodes
{
NSMutableArray *array = [NSMutableArray array];
+
for (NSTreeNode *item in nodes)
{
if ([item isLeaf]) [array addObject:[item representedObject]];
- else [array addObjectsFromArray:[self _leafDescendantRepObjsForNodes:[item childNodes]]];
+ else [array addObjectsFromArray:[self _descendantLogsForNodes:[item childNodes]]];
}
return [[array copy] autorelease];
}
-// a (sorted) array of all enabled NTLog objects that descend from the array of NSTreeNode `nodes', provided that the parent hierarchy is also enabled
-- (NSArray *)_enabledLeafDescendantRepObjsForNodes:(NSArray *)nodes
+/**
+ * Returns a (sorted) array of all enabled NTLog objects that descend from the array of NSTreeNode `nodes', provided that the parent hierarchy is also enabled.
+ * In other words, this returns the NTLogs that are `effectively' enabled.
+ * @param[in] nodes An array of nodes to pull represented objects from.
+ * @returns Ordered (sorted) array of enabled NTLog objects.
+ */
+- (NSArray *)_enabledDescendantLogsForNodes:(NSArray *)nodes
{
NSMutableArray *array = [NSMutableArray array];
NTTreeNode *repObj = nil;
for (NSTreeNode *node in nodes)
{
repObj = [node representedObject];
- if (![[repObj valueForKey:@"enabled"] boolValue]) continue; // is the object enabled?
- if (![self _parentHierarchyEnabledForItem:repObj]) continue; // is the parent hierarchy of the object enabled?
+ if (![[repObj valueForKey:@"enabled"] boolValue]) continue;
if ([node isLeaf]) [array addObject:repObj];
- else [array addObjectsFromArray:[self _enabledLeafDescendantRepObjsForNodes:[node childNodes]]];
+ else [array addObjectsFromArray:[self _enabledDescendantLogsForNodes:[node childNodes]]];
}
return [[array copy] autorelease];
}
-#pragma mark NTGroup Leaf Descendants
-// a (sorted) array of all NTLog objects that descend from the NTGroup `group'
-- (NSArray *)_leafDescendantRepObjsForGroup:(NTGroup *)group
-{
- NSTreeNode *groupTreeNode = [self treeNodeForObject:group];
- return [[groupTreeNode leafDescendants] valueForKey:@"representedObject"];
-}
-
-// a (sorted) array of all enabled NTLog objects that descend from the NTGroup `group', provided that the parent hierarchy is also enabled
-- (NSArray *)_enabledDescendantLogsForGroup:(NTGroup *)group
-{
- if (![self _parentHierarchyEnabledForItem:group]) return nil; // bail early if our hierarchy isn't enabled
-
- NSTreeNode *groupTreeNode = [self treeNodeForObject:group];
- return [self _enabledLeafDescendantRepObjsForNodes:[NSArray arrayWithObject:groupTreeNode]];
-}
-
-#pragma mark NTTreeNode Leaf Descendants
-- (NSArray *)_leafDescendantRepObjsForNTNodes:(NSArray *)ntNodes
-{
- NSMutableArray *array = [NSMutableArray array];
- for (NTTreeNode *node in ntNodes)
- {
- if (![[node enabled] boolValue]) continue; // is the object enabled?
- if (![self _parentHierarchyEnabledForItem:node]) continue; // is the parent hierarchy of the object enabled?
-
- if ([[node isLeaf] boolValue]) [array addObject:node];
- else [array addObjectsFromArray:[self _leafDescendantRepObjsForGroup:(NTGroup *)node]];
- }
- return [[array copy] autorelease];
-}
-
-// a (unsorted) array of all NTLog objects that descend from the array of NTTreeNode `nodes'
-- (NSSet *)_unorderedLeafDescendantForNTNodes:(NSSet *)ntNodes
-{
- NSMutableSet *set = [NSMutableSet set];
- for (NTTreeNode *node in ntNodes)
- {
- if ([[node isLeaf] boolValue]) [set addObject:node];
- else [set unionSet:[self _unorderedLeafDescendantForNTNodes:[node children]]];
- }
- return [[set copy] autorelease];
-}
-
#pragma mark NSIndexPath Leaf Descendants
- (NSArray *)_leafDescendantRepObjsForIndexPaths:(NSArray *)indexPaths
{
@@ -509,7 +719,6 @@ - (NSArray *)_leafDescendantRepObjsForIndexPaths:(NSArray *)indexPaths
[array addObject:[self nodeAtIndexPath:indexPath]];
}
- return [self _leafDescendantRepObjsForNodes:array];
+ return [self _descendantLogsForNodes:array];
}
@end
-
View
20 NerdTool/classes/NTTreeNode.h
@@ -32,24 +32,32 @@
// Core Data Properties
@property (nonatomic, retain) NSNumber * enabled;
-@property (nonatomic, retain) NSNumber * isLeaf;
-@property (nonatomic, retain) NSNumber * isSelectable;
+@property (nonatomic, retain) NSNumber * isLeaf; @property (nonatomic, retain) NSNumber * isSelectable;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * sortIndex;
@property (nonatomic, retain) NSSet* children;
@property (nonatomic, retain) NTTreeNode * parent;
@property (copy) NSNumber * parentHierarchyEnabled;
+- (void)configureNode;
+- (void)destroyNode;
+
- (BOOL)effectiveEnabled;
+
+- (NSSet *)children;
+- (NSArray *)sortedChildren;
+- (NSArray *)sortedEnabledChildren;
+
+- (NSArray *)sortSet:(NSSet *)set;
+- (BOOL (^)(id obj, BOOL *stop))objectEnabled;
+
- (NSSet *)unorderedDescendants;
-- (NSSet *)_unorderedDescendants;
- (NSArray *)orderedDescendants;
-- (NSArray *)_orderedDescendants;
- (NSArray *)orderedEnabledDescendants;
-- (NSArray *)_orderedEnabledDescendants;
-- (void)destroyLogProcess;
+
- (void)createLogProcess;
+- (void)destroyLogProcess;
@end
View
121 NerdTool/classes/NTTreeNode.m
@@ -53,12 +53,15 @@ - (void)configureNode
else self.parentHierarchyEnabled = [NSNumber numberWithBool:FALSE];
[self addObserver:self forKeyPath:@"parent" options:0 context:NULL];
+ [self addObserver:self forKeyPath:@"children" options:0 context:NULL];
+ [self addObserver:self forKeyPath:@"enabled" options:0 context:NULL];
[self addObserver:self forKeyPath:@"parentHierarchyEnabled" options:0 context:NULL];
}
- (void)destroyNode
{
[self removeObserver:self forKeyPath:@"parent"];
+ [self removeObserver:self forKeyPath:@"enabled"];
[self removeObserver:self forKeyPath:@"parentHierarchyEnabled"];
}
@@ -72,17 +75,17 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N
{
if([keyPath isEqualToString:@"parent"])
{
-
- [[object children] makeObjectsPerformSelector:@selector(setParentHierarchyEnabled:) withObject:self.parentHierarchyEnabled];
+ //[[object children] makeObjectsPerformSelector:@selector(setParentHierarchyEnabled:) withObject:self.parentHierarchyEnabled];
}
- else if([keyPath isEqualToString:@"parentHierarchyEnabled"])
+ else if([keyPath isEqualToString:@"parentHierarchyEnabled"])// TODO working with enable around here. what does it need to do. Who should handle it?
{
- [[object children] makeObjectsPerformSelector:@selector(setParentHierarchyEnabled:) withObject:self.parentHierarchyEnabled];
+ //[[object children] makeObjectsPerformSelector:@selector(setParentHierarchyEnabled:) withObject:self.parentHierarchyEnabled];
}
+ else if([keyPath isEqualToString:@"children"]){}
else [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
-
+/*
+ (NSSet *)keyPathsForValuesAffectingParent
{
return [NSSet setWithObjects:@"children", nil];
@@ -91,32 +94,64 @@ + (NSSet *)keyPathsForValuesAffectingParent
+ (NSSet *)keyPathsForValuesAffectingEffectiveEnabled
{
return [NSSet setWithObjects:@"parentHierarchyEnabled", @"enabled", nil];
-}
+}*/
#pragma mark Children
+/**
+ * @returns ordered (sorted) array of the object's children
+ */
- (NSArray *)sortedChildren
{
+ NSSet *children = [self children];
+ return [self sortSet:children];
+}
+
+/**
+ * @returns ordered (sorted) array of the object's enabled children
+ */
+- (NSArray *)sortedEnabledChildren
+{
+ NSSet *enabledChildren = [[self children] objectsPassingTest:[self objectEnabled]];
+ return [self sortSet:enabledChildren];
+}
+
+/**
+ * @returns sorts a set into an array using the property `sortIndex'
+ */
+- (NSArray *)sortSet:(NSSet *)set
+{
NSArray *sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"sortIndex" ascending:YES]];
- return [[self children] sortedArrayUsingDescriptors:sortDescriptors];
+ return [set sortedArrayUsingDescriptors:sortDescriptors];
}
-#pragma mark Descendants
-/*
- * NOTE: The reason that these descendants functions include `self' is to avoid creating a proxy object. The function names are somewhat misleading, as it implies that you be your own child.
- * We are trying to get a flat list of NTLogs. With this inclusive implementation, I can call an array of NTTreeNodes and get my flat NTLog list. The alternative to this is creating a proxy NTGroup, point it's children to the NTTreeNode array, and then call -descendants (non-inclusive flavor). This would restore the meaning of `descendant', but when I tried to implement it, I felt the creation of the proxy object was very shady with all the MO stuff going on. I really don't care about keeping track of my changes this proxy object does; I just want access to the functions.
- * Hopefully, my reasoning makes sense to everyone.
+/**
+ * A GCD Block statement to find objects that are enabled
*/
-// Returns an unordered set of all leaf descendants (NTLogs). Inclusive. If none exist, nil is returned.
-- (NSSet *)unorderedDescendants
+- (BOOL (^)(id obj, BOOL *stop))objectEnabled
{
- // This is why the fn is inclusive. Return self if it's a leaf.
- if ([[self isLeaf] boolValue]) return [NSSet setWithObject:self];
- return [self _unorderedDescendants];
+ return [[^(id obj, BOOL *stop)
+ {
+ if ([[obj enabled] boolValue])
+ {
+ *stop = YES;
+ return YES;
+ }
+ return NO;
+ } copy] autorelease];
}
-- (NSSet *)_unorderedDescendants
+#pragma mark Descendants
+
+/**
+ * Returns unordered set of all leaf descendants (NTLogs). If none exist, an
+ * empty set is returned.
+ *
+ * @returns unordered set of all leaf descendants (NTLogs)
+ */
+- (NSSet *)unorderedDescendants
{
NSMutableSet *set = [NSMutableSet set];
+
for (NTTreeNode *child in [self children])
{
if ([[child isLeaf] boolValue]) [set addObject:child];
@@ -125,16 +160,19 @@ - (NSSet *)_unorderedDescendants
return [[set copy] autorelease];
}
-// Returns an ordered set of all leaf descendants (NTLogs). Inclusive. If none exist, nil is returned.
+/**
+ * Returns an ordered (sorted) array of all leaf descendants (NTLogs). If none
+ * exist, an empty array is returned.
+ *
+ * For those of you clever folk, you CANNOT call -unorderedDescendants and then
+ * try to sort by `sortIndex'. `sortIndex' is on a per child relationship, so a
+ * parent's children can have indicies of 1, 2, 3, 4, etc. and the parent's
+ * children's children could also have indicies of 1, 2, 3, 4, etc.
+ *
+ * @returns Ordered (sorted) array of all leaf descendants (NTLogs).
+ */
- (NSArray *)orderedDescendants
{
- // This is why the fn is inclusive. Return self if it's a leaf.
- if ([[self isLeaf] boolValue]) return [NSArray arrayWithObject:self];
- return [self _orderedDescendants];
-}
-
-- (NSArray *)_orderedDescendants
-{
NSMutableArray *array = [NSMutableArray array];
for (NTTreeNode *child in [self sortedChildren])
@@ -145,30 +183,23 @@ - (NSArray *)_orderedDescendants
return [[array copy] autorelease];
}
-// Returns an ordered set of all effective enabled leaf descendants (NTLogs). Inclusive. If none exist, nil is returned.
+/**
+ * Returns an ordered (sorted) array of all effective enabled leaf descendants
+ * (NTLogs). If none exist, an empty array is returned.
+ *
+ * Like the unordered situation, you CANNOT use the -enabledDescendants and
+ * parse out the enabled bits. Actually, you could, but you would be traversing
+ * through the array twice (which is bad).
+ *
+ * @returns Ordered (sorted) array of all effective enabled leaf descendants
+ * (NTLogs)
+ */
- (NSArray *)orderedEnabledDescendants
{
- // If we are not enabled, then our descendants are also not enabled
- if (![self.enabled boolValue]) return nil;
-
- // If our parent hierarchy is not enabled, then neither are we, and hence, neither are our descendants
- if (![self parentHierarchyEnabled]) return nil;
-
- // This is why the fn is inclusive. Return self if it's a leaf.
- if ([[self isLeaf] boolValue]) return [NSArray arrayWithObject:self];
-
- return [self _orderedEnabledDescendants];
-}
-
-- (NSArray *)_orderedEnabledDescendants
-{
NSMutableArray *array = [NSMutableArray array];
- for (NTTreeNode *child in [self sortedChildren])
+ for (NTTreeNode *child in [self sortedEnabledChildren])
{
- // If the child is not enabled, go to the next one
- if (![[child enabled] boolValue]) continue;
-
if ([[child isLeaf] boolValue]) [array addObject:child];
else [array addObjectsFromArray:[child orderedEnabledDescendants]];
}
View
185 NerdTool/resources/English.lproj/nerdToolPrefs.xib
@@ -2,16 +2,16 @@
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
<data>
<int key="IBDocument.SystemTarget">1050</int>
- <string key="IBDocument.SystemVersion">10D573</string>
- <string key="IBDocument.InterfaceBuilderVersion">762</string>
+ <string key="IBDocument.SystemVersion">10F569</string>
+ <string key="IBDocument.InterfaceBuilderVersion">788</string>
<string key="IBDocument.AppKitVersion">1038.29</string>
- <string key="IBDocument.HIToolboxVersion">460.00</string>
+ <string key="IBDocument.HIToolboxVersion">461.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="NS.object.0">762</string>
+ <string key="NS.object.0">788</string>
</object>
<array class="NSMutableArray" key="IBDocument.EditedObjectIDs">
- <integer value="3660"/>
+ <integer value="3673"/>
</array>
<array key="IBDocument.PluginDependencies">
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -3907,20 +3907,20 @@
<object class="NSComparisonPredicate" key="NSFetchPredicate">
<object class="NSKeyPathExpression" key="NSLeftExpression">
<int key="NSExpressionType">3</int>
- <string key="NSSelectorName">valueForKey:</string>
+ <string key="NSSelectorName">valueForKeyPath:</string>
<object class="NSSelfExpression" key="NSOperand">
<int key="NSExpressionType">1</int>
</object>
<array class="NSMutableArray" key="NSArguments">
<object class="NSKeyPathSpecifierExpression">
<int key="NSExpressionType">10</int>
- <string key="NSKeyPath">parent</string>
+ <string key="NSKeyPath">parent.isSpecialGroup</string>
</object>
</array>
</object>
<object class="NSConstantValueExpression" key="NSRightExpression">
<int key="NSExpressionType">0</int>
- <nil key="NSConstantValueClassName"/>
+ <boolean value="YES" key="NSConstantValue"/>
</object>
<object class="NSEqualityPredicateOperator" key="NSPredicateOperator">
<int key="NSOperatorType">4</int>
@@ -9244,12 +9244,76 @@
<string key="showExpose:">id</string>
<string key="trackROProcess:">id</string>
</dictionary>
+ <dictionary class="NSMutableDictionary" key="actionInfosByName">
+ <object class="IBActionInfo" key="addAsLoginItem:">
+ <string key="name">addAsLoginItem:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="donate:">
+ <string key="name">donate:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="logImport:">
+ <string key="name">logImport:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="newGroup:">
+ <string key="name">newGroup:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="newLeaf:">
+ <string key="name">newLeaf:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="openReadme:">
+ <string key="name">openReadme:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="refreshGroupSelection:">
+ <string key="name">refreshGroupSelection:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="revertDefaultSelectionColor:">
+ <string key="name">revertDefaultSelectionColor:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="saveAction:">
+ <string key="name">saveAction:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="showExpose:">
+ <string key="name">showExpose:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="trackROProcess:">
+ <string key="name">trackROProcess:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </dictionary>
<dictionary class="NSMutableDictionary" key="outlets">
<string key="loginItem">id</string>
<string key="mainConfigWindow">id</string>
<string key="outlineView">NSOutlineView</string>
<string key="treeController">NSTreeController</string>
</dictionary>
+ <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <object class="IBToOneOutletInfo" key="loginItem">
+ <string key="name">loginItem</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="mainConfigWindow">
+ <string key="name">mainConfigWindow</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="outlineView">
+ <string key="name">outlineView</string>
+ <string key="candidateClassName">NSOutlineView</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="treeController">
+ <string key="name">treeController</string>
+ <string key="candidateClassName">NSTreeController</string>
+ </object>
+ </dictionary>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
<string key="minorKey">classes/AppDelegate.h</string>
@@ -9305,6 +9369,13 @@
<string key="NS.key.0">treeController</string>
<string key="NS.object.0">id</string>
</object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <string key="NS.key.0">treeController</string>
+ <object class="IBToOneOutletInfo" key="NS.object.0">
+ <string key="name">treeController</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
<string key="minorKey">classes/NTFontDisplay.h</string>
@@ -9326,6 +9397,20 @@
<string key="defaultPrefsViewText">id</string>
<string key="prefsView">id</string>
</dictionary>
+ <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <object class="IBToOneOutletInfo" key="defaultPrefsView">
+ <string key="name">defaultPrefsView</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="defaultPrefsViewText">
+ <string key="name">defaultPrefsViewText</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="prefsView">
+ <string key="name">prefsView</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </dictionary>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
<string key="minorKey">classes/NTTreeController.h</string>
@@ -9354,10 +9439,24 @@
<string key="NS.key.0">checkForUpdates:</string>
<string key="NS.object.0">id</string>
</object>
+ <object class="NSMutableDictionary" key="actionInfosByName">
+ <string key="NS.key.0">checkForUpdates:</string>
+ <object class="IBActionInfo" key="NS.object.0">
+ <string key="name">checkForUpdates:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </object>
<object class="NSMutableDictionary" key="outlets">
<string key="NS.key.0">delegate</string>
<string key="NS.object.0">id</string>
</object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <string key="NS.key.0">delegate</string>
+ <object class="IBToOneOutletInfo" key="NS.object.0">
+ <string key="name">delegate</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </object>
<reference key="sourceIdentifier" ref="1067040312"/>
</object>
</array>
@@ -10153,6 +10252,48 @@
<string key="zoomIn:">id</string>
<string key="zoomOut:">id</string>
</dictionary>
+ <dictionary class="NSMutableDictionary" key="actionInfosByName">
+ <object class="IBActionInfo" key="goBack:">
+ <string key="name">goBack:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="goForward:">
+ <string key="name">goForward:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="goToFirstPage:">
+ <string key="name">goToFirstPage:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="goToLastPage:">
+ <string key="name">goToLastPage:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="goToNextPage:">
+ <string key="name">goToNextPage:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="goToPreviousPage:">
+ <string key="name">goToPreviousPage:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="selectAll:">
+ <string key="name">selectAll:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="takeBackgroundColorFrom:">
+ <string key="name">takeBackgroundColorFrom:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="zoomIn:">
+ <string key="name">zoomIn:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="zoomOut:">
+ <string key="name">zoomOut:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </dictionary>
<reference key="sourceIdentifier" ref="619788730"/>
</object>
<object class="IBPartialClassDescription">
@@ -10163,6 +10304,20 @@
<string key="start:">id</string>
<string key="stop:">id</string>
</dictionary>
+ <dictionary class="NSMutableDictionary" key="actionInfosByName">
+ <object class="IBActionInfo" key="play:">
+ <string key="name">play:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="start:">
+ <string key="name">start:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="stop:">
+ <string key="name">stop:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </dictionary>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBFrameworkSource</string>
<string key="minorKey">QuartzComposer.framework/Headers/QCView.h</string>
@@ -10175,10 +10330,24 @@
<string key="NS.key.0">checkForUpdates:</string>
<string key="NS.object.0">id</string>
</object>
+ <object class="NSMutableDictionary" key="actionInfosByName">
+ <string key="NS.key.0">checkForUpdates:</string>
+ <object class="IBActionInfo" key="NS.object.0">
+ <string key="name">checkForUpdates:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </object>
<object class="NSMutableDictionary" key="outlets">
<string key="NS.key.0">delegate</string>
<string key="NS.object.0">id</string>
</object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <string key="NS.key.0">delegate</string>
+ <object class="IBToOneOutletInfo" key="NS.object.0">
+ <string key="name">delegate</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </object>
<reference key="sourceIdentifier" ref="107769064"/>
</object>
</array>

0 comments on commit 7966939

Please sign in to comment.
Something went wrong with that request. Please try again.