Dallas Brown avatar Dallas Brown committed 45d4316

Inital Creation

Comments (0)

Files changed (14)

QuickOpenDerivedData.xcodeproj/project.pbxproj

+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 46;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		8E315A97173DA9FB00050360 /* QuickOpenDerivedData.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E315A96173DA9FB00050360 /* QuickOpenDerivedData.m */; };
+		8E315A9A173DAF0000050360 /* QODDButtonView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E315A99173DAF0000050360 /* QODDButtonView.m */; };
+		8E315A9D173DB01E00050360 /* QODDDerivedDataHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E315A9C173DB01E00050360 /* QODDDerivedDataHandler.m */; };
+		8EDB8E62173DB48100F87F7F /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8E315A86173DA85B00050360 /* AppKit.framework */; };
+		8EDB8E63173DB48400F87F7F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8E315A88173DA85B00050360 /* Foundation.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+		8E315A80173DA85B00050360 /* QuickOpenDerivedData.xcplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = QuickOpenDerivedData.xcplugin; sourceTree = BUILT_PRODUCTS_DIR; };
+		8E315A86173DA85B00050360 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
+		8E315A88173DA85B00050360 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+		8E315A8B173DA85B00050360 /* QuickOpenDerivedData-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "QuickOpenDerivedData-Info.plist"; sourceTree = "<group>"; };
+		8E315A95173DA9FB00050360 /* QuickOpenDerivedData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QuickOpenDerivedData.h; sourceTree = "<group>"; };
+		8E315A96173DA9FB00050360 /* QuickOpenDerivedData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QuickOpenDerivedData.m; sourceTree = "<group>"; };
+		8E315A98173DAF0000050360 /* QODDButtonView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QODDButtonView.h; sourceTree = "<group>"; };
+		8E315A99173DAF0000050360 /* QODDButtonView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QODDButtonView.m; sourceTree = "<group>"; };
+		8E315A9B173DB01E00050360 /* QODDDerivedDataHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QODDDerivedDataHandler.h; sourceTree = "<group>"; };
+		8E315A9C173DB01E00050360 /* QODDDerivedDataHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QODDDerivedDataHandler.m; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		8E315A7D173DA85B00050360 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				8EDB8E62173DB48100F87F7F /* AppKit.framework in Frameworks */,
+				8EDB8E63173DB48400F87F7F /* Foundation.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		8E315A77173DA85B00050360 = {
+			isa = PBXGroup;
+			children = (
+				8E315A89173DA85B00050360 /* QuickOpenDerivedData */,
+				8E315A82173DA85B00050360 /* Frameworks */,
+				8E315A81173DA85B00050360 /* Products */,
+			);
+			sourceTree = "<group>";
+		};
+		8E315A81173DA85B00050360 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				8E315A80173DA85B00050360 /* QuickOpenDerivedData.xcplugin */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		8E315A82173DA85B00050360 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				8E315A85173DA85B00050360 /* Other Frameworks */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+		8E315A85173DA85B00050360 /* Other Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				8E315A86173DA85B00050360 /* AppKit.framework */,
+				8E315A88173DA85B00050360 /* Foundation.framework */,
+			);
+			name = "Other Frameworks";
+			sourceTree = "<group>";
+		};
+		8E315A89173DA85B00050360 /* QuickOpenDerivedData */ = {
+			isa = PBXGroup;
+			children = (
+				8E315A8A173DA85B00050360 /* Supporting Files */,
+				8E315A95173DA9FB00050360 /* QuickOpenDerivedData.h */,
+				8E315A96173DA9FB00050360 /* QuickOpenDerivedData.m */,
+				8E315A98173DAF0000050360 /* QODDButtonView.h */,
+				8E315A99173DAF0000050360 /* QODDButtonView.m */,
+				8E315A9B173DB01E00050360 /* QODDDerivedDataHandler.h */,
+				8E315A9C173DB01E00050360 /* QODDDerivedDataHandler.m */,
+			);
+			path = QuickOpenDerivedData;
+			sourceTree = "<group>";
+		};
+		8E315A8A173DA85B00050360 /* Supporting Files */ = {
+			isa = PBXGroup;
+			children = (
+				8E315A8B173DA85B00050360 /* QuickOpenDerivedData-Info.plist */,
+			);
+			name = "Supporting Files";
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		8E315A7F173DA85B00050360 /* QuickOpenDerivedData */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 8E315A92173DA85B00050360 /* Build configuration list for PBXNativeTarget "QuickOpenDerivedData" */;
+			buildPhases = (
+				8E315A7C173DA85B00050360 /* Sources */,
+				8E315A7D173DA85B00050360 /* Frameworks */,
+				8E315A7E173DA85B00050360 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = QuickOpenDerivedData;
+			productName = QuickOpenDerivedData;
+			productReference = 8E315A80173DA85B00050360 /* QuickOpenDerivedData.xcplugin */;
+			productType = "com.apple.product-type.bundle";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		8E315A78173DA85B00050360 /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0460;
+				ORGANIZATIONNAME = "HashBang Industries";
+			};
+			buildConfigurationList = 8E315A7B173DA85B00050360 /* Build configuration list for PBXProject "QuickOpenDerivedData" */;
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+			);
+			mainGroup = 8E315A77173DA85B00050360;
+			productRefGroup = 8E315A81173DA85B00050360 /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				8E315A7F173DA85B00050360 /* QuickOpenDerivedData */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		8E315A7E173DA85B00050360 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		8E315A7C173DA85B00050360 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				8E315A97173DA9FB00050360 /* QuickOpenDerivedData.m in Sources */,
+				8E315A9A173DAF0000050360 /* QODDButtonView.m in Sources */,
+				8E315A9D173DB01E00050360 /* QODDDerivedDataHandler.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+		8E315A90173DA85B00050360 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = NO;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				MACOSX_DEPLOYMENT_TARGET = 10.8;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		8E315A91173DA85B00050360 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = YES;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				MACOSX_DEPLOYMENT_TARGET = 10.8;
+				SDKROOT = macosx;
+			};
+			name = Release;
+		};
+		8E315A93173DA85B00050360 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				DEPLOYMENT_LOCATION = YES;
+				DSTROOT = "$(HOME)";
+				GCC_ENABLE_OBJC_GC = supported;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "QuickOpenDerivedData/QuickOpenDerivedData-Prefix.pch";
+				INFOPLIST_FILE = "QuickOpenDerivedData/QuickOpenDerivedData-Info.plist";
+				INSTALL_PATH = "/Library/Application Support/Developer/Shared/Xcode/Plug-ins";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				WRAPPER_EXTENSION = xcplugin;
+			};
+			name = Debug;
+		};
+		8E315A94173DA85B00050360 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				DEPLOYMENT_LOCATION = YES;
+				DSTROOT = "$(HOME)";
+				GCC_ENABLE_OBJC_GC = supported;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "QuickOpenDerivedData/QuickOpenDerivedData-Prefix.pch";
+				INFOPLIST_FILE = "QuickOpenDerivedData/QuickOpenDerivedData-Info.plist";
+				INSTALL_PATH = "/Library/Application Support/Developer/Shared/Xcode/Plug-ins";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				WRAPPER_EXTENSION = xcplugin;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		8E315A7B173DA85B00050360 /* Build configuration list for PBXProject "QuickOpenDerivedData" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				8E315A90173DA85B00050360 /* Debug */,
+				8E315A91173DA85B00050360 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		8E315A92173DA85B00050360 /* Build configuration list for PBXNativeTarget "QuickOpenDerivedData" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				8E315A93173DA85B00050360 /* Debug */,
+				8E315A94173DA85B00050360 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 8E315A78173DA85B00050360 /* Project object */;
+}

QuickOpenDerivedData.xcodeproj/project.xcworkspace/contents.xcworkspacedata

+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "self:QuickOpenDerivedData.xcodeproj">
+   </FileRef>
+</Workspace>
Add a comment to this file

QuickOpenDerivedData.xcodeproj/project.xcworkspace/xcuserdata/dallas.xcuserdatad/UserInterfaceState.xcuserstate

Binary file added.

QuickOpenDerivedData.xcodeproj/xcuserdata/dallas.xcuserdatad/xcschemes/QuickOpenDerivedData.xcscheme

+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "0460"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "8E315A7F173DA85B00050360"
+               BuildableName = "QuickOpenDerivedData.xcplugin"
+               BlueprintName = "QuickOpenDerivedData"
+               ReferencedContainer = "container:QuickOpenDerivedData.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      buildConfiguration = "Debug">
+      <Testables>
+      </Testables>
+   </TestAction>
+   <LaunchAction
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      buildConfiguration = "Debug"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      allowLocationSimulation = "YES">
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      buildConfiguration = "Release"
+      debugDocumentVersioning = "YES">
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>

QuickOpenDerivedData.xcodeproj/xcuserdata/dallas.xcuserdatad/xcschemes/xcschememanagement.plist

+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>SchemeUserState</key>
+	<dict>
+		<key>QuickOpenDerivedData.xcscheme</key>
+		<dict>
+			<key>orderHint</key>
+			<integer>0</integer>
+		</dict>
+	</dict>
+	<key>SuppressBuildableAutocreation</key>
+	<dict>
+		<key>8E315A7F173DA85B00050360</key>
+		<dict>
+			<key>primary</key>
+			<true/>
+		</dict>
+	</dict>
+</dict>
+</plist>

QuickOpenDerivedData/QODDButtonView.h

+//
+//  QODDButtonView.h
+//  QuickOpenDerivedData
+//
+//  Created by Dallas Brown on 5/10/13.
+//  Copyright (c) 2013 HashBang Industries. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import <AppKit/AppKit.h>
+
+@interface QODDButtonView : NSView
+
+@property (nonatomic, retain) NSButton *button;
+@property (nonatomic, assign) NSInteger tag;
+
+@end

QuickOpenDerivedData/QODDButtonView.m

+//
+//  QODDButtonView.m
+//  QuickOpenDerivedData
+//
+//  Created by Dallas Brown on 5/10/13.
+//  Copyright (c) 2013 HashBang Industries. All rights reserved.
+//
+
+#import "QODDButtonView.h"
+
+#define QODD_DEFAULT_BUTTON_WIDTH 118.f
+#define QODD_CONTAINER_MARGIN     2.f
+
+@implementation QODDButtonView
+
+- (id)initWithFrame:(NSRect)frame
+{
+    self = [super initWithFrame:frame];
+    
+	if (self)
+	{
+        _button = [[NSButton alloc] initWithFrame:NSMakeRect(0, 0, [self buttonWidthRelativeToFrame], 20)];
+        _button.autoresizingMask = NSViewWidthSizable;
+		
+        [_button setBezelStyle:NSTexturedRoundedBezelStyle];
+        [[_button cell] setControlSize:NSSmallControlSize];
+        [_button setFont:[NSFont systemFontOfSize:11.0]];
+        [_button setTitle:@"Open DerivedData"];
+        [self addSubview:_button];
+    }
+	
+    return self;
+}
+
+- (BOOL)isOpaque
+{
+    return NO;
+}
+
+- (float) buttonWidthRelativeToFrame
+{
+    return MAX(MIN(QODD_DEFAULT_BUTTON_WIDTH, self.frame.size.width - QODD_CONTAINER_MARGIN * 2), 0);
+}
+
+- (void)resizeSubviewsWithOldSize:(NSSize)oldSize
+{
+    float buttonWidth = [self buttonWidthRelativeToFrame];
+
+    self.button.frame = CGRectMake(self.frame.size.width - buttonWidth - QODD_CONTAINER_MARGIN, self.button.frame.origin.y, buttonWidth, self.button.frame.size.height);
+}
+
+- (void)dealloc
+{
+    [_button release];
+
+    [super dealloc];
+}
+
+@end

QuickOpenDerivedData/QODDDerivedDataHandler.h

+//
+//  QODDDerivedDataHandler.h
+//  QuickOpenDerivedData
+//
+//  Created by Dallas Brown on 5/10/13.
+//  Copyright (c) 2013 HashBang Industries. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import <AppKit/AppKit.h>
+
+@interface QODDDerivedDataHandler : NSObject
+
++ (void)openDerivedDataForProject:(NSString*)projectName;
++ (void)openDerivedDataContainer;
+
+@end

QuickOpenDerivedData/QODDDerivedDataHandler.m

+//
+//  QODDDerivedDataHandler.m
+//  QuickOpenDerivedData
+//
+//  Created by Dallas Brown on 5/10/13.
+//  Copyright (c) 2013 HashBang Industries. All rights reserved.
+//
+
+#import "QODDDerivedDataHandler.h"
+
+
+@interface NSObject (IDEKit)
++ (id) workspaceWindowControllers;
+- (id) derivedDataLocation;
+@end
+
+
+@implementation QODDDerivedDataHandler
+
++ (void)openDerivedDataForProject:(NSString*)projectName
+{
+    NSString *projectPrefix = [projectName stringByReplacingOccurrencesOfString:@" " withString:@"_"];
+
+    for (NSString *subdirectory in [self derivedDataSubdirectoryPaths])
+	{
+        if ([[[subdirectory pathComponents] lastObject] hasPrefix:projectPrefix])
+		{
+            [self openDirectoryAtPath:subdirectory];
+        }
+    }
+}
+
++ (void)openDerivedDataContainer
+{
+    NSString *folder = [self derivedDataLocation];
+
+	[self openDirectoryAtPath:folder];
+}
+
+#pragma mark - Private
+
++ (NSString*)derivedDataLocation
+{
+    NSArray *workspaceWindowControllers = [NSClassFromString(@"IDEWorkspaceWindowController") workspaceWindowControllers];
+
+    if (workspaceWindowControllers.count < 1) return nil;
+	
+    id workspace = [workspaceWindowControllers[0] valueForKey:@"_workspace"];
+    id workspaceArena = [workspace valueForKey:@"_workspaceArena"];
+
+    return [[workspaceArena derivedDataLocation] valueForKey:@"_pathString"];
+}
+
++ (NSArray*)derivedDataSubdirectoryPaths
+{
+    NSMutableArray *workspaceDirectories = [NSMutableArray array];
+
+    NSString *derivedDataPath  = [self derivedDataLocation];
+
+    if (derivedDataPath)
+	{
+        NSError *error = nil;
+
+        NSArray *directories = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:derivedDataPath error:&error];
+
+        if (error)
+		{
+            NSLog(@"QODD: Error while fetching derived data subdirectories: %@", derivedDataPath);
+        }
+		else
+		{
+            for (NSString *subdirectory in directories)
+			{
+                NSString *removablePath = [derivedDataPath stringByAppendingPathComponent:subdirectory];
+                [workspaceDirectories addObject:removablePath];
+            }
+        }
+    }
+
+    return workspaceDirectories;
+}
+
++ (void)openDirectoryAtPath:(NSString*)path
+{
+	NSURL *folderURL = [NSURL fileURLWithPath:path];
+
+	[[NSWorkspace sharedWorkspace] openURL:folderURL];
+}
+
+@end

QuickOpenDerivedData/QuickOpenDerivedData-Info.plist

+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>XC4Compatible</key>
+	<true/>
+	<key>XCPluginHasUI</key>
+	<false/>
+	<key>XCGCReady</key>
+	<true/>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>${EXECUTABLE_NAME}</string>
+	<key>CFBundleIconFile</key>
+	<string></string>
+	<key>CFBundleIdentifier</key>
+	<string>com.hashbangind.${PRODUCT_NAME:rfc1034identifier}</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>${PRODUCT_NAME}</string>
+	<key>CFBundlePackageType</key>
+	<string>BNDL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+	<key>NSHumanReadableCopyright</key>
+	<string>Copyright © 2013 HashBang Industries. All rights reserved.</string>
+	<key>NSPrincipalClass</key>
+	<string></string>
+</dict>
+</plist>

QuickOpenDerivedData/QuickOpenDerivedData-Prefix.pch

+//
+// Prefix header for all source files of the 'QuickOpenDerivedData' target in the 'QuickOpenDerivedData' project
+//
+
+#ifdef __OBJC__
+	#import <Cocoa/Cocoa.h>
+#endif

QuickOpenDerivedData/QuickOpenDerivedData.h

+//
+//  QuickOpenDerivedData.h
+//  QuickOpenDerivedData
+//
+//  Created by Dallas Brown on 5/10/13.
+//  Copyright (c) 2013 HashBang Industries. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import <AppKit/AppKit.h>
+
+@interface QuickOpenDerivedData : NSObject
+
+- (void)openDerivedDataContainer;
+- (void)openDerivedDataForKeyWindow;
+- (void)toggleButtonInTitleBar:(id) sender;
+
+@end

QuickOpenDerivedData/QuickOpenDerivedData.m

+//
+//  QuickOpenDerivedData.m
+//  QuickOpenDerivedData
+//
+//  Created by Dallas Brown on 5/10/13.
+//  Copyright (c) 2013 HashBang Industries. All rights reserved.
+//
+
+#import "QuickOpenDerivedData.h"
+#import "QODDButtonView.h"
+#import "QODDDerivedDataHandler.h"
+
+
+#define QODD_BUTTON_CONTAINER_TAG 974
+#define QODD_MAX_CONTAINER_WIDTH  128.f
+#define QODD_BUTTON_OFFSET_FROM_R 22 // position of button relative to the right edge of the window
+
+#define kQODDShowButtonInTitleBar	@"QODDShowButtonInTitleBar"
+
+
+@interface NSObject (IDEKit)
++ (id) workspaceWindowControllers;
+- (id) derivedDataLocation;
+@end
+
+
+@interface QuickOpenDerivedData()
+
+- (QODDButtonView*)QODDButtonContainerForWindow:(NSWindow*)window;
+- (void)updateTitleBarsFromPreferences;
+
+@end
+
+
+@implementation QuickOpenDerivedData
+
++ (void)pluginDidLoad:(NSBundle *)plugin
+{
+    static id sharedPlugin = nil;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        sharedPlugin = [[self alloc] init];
+    });
+}
+
+- (id)init
+{
+    if (self = [super init]) {
+        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowDidEndLiveResize:) name:NSWindowDidEndLiveResizeNotification object:nil];
+        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateTitleBarsFromPreferences) name:NSWindowDidBecomeKeyNotification object:nil];
+		
+        NSMenuItem *viewMenuItem = [[NSApp mainMenu] itemWithTitle:@"View"];
+        if (viewMenuItem) {
+            [[viewMenuItem submenu] addItem:[NSMenuItem separatorItem]];
+			
+            NSMenuItem *clearItem = [[NSMenuItem alloc] initWithTitle:@"Open Derived Data for Project" action:@selector(openDerivedDataForKeyWindow) keyEquivalent:@"h"];
+            [clearItem setKeyEquivalentModifierMask: NSShiftKeyMask | NSCommandKeyMask];
+            [clearItem setTarget:self];
+            [[viewMenuItem submenu] addItem:clearItem];
+            [clearItem release];
+			
+            NSMenuItem *clearAllItem = [[NSMenuItem alloc] initWithTitle:@"Open Derived Data Container" action:@selector(openDerivedDataContainer) keyEquivalent:@""];
+            [clearAllItem setTarget:self];
+            [[viewMenuItem submenu] addItem:clearAllItem];
+            [clearAllItem release];
+
+            NSMenuItem *toggleButtonInTitleBarItem = [[NSMenuItem alloc] initWithTitle:@"Quick Open Derived Data in Title Bar" action:@selector(toggleButtonInTitleBar:) keyEquivalent:@""];
+            [toggleButtonInTitleBarItem setTarget:self];
+            [[viewMenuItem submenu] addItem:toggleButtonInTitleBarItem];
+            [toggleButtonInTitleBarItem release];
+        }
+		
+    }
+	
+    return self;
+}
+
+#pragma mark -
+#pragma mark DerivedData Management
+
+- (void)openDerivedDataForKeyWindow
+{
+    NSArray *workspaceWindowControllers = [NSClassFromString(@"IDEWorkspaceWindowController") workspaceWindowControllers];
+
+    for (id controller in workspaceWindowControllers)
+	{
+        if ([[controller valueForKey:@"window"] isKeyWindow])
+		{
+            id workspace = [controller valueForKey:@"_workspace"];
+
+			[QODDDerivedDataHandler openDerivedDataForProject:[workspace valueForKey:@"name"]];
+        }
+    }
+}
+
+- (void)openDerivedDataContainer
+{
+    [QODDDerivedDataHandler openDerivedDataContainer];
+}
+
+#pragma mark - GUI Management
+
+- (void)toggleButtonInTitleBar:(id)sender
+{
+    [self setButtonEnabled:![self isButtonEnabled]];
+    [self updateTitleBarsFromPreferences];
+}
+
+- (void)updateTitleBarsFromPreferences
+{
+    @try {
+        NSArray *workspaceWindowControllers = [NSClassFromString(@"IDEWorkspaceWindowController") workspaceWindowControllers];
+        
+		for (NSWindow *window in [workspaceWindowControllers valueForKey:@"window"])
+		{
+            QODDButtonView *buttonView = [self QODDButtonContainerForWindow:window];
+	
+            if (buttonView)
+				[buttonView setHidden:![self isButtonEnabled]];
+        }
+    }
+    @catch (NSException *exception) { }
+}
+
+- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
+{
+    if ([menuItem action] == @selector(toggleButtonInTitleBar:))
+	{
+        [menuItem setState:[self isButtonEnabled] ? NSOnState : NSOffState];
+    }
+    return YES;
+}
+
+- (QODDButtonView*)QODDButtonContainerForWindow:(NSWindow*)window
+{
+    if ([window isKindOfClass:NSClassFromString(@"IDEWorkspaceWindow")])
+	{
+		NSView *windowFrameView = [[window contentView] superview];
+		QODDButtonView *container = [windowFrameView viewWithTag:QODD_BUTTON_CONTAINER_TAG];
+		
+        if (!container) {
+            CGFloat containerWidth = QODD_MAX_CONTAINER_WIDTH;
+            container = [[[QODDButtonView alloc] initWithFrame:NSMakeRect(window.frame.size.width - containerWidth - QODD_BUTTON_OFFSET_FROM_R, windowFrameView.bounds.size.height - 22, containerWidth, 20)] autorelease];
+            container.tag = QODD_BUTTON_CONTAINER_TAG;
+            container.autoresizingMask = NSViewMinXMargin | NSViewMinYMargin | NSViewWidthSizable;
+			
+            container.button.target = self;
+            container.button.action = @selector(openDerivedDataForKeyWindow);
+            
+            [container setHidden:![self isButtonEnabled]];
+            [windowFrameView addSubview:container];
+        }
+        return container;
+    }
+    return nil;
+}
+
+- (void)windowDidEndLiveResize:(NSNotification *) notification
+{
+    NSWindow *window = [notification object];
+    NSView *button = [self QODDButtonContainerForWindow:window].button;
+
+    if (button)
+	{
+        double delayInSeconds   = 0.0;
+        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
+        dispatch_after(popTime, dispatch_get_main_queue(), ^(void) {
+            [button setHidden:![self isButtonEnabled]];
+        });
+    }
+}
+
+#pragma mark -
+#pragma mark Preferences
+
+- (BOOL)isButtonEnabled
+{
+    return [[NSUserDefaults standardUserDefaults] boolForKey:kQODDShowButtonInTitleBar];
+}
+
+- (void) setButtonEnabled: (BOOL) enabled
+{
+    [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:kQODDShowButtonInTitleBar];
+}
+
+#pragma mark -
+
+- (void)dealloc
+{
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+
+	[super dealloc];
+}
+
+@end

QuickOpenDerivedData/en.lproj/InfoPlist.strings

+/* Localized versions of Info.plist keys */
+
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.