85cbe3ea |
//
// AppDelegate.m
// OBJCBrowser
//
// Created by Langley, Edward on 1/4/19.
// Copyright © 2019 Langley, Edward. All rights reserved.
//
#import "AppDelegate.h"
|
0d4d3f97 |
#include <objc/runtime.h>
#include <ScriptingBridge/ScriptingBridge.h>
|
85cbe3ea |
@interface AppDelegate ()
@property (weak) IBOutlet NSWindow *window;
|
0d4d3f97 |
@property (weak) IBOutlet NSOutlineView *classOutline;
@property NSMutableDictionary<NSString*, NSArray<NSString*>*> *classesSource;
@property NSArray<NSString*> *rootClass;
@property unsigned int classesSourceCount;
//@property (weak) IBOutlet NSWindow *window;
|
85cbe3ea |
@end
@implementation AppDelegate
|
0d4d3f97 |
- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
if (item == nil) {
return [self.rootClass count];
} else {
return [[self.classesSource valueForKey:item] count];
}
}
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
return item != nil && [item isKindOfClass:[NSString class]] && [self.classesSource valueForKey:item] != nil && [[self.classesSource valueForKey:item] count] != 0;
}
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {
if (item == nil) {
return [self.rootClass objectAtIndex:index];
} else {
return [[self.classesSource objectForKey:(NSString*)item]
objectAtIndex:index];
}
}
- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {
NSTableCellView *v = [outlineView makeViewWithIdentifier:@"ItemName"
owner:self];
[v.textField setStringValue:item];
return v;
}
|
85cbe3ea |
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application
|
0d4d3f97 |
self.classesSourceCount = objc_getClassList(NULL, 0);
Class *classesSource = (Class*)calloc(self.classesSourceCount, sizeof(Class));
NSMutableArray<NSString*> *classList = [[NSMutableArray alloc] initWithCapacity:self.classesSourceCount];
self.classesSource = [[NSMutableDictionary alloc] initWithCapacity:self.classesSourceCount];
printf("There are %d classes\n", self.classesSourceCount);
printf("Got %d classes\n",
objc_getClassList(classesSource, self.classesSourceCount));
for (unsigned int cur = 0; cur < self.classesSourceCount; cur++) {
unsigned int methodCount = 0;
Class cur_class = classesSource[cur];
Method *methods = class_copyMethodList(cur_class, &methodCount);
NSString *class_name = [NSString stringWithUTF8String:class_getName(cur_class)];
// if (!([class_name characterAtIndex:0] == '_')) {
classList[cur] = class_name;
// } else {
// self.classesSourceCount -= 1;
// }
NSMutableArray *method_arr = [[NSMutableArray alloc] initWithCapacity:methodCount];
for (int cur_m = 0; cur_m < methodCount; cur_m++) {
Method cur_method = methods[cur_m];
NSString *method_name = [NSString stringWithUTF8String:sel_getName(method_getName(cur_method))];
method_arr[cur_m] = method_name;
}
self.classesSource[class_name] = [method_arr sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
}
self.rootClass = [classList sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
self.classOutline.autoresizesOutlineColumn = YES;
[self.classOutline setDelegate:self];
[self.classOutline setDataSource:self];
|
85cbe3ea |
}
- (void)applicationWillTerminate:(NSNotification *)aNotification {
// Insert code here to tear down your application
}
@end
|