├── .gitignore ├── AUTHORS ├── Changelog.markdown ├── Classes ├── MDMissingDrawer.h ├── MDMissingDrawer.m ├── MDPreferenceController.h ├── MDPreferenceController.m ├── MDResizer.h ├── MDResizer.m ├── MDSettings.h ├── MDSettings.m ├── MDSidebarBorderView.h ├── MDSidebarBorderView.m ├── MDSplitView.h ├── MDSplitView.m ├── NSWindowController+MDAdditions.h ├── NSWindowController+MDAdditions.m ├── NSWindowController+MDMethodReplacements.h ├── NSWindowController+MDMethodReplacements.m ├── NSWindowController+Preferences.h ├── NSWindowController+Preferences.m └── TMPlugInController.h ├── LICENSE ├── MissingDrawer.tmproj ├── MissingDrawer.xcodeproj ├── Jannis.mode1v3 ├── Jannis.pbxuser └── project.pbxproj ├── Other Sources ├── MDDebugUtils.h ├── MDDefines.h ├── MDDefines.m └── MissingDrawer_Prefix.pch ├── Readme.markdown └── Resources ├── English.lproj ├── ButtonTerminal.png ├── ButtonTerminalPressed.png ├── DrawerBorder.png ├── DrawerResizeHandle.png └── Preferences.xib ├── Info.plist └── defaultSettings.plist /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | .DS_Store 3 | build/* 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | *.xcworkspace 13 | !default.xcworkspace 14 | xcuserdata 15 | profile 16 | *.moved-aside -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | hetima computer 2 | Jannis Leidel 3 | Christoph Meißner 4 | Derek Prior 5 | Sam Soffes 6 | Mads Hartmann Jensen -------------------------------------------------------------------------------- /Changelog.markdown: -------------------------------------------------------------------------------- 1 | ### 2011-08-04 2 | 3 | * Requires Mac OS 10.6 from now on. 4 | 5 | ### 2011-05-28 6 | 7 | * Added version to Missing Drawer and display it in preferences 8 | * Added preferences UI for colors (thanks [@shell](http://github.com/shell)) and the terminal button. 9 | 10 | ### 2010-11-28 11 | 12 | * Fixed focus sideview shortcut regarding the recent tab select shortcut changes. 13 | * Limit cell spacing of sidebar again to Xcode-like values. 14 | * If there is no selection, then the "Terminal Button" opens the terminal with the path of the first item in the sidebar. 15 | 16 | ### 2010-10-29 17 | 18 | * Target 10.5 SDK 19 | * Remove NSSplitViewDelegate (10.6 only) dependency 20 | * Updated split view initialization logic so it works with 10.5 21 | 22 | ### 2010-07-08 23 | 24 | * Added a "Open Terminal Here" button to the drawer's button panel 25 | * Fixed the issue of an actual missing drawer when opening a TextMate project (``*.tmproj``) by double clicking it or a directory by dragging it to the dock icon when TextMate is not running already 26 | * Added lefty support for toggling the file list to be displayed left or right to edit window 27 | 28 | ### 2009-01-27 29 | 30 | * The Reveal in Project menu item is working again, thanks to fixes from the 31 | community 32 | * I've decided to remove the fake blue-ish background color again because it not only had poor contrast but also isn't really something like iTunes sidebar but rather a Finder link list view. I hope you enjoy. 33 | 34 | ### 2008-06-10 35 | 36 | * The drawer is now saved with a minimal width if it's collapsed 37 | * The Reveal in Project menu item is now disabled since I don't know how to fix it 38 | * The weird looking background in Tiger is fixed 39 | 40 | ### 2008-02-14 41 | 42 | * Added missing functionality and modified appearance 43 | 44 | ### 2006-11-08 45 | 46 | * Initial release 47 | -------------------------------------------------------------------------------- /Classes/MDMissingDrawer.h: -------------------------------------------------------------------------------- 1 | // 2 | // MDMissingDrawer.h 3 | // MissingDrawer 4 | // 5 | // Copyright (c) The MissingDrawer authors. 6 | // 7 | // Permission is hereby granted, free of charge, to any person 8 | // obtaining a copy of this software and associated documentation 9 | // files (the "Software"), to deal in the Software without 10 | // restriction, including without limitation the rights to use, 11 | // copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the 13 | // Software is furnished to do so, subject to the following 14 | // conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be 17 | // included in all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | // OTHER DEALINGS IN THE SOFTWARE. 27 | // 28 | 29 | #import "TMPlugInController.h" 30 | 31 | @class MDSplitView; 32 | 33 | @interface MDMissingDrawer : NSObject { 34 | 35 | 36 | } 37 | 38 | // Class Methods 39 | + (NSBundle *)pluginBundle; 40 | + (NSImage *)bundledImageWithName:(NSString *)imageName; 41 | + (MDSplitView *)makeSplitViewWithMainView:(NSView *)contentView sideView:(NSView *)sideView; 42 | 43 | // Plugin hook 44 | - (id)initWithPlugInController:(id)aController; 45 | 46 | // Actions 47 | - (void)toggleSplitViewLayout:(id)sender; 48 | 49 | @end 50 | -------------------------------------------------------------------------------- /Classes/MDMissingDrawer.m: -------------------------------------------------------------------------------- 1 | // 2 | // MDMissingDrawer.m 3 | // MissingDrawer 4 | // 5 | // Copyright (c) The MissingDrawer authors. 6 | // 7 | // Permission is hereby granted, free of charge, to any person 8 | // obtaining a copy of this software and associated documentation 9 | // files (the "Software"), to deal in the Software without 10 | // restriction, including without limitation the rights to use, 11 | // copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the 13 | // Software is furnished to do so, subject to the following 14 | // conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be 17 | // included in all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | // OTHER DEALINGS IN THE SOFTWARE. 27 | // 28 | 29 | #import "MDMissingDrawer.h" 30 | #import "MDSplitView.h" 31 | #import "MDSidebarBorderView.h" 32 | #import "MDSettings.h" 33 | #import "NSWindowController+MDMethodReplacements.h" 34 | #import "NSWindowController+MDAdditions.h" 35 | #import 36 | 37 | void swapInstanceMethods(Class cls, SEL originalSel, SEL newSel) { 38 | Method originalMethod = class_getInstanceMethod(cls, originalSel); 39 | Method newMethod = class_getInstanceMethod(cls, newSel); 40 | method_exchangeImplementations(originalMethod, newMethod); 41 | } 42 | 43 | 44 | @interface MDMissingDrawer (PrivateMethods) 45 | - (void)_injectPluginMethods; 46 | - (void)_installMenuItems; 47 | - (void)_injectPreferenceMethods; 48 | @end 49 | 50 | @implementation MDMissingDrawer 51 | 52 | #pragma mark Class Methods 53 | 54 | + (NSBundle *)pluginBundle { 55 | return [NSBundle bundleForClass:[self class]]; 56 | } 57 | 58 | 59 | + (NSImage *)bundledImageWithName:(NSString *)imageName { 60 | NSBundle *pluginBundle = [[self class] pluginBundle]; 61 | return [[[NSImage alloc] initWithContentsOfFile:[pluginBundle pathForResource:imageName ofType:@"png"]] autorelease]; 62 | } 63 | 64 | 65 | + (MDSplitView *)makeSplitViewWithMainView:(NSView *)contentView sideView:(NSView *)sideView { 66 | MDLog(); 67 | MDSplitView *splitView = [[MDSplitView alloc] initWithFrame:[contentView frame] mainView:contentView sideView:sideView]; 68 | [splitView setVertical:YES]; 69 | return [splitView autorelease]; 70 | } 71 | 72 | 73 | #pragma mark Plugin Hook 74 | 75 | - (id)initWithPlugInController:(id)aController { 76 | if (self = [super init]) { 77 | MDLog(@"initializing 'MissingDrawer' plugin"); 78 | 79 | // Setup defaults 80 | NSColor *activeColor = [NSColor colorWithCalibratedRed:0.867f green:0.894f blue:0.918f alpha:1.0f]; 81 | NSColor *idleColor = [NSColor colorWithCalibratedRed:0.929f green:0.929f blue:0.929f alpha:1.0f]; 82 | NSDictionary *defaults = [[NSDictionary alloc] initWithObjectsAndKeys: 83 | [NSKeyedArchiver archivedDataWithRootObject:activeColor], kMDSidebarBackgroundColorActiveKey, 84 | [NSKeyedArchiver archivedDataWithRootObject:idleColor], kMDSidebarBackgroundColorIdleKey, 85 | nil]; 86 | 87 | [[NSUserDefaults standardUserDefaults] registerDefaults:defaults]; 88 | [[NSUserDefaultsController sharedUserDefaultsController] setInitialValues:defaults]; 89 | [defaults release]; 90 | 91 | [self _injectPluginMethods]; 92 | [[[NSApp mainWindow] windowController] MD_splitWindowIfNeeded]; 93 | [[[NSApp mainWindow] windowController] MD_windowDidBecomeMain:nil]; 94 | [self _installMenuItems]; 95 | [self _injectPreferenceMethods]; 96 | } 97 | return self; 98 | } 99 | 100 | 101 | #pragma mark Actions 102 | 103 | - (void)toggleSplitViewLayout:(id)sender { 104 | MDLog(@"Toggle Left/Right"); 105 | [[NSNotificationCenter defaultCenter] postNotificationName:@"MDToggleSplitViewLayout" object:nil]; 106 | } 107 | 108 | 109 | #pragma mark Private Methods 110 | 111 | - (void)_installMenuItems { 112 | NSMenu *viewMenu = [[[NSApp mainMenu] itemWithTitle:@"View"] submenu]; 113 | 114 | NSMenuItem *showHideDrawerMenuItem = nil; 115 | NSInteger drawerMenuItemIndex = 0; 116 | 117 | MDSettings *settings = [MDSettings defaultSettings]; 118 | 119 | for (NSMenuItem *menuItem in [viewMenu itemArray]) { 120 | if ([[menuItem title] isEqualToString:@"Show/Hide Project Drawer"]) { 121 | showHideDrawerMenuItem = menuItem; 122 | drawerMenuItemIndex = [[viewMenu itemArray] indexOfObject:menuItem]; 123 | } 124 | } 125 | 126 | NSMenuItem *drawerSubmenuItem = [[NSMenuItem alloc] initWithTitle:@"Project Drawer" action:nil keyEquivalent:@""]; 127 | NSMenu *drawerMenu = [[NSMenu alloc] initWithTitle:@"Project Drawer"]; 128 | [drawerSubmenuItem setSubmenu:drawerMenu]; 129 | [drawerMenu addItem:settings.toggleSplitViewLayoutMenuItem]; 130 | [drawerMenu addItem:settings.focusSideViewMenuItem]; 131 | [showHideDrawerMenuItem retain]; 132 | [viewMenu removeItemAtIndex:drawerMenuItemIndex]; 133 | [drawerMenu insertItem:showHideDrawerMenuItem atIndex:0]; 134 | [viewMenu insertItem:drawerSubmenuItem atIndex:drawerMenuItemIndex]; 135 | 136 | [drawerSubmenuItem release]; 137 | [drawerMenu release]; 138 | [showHideDrawerMenuItem release]; 139 | } 140 | 141 | 142 | - (void)_injectPluginMethods { 143 | MDLog(@"swapping OakProjectController methods"); 144 | 145 | Class oakProjectController = NSClassFromString(@"OakProjectController"); 146 | swapInstanceMethods(oakProjectController, @selector(windowDidLoad), @selector(MD_repl_windowDidLoad)); 147 | swapInstanceMethods(oakProjectController, @selector(windowWillClose:), @selector(MD_repl_windowWillClose:)); 148 | swapInstanceMethods(oakProjectController, @selector(openProjectDrawer:), @selector(MD_repl_openProjectDrawer:)); 149 | swapInstanceMethods(oakProjectController, @selector(revealInProject:), @selector(MD_repl_revealInProject:)); 150 | } 151 | 152 | - (void)_injectPreferenceMethods { 153 | MDLog("swapping OakPreferencesManager methods"); 154 | 155 | Class oakPreferenceController = NSClassFromString(@"OakPreferencesManager"); 156 | swapInstanceMethods(oakPreferenceController, @selector(toolbarAllowedItemIdentifiers:), @selector(MD_toolbarAllowedItemIdentifiers:)); 157 | swapInstanceMethods(oakPreferenceController, @selector(toolbarDefaultItemIdentifiers:), @selector(MD_toolbarDefaultItemIdentifiers:)); 158 | swapInstanceMethods(oakPreferenceController, @selector(toolbarSelectableItemIdentifiers:), @selector(MD_toolbarSelectableItemIdentifiers:)); 159 | swapInstanceMethods(oakPreferenceController, @selector(selectToolbarItem:), @selector(MD_selectToolbarItem:)); 160 | 161 | swapInstanceMethods(oakPreferenceController, @selector(toolbar:itemForItemIdentifier:willBeInsertedIntoToolbar:), 162 | @selector(MD_toolbar:itemForItemIdentifier:willBeInsertedIntoToolbar:)); 163 | } 164 | 165 | @end -------------------------------------------------------------------------------- /Classes/MDPreferenceController.h: -------------------------------------------------------------------------------- 1 | // 2 | // MDPreferenceController.h 3 | // MissingDrawer 4 | // 5 | // Copyright (c) The MissingDrawer authors. 6 | // 7 | // Permission is hereby granted, free of charge, to any person 8 | // obtaining a copy of this software and associated documentation 9 | // files (the "Software"), to deal in the Software without 10 | // restriction, including without limitation the rights to use, 11 | // copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the 13 | // Software is furnished to do so, subject to the following 14 | // conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be 17 | // included in all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | // OTHER DEALINGS IN THE SOFTWARE. 27 | // 28 | 29 | @interface MDPreferenceController : NSObject { 30 | 31 | IBOutlet NSView *preferencesView; 32 | IBOutlet NSTextField *versionTextField; 33 | 34 | @private 35 | 36 | NSWindowController *_preferenceWindowController; 37 | 38 | } 39 | 40 | + (MDPreferenceController *)instance; 41 | 42 | @property(retain, readonly) NSView *preferencesView; 43 | 44 | @end 45 | -------------------------------------------------------------------------------- /Classes/MDPreferenceController.m: -------------------------------------------------------------------------------- 1 | // 2 | // MDPreferenceController.m 3 | // MissingDrawer 4 | // 5 | // Copyright (c) The MissingDrawer authors. 6 | // 7 | // Permission is hereby granted, free of charge, to any person 8 | // obtaining a copy of this software and associated documentation 9 | // files (the "Software"), to deal in the Software without 10 | // restriction, including without limitation the rights to use, 11 | // copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the 13 | // Software is furnished to do so, subject to the following 14 | // conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be 17 | // included in all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | // OTHER DEALINGS IN THE SOFTWARE. 27 | // 28 | 29 | #import "MDPreferenceController.h" 30 | 31 | 32 | @implementation MDPreferenceController 33 | 34 | @synthesize preferencesView; 35 | 36 | static MDPreferenceController *sharedInstance = nil; 37 | 38 | + (MDPreferenceController *)instance { 39 | @synchronized (self) { 40 | if (sharedInstance == nil) { 41 | [[self alloc] init]; 42 | } 43 | } 44 | return sharedInstance; 45 | } 46 | 47 | - (id)init { 48 | if ((self = [super init])) { 49 | sharedInstance = self; 50 | 51 | // Load the preference NIB 52 | NSString* nibPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"Preferences" ofType:@"nib"]; 53 | _preferenceWindowController = [[NSWindowController alloc] initWithWindowNibPath:nibPath owner:self]; 54 | [_preferenceWindowController showWindow:self]; 55 | 56 | } 57 | return self; 58 | } 59 | 60 | 61 | - (void)awakeFromNib { 62 | [super awakeFromNib]; 63 | 64 | NSBundle *pluginBundle = [NSBundle bundleForClass:[self class]]; 65 | NSString *version = [[pluginBundle infoDictionary] objectForKey:@"CFBundleVersion"]; 66 | 67 | NSString *string = [[NSString alloc] initWithFormat:@"Missing Drawer %@", version]; 68 | [versionTextField setStringValue:string]; 69 | [string release]; 70 | } 71 | 72 | @end 73 | -------------------------------------------------------------------------------- /Classes/MDResizer.h: -------------------------------------------------------------------------------- 1 | // 2 | // MDResizer.h 3 | // MissingDrawer 4 | // 5 | // Copyright (c) The MissingDrawer authors. 6 | // 7 | // Permission is hereby granted, free of charge, to any person 8 | // obtaining a copy of this software and associated documentation 9 | // files (the "Software"), to deal in the Software without 10 | // restriction, including without limitation the rights to use, 11 | // copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the 13 | // Software is furnished to do so, subject to the following 14 | // conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be 17 | // included in all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | // OTHER DEALINGS IN THE SOFTWARE. 27 | // 28 | 29 | @interface MDResizer : NSImageView { 30 | 31 | } 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /Classes/MDResizer.m: -------------------------------------------------------------------------------- 1 | // 2 | // MDResizer.m 3 | // MissingDrawer 4 | // 5 | // Copyright (c) The MissingDrawer authors. 6 | // 7 | // Permission is hereby granted, free of charge, to any person 8 | // obtaining a copy of this software and associated documentation 9 | // files (the "Software"), to deal in the Software without 10 | // restriction, including without limitation the rights to use, 11 | // copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the 13 | // Software is furnished to do so, subject to the following 14 | // conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be 17 | // included in all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | // OTHER DEALINGS IN THE SOFTWARE. 27 | // 28 | 29 | #import "MDResizer.h" 30 | 31 | @implementation MDResizer 32 | 33 | - (void)mouseDown:(NSEvent *)theEvent { 34 | MDLog(@"mouseDown in sliderImage"); 35 | [[[self superview] superview] mouseDown:theEvent]; 36 | } 37 | 38 | 39 | - (void)mouseDragged:(NSEvent *)theEvent { 40 | MDLog(@"mouseDragged in sliderImage"); 41 | [[[self superview] superview] mouseDragged:theEvent]; 42 | } 43 | 44 | @end 45 | -------------------------------------------------------------------------------- /Classes/MDSettings.h: -------------------------------------------------------------------------------- 1 | // 2 | // MDSettings.h 3 | // MissingDrawer 4 | // 5 | // Copyright (c) The MissingDrawer authors. 6 | // 7 | // Permission is hereby granted, free of charge, to any person 8 | // obtaining a copy of this software and associated documentation 9 | // files (the "Software"), to deal in the Software without 10 | // restriction, including without limitation the rights to use, 11 | // copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the 13 | // Software is furnished to do so, subject to the following 14 | // conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be 17 | // included in all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | // OTHER DEALINGS IN THE SOFTWARE. 27 | // 28 | 29 | @interface MDSettings : NSObject { 30 | 31 | @private 32 | 33 | BOOL _showSideViewOnLeft; 34 | NSRect _sideViewLayout; 35 | NSRect _mainViewLayout; 36 | NSMenuItem *_toggleSplitViewLayoutMenuItem; 37 | NSMenuItem *_focusSideViewMenuItem; 38 | NSColor *_bgColor; 39 | NSColor *_bgColorInactive; 40 | NSDictionary *_namedColors; 41 | } 42 | 43 | @property (nonatomic, readonly) NSMenuItem *toggleSplitViewLayoutMenuItem; 44 | @property (nonatomic, readonly) NSMenuItem *focusSideViewMenuItem; 45 | @property BOOL showSideViewOnLeft; 46 | @property NSRect sideViewLayout; 47 | @property NSRect mainViewLayout; 48 | @property (nonatomic, retain) NSColor *bgColor; 49 | @property (nonatomic, retain) NSColor *bgColorInactive; 50 | @property (nonatomic, readonly) NSDictionary *namedColors; 51 | 52 | + (MDSettings *)defaultSettings; 53 | 54 | - (void)save; 55 | - (IBAction)toggleSideViewLayout:(id)sender; 56 | - (IBAction)focusSideView:(id)sender; 57 | 58 | @end 59 | -------------------------------------------------------------------------------- /Classes/MDSettings.m: -------------------------------------------------------------------------------- 1 | // 2 | // MDSettings.m 3 | // MissingDrawer 4 | // 5 | // Copyright (c) The MissingDrawer authors. 6 | // 7 | // Permission is hereby granted, free of charge, to any person 8 | // obtaining a copy of this software and associated documentation 9 | // files (the "Software"), to deal in the Software without 10 | // restriction, including without limitation the rights to use, 11 | // copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the 13 | // Software is furnished to do so, subject to the following 14 | // conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be 17 | // included in all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | // OTHER DEALINGS IN THE SOFTWARE. 27 | // 28 | 29 | #import "MDSettings.h" 30 | 31 | static MDSettings *_defaultSettings = nil; 32 | 33 | @implementation MDSettings 34 | 35 | @synthesize showSideViewOnLeft = _showSideViewOnLeft; 36 | @synthesize sideViewLayout = _sideViewLayout; 37 | @synthesize mainViewLayout = _mainViewLayout; 38 | @synthesize toggleSplitViewLayoutMenuItem = _toggleSplitViewLayoutMenuItem; 39 | @synthesize focusSideViewMenuItem = _focusSideViewMenuItem; 40 | @synthesize bgColor = _bgColor; 41 | @synthesize bgColorInactive = _bgColorInactive; 42 | @synthesize namedColors = _namedColors; 43 | 44 | - (id)init { 45 | if ((self = [super init])) { 46 | NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 47 | 48 | // initially register defaults from bundled defaultSettings.plist file 49 | NSBundle *pluginBundle = [NSBundle bundleForClass:[self class]]; 50 | NSDictionary *bundledDefaultSettings = [[NSDictionary alloc] initWithContentsOfFile:[pluginBundle pathForResource:@"defaultSettings" ofType:@"plist"]]; 51 | [defaults registerDefaults:bundledDefaultSettings]; 52 | [bundledDefaultSettings release]; 53 | [defaults synchronize]; 54 | 55 | self.sideViewLayout = NSRectFromString([defaults objectForKey:kMDSideViewFrameKey]); 56 | self.mainViewLayout = NSRectFromString([defaults objectForKey:kMDMainViewFrameKey]); 57 | self.showSideViewOnLeft = [defaults boolForKey:kMDSideViewLeftKey]; 58 | 59 | NSString *menuTitle = self.showSideViewOnLeft ? @"Show on the Right" : @"Show on the Left"; 60 | _toggleSplitViewLayoutMenuItem = [[NSMenuItem alloc] initWithTitle:menuTitle action:@selector(toggleSideViewLayout:) keyEquivalent:@""]; 61 | [_toggleSplitViewLayoutMenuItem setTarget:self]; 62 | [_toggleSplitViewLayoutMenuItem setEnabled:YES]; 63 | 64 | _focusSideViewMenuItem = [[NSMenuItem alloc] initWithTitle:@"Focus Sideview" action:@selector(focusSideView:) keyEquivalent:@"["]; 65 | [_focusSideViewMenuItem setKeyEquivalentModifierMask:(NSControlKeyMask | NSAlternateKeyMask | NSCommandKeyMask)]; 66 | [_focusSideViewMenuItem setTarget:self]; 67 | [_focusSideViewMenuItem setEnabled:YES]; 68 | } 69 | return self; 70 | } 71 | 72 | - (IBAction)toggleSideViewLayout:(id)sender { 73 | MDLog(); 74 | self.showSideViewOnLeft = !self.showSideViewOnLeft; 75 | [self save]; 76 | 77 | if ([sender isKindOfClass:[NSMenuItem class]]) { 78 | [[NSNotificationCenter defaultCenter] postNotificationName:@"MDSideviewLayoutHasBeenChangedNotification" object:nil]; 79 | [(NSMenuItem*)sender setTitle:self.showSideViewOnLeft ? @"Show on the Right" : @"Show on the Left"]; 80 | } 81 | } 82 | 83 | - (IBAction)focusSideView:(id)sender{ 84 | [[NSNotificationCenter defaultCenter] postNotificationName:@"MDFocusSideViewPressed" object:nil]; 85 | } 86 | 87 | - (void)save { 88 | NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 89 | [defaults setObject:NSStringFromRect(self.sideViewLayout) forKey:kMDSideViewFrameKey]; 90 | [defaults setObject:NSStringFromRect(self.mainViewLayout) forKey:kMDMainViewFrameKey]; 91 | [defaults setBool:self.showSideViewOnLeft forKey:kMDSideViewLeftKey]; 92 | [defaults synchronize]; 93 | } 94 | 95 | #pragma mark Singleton 96 | 97 | + (MDSettings *)defaultSettings { 98 | if (_defaultSettings == nil) { 99 | _defaultSettings = [[super allocWithZone:NULL] init]; 100 | } 101 | return _defaultSettings; 102 | } 103 | 104 | 105 | + (id)allocWithZone:(NSZone *)zone { 106 | return [[self defaultSettings] retain]; 107 | } 108 | 109 | 110 | - (id)copyWithZone:(NSZone *)zone { 111 | return self; 112 | } 113 | 114 | 115 | - (id)retain { 116 | return self; 117 | } 118 | 119 | 120 | - (NSUInteger)retainCount { 121 | return NSUIntegerMax; 122 | } 123 | 124 | 125 | - (void)release { 126 | // Do nothing 127 | } 128 | 129 | 130 | - (id)autorelease { 131 | return self; 132 | } 133 | 134 | @end 135 | -------------------------------------------------------------------------------- /Classes/MDSidebarBorderView.h: -------------------------------------------------------------------------------- 1 | // 2 | // MDSidebarBorderView.h 3 | // MissingDrawer 4 | // 5 | // Copyright (c) The MissingDrawer authors. 6 | // 7 | // Permission is hereby granted, free of charge, to any person 8 | // obtaining a copy of this software and associated documentation 9 | // files (the "Software"), to deal in the Software without 10 | // restriction, including without limitation the rights to use, 11 | // copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the 13 | // Software is furnished to do so, subject to the following 14 | // conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be 17 | // included in all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | // OTHER DEALINGS IN THE SOFTWARE. 27 | // 28 | 29 | @interface MDSidebarBorderView : NSView { 30 | 31 | @private 32 | 33 | id _projectFileOutlineView; 34 | } 35 | 36 | // Drawing 37 | - (void)addToSuperview:(NSView *)superview; 38 | 39 | // Actions 40 | - (void)terminalButtonPressed:(id)sender; 41 | 42 | @end 43 | -------------------------------------------------------------------------------- /Classes/MDSidebarBorderView.m: -------------------------------------------------------------------------------- 1 | // 2 | // MDSidebarBorderView.m 3 | // MissingDrawer 4 | // 5 | // Copyright (c) The MissingDrawer authors. 6 | // 7 | // Permission is hereby granted, free of charge, to any person 8 | // obtaining a copy of this software and associated documentation 9 | // files (the "Software"), to deal in the Software without 10 | // restriction, including without limitation the rights to use, 11 | // copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the 13 | // Software is furnished to do so, subject to the following 14 | // conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be 17 | // included in all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | // OTHER DEALINGS IN THE SOFTWARE. 27 | // 28 | 29 | #import "MDSidebarBorderView.h" 30 | #import "MDResizer.h" 31 | #import "MDSettings.h" 32 | #import "MDMissingDrawer.h" 33 | 34 | NSComparisonResult compareFrameOriginX(id viewA, id viewB, void *context) { 35 | float v1 = [viewA frame].origin.x; 36 | float v2 = [viewB frame].origin.x; 37 | 38 | if (v1 < v2) { 39 | return NSOrderedAscending; 40 | } else if (v1 > v2) { 41 | return NSOrderedDescending; 42 | } 43 | 44 | return NSOrderedSame; 45 | } 46 | 47 | @interface MDSidebarBorderView (PrivateMethods) 48 | - (NSString *)_selectedFilePath; 49 | @end 50 | 51 | 52 | @implementation MDSidebarBorderView 53 | 54 | #pragma mark NSView 55 | 56 | - (BOOL)mouseDownCanMoveWindow { 57 | return YES; 58 | } 59 | 60 | 61 | - (void)drawRect:(NSRect)rect { 62 | NSRect fromRect = NSZeroRect; 63 | NSImage *image = [MDMissingDrawer bundledImageWithName:@"DrawerBorder"]; 64 | fromRect.size = [image size]; 65 | 66 | [image drawInRect:[self frame] fromRect:fromRect operation:NSCompositeSourceOver fraction:1.0]; 67 | } 68 | 69 | 70 | #pragma mark Drawing 71 | 72 | - (void)addToSuperview:(NSView *)superview { 73 | NSScrollView *outlineView = nil; 74 | int i, cnt; 75 | BOOL showSidebarOnLeft = [[MDSettings defaultSettings] showSideViewOnLeft]; 76 | 77 | // Adjust frame 78 | NSImage *image = [MDMissingDrawer bundledImageWithName:@"DrawerBorder"]; 79 | NSRect borderRect = NSZeroRect; 80 | borderRect.origin.x = showSidebarOnLeft ? -1.0 : 1.0; 81 | borderRect.size.height = [image size].height; 82 | borderRect.size.width = [superview frame].size.width + 2; 83 | 84 | // Add resizer image 85 | NSRect handleRect = NSZeroRect; 86 | NSImage *sidebarResizerImage = [MDMissingDrawer bundledImageWithName:@"DrawerResizeHandle"]; 87 | handleRect.size = [sidebarResizerImage size]; 88 | handleRect.origin.y = 0; 89 | if (showSidebarOnLeft) { 90 | handleRect.origin.x = [self frame].size.width - handleRect.size.width; 91 | } else { 92 | handleRect.origin.x = 0; 93 | } 94 | NSImageView *imageView = [[MDResizer alloc] initWithFrame:handleRect]; 95 | [imageView setImage: sidebarResizerImage]; 96 | [imageView setAutoresizingMask:showSidebarOnLeft?NSViewMinXMargin:NSViewMaxXMargin]; 97 | [self addSubview:imageView]; 98 | [self setNeedsDisplay:YES]; 99 | 100 | [self setAutoresizingMask:(NSViewWidthSizable+NSViewMaxYMargin)]; 101 | 102 | // Add self to superview 103 | [superview addSubview:self]; 104 | [self setFrame:borderRect]; 105 | 106 | // Gather buttons 107 | NSMutableArray *btns = [[NSMutableArray alloc] init]; 108 | NSArray *subviews = [superview subviews]; 109 | cnt = [subviews count]; 110 | for (i = 0; i < cnt; i++) { 111 | id aView = [subviews objectAtIndex:i]; 112 | if ([aView isKindOfClass:[NSButton class]] && [aView frame].origin.y < 1) { 113 | [btns addObject:aView]; 114 | } else if ([aView isKindOfClass:[NSScrollView class]]) { 115 | outlineView = (NSScrollView *)aView; 116 | _projectFileOutlineView = [[outlineView contentView] documentView]; 117 | } 118 | } 119 | 120 | [btns sortUsingFunction:(NSInteger (*)(id, id, void *))compareFrameOriginX context:nil]; 121 | 122 | // Terminal button 123 | if ([[NSUserDefaults standardUserDefaults] boolForKey:kMDTerminalButtonEnabledKey]) { 124 | NSRect tmButtonFrame = [[btns lastObject] frame]; 125 | NSRect buttonFrame = NSMakeRect(tmButtonFrame.origin.x + tmButtonFrame.size.width, tmButtonFrame.origin.y, 126 | 23.0f, tmButtonFrame.size.height); 127 | 128 | NSButton *terminalButton = [[NSButton alloc] initWithFrame:buttonFrame]; 129 | 130 | NSImage *buttonImage = [MDMissingDrawer bundledImageWithName:@"ButtonTerminal"]; 131 | NSImage *buttonImagePressed = [MDMissingDrawer bundledImageWithName:@"ButtonTerminalPressed"]; 132 | 133 | [terminalButton setToolTip:@"Open Terminal window and 'cd' to selected file/folder"]; 134 | [terminalButton setImage:buttonImage]; 135 | [terminalButton setAlternateImage:buttonImagePressed]; 136 | [terminalButton setAction:@selector(terminalButtonPressed:)]; 137 | [terminalButton setTarget:self]; 138 | 139 | [terminalButton setBordered:NO]; 140 | [btns addObject:terminalButton]; 141 | [terminalButton release]; 142 | } 143 | 144 | // Adjust outlineView frame 145 | if (outlineView) { 146 | NSRect aRect = [superview frame]; 147 | aRect.origin.x = -1.0; 148 | aRect.origin.y = [self frame].size.height; 149 | aRect.size.height = aRect.size.height-aRect.origin.y+1; 150 | aRect.size.width = aRect.size.width+2; 151 | [outlineView setFrame:aRect]; 152 | 153 | NSOutlineView *realOutlineView = [outlineView documentView]; 154 | NSFont *font = [NSFont fontWithName:@"Lucida Grande" size:12]; 155 | NSLayoutManager *layoutManager = [NSLayoutManager new]; 156 | [realOutlineView setRowHeight:[layoutManager defaultLineHeightForFont:font]]; 157 | [realOutlineView setIntercellSpacing:NSMakeSize (4.0, 2.0)]; 158 | [layoutManager release]; 159 | [realOutlineView reloadData]; 160 | } 161 | 162 | float leftLoc = 0; 163 | if (!showSidebarOnLeft) { 164 | leftLoc = leftLoc + handleRect.size.width; // = 18 165 | } 166 | 167 | for (NSView *button in btns) { 168 | NSRect buttonFrame = [button frame]; 169 | buttonFrame.origin.y = -4; 170 | buttonFrame.origin.x = leftLoc; 171 | leftLoc = leftLoc + (buttonFrame.size.width-1); 172 | 173 | [button setAutoresizingMask:NSViewMaxXMargin]; 174 | [button removeFromSuperview]; 175 | [button setFrame:buttonFrame]; 176 | [self addSubview:button]; 177 | } 178 | 179 | [btns release]; 180 | [imageView release]; 181 | } 182 | 183 | 184 | #pragma mark Actions 185 | 186 | - (void)terminalButtonPressed:(id)sender { 187 | NSString *path = [self _selectedFilePath]; 188 | if (!path) { 189 | return; 190 | } 191 | 192 | path = [path stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\\\\\""]; 193 | NSString *appName = [[NSUserDefaults standardUserDefaults] stringForKey:kMDTerminalApplicationKey]; 194 | // BOOL openTerminalInTab = [[MDSettings defaultSettings] openTerminalInTab]; 195 | NSString *appleScriptCommand = nil; 196 | 197 | if ([appName isEqualToString:@"iTerm"]) { 198 | appleScriptCommand = [NSString stringWithFormat:@"tell application \"iTerm\"\n\tactivate\n\ttell the first terminal\n\t\tlaunch session \"Default session\"\n\t\ttell the last session\n\t\t\twrite text \"cd \\\"%@\\\"\"\n\t\tend tell\n\tend tell\nend tell", path]; 199 | } else { 200 | appleScriptCommand = [NSString stringWithFormat:@"activate application \"Terminal\"\n\ttell application \"System Events\"\n\tkeystroke \"t\" using {command down}\n\tend tell\n\ttell application \"Terminal\"\n\trepeat with win in windows\n\ttry\n\tif get frontmost of win is true then\n\tdo script \"cd \\\"%@\\\"; clear\" in (selected tab of win)\n\tend if\n\tend try\n\tend repeat\n\tend tell", path]; 201 | } 202 | 203 | MDLog(@"script:\n%@", appleScriptCommand); 204 | NSAppleScript *as = [[NSAppleScript alloc] initWithSource: appleScriptCommand]; 205 | [as executeAndReturnError:nil]; 206 | [as release]; 207 | return; 208 | } 209 | 210 | 211 | #pragma mark Private Methods 212 | 213 | - (NSString *)_selectedFilePath { 214 | NSArray *selectedItems = nil; 215 | if (_projectFileOutlineView && 216 | [_projectFileOutlineView respondsToSelector:@selector(selectedItems)]) { 217 | selectedItems = [_projectFileOutlineView performSelector:@selector(selectedItems)]; 218 | if (!selectedItems || ![selectedItems isKindOfClass:[NSArray class]] || [selectedItems count] == 0) { 219 | selectedItems = [NSArray arrayWithObject:[(NSOutlineView *)_projectFileOutlineView itemAtRow:0]]; 220 | } 221 | } 222 | 223 | for (NSDictionary *item in selectedItems) { 224 | NSString *path = [item objectForKey:@"sourceDirectory"]; 225 | if (!path) { 226 | path = [[item objectForKey:@"filename"] stringByDeletingLastPathComponent]; 227 | } 228 | 229 | if (path) { 230 | return path; 231 | } 232 | } 233 | 234 | return nil; 235 | } 236 | 237 | @end 238 | -------------------------------------------------------------------------------- /Classes/MDSplitView.h: -------------------------------------------------------------------------------- 1 | // 2 | // MDSplitView.h 3 | // MissingDrawer 4 | // 5 | // Copyright (c) The MissingDrawer authors. 6 | // 7 | // Permission is hereby granted, free of charge, to any person 8 | // obtaining a copy of this software and associated documentation 9 | // files (the "Software"), to deal in the Software without 10 | // restriction, including without limitation the rights to use, 11 | // copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the 13 | // Software is furnished to do so, subject to the following 14 | // conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be 17 | // included in all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | // OTHER DEALINGS IN THE SOFTWARE. 27 | // 28 | 29 | @interface MDSplitView : NSSplitView { 30 | 31 | IBOutlet id resizeSlider; 32 | 33 | @private 34 | 35 | NSView *_sideView; 36 | NSView *_mainView; 37 | 38 | BOOL _inResizeMode; 39 | } 40 | 41 | @property (readonly) NSView *sideView; 42 | @property (readonly) NSView *mainView; 43 | 44 | // Initializer 45 | - (id)initWithFrame:(NSRect)frame mainView:(NSView *)aMainView sideView:(NSView *)aSideView; 46 | 47 | // Drawing 48 | - (void)toggleLayout; 49 | - (IBAction)adjustSubviews:(id)sender; 50 | 51 | // Layout 52 | - (void)windowWillCloseWillCall; 53 | - (void)saveLayout; 54 | - (void)restoreLayout; 55 | 56 | @end 57 | -------------------------------------------------------------------------------- /Classes/MDSplitView.m: -------------------------------------------------------------------------------- 1 | // 2 | // MDSplitView.m 3 | // MissingDrawer 4 | // 5 | // Copyright (c) The MissingDrawer authors. 6 | // 7 | // Permission is hereby granted, free of charge, to any person 8 | // obtaining a copy of this software and associated documentation 9 | // files (the "Software"), to deal in the Software without 10 | // restriction, including without limitation the rights to use, 11 | // copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the 13 | // Software is furnished to do so, subject to the following 14 | // conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be 17 | // included in all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | // OTHER DEALINGS IN THE SOFTWARE. 27 | // 28 | 29 | #import "MDSplitView.h" 30 | #import "MDResizer.h" 31 | #import "MDSettings.h" 32 | 33 | #define MIN_SIDEVIEW_WIDTH 135.0 34 | #define MAX_SIDEVIEW_WIDTH 450.0 35 | 36 | @implementation MDSplitView 37 | 38 | @synthesize sideView = _sideView; 39 | @synthesize mainView = _mainView; 40 | 41 | #pragma mark NSObject 42 | 43 | - (void)dealloc { 44 | [[NSNotificationCenter defaultCenter] removeObserver:self]; 45 | [_sideView release]; 46 | [_mainView release]; 47 | [super dealloc]; 48 | } 49 | 50 | 51 | #pragma mark NSSplitView 52 | 53 | - (void)drawDividerInRect:(NSRect)aRect { 54 | [[NSColor colorWithDeviceWhite:0.625 alpha:1] setFill]; 55 | [NSBezierPath fillRect:aRect]; 56 | } 57 | 58 | 59 | #pragma mark Initializer 60 | 61 | - (id)initWithFrame:(NSRect)frame mainView:(NSView *)aMainView sideView:(NSView *)aSideView { 62 | if ((self = [super initWithFrame:frame])) { 63 | [self setDelegate:self]; 64 | 65 | _mainView = [aMainView retain]; 66 | _sideView = [aSideView retain]; 67 | 68 | [self.sideView setAutoresizingMask:NSViewHeightSizable]; 69 | [self setVertical:YES]; 70 | 71 | if([MDSettings defaultSettings].showSideViewOnLeft) { 72 | [self addSubview:self.sideView]; 73 | [self addSubview:self.mainView]; 74 | } else { 75 | [self addSubview:self.mainView]; 76 | [self addSubview:self.sideView]; 77 | } 78 | 79 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(toggleLayout) name:@"MDSideviewLayoutHasBeenChangedNotification" object:nil]; 80 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(focusSideView) name:@"MDFocusSideViewPressed" object:nil]; 81 | } 82 | return self; 83 | } 84 | 85 | #pragma mark - 86 | 87 | - (void)focusSideView { 88 | if([_sideView acceptsFirstResponder]){ 89 | [_sideView becomeFirstResponder]; 90 | } else { 91 | for(NSView *view in [_sideView subviews]){ 92 | if([view acceptsFirstResponder]){ 93 | [view becomeFirstResponder]; 94 | break; 95 | } 96 | } 97 | } 98 | } 99 | 100 | #pragma mark Drawing 101 | 102 | - (void)toggleLayout { 103 | MDLog(@"toggling views"); 104 | NSView *leftView = [[[self subviews] objectAtIndex:0] retain]; 105 | [leftView removeFromSuperview]; 106 | [self addSubview:leftView]; 107 | [self adjustSubviews]; 108 | } 109 | 110 | 111 | - (IBAction)adjustSubviews:(id)sender { 112 | [self adjustSubviews]; 113 | } 114 | 115 | 116 | #pragma mark Layout 117 | 118 | - (void)windowWillCloseWillCall { 119 | MDLog(@"windowWillCloseWillCall"); 120 | [[NSNotificationCenter defaultCenter] removeObserver:self]; 121 | if ([self.sideView frame].size.width <= 0) { 122 | MDLog(@"save only when frame not collapsed"); 123 | NSRect sideViewFrame = [self.sideView frame]; 124 | sideViewFrame.size.width = MIN_SIDEVIEW_WIDTH; 125 | [self.sideView setFrame:sideViewFrame]; 126 | [self adjustSubviews]; 127 | } 128 | [self saveLayout]; 129 | 130 | if (self.sideView){ 131 | NSDrawer *drawer = [[[self window] drawers] objectAtIndex:0]; 132 | [self.sideView removeFromSuperview]; 133 | [drawer setContentView:self.sideView]; 134 | [_sideView release], _sideView = nil; 135 | } 136 | } 137 | 138 | 139 | - (void)applyLayout:(NSRect)layout toView:(NSView *)view { 140 | NSRect newFrame = layout; 141 | if(NSIsEmptyRect(newFrame)) { 142 | newFrame = [view frame]; 143 | if([self isVertical]) { 144 | newFrame.size.width = 0; 145 | } else { 146 | newFrame.size.height = 0; 147 | } 148 | } 149 | [view setFrame:newFrame]; 150 | } 151 | 152 | 153 | - (void)saveLayout { 154 | MDSettings *settings = [MDSettings defaultSettings]; 155 | settings.sideViewLayout = [self.sideView frame]; 156 | settings.mainViewLayout = [self.mainView frame]; 157 | [settings save]; 158 | } 159 | 160 | 161 | - (void)restoreLayout { 162 | MDSettings *settings = [MDSettings defaultSettings]; 163 | [self applyLayout:settings.sideViewLayout toView:self.sideView]; 164 | [self applyLayout:settings.mainViewLayout toView:self.mainView]; 165 | } 166 | 167 | 168 | #pragma mark NSSplitView Delegate 169 | 170 | - (BOOL)splitView:(NSSplitView *)sender canCollapseSubview:(NSView *)subview { 171 | return NO; 172 | } 173 | 174 | 175 | - (CGFloat)splitView:(NSSplitView *)sender constrainMinCoordinate:(CGFloat)proposedMin ofSubviewAt:(NSInteger)offset { 176 | if ([[self subviews] objectAtIndex:offset] == self.sideView) { 177 | return MIN_SIDEVIEW_WIDTH; 178 | } else { 179 | return [self frame].size.width - MAX_SIDEVIEW_WIDTH; 180 | } 181 | 182 | } 183 | 184 | 185 | - (CGFloat)splitView:(NSSplitView *)sender constrainMaxCoordinate:(CGFloat)proposedMax ofSubviewAt:(NSInteger)offset { 186 | if ([[self subviews] objectAtIndex:offset] == self.sideView) { 187 | return MAX_SIDEVIEW_WIDTH; 188 | } else { 189 | return [self frame].size.width - MIN_SIDEVIEW_WIDTH; 190 | } 191 | } 192 | 193 | 194 | - (void)splitView:(NSSplitView *)splitView resizeSubviewsWithOldSize:(NSSize)oldSize { 195 | MDLog(); 196 | 197 | [self setDividerStyle:NSSplitViewDividerStyleThin]; 198 | 199 | CGFloat dividerThickness = [self dividerThickness]; 200 | 201 | NSRect windowFrame = [[NSApp mainWindow] frame]; 202 | windowFrame.size.width = MAX(3 * MIN_SIDEVIEW_WIDTH + dividerThickness, windowFrame.size.width); 203 | [[NSApp mainWindow] setFrame:windowFrame display:YES]; 204 | 205 | NSRect splitViewFrame = [self frame]; 206 | splitViewFrame.size.width = MAX(3 * MIN_SIDEVIEW_WIDTH + dividerThickness, splitViewFrame.size.width); 207 | [splitView setFrame:splitViewFrame]; 208 | 209 | NSRect sideViewFrame = [self.sideView frame]; 210 | NSRect mainViewFrame = [self.mainView frame]; 211 | 212 | sideViewFrame.size.height = splitViewFrame.size.height; 213 | mainViewFrame.size.height = splitViewFrame.size.height; 214 | 215 | mainViewFrame.size.width = splitViewFrame.size.width - sideViewFrame.size.width - dividerThickness; 216 | 217 | if ([MDSettings defaultSettings].showSideViewOnLeft) { 218 | mainViewFrame.origin.x = sideViewFrame.size.width + dividerThickness; 219 | sideViewFrame.origin.x = 0; 220 | } else { 221 | mainViewFrame.origin.x = 0; 222 | sideViewFrame.origin.x = mainViewFrame.size.width + dividerThickness; 223 | } 224 | 225 | [self.sideView setFrame:sideViewFrame]; 226 | [self.mainView setFrame:mainViewFrame]; 227 | } 228 | 229 | 230 | - (void)resetCursorRects { 231 | MDLog(); 232 | [super resetCursorRects]; 233 | 234 | NSRect location = [resizeSlider frame]; 235 | location.origin.y = [self frame].size.height - location.size.height; 236 | 237 | [self addCursorRect:location cursor:[NSCursor resizeLeftRightCursor]]; 238 | } 239 | 240 | - (void)mouseDown:(NSEvent *)theEvent { 241 | MDLog(); 242 | NSPoint clickLocation = [theEvent locationInWindow]; 243 | NSView *clickReceiver = [self hitTest:clickLocation]; 244 | if ([clickReceiver isKindOfClass:[MDResizer class]]) { 245 | _inResizeMode = YES; 246 | } else { 247 | _inResizeMode = NO; 248 | [super mouseDown:theEvent]; 249 | } 250 | } 251 | 252 | - (void)mouseUp:(NSEvent *)theEvent { 253 | MDLog(); 254 | _inResizeMode = NO; 255 | } 256 | 257 | - (void)mouseDragged:(NSEvent *)theEvent { 258 | MDLog(); 259 | 260 | if (_inResizeMode == NO) { 261 | [super mouseDragged:theEvent]; 262 | return; 263 | } 264 | 265 | [[NSNotificationCenter defaultCenter] postNotificationName:NSSplitViewWillResizeSubviewsNotification object:self]; 266 | 267 | NSPoint clickLocation = [theEvent locationInWindow]; 268 | NSView *leftView = [[self subviews] objectAtIndex:0]; 269 | NSRect newFrame = [leftView frame]; 270 | newFrame.size.width = clickLocation.x; 271 | 272 | if (self.delegate && [self.delegate respondsToSelector:@selector(splitView:constrainSplitPosition:ofSubviewAt:)]) { 273 | float new = [self.delegate splitView:self constrainSplitPosition:newFrame.size.width ofSubviewAt:0]; 274 | newFrame.size.width = new; 275 | } 276 | 277 | if (self.delegate && [self.delegate respondsToSelector:@selector(splitView:constrainMinCoordinate:ofSubviewAt:)]) { 278 | float min = [self.delegate splitView:self constrainMinCoordinate:0. ofSubviewAt:0]; 279 | newFrame.size.width = MAX(min, newFrame.size.width); 280 | } 281 | 282 | if (self.delegate && [self.delegate respondsToSelector:@selector(splitView:constrainMaxCoordinate:ofSubviewAt:)]) { 283 | float max = [self.delegate splitView:self constrainMaxCoordinate:0. ofSubviewAt:0]; 284 | newFrame.size.width = MIN(max, newFrame.size.width); 285 | } 286 | 287 | [leftView setFrame:newFrame]; 288 | 289 | [self setNeedsDisplay:YES]; 290 | [self adjustSubviews]; 291 | 292 | [[NSNotificationCenter defaultCenter] postNotificationName:NSSplitViewDidResizeSubviewsNotification object:self]; 293 | } 294 | 295 | @end 296 | -------------------------------------------------------------------------------- /Classes/NSWindowController+MDAdditions.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSWindowController+MDAdditions.h 3 | // MissingDrawer 4 | // 5 | // Copyright (c) The MissingDrawer authors. 6 | // 7 | // Permission is hereby granted, free of charge, to any person 8 | // obtaining a copy of this software and associated documentation 9 | // files (the "Software"), to deal in the Software without 10 | // restriction, including without limitation the rights to use, 11 | // copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the 13 | // Software is furnished to do so, subject to the following 14 | // conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be 17 | // included in all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | // OTHER DEALINGS IN THE SOFTWARE. 27 | // 28 | 29 | @interface NSWindowController (MDAdditions) 30 | 31 | - (void)MD_splitWindowIfNeeded; 32 | - (NSOutlineView *)MD_outlineView; 33 | - (void)MD_windowDidBecomeMain:(NSNotification *)notification; 34 | - (void)MD_windowDidResignMain:(NSNotification *)notification; 35 | 36 | @end 37 | -------------------------------------------------------------------------------- /Classes/NSWindowController+MDAdditions.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSWindowController+MDAdditions.m 3 | // MissingDrawer 4 | // 5 | // Copyright (c) The MissingDrawer authors. 6 | // 7 | // Permission is hereby granted, free of charge, to any person 8 | // obtaining a copy of this software and associated documentation 9 | // files (the "Software"), to deal in the Software without 10 | // restriction, including without limitation the rights to use, 11 | // copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the 13 | // Software is furnished to do so, subject to the following 14 | // conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be 17 | // included in all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | // OTHER DEALINGS IN THE SOFTWARE. 27 | // 28 | 29 | #import "NSWindowController+MDAdditions.h" 30 | #import "MDMissingDrawer.h" 31 | #import "MDSplitView.h" 32 | #import "MDSidebarBorderView.h" 33 | 34 | @implementation NSWindowController (MDAdditions) 35 | 36 | - (void)MD_splitWindowIfNeeded { 37 | NSWindow *window = [(NSWindowController *)self window]; 38 | if (window) { 39 | NSView *contentView = [window contentView]; 40 | 41 | if (contentView && ![contentView isKindOfClass:[MDSplitView class]]) { 42 | // If a drawer is displayed by TextMate, replace the contentView 43 | // with one that uses the MissingDrawer. 44 | NSDrawer *drawer = [[window drawers] objectAtIndex:0]; 45 | if (drawer) { 46 | [drawer close]; // does no harm if the drawer is already closed 47 | 48 | NSView *leftView = [[drawer contentView] retain]; 49 | [drawer setContentView:nil]; 50 | [window setContentView:nil]; 51 | 52 | MDSidebarBorderView *borderView = [[MDSidebarBorderView alloc] initWithFrame:[leftView frame]]; 53 | [borderView addToSuperview:leftView]; 54 | 55 | MDSplitView *splitView = [MDMissingDrawer makeSplitViewWithMainView:contentView sideView:leftView]; 56 | MDLog(@"replacing current window with split view"); 57 | [window setContentView:splitView]; 58 | 59 | [borderView release]; 60 | [leftView release]; 61 | [splitView restoreLayout]; 62 | } 63 | } 64 | } 65 | } 66 | 67 | 68 | - (NSOutlineView *)MD_outlineView { 69 | MDSplitView *contentView = (MDSplitView *)[[(NSWindowController *)self window] contentView]; 70 | NSScrollView *scrollView = [[contentView.sideView subviews] objectAtIndex:0]; 71 | NSClipView *clipView = [[scrollView subviews] objectAtIndex:0]; 72 | return [[clipView subviews] lastObject]; 73 | } 74 | 75 | 76 | - (void)MD_windowDidBecomeMain:(NSNotification *)notification { 77 | NSDictionary *bindingOptions = [[NSDictionary alloc] initWithObjectsAndKeys: 78 | NSUnarchiveFromDataTransformerName, @"NSValueTransformerName", nil]; 79 | NSString *keyPath = [[NSString alloc] initWithFormat:@"values.%@", kMDSidebarBackgroundColorActiveKey]; 80 | 81 | [[self MD_outlineView] bind:@"backgroundColor" 82 | toObject:[NSUserDefaultsController sharedUserDefaultsController] 83 | withKeyPath:keyPath 84 | options:bindingOptions]; 85 | 86 | [bindingOptions release]; 87 | [keyPath release]; 88 | } 89 | 90 | 91 | - (void)MD_windowDidResignMain:(NSNotification *)notification { 92 | NSDictionary *bindingOptions = [[NSDictionary alloc] initWithObjectsAndKeys: 93 | NSUnarchiveFromDataTransformerName, @"NSValueTransformerName", nil]; 94 | NSString *keyPath = [[NSString alloc] initWithFormat:@"values.%@", kMDSidebarBackgroundColorIdleKey]; 95 | 96 | [[self MD_outlineView] bind:@"backgroundColor" 97 | toObject:[NSUserDefaultsController sharedUserDefaultsController] 98 | withKeyPath:keyPath 99 | options:bindingOptions]; 100 | 101 | [bindingOptions release]; 102 | [keyPath release]; 103 | } 104 | 105 | @end 106 | -------------------------------------------------------------------------------- /Classes/NSWindowController+MDMethodReplacements.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSWindowController+MDMethodReplacements.h 3 | // MissingDrawer 4 | // 5 | // Copyright (c) The MissingDrawer authors. 6 | // 7 | // Permission is hereby granted, free of charge, to any person 8 | // obtaining a copy of this software and associated documentation 9 | // files (the "Software"), to deal in the Software without 10 | // restriction, including without limitation the rights to use, 11 | // copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the 13 | // Software is furnished to do so, subject to the following 14 | // conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be 17 | // included in all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | // OTHER DEALINGS IN THE SOFTWARE. 27 | // 28 | 29 | @interface NSWindowController (MDOakProjectControllerMethodReplacements) 30 | 31 | - (void)MD_repl_windowDidLoad; 32 | - (void)MD_repl_windowWillClose:(NSNotification *)notification; 33 | - (void)MD_repl_revealInProject:(id)sender; 34 | - (void)MD_repl_openProjectDrawer:(id)sender; 35 | 36 | @end 37 | -------------------------------------------------------------------------------- /Classes/NSWindowController+MDMethodReplacements.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSWindowController+MDMethodReplacements.m 3 | // MissingDrawer 4 | // 5 | // Copyright (c) The MissingDrawer authors. 6 | // 7 | // Permission is hereby granted, free of charge, to any person 8 | // obtaining a copy of this software and associated documentation 9 | // files (the "Software"), to deal in the Software without 10 | // restriction, including without limitation the rights to use, 11 | // copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the 13 | // Software is furnished to do so, subject to the following 14 | // conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be 17 | // included in all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | // OTHER DEALINGS IN THE SOFTWARE. 27 | // 28 | 29 | #import "NSWindowController+MDMethodReplacements.h" 30 | #import "NSWindowController+MDAdditions.h" 31 | #import "MDMissingDrawer.h" 32 | #import "MDSplitView.h" 33 | #import "MDSettings.h" 34 | #import 35 | 36 | @implementation NSWindowController (MDMethodReplacements) 37 | 38 | - (void)MD_repl_windowDidLoad { 39 | MDLog(); 40 | 41 | // call original 42 | [(NSWindowController *)self MD_repl_windowDidLoad]; 43 | [(NSWindowController *)self MD_splitWindowIfNeeded]; 44 | 45 | NSWindow *window = [(NSWindowController *)self window]; 46 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MD_windowDidBecomeMain:) name:NSWindowDidBecomeMainNotification object:window]; 47 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MD_windowDidResignMain:) name:NSWindowDidResignMainNotification object:window]; 48 | } 49 | 50 | 51 | - (void)MD_repl_windowWillClose:(NSNotification*)notification { 52 | MDLog(); 53 | 54 | NSWindow *window = [notification object]; 55 | 56 | [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidBecomeMainNotification object:window]; 57 | [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidResignMainNotification object:window]; 58 | 59 | id splitView = [window contentView]; 60 | if ([splitView isKindOfClass:[MDSplitView class]]) { 61 | [splitView windowWillCloseWillCall]; 62 | } 63 | 64 | // call original 65 | [self MD_repl_windowWillClose:notification]; 66 | } 67 | 68 | 69 | - (void)MD_repl_openProjectDrawer:(id)sender { 70 | MDLog(); 71 | 72 | NSWindow *window = [(NSWindowController*)self window]; 73 | 74 | if ([[window contentView] isKindOfClass:[MDSplitView class]]) { 75 | 76 | MDLog(@"panel exists and menu item was clicked"); 77 | 78 | MDSplitView *contentView = (MDSplitView *)[window contentView]; 79 | 80 | NSView *sideView = contentView.sideView; //[[contentView subviews]objectAtIndex:0]; 81 | NSRect sideViewFrame = [sideView frame]; 82 | 83 | if (sideViewFrame.size.width == 0) { 84 | MDLog(@"show hidden panel"); 85 | [contentView restoreLayout]; 86 | [contentView adjustSubviews]; 87 | } else { 88 | MDLog(@"hide visible panel"); 89 | [contentView saveLayout]; 90 | sideViewFrame.size.width = 0; 91 | [sideView setFrame:sideViewFrame]; 92 | [contentView adjustSubviews]; 93 | } 94 | } 95 | } 96 | 97 | 98 | - (void)MD_repl_revealInProject:(id)sender { 99 | MDLog(); 100 | [self MD_repl_revealInProject:sender]; 101 | [self MD_repl_revealInProject:sender]; //TODO: twice? 102 | 103 | NSWindow *window = [(NSWindowController*)self window]; 104 | NSView *contentView = [window contentView]; 105 | 106 | if ([[contentView className] isEqualToString:@"MDSplitView"]) { 107 | NSView *leftView = [[contentView subviews] objectAtIndex:0]; 108 | NSRect leftFrame = [leftView frame]; 109 | if (leftFrame.size.width == 0) { 110 | [self MD_repl_openProjectDrawer:sender]; 111 | } 112 | } 113 | } 114 | 115 | @end 116 | -------------------------------------------------------------------------------- /Classes/NSWindowController+Preferences.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) The MissingDrawer authors. 2 | // 3 | // Permission is hereby granted, free of charge, to any person 4 | // obtaining a copy of this software and associated documentation 5 | // files (the "Software"), to deal in the Software without 6 | // restriction, including without limitation the rights to use, 7 | // copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the 9 | // Software is furnished to do so, subject to the following 10 | // conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 17 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | // OTHER DEALINGS IN THE SOFTWARE. 23 | // 24 | // This reuses a lot of code from Julian Eberius's Textmate-Minimap ( http://github.com/JulianEberius/Textmate-Minimap ) 25 | // 26 | 27 | @interface NSWindowController (MD_Preferences) 28 | 29 | - (NSArray *)MD_toolbarAllowedItemIdentifiers:(id)sender; 30 | - (NSArray *)MD_toolbarDefaultItemIdentifiers:(id)sender; 31 | - (NSArray *)MD_toolbarSelectableItemIdentifiers:(id)sender; 32 | - (NSToolbarItem *)MD_toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag; 33 | - (void)MD_selectToolbarItem:(id)item; 34 | 35 | @end -------------------------------------------------------------------------------- /Classes/NSWindowController+Preferences.m: -------------------------------------------------------------------------------- 1 | // Copyright (c) The MissingDrawer authors. 2 | // 3 | // Permission is hereby granted, free of charge, to any person 4 | // obtaining a copy of this software and associated documentation 5 | // files (the "Software"), to deal in the Software without 6 | // restriction, including without limitation the rights to use, 7 | // copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the 9 | // Software is furnished to do so, subject to the following 10 | // conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 17 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | // OTHER DEALINGS IN THE SOFTWARE. 23 | // 24 | // This reuses a lot of code from Ciarán Walsh's ProjectPlus ( http://ciaranwal.sh/2008/08/05/textmate-plug-in-projectplus ) 25 | // Source: git://github.com/ciaran/projectplus.git 26 | // 27 | 28 | #import "NSWindowController+Preferences.h" 29 | #import "MDMissingDrawer.h" 30 | #import "MDPreferenceController.h" 31 | 32 | float ToolbarHeightForWindow(NSWindow *window) { 33 | NSToolbar *toolbar; 34 | float toolbarHeight = 0.0; 35 | NSRect windowFrame; 36 | 37 | toolbar = [window toolbar]; 38 | 39 | if (toolbar && [toolbar isVisible]) { 40 | windowFrame = [NSWindow contentRectForFrameRect:[window frame] styleMask:[window styleMask]]; 41 | toolbarHeight = NSHeight(windowFrame) - NSHeight([[window contentView] frame]); 42 | } 43 | 44 | return toolbarHeight; 45 | } 46 | 47 | static NSString* MD_PREFERENCES_LABEL = @"Missing Drawer"; 48 | 49 | @implementation NSWindowController (MD_Preferences) 50 | 51 | - (NSArray *)MD_toolbarAllowedItemIdentifiers:(id)sender { 52 | return [[self MD_toolbarAllowedItemIdentifiers:sender] arrayByAddingObject:MD_PREFERENCES_LABEL]; 53 | } 54 | 55 | - (NSArray *)MD_toolbarDefaultItemIdentifiers:(id)sender { 56 | return [[self MD_toolbarDefaultItemIdentifiers:sender] arrayByAddingObjectsFromArray:[NSArray arrayWithObjects:MD_PREFERENCES_LABEL,nil]]; 57 | } 58 | 59 | - (NSArray *)MD_toolbarSelectableItemIdentifiers:(id)sender { 60 | return [[self MD_toolbarSelectableItemIdentifiers:sender] arrayByAddingObject:MD_PREFERENCES_LABEL]; 61 | } 62 | 63 | - (NSToolbarItem *)MD_toolbar:(NSToolbar*)toolbar 64 | itemForItemIdentifier:(NSString*)itemIdentifier 65 | willBeInsertedIntoToolbar:(BOOL)flag { 66 | NSToolbarItem *item = [self MD_toolbar:toolbar itemForItemIdentifier:itemIdentifier willBeInsertedIntoToolbar:flag]; 67 | // if([itemIdentifier isEqualToString:MD_PREFERENCES_LABEL]) 68 | // At some point add a picture here 69 | return item; 70 | } 71 | 72 | - (void)MD_selectToolbarItem:(id)item { 73 | if ([[item label] isEqualToString:MD_PREFERENCES_LABEL]) { 74 | if ([[self valueForKey:@"selectedToolbarItem"] isEqualToString:[item label]]) return; 75 | [[self window] setTitle:[item label]]; 76 | [self setValue:[item label] forKey:@"selectedToolbarItem"]; 77 | 78 | NSSize prefsSize = [[[MDPreferenceController instance] preferencesView] frame].size; 79 | NSRect frame = [[self window] frame]; 80 | prefsSize.width = [[self window] contentMinSize].width; 81 | 82 | [[self window] setContentView:[[MDPreferenceController instance] preferencesView]]; 83 | 84 | float newHeight = prefsSize.height + ToolbarHeightForWindow([self window]) + 22; 85 | frame.origin.y += frame.size.height - newHeight; 86 | frame.size.height = newHeight; 87 | frame.size.width = prefsSize.width; 88 | [[self window] setFrame:frame display:YES animate:YES]; 89 | } else { 90 | [self MD_selectToolbarItem:item]; 91 | } 92 | } 93 | 94 | @end 95 | -------------------------------------------------------------------------------- /Classes/TMPlugInController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TMPlugInController.h 3 | // MissingDrawer 4 | // 5 | // Copyright (c) The MissingDrawer authors. 6 | // 7 | // Permission is hereby granted, free of charge, to any person 8 | // obtaining a copy of this software and associated documentation 9 | // files (the "Software"), to deal in the Software without 10 | // restriction, including without limitation the rights to use, 11 | // copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the 13 | // Software is furnished to do so, subject to the following 14 | // conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be 17 | // included in all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | // OTHER DEALINGS IN THE SOFTWARE. 27 | // 28 | 29 | @protocol TMPlugInController 30 | 31 | - (float)version; 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) The MissingDrawer authors. 2 | 3 | Permission is hereby granted, free of charge, to any person 4 | obtaining a copy of this software and associated documentation 5 | files (the "Software"), to deal in the Software without 6 | restriction, including without limitation the rights to use, 7 | copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the 9 | Software is furnished to do so, subject to the following 10 | conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 17 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /MissingDrawer.tmproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | currentDocument 6 | Classes/MDSidebarBorderView.h 7 | documents 8 | 9 | 10 | expanded 11 | 12 | name 13 | source 14 | regexFolderFilter 15 | !.*/(\.[^/]*|CVS|_darcs|_MTN|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$ 16 | selected 17 | 18 | sourceDirectory 19 | 20 | 21 | 22 | fileHierarchyDrawerWidth 23 | 200 24 | metaData 25 | 26 | Classes/MDSettings.h 27 | 28 | caret 29 | 30 | column 31 | 20 32 | line 33 | 52 34 | 35 | columnSelection 36 | 37 | firstVisibleColumn 38 | 0 39 | firstVisibleLine 40 | 4 41 | selectFrom 42 | 43 | column 44 | 15 45 | line 46 | 52 47 | 48 | selectTo 49 | 50 | column 51 | 33 52 | line 53 | 52 54 | 55 | 56 | Classes/MDSettings.m 57 | 58 | caret 59 | 60 | column 61 | 49 62 | line 63 | 39 64 | 65 | columnSelection 66 | 67 | firstVisibleColumn 68 | 0 69 | firstVisibleLine 70 | 14 71 | selectFrom 72 | 73 | column 74 | 42 75 | line 76 | 39 77 | 78 | selectTo 79 | 80 | column 81 | 59 82 | line 83 | 39 84 | 85 | 86 | Classes/MDSidebarBorderView.h 87 | 88 | caret 89 | 90 | column 91 | 27 92 | line 93 | 24 94 | 95 | firstVisibleColumn 96 | 0 97 | firstVisibleLine 98 | 0 99 | 100 | Classes/MDSidebarBorderView.m 101 | 102 | caret 103 | 104 | column 105 | 54 106 | line 107 | 77 108 | 109 | firstVisibleColumn 110 | 0 111 | firstVisibleLine 112 | 59 113 | 114 | 115 | openDocuments 116 | 117 | Classes/MDSidebarBorderView.m 118 | Classes/MDSidebarBorderView.h 119 | Classes/MDSettings.h 120 | Classes/MDSettings.m 121 | 122 | showFileHierarchyDrawer 123 | 124 | windowFrame 125 | {{49, 0}, {1231, 778}} 126 | 127 | 128 | -------------------------------------------------------------------------------- /MissingDrawer.xcodeproj/Jannis.mode1v3: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ActivePerspectiveName 6 | Project 7 | AllowedModules 8 | 9 | 10 | BundleLoadPath 11 | 12 | MaxInstances 13 | n 14 | Module 15 | PBXSmartGroupTreeModule 16 | Name 17 | Groups and Files Outline View 18 | 19 | 20 | BundleLoadPath 21 | 22 | MaxInstances 23 | n 24 | Module 25 | PBXNavigatorGroup 26 | Name 27 | Editor 28 | 29 | 30 | BundleLoadPath 31 | 32 | MaxInstances 33 | n 34 | Module 35 | XCTaskListModule 36 | Name 37 | Task List 38 | 39 | 40 | BundleLoadPath 41 | 42 | MaxInstances 43 | n 44 | Module 45 | XCDetailModule 46 | Name 47 | File and Smart Group Detail Viewer 48 | 49 | 50 | BundleLoadPath 51 | 52 | MaxInstances 53 | 1 54 | Module 55 | PBXBuildResultsModule 56 | Name 57 | Detailed Build Results Viewer 58 | 59 | 60 | BundleLoadPath 61 | 62 | MaxInstances 63 | 1 64 | Module 65 | PBXProjectFindModule 66 | Name 67 | Project Batch Find Tool 68 | 69 | 70 | BundleLoadPath 71 | 72 | MaxInstances 73 | n 74 | Module 75 | XCProjectFormatConflictsModule 76 | Name 77 | Project Format Conflicts List 78 | 79 | 80 | BundleLoadPath 81 | 82 | MaxInstances 83 | n 84 | Module 85 | PBXBookmarksModule 86 | Name 87 | Bookmarks Tool 88 | 89 | 90 | BundleLoadPath 91 | 92 | MaxInstances 93 | n 94 | Module 95 | PBXClassBrowserModule 96 | Name 97 | Class Browser 98 | 99 | 100 | BundleLoadPath 101 | 102 | MaxInstances 103 | n 104 | Module 105 | PBXCVSModule 106 | Name 107 | Source Code Control Tool 108 | 109 | 110 | BundleLoadPath 111 | 112 | MaxInstances 113 | n 114 | Module 115 | PBXDebugBreakpointsModule 116 | Name 117 | Debug Breakpoints Tool 118 | 119 | 120 | BundleLoadPath 121 | 122 | MaxInstances 123 | n 124 | Module 125 | XCDockableInspector 126 | Name 127 | Inspector 128 | 129 | 130 | BundleLoadPath 131 | 132 | MaxInstances 133 | n 134 | Module 135 | PBXOpenQuicklyModule 136 | Name 137 | Open Quickly Tool 138 | 139 | 140 | BundleLoadPath 141 | 142 | MaxInstances 143 | 1 144 | Module 145 | PBXDebugSessionModule 146 | Name 147 | Debugger 148 | 149 | 150 | BundleLoadPath 151 | 152 | MaxInstances 153 | 1 154 | Module 155 | PBXDebugCLIModule 156 | Name 157 | Debug Console 158 | 159 | 160 | BundleLoadPath 161 | 162 | MaxInstances 163 | n 164 | Module 165 | XCSnapshotModule 166 | Name 167 | Snapshots Tool 168 | 169 | 170 | BundlePath 171 | /Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources 172 | Description 173 | DefaultDescriptionKey 174 | DockingSystemVisible 175 | 176 | Extension 177 | mode1v3 178 | FavBarConfig 179 | 180 | PBXProjectModuleGUID 181 | 1F2B3F610D5DA66E000354B0 182 | XCBarModuleItemNames 183 | 184 | XCBarModuleItems 185 | 186 | 187 | FirstTimeWindowDisplayed 188 | 189 | Identifier 190 | com.apple.perspectives.project.mode1v3 191 | MajorVersion 192 | 33 193 | MinorVersion 194 | 0 195 | Name 196 | Default 197 | Notifications 198 | 199 | OpenEditors 200 | 201 | PerspectiveWidths 202 | 203 | 1022 204 | 300 205 | 206 | Perspectives 207 | 208 | 209 | ChosenToolbarItems 210 | 211 | active-target-popup 212 | active-buildstyle-popup 213 | action 214 | NSToolbarFlexibleSpaceItem 215 | buildOrClean 216 | build-and-goOrGo 217 | com.apple.ide.PBXToolbarStopButton 218 | get-info 219 | toggle-editor 220 | NSToolbarFlexibleSpaceItem 221 | com.apple.pbx.toolbar.searchfield 222 | 223 | ControllerClassBaseName 224 | 225 | IconName 226 | WindowOfProjectWithEditor 227 | Identifier 228 | perspective.project 229 | IsVertical 230 | 231 | Layout 232 | 233 | 234 | ContentConfiguration 235 | 236 | PBXBottomSmartGroupGIDs 237 | 238 | 1C37FBAC04509CD000000102 239 | 1C37FAAC04509CD000000102 240 | 1C08E77C0454961000C914BD 241 | 1C37FABC05509CD000000102 242 | 1C37FABC05539CD112110102 243 | E2644B35053B69B200211256 244 | 1C37FABC04509CD000100104 245 | 1CC0EA4004350EF90044410B 246 | 1CC0EA4004350EF90041110B 247 | 248 | PBXProjectModuleGUID 249 | 1CE0B1FE06471DED0097A5F4 250 | PBXProjectModuleLabel 251 | Files 252 | PBXProjectStructureProvided 253 | yes 254 | PBXSmartGroupTreeModuleColumnData 255 | 256 | PBXSmartGroupTreeModuleColumnWidthsKey 257 | 258 | 186 259 | 260 | PBXSmartGroupTreeModuleColumnsKey_v4 261 | 262 | MainColumn 263 | 264 | 265 | PBXSmartGroupTreeModuleOutlineStateKey_v7 266 | 267 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 268 | 269 | 089C166AFE841209C02AAC07 270 | 08FB77AFFE84173DC02AAC07 271 | 089C167CFE841241C02AAC07 272 | 273 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 274 | 275 | 276 | 1 277 | 0 278 | 279 | 280 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 281 | {{0, 0}, {186, 739}} 282 | 283 | PBXTopSmartGroupGIDs 284 | 285 | XCIncludePerspectivesSwitch 286 | 287 | XCSharingToken 288 | com.apple.Xcode.GFSharingToken 289 | 290 | GeometryConfiguration 291 | 292 | Frame 293 | {{0, 0}, {203, 757}} 294 | GroupTreeTableConfiguration 295 | 296 | MainColumn 297 | 186 298 | 299 | RubberWindowFrame 300 | 79 120 1072 798 0 0 1280 1002 301 | 302 | Module 303 | PBXSmartGroupTreeModule 304 | Proportion 305 | 203pt 306 | 307 | 308 | Dock 309 | 310 | 311 | BecomeActive 312 | 313 | ContentConfiguration 314 | 315 | PBXProjectModuleGUID 316 | 1CE0B20306471E060097A5F4 317 | PBXProjectModuleLabel 318 | HTMDSidebarBorderView.m 319 | PBXSplitModuleInNavigatorKey 320 | 321 | Split0 322 | 323 | PBXProjectModuleGUID 324 | 1CE0B20406471E060097A5F4 325 | PBXProjectModuleLabel 326 | HTMDSidebarBorderView.m 327 | _historyCapacity 328 | 0 329 | bookmark 330 | 1FE7371E0F2F1DD700CE03A4 331 | history 332 | 333 | 1F5738790D63B3A8003B95FF 334 | 1F5738D80D63C1F1003B95FF 335 | 1F5738E20D63C3A5003B95FF 336 | 1F573AE60D64998D003B95FF 337 | 1FB0B0310D66075500245BA5 338 | 1FB0B0320D66075500245BA5 339 | 1FB0B0330D66075500245BA5 340 | 1F0A23100DFE697F00AE21CB 341 | 1F0A23110DFE697F00AE21CB 342 | 1FAEBD3C0F2CB11D00083951 343 | 1FEE8E010F2F1D4700D2F8E5 344 | 345 | prevStack 346 | 347 | 1F5737E30D639A10003B95FF 348 | 1F5737E40D639A10003B95FF 349 | 1F5737E50D639A10003B95FF 350 | 1F5737E60D639A10003B95FF 351 | 1F5737E70D639A10003B95FF 352 | 1F5737E80D639A10003B95FF 353 | 1F5737E90D639A10003B95FF 354 | 1F5737EA0D639A10003B95FF 355 | 1F5738810D63B3A8003B95FF 356 | 1F5738820D63B3A8003B95FF 357 | 1F5738830D63B3A8003B95FF 358 | 359 | 360 | SplitCount 361 | 1 362 | 363 | StatusBarVisibility 364 | 365 | 366 | GeometryConfiguration 367 | 368 | Frame 369 | {{0, 0}, {864, 582}} 370 | RubberWindowFrame 371 | 79 120 1072 798 0 0 1280 1002 372 | 373 | Module 374 | PBXNavigatorGroup 375 | Proportion 376 | 582pt 377 | 378 | 379 | ContentConfiguration 380 | 381 | PBXProjectModuleGUID 382 | 1CE0B20506471E060097A5F4 383 | PBXProjectModuleLabel 384 | Detail 385 | 386 | GeometryConfiguration 387 | 388 | Frame 389 | {{0, 587}, {864, 170}} 390 | RubberWindowFrame 391 | 79 120 1072 798 0 0 1280 1002 392 | 393 | Module 394 | XCDetailModule 395 | Proportion 396 | 170pt 397 | 398 | 399 | Proportion 400 | 864pt 401 | 402 | 403 | Name 404 | Project 405 | ServiceClasses 406 | 407 | XCModuleDock 408 | PBXSmartGroupTreeModule 409 | XCModuleDock 410 | PBXNavigatorGroup 411 | XCDetailModule 412 | 413 | TableOfContents 414 | 415 | 1FE737190F2F1D9400CE03A4 416 | 1CE0B1FE06471DED0097A5F4 417 | 1FE7371A0F2F1D9400CE03A4 418 | 1CE0B20306471E060097A5F4 419 | 1CE0B20506471E060097A5F4 420 | 421 | ToolbarConfiguration 422 | xcode.toolbar.config.defaultV3 423 | 424 | 425 | ChosenToolbarItems 426 | 427 | buildOrClean 428 | build-and-goOrGo 429 | debugger-enable-breakpoints 430 | com.apple.ide.PBXToolbarStopButton 431 | NSToolbarFlexibleSpaceItem 432 | get-info 433 | 434 | ControllerClassBaseName 435 | 436 | IconName 437 | WindowOfProject 438 | Identifier 439 | perspective.morph 440 | IsVertical 441 | 442 | Layout 443 | 444 | 445 | ContentConfiguration 446 | 447 | PBXBottomSmartGroupGIDs 448 | 449 | 1C37FBAC04509CD000000102 450 | 1C37FAAC04509CD000000102 451 | 1C08E77C0454961000C914BD 452 | 1C37FABC05509CD000000102 453 | 1C37FABC05539CD112110102 454 | E2644B35053B69B200211256 455 | 1C37FABC04509CD000100104 456 | 1CC0EA4004350EF90044410B 457 | 1CC0EA4004350EF90041110B 458 | 459 | PBXProjectModuleGUID 460 | 11E0B1FE06471DED0097A5F4 461 | PBXProjectModuleLabel 462 | Files 463 | PBXProjectStructureProvided 464 | yes 465 | PBXSmartGroupTreeModuleColumnData 466 | 467 | PBXSmartGroupTreeModuleColumnWidthsKey 468 | 469 | 283 470 | 471 | PBXSmartGroupTreeModuleColumnsKey_v4 472 | 473 | MainColumn 474 | 475 | 476 | PBXSmartGroupTreeModuleOutlineStateKey_v7 477 | 478 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 479 | 480 | 089C166AFE841209C02AAC07 481 | 08FB77AFFE84173DC02AAC07 482 | 089C167CFE841241C02AAC07 483 | 1C37FABC05509CD000000102 484 | 485 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 486 | 487 | 488 | 1 489 | 0 490 | 491 | 492 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 493 | {{0, 0}, {283, 700}} 494 | 495 | PBXTopSmartGroupGIDs 496 | 497 | XCIncludePerspectivesSwitch 498 | 499 | XCSharingToken 500 | com.apple.Xcode.GFSharingToken 501 | 502 | GeometryConfiguration 503 | 504 | Frame 505 | {{0, 0}, {300, 718}} 506 | GroupTreeTableConfiguration 507 | 508 | MainColumn 509 | 283 510 | 511 | 512 | Module 513 | PBXSmartGroupTreeModule 514 | Proportion 515 | 300pt 516 | 517 | 518 | Name 519 | Morph 520 | PreferredWidth 521 | 300 522 | ServiceClasses 523 | 524 | XCModuleDock 525 | PBXSmartGroupTreeModule 526 | 527 | TableOfContents 528 | 529 | 1F5738D10D63C128003B95FF 530 | 11E0B1FE06471DED0097A5F4 531 | 532 | ToolbarConfiguration 533 | xcode.toolbar.config.default.shortV3 534 | 535 | 536 | PerspectivesBarVisible 537 | 538 | ShelfIsVisible 539 | 540 | SourceDescription 541 | file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecificationMode1.xcperspec' 542 | StatusbarIsVisible 543 | 544 | TimeStamp 545 | 0.0 546 | ToolbarDisplayMode 547 | 2 548 | ToolbarIsVisible 549 | 550 | ToolbarSizeMode 551 | 1 552 | Type 553 | Perspectives 554 | UpdateMessage 555 | The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? 556 | WindowJustification 557 | 5 558 | WindowOrderList 559 | 560 | 1F2B40B10D5DBC11000354B0 561 | /Users/Jannis/Code/git/textmate-missingdrawer/MissingDrawer.xcodeproj 562 | 563 | WindowString 564 | 79 120 1072 798 0 0 1280 1002 565 | WindowToolsV3 566 | 567 | 568 | FirstTimeWindowDisplayed 569 | 570 | Identifier 571 | windowTool.build 572 | IsVertical 573 | 574 | Layout 575 | 576 | 577 | Dock 578 | 579 | 580 | ContentConfiguration 581 | 582 | PBXProjectModuleGUID 583 | 1CD0528F0623707200166675 584 | PBXProjectModuleLabel 585 | 586 | StatusBarVisibility 587 | 588 | 589 | GeometryConfiguration 590 | 591 | Frame 592 | {{0, 0}, {775, 242}} 593 | RubberWindowFrame 594 | 316 287 775 554 0 0 1280 1002 595 | 596 | Module 597 | PBXNavigatorGroup 598 | Proportion 599 | 242pt 600 | 601 | 602 | ContentConfiguration 603 | 604 | PBXProjectModuleGUID 605 | XCMainBuildResultsModuleGUID 606 | PBXProjectModuleLabel 607 | Build 608 | XCBuildResultsTrigger_Collapse 609 | 1021 610 | XCBuildResultsTrigger_Open 611 | 1011 612 | 613 | GeometryConfiguration 614 | 615 | Frame 616 | {{0, 247}, {775, 266}} 617 | RubberWindowFrame 618 | 316 287 775 554 0 0 1280 1002 619 | 620 | Module 621 | PBXBuildResultsModule 622 | Proportion 623 | 266pt 624 | 625 | 626 | Proportion 627 | 513pt 628 | 629 | 630 | Name 631 | Build Results 632 | ServiceClasses 633 | 634 | PBXBuildResultsModule 635 | 636 | StatusbarIsVisible 637 | 638 | TableOfContents 639 | 640 | 1F2B40B10D5DBC11000354B0 641 | 1FE7371B0F2F1D9400CE03A4 642 | 1CD0528F0623707200166675 643 | XCMainBuildResultsModuleGUID 644 | 645 | ToolbarConfiguration 646 | xcode.toolbar.config.buildV3 647 | WindowString 648 | 316 287 775 554 0 0 1280 1002 649 | WindowToolGUID 650 | 1F2B40B10D5DBC11000354B0 651 | WindowToolIsVisible 652 | 653 | 654 | 655 | FirstTimeWindowDisplayed 656 | 657 | Identifier 658 | windowTool.debugger 659 | IsVertical 660 | 661 | Layout 662 | 663 | 664 | Dock 665 | 666 | 667 | ContentConfiguration 668 | 669 | Debugger 670 | 671 | HorizontalSplitView 672 | 673 | _collapsingFrameDimension 674 | 0.0 675 | _indexOfCollapsedView 676 | 0 677 | _percentageOfCollapsedView 678 | 0.0 679 | isCollapsed 680 | yes 681 | sizes 682 | 683 | {{0, 0}, {316, 198}} 684 | {{316, 0}, {378, 198}} 685 | 686 | 687 | VerticalSplitView 688 | 689 | _collapsingFrameDimension 690 | 0.0 691 | _indexOfCollapsedView 692 | 0 693 | _percentageOfCollapsedView 694 | 0.0 695 | isCollapsed 696 | yes 697 | sizes 698 | 699 | {{0, 0}, {694, 198}} 700 | {{0, 198}, {694, 183}} 701 | 702 | 703 | 704 | LauncherConfigVersion 705 | 8 706 | PBXProjectModuleGUID 707 | 1C162984064C10D400B95A72 708 | PBXProjectModuleLabel 709 | Debug - GLUTExamples (Underwater) 710 | 711 | GeometryConfiguration 712 | 713 | DebugConsoleVisible 714 | None 715 | DebugConsoleWindowFrame 716 | {{200, 200}, {500, 300}} 717 | DebugSTDIOWindowFrame 718 | {{200, 200}, {500, 300}} 719 | Frame 720 | {{0, 0}, {694, 381}} 721 | PBXDebugSessionStackFrameViewKey 722 | 723 | DebugVariablesTableConfiguration 724 | 725 | Name 726 | 120 727 | Value 728 | 85 729 | Summary 730 | 148 731 | 732 | Frame 733 | {{316, 0}, {378, 198}} 734 | RubberWindowFrame 735 | 618 541 694 422 0 0 1280 1002 736 | 737 | RubberWindowFrame 738 | 618 541 694 422 0 0 1280 1002 739 | 740 | Module 741 | PBXDebugSessionModule 742 | Proportion 743 | 381pt 744 | 745 | 746 | Proportion 747 | 381pt 748 | 749 | 750 | Name 751 | Debugger 752 | ServiceClasses 753 | 754 | PBXDebugSessionModule 755 | 756 | StatusbarIsVisible 757 | 758 | TableOfContents 759 | 760 | 1CD10A99069EF8BA00B06720 761 | 1F573A450D648C96003B95FF 762 | 1C162984064C10D400B95A72 763 | 1F573A460D648C96003B95FF 764 | 1F573A470D648C96003B95FF 765 | 1F573A480D648C96003B95FF 766 | 1F573A490D648C96003B95FF 767 | 1F573A4A0D648C96003B95FF 768 | 769 | ToolbarConfiguration 770 | xcode.toolbar.config.debugV3 771 | WindowString 772 | 618 541 694 422 0 0 1280 1002 773 | WindowToolGUID 774 | 1CD10A99069EF8BA00B06720 775 | WindowToolIsVisible 776 | 777 | 778 | 779 | FirstTimeWindowDisplayed 780 | 781 | Identifier 782 | windowTool.find 783 | IsVertical 784 | 785 | Layout 786 | 787 | 788 | Dock 789 | 790 | 791 | Dock 792 | 793 | 794 | BecomeActive 795 | 796 | ContentConfiguration 797 | 798 | PBXProjectModuleGUID 799 | 1CDD528C0622207200134675 800 | PBXProjectModuleLabel 801 | HTMDSidebarBorderView.m 802 | StatusBarVisibility 803 | 804 | 805 | GeometryConfiguration 806 | 807 | Frame 808 | {{0, 0}, {986, 379}} 809 | RubberWindowFrame 810 | 221 85 986 774 0 0 1280 1002 811 | 812 | Module 813 | PBXNavigatorGroup 814 | Proportion 815 | 986pt 816 | 817 | 818 | Proportion 819 | 379pt 820 | 821 | 822 | ContentConfiguration 823 | 824 | PBXProjectModuleGUID 825 | 1CD0528E0623707200166675 826 | PBXProjectModuleLabel 827 | Project Find 828 | 829 | GeometryConfiguration 830 | 831 | Frame 832 | {{0, 384}, {986, 349}} 833 | RubberWindowFrame 834 | 221 85 986 774 0 0 1280 1002 835 | 836 | Module 837 | PBXProjectFindModule 838 | Proportion 839 | 349pt 840 | 841 | 842 | Proportion 843 | 733pt 844 | 845 | 846 | Name 847 | Project Find 848 | ServiceClasses 849 | 850 | PBXProjectFindModule 851 | 852 | StatusbarIsVisible 853 | 854 | TableOfContents 855 | 856 | 1C530D57069F1CE1000CFCEE 857 | 1FAEBD410F2CB11D00083951 858 | 1FAEBD420F2CB11D00083951 859 | 1CDD528C0622207200134675 860 | 1CD0528E0623707200166675 861 | 862 | WindowString 863 | 221 85 986 774 0 0 1280 1002 864 | WindowToolGUID 865 | 1C530D57069F1CE1000CFCEE 866 | WindowToolIsVisible 867 | 868 | 869 | 870 | Identifier 871 | MENUSEPARATOR 872 | 873 | 874 | Identifier 875 | windowTool.debuggerConsole 876 | Layout 877 | 878 | 879 | Dock 880 | 881 | 882 | BecomeActive 883 | 1 884 | ContentConfiguration 885 | 886 | PBXProjectModuleGUID 887 | 1C78EAAC065D492600B07095 888 | PBXProjectModuleLabel 889 | Debugger Console 890 | 891 | GeometryConfiguration 892 | 893 | Frame 894 | {{0, 0}, {650, 250}} 895 | RubberWindowFrame 896 | 516 632 650 250 0 0 1680 1027 897 | 898 | Module 899 | PBXDebugCLIModule 900 | Proportion 901 | 209pt 902 | 903 | 904 | Proportion 905 | 209pt 906 | 907 | 908 | Name 909 | Debugger Console 910 | ServiceClasses 911 | 912 | PBXDebugCLIModule 913 | 914 | StatusbarIsVisible 915 | 1 916 | TableOfContents 917 | 918 | 1C78EAAD065D492600B07095 919 | 1C78EAAE065D492600B07095 920 | 1C78EAAC065D492600B07095 921 | 922 | ToolbarConfiguration 923 | xcode.toolbar.config.consoleV3 924 | WindowString 925 | 650 41 650 250 0 0 1280 1002 926 | WindowToolGUID 927 | 1C78EAAD065D492600B07095 928 | WindowToolIsVisible 929 | 0 930 | 931 | 932 | Identifier 933 | windowTool.snapshots 934 | Layout 935 | 936 | 937 | Dock 938 | 939 | 940 | Module 941 | XCSnapshotModule 942 | Proportion 943 | 100% 944 | 945 | 946 | Proportion 947 | 100% 948 | 949 | 950 | Name 951 | Snapshots 952 | ServiceClasses 953 | 954 | XCSnapshotModule 955 | 956 | StatusbarIsVisible 957 | Yes 958 | ToolbarConfiguration 959 | xcode.toolbar.config.snapshots 960 | WindowString 961 | 315 824 300 550 0 0 1440 878 962 | WindowToolIsVisible 963 | Yes 964 | 965 | 966 | Identifier 967 | windowTool.scm 968 | Layout 969 | 970 | 971 | Dock 972 | 973 | 974 | ContentConfiguration 975 | 976 | PBXProjectModuleGUID 977 | 1C78EAB2065D492600B07095 978 | PBXProjectModuleLabel 979 | <No Editor> 980 | PBXSplitModuleInNavigatorKey 981 | 982 | Split0 983 | 984 | PBXProjectModuleGUID 985 | 1C78EAB3065D492600B07095 986 | 987 | SplitCount 988 | 1 989 | 990 | StatusBarVisibility 991 | 1 992 | 993 | GeometryConfiguration 994 | 995 | Frame 996 | {{0, 0}, {452, 0}} 997 | RubberWindowFrame 998 | 743 379 452 308 0 0 1280 1002 999 | 1000 | Module 1001 | PBXNavigatorGroup 1002 | Proportion 1003 | 0pt 1004 | 1005 | 1006 | BecomeActive 1007 | 1 1008 | ContentConfiguration 1009 | 1010 | PBXProjectModuleGUID 1011 | 1CD052920623707200166675 1012 | PBXProjectModuleLabel 1013 | SCM 1014 | 1015 | GeometryConfiguration 1016 | 1017 | ConsoleFrame 1018 | {{0, 259}, {452, 0}} 1019 | Frame 1020 | {{0, 7}, {452, 259}} 1021 | RubberWindowFrame 1022 | 743 379 452 308 0 0 1280 1002 1023 | TableConfiguration 1024 | 1025 | Status 1026 | 30 1027 | FileName 1028 | 199 1029 | Path 1030 | 197.09500122070312 1031 | 1032 | TableFrame 1033 | {{0, 0}, {452, 250}} 1034 | 1035 | Module 1036 | PBXCVSModule 1037 | Proportion 1038 | 262pt 1039 | 1040 | 1041 | Proportion 1042 | 266pt 1043 | 1044 | 1045 | Name 1046 | SCM 1047 | ServiceClasses 1048 | 1049 | PBXCVSModule 1050 | 1051 | StatusbarIsVisible 1052 | 1 1053 | TableOfContents 1054 | 1055 | 1C78EAB4065D492600B07095 1056 | 1C78EAB5065D492600B07095 1057 | 1C78EAB2065D492600B07095 1058 | 1CD052920623707200166675 1059 | 1060 | ToolbarConfiguration 1061 | xcode.toolbar.config.scm 1062 | WindowString 1063 | 743 379 452 308 0 0 1280 1002 1064 | 1065 | 1066 | FirstTimeWindowDisplayed 1067 | 1068 | Identifier 1069 | windowTool.breakpoints 1070 | IsVertical 1071 | 1072 | Layout 1073 | 1074 | 1075 | Dock 1076 | 1077 | 1078 | ContentConfiguration 1079 | 1080 | PBXBottomSmartGroupGIDs 1081 | 1082 | 1C77FABC04509CD000000102 1083 | 1084 | PBXProjectModuleGUID 1085 | 1CE0B1FE06471DED0097A5F4 1086 | PBXProjectModuleLabel 1087 | Files 1088 | PBXProjectStructureProvided 1089 | no 1090 | PBXSmartGroupTreeModuleColumnData 1091 | 1092 | PBXSmartGroupTreeModuleColumnWidthsKey 1093 | 1094 | 168 1095 | 1096 | PBXSmartGroupTreeModuleColumnsKey_v4 1097 | 1098 | MainColumn 1099 | 1100 | 1101 | PBXSmartGroupTreeModuleOutlineStateKey_v7 1102 | 1103 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 1104 | 1105 | 1C77FABC04509CD000000102 1106 | 1107 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 1108 | 1109 | 1110 | 0 1111 | 1112 | 1113 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 1114 | {{0, 0}, {168, 350}} 1115 | 1116 | PBXTopSmartGroupGIDs 1117 | 1118 | XCIncludePerspectivesSwitch 1119 | 1120 | 1121 | GeometryConfiguration 1122 | 1123 | Frame 1124 | {{0, 0}, {185, 368}} 1125 | GroupTreeTableConfiguration 1126 | 1127 | MainColumn 1128 | 168 1129 | 1130 | RubberWindowFrame 1131 | 156 320 744 409 0 0 1280 1002 1132 | 1133 | Module 1134 | PBXSmartGroupTreeModule 1135 | Proportion 1136 | 185pt 1137 | 1138 | 1139 | BecomeActive 1140 | 1141 | ContentConfiguration 1142 | 1143 | PBXProjectModuleGUID 1144 | 1CA1AED706398EBD00589147 1145 | PBXProjectModuleLabel 1146 | Detail 1147 | 1148 | GeometryConfiguration 1149 | 1150 | Frame 1151 | {{190, 0}, {554, 368}} 1152 | RubberWindowFrame 1153 | 156 320 744 409 0 0 1280 1002 1154 | 1155 | Module 1156 | XCDetailModule 1157 | Proportion 1158 | 554pt 1159 | 1160 | 1161 | Proportion 1162 | 368pt 1163 | 1164 | 1165 | MajorVersion 1166 | 3 1167 | MinorVersion 1168 | 0 1169 | Name 1170 | Breakpoints 1171 | ServiceClasses 1172 | 1173 | PBXSmartGroupTreeModule 1174 | XCDetailModule 1175 | 1176 | StatusbarIsVisible 1177 | 1178 | TableOfContents 1179 | 1180 | 1F5734DB0D62E84C003B95FF 1181 | 1F5734DC0D62E84C003B95FF 1182 | 1CE0B1FE06471DED0097A5F4 1183 | 1CA1AED706398EBD00589147 1184 | 1185 | ToolbarConfiguration 1186 | xcode.toolbar.config.breakpointsV3 1187 | WindowString 1188 | 156 320 744 409 0 0 1280 1002 1189 | WindowToolGUID 1190 | 1F5734DB0D62E84C003B95FF 1191 | WindowToolIsVisible 1192 | 1193 | 1194 | 1195 | Identifier 1196 | windowTool.debugAnimator 1197 | Layout 1198 | 1199 | 1200 | Dock 1201 | 1202 | 1203 | Module 1204 | PBXNavigatorGroup 1205 | Proportion 1206 | 100% 1207 | 1208 | 1209 | Proportion 1210 | 100% 1211 | 1212 | 1213 | Name 1214 | Debug Visualizer 1215 | ServiceClasses 1216 | 1217 | PBXNavigatorGroup 1218 | 1219 | StatusbarIsVisible 1220 | 1 1221 | ToolbarConfiguration 1222 | xcode.toolbar.config.debugAnimatorV3 1223 | WindowString 1224 | 100 100 700 500 0 0 1280 1002 1225 | 1226 | 1227 | Identifier 1228 | windowTool.bookmarks 1229 | Layout 1230 | 1231 | 1232 | Dock 1233 | 1234 | 1235 | Module 1236 | PBXBookmarksModule 1237 | Proportion 1238 | 100% 1239 | 1240 | 1241 | Proportion 1242 | 100% 1243 | 1244 | 1245 | Name 1246 | Bookmarks 1247 | ServiceClasses 1248 | 1249 | PBXBookmarksModule 1250 | 1251 | StatusbarIsVisible 1252 | 0 1253 | WindowString 1254 | 538 42 401 187 0 0 1280 1002 1255 | 1256 | 1257 | Identifier 1258 | windowTool.projectFormatConflicts 1259 | Layout 1260 | 1261 | 1262 | Dock 1263 | 1264 | 1265 | Module 1266 | XCProjectFormatConflictsModule 1267 | Proportion 1268 | 100% 1269 | 1270 | 1271 | Proportion 1272 | 100% 1273 | 1274 | 1275 | Name 1276 | Project Format Conflicts 1277 | ServiceClasses 1278 | 1279 | XCProjectFormatConflictsModule 1280 | 1281 | StatusbarIsVisible 1282 | 0 1283 | WindowContentMinSize 1284 | 450 300 1285 | WindowString 1286 | 50 850 472 307 0 0 1440 877 1287 | 1288 | 1289 | Identifier 1290 | windowTool.classBrowser 1291 | Layout 1292 | 1293 | 1294 | Dock 1295 | 1296 | 1297 | BecomeActive 1298 | 1 1299 | ContentConfiguration 1300 | 1301 | OptionsSetName 1302 | Hierarchy, all classes 1303 | PBXProjectModuleGUID 1304 | 1CA6456E063B45B4001379D8 1305 | PBXProjectModuleLabel 1306 | Class Browser - NSObject 1307 | 1308 | GeometryConfiguration 1309 | 1310 | ClassesFrame 1311 | {{0, 0}, {374, 96}} 1312 | ClassesTreeTableConfiguration 1313 | 1314 | PBXClassNameColumnIdentifier 1315 | 208 1316 | PBXClassBookColumnIdentifier 1317 | 22 1318 | 1319 | Frame 1320 | {{0, 0}, {630, 331}} 1321 | MembersFrame 1322 | {{0, 105}, {374, 395}} 1323 | MembersTreeTableConfiguration 1324 | 1325 | PBXMemberTypeIconColumnIdentifier 1326 | 22 1327 | PBXMemberNameColumnIdentifier 1328 | 216 1329 | PBXMemberTypeColumnIdentifier 1330 | 97 1331 | PBXMemberBookColumnIdentifier 1332 | 22 1333 | 1334 | PBXModuleWindowStatusBarHidden2 1335 | 1 1336 | RubberWindowFrame 1337 | 385 179 630 352 0 0 1440 878 1338 | 1339 | Module 1340 | PBXClassBrowserModule 1341 | Proportion 1342 | 332pt 1343 | 1344 | 1345 | Proportion 1346 | 332pt 1347 | 1348 | 1349 | Name 1350 | Class Browser 1351 | ServiceClasses 1352 | 1353 | PBXClassBrowserModule 1354 | 1355 | StatusbarIsVisible 1356 | 0 1357 | TableOfContents 1358 | 1359 | 1C0AD2AF069F1E9B00FABCE6 1360 | 1C0AD2B0069F1E9B00FABCE6 1361 | 1CA6456E063B45B4001379D8 1362 | 1363 | ToolbarConfiguration 1364 | xcode.toolbar.config.classbrowser 1365 | WindowString 1366 | 385 179 630 352 0 0 1440 878 1367 | WindowToolGUID 1368 | 1C0AD2AF069F1E9B00FABCE6 1369 | WindowToolIsVisible 1370 | 0 1371 | 1372 | 1373 | FirstTimeWindowDisplayed 1374 | 1375 | Identifier 1376 | windowTool.refactoring 1377 | IncludeInToolsMenu 1378 | 0 1379 | IsVertical 1380 | 1381 | Layout 1382 | 1383 | 1384 | Dock 1385 | 1386 | 1387 | ContentConfiguration 1388 | 1389 | PBXProjectModuleGUID 1390 | 1F5730E80D61B06B003B95FF 1391 | 1392 | GeometryConfiguration 1393 | 1394 | Frame 1395 | {{0, 0}, {684, 567}} 1396 | RubberWindowFrame 1397 | 408 134 684 608 0 0 1280 1002 1398 | XCRefactoringSplitViewLowerHeight 1399 | 373 1400 | XCRefactoringSplitViewTotalHeight 1401 | 484 1402 | 1403 | Module 1404 | XCRefactoringModule 1405 | Proportion 1406 | 567pt 1407 | 1408 | 1409 | Proportion 1410 | 567pt 1411 | 1412 | 1413 | Name 1414 | Refactoring 1415 | ServiceClasses 1416 | 1417 | XCRefactoringModule 1418 | 1419 | StatusbarIsVisible 1420 | 1421 | TableOfContents 1422 | 1423 | 1F5730E90D61B06B003B95FF 1424 | 1FB0B00A0D66065700245BA5 1425 | 1F5730E80D61B06B003B95FF 1426 | 1427 | WindowString 1428 | 408 134 684 608 0 0 1280 1002 1429 | WindowToolGUID 1430 | 1F5730E90D61B06B003B95FF 1431 | WindowToolIsVisible 1432 | 1433 | 1434 | 1435 | 1436 | 1437 | -------------------------------------------------------------------------------- /MissingDrawer.xcodeproj/Jannis.pbxuser: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | 089C1669FE841209C02AAC07 /* Project object */ = { 4 | activeBuildConfigurationName = Release; 5 | activeTarget = 8D5B49AC048680CD000E48DA /* MissingDrawer */; 6 | addToTargets = ( 7 | 8D5B49AC048680CD000E48DA /* MissingDrawer */, 8 | ); 9 | breakpoints = ( 10 | ); 11 | codeSenseManager = 1F2B3F630D5DA66E000354B0 /* Code sense */; 12 | perUserDictionary = { 13 | "PBXConfiguration.PBXBreakpointsDataSource.v1:1CA1AED706398EBD00589147" = { 14 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 15 | PBXFileTableDataSourceColumnSortingKey = PBXBreakpointsDataSource_BreakpointID; 16 | PBXFileTableDataSourceColumnWidthsKey = ( 17 | 20, 18 | 20, 19 | 198, 20 | 20, 21 | 99, 22 | 99, 23 | 29, 24 | 20, 25 | ); 26 | PBXFileTableDataSourceColumnsKey = ( 27 | PBXBreakpointsDataSource_ActionID, 28 | PBXBreakpointsDataSource_TypeID, 29 | PBXBreakpointsDataSource_BreakpointID, 30 | PBXBreakpointsDataSource_UseID, 31 | PBXBreakpointsDataSource_LocationID, 32 | PBXBreakpointsDataSource_ConditionID, 33 | PBXBreakpointsDataSource_IgnoreCountID, 34 | PBXBreakpointsDataSource_ContinueID, 35 | ); 36 | }; 37 | PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { 38 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 39 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; 40 | PBXFileTableDataSourceColumnWidthsKey = ( 41 | 20, 42 | 625, 43 | 20, 44 | 48, 45 | 43, 46 | 43, 47 | 20, 48 | ); 49 | PBXFileTableDataSourceColumnsKey = ( 50 | PBXFileDataSource_FiletypeID, 51 | PBXFileDataSource_Filename_ColumnID, 52 | PBXFileDataSource_Built_ColumnID, 53 | PBXFileDataSource_ObjectSize_ColumnID, 54 | PBXFileDataSource_Errors_ColumnID, 55 | PBXFileDataSource_Warnings_ColumnID, 56 | PBXFileDataSource_Target_ColumnID, 57 | ); 58 | }; 59 | PBXConfiguration.PBXFileTableDataSource3.PBXFindDataSource = { 60 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 61 | PBXFileTableDataSourceColumnSortingKey = PBXFindDataSource_LocationID; 62 | PBXFileTableDataSourceColumnWidthsKey = ( 63 | 200, 64 | 589, 65 | ); 66 | PBXFileTableDataSourceColumnsKey = ( 67 | PBXFindDataSource_MessageID, 68 | PBXFindDataSource_LocationID, 69 | ); 70 | }; 71 | PBXPerProjectTemplateStateSaveDate = 254745999; 72 | PBXWorkspaceStateSaveDate = 254745999; 73 | }; 74 | perUserProjectItems = { 75 | 1F0A23100DFE697F00AE21CB = 1F0A23100DFE697F00AE21CB /* PBXTextBookmark */; 76 | 1F0A23110DFE697F00AE21CB = 1F0A23110DFE697F00AE21CB /* PBXTextBookmark */; 77 | 1F5737E30D639A10003B95FF = 1F5737E30D639A10003B95FF /* PBXTextBookmark */; 78 | 1F5737E40D639A10003B95FF = 1F5737E40D639A10003B95FF /* PBXTextBookmark */; 79 | 1F5737E50D639A10003B95FF = 1F5737E50D639A10003B95FF /* PBXTextBookmark */; 80 | 1F5737E60D639A10003B95FF = 1F5737E60D639A10003B95FF /* PBXTextBookmark */; 81 | 1F5737E70D639A10003B95FF = 1F5737E70D639A10003B95FF /* PBXTextBookmark */; 82 | 1F5737E80D639A10003B95FF = 1F5737E80D639A10003B95FF /* PBXTextBookmark */; 83 | 1F5737E90D639A10003B95FF = 1F5737E90D639A10003B95FF /* PBXTextBookmark */; 84 | 1F5737EA0D639A10003B95FF = 1F5737EA0D639A10003B95FF /* PBXTextBookmark */; 85 | 1F5738790D63B3A8003B95FF = 1F5738790D63B3A8003B95FF /* PBXTextBookmark */; 86 | 1F5738810D63B3A8003B95FF = 1F5738810D63B3A8003B95FF /* PBXTextBookmark */; 87 | 1F5738820D63B3A8003B95FF = 1F5738820D63B3A8003B95FF /* PBXTextBookmark */; 88 | 1F5738830D63B3A8003B95FF = 1F5738830D63B3A8003B95FF /* PBXTextBookmark */; 89 | 1F5738D80D63C1F1003B95FF = 1F5738D80D63C1F1003B95FF /* PBXTextBookmark */; 90 | 1F5738E20D63C3A5003B95FF = 1F5738E20D63C3A5003B95FF /* PBXTextBookmark */; 91 | 1F573AE60D64998D003B95FF = 1F573AE60D64998D003B95FF /* PBXTextBookmark */; 92 | 1FAEBD3C0F2CB11D00083951 = 1FAEBD3C0F2CB11D00083951 /* PBXTextBookmark */; 93 | 1FAEBD3F0F2CB11D00083951 = 1FAEBD3F0F2CB11D00083951 /* PBXTextBookmark */; 94 | 1FB0B0310D66075500245BA5 = 1FB0B0310D66075500245BA5 /* PBXTextBookmark */; 95 | 1FB0B0320D66075500245BA5 = 1FB0B0320D66075500245BA5 /* PBXTextBookmark */; 96 | 1FB0B0330D66075500245BA5 = 1FB0B0330D66075500245BA5 /* PBXTextBookmark */; 97 | 1FE737180F2F1D9400CE03A4 /* PBXTextBookmark */ = 1FE737180F2F1D9400CE03A4 /* PBXTextBookmark */; 98 | 1FE7371D0F2F1DC100CE03A4 /* PBXTextBookmark */ = 1FE7371D0F2F1DC100CE03A4 /* PBXTextBookmark */; 99 | 1FE7371E0F2F1DD700CE03A4 /* PBXTextBookmark */ = 1FE7371E0F2F1DD700CE03A4 /* PBXTextBookmark */; 100 | 1FEE8E010F2F1D4700D2F8E5 = 1FEE8E010F2F1D4700D2F8E5 /* PBXTextBookmark */; 101 | }; 102 | sourceControlManager = 1F2B3F620D5DA66E000354B0 /* Source Control */; 103 | userBuildSettings = { 104 | }; 105 | }; 106 | 089C167EFE841241C02AAC07 /* English */ = { 107 | uiCtxt = { 108 | sepNavIntBoundsRect = "{{0, 0}, {753, 520}}"; 109 | sepNavSelRange = "{118, 0}"; 110 | sepNavVisRange = "{0, 118}"; 111 | sepNavWindowFrame = "{{15, 260}, {910, 737}}"; 112 | }; 113 | }; 114 | 1F0A23100DFE697F00AE21CB /* PBXTextBookmark */ = { 115 | isa = PBXTextBookmark; 116 | fRef = AA478D220AFE1C280063F4D8 /* HTMDSplitView.h */; 117 | name = "HTMDSplitView.h: 8"; 118 | rLen = 0; 119 | rLoc = 130; 120 | rType = 0; 121 | vrLen = 374; 122 | vrLoc = 0; 123 | }; 124 | 1F0A23110DFE697F00AE21CB /* PBXTextBookmark */ = { 125 | isa = PBXTextBookmark; 126 | fRef = AA478D230AFE1C280063F4D8 /* HTMDSplitView.m */; 127 | name = "HTMDSplitView.m: 140"; 128 | rLen = 259; 129 | rLoc = 3419; 130 | rType = 0; 131 | vrLen = 1106; 132 | vrLoc = 3219; 133 | }; 134 | 1F2B3F620D5DA66E000354B0 /* Source Control */ = { 135 | isa = PBXSourceControlManager; 136 | fallbackIsa = XCSourceControlManager; 137 | isSCMEnabled = 0; 138 | scmConfiguration = { 139 | }; 140 | }; 141 | 1F2B3F630D5DA66E000354B0 /* Code sense */ = { 142 | isa = PBXCodeSenseManager; 143 | indexTemplatePath = ""; 144 | }; 145 | 1F5732B80D6221BE003B95FF /* HTMDResizer.h */ = { 146 | uiCtxt = { 147 | sepNavIntBoundsRect = "{{0, 0}, {753, 520}}"; 148 | sepNavSelRange = "{110, 0}"; 149 | sepNavVisRange = "{0, 110}"; 150 | sepNavWindowFrame = "{{15, 69}, {920, 704}}"; 151 | }; 152 | }; 153 | 1F5732B90D6221BE003B95FF /* HTMDResizer.m */ = { 154 | uiCtxt = { 155 | sepNavIntBoundsRect = "{{0, 0}, {753, 434}}"; 156 | sepNavSelRange = "{321, 0}"; 157 | sepNavVisRange = "{0, 387}"; 158 | sepNavWindowFrame = "{{448, 127}, {794, 774}}"; 159 | }; 160 | }; 161 | 1F5737E30D639A10003B95FF /* PBXTextBookmark */ = { 162 | isa = PBXTextBookmark; 163 | fRef = AA478D230AFE1C280063F4D8 /* HTMDSplitView.m */; 164 | name = "HTMDSplitView.m: 48"; 165 | rLen = 0; 166 | rLoc = 1866; 167 | rType = 0; 168 | vrLen = 1005; 169 | vrLoc = 716; 170 | }; 171 | 1F5737E40D639A10003B95FF /* PBXTextBookmark */ = { 172 | isa = PBXTextBookmark; 173 | fRef = AA478D220AFE1C280063F4D8 /* HTMDSplitView.h */; 174 | name = "HTMDSplitView.h: 8"; 175 | rLen = 13; 176 | rLoc = 78; 177 | rType = 0; 178 | vrLen = 374; 179 | vrLoc = 0; 180 | }; 181 | 1F5737E50D639A10003B95FF /* PBXTextBookmark */ = { 182 | isa = PBXTextBookmark; 183 | fRef = AA478D930AFEB7AD0063F4D8 /* HTMDSidebarBorderView.m */; 184 | name = "HTMDSidebarBorderView.m: 89"; 185 | rLen = 0; 186 | rLoc = 1931; 187 | rType = 0; 188 | vrLen = 1289; 189 | vrLoc = 8079; 190 | }; 191 | 1F5737E60D639A10003B95FF /* PBXTextBookmark */ = { 192 | isa = PBXTextBookmark; 193 | fRef = AA478D920AFEB7AD0063F4D8 /* HTMDSidebarBorderView.h */; 194 | name = "HTMDSidebarBorderView.h: 13"; 195 | rLen = 7; 196 | rLoc = 211; 197 | rType = 0; 198 | vrLen = 230; 199 | vrLoc = 0; 200 | }; 201 | 1F5737E70D639A10003B95FF /* PBXTextBookmark */ = { 202 | isa = PBXTextBookmark; 203 | fRef = 1F5732B80D6221BE003B95FF /* HTMDResizer.h */; 204 | name = "HTMDResizer.h: 3"; 205 | rLen = 7; 206 | rLoc = 40; 207 | rType = 0; 208 | vrLen = 71; 209 | vrLoc = 0; 210 | }; 211 | 1F5737E80D639A10003B95FF /* PBXTextBookmark */ = { 212 | isa = PBXTextBookmark; 213 | fRef = 1F5732B90D6221BE003B95FF /* HTMDResizer.m */; 214 | name = "HTMDResizer.m: 5"; 215 | rLen = 7; 216 | rLoc = 55; 217 | rType = 0; 218 | vrLen = 375; 219 | vrLoc = 0; 220 | }; 221 | 1F5737E90D639A10003B95FF /* PBXTextBookmark */ = { 222 | isa = PBXTextBookmark; 223 | fRef = AA478CB70AFD9CC90063F4D8 /* HTMDMissingDrawer.m */; 224 | name = "HTMDMissingDrawer.m: 120"; 225 | rLen = 0; 226 | rLoc = 3315; 227 | rType = 0; 228 | vrLen = 1243; 229 | vrLoc = 3180; 230 | }; 231 | 1F5737EA0D639A10003B95FF /* PBXTextBookmark */ = { 232 | isa = PBXTextBookmark; 233 | fRef = AA478CB60AFD9CC90063F4D8 /* HTMDMissingDrawer.h */; 234 | name = "HTMDMissingDrawer.h: 4"; 235 | rLen = 0; 236 | rLoc = 45; 237 | rType = 0; 238 | vrLen = 540; 239 | vrLoc = 0; 240 | }; 241 | 1F5738790D63B3A8003B95FF /* PBXTextBookmark */ = { 242 | isa = PBXTextBookmark; 243 | fRef = 32DBCF630370AF2F00C91783 /* MissingDrawer_Prefix.pch */; 244 | name = "MissingDrawer_Prefix.pch: 1"; 245 | rLen = 0; 246 | rLoc = 0; 247 | rType = 0; 248 | vrLen = 158; 249 | vrLoc = 0; 250 | }; 251 | 1F5738810D63B3A8003B95FF /* PBXTextBookmark */ = { 252 | isa = PBXTextBookmark; 253 | fRef = 8D5B49B7048680CD000E48DA /* Info.plist */; 254 | name = "Info.plist: 20"; 255 | rLen = 0; 256 | rLoc = 685; 257 | rType = 0; 258 | vrLen = 871; 259 | vrLoc = 0; 260 | }; 261 | 1F5738820D63B3A8003B95FF /* PBXTextBookmark */ = { 262 | isa = PBXTextBookmark; 263 | fRef = 089C167EFE841241C02AAC07 /* English */; 264 | name = "InfoPlist.strings: 4"; 265 | rLen = 0; 266 | rLoc = 118; 267 | rType = 0; 268 | vrLen = 99; 269 | vrLoc = 0; 270 | }; 271 | 1F5738830D63B3A8003B95FF /* PBXTextBookmark */ = { 272 | isa = PBXTextBookmark; 273 | fRef = 32DBCF630370AF2F00C91783 /* MissingDrawer_Prefix.pch */; 274 | name = "MissingDrawer_Prefix.pch: 1"; 275 | rLen = 0; 276 | rLoc = 0; 277 | rType = 0; 278 | vrLen = 158; 279 | vrLoc = 0; 280 | }; 281 | 1F5738D80D63C1F1003B95FF /* PBXTextBookmark */ = { 282 | isa = PBXTextBookmark; 283 | fRef = 8D5B49B7048680CD000E48DA /* Info.plist */; 284 | name = "Info.plist: 13"; 285 | rLen = 0; 286 | rLoc = 449; 287 | rType = 0; 288 | vrLen = 878; 289 | vrLoc = 0; 290 | }; 291 | 1F5738E20D63C3A5003B95FF /* PBXTextBookmark */ = { 292 | isa = PBXTextBookmark; 293 | fRef = 089C167EFE841241C02AAC07 /* English */; 294 | name = "InfoPlist.strings: 4"; 295 | rLen = 0; 296 | rLoc = 118; 297 | rType = 0; 298 | vrLen = 118; 299 | vrLoc = 0; 300 | }; 301 | 1F573AE60D64998D003B95FF /* PBXTextBookmark */ = { 302 | isa = PBXTextBookmark; 303 | fRef = 1F5732B80D6221BE003B95FF /* HTMDResizer.h */; 304 | name = "HTMDResizer.h: 10"; 305 | rLen = 0; 306 | rLoc = 110; 307 | rType = 0; 308 | vrLen = 110; 309 | vrLoc = 0; 310 | }; 311 | 1FAEBD3C0F2CB11D00083951 /* PBXTextBookmark */ = { 312 | isa = PBXTextBookmark; 313 | fRef = AA478CB70AFD9CC90063F4D8 /* HTMDMissingDrawer.m */; 314 | name = "HTMDMissingDrawer.m: 135"; 315 | rLen = 0; 316 | rLoc = 4589; 317 | rType = 0; 318 | vrLen = 1437; 319 | vrLoc = 3972; 320 | }; 321 | 1FAEBD3F0F2CB11D00083951 /* PBXTextBookmark */ = { 322 | isa = PBXTextBookmark; 323 | fRef = AA478D930AFEB7AD0063F4D8 /* HTMDSidebarBorderView.m */; 324 | name = "HTMDSidebarBorderView.m: 141"; 325 | rLen = 0; 326 | rLoc = 4036; 327 | rType = 0; 328 | vrLen = 1164; 329 | vrLoc = 3144; 330 | }; 331 | 1FB0B0310D66075500245BA5 /* PBXTextBookmark */ = { 332 | isa = PBXTextBookmark; 333 | fRef = AA478CB60AFD9CC90063F4D8 /* HTMDMissingDrawer.h */; 334 | name = "HTMDMissingDrawer.h: 13"; 335 | rLen = 0; 336 | rLoc = 168; 337 | rType = 0; 338 | vrLen = 614; 339 | vrLoc = 0; 340 | }; 341 | 1FB0B0320D66075500245BA5 /* PBXTextBookmark */ = { 342 | isa = PBXTextBookmark; 343 | fRef = 1F5732B90D6221BE003B95FF /* HTMDResizer.m */; 344 | name = "HTMDResizer.m: 17"; 345 | rLen = 0; 346 | rLoc = 321; 347 | rType = 0; 348 | vrLen = 387; 349 | vrLoc = 0; 350 | }; 351 | 1FB0B0330D66075500245BA5 /* PBXTextBookmark */ = { 352 | isa = PBXTextBookmark; 353 | fRef = AA478D920AFEB7AD0063F4D8 /* HTMDSidebarBorderView.h */; 354 | name = "HTMDSidebarBorderView.h: 7"; 355 | rLen = 0; 356 | rLoc = 118; 357 | rType = 0; 358 | vrLen = 236; 359 | vrLoc = 0; 360 | }; 361 | 1FE737180F2F1D9400CE03A4 /* PBXTextBookmark */ = { 362 | isa = PBXTextBookmark; 363 | fRef = AA478D930AFEB7AD0063F4D8 /* HTMDSidebarBorderView.m */; 364 | name = "HTMDSidebarBorderView.m: 136"; 365 | rLen = 0; 366 | rLoc = 3752; 367 | rType = 0; 368 | vrLen = 1277; 369 | vrLoc = 3101; 370 | }; 371 | 1FE7371D0F2F1DC100CE03A4 /* PBXTextBookmark */ = { 372 | isa = PBXTextBookmark; 373 | fRef = AA478D930AFEB7AD0063F4D8 /* HTMDSidebarBorderView.m */; 374 | name = "HTMDSidebarBorderView.m: 138"; 375 | rLen = 0; 376 | rLoc = 3890; 377 | rType = 0; 378 | vrLen = 1139; 379 | vrLoc = 3101; 380 | }; 381 | 1FE7371E0F2F1DD700CE03A4 /* PBXTextBookmark */ = { 382 | isa = PBXTextBookmark; 383 | fRef = AA478D930AFEB7AD0063F4D8 /* HTMDSidebarBorderView.m */; 384 | name = "HTMDSidebarBorderView.m: 140"; 385 | rLen = 0; 386 | rLoc = 4032; 387 | rType = 0; 388 | vrLen = 1092; 389 | vrLoc = 3101; 390 | }; 391 | 1FEE8E010F2F1D4700D2F8E5 /* PBXTextBookmark */ = { 392 | isa = PBXTextBookmark; 393 | fRef = AA478D930AFEB7AD0063F4D8 /* HTMDSidebarBorderView.m */; 394 | name = "HTMDSidebarBorderView.m: 136"; 395 | rLen = 0; 396 | rLoc = 3752; 397 | rType = 0; 398 | vrLen = 1390; 399 | vrLoc = 3101; 400 | }; 401 | 32DBCF630370AF2F00C91783 /* MissingDrawer_Prefix.pch */ = { 402 | uiCtxt = { 403 | sepNavIntBoundsRect = "{{0, 0}, {753, 520}}"; 404 | sepNavSelRange = "{0, 0}"; 405 | sepNavVisRange = "{0, 158}"; 406 | }; 407 | }; 408 | 8D5B49AC048680CD000E48DA /* MissingDrawer */ = { 409 | activeExec = 0; 410 | }; 411 | 8D5B49B7048680CD000E48DA /* Info.plist */ = { 412 | uiCtxt = { 413 | sepNavIntBoundsRect = "{{0, 0}, {753, 520}}"; 414 | sepNavSelRange = "{449, 0}"; 415 | sepNavVisRange = "{0, 878}"; 416 | sepNavWindowFrame = "{{38, 239}, {910, 737}}"; 417 | }; 418 | }; 419 | AA478CB60AFD9CC90063F4D8 /* HTMDMissingDrawer.h */ = { 420 | uiCtxt = { 421 | sepNavIntBoundsRect = "{{0, 0}, {878, 520}}"; 422 | sepNavSelRange = "{168, 0}"; 423 | sepNavVisRange = "{0, 614}"; 424 | sepNavWindowFrame = "{{204, 385}, {1003, 566}}"; 425 | }; 426 | }; 427 | AA478CB70AFD9CC90063F4D8 /* HTMDMissingDrawer.m */ = { 428 | uiCtxt = { 429 | sepNavIntBoundsRect = "{{0, 0}, {876, 2520}}"; 430 | sepNavSelRange = "{4589, 0}"; 431 | sepNavVisRange = "{3972, 1437}"; 432 | sepNavWindowFrame = "{{265, 110}, {794, 774}}"; 433 | }; 434 | }; 435 | AA478D220AFE1C280063F4D8 /* HTMDSplitView.h */ = { 436 | uiCtxt = { 437 | sepNavIntBoundsRect = "{{0, 0}, {803, 550}}"; 438 | sepNavSelRange = "{130, 0}"; 439 | sepNavVisRange = "{0, 374}"; 440 | sepNavWindowFrame = "{{256, 86}, {750, 558}}"; 441 | }; 442 | }; 443 | AA478D230AFE1C280063F4D8 /* HTMDSplitView.m */ = { 444 | uiCtxt = { 445 | sepNavIntBoundsRect = "{{0, 0}, {803, 3010}}"; 446 | sepNavSelRange = "{3419, 259}"; 447 | sepNavVisRange = "{3219, 1106}"; 448 | sepNavWindowFrame = "{{56, 117}, {910, 737}}"; 449 | }; 450 | }; 451 | AA478D920AFEB7AD0063F4D8 /* HTMDSidebarBorderView.h */ = { 452 | uiCtxt = { 453 | sepNavIntBoundsRect = "{{0, 0}, {753, 434}}"; 454 | sepNavSelRange = "{118, 0}"; 455 | sepNavVisRange = "{0, 236}"; 456 | sepNavWindowFrame = "{{61, 220}, {750, 558}}"; 457 | }; 458 | }; 459 | AA478D930AFEB7AD0063F4D8 /* HTMDSidebarBorderView.m */ = { 460 | uiCtxt = { 461 | sepNavIntBoundsRect = "{{0, 0}, {803, 3988}}"; 462 | sepNavSelRange = "{4032, 0}"; 463 | sepNavVisRange = "{3101, 1092}"; 464 | sepNavWindowFrame = "{{45, 169}, {792, 801}}"; 465 | }; 466 | }; 467 | } 468 | -------------------------------------------------------------------------------- /MissingDrawer.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 42; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 093EFCA712AFEF0E00D8A18C /* Preferences.xib in Resources */ = {isa = PBXBuildFile; fileRef = 093EFCA512AFEF0E00D8A18C /* Preferences.xib */; }; 11 | 093EFCAF12AFF0EA00D8A18C /* NSWindowController+Preferences.m in Sources */ = {isa = PBXBuildFile; fileRef = 093EFCAE12AFF0EA00D8A18C /* NSWindowController+Preferences.m */; }; 12 | 097A211712B115F300614549 /* MDPreferenceController.m in Sources */ = {isa = PBXBuildFile; fileRef = 097A211612B115F300614549 /* MDPreferenceController.m */; }; 13 | 17A67ED81220168000BECE6F /* defaultSettings.plist in Resources */ = {isa = PBXBuildFile; fileRef = 17A67ED71220168000BECE6F /* defaultSettings.plist */; }; 14 | 8D5B49B4048680CD000E48DA /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */; }; 15 | B21734D813916D0200299F09 /* MDDefines.m in Sources */ = {isa = PBXBuildFile; fileRef = B21734D713916D0200299F09 /* MDDefines.m */; }; 16 | B21734EF13916FBD00299F09 /* ButtonTerminal.png in Resources */ = {isa = PBXBuildFile; fileRef = B21734E913916FBD00299F09 /* ButtonTerminal.png */; }; 17 | B21734F013916FBD00299F09 /* ButtonTerminalPressed.png in Resources */ = {isa = PBXBuildFile; fileRef = B21734EB13916FBD00299F09 /* ButtonTerminalPressed.png */; }; 18 | B2B89112121CD28E00AC78F1 /* MDMissingDrawer.m in Sources */ = {isa = PBXBuildFile; fileRef = B2B890FC121CD28D00AC78F1 /* MDMissingDrawer.m */; }; 19 | B2B89113121CD28E00AC78F1 /* MDResizer.m in Sources */ = {isa = PBXBuildFile; fileRef = B2B890FE121CD28D00AC78F1 /* MDResizer.m */; }; 20 | B2B89114121CD28E00AC78F1 /* MDSettings.m in Sources */ = {isa = PBXBuildFile; fileRef = B2B89100121CD28D00AC78F1 /* MDSettings.m */; }; 21 | B2B89115121CD28E00AC78F1 /* MDSidebarBorderView.m in Sources */ = {isa = PBXBuildFile; fileRef = B2B89102121CD28D00AC78F1 /* MDSidebarBorderView.m */; }; 22 | B2B89116121CD28E00AC78F1 /* MDSplitView.m in Sources */ = {isa = PBXBuildFile; fileRef = B2B89104121CD28D00AC78F1 /* MDSplitView.m */; }; 23 | B2B89117121CD28E00AC78F1 /* DrawerBorder.png in Resources */ = {isa = PBXBuildFile; fileRef = B2B89107121CD28D00AC78F1 /* DrawerBorder.png */; }; 24 | B2B89118121CD28E00AC78F1 /* DrawerResizeHandle.png in Resources */ = {isa = PBXBuildFile; fileRef = B2B89109121CD28D00AC78F1 /* DrawerResizeHandle.png */; }; 25 | B2B89194121CDA1A00AC78F1 /* NSWindowController+MDMethodReplacements.m in Sources */ = {isa = PBXBuildFile; fileRef = B2B89193121CDA1A00AC78F1 /* NSWindowController+MDMethodReplacements.m */; }; 26 | B2B89197121CDA5800AC78F1 /* NSWindowController+MDAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = B2B89196121CDA5800AC78F1 /* NSWindowController+MDAdditions.m */; }; 27 | /* End PBXBuildFile section */ 28 | 29 | /* Begin PBXFileReference section */ 30 | 089C1672FE841209C02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 31 | 089C167FFE841241C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 32 | 093EFCA612AFEF0E00D8A18C /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/Preferences.xib; sourceTree = ""; }; 33 | 093EFCAD12AFF0EA00D8A18C /* NSWindowController+Preferences.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSWindowController+Preferences.h"; sourceTree = ""; }; 34 | 093EFCAE12AFF0EA00D8A18C /* NSWindowController+Preferences.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSWindowController+Preferences.m"; sourceTree = ""; }; 35 | 097A211512B115F300614549 /* MDPreferenceController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MDPreferenceController.h; sourceTree = ""; }; 36 | 097A211612B115F300614549 /* MDPreferenceController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MDPreferenceController.m; sourceTree = ""; }; 37 | 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 38 | 17A67ED71220168000BECE6F /* defaultSettings.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = defaultSettings.plist; sourceTree = ""; }; 39 | 8D5B49B6048680CD000E48DA /* MissingDrawer.tmplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MissingDrawer.tmplugin; sourceTree = BUILT_PRODUCTS_DIR; }; 40 | B21734D613916D0200299F09 /* MDDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MDDefines.h; sourceTree = ""; }; 41 | B21734D713916D0200299F09 /* MDDefines.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MDDefines.m; sourceTree = ""; }; 42 | B21734EA13916FBD00299F09 /* English */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = English; path = English.lproj/ButtonTerminal.png; sourceTree = ""; }; 43 | B21734EC13916FBD00299F09 /* English */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = English; path = English.lproj/ButtonTerminalPressed.png; sourceTree = ""; }; 44 | B2B890FB121CD28D00AC78F1 /* MDMissingDrawer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MDMissingDrawer.h; sourceTree = ""; }; 45 | B2B890FC121CD28D00AC78F1 /* MDMissingDrawer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MDMissingDrawer.m; sourceTree = ""; }; 46 | B2B890FD121CD28D00AC78F1 /* MDResizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MDResizer.h; sourceTree = ""; }; 47 | B2B890FE121CD28D00AC78F1 /* MDResizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MDResizer.m; sourceTree = ""; }; 48 | B2B890FF121CD28D00AC78F1 /* MDSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MDSettings.h; sourceTree = ""; }; 49 | B2B89100121CD28D00AC78F1 /* MDSettings.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MDSettings.m; sourceTree = ""; }; 50 | B2B89101121CD28D00AC78F1 /* MDSidebarBorderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MDSidebarBorderView.h; sourceTree = ""; }; 51 | B2B89102121CD28D00AC78F1 /* MDSidebarBorderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MDSidebarBorderView.m; sourceTree = ""; }; 52 | B2B89103121CD28D00AC78F1 /* MDSplitView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MDSplitView.h; sourceTree = ""; }; 53 | B2B89104121CD28D00AC78F1 /* MDSplitView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MDSplitView.m; sourceTree = ""; }; 54 | B2B89108121CD28D00AC78F1 /* English */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = English; path = English.lproj/DrawerBorder.png; sourceTree = ""; }; 55 | B2B8910A121CD28D00AC78F1 /* English */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = English; path = English.lproj/DrawerResizeHandle.png; sourceTree = ""; }; 56 | B2B89111121CD28E00AC78F1 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 57 | B2B89128121CD2B800AC78F1 /* MissingDrawer_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MissingDrawer_Prefix.pch; sourceTree = ""; }; 58 | B2B89134121CD38D00AC78F1 /* TMPlugInController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TMPlugInController.h; sourceTree = ""; }; 59 | B2B89192121CDA1A00AC78F1 /* NSWindowController+MDMethodReplacements.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSWindowController+MDMethodReplacements.h"; sourceTree = ""; }; 60 | B2B89193121CDA1A00AC78F1 /* NSWindowController+MDMethodReplacements.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSWindowController+MDMethodReplacements.m"; sourceTree = ""; }; 61 | B2B89195121CDA5800AC78F1 /* NSWindowController+MDAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSWindowController+MDAdditions.h"; sourceTree = ""; }; 62 | B2B89196121CDA5800AC78F1 /* NSWindowController+MDAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSWindowController+MDAdditions.m"; sourceTree = ""; }; 63 | B2B891DD121CDCAA00AC78F1 /* MDDebugUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MDDebugUtils.h; sourceTree = ""; }; 64 | D2F7E65807B2D6F200F64583 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; 65 | /* End PBXFileReference section */ 66 | 67 | /* Begin PBXFrameworksBuildPhase section */ 68 | 8D5B49B3048680CD000E48DA /* Frameworks */ = { 69 | isa = PBXFrameworksBuildPhase; 70 | buildActionMask = 2147483647; 71 | files = ( 72 | 8D5B49B4048680CD000E48DA /* Cocoa.framework in Frameworks */, 73 | ); 74 | runOnlyForDeploymentPostprocessing = 0; 75 | }; 76 | /* End PBXFrameworksBuildPhase section */ 77 | 78 | /* Begin PBXGroup section */ 79 | 089C166AFE841209C02AAC07 /* MissingDrawer */ = { 80 | isa = PBXGroup; 81 | children = ( 82 | B2B890F9121CD28D00AC78F1 /* Classes */, 83 | B2B89106121CD28D00AC78F1 /* Resources */, 84 | B2B89127121CD2B800AC78F1 /* Other Sources */, 85 | 089C1671FE841209C02AAC07 /* Frameworks and Libraries */, 86 | 19C28FB8FE9D52D311CA2CBB /* Products */, 87 | ); 88 | name = MissingDrawer; 89 | sourceTree = ""; 90 | }; 91 | 089C1671FE841209C02AAC07 /* Frameworks and Libraries */ = { 92 | isa = PBXGroup; 93 | children = ( 94 | 1058C7ACFEA557BF11CA2CBB /* Linked Frameworks */, 95 | 1058C7AEFEA557BF11CA2CBB /* Other Frameworks */, 96 | ); 97 | name = "Frameworks and Libraries"; 98 | sourceTree = ""; 99 | }; 100 | 1058C7ACFEA557BF11CA2CBB /* Linked Frameworks */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */, 104 | ); 105 | name = "Linked Frameworks"; 106 | sourceTree = ""; 107 | }; 108 | 1058C7AEFEA557BF11CA2CBB /* Other Frameworks */ = { 109 | isa = PBXGroup; 110 | children = ( 111 | 089C167FFE841241C02AAC07 /* AppKit.framework */, 112 | D2F7E65807B2D6F200F64583 /* CoreData.framework */, 113 | 089C1672FE841209C02AAC07 /* Foundation.framework */, 114 | ); 115 | name = "Other Frameworks"; 116 | sourceTree = ""; 117 | }; 118 | 19C28FB8FE9D52D311CA2CBB /* Products */ = { 119 | isa = PBXGroup; 120 | children = ( 121 | 8D5B49B6048680CD000E48DA /* MissingDrawer.tmplugin */, 122 | ); 123 | name = Products; 124 | sourceTree = ""; 125 | }; 126 | B2B890F9121CD28D00AC78F1 /* Classes */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | B2B891E0121CDCB100AC78F1 /* Plugin */, 130 | B2B891D4121CDC7F00AC78F1 /* Views */, 131 | B2B891D2121CDC7000AC78F1 /* Categories */, 132 | ); 133 | path = Classes; 134 | sourceTree = ""; 135 | }; 136 | B2B89106121CD28D00AC78F1 /* Resources */ = { 137 | isa = PBXGroup; 138 | children = ( 139 | B21734E913916FBD00299F09 /* ButtonTerminal.png */, 140 | B21734EB13916FBD00299F09 /* ButtonTerminalPressed.png */, 141 | 093EFCA512AFEF0E00D8A18C /* Preferences.xib */, 142 | 17A67ED71220168000BECE6F /* defaultSettings.plist */, 143 | B2B89107121CD28D00AC78F1 /* DrawerBorder.png */, 144 | B2B89109121CD28D00AC78F1 /* DrawerResizeHandle.png */, 145 | B2B89111121CD28E00AC78F1 /* Info.plist */, 146 | ); 147 | path = Resources; 148 | sourceTree = ""; 149 | }; 150 | B2B89127121CD2B800AC78F1 /* Other Sources */ = { 151 | isa = PBXGroup; 152 | children = ( 153 | B21734D613916D0200299F09 /* MDDefines.h */, 154 | B21734D713916D0200299F09 /* MDDefines.m */, 155 | B2B891DD121CDCAA00AC78F1 /* MDDebugUtils.h */, 156 | B2B89128121CD2B800AC78F1 /* MissingDrawer_Prefix.pch */, 157 | ); 158 | path = "Other Sources"; 159 | sourceTree = ""; 160 | }; 161 | B2B891D2121CDC7000AC78F1 /* Categories */ = { 162 | isa = PBXGroup; 163 | children = ( 164 | 093EFCAD12AFF0EA00D8A18C /* NSWindowController+Preferences.h */, 165 | 093EFCAE12AFF0EA00D8A18C /* NSWindowController+Preferences.m */, 166 | B2B89192121CDA1A00AC78F1 /* NSWindowController+MDMethodReplacements.h */, 167 | B2B89193121CDA1A00AC78F1 /* NSWindowController+MDMethodReplacements.m */, 168 | B2B89195121CDA5800AC78F1 /* NSWindowController+MDAdditions.h */, 169 | B2B89196121CDA5800AC78F1 /* NSWindowController+MDAdditions.m */, 170 | ); 171 | name = Categories; 172 | sourceTree = ""; 173 | }; 174 | B2B891D4121CDC7F00AC78F1 /* Views */ = { 175 | isa = PBXGroup; 176 | children = ( 177 | B2B890FD121CD28D00AC78F1 /* MDResizer.h */, 178 | B2B890FE121CD28D00AC78F1 /* MDResizer.m */, 179 | B2B89101121CD28D00AC78F1 /* MDSidebarBorderView.h */, 180 | B2B89102121CD28D00AC78F1 /* MDSidebarBorderView.m */, 181 | B2B89103121CD28D00AC78F1 /* MDSplitView.h */, 182 | B2B89104121CD28D00AC78F1 /* MDSplitView.m */, 183 | ); 184 | name = Views; 185 | sourceTree = ""; 186 | }; 187 | B2B891E0121CDCB100AC78F1 /* Plugin */ = { 188 | isa = PBXGroup; 189 | children = ( 190 | B2B89134121CD38D00AC78F1 /* TMPlugInController.h */, 191 | B2B890FB121CD28D00AC78F1 /* MDMissingDrawer.h */, 192 | B2B890FC121CD28D00AC78F1 /* MDMissingDrawer.m */, 193 | B2B890FF121CD28D00AC78F1 /* MDSettings.h */, 194 | B2B89100121CD28D00AC78F1 /* MDSettings.m */, 195 | 097A211512B115F300614549 /* MDPreferenceController.h */, 196 | 097A211612B115F300614549 /* MDPreferenceController.m */, 197 | ); 198 | name = Plugin; 199 | sourceTree = ""; 200 | }; 201 | /* End PBXGroup section */ 202 | 203 | /* Begin PBXNativeTarget section */ 204 | 8D5B49AC048680CD000E48DA /* MissingDrawer */ = { 205 | isa = PBXNativeTarget; 206 | buildConfigurationList = 1DEB913A08733D840010E9CD /* Build configuration list for PBXNativeTarget "MissingDrawer" */; 207 | buildPhases = ( 208 | 8D5B49AF048680CD000E48DA /* Resources */, 209 | 8D5B49B1048680CD000E48DA /* Sources */, 210 | 8D5B49B3048680CD000E48DA /* Frameworks */, 211 | ); 212 | buildRules = ( 213 | ); 214 | dependencies = ( 215 | ); 216 | name = MissingDrawer; 217 | productInstallPath = "$(HOME)/Library/Bundles"; 218 | productName = MissingDrawer; 219 | productReference = 8D5B49B6048680CD000E48DA /* MissingDrawer.tmplugin */; 220 | productType = "com.apple.product-type.bundle"; 221 | }; 222 | /* End PBXNativeTarget section */ 223 | 224 | /* Begin PBXProject section */ 225 | 089C1669FE841209C02AAC07 /* Project object */ = { 226 | isa = PBXProject; 227 | buildConfigurationList = 1DEB913E08733D840010E9CD /* Build configuration list for PBXProject "MissingDrawer" */; 228 | compatibilityVersion = "Xcode 2.4"; 229 | developmentRegion = English; 230 | hasScannedForEncodings = 1; 231 | knownRegions = ( 232 | English, 233 | Japanese, 234 | French, 235 | German, 236 | ); 237 | mainGroup = 089C166AFE841209C02AAC07 /* MissingDrawer */; 238 | projectDirPath = ""; 239 | projectRoot = ""; 240 | targets = ( 241 | 8D5B49AC048680CD000E48DA /* MissingDrawer */, 242 | ); 243 | }; 244 | /* End PBXProject section */ 245 | 246 | /* Begin PBXResourcesBuildPhase section */ 247 | 8D5B49AF048680CD000E48DA /* Resources */ = { 248 | isa = PBXResourcesBuildPhase; 249 | buildActionMask = 2147483647; 250 | files = ( 251 | B2B89117121CD28E00AC78F1 /* DrawerBorder.png in Resources */, 252 | B2B89118121CD28E00AC78F1 /* DrawerResizeHandle.png in Resources */, 253 | 17A67ED81220168000BECE6F /* defaultSettings.plist in Resources */, 254 | 093EFCA712AFEF0E00D8A18C /* Preferences.xib in Resources */, 255 | B21734EF13916FBD00299F09 /* ButtonTerminal.png in Resources */, 256 | B21734F013916FBD00299F09 /* ButtonTerminalPressed.png in Resources */, 257 | ); 258 | runOnlyForDeploymentPostprocessing = 0; 259 | }; 260 | /* End PBXResourcesBuildPhase section */ 261 | 262 | /* Begin PBXSourcesBuildPhase section */ 263 | 8D5B49B1048680CD000E48DA /* Sources */ = { 264 | isa = PBXSourcesBuildPhase; 265 | buildActionMask = 2147483647; 266 | files = ( 267 | B2B89112121CD28E00AC78F1 /* MDMissingDrawer.m in Sources */, 268 | B2B89113121CD28E00AC78F1 /* MDResizer.m in Sources */, 269 | B2B89114121CD28E00AC78F1 /* MDSettings.m in Sources */, 270 | B2B89115121CD28E00AC78F1 /* MDSidebarBorderView.m in Sources */, 271 | B2B89116121CD28E00AC78F1 /* MDSplitView.m in Sources */, 272 | B2B89194121CDA1A00AC78F1 /* NSWindowController+MDMethodReplacements.m in Sources */, 273 | B2B89197121CDA5800AC78F1 /* NSWindowController+MDAdditions.m in Sources */, 274 | 093EFCAF12AFF0EA00D8A18C /* NSWindowController+Preferences.m in Sources */, 275 | 097A211712B115F300614549 /* MDPreferenceController.m in Sources */, 276 | B21734D813916D0200299F09 /* MDDefines.m in Sources */, 277 | ); 278 | runOnlyForDeploymentPostprocessing = 0; 279 | }; 280 | /* End PBXSourcesBuildPhase section */ 281 | 282 | /* Begin PBXVariantGroup section */ 283 | 093EFCA512AFEF0E00D8A18C /* Preferences.xib */ = { 284 | isa = PBXVariantGroup; 285 | children = ( 286 | 093EFCA612AFEF0E00D8A18C /* English */, 287 | ); 288 | name = Preferences.xib; 289 | sourceTree = ""; 290 | }; 291 | B21734E913916FBD00299F09 /* ButtonTerminal.png */ = { 292 | isa = PBXVariantGroup; 293 | children = ( 294 | B21734EA13916FBD00299F09 /* English */, 295 | ); 296 | name = ButtonTerminal.png; 297 | sourceTree = ""; 298 | }; 299 | B21734EB13916FBD00299F09 /* ButtonTerminalPressed.png */ = { 300 | isa = PBXVariantGroup; 301 | children = ( 302 | B21734EC13916FBD00299F09 /* English */, 303 | ); 304 | name = ButtonTerminalPressed.png; 305 | sourceTree = ""; 306 | }; 307 | B2B89107121CD28D00AC78F1 /* DrawerBorder.png */ = { 308 | isa = PBXVariantGroup; 309 | children = ( 310 | B2B89108121CD28D00AC78F1 /* English */, 311 | ); 312 | name = DrawerBorder.png; 313 | sourceTree = ""; 314 | }; 315 | B2B89109121CD28D00AC78F1 /* DrawerResizeHandle.png */ = { 316 | isa = PBXVariantGroup; 317 | children = ( 318 | B2B8910A121CD28D00AC78F1 /* English */, 319 | ); 320 | name = DrawerResizeHandle.png; 321 | sourceTree = ""; 322 | }; 323 | /* End PBXVariantGroup section */ 324 | 325 | /* Begin XCBuildConfiguration section */ 326 | 1DEB913B08733D840010E9CD /* Debug */ = { 327 | isa = XCBuildConfiguration; 328 | buildSettings = { 329 | ARCHS = "$(ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1)"; 330 | ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1 = "x86_64 i386 ppc"; 331 | COPY_PHASE_STRIP = NO; 332 | GCC_DYNAMIC_NO_PIC = NO; 333 | GCC_ENABLE_FIX_AND_CONTINUE = YES; 334 | GCC_MODEL_TUNING = G5; 335 | GCC_OPTIMIZATION_LEVEL = 0; 336 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 337 | GCC_PREFIX_HEADER = "Other Sources/MissingDrawer_Prefix.pch"; 338 | GCC_PREPROCESSOR_DEFINITIONS = "ENABLE_DEBUG_MODE=1"; 339 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 340 | GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = NO; 341 | INFOPLIST_FILE = Resources/Info.plist; 342 | INSTALL_PATH = "$(HOME)/Library/Application Support/TextMate/PlugIns"; 343 | MACOSX_DEPLOYMENT_TARGET = 10.6; 344 | PRODUCT_NAME = MissingDrawer; 345 | SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.6.sdk"; 346 | WRAPPER_EXTENSION = tmplugin; 347 | ZERO_LINK = YES; 348 | }; 349 | name = Debug; 350 | }; 351 | 1DEB913C08733D840010E9CD /* Release */ = { 352 | isa = XCBuildConfiguration; 353 | buildSettings = { 354 | ARCHS = "$(ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1)"; 355 | ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1 = "x86_64 i386 ppc"; 356 | GCC_GENERATE_DEBUGGING_SYMBOLS = NO; 357 | GCC_MODEL_TUNING = G5; 358 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 359 | GCC_PREFIX_HEADER = "Other Sources/MissingDrawer_Prefix.pch"; 360 | GCC_PREPROCESSOR_DEFINITIONS = "ENABLE_LOGS=0"; 361 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 362 | GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = NO; 363 | INFOPLIST_FILE = Resources/Info.plist; 364 | INSTALL_PATH = "$(HOME)/Library/Application Support/TextMate/PlugIns"; 365 | MACOSX_DEPLOYMENT_TARGET = 10.6; 366 | ONLY_ACTIVE_ARCH = NO; 367 | PRODUCT_NAME = MissingDrawer; 368 | SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.6.sdk"; 369 | WRAPPER_EXTENSION = tmplugin; 370 | }; 371 | name = Release; 372 | }; 373 | 1DEB913F08733D840010E9CD /* Debug */ = { 374 | isa = XCBuildConfiguration; 375 | buildSettings = { 376 | ARCHS = "$(ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1)"; 377 | ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1 = "x86_64 i386 ppc"; 378 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 379 | GCC_WARN_UNUSED_VARIABLE = YES; 380 | MACOSX_DEPLOYMENT_TARGET = ""; 381 | PREBINDING = NO; 382 | PRODUCT_NAME = MissingDrawer; 383 | SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.6.sdk"; 384 | }; 385 | name = Debug; 386 | }; 387 | 1DEB914008733D840010E9CD /* Release */ = { 388 | isa = XCBuildConfiguration; 389 | buildSettings = { 390 | ARCHS = "$(ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1)"; 391 | ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1 = "x86_64 i386 ppc"; 392 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 393 | GCC_WARN_UNUSED_VARIABLE = YES; 394 | PREBINDING = NO; 395 | PRODUCT_NAME = MissingDrawer; 396 | SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.6.sdk"; 397 | }; 398 | name = Release; 399 | }; 400 | /* End XCBuildConfiguration section */ 401 | 402 | /* Begin XCConfigurationList section */ 403 | 1DEB913A08733D840010E9CD /* Build configuration list for PBXNativeTarget "MissingDrawer" */ = { 404 | isa = XCConfigurationList; 405 | buildConfigurations = ( 406 | 1DEB913B08733D840010E9CD /* Debug */, 407 | 1DEB913C08733D840010E9CD /* Release */, 408 | ); 409 | defaultConfigurationIsVisible = 0; 410 | defaultConfigurationName = Release; 411 | }; 412 | 1DEB913E08733D840010E9CD /* Build configuration list for PBXProject "MissingDrawer" */ = { 413 | isa = XCConfigurationList; 414 | buildConfigurations = ( 415 | 1DEB913F08733D840010E9CD /* Debug */, 416 | 1DEB914008733D840010E9CD /* Release */, 417 | ); 418 | defaultConfigurationIsVisible = 0; 419 | defaultConfigurationName = Release; 420 | }; 421 | /* End XCConfigurationList section */ 422 | }; 423 | rootObject = 089C1669FE841209C02AAC07 /* Project object */; 424 | } 425 | -------------------------------------------------------------------------------- /Other Sources/MDDebugUtils.h: -------------------------------------------------------------------------------- 1 | // 2 | // MDDebugUtils.h 3 | // MissingDrawer 4 | // 5 | // Copyright (c) The MissingDrawer authors. 6 | // 7 | // Permission is hereby granted, free of charge, to any person 8 | // obtaining a copy of this software and associated documentation 9 | // files (the "Software"), to deal in the Software without 10 | // restriction, including without limitation the rights to use, 11 | // copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the 13 | // Software is furnished to do so, subject to the following 14 | // conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be 17 | // included in all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | // OTHER DEALINGS IN THE SOFTWARE. 27 | // 28 | 29 | #define _MDLog(fmt, args...) NSLog(fmt, ##args); 30 | 31 | #if ENABLE_DEBUG_MODE 32 | #define MDLog(fmt, args...) _MDLog(@"%s(%i): " fmt, __FUNCTION__, __LINE__, ##args) 33 | #else 34 | #define MDLog(fmt, args...) 35 | #endif 36 | 37 | #define MDLogError(fmt, args...) _MDLog(@"%s(%i): " fmt, __FUNCTION__, __LINE__, ##args) 38 | -------------------------------------------------------------------------------- /Other Sources/MDDefines.h: -------------------------------------------------------------------------------- 1 | // 2 | // MDDefines.h 3 | // MissingDrawer 4 | // 5 | // Created by Sam Soffes on 5/28/11. 6 | // Copyright 2011 Sam Soffes. All rights reserved. 7 | // 8 | 9 | #ifndef MDDEFINES 10 | #define MDDEFINES 11 | 12 | // Sidebar 13 | extern NSString *const kMDSideViewLeftKey; 14 | extern NSString *const kMDSideViewFrameKey; 15 | extern NSString *const kMDMainViewFrameKey; 16 | extern NSString *const kMDSidebarBackgroundColorActiveKey; 17 | extern NSString *const kMDSidebarBackgroundColorIdleKey; 18 | 19 | // Terminal 20 | extern NSString *const kMDTerminalButtonEnabledKey; 21 | extern NSString *const kMDTerminalApplicationKey; 22 | extern NSString *const kMDTerminalOpenTabKey; 23 | 24 | #endif 25 | -------------------------------------------------------------------------------- /Other Sources/MDDefines.m: -------------------------------------------------------------------------------- 1 | // 2 | // MDDefines.m 3 | // MissingDrawer 4 | // 5 | // Created by Sam Soffes on 5/28/11. 6 | // Copyright 2011 Sam Soffes. All rights reserved. 7 | // 8 | 9 | #import "MDDefines.h" 10 | 11 | // Sidebar 12 | NSString *const kMDSideViewLeftKey = @"MDSideViewLeft"; 13 | NSString *const kMDSideViewFrameKey = @"MDSideViewFrame"; 14 | NSString *const kMDMainViewFrameKey = @"MDMainViewFrame"; 15 | NSString *const kMDSidebarBackgroundColorActiveKey = @"MDSidebarBackgroundColorActive"; 16 | NSString *const kMDSidebarBackgroundColorIdleKey = @"MDSidebarBackgroundColorIdle"; 17 | 18 | // Terminal 19 | NSString *const kMDTerminalButtonEnabledKey = @"MDTerminalButtonEnabled"; 20 | NSString *const kMDTerminalApplicationKey = @"MDTerminalApplication"; 21 | NSString *const kMDTerminalOpenTabKey = @"MDTerminalOpenTab"; 22 | -------------------------------------------------------------------------------- /Other Sources/MissingDrawer_Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'MissingDrawer' target in the 'MissingDrawer' project. 3 | // 4 | // Copyright (c) The MissingDrawer authors. 5 | // 6 | // Permission is hereby granted, free of charge, to any person 7 | // obtaining a copy of this software and associated documentation 8 | // files (the "Software"), to deal in the Software without 9 | // restriction, including without limitation the rights to use, 10 | // copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | // copies of the Software, and to permit persons to whom the 12 | // Software is furnished to do so, subject to the following 13 | // conditions: 14 | // 15 | // The above copyright notice and this permission notice shall be 16 | // included in all copies or substantial portions of the Software. 17 | // 18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 19 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 20 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 21 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 22 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 23 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 24 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 25 | // OTHER DEALINGS IN THE SOFTWARE. 26 | // 27 | 28 | #ifdef __OBJC__ 29 | #import 30 | #import "MDDebugUtils.h" 31 | #import "MDDefines.h" 32 | #endif 33 | -------------------------------------------------------------------------------- /Readme.markdown: -------------------------------------------------------------------------------- 1 | # MissingDrawer.tmplugin 2 | 3 | This plugin provides Xcode-like project window interface without drawer and adds "Open Terminal Here" button to the file list's button panel. 4 | 5 | ![Screenshot](https://github.com/downloads/jezdez/textmate-missingdrawer/Screen%20shot%202010-08-20.png) 6 | 7 | ## Installation 8 | 9 | Simply run the following command to download the latest version from [GitHub](http://github.com/jezdex/textmate-missingdrawer). 10 | 11 | bash <(curl -s -L http://goo.gl/4RUoP) 12 | 13 | You may also download the latest version from the [project download page](http://github.com/jezdez/textmate-missingdrawer/downloads) and double click the MissingDrawer.plugin file contained. 14 | 15 | ## Uninstallation 16 | 17 | Delete the Missing Drawer plugin from the TextMate PlugIns directory in your Library (`~/Library/Application Support/TextMate/PlugIns`). 18 | 19 | rm -r "$HOME/Library/Application Support/TextMate/PlugIns/MissingDrawer.tmplugin" 20 | 21 | ## Configuring 22 | 23 | To configure Missing Drawer, simply open TextMate's preferences, click the double arrow icon in the top right of the window, and choose Missing Drawer from the menu. The following preferences are supported: 24 | 25 | * Changing the sidebar's color 26 | * Enabling/Disabling the open terminal button 27 | * Choosing the terminal application. Terminal and iTerm are supported 28 | 29 | ## Authors 30 | 31 | The source code is released under the MIT license. Please see LICENSE for more information. 32 | 33 | * [hetima computer](http://hetima.com/) - hetima@hetima.com 34 | * [Jannis Leidel](http://github.com/jezdez) - jannis@leidel.info 35 | * [Christoph Meißner](http://christophmeissner.wordpress.com) - post@christophmeissner.de 36 | * [Sam Soffes](http://samsoff.es) - sam@samsoff.es 37 | * [Derek Prior](http://prioritized.net) 38 | * [Mads Hartmann](http://sidewayscoding.com) - mads379@gmail.com 39 | * [Jordy Rose](http://belkadan.com) - jrose@belkadan.com -------------------------------------------------------------------------------- /Resources/English.lproj/ButtonTerminal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jezdez/textmate-missingdrawer/346762bdc881b0243e8ecb2a6540a9d6d685a41b/Resources/English.lproj/ButtonTerminal.png -------------------------------------------------------------------------------- /Resources/English.lproj/ButtonTerminalPressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jezdez/textmate-missingdrawer/346762bdc881b0243e8ecb2a6540a9d6d685a41b/Resources/English.lproj/ButtonTerminalPressed.png -------------------------------------------------------------------------------- /Resources/English.lproj/DrawerBorder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jezdez/textmate-missingdrawer/346762bdc881b0243e8ecb2a6540a9d6d685a41b/Resources/English.lproj/DrawerBorder.png -------------------------------------------------------------------------------- /Resources/English.lproj/DrawerResizeHandle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jezdez/textmate-missingdrawer/346762bdc881b0243e8ecb2a6540a9d6d685a41b/Resources/English.lproj/DrawerResizeHandle.png -------------------------------------------------------------------------------- /Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | com.github.jezdez.textmate-missingdrawer 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | BNDL 19 | CFBundleShortVersionString 20 | 2010-11-28 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 0.4.0 25 | NSPrincipalClass 26 | MDMissingDrawer 27 | 28 | 29 | -------------------------------------------------------------------------------- /Resources/defaultSettings.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | MDSideViewLeft 6 | 7 | MDSideViewFrame 8 | {{0, 0}, {135, 500}} 9 | MDMainViewFrame 10 | {{135, 0}, {300, 500}} 11 | MDSidebarBackgroundColorActive 12 | BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU0NvbG9yAISECE5TT2JqZWN0AIWEAWMChARmZmZmg9/dXT+D5uRkP4Ps6mo/AYY= 13 | MDSidebarBackgroundColorIdle 14 | BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU0NvbG9yAISECE5TT2JqZWN0AIWEAWMChARmZmZmg+/tbT+D7+1tP4Pv7W0/AYY= 15 | MDTerminalButtonEnabled 16 | 17 | MDTerminalApplication 18 | Terminal 19 | MDTerminalOpenTab 20 | 21 | 22 | 23 | --------------------------------------------------------------------------------