├── WAYSourceListWindow.png ├── WAYSourceListWindow Example.png ├── WAYSourceListWindowDemo ├── we-are-yeah@2x.png ├── main.m ├── AppDelegate.h ├── AppDelegate.m ├── Info.plist └── Base.lproj │ └── MainMenu.xib ├── WAYSourceListWindowDemo.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── WAYSourceListWindowDemo.xccheckout └── project.pbxproj ├── LICENSE ├── README.md ├── WAYSourceListWindow ├── WAYSourceListWindow.h └── WAYSourceListWindow.m └── .gitignore /WAYSourceListWindow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/weAreYeah/WAYSourceListWindow/HEAD/WAYSourceListWindow.png -------------------------------------------------------------------------------- /WAYSourceListWindow Example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/weAreYeah/WAYSourceListWindow/HEAD/WAYSourceListWindow Example.png -------------------------------------------------------------------------------- /WAYSourceListWindowDemo/we-are-yeah@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/weAreYeah/WAYSourceListWindow/HEAD/WAYSourceListWindowDemo/we-are-yeah@2x.png -------------------------------------------------------------------------------- /WAYSourceListWindowDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /WAYSourceListWindowDemo/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // WAYSourceListWindowDemo 4 | // 5 | // Created by Raffael Hannemann on 16.11.14. 6 | // Copyright (c) 2014 We Are Yeah!. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, const char * argv[]) { 12 | return NSApplicationMain(argc, argv); 13 | } 14 | -------------------------------------------------------------------------------- /WAYSourceListWindowDemo/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // WAYSourceListWindowDemo 4 | // 5 | // Created by Raffael Hannemann on 16.11.14. 6 | // Copyright (c) 2014 We Are Yeah!. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : NSObject 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /WAYSourceListWindowDemo/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // WAYSourceListWindowDemo 4 | // 5 | // Created by Raffael Hannemann on 16.11.14. 6 | // Copyright (c) 2014 We Are Yeah!. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @interface AppDelegate () 12 | 13 | @property (weak) IBOutlet NSWindow *window; 14 | @end 15 | 16 | @implementation AppDelegate 17 | 18 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 19 | // Insert code here to initialize your application 20 | } 21 | 22 | - (void)applicationWillTerminate:(NSNotification *)aNotification { 23 | // Insert code here to tear down your application 24 | } 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | WAYSourceListWindow 2 | by Raffael Hannemann (@raffael_me, @weAreYeah) 3 | 4 | Licensed under the BSD License http://www.opensource.org/licenses/bsd-license THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /WAYSourceListWindowDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | com.weareyeah.$(PRODUCT_NAME:rfc1034identifier) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSMinimumSystemVersion 26 | $(MACOSX_DEPLOYMENT_TARGET) 27 | NSHumanReadableCopyright 28 | Copyright © 2014 We Are Yeah!. All rights reserved. 29 | NSMainNibFile 30 | MainMenu 31 | NSPrincipalClass 32 | NSApplication 33 | 34 | 35 | -------------------------------------------------------------------------------- /WAYSourceListWindowDemo.xcodeproj/project.xcworkspace/xcshareddata/WAYSourceListWindowDemo.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | B6E980F5-6B0F-4353-B9CA-40FD1B45B2F9 9 | IDESourceControlProjectName 10 | WAYSourceListWindowDemo 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | 64DFD1C8A0A056CA1F6CCF8F80BD45F7F8AD6D2E 14 | https://github.com/weAreYeah/WAYSourceListWindow.git 15 | 16 | IDESourceControlProjectPath 17 | WAYSourceListWindowDemo.xcodeproj 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | 64DFD1C8A0A056CA1F6CCF8F80BD45F7F8AD6D2E 21 | ../.. 22 | 23 | IDESourceControlProjectURL 24 | https://github.com/weAreYeah/WAYSourceListWindow.git 25 | IDESourceControlProjectVersion 26 | 111 27 | IDESourceControlProjectWCCIdentifier 28 | 64DFD1C8A0A056CA1F6CCF8F80BD45F7F8AD6D2E 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | 64DFD1C8A0A056CA1F6CCF8F80BD45F7F8AD6D2E 36 | IDESourceControlWCCName 37 | WAYSourceListWindow 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | WAYSourceListWindow 2 | =================== 3 | 4 | The WAYSourceListWindow is a NSWindow subclass, which splits the window space vertically into the master view on the left, and the detail view on the right side as known from apps like Reminders or Notes. 5 | 6 | The window uses a NSSplitView for the splitting. You should add subviews to instances of this class by setting the masterView and detailView, e.g., via the IBOutlets in Interface Builder. These views will then be added as subviews internally to the masterViewWrapper or detailViewWrapper. 7 | 8 | By default, the Master View uses a Vibrant Light appearance. You can change this as you desire. 9 | 10 | Whenever it makes sense, the properties of your WAYSourceListWindow instance in Interface Builder are inspectable. 11 | 12 | Example 13 | ------- 14 | 15 | ![WAYSourceListWindow](WAYSourceListWindow%20Example.png) 16 | 17 | Usage 18 | ----- 19 | 20 | 1. Drag a new ```NSWindow``` instance to your XIB 21 | 2. Set the class of the instance to ```WAYSourceListWindow``` 22 | 3. Customize the properties via Interface Builder or programmatically 23 | 4. Create two new ```NSView``` instances in Interface Builder 24 | 5. Right-click-drag from your ```WAYSourceListWindow``` instance to one of the views and define it as the Master View. 25 | 5. Right-click-drag from your ```WAYSourceListWindow``` instance to one of the views and define it as the Detail View. 26 | 27 | Explanation 28 | ----------- 29 | 30 | 31 | 32 | 33 | Interesting 34 | ----------- 35 | We are new, weAreYeah.com. 36 | Follow us on [@weAreYeah](http://twitter.com/weAreYeah) for upcoming goodies. 37 | 38 | License 39 | ------- 40 | Licensed under the BSD License 41 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 42 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 43 | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 44 | SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 45 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 46 | TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 47 | BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 48 | STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 49 | THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /WAYSourceListWindow/WAYSourceListWindow.h: -------------------------------------------------------------------------------- 1 | // 2 | // WAYSourceListWindow.h 3 | // WAYSourceListWindow 4 | // 5 | // Created by Raffael Hannemann on 15.11.14. 6 | // Copyright (c) 2014 Raffael Hannemann. All rights reserved. 7 | // Visit weAreYeah.com or follow @weareYeah for updates. 8 | // 9 | // Licensed under the BSD License 10 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 11 | // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 12 | // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 13 | // SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 14 | // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 15 | // TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 16 | // BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 17 | // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 18 | // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 19 | // 20 | 21 | #import 22 | 23 | /** The WAYSourceListWindow is a NSWindow subclass, which splits the window space vertically into the master view on the left, and the detail view on the right side as known from apps like Reminders or Notes. The window uses a NSSplitView for the splitting. You should add subviews to instances of this class by setting the masterView and detailView. These views will then be added internally to the masterViewWrapper or detailViewWrapper. 24 | */ 25 | 26 | NS_CLASS_AVAILABLE_MAC(10_10) 27 | @interface WAYSourceListWindow : NSWindow 28 | 29 | @property (strong) NSSplitView *splitView; 30 | 31 | /// The Master View is the view on the left side of the window 32 | @property (nonatomic,strong) IBOutlet NSView *masterView; 33 | 34 | /// The Detail View is the view on the right side of the window. 35 | @property (nonatomic,strong) IBOutlet NSView *detailView; 36 | 37 | /// The color of the Detail View. Default: white. 38 | @property (nonatomic,copy) IBInspectable NSColor *detailViewBackgroundColor; 39 | 40 | /// The minimum width of the Master View. Default: 150. 41 | @property (nonatomic) IBInspectable CGFloat minimumMasterViewWidth; 42 | 43 | /// The maximum width of the Master View. Default: 300. 44 | @property (nonatomic) IBInspectable CGFloat maximumMasterViewWidth; 45 | 46 | /// The maximum width of the Master View. Default: 200. 47 | @property (nonatomic) IBInspectable CGFloat initialMasterViewWidth; 48 | 49 | /// If set to YES, the Master View will use a Vibrant Dark look, instead of a Vibrant White look. Default: NO. 50 | @property (nonatomic) IBInspectable BOOL darkMasterViewMaterial; 51 | 52 | @end 53 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | ##### 3 | # OS X temporary files that should never be committed 4 | # 5 | # c.f. http://www.westwind.com/reference/os-x/invisibles.html 6 | 7 | .DS_Store 8 | 9 | # c.f. http://www.westwind.com/reference/os-x/invisibles.html 10 | 11 | .Trashes 12 | 13 | # c.f. http://www.westwind.com/reference/os-x/invisibles.html 14 | 15 | *.swp 16 | 17 | # 18 | # *.lock - this is used and abused by many editors for many different things. 19 | # For the main ones I use (e.g. Eclipse), it should be excluded 20 | # from source-control, but YMMV. 21 | # (lock files are usually local-only file-synchronization on the local FS that should NOT go in git) 22 | # c.f. the "OPTIONAL" section at bottom though, for tool-specific variations! 23 | 24 | *.lock 25 | 26 | 27 | # 28 | # profile - REMOVED temporarily (on double-checking, I can't find it in OS X docs?) 29 | #profile 30 | 31 | 32 | #### 33 | # Xcode temporary files that should never be committed 34 | # 35 | # NB: NIB/XIB files still exist even on Storyboard projects, so we want this... 36 | 37 | *~.nib 38 | 39 | 40 | #### 41 | # Xcode build files - 42 | # 43 | # NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "DerivedData" 44 | 45 | DerivedData/ 46 | 47 | # NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "build" 48 | 49 | build/ 50 | 51 | 52 | ##### 53 | # Xcode private settings (window sizes, bookmarks, breakpoints, custom executables, smart groups) 54 | # 55 | # This is complicated: 56 | # 57 | # SOMETIMES you need to put this file in version control. 58 | # Apple designed it poorly - if you use "custom executables", they are 59 | # saved in this file. 60 | # 99% of projects do NOT use those, so they do NOT want to version control this file. 61 | # ..but if you're in the 1%, comment out the line "*.pbxuser" 62 | 63 | # .pbxuser: http://lists.apple.com/archives/xcode-users/2004/Jan/msg00193.html 64 | 65 | *.pbxuser 66 | 67 | # .mode1v3: http://lists.apple.com/archives/xcode-users/2007/Oct/msg00465.html 68 | 69 | *.mode1v3 70 | 71 | # .mode2v3: http://lists.apple.com/archives/xcode-users/2007/Oct/msg00465.html 72 | 73 | *.mode2v3 74 | 75 | # .perspectivev3: http://stackoverflow.com/questions/5223297/xcode-projects-what-is-a-perspectivev3-file 76 | 77 | *.perspectivev3 78 | 79 | # NB: also, whitelist the default ones, some projects need to use these 80 | !default.pbxuser 81 | !default.mode1v3 82 | !default.mode2v3 83 | !default.perspectivev3 84 | 85 | 86 | #### 87 | # Xcode 4 - semi-personal settings 88 | # 89 | # 90 | # OPTION 1: --------------------------------- 91 | # throw away ALL personal settings (including custom schemes! 92 | # - unless they are "shared") 93 | # 94 | # NB: this is exclusive with OPTION 2 below 95 | xcuserdata 96 | 97 | # OPTION 2: --------------------------------- 98 | # get rid of ALL personal settings, but KEEP SOME OF THEM 99 | # - NB: you must manually uncomment the bits you want to keep 100 | # 101 | # NB: this *requires* git v1.8.2 or above; you may need to upgrade to latest OS X, 102 | # or manually install git over the top of the OS X version 103 | # NB: this is exclusive with OPTION 1 above 104 | # 105 | #xcuserdata/**/* 106 | 107 | # (requires option 2 above): Personal Schemes 108 | # 109 | #!xcuserdata/**/xcschemes/* 110 | 111 | #### 112 | # XCode 4 workspaces - more detailed 113 | # 114 | # Workspaces are important! They are a core feature of Xcode - don't exclude them :) 115 | # 116 | # Workspace layout is quite spammy. For reference: 117 | # 118 | # /(root)/ 119 | # /(project-name).xcodeproj/ 120 | # project.pbxproj 121 | # /project.xcworkspace/ 122 | # contents.xcworkspacedata 123 | # /xcuserdata/ 124 | # /(your name)/xcuserdatad/ 125 | # UserInterfaceState.xcuserstate 126 | # /xcsshareddata/ 127 | # /xcschemes/ 128 | # (shared scheme name).xcscheme 129 | # /xcuserdata/ 130 | # /(your name)/xcuserdatad/ 131 | # (private scheme).xcscheme 132 | # xcschememanagement.plist 133 | # 134 | # 135 | 136 | #### 137 | # Xcode 4 - Deprecated classes 138 | # 139 | # Allegedly, if you manually "deprecate" your classes, they get moved here. 140 | # 141 | # We're using source-control, so this is a "feature" that we do not want! 142 | 143 | *.moved-aside 144 | 145 | #### 146 | # OPTIONAL: Some well-known tools that people use side-by-side with Xcode / iOS development 147 | # 148 | # NB: I'd rather not include these here, but gitignore's design is weak and doesn't allow 149 | # modular gitignore: you have to put EVERYTHING in one file. 150 | # 151 | # COCOAPODS: 152 | # 153 | # c.f. http://guides.cocoapods.org/using/using-cocoapods.html#what-is-a-podfilelock 154 | # c.f. http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 155 | # 156 | #!Podfile.lock 157 | # 158 | # RUBY: 159 | # 160 | # c.f. http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/ 161 | # 162 | #!Gemfile.lock 163 | # 164 | # IDEA: 165 | # 166 | #.idea 167 | # 168 | # TEXTMATE: 169 | # 170 | # -- UNVERIFIED: c.f. http://stackoverflow.com/a/50283/153422 171 | # 172 | #tm_build_errors 173 | 174 | #### 175 | # UNKNOWN: recommended by others, but I can't discover what these files are 176 | # 177 | # Community suggestions (unverified, no evidence available - DISABLED by default) 178 | # 179 | # 1. Xcode 5 - VCS file 180 | # 181 | # "The data in this file not represent state of your project. 182 | # If you'll leave this file in git - you will have merge conflicts during 183 | # pull your cahnges to other's repo" 184 | # 185 | #*.xccheckout -------------------------------------------------------------------------------- /WAYSourceListWindow/WAYSourceListWindow.m: -------------------------------------------------------------------------------- 1 | // 2 | // WAYSourceListWindow.h 3 | // WAYSourceListWindow 4 | // 5 | // Created by Raffael Hannemann on 15.11.14. 6 | // Copyright (c) 2014 Raffael Hannemann. All rights reserved. 7 | // Visit weAreYeah.com or follow @weareYeah for updates. 8 | // 9 | // Licensed under the BSD License 10 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 11 | // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 12 | // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 13 | // SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 14 | // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 15 | // TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 16 | // BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 17 | // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 18 | // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 19 | // 20 | 21 | #import "WAYSourceListWindow.h" 22 | 23 | #define kWAYSourceListWindowDefaultMinimumMasterViewWidth 150 24 | #define kWAYSourceListWindowDefautInitialMasterViewWidth 200 25 | #define kWAYSourceListWindowDefaultMaximumMasterViewWidth 300 26 | #define kWAYSourceListWindowDefaultDarkMasterViewMaterial NO 27 | #define kWAYSourceListWindowDefaultDetailViewBackgroundColor [NSColor whiteColor] 28 | 29 | /** This NSSplitView subclass allows to define a custom divider color. */ 30 | @interface WAYSourceListSplitView : NSSplitView 31 | @property (strong) NSColor *customDividerColor; 32 | @end 33 | 34 | @implementation WAYSourceListSplitView 35 | - (NSColor *) dividerColor { 36 | return _customDividerColor; 37 | } 38 | @end 39 | 40 | @interface WAYSourceListWindow () 41 | @property (strong) NSView *customContentView; 42 | @property (strong) NSVisualEffectView *masterViewWrapper; 43 | @property (strong) NSView *detailViewWrapper; 44 | @end 45 | 46 | @implementation WAYSourceListWindow 47 | 48 | #pragma mark - NSWindow Overwritings 49 | 50 | - (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag { 51 | if ((self = [super initWithContentRect:contentRect styleMask:aStyle backing:bufferingType defer:flag])) { 52 | [self setUp]; 53 | } 54 | return self; 55 | } 56 | 57 | - (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag screen:(NSScreen *)screen { 58 | if ((self = [super initWithContentRect:contentRect styleMask:aStyle backing:bufferingType defer:flag screen:screen])) { 59 | [self setUp]; 60 | } 61 | return self; 62 | } 63 | 64 | - (void) awakeFromNib { 65 | 66 | } 67 | 68 | - (void) setInitialMasterViewWidth:(CGFloat)initialMasterViewWidth { 69 | _initialMasterViewWidth = initialMasterViewWidth; 70 | [self setMasterViewWidth: _initialMasterViewWidth]; 71 | } 72 | 73 | - (void) setDetailViewBackgroundColor:(NSColor *)detailViewBackgroundColor { 74 | _detailViewBackgroundColor = detailViewBackgroundColor.copy; 75 | [self.detailViewWrapper.layer setBackgroundColor:_detailViewBackgroundColor.CGColor]; 76 | 77 | // The divider color is automatically set to a darker variant of the background color 78 | CGFloat red = 0; 79 | CGFloat green = 0; 80 | CGFloat blue = 0; 81 | CGFloat factor = 0.7; 82 | if ([_detailViewBackgroundColor.colorSpace isEqual:[NSColorSpace genericGrayColorSpace]]) { 83 | red = _detailViewBackgroundColor.whiteComponent*factor; 84 | green = _detailViewBackgroundColor.whiteComponent*factor; 85 | blue = _detailViewBackgroundColor.whiteComponent*factor; 86 | } else { 87 | red = _detailViewBackgroundColor.redComponent*factor; 88 | green = _detailViewBackgroundColor.greenComponent*factor; 89 | blue = _detailViewBackgroundColor.blueComponent*factor; 90 | } 91 | 92 | NSColor *darkenedColor = [NSColor colorWithCalibratedRed:red green:green blue:blue alpha:1.0]; 93 | [(WAYSourceListSplitView *)self.splitView setCustomDividerColor:darkenedColor]; 94 | } 95 | 96 | - (void) setDarkMasterViewMaterial:(BOOL)darkMasterViewMaterial { 97 | _darkMasterViewMaterial = darkMasterViewMaterial; 98 | [self.masterViewWrapper setMaterial:_darkMasterViewMaterial?NSVisualEffectMaterialDark:NSVisualEffectMaterialLight]; 99 | [self.masterViewWrapper setAppearance:[NSAppearance appearanceNamed:_darkMasterViewMaterial?NSAppearanceNameVibrantDark:NSAppearanceNameVibrantLight]]; 100 | } 101 | 102 | - (void) setMasterView:(NSView *)view { 103 | [view removeFromSuperview]; 104 | [view setFrame:self.masterViewWrapper.bounds]; 105 | [view setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; 106 | 107 | if (_masterView) { 108 | [_masterView removeFromSuperview]; 109 | } 110 | _masterView = view; 111 | [self.masterViewWrapper addSubview:_masterView]; 112 | } 113 | 114 | - (void) setMasterViewWidth: (CGFloat) masterViewWidth { 115 | [self.splitView setPosition:masterViewWidth ofDividerAtIndex:0]; 116 | [self setNeedsLayout]; 117 | } 118 | 119 | - (void) setDetailView:(NSView *)view { 120 | [view removeFromSuperview]; 121 | [view setFrame:self.detailViewWrapper.bounds]; 122 | [view setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; 123 | 124 | if (_detailView) { 125 | [_detailView removeFromSuperview]; 126 | } 127 | _detailView = view; 128 | [self.detailViewWrapper addSubview:_detailView]; 129 | } 130 | 131 | - (void) setUp { 132 | 133 | [self setTitleVisibility:NSWindowTitleHidden]; 134 | [self setTitlebarAppearsTransparent:YES]; 135 | self.styleMask |= NSFullSizeContentViewWindowMask; 136 | 137 | WAYSourceListSplitView *splitView = [[WAYSourceListSplitView alloc] initWithFrame:NSMakeRect(0, 0, NSWidth(self.frame), NSHeight(self.frame))]; 138 | [splitView setVertical:YES]; 139 | self.splitView = splitView; 140 | 141 | self.masterViewWrapper = [[NSVisualEffectView alloc] initWithFrame:NSMakeRect(0, 0, kWAYSourceListWindowDefautInitialMasterViewWidth, NSHeight(self.frame))]; 142 | 143 | [self setDarkMasterViewMaterial:kWAYSourceListWindowDefaultDarkMasterViewMaterial]; 144 | [self.masterViewWrapper setBlendingMode:NSVisualEffectBlendingModeBehindWindow]; 145 | 146 | self.detailViewWrapper = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, NSWidth(self.frame)-kWAYSourceListWindowDefaultMinimumMasterViewWidth, NSHeight(self.frame))]; 147 | 148 | [self.detailViewWrapper setWantsLayer:YES]; 149 | [self setDetailViewBackgroundColor:kWAYSourceListWindowDefaultDetailViewBackgroundColor]; 150 | 151 | [self.splitView addSubview:self.masterViewWrapper]; 152 | [self.splitView addSubview:self.detailViewWrapper]; 153 | [self.splitView setDividerStyle:NSSplitViewDividerStyleThin]; 154 | [self.splitView setDelegate:self]; 155 | 156 | [self.splitView adjustSubviews]; 157 | [self.splitView setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; 158 | 159 | [self.contentView addSubview:self.splitView]; 160 | 161 | self.minimumMasterViewWidth = kWAYSourceListWindowDefaultMinimumMasterViewWidth; 162 | self.maximumMasterViewWidth = kWAYSourceListWindowDefaultMaximumMasterViewWidth; 163 | } 164 | 165 | - (void) restoreStateWithCoder:(NSCoder *)coder { 166 | [super restoreStateWithCoder:coder]; 167 | [self setNeedsLayout]; 168 | } 169 | 170 | - (void) setContentView:(id)contentView { 171 | if ([contentView subviews].count>0) { 172 | NSLog(@"WARNING: %@ does not allow to add subviews to a %@'s instance content view in Interface Builder. Add the subview(s) to the master or detail view instead directly.", [self className], [self className]); 173 | } 174 | 175 | if (self.customContentView) return; 176 | self.customContentView = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 10, 10)]; 177 | [super setContentView:self.customContentView]; 178 | } 179 | 180 | - (void) setNeedsLayout { 181 | NSRect tmpRect = [self.splitView bounds]; 182 | NSArray *subviews = [self.splitView subviews]; 183 | NSView *collectionsSide = [subviews objectAtIndex:0]; 184 | NSView *tableSide = [subviews objectAtIndex:1]; 185 | float colllectionWidth = [collectionsSide bounds].size.width; 186 | 187 | tmpRect.size.width = tmpRect.size.width - colllectionWidth + 1; 188 | tmpRect.origin.x = tmpRect.origin.x + colllectionWidth + 1; 189 | [tableSide setFrame:tmpRect]; 190 | 191 | tmpRect.size.width = colllectionWidth; 192 | tmpRect.origin.x = 0; 193 | [collectionsSide setFrame:tmpRect]; 194 | } 195 | 196 | #pragma mark - NSSplitView Delegate 197 | - (CGFloat) splitView:(NSSplitView *)splitView constrainMaxCoordinate:(CGFloat)proposedMaximumPosition ofSubviewAt:(NSInteger)dividerIndex { 198 | return MIN(proposedMaximumPosition, self.maximumMasterViewWidth); 199 | } 200 | 201 | - (CGFloat) splitView:(NSSplitView *)splitView constrainMinCoordinate:(CGFloat)proposedMinimumPosition ofSubviewAt:(NSInteger)dividerIndex { 202 | return MAX(proposedMinimumPosition, self.minimumMasterViewWidth); 203 | } 204 | 205 | - (BOOL) splitView:(NSSplitView *)splitView shouldAdjustSizeOfSubview:(NSView *)view { 206 | return view == self.detailViewWrapper; 207 | } 208 | 209 | @end 210 | -------------------------------------------------------------------------------- /WAYSourceListWindowDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 4D06F64D1A18B5A500B725C6 /* we-are-yeah@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4D06F64C1A18B5A500B725C6 /* we-are-yeah@2x.png */; }; 11 | 4D06F6511A18BBE000B725C6 /* WAYSourceListWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D06F6501A18BBE000B725C6 /* WAYSourceListWindow.m */; }; 12 | 4DF97B101A189CC200351BC9 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DF97B0F1A189CC200351BC9 /* AppDelegate.m */; }; 13 | 4DF97B121A189CC200351BC9 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DF97B111A189CC200351BC9 /* main.m */; }; 14 | 4DF97B171A189CC200351BC9 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4DF97B151A189CC200351BC9 /* MainMenu.xib */; }; 15 | /* End PBXBuildFile section */ 16 | 17 | /* Begin PBXFileReference section */ 18 | 4D06F64C1A18B5A500B725C6 /* we-are-yeah@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "we-are-yeah@2x.png"; sourceTree = ""; }; 19 | 4D06F64F1A18BBE000B725C6 /* WAYSourceListWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WAYSourceListWindow.h; sourceTree = ""; }; 20 | 4D06F6501A18BBE000B725C6 /* WAYSourceListWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WAYSourceListWindow.m; sourceTree = ""; }; 21 | 4DF97B091A189CC200351BC9 /* WAYSourceListWindowDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WAYSourceListWindowDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 22 | 4DF97B0D1A189CC200351BC9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 23 | 4DF97B0E1A189CC200351BC9 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.objj.h; path = AppDelegate.h; sourceTree = ""; }; 24 | 4DF97B0F1A189CC200351BC9 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 25 | 4DF97B111A189CC200351BC9 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 26 | 4DF97B161A189CC200351BC9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 27 | /* End PBXFileReference section */ 28 | 29 | /* Begin PBXFrameworksBuildPhase section */ 30 | 4DF97B061A189CC200351BC9 /* Frameworks */ = { 31 | isa = PBXFrameworksBuildPhase; 32 | buildActionMask = 2147483647; 33 | files = ( 34 | ); 35 | runOnlyForDeploymentPostprocessing = 0; 36 | }; 37 | /* End PBXFrameworksBuildPhase section */ 38 | 39 | /* Begin PBXGroup section */ 40 | 4D06F64E1A18BBE000B725C6 /* WAYSourceListWindow */ = { 41 | isa = PBXGroup; 42 | children = ( 43 | 4D06F64F1A18BBE000B725C6 /* WAYSourceListWindow.h */, 44 | 4D06F6501A18BBE000B725C6 /* WAYSourceListWindow.m */, 45 | ); 46 | path = WAYSourceListWindow; 47 | sourceTree = ""; 48 | }; 49 | 4DF97B001A189CC200351BC9 = { 50 | isa = PBXGroup; 51 | children = ( 52 | 4D06F64E1A18BBE000B725C6 /* WAYSourceListWindow */, 53 | 4DF97B0B1A189CC200351BC9 /* WAYSourceListWindow */, 54 | 4DF97B0A1A189CC200351BC9 /* Products */, 55 | ); 56 | sourceTree = ""; 57 | }; 58 | 4DF97B0A1A189CC200351BC9 /* Products */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 4DF97B091A189CC200351BC9 /* WAYSourceListWindowDemo.app */, 62 | ); 63 | name = Products; 64 | sourceTree = ""; 65 | }; 66 | 4DF97B0B1A189CC200351BC9 /* WAYSourceListWindow */ = { 67 | isa = PBXGroup; 68 | children = ( 69 | 4DF97B0E1A189CC200351BC9 /* AppDelegate.h */, 70 | 4DF97B0F1A189CC200351BC9 /* AppDelegate.m */, 71 | 4D06F64C1A18B5A500B725C6 /* we-are-yeah@2x.png */, 72 | 4DF97B151A189CC200351BC9 /* MainMenu.xib */, 73 | 4DF97B0C1A189CC200351BC9 /* Supporting Files */, 74 | ); 75 | name = WAYSourceListWindow; 76 | path = WAYSourceListWindowDemo; 77 | sourceTree = ""; 78 | }; 79 | 4DF97B0C1A189CC200351BC9 /* Supporting Files */ = { 80 | isa = PBXGroup; 81 | children = ( 82 | 4DF97B0D1A189CC200351BC9 /* Info.plist */, 83 | 4DF97B111A189CC200351BC9 /* main.m */, 84 | ); 85 | name = "Supporting Files"; 86 | sourceTree = ""; 87 | }; 88 | /* End PBXGroup section */ 89 | 90 | /* Begin PBXNativeTarget section */ 91 | 4DF97B081A189CC200351BC9 /* WAYSourceListWindowDemo */ = { 92 | isa = PBXNativeTarget; 93 | buildConfigurationList = 4DF97B261A189CC200351BC9 /* Build configuration list for PBXNativeTarget "WAYSourceListWindowDemo" */; 94 | buildPhases = ( 95 | 4DF97B051A189CC200351BC9 /* Sources */, 96 | 4DF97B061A189CC200351BC9 /* Frameworks */, 97 | 4DF97B071A189CC200351BC9 /* Resources */, 98 | ); 99 | buildRules = ( 100 | ); 101 | dependencies = ( 102 | ); 103 | name = WAYSourceListWindowDemo; 104 | productName = WAYSourceListWindow; 105 | productReference = 4DF97B091A189CC200351BC9 /* WAYSourceListWindowDemo.app */; 106 | productType = "com.apple.product-type.application"; 107 | }; 108 | /* End PBXNativeTarget section */ 109 | 110 | /* Begin PBXProject section */ 111 | 4DF97B011A189CC200351BC9 /* Project object */ = { 112 | isa = PBXProject; 113 | attributes = { 114 | LastUpgradeCheck = 0610; 115 | ORGANIZATIONNAME = "We Are Yeah!"; 116 | TargetAttributes = { 117 | 4DF97B081A189CC200351BC9 = { 118 | CreatedOnToolsVersion = 6.1; 119 | }; 120 | }; 121 | }; 122 | buildConfigurationList = 4DF97B041A189CC200351BC9 /* Build configuration list for PBXProject "WAYSourceListWindowDemo" */; 123 | compatibilityVersion = "Xcode 3.2"; 124 | developmentRegion = English; 125 | hasScannedForEncodings = 0; 126 | knownRegions = ( 127 | en, 128 | Base, 129 | ); 130 | mainGroup = 4DF97B001A189CC200351BC9; 131 | productRefGroup = 4DF97B0A1A189CC200351BC9 /* Products */; 132 | projectDirPath = ""; 133 | projectRoot = ""; 134 | targets = ( 135 | 4DF97B081A189CC200351BC9 /* WAYSourceListWindowDemo */, 136 | ); 137 | }; 138 | /* End PBXProject section */ 139 | 140 | /* Begin PBXResourcesBuildPhase section */ 141 | 4DF97B071A189CC200351BC9 /* Resources */ = { 142 | isa = PBXResourcesBuildPhase; 143 | buildActionMask = 2147483647; 144 | files = ( 145 | 4D06F64D1A18B5A500B725C6 /* we-are-yeah@2x.png in Resources */, 146 | 4DF97B171A189CC200351BC9 /* MainMenu.xib in Resources */, 147 | ); 148 | runOnlyForDeploymentPostprocessing = 0; 149 | }; 150 | /* End PBXResourcesBuildPhase section */ 151 | 152 | /* Begin PBXSourcesBuildPhase section */ 153 | 4DF97B051A189CC200351BC9 /* Sources */ = { 154 | isa = PBXSourcesBuildPhase; 155 | buildActionMask = 2147483647; 156 | files = ( 157 | 4DF97B121A189CC200351BC9 /* main.m in Sources */, 158 | 4DF97B101A189CC200351BC9 /* AppDelegate.m in Sources */, 159 | 4D06F6511A18BBE000B725C6 /* WAYSourceListWindow.m in Sources */, 160 | ); 161 | runOnlyForDeploymentPostprocessing = 0; 162 | }; 163 | /* End PBXSourcesBuildPhase section */ 164 | 165 | /* Begin PBXVariantGroup section */ 166 | 4DF97B151A189CC200351BC9 /* MainMenu.xib */ = { 167 | isa = PBXVariantGroup; 168 | children = ( 169 | 4DF97B161A189CC200351BC9 /* Base */, 170 | ); 171 | name = MainMenu.xib; 172 | sourceTree = ""; 173 | }; 174 | /* End PBXVariantGroup section */ 175 | 176 | /* Begin XCBuildConfiguration section */ 177 | 4DF97B241A189CC200351BC9 /* Debug */ = { 178 | isa = XCBuildConfiguration; 179 | buildSettings = { 180 | ALWAYS_SEARCH_USER_PATHS = NO; 181 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 182 | CLANG_CXX_LIBRARY = "libc++"; 183 | CLANG_ENABLE_MODULES = YES; 184 | CLANG_ENABLE_OBJC_ARC = YES; 185 | CLANG_WARN_BOOL_CONVERSION = YES; 186 | CLANG_WARN_CONSTANT_CONVERSION = YES; 187 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 188 | CLANG_WARN_EMPTY_BODY = YES; 189 | CLANG_WARN_ENUM_CONVERSION = YES; 190 | CLANG_WARN_INT_CONVERSION = YES; 191 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 192 | CLANG_WARN_UNREACHABLE_CODE = YES; 193 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 194 | CODE_SIGN_IDENTITY = "-"; 195 | COPY_PHASE_STRIP = NO; 196 | ENABLE_STRICT_OBJC_MSGSEND = YES; 197 | GCC_C_LANGUAGE_STANDARD = gnu99; 198 | GCC_DYNAMIC_NO_PIC = NO; 199 | GCC_OPTIMIZATION_LEVEL = 0; 200 | GCC_PREPROCESSOR_DEFINITIONS = ( 201 | "DEBUG=1", 202 | "$(inherited)", 203 | ); 204 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 205 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 206 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 207 | GCC_WARN_UNDECLARED_SELECTOR = YES; 208 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 209 | GCC_WARN_UNUSED_FUNCTION = YES; 210 | GCC_WARN_UNUSED_VARIABLE = YES; 211 | MACOSX_DEPLOYMENT_TARGET = 10.10; 212 | MTL_ENABLE_DEBUG_INFO = YES; 213 | ONLY_ACTIVE_ARCH = YES; 214 | SDKROOT = macosx; 215 | }; 216 | name = Debug; 217 | }; 218 | 4DF97B251A189CC200351BC9 /* Release */ = { 219 | isa = XCBuildConfiguration; 220 | buildSettings = { 221 | ALWAYS_SEARCH_USER_PATHS = NO; 222 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 223 | CLANG_CXX_LIBRARY = "libc++"; 224 | CLANG_ENABLE_MODULES = YES; 225 | CLANG_ENABLE_OBJC_ARC = YES; 226 | CLANG_WARN_BOOL_CONVERSION = YES; 227 | CLANG_WARN_CONSTANT_CONVERSION = YES; 228 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 229 | CLANG_WARN_EMPTY_BODY = YES; 230 | CLANG_WARN_ENUM_CONVERSION = YES; 231 | CLANG_WARN_INT_CONVERSION = YES; 232 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 233 | CLANG_WARN_UNREACHABLE_CODE = YES; 234 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 235 | CODE_SIGN_IDENTITY = "-"; 236 | COPY_PHASE_STRIP = YES; 237 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 238 | ENABLE_NS_ASSERTIONS = NO; 239 | ENABLE_STRICT_OBJC_MSGSEND = YES; 240 | GCC_C_LANGUAGE_STANDARD = gnu99; 241 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 242 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 243 | GCC_WARN_UNDECLARED_SELECTOR = YES; 244 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 245 | GCC_WARN_UNUSED_FUNCTION = YES; 246 | GCC_WARN_UNUSED_VARIABLE = YES; 247 | MACOSX_DEPLOYMENT_TARGET = 10.10; 248 | MTL_ENABLE_DEBUG_INFO = NO; 249 | SDKROOT = macosx; 250 | }; 251 | name = Release; 252 | }; 253 | 4DF97B271A189CC200351BC9 /* Debug */ = { 254 | isa = XCBuildConfiguration; 255 | buildSettings = { 256 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 257 | COMBINE_HIDPI_IMAGES = YES; 258 | INFOPLIST_FILE = "$(SRCROOT)/WAYSourceListWindowDemo/Info.plist"; 259 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 260 | MACOSX_DEPLOYMENT_TARGET = 10.10; 261 | PRODUCT_NAME = WAYSourceListWindowDemo; 262 | }; 263 | name = Debug; 264 | }; 265 | 4DF97B281A189CC200351BC9 /* Release */ = { 266 | isa = XCBuildConfiguration; 267 | buildSettings = { 268 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 269 | COMBINE_HIDPI_IMAGES = YES; 270 | INFOPLIST_FILE = "$(SRCROOT)/WAYSourceListWindowDemo/Info.plist"; 271 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 272 | MACOSX_DEPLOYMENT_TARGET = 10.10; 273 | PRODUCT_NAME = WAYSourceListWindowDemo; 274 | }; 275 | name = Release; 276 | }; 277 | /* End XCBuildConfiguration section */ 278 | 279 | /* Begin XCConfigurationList section */ 280 | 4DF97B041A189CC200351BC9 /* Build configuration list for PBXProject "WAYSourceListWindowDemo" */ = { 281 | isa = XCConfigurationList; 282 | buildConfigurations = ( 283 | 4DF97B241A189CC200351BC9 /* Debug */, 284 | 4DF97B251A189CC200351BC9 /* Release */, 285 | ); 286 | defaultConfigurationIsVisible = 0; 287 | defaultConfigurationName = Release; 288 | }; 289 | 4DF97B261A189CC200351BC9 /* Build configuration list for PBXNativeTarget "WAYSourceListWindowDemo" */ = { 290 | isa = XCConfigurationList; 291 | buildConfigurations = ( 292 | 4DF97B271A189CC200351BC9 /* Debug */, 293 | 4DF97B281A189CC200351BC9 /* Release */, 294 | ); 295 | defaultConfigurationIsVisible = 0; 296 | defaultConfigurationName = Release; 297 | }; 298 | /* End XCConfigurationList section */ 299 | }; 300 | rootObject = 4DF97B011A189CC200351BC9 /* Project object */; 301 | } 302 | -------------------------------------------------------------------------------- /WAYSourceListWindowDemo/Base.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | Default 539 | 540 | 541 | 542 | 543 | 544 | 545 | Left to Right 546 | 547 | 548 | 549 | 550 | 551 | 552 | Right to Left 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | Default 564 | 565 | 566 | 567 | 568 | 569 | 570 | Left to Right 571 | 572 | 573 | 574 | 575 | 576 | 577 | Right to Left 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | --------------------------------------------------------------------------------