├── Classes ├── XCENotificationsWindowController.h ├── XCENotificationsWindowController.m ├── XCENotificationsWindowController.xib ├── XCEPlugin.h ├── XCEPlugin.m ├── XCEViewClickerWindowController.h ├── XCEViewClickerWindowController.m └── XCEViewClickerWindowController.xib ├── LICENSE.TXT ├── Other Sources └── XcodeExplorer-Prefix.pch ├── Resources ├── Images.xcassets │ ├── Record.imageset │ │ ├── Contents.json │ │ └── Record.pdf │ └── Stop.imageset │ │ ├── Contents.json │ │ └── Stop.pdf ├── XcodeExplorer-Info.plist └── en.lproj │ └── InfoPlist.strings ├── XcodeExplorer.xcodeproj ├── project.pbxproj └── project.xcworkspace │ └── contents.xcworkspacedata └── readme.md /Classes/XCENotificationsWindowController.h: -------------------------------------------------------------------------------- 1 | // 2 | // BDNotificationsWindowController.h 3 | // XcodeExplorer 4 | // 5 | // Created by Craig Edwards on 28/11/12. 6 | // Copyright (c) 2012 BlackDog Foundry. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface XCENotificationsWindowController : NSWindowController { 12 | NSMutableArray *notifications; 13 | NSMutableArray *regularExpressions; 14 | 15 | IBOutlet NSTextField *filterTextField; 16 | IBOutlet NSTableView *tableView; 17 | IBOutlet NSButton *recordButton; 18 | IBOutlet NSButton *stopButton; 19 | } 20 | 21 | -(IBAction)startRecording:(id)sender; 22 | -(IBAction)stopRecording:(id)sender; 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /Classes/XCENotificationsWindowController.m: -------------------------------------------------------------------------------- 1 | // 2 | // BDNotificationsWindowController.m 3 | // XcodeExplorer 4 | // 5 | // Created by Craig Edwards on 28/11/12. 6 | // Copyright (c) 2012 BlackDog Foundry. All rights reserved. 7 | // 8 | 9 | #import "XCENotificationsWindowController.h" 10 | 11 | @implementation XCENotificationsWindowController 12 | 13 | -(id)init { 14 | self = [super initWithWindowNibName:@"XCENotificationsWindowController"]; 15 | if (self) { 16 | notifications = [NSMutableArray array]; 17 | regularExpressions = [NSMutableArray array]; 18 | } 19 | return self; 20 | } 21 | 22 | -(void)windowDidLoad { 23 | [filterTextField setStringValue:@"NS.*"]; 24 | filterTextField.window.titlebarAppearsTransparent = YES; 25 | filterTextField.window.titleVisibility = NO; 26 | } 27 | 28 | # 29 | #pragma mark - Notification registering 30 | # 31 | -(IBAction)startRecording:(id)sender { 32 | [notifications removeAllObjects]; 33 | [tableView reloadData]; 34 | [self parseRegexTextField]; 35 | 36 | [filterTextField setEnabled:NO]; 37 | [recordButton setEnabled:NO]; 38 | [stopButton setEnabled:YES]; 39 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationListener:) name:nil object:nil]; 40 | } 41 | 42 | -(IBAction)stopRecording:(id)sender { 43 | [[NSNotificationCenter defaultCenter] removeObserver:self]; 44 | [filterTextField setEnabled:YES]; 45 | [stopButton setEnabled:NO]; 46 | [recordButton setEnabled:YES]; 47 | } 48 | 49 | 50 | -(void)notificationListener:(NSNotification *)notification { 51 | 52 | // Check if notification is generated by my own window 53 | id notificationObject = [notification object]; 54 | if( [notificationObject isKindOfClass: [NSView class]] ){ 55 | NSView *view = notificationObject; 56 | do { 57 | if( [view isEqual:self.window] ) return; 58 | } while ( (view = view.superview) ); 59 | } 60 | 61 | NSString *name = [notification name]; 62 | 63 | // loop through our list of regular expressions and if any of 64 | // them match, then we'll throw this notification away 65 | for (NSRegularExpression *regularExpression in regularExpressions) { 66 | NSTextCheckingResult *match = [regularExpression firstMatchInString:name options:0 range:NSMakeRange(0, name.length)]; 67 | if (match != nil) 68 | return; 69 | } 70 | 71 | // get last notifications list 72 | NSMutableArray *lastNotificationList = [notifications lastObject]; 73 | 74 | NSNotification *lastNotification = [lastNotificationList lastObject]; 75 | 76 | // check if notification is same as in list 77 | if( [notification.name isEqualToString:lastNotification.name] && (notification.object == lastNotification.object || [notification.object isEqual:lastNotification.object]) && (notification.userInfo == lastNotification.userInfo || [notification.userInfo isEqualToDictionary:lastNotification.userInfo]) ){ 78 | [lastNotificationList addObject: notification]; 79 | } 80 | // if not the same add it to list 81 | else{ 82 | [notifications addObject: [NSMutableArray arrayWithObject:notification]]; 83 | } 84 | 85 | [tableView reloadData]; 86 | 87 | // scroll to last notification if window is not active 88 | if( [[self window] isKeyWindow] == NO ){ 89 | [tableView scrollRowToVisible: notifications.count -1]; 90 | } 91 | 92 | } 93 | 94 | -(void)parseRegexTextField { 95 | [regularExpressions removeAllObjects]; 96 | 97 | // ignore empty string 98 | if ([[filterTextField stringValue] length] == 0) 99 | return; 100 | 101 | NSArray *patterns = [[filterTextField stringValue] componentsSeparatedByString:@","]; 102 | for (NSString *pattern in patterns) { 103 | NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil]; 104 | if (regex != nil) 105 | [regularExpressions addObject:regex]; 106 | } 107 | } 108 | 109 | # 110 | #pragma mark - Table management 111 | # 112 | -(NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { 113 | return [notifications count]; 114 | } 115 | 116 | -(id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 117 | // get last list 118 | NSMutableArray *lastNotificationList = notifications[row]; 119 | 120 | NSNotification *notification = [lastNotificationList lastObject]; 121 | if( [[tableColumn identifier] isEqualToString:@"count"] ){ 122 | return [NSString stringWithFormat:@"%lu", (unsigned long)lastNotificationList.count]; 123 | } 124 | else if ([[tableColumn identifier] isEqualToString:@"name"]) { 125 | return [notification name]; 126 | } 127 | else if ([[tableColumn identifier] isEqualToString:@"object"]) { 128 | return [[[notification object] description] stringByReplacingOccurrencesOfString:@"\n" withString:@" "]; 129 | } 130 | else if ([[tableColumn identifier] isEqualToString:@"userInfo"]) { 131 | return [[[notification userInfo] description] stringByReplacingOccurrencesOfString:@"\n" withString:@" "]; 132 | } 133 | return @"Yikes!"; 134 | } 135 | 136 | 137 | @end 138 | -------------------------------------------------------------------------------- /Classes/XCENotificationsWindowController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 149 | 150 | 151 | 152 | 153 | 154 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | -------------------------------------------------------------------------------- /Classes/XCEPlugin.h: -------------------------------------------------------------------------------- 1 | // 2 | // XCEPlugin.h 3 | // XcodeExplorer 4 | // 5 | // Created by Craig Edwards on 28/11/12. 6 | // Copyright (c) 2012 BlackDog Foundry. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "XCENotificationsWindowController.h" 11 | #import "XCEViewClickerWindowController.h" 12 | 13 | @interface XCEPlugin : NSObject 14 | 15 | @property (nonatomic,strong) XCENotificationsWindowController *notificationsController; 16 | @property (nonatomic,strong) XCEViewClickerWindowController *viewClickerController; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /Classes/XCEPlugin.m: -------------------------------------------------------------------------------- 1 | // 2 | // XCEPlugin.m 3 | // XcodeExplorer 4 | // 5 | // Created by Craig Edwards on 28/11/12. 6 | // Copyright (c) 2012 BlackDog Foundry. All rights reserved. 7 | // 8 | 9 | #import "XCEPlugin.h" 10 | 11 | @implementation XCEPlugin 12 | 13 | static XCEPlugin *mySharedPlugin = nil; 14 | 15 | +(void)pluginDidLoad:(NSBundle *)plugin { 16 | static dispatch_once_t onceToken; 17 | dispatch_once(&onceToken, ^{ 18 | mySharedPlugin = [[self alloc] init]; 19 | }); 20 | } 21 | 22 | +(XCEPlugin *)sharedPlugin { 23 | return mySharedPlugin; 24 | } 25 | 26 | -(id)init { 27 | if (self = [super init]) { 28 | [[NSNotificationCenter defaultCenter] addObserver:self 29 | selector:@selector(applicationDidFinishLaunching:) 30 | name:NSApplicationDidFinishLaunchingNotification 31 | object:nil]; 32 | [self setNotificationsController:nil]; 33 | } 34 | return self; 35 | } 36 | 37 | -(void)addMenuItems { 38 | 39 | // create a new menu and add a new item 40 | NSMenu *menu = [[NSMenu alloc] initWithTitle:@"Explorer"]; 41 | NSMenuItem *item1 = [[NSMenuItem alloc] initWithTitle:@"Notifications" action:@selector(notificationsMenuClicked:) keyEquivalent:@""]; 42 | [item1 setTarget:self]; 43 | [menu addItem:item1]; 44 | NSMenuItem *item2 = [[NSMenuItem alloc] initWithTitle:@"View Clicker" action:@selector(viewClickerMenuClicked:) keyEquivalent:@""]; 45 | [item2 setTarget:self]; 46 | [menu addItem:item2]; 47 | // add the newly created menu to the main menu bar 48 | NSMenuItem *newMenuItem = [[NSMenuItem alloc] initWithTitle:@"Explorer" action:NULL keyEquivalent:@""]; 49 | [newMenuItem setSubmenu:menu]; 50 | 51 | NSMenuItem *menuItem = [[NSApp mainMenu] itemWithTitle:@"Window"]; 52 | 53 | NSInteger organizerMenuItem = [[menuItem submenu] indexOfItemWithTitle:@"Organizer"]; 54 | [[menuItem submenu] insertItem:newMenuItem atIndex:organizerMenuItem +1]; 55 | } 56 | 57 | -(void)notificationsMenuClicked:(id)sender { 58 | if ([self notificationsController] == nil) { 59 | [self setNotificationsController:[[XCENotificationsWindowController alloc] init]]; 60 | } 61 | [[self notificationsController] showWindow:[NSApp mainWindow]]; 62 | } 63 | 64 | -(void)viewClickerMenuClicked:(id)sender { 65 | if ([self viewClickerController] == nil) { 66 | [self setViewClickerController:[[XCEViewClickerWindowController alloc] init]]; 67 | } 68 | [[self viewClickerController] showWindow:[NSApp mainWindow]]; 69 | } 70 | 71 | -(void)applicationDidFinishLaunching:(NSNotification *)notification { 72 | [self addMenuItems]; 73 | } 74 | @end 75 | -------------------------------------------------------------------------------- /Classes/XCEViewClickerWindowController.h: -------------------------------------------------------------------------------- 1 | // 2 | // XCEViewClickerWindowController.h 3 | // XcodeExplorer 4 | // 5 | // Created by Craig Edwards on 5/12/12. 6 | // Copyright (c) 2012 BlackDog Foundry. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface XCEViewClickerWindowController : NSWindowController { 12 | 13 | IBOutlet NSTextView *currentViewContents; 14 | 15 | } 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Classes/XCEViewClickerWindowController.m: -------------------------------------------------------------------------------- 1 | // 2 | // XCEViewClickerWindowController.m 3 | // XcodeExplorer 4 | // 5 | // Created by Craig Edwards on 5/12/12. 6 | // Copyright (c) 2012 BlackDog Foundry. All rights reserved. 7 | // 8 | 9 | #import "XCEViewClickerWindowController.h" 10 | #import 11 | 12 | @implementation XCEViewClickerWindowController 13 | 14 | -(id)init { 15 | self = [super initWithWindowNibName:@"XCEViewClickerWindowController"]; 16 | if (self) { 17 | [self registerClickListener]; 18 | } 19 | return self; 20 | } 21 | 22 | -(void)registerClickListener { 23 | [NSEvent addLocalMonitorForEventsMatchingMask:NSLeftMouseDownMask handler:^(NSEvent *event) { 24 | 25 | // Don't track clicks on my windows 26 | if( [event.window isEqual: currentViewContents.window] ) return event; 27 | 28 | NSView *view = [[event.window contentView] hitTest:[event locationInWindow]]; 29 | 30 | // If we didn't found view in contentView check toolbar 31 | if( !view ){ 32 | for( NSToolbarItem *toolbarItem in event.window.toolbar.visibleItems ){ 33 | NSRect rectInWindow = [toolbarItem.view convertRect:toolbarItem.view.bounds toView:nil]; 34 | if( CGRectContainsPoint(rectInWindow, [event locationInWindow]) ){ 35 | view = toolbarItem.view; 36 | break; 37 | } 38 | } 39 | } 40 | 41 | NSString *info = @""; 42 | if ([view isKindOfClass:[NSControl class]]) { 43 | NSControl *control = (NSButton *)view; 44 | id target = [control target]; 45 | SEL action = [control action]; 46 | if (target != nil && action != nil) { 47 | info = [NSString stringWithFormat:@"Target=[%@ %s]\n\n", [target class], sel_getName(action)]; 48 | } 49 | } 50 | 51 | // traverse up the view hierarchy collecting views as we go 52 | NSMutableArray *views = [NSMutableArray array]; 53 | while (view != nil) { 54 | [views addObject:view]; 55 | view = [view superview]; 56 | } 57 | 58 | // now let's start at the top of the hierarchy and build something 59 | // that we can dump out and view 60 | NSMutableString *output = [NSMutableString stringWithString:info]; 61 | if ([views count] == 0) { 62 | [output appendString:@"Unable to determine view"]; 63 | } 64 | else { 65 | NSMutableString *indent = [NSMutableString string]; 66 | for (int i = (int)[views count]-1; i >= 0; i--) { 67 | [output appendFormat:@"%@%@\n", indent, views[i]]; 68 | [indent appendString:@" "]; 69 | } 70 | } 71 | // set the generated tree hierarchy into the window 72 | [currentViewContents setString:output]; 73 | 74 | // and return the original event 75 | return event; 76 | }]; 77 | } 78 | 79 | 80 | @end 81 | -------------------------------------------------------------------------------- /Classes/XCEViewClickerWindowController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1070 5 | 14A389 6 | 6250 7 | 1343.14 8 | 755.00 9 | 10 | com.apple.InterfaceBuilder.CocoaPlugin 11 | 6250 12 | 13 | 14 | NSCustomObject 15 | NSScrollView 16 | NSScroller 17 | NSTextView 18 | NSView 19 | NSWindowTemplate 20 | 21 | 22 | com.apple.InterfaceBuilder.CocoaPlugin 23 | 24 | 25 | PluginDependencyRecalculationVersion 26 | 27 | 28 | 29 | 30 | XCEViewClickerWindowController 31 | 32 | 33 | FirstResponder 34 | 35 | 36 | NSApplication 37 | 38 | 39 | 31 40 | 2 41 | {{139, 81}, {480, 320}} 42 | -1535638528 43 | View Clicker 44 | NSPanel 45 | 46 | 47 | 48 | 49 | 256 50 | 51 | 52 | 53 | 274 54 | 55 | 56 | 57 | 2322 58 | 59 | 60 | 61 | 2322 62 | {480, 320} 63 | 64 | 65 | _NS:13 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 166 78 | 79 | 80 | 81 | 480 82 | 1 83 | 84 | 85 | 67121127 86 | 0 87 | 88 | 89 | 3 90 | MQA 91 | 92 | 93 | 94 | 6 95 | System 96 | selectedTextBackgroundColor 97 | 98 | 3 99 | MC42NjY2NjY2NjY3AA 100 | 101 | 102 | 103 | 6 104 | System 105 | selectedTextColor 106 | 107 | 3 108 | MAA 109 | 110 | 111 | 112 | 113 | 6 114 | System 115 | controlTextColor 116 | 117 | 118 | 119 | 120 | 1 121 | MCAwIDEAA 122 | 123 | 124 | {8, -8} 125 | 13 126 | 127 | 128 | 129 | 130 | 131 | 1 132 | 133 | 6 134 | {506, 10000000} 135 | 136 | 137 | 138 | {{1, 1}, {480, 320}} 139 | 140 | 141 | _NS:11 142 | 143 | 144 | 145 | {4, 5} 146 | 147 | 12582912 148 | 149 | 150 | 151 | 152 | 153 | TU0AKgAAEAj///8A////qwAAAP8AAAD/AwMD/BYWFtIFBQVuAAAABv///wD///8E6+vrTGhoaLYtLS3p 154 | BAQE/QAAAP8AAAD/////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 155 | ////AP///wD///8A////AP///wD///+rAAAA/wAAAP8AAAD/AAAA/wAAAP8EBATSX19fK9HR0ZciIiLv 156 | AAAA/wAAAP8AAAD/AAAA/wAAAP////8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 157 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////CsPDw0CRkZG1FxcX9AAAAP8bGxvr 158 | ICAg8AAAAP8ICAjlFRUVVQAAAA////8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 159 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wrm5uab 160 | FxcX9AAAAP8AAAD/AQEB3wAAAA////8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 161 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 162 | ////AP///zaXl5fGAAAA/wAAAP8AAABR////AP///wD///8A////AP///wD///8A////AP///wD///8A 163 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 164 | ////AP///wD///8A////CO7u7q8AAAD/AAAA/wAAAAz///8A////AP///wD///8A////AP///wD///8A 165 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 166 | ////AP///wD///8A////AP///wD///8A////qwAAAP8AAAD/////AP///wD///8A////AP///wD///8A 167 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 168 | ////AP///wD///8A////AP///wD///8A////AP///wD///+rAAAA/wAAAP////8A////AP///wD///8A 169 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 170 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///6sAAAD/AAAA/////wD///8A 171 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 172 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////qwAAAP8AAAD/ 173 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 174 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///+r 175 | AAAA/wAAAP////8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 176 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 177 | ////AP///6sAAAD/AAAA/////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 178 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 179 | ////AP///wD///8A////qwAAAP8AAAD/////AP///wD///8A////AP///wD///8A////AP///wD///8A 180 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 181 | ////AP///wD///8A////AP///wD///+rAAAA/wAAAP////8A////AP///wD///8A////AP///wD///8A 182 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 183 | ////AP///wD///8A////AP///wD///8A////AP///6sAAAD/AAAA/////wD///8A////AP///wD///8A 184 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 185 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////qwAAAP8AAAD/////AP///wD///8A 186 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 187 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////qwAAAP8AAAD/AAAA/wAAAP8AAAD/ 188 | AAAA/////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 189 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///+rAAAA/wAAAP8AAAD/ 190 | AAAA/wAAAP8AAAD/////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 191 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 192 | ////qwAAAP8AAAD/////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 193 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 194 | ////AP///wD///+rAAAA/wAAAP////8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 195 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 196 | ////AP///wD///8A////AP///6sAAAD/AAAA/////wD///8A////AP///wD///8A////AP///wD///8A 197 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 198 | ////AP///wD///8A////AP///wD///8A////qwAAAP8AAAD/////AP///wD///8A////AP///wD///8A 199 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 200 | ////AP///wD///8A////AP///wD///8A////AP///wD///+rAAAA/wAAAP////8A////AP///wD///8A 201 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 202 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///6sAAAD/AAAA/////wD///8A 203 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 204 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////qwAAAP8AAAD/ 205 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 206 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///+r 207 | AAAA/wAAAP////8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 208 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 209 | ////CO7u7q8AAAD/AAAA/wAAAAz///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 210 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 211 | ////AP///wD///80mpqaxQAAAP8AAAD/AAAATv///wD///8A////AP///wD///8A////AP///wD///8A 212 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 213 | ////AP///wD///8A////CuXl5ZYeHh7xAAAA/wAAAP8CAgLXAAAAD////wD///8A////AP///wD///8A 214 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 215 | ////AP///wD///8A////EKurq0mOjo63FxcX9AAAAP8bGxvrICAg8AAAAP8ICAjlHh4eXAAAABj///8A 216 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 217 | ////AP///wD///8A////qwAAAP8AAAD/AAAA/wAAAP8AAAD/BAQE1V9fXyvS0tKZICAg8AAAAP8AAAD/ 218 | AAAA/wAAAP8AAAD/////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 219 | ////AP///wD///8A////AP///wD///+rAAAA/wAAAP8AAAD/FBQU1AUFBXEAAAAG////AP///wTr6+tO 220 | ZWVluC4uLuoAAAD/AAAA/wAAAP////8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 221 | ////AP///wD///8A////AP///wD///8AABEBAAADAAAAAQAgAAABAQADAAAAAQAgAAABAgADAAAABAAA 222 | EOoBAwADAAAAAQABAAABBgADAAAAAQACAAABEQAEAAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAAAQAE 223 | AAABFgADAAAAAQAgAAABFwAEAAAAAQAAEAABGgAFAAAAAQAAENoBGwAFAAAAAQAAEOIBHAADAAAAAQAB 224 | AAABKAADAAAAAQACAAABUgADAAAAAQACAAABUwADAAAABAAAEPKHcwAHAAAMSAAAEPoAAAAAAAAAkAAA 225 | AAEAAACQAAAAAQAIAAgACAAIAAEAAQABAAEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx 226 | AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAA 227 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAA 228 | AGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAA 229 | ABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAA 230 | ABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAA 231 | CAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAA 232 | AAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAA 233 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAAB 234 | FsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAA 235 | GNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAA 236 | AAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 237 | AAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBz 238 | cGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFj 239 | ZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcg 240 | Q29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRp 241 | dGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAU 242 | Xy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA 243 | AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAo 244 | AC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8 245 | AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFu 246 | AXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJn 247 | AnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOu 248 | A7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJ 249 | BVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9 250 | B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmP 251 | CaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxD 252 | DFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9e 253 | D3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLj 254 | EwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbW 255 | FvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7 256 | G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAV 257 | IEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVo 258 | JZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2 259 | K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC 260 | Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQ 261 | OIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+i 262 | P+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7 263 | R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/d 264 | UCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjL 265 | WRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJ 266 | Ypxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xX 267 | bK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4 268 | d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIw 269 | gpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/ 270 | jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/Jpo 271 | mtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adu 272 | p+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUT 273 | tYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NY 274 | w9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/ 275 | 0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM 276 | 4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ 277 | 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//8 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | TU0AKgAABAj///9VQ0ND/wAAAP////8A////AP///6pDQ0P/AAAA/////wD///8A////AP///wD///8A 286 | ////AP///wD///8A////AP///wD///+qAAAA/////6oAAAD/////AP///wD///8A////AP///wD///8A 287 | ////AP///wD///8A////AP///wD///8A////AP///6oAAAD/////AP///wD///8A////AP///wD///8A 288 | ////AP///wD///8A////AP///wD///8A////AP///wD///+qAAAA/////wD///8A////AP///wD///8A 289 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////qgAAAP////8A////AP///wD///8A 290 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///6oAAAD/////AP///wD///8A 291 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///+qAAAA/////wD///8A 292 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////qgAAAP////8A 293 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////qgAAAP8AAAD/ 294 | AAAA/////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///+q 295 | AAAA/////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 296 | ////qgAAAP////8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 297 | ////AP///6oAAAD/////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 298 | ////AP///wD///+qAAAA/////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 299 | ////AP///wD///8A////qgAAAP////8A////AP///wD///8A////AP///wD///8A////AP///wD///8A 300 | ////AP///wD///8A////qgAAAP////+qAAAA/////wD///8A////AP///wD///8A////AP///wD///8A 301 | ////AP///wD///9VQ0ND/wAAAP////8A////AP///6pDQ0P/AAAA/////wD///8A////AP///wD///8A 302 | ////AP///wD///8AAA4BAAADAAAAAQAQAAABAQADAAAAAQAQAAABAgADAAAABAAABLYBAwADAAAAAQAB 303 | AAABBgADAAAAAQACAAABEQAEAAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAAAQAEAAABFgADAAAAAQAQ 304 | AAABFwAEAAAAAQAABAABHAADAAAAAQABAAABUgADAAAAAQACAAABUwADAAAABAAABL6HcwAHAAAHqAAA 305 | BMYAAAAAAAgACAAIAAgAAQABAAEAAQAAB6hhcHBsAiAAAG1udHJSR0IgWFlaIAfZAAIAGQALABoAC2Fj 306 | c3BBUFBMAAAAAGFwcGwAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAA 307 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2Rlc2MAAAEIAAAAb2RzY20AAAF4AAAFbGNw 308 | cnQAAAbkAAAAOHd0cHQAAAccAAAAFHJYWVoAAAcwAAAAFGdYWVoAAAdEAAAAFGJYWVoAAAdYAAAAFHJU 309 | UkMAAAdsAAAADmNoYWQAAAd8AAAALGJUUkMAAAdsAAAADmdUUkMAAAdsAAAADmRlc2MAAAAAAAAAFEdl 310 | bmVyaWMgUkdCIFByb2ZpbGUAAAAAAAAAAAAAABRHZW5lcmljIFJHQiBQcm9maWxlAAAAAAAAAAAAAAAA 311 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAB4AAAAMc2tTSwAA 312 | ACgAAAF4aHJIUgAAACgAAAGgY2FFUwAAACQAAAHIcHRCUgAAACYAAAHsdWtVQQAAACoAAAISZnJGVQAA 313 | ACgAAAI8emhUVwAAABYAAAJkaXRJVAAAACgAAAJ6bmJOTwAAACYAAAKia29LUgAAABYAAALIY3NDWgAA 314 | ACIAAALeaGVJTAAAAB4AAAMAZGVERQAAACwAAAMeaHVIVQAAACgAAANKc3ZTRQAAACYAAAKiemhDTgAA 315 | ABYAAANyamFKUAAAABoAAAOIcm9STwAAACQAAAOiZWxHUgAAACIAAAPGcHRQTwAAACYAAAPobmxOTAAA 316 | ACgAAAQOZXNFUwAAACYAAAPodGhUSAAAACQAAAQ2dHJUUgAAACIAAARaZmlGSQAAACgAAAR8cGxQTAAA 317 | ACwAAASkcnVSVQAAACIAAATQYXJFRwAAACYAAATyZW5VUwAAACYAAAUYZGFESwAAAC4AAAU+AFYBYQBl 318 | AG8AYgBlAGMAbgD9ACAAUgBHAEIAIABwAHIAbwBmAGkAbABHAGUAbgBlAHIAaQENAGsAaQAgAFIARwBC 319 | ACAAcAByAG8AZgBpAGwAUABlAHIAZgBpAGwAIABSAEcAQgAgAGcAZQBuAOgAcgBpAGMAUABlAHIAZgBp 320 | AGwAIABSAEcAQgAgAEcAZQBuAOkAcgBpAGMAbwQXBDAEMwQwBDsETAQ9BDgEOQAgBD8EQAQ+BEQEMAQ5 321 | BDsAIABSAEcAQgBQAHIAbwBmAGkAbAAgAGcA6QBuAOkAcgBpAHEAdQBlACAAUgBWAEKQGnUoACAAUgBH 322 | AEIAIIJyX2ljz4/wAFAAcgBvAGYAaQBsAG8AIABSAEcAQgAgAGcAZQBuAGUAcgBpAGMAbwBHAGUAbgBl 323 | AHIAaQBzAGsAIABSAEcAQgAtAHAAcgBvAGYAaQBsx3y8GAAgAFIARwBCACDVBLhc0wzHfABPAGIAZQBj 324 | AG4A/QAgAFIARwBCACAAcAByAG8AZgBpAGwF5AXoBdUF5AXZBdwAIABSAEcAQgAgBdsF3AXcBdkAQQBs 325 | AGwAZwBlAG0AZQBpAG4AZQBzACAAUgBHAEIALQBQAHIAbwBmAGkAbADBAGwAdABhAGwA4QBuAG8AcwAg 326 | AFIARwBCACAAcAByAG8AZgBpAGxmbpAaACAAUgBHAEIAIGPPj/Blh072TgCCLAAgAFIARwBCACAw1zDt 327 | MNUwoTCkMOsAUAByAG8AZgBpAGwAIABSAEcAQgAgAGcAZQBuAGUAcgBpAGMDkwO1A70DuQO6A8wAIAPA 328 | A8EDvwPGA68DuwAgAFIARwBCAFAAZQByAGYAaQBsACAAUgBHAEIAIABnAGUAbgDpAHIAaQBjAG8AQQBs 329 | AGcAZQBtAGUAZQBuACAAUgBHAEIALQBwAHIAbwBmAGkAZQBsDkIOGw4jDkQOHw4lDkwAIABSAEcAQgAg 330 | DhcOMQ5IDicORA4bAEcAZQBuAGUAbAAgAFIARwBCACAAUAByAG8AZgBpAGwAaQBZAGwAZQBpAG4AZQBu 331 | ACAAUgBHAEIALQBwAHIAbwBmAGkAaQBsAGkAVQBuAGkAdwBlAHIAcwBhAGwAbgB5ACAAcAByAG8AZgBp 332 | AGwAIABSAEcAQgQeBDEESQQ4BDkAIAQ/BEAEPgREBDgEOwRMACAAUgBHAEIGRQZEBkEAIAYqBjkGMQZK 333 | BkEAIABSAEcAQgAgBicGRAY5BicGRQBHAGUAbgBlAHIAaQBjACAAUgBHAEIAIABQAHIAbwBmAGkAbABl 334 | AEcAZQBuAGUAcgBlAGwAIABSAEcAQgAtAGIAZQBzAGsAcgBpAHYAZQBsAHMAZXRleHQAAAAAQ29weXJp 335 | Z2h0IDIwMDcgQXBwbGUgSW5jLiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4AWFlaIAAAAAAAAPNSAAEAAAAB 336 | Fs9YWVogAAAAAAAAdE0AAD3uAAAD0FhZWiAAAAAAAABadQAArHMAABc0WFlaIAAAAAAAACgaAAAVnwAA 337 | uDZjdXJ2AAAAAAAAAAEBzQAAc2YzMgAAAAAAAQxCAAAF3v//8yYAAAeSAAD9kf//+6L///2jAAAD3AAA 338 | wGw 339 | 340 | 341 | 342 | 343 | 344 | 3 345 | MCAwAA 346 | 347 | 348 | 349 | 4 350 | YES 351 | 352 | 353 | 354 | 256 355 | {{465, 1}, {16, 320}} 356 | 357 | _NS:83 358 | NO 359 | _doScroller: 360 | 361 | 362 | _doScroller: 363 | 1 364 | 0.85256409645080566 365 | 366 | 367 | 368 | -2147483392 369 | {{-100, -100}, {87, 18}} 370 | 371 | 372 | _NS:33 373 | NO 374 | _doScroller: 375 | 376 | 1 377 | 378 | _doScroller: 379 | 1 380 | 0.94565218687057495 381 | 382 | 383 | {{-1, -1}, {482, 322}} 384 | 385 | 386 | _NS:9 387 | 133138 388 | 389 | 390 | 391 | 0.25 392 | 4 393 | 1 394 | 395 | 396 | {480, 320} 397 | 398 | _NS:21 399 | 400 | {{0, 0}, {1920, 1177}} 401 | {10000000000000, 10000000000000} 402 | YES 403 | 404 | 405 | 406 | 407 | 408 | 409 | window 410 | 411 | 412 | 413 | 7 414 | 415 | 416 | 417 | currentViewContents 418 | 419 | 420 | 421 | 33 422 | 423 | 424 | 425 | delegate 426 | 427 | 428 | 429 | 34 430 | 431 | 432 | 433 | 434 | 435 | 0 436 | 437 | 438 | 439 | 440 | 441 | -2 442 | 443 | 444 | File's Owner 445 | 446 | 447 | -1 448 | 449 | 450 | First Responder 451 | 452 | 453 | -3 454 | 455 | 456 | Application 457 | 458 | 459 | 5 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 6 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 22 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 23 486 | 487 | 488 | 489 | 490 | 24 491 | 492 | 493 | 494 | 495 | 25 496 | 497 | 498 | 499 | 500 | 501 | 502 | com.apple.InterfaceBuilder.CocoaPlugin 503 | com.apple.InterfaceBuilder.CocoaPlugin 504 | com.apple.InterfaceBuilder.CocoaPlugin 505 | com.apple.InterfaceBuilder.CocoaPlugin 506 | com.apple.InterfaceBuilder.CocoaPlugin 507 | com.apple.InterfaceBuilder.CocoaPlugin 508 | com.apple.InterfaceBuilder.CocoaPlugin 509 | {74, 303.5} 510 | com.apple.InterfaceBuilder.CocoaPlugin 511 | 512 | 513 | com.apple.InterfaceBuilder.CocoaPlugin 514 | 515 | 516 | 517 | 518 | 519 | 34 520 | 521 | 522 | 0 523 | IBCocoaFramework 524 | NO 525 | 526 | com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 527 | 528 | 529 | YES 530 | 3 531 | 532 | 533 | -------------------------------------------------------------------------------- /LICENSE.TXT: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012 Craig Edwards 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /Other Sources/XcodeExplorer-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'XcodeExplorer' target in the 'XcodeExplorer' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #endif 8 | -------------------------------------------------------------------------------- /Resources/Images.xcassets/Record.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "scale" : "1x", 6 | "filename" : "Record.pdf" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "scale" : "2x" 11 | } 12 | ], 13 | "info" : { 14 | "version" : 1, 15 | "author" : "xcode" 16 | } 17 | } -------------------------------------------------------------------------------- /Resources/Images.xcassets/Record.imageset/Record.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edwardaux/XcodeExplorer/151a76c9ca265af95f32961917aa5eaa2d3e8cfb/Resources/Images.xcassets/Record.imageset/Record.pdf -------------------------------------------------------------------------------- /Resources/Images.xcassets/Stop.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "scale" : "1x", 6 | "filename" : "Stop.pdf" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "scale" : "2x" 11 | } 12 | ], 13 | "info" : { 14 | "version" : 1, 15 | "author" : "xcode" 16 | } 17 | } -------------------------------------------------------------------------------- /Resources/Images.xcassets/Stop.imageset/Stop.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edwardaux/XcodeExplorer/151a76c9ca265af95f32961917aa5eaa2d3e8cfb/Resources/Images.xcassets/Stop.imageset/Stop.pdf -------------------------------------------------------------------------------- /Resources/XcodeExplorer-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | BNDL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | DVTPlugInCompatibilityUUIDs 26 | 27 | FEC992CC-CA4A-4CFD-8881-77300FCB848A 28 | C4A681B0-4A26-480E-93EC-1218098B9AA0 29 | AD68E85B-441B-4301-B564-A45E4919A6AD 30 | A2E4D43F-41F4-4FB9-BB94-7177011C9AED 31 | 63FC1C47-140D-42B0-BB4D-A10B2D225574 32 | 37B30044-3B14-46BA-ABAA-F01000C27B63 33 | 640F884E-CE55-4B40-87C0-8869546CAB7A 34 | AD68E85B-441B-4301-B564-A45E4919A6AD 35 | A16FF353-8441-459E-A50C-B071F53F51B7 36 | 992275C1-432A-4CF7-B659-D84ED6D42D3F 37 | 9F75337B-21B4-4ADC-B558-F9CADF7073A7 38 | E969541F-E6F9-4D25-8158-72DC3545A6C6 39 | 7FDF5C7A-131F-4ABB-9EDC-8C5F8F0B8A90 40 | 0420B86A-AA43-4792-9ED0-6FE0F2B16A13 41 | 7265231C-39B4-402C-89E1-16167C4CC990 42 | F41BD31E-2683-44B8-AE7F-5F09E919790E 43 | ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C 44 | 45 | NSHumanReadableCopyright 46 | Copyright © 2012 BlackDog Foundry. All rights reserved. 47 | NSPrincipalClass 48 | 49 | XC4Compatible 50 | 51 | XCGCReady 52 | 53 | XCPluginHasUI 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /Resources/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /XcodeExplorer.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | BF1DB9AE166E917800EF717B /* XCEViewClickerWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = BF1DB9AC166E917800EF717B /* XCEViewClickerWindowController.m */; }; 11 | BF1DB9AF166E917800EF717B /* XCEViewClickerWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BF1DB9AD166E917800EF717B /* XCEViewClickerWindowController.xib */; }; 12 | BF46ED351665E5C2005C71E1 /* readme.md in Resources */ = {isa = PBXBuildFile; fileRef = BF46ED341665E5C2005C71E1 /* readme.md */; }; 13 | BF46ED3B1665E79A005C71E1 /* XCEPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = BF46ED3A1665E79A005C71E1 /* XCEPlugin.m */; }; 14 | BF46ED3F1665EA90005C71E1 /* XCENotificationsWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = BF46ED3D1665EA90005C71E1 /* XCENotificationsWindowController.m */; }; 15 | BF46ED401665EA90005C71E1 /* XCENotificationsWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BF46ED3E1665EA90005C71E1 /* XCENotificationsWindowController.xib */; }; 16 | BFAE66A31665E55D00F47322 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BFAE66A21665E55D00F47322 /* Cocoa.framework */; }; 17 | BFAE66AD1665E55D00F47322 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BFAE66AB1665E55D00F47322 /* InfoPlist.strings */; }; 18 | BFF3E82E16663A6C004B8249 /* LICENSE.TXT in Resources */ = {isa = PBXBuildFile; fileRef = BFF3E82D16663A6C004B8249 /* LICENSE.TXT */; }; 19 | F4F20A7D1A024E6300858054 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F4F20A7C1A024E6300858054 /* Images.xcassets */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXFileReference section */ 23 | BF1DB9AB166E917800EF717B /* XCEViewClickerWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XCEViewClickerWindowController.h; sourceTree = ""; }; 24 | BF1DB9AC166E917800EF717B /* XCEViewClickerWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XCEViewClickerWindowController.m; sourceTree = ""; }; 25 | BF1DB9AD166E917800EF717B /* XCEViewClickerWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = XCEViewClickerWindowController.xib; sourceTree = ""; }; 26 | BF46ED341665E5C2005C71E1 /* readme.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = readme.md; sourceTree = SOURCE_ROOT; }; 27 | BF46ED391665E79A005C71E1 /* XCEPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XCEPlugin.h; sourceTree = ""; }; 28 | BF46ED3A1665E79A005C71E1 /* XCEPlugin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XCEPlugin.m; sourceTree = ""; }; 29 | BF46ED3C1665EA90005C71E1 /* XCENotificationsWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XCENotificationsWindowController.h; sourceTree = ""; }; 30 | BF46ED3D1665EA90005C71E1 /* XCENotificationsWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XCENotificationsWindowController.m; sourceTree = ""; }; 31 | BF46ED3E1665EA90005C71E1 /* XCENotificationsWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = XCENotificationsWindowController.xib; sourceTree = ""; }; 32 | BFAE669F1665E55D00F47322 /* XcodeExplorer.xcplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XcodeExplorer.xcplugin; sourceTree = BUILT_PRODUCTS_DIR; }; 33 | BFAE66A21665E55D00F47322 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 34 | BFAE66A71665E55D00F47322 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 35 | BFAE66AA1665E55D00F47322 /* XcodeExplorer-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "XcodeExplorer-Info.plist"; sourceTree = ""; }; 36 | BFAE66AC1665E55D00F47322 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 37 | BFAE66AE1665E55D00F47322 /* XcodeExplorer-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "XcodeExplorer-Prefix.pch"; sourceTree = ""; }; 38 | BFF3E82D16663A6C004B8249 /* LICENSE.TXT */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE.TXT; sourceTree = SOURCE_ROOT; }; 39 | F4F20A7C1A024E6300858054 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 40 | /* End PBXFileReference section */ 41 | 42 | /* Begin PBXFrameworksBuildPhase section */ 43 | BFAE669C1665E55D00F47322 /* Frameworks */ = { 44 | isa = PBXFrameworksBuildPhase; 45 | buildActionMask = 2147483647; 46 | files = ( 47 | BFAE66A31665E55D00F47322 /* Cocoa.framework in Frameworks */, 48 | ); 49 | runOnlyForDeploymentPostprocessing = 0; 50 | }; 51 | /* End PBXFrameworksBuildPhase section */ 52 | 53 | /* Begin PBXGroup section */ 54 | BF46ED381665E768005C71E1 /* Classes */ = { 55 | isa = PBXGroup; 56 | children = ( 57 | BF46ED3C1665EA90005C71E1 /* XCENotificationsWindowController.h */, 58 | BF46ED3D1665EA90005C71E1 /* XCENotificationsWindowController.m */, 59 | BF46ED3E1665EA90005C71E1 /* XCENotificationsWindowController.xib */, 60 | BF1DB9AB166E917800EF717B /* XCEViewClickerWindowController.h */, 61 | BF1DB9AC166E917800EF717B /* XCEViewClickerWindowController.m */, 62 | BF1DB9AD166E917800EF717B /* XCEViewClickerWindowController.xib */, 63 | BF46ED391665E79A005C71E1 /* XCEPlugin.h */, 64 | BF46ED3A1665E79A005C71E1 /* XCEPlugin.m */, 65 | ); 66 | path = Classes; 67 | sourceTree = SOURCE_ROOT; 68 | }; 69 | BF69E4A716673E1C0045B66C /* en.lproj */ = { 70 | isa = PBXGroup; 71 | children = ( 72 | BFAE66AB1665E55D00F47322 /* InfoPlist.strings */, 73 | ); 74 | path = en.lproj; 75 | sourceTree = ""; 76 | }; 77 | BFAE66941665E55D00F47322 = { 78 | isa = PBXGroup; 79 | children = ( 80 | BFAE66A81665E55D00F47322 /* XcodeExplorer */, 81 | BFAE66A11665E55D00F47322 /* Frameworks */, 82 | BFAE66A01665E55D00F47322 /* Products */, 83 | ); 84 | sourceTree = ""; 85 | }; 86 | BFAE66A01665E55D00F47322 /* Products */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | BFAE669F1665E55D00F47322 /* XcodeExplorer.xcplugin */, 90 | ); 91 | name = Products; 92 | sourceTree = ""; 93 | }; 94 | BFAE66A11665E55D00F47322 /* Frameworks */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | BFAE66A71665E55D00F47322 /* Foundation.framework */, 98 | BFAE66A21665E55D00F47322 /* Cocoa.framework */, 99 | ); 100 | name = Frameworks; 101 | sourceTree = ""; 102 | }; 103 | BFAE66A81665E55D00F47322 /* XcodeExplorer */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | BF46ED381665E768005C71E1 /* Classes */, 107 | BFAE66A91665E55D00F47322 /* Resources */, 108 | BFF3E8B41666C1A5004B8249 /* Other Sources */, 109 | BFF3E82D16663A6C004B8249 /* LICENSE.TXT */, 110 | BF46ED341665E5C2005C71E1 /* readme.md */, 111 | ); 112 | path = XcodeExplorer; 113 | sourceTree = ""; 114 | }; 115 | BFAE66A91665E55D00F47322 /* Resources */ = { 116 | isa = PBXGroup; 117 | children = ( 118 | BF69E4A716673E1C0045B66C /* en.lproj */, 119 | BFAE66AA1665E55D00F47322 /* XcodeExplorer-Info.plist */, 120 | F4F20A7C1A024E6300858054 /* Images.xcassets */, 121 | ); 122 | path = Resources; 123 | sourceTree = SOURCE_ROOT; 124 | }; 125 | BFF3E8B41666C1A5004B8249 /* Other Sources */ = { 126 | isa = PBXGroup; 127 | children = ( 128 | BFAE66AE1665E55D00F47322 /* XcodeExplorer-Prefix.pch */, 129 | ); 130 | path = "Other Sources"; 131 | sourceTree = SOURCE_ROOT; 132 | }; 133 | /* End PBXGroup section */ 134 | 135 | /* Begin PBXNativeTarget section */ 136 | BFAE669E1665E55D00F47322 /* XcodeExplorer */ = { 137 | isa = PBXNativeTarget; 138 | buildConfigurationList = BFAE66B11665E55D00F47322 /* Build configuration list for PBXNativeTarget "XcodeExplorer" */; 139 | buildPhases = ( 140 | BFAE669B1665E55D00F47322 /* Sources */, 141 | BFAE669C1665E55D00F47322 /* Frameworks */, 142 | BFAE669D1665E55D00F47322 /* Resources */, 143 | ); 144 | buildRules = ( 145 | ); 146 | dependencies = ( 147 | ); 148 | name = XcodeExplorer; 149 | productName = XcodeExplorer; 150 | productReference = BFAE669F1665E55D00F47322 /* XcodeExplorer.xcplugin */; 151 | productType = "com.apple.product-type.bundle"; 152 | }; 153 | /* End PBXNativeTarget section */ 154 | 155 | /* Begin PBXProject section */ 156 | BFAE66961665E55D00F47322 /* Project object */ = { 157 | isa = PBXProject; 158 | attributes = { 159 | LastUpgradeCheck = 0730; 160 | ORGANIZATIONNAME = "BlackDog Foundry"; 161 | }; 162 | buildConfigurationList = BFAE66991665E55D00F47322 /* Build configuration list for PBXProject "XcodeExplorer" */; 163 | compatibilityVersion = "Xcode 3.2"; 164 | developmentRegion = English; 165 | hasScannedForEncodings = 0; 166 | knownRegions = ( 167 | en, 168 | ); 169 | mainGroup = BFAE66941665E55D00F47322; 170 | productRefGroup = BFAE66A01665E55D00F47322 /* Products */; 171 | projectDirPath = ""; 172 | projectRoot = ""; 173 | targets = ( 174 | BFAE669E1665E55D00F47322 /* XcodeExplorer */, 175 | ); 176 | }; 177 | /* End PBXProject section */ 178 | 179 | /* Begin PBXResourcesBuildPhase section */ 180 | BFAE669D1665E55D00F47322 /* Resources */ = { 181 | isa = PBXResourcesBuildPhase; 182 | buildActionMask = 2147483647; 183 | files = ( 184 | BFAE66AD1665E55D00F47322 /* InfoPlist.strings in Resources */, 185 | BF46ED351665E5C2005C71E1 /* readme.md in Resources */, 186 | BF46ED401665EA90005C71E1 /* XCENotificationsWindowController.xib in Resources */, 187 | F4F20A7D1A024E6300858054 /* Images.xcassets in Resources */, 188 | BFF3E82E16663A6C004B8249 /* LICENSE.TXT in Resources */, 189 | BF1DB9AF166E917800EF717B /* XCEViewClickerWindowController.xib in Resources */, 190 | ); 191 | runOnlyForDeploymentPostprocessing = 0; 192 | }; 193 | /* End PBXResourcesBuildPhase section */ 194 | 195 | /* Begin PBXSourcesBuildPhase section */ 196 | BFAE669B1665E55D00F47322 /* Sources */ = { 197 | isa = PBXSourcesBuildPhase; 198 | buildActionMask = 2147483647; 199 | files = ( 200 | BF46ED3B1665E79A005C71E1 /* XCEPlugin.m in Sources */, 201 | BF46ED3F1665EA90005C71E1 /* XCENotificationsWindowController.m in Sources */, 202 | BF1DB9AE166E917800EF717B /* XCEViewClickerWindowController.m in Sources */, 203 | ); 204 | runOnlyForDeploymentPostprocessing = 0; 205 | }; 206 | /* End PBXSourcesBuildPhase section */ 207 | 208 | /* Begin PBXVariantGroup section */ 209 | BFAE66AB1665E55D00F47322 /* InfoPlist.strings */ = { 210 | isa = PBXVariantGroup; 211 | children = ( 212 | BFAE66AC1665E55D00F47322 /* en */, 213 | ); 214 | name = InfoPlist.strings; 215 | path = ..; 216 | sourceTree = ""; 217 | }; 218 | /* End PBXVariantGroup section */ 219 | 220 | /* Begin XCBuildConfiguration section */ 221 | BFAE66AF1665E55D00F47322 /* Debug */ = { 222 | isa = XCBuildConfiguration; 223 | buildSettings = { 224 | ALWAYS_SEARCH_USER_PATHS = NO; 225 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 226 | CLANG_CXX_LIBRARY = "libc++"; 227 | CLANG_WARN_EMPTY_BODY = YES; 228 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 229 | COPY_PHASE_STRIP = NO; 230 | ENABLE_TESTABILITY = YES; 231 | GCC_C_LANGUAGE_STANDARD = gnu99; 232 | GCC_DYNAMIC_NO_PIC = NO; 233 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 234 | GCC_OPTIMIZATION_LEVEL = 0; 235 | GCC_PREPROCESSOR_DEFINITIONS = ( 236 | "DEBUG=1", 237 | "$(inherited)", 238 | ); 239 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 240 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 241 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 242 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 243 | GCC_WARN_UNUSED_VARIABLE = YES; 244 | MACOSX_DEPLOYMENT_TARGET = 10.7; 245 | ONLY_ACTIVE_ARCH = YES; 246 | SDKROOT = macosx; 247 | }; 248 | name = Debug; 249 | }; 250 | BFAE66B01665E55D00F47322 /* Release */ = { 251 | isa = XCBuildConfiguration; 252 | buildSettings = { 253 | ALWAYS_SEARCH_USER_PATHS = NO; 254 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 255 | CLANG_CXX_LIBRARY = "libc++"; 256 | CLANG_WARN_EMPTY_BODY = YES; 257 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 258 | COPY_PHASE_STRIP = YES; 259 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 260 | GCC_C_LANGUAGE_STANDARD = gnu99; 261 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 262 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 263 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 264 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 265 | GCC_WARN_UNUSED_VARIABLE = YES; 266 | MACOSX_DEPLOYMENT_TARGET = 10.7; 267 | SDKROOT = macosx; 268 | }; 269 | name = Release; 270 | }; 271 | BFAE66B21665E55D00F47322 /* Debug */ = { 272 | isa = XCBuildConfiguration; 273 | buildSettings = { 274 | CLANG_ENABLE_OBJC_ARC = YES; 275 | COMBINE_HIDPI_IMAGES = YES; 276 | DEPLOYMENT_LOCATION = YES; 277 | DSTROOT = "$(HOME)"; 278 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 279 | GCC_PREFIX_HEADER = "Other Sources/XcodeExplorer-Prefix.pch"; 280 | INFOPLIST_FILE = "Resources/XcodeExplorer-Info.plist"; 281 | INSTALL_PATH = "/Library/Application Support/Developer/Shared/Xcode/Plug-ins"; 282 | PRODUCT_BUNDLE_IDENTIFIER = "com.bdf.${PRODUCT_NAME:rfc1034identifier}"; 283 | PRODUCT_NAME = "$(TARGET_NAME)"; 284 | WRAPPER_EXTENSION = xcplugin; 285 | }; 286 | name = Debug; 287 | }; 288 | BFAE66B31665E55D00F47322 /* Release */ = { 289 | isa = XCBuildConfiguration; 290 | buildSettings = { 291 | CLANG_ENABLE_OBJC_ARC = YES; 292 | COMBINE_HIDPI_IMAGES = YES; 293 | DEPLOYMENT_LOCATION = YES; 294 | DSTROOT = "$(HOME)"; 295 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 296 | GCC_PREFIX_HEADER = "Other Sources/XcodeExplorer-Prefix.pch"; 297 | INFOPLIST_FILE = "Resources/XcodeExplorer-Info.plist"; 298 | INSTALL_PATH = "/Library/Application Support/Developer/Shared/Xcode/Plug-ins"; 299 | PRODUCT_BUNDLE_IDENTIFIER = "com.bdf.${PRODUCT_NAME:rfc1034identifier}"; 300 | PRODUCT_NAME = "$(TARGET_NAME)"; 301 | WRAPPER_EXTENSION = xcplugin; 302 | }; 303 | name = Release; 304 | }; 305 | /* End XCBuildConfiguration section */ 306 | 307 | /* Begin XCConfigurationList section */ 308 | BFAE66991665E55D00F47322 /* Build configuration list for PBXProject "XcodeExplorer" */ = { 309 | isa = XCConfigurationList; 310 | buildConfigurations = ( 311 | BFAE66AF1665E55D00F47322 /* Debug */, 312 | BFAE66B01665E55D00F47322 /* Release */, 313 | ); 314 | defaultConfigurationIsVisible = 0; 315 | defaultConfigurationName = Release; 316 | }; 317 | BFAE66B11665E55D00F47322 /* Build configuration list for PBXNativeTarget "XcodeExplorer" */ = { 318 | isa = XCConfigurationList; 319 | buildConfigurations = ( 320 | BFAE66B21665E55D00F47322 /* Debug */, 321 | BFAE66B31665E55D00F47322 /* Release */, 322 | ); 323 | defaultConfigurationIsVisible = 0; 324 | defaultConfigurationName = Release; 325 | }; 326 | /* End XCConfigurationList section */ 327 | }; 328 | rootObject = BFAE66961665E55D00F47322 /* Project object */; 329 | } 330 | -------------------------------------------------------------------------------- /XcodeExplorer.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Xcode Explorer # 2 | This is a plugin project that allows you, as a developer, to explore 3 | the various events and notifications that Xcode4 emits during normal 4 | operations. 5 | 6 | There is some supplemental information that can be found in a the following posts: 7 | 8 | * [Monitoring Xcode4 Internals](http://www.blackdogfoundry.com/blog/xcodeexplorer-monitor-xcode4-internals/) 9 | * [Looking at Xcode4 Controls](http://www.blackdogfoundry.com/blog/xcodeexplorer-checking-out-the-controls/) 10 | 11 | ## Installation ## 12 | Installation is extremely simple. 13 | * Download the project 14 | * Open it in Xcode 15 | * Perform a build (this will automatically build and install the plugin) 16 | * Restart Xcode 17 | 18 | ## Usage ## 19 | The plugin adds a menu called `Explorer` that has a couple of menu items that you can choose from. 20 | 21 | ### Notifications ### 22 | Selecting this menu item will open a floating window that you can use to view the 23 | notifications as they occur. You can enter some comma-separated regular expressions 24 | into the text field to exclude notifications that you don't care about (for example, 25 | it is unlikely you will want to see most of the `NSxxxx` notifications, so it defaults 26 | to excluding them using the pattern `NS.*`). 27 | 28 | Be careful with your regular expressions. If you type in an invalid one, it just 29 | silently ignores it. 30 | 31 | ### View Clicker ### 32 | This allows you to click around on the various Xcode controls (buttons, text, etc) 33 | to see where they are located in the hierarchy (and what type they are). When you 34 | click on a view/button/textfield, it displays the view hierarchy. 35 | --------------------------------------------------------------------------------