first working pass
[usblister.git] / usblister / OutlineData.m
diff --git a/usblister/OutlineData.m b/usblister/OutlineData.m
new file mode 100644 (file)
index 0000000..f2ffc26
--- /dev/null
@@ -0,0 +1,91 @@
+//
+//  OutlineData.m
+//  usblister
+//
+//  Created by Rex Feany on 4/8/11.
+//  Copyright 2011 Fnordsoft, Inc. All rights reserved.
+//
+
+#import "OutlineData.h"
+
+
+@implementation OutlineData
+
+@synthesize data;
+
+- (id)init {
+    self = [super init];
+    if (self) {
+        // Initialization code here.
+    }
+    return self;
+}
+
+- (void)dealloc {
+    self.data = nil;
+    [super dealloc];
+}
+
+static BOOL is_array(id item) {
+    return ([item isKindOfClass:[NSArray class]]);
+}
+
+// How many children does this object have? 
+- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
+    // The root node is special; if the NSOutline view asks for the children of nil,
+    // we give it the count of the root dictionary.
+    if (item == nil) {
+        return [self.data count];
+    }
+    
+    // otherwise the item will be an array..
+    if (is_array(item) && is_array([item objectAtIndex:1])) {
+        return [[item objectAtIndex:1] count];
+    }
+    return 0;
+}
+
+// Can the item be expanded? If the value of the k/v pair is an array, yes!
+- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
+    if (is_array(item) && is_array([item objectAtIndex:1]))
+        return YES;
+    return NO;
+}
+
+// child at index of this item
+- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {
+    if (item == nil)
+        return [data objectAtIndex:index];
+    
+    NSArray *row = [item objectAtIndex:1];
+    
+    if (is_array(row))
+        return [row objectAtIndex:index];
+
+    return nil;
+}
+
+// column data for child at index
+- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
+    if ([outlineView levelForItem:item] == 0) {
+        if ([[tableColumn identifier] isEqualToString:@"name"]) {
+            return [item objectAtIndex:0];
+        }
+    } else {
+        
+        if ([[tableColumn identifier] isEqualToString:@"name"]) {
+            return [item objectAtIndex:0];
+        }
+        
+        if ([[tableColumn identifier] isEqualToString:@"value"]) {
+            if (is_array([item objectAtIndex:1])) {
+                return @"";
+            } else {
+                return [item objectAtIndex:1];
+            }
+        }
+    }
+    return @"";
+}
+
+@end