├── .gitignore ├── DBPrefsWindowController.xcodeproj ├── project.pbxproj └── project.xcworkspace │ └── contents.xcworkspacedata ├── README.md ├── Resources ├── Advanced.png ├── Colors.tiff ├── English.lproj │ └── MainMenu.xib ├── General.png ├── Info.plist ├── Playback.tiff ├── Preferences.xib └── Updates.tiff ├── Source ├── AppController.h ├── AppController.m ├── AppPrefsWindowController.h ├── AppPrefsWindowController.m ├── DBPrefsWindowController.h ├── DBPrefsWindowController.m └── main.m └── prefswindow.png /.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | .DS_Store 3 | *.pbxuser 4 | *.perspectivev3 5 | xcuserdata 6 | *.zip 7 | *.app 8 | dsa_priv.pem 9 | *.pyc 10 | -------------------------------------------------------------------------------- /DBPrefsWindowController.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 31CF33040B3EF55E00359553 /* AppController.m in Sources */ = {isa = PBXBuildFile; fileRef = 31CF33030B3EF55E00359553 /* AppController.m */; }; 11 | 31CF330B0B3EF57E00359553 /* DBPrefsWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 31CF330A0B3EF57E00359553 /* DBPrefsWindowController.m */; }; 12 | 3E7A778F0BA325F4006CEBA9 /* Updates.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 3E7A778E0BA325F4006CEBA9 /* Updates.tiff */; }; 13 | 3E7A77910BA3261F006CEBA9 /* Colors.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 3E7A77900BA3261F006CEBA9 /* Colors.tiff */; }; 14 | 3E7A77940BA32641006CEBA9 /* Playback.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 3E7A77930BA32641006CEBA9 /* Playback.tiff */; }; 15 | 3ED08F3A0B9F00D80091ED60 /* AppPrefsWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3ED08F390B9F00D80091ED60 /* AppPrefsWindowController.m */; }; 16 | 3EFD779E0BA35B1E00864CFF /* Advanced.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EFD779D0BA35B1E00864CFF /* Advanced.png */; }; 17 | 3EFD77A40BA35B7800864CFF /* General.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EFD77A30BA35B7800864CFF /* General.png */; }; 18 | 732FFA561598E26400546247 /* Preferences.xib in Resources */ = {isa = PBXBuildFile; fileRef = 732FFA551598E26400546247 /* Preferences.xib */; }; 19 | 732FFA591598E26C00546247 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 732FFA571598E26C00546247 /* MainMenu.xib */; }; 20 | 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 21 | 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 22 | /* End PBXBuildFile section */ 23 | 24 | /* Begin PBXFileReference section */ 25 | 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 26 | 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 27 | 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 28 | 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 29 | 31CF33020B3EF55E00359553 /* AppController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppController.h; sourceTree = ""; }; 30 | 31CF33030B3EF55E00359553 /* AppController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppController.m; sourceTree = ""; }; 31 | 31CF33090B3EF57E00359553 /* DBPrefsWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBPrefsWindowController.h; sourceTree = ""; }; 32 | 31CF330A0B3EF57E00359553 /* DBPrefsWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DBPrefsWindowController.m; sourceTree = ""; }; 33 | 3E7A778E0BA325F4006CEBA9 /* Updates.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = Updates.tiff; sourceTree = ""; }; 34 | 3E7A77900BA3261F006CEBA9 /* Colors.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = Colors.tiff; sourceTree = ""; }; 35 | 3E7A77930BA32641006CEBA9 /* Playback.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = Playback.tiff; sourceTree = ""; }; 36 | 3ED08F380B9F00D80091ED60 /* AppPrefsWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppPrefsWindowController.h; sourceTree = ""; }; 37 | 3ED08F390B9F00D80091ED60 /* AppPrefsWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppPrefsWindowController.m; sourceTree = ""; }; 38 | 3EFD779D0BA35B1E00864CFF /* Advanced.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Advanced.png; sourceTree = ""; }; 39 | 3EFD77A30BA35B7800864CFF /* General.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = General.png; sourceTree = ""; }; 40 | 732FFA551598E26400546247 /* Preferences.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = Preferences.xib; sourceTree = ""; }; 41 | 732FFA581598E26C00546247 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = ""; }; 42 | 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 43 | 8D1107320486CEB800E47090 /* DBPrefsWindowController.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DBPrefsWindowController.app; sourceTree = BUILT_PRODUCTS_DIR; }; 44 | /* End PBXFileReference section */ 45 | 46 | /* Begin PBXFrameworksBuildPhase section */ 47 | 8D11072E0486CEB800E47090 /* Frameworks */ = { 48 | isa = PBXFrameworksBuildPhase; 49 | buildActionMask = 2147483647; 50 | files = ( 51 | 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | 080E96DDFE201D6D7F000001 /* Classes */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 31CF33020B3EF55E00359553 /* AppController.h */, 62 | 31CF33030B3EF55E00359553 /* AppController.m */, 63 | 3ED08F380B9F00D80091ED60 /* AppPrefsWindowController.h */, 64 | 3ED08F390B9F00D80091ED60 /* AppPrefsWindowController.m */, 65 | 31CF33090B3EF57E00359553 /* DBPrefsWindowController.h */, 66 | 31CF330A0B3EF57E00359553 /* DBPrefsWindowController.m */, 67 | 29B97316FDCFA39411CA2CEA /* main.m */, 68 | ); 69 | name = Classes; 70 | path = Source; 71 | sourceTree = ""; 72 | }; 73 | 19C28FACFE9D520D11CA2CBB /* Products */ = { 74 | isa = PBXGroup; 75 | children = ( 76 | 8D1107320486CEB800E47090 /* DBPrefsWindowController.app */, 77 | ); 78 | name = Products; 79 | sourceTree = ""; 80 | }; 81 | 29B97314FDCFA39411CA2CEA /* Simple Preferences */ = { 82 | isa = PBXGroup; 83 | children = ( 84 | 080E96DDFE201D6D7F000001 /* Classes */, 85 | 29B97317FDCFA39411CA2CEA /* Resources */, 86 | 29B97323FDCFA39411CA2CEA /* Frameworks */, 87 | 19C28FACFE9D520D11CA2CBB /* Products */, 88 | ); 89 | name = "Simple Preferences"; 90 | sourceTree = ""; 91 | }; 92 | 29B97317FDCFA39411CA2CEA /* Resources */ = { 93 | isa = PBXGroup; 94 | children = ( 95 | 3EFD77A30BA35B7800864CFF /* General.png */, 96 | 3E7A77900BA3261F006CEBA9 /* Colors.tiff */, 97 | 3E7A77930BA32641006CEBA9 /* Playback.tiff */, 98 | 3E7A778E0BA325F4006CEBA9 /* Updates.tiff */, 99 | 3EFD779D0BA35B1E00864CFF /* Advanced.png */, 100 | 8D1107310486CEB800E47090 /* Info.plist */, 101 | 732FFA571598E26C00546247 /* MainMenu.xib */, 102 | 732FFA551598E26400546247 /* Preferences.xib */, 103 | ); 104 | path = Resources; 105 | sourceTree = ""; 106 | }; 107 | 29B97323FDCFA39411CA2CEA /* Frameworks */ = { 108 | isa = PBXGroup; 109 | children = ( 110 | 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, 111 | 29B97324FDCFA39411CA2CEA /* AppKit.framework */, 112 | 29B97325FDCFA39411CA2CEA /* Foundation.framework */, 113 | ); 114 | name = Frameworks; 115 | sourceTree = ""; 116 | }; 117 | /* End PBXGroup section */ 118 | 119 | /* Begin PBXNativeTarget section */ 120 | 8D1107260486CEB800E47090 /* DBPrefsWindowController */ = { 121 | isa = PBXNativeTarget; 122 | buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "DBPrefsWindowController" */; 123 | buildPhases = ( 124 | 8D1107290486CEB800E47090 /* Resources */, 125 | 8D11072C0486CEB800E47090 /* Sources */, 126 | 8D11072E0486CEB800E47090 /* Frameworks */, 127 | ); 128 | buildRules = ( 129 | ); 130 | dependencies = ( 131 | ); 132 | name = DBPrefsWindowController; 133 | productInstallPath = "$(HOME)/Applications"; 134 | productName = "Simple Preferences"; 135 | productReference = 8D1107320486CEB800E47090 /* DBPrefsWindowController.app */; 136 | productType = "com.apple.product-type.application"; 137 | }; 138 | /* End PBXNativeTarget section */ 139 | 140 | /* Begin PBXProject section */ 141 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 142 | isa = PBXProject; 143 | attributes = { 144 | LastUpgradeCheck = 0460; 145 | }; 146 | buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "DBPrefsWindowController" */; 147 | compatibilityVersion = "Xcode 3.2"; 148 | developmentRegion = English; 149 | hasScannedForEncodings = 1; 150 | knownRegions = ( 151 | en, 152 | English, 153 | ); 154 | mainGroup = 29B97314FDCFA39411CA2CEA /* Simple Preferences */; 155 | projectDirPath = ""; 156 | projectRoot = ""; 157 | targets = ( 158 | 8D1107260486CEB800E47090 /* DBPrefsWindowController */, 159 | ); 160 | }; 161 | /* End PBXProject section */ 162 | 163 | /* Begin PBXResourcesBuildPhase section */ 164 | 8D1107290486CEB800E47090 /* Resources */ = { 165 | isa = PBXResourcesBuildPhase; 166 | buildActionMask = 2147483647; 167 | files = ( 168 | 3E7A778F0BA325F4006CEBA9 /* Updates.tiff in Resources */, 169 | 3E7A77910BA3261F006CEBA9 /* Colors.tiff in Resources */, 170 | 3E7A77940BA32641006CEBA9 /* Playback.tiff in Resources */, 171 | 3EFD779E0BA35B1E00864CFF /* Advanced.png in Resources */, 172 | 3EFD77A40BA35B7800864CFF /* General.png in Resources */, 173 | 732FFA561598E26400546247 /* Preferences.xib in Resources */, 174 | 732FFA591598E26C00546247 /* MainMenu.xib in Resources */, 175 | ); 176 | runOnlyForDeploymentPostprocessing = 0; 177 | }; 178 | /* End PBXResourcesBuildPhase section */ 179 | 180 | /* Begin PBXSourcesBuildPhase section */ 181 | 8D11072C0486CEB800E47090 /* Sources */ = { 182 | isa = PBXSourcesBuildPhase; 183 | buildActionMask = 2147483647; 184 | files = ( 185 | 8D11072D0486CEB800E47090 /* main.m in Sources */, 186 | 31CF33040B3EF55E00359553 /* AppController.m in Sources */, 187 | 31CF330B0B3EF57E00359553 /* DBPrefsWindowController.m in Sources */, 188 | 3ED08F3A0B9F00D80091ED60 /* AppPrefsWindowController.m in Sources */, 189 | ); 190 | runOnlyForDeploymentPostprocessing = 0; 191 | }; 192 | /* End PBXSourcesBuildPhase section */ 193 | 194 | /* Begin PBXVariantGroup section */ 195 | 732FFA571598E26C00546247 /* MainMenu.xib */ = { 196 | isa = PBXVariantGroup; 197 | children = ( 198 | 732FFA581598E26C00546247 /* English */, 199 | ); 200 | name = MainMenu.xib; 201 | sourceTree = ""; 202 | }; 203 | /* End PBXVariantGroup section */ 204 | 205 | /* Begin XCBuildConfiguration section */ 206 | C01FCF4B08A954540054247B /* Debug */ = { 207 | isa = XCBuildConfiguration; 208 | buildSettings = { 209 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 210 | CLANG_ENABLE_OBJC_ARC = YES; 211 | COPY_PHASE_STRIP = NO; 212 | GCC_DYNAMIC_NO_PIC = NO; 213 | GCC_MODEL_TUNING = G5; 214 | GCC_OPTIMIZATION_LEVEL = 0; 215 | INFOPLIST_FILE = Resources/Info.plist; 216 | INSTALL_PATH = "$(HOME)/Applications"; 217 | MACOSX_DEPLOYMENT_TARGET = 10.6.8; 218 | PRODUCT_NAME = DBPrefsWindowController; 219 | VALID_ARCHS = "i386 x86_64"; 220 | WRAPPER_EXTENSION = app; 221 | ZERO_LINK = NO; 222 | }; 223 | name = Debug; 224 | }; 225 | C01FCF4C08A954540054247B /* Release */ = { 226 | isa = XCBuildConfiguration; 227 | buildSettings = { 228 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 229 | CLANG_ENABLE_OBJC_ARC = YES; 230 | GCC_GENERATE_DEBUGGING_SYMBOLS = NO; 231 | GCC_MODEL_TUNING = G5; 232 | INFOPLIST_FILE = Resources/Info.plist; 233 | INSTALL_PATH = "$(HOME)/Applications"; 234 | MACOSX_DEPLOYMENT_TARGET = 10.6.8; 235 | PRODUCT_NAME = DBPrefsWindowController; 236 | VALID_ARCHS = "i386 x86_64"; 237 | WRAPPER_EXTENSION = app; 238 | }; 239 | name = Release; 240 | }; 241 | C01FCF4F08A954540054247B /* Debug */ = { 242 | isa = XCBuildConfiguration; 243 | buildSettings = { 244 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 245 | GCC_WARN_UNUSED_VARIABLE = YES; 246 | INFOPLIST_FILE = Resources; 247 | SDKROOT = macosx; 248 | }; 249 | name = Debug; 250 | }; 251 | C01FCF5008A954540054247B /* Release */ = { 252 | isa = XCBuildConfiguration; 253 | buildSettings = { 254 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 255 | GCC_WARN_UNUSED_VARIABLE = YES; 256 | INFOPLIST_FILE = Resources; 257 | SDKROOT = macosx; 258 | }; 259 | name = Release; 260 | }; 261 | /* End XCBuildConfiguration section */ 262 | 263 | /* Begin XCConfigurationList section */ 264 | C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "DBPrefsWindowController" */ = { 265 | isa = XCConfigurationList; 266 | buildConfigurations = ( 267 | C01FCF4B08A954540054247B /* Debug */, 268 | C01FCF4C08A954540054247B /* Release */, 269 | ); 270 | defaultConfigurationIsVisible = 0; 271 | defaultConfigurationName = Release; 272 | }; 273 | C01FCF4E08A954540054247B /* Build configuration list for PBXProject "DBPrefsWindowController" */ = { 274 | isa = XCConfigurationList; 275 | buildConfigurations = ( 276 | C01FCF4F08A954540054247B /* Debug */, 277 | C01FCF5008A954540054247B /* Release */, 278 | ); 279 | defaultConfigurationIsVisible = 0; 280 | defaultConfigurationName = Release; 281 | }; 282 | /* End XCConfigurationList section */ 283 | }; 284 | rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; 285 | } 286 | -------------------------------------------------------------------------------- /DBPrefsWindowController.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | DBPrefsWindowController 2 | ====== 3 | 4 | Originally created by [Dave Batton](http://www.mere-mortal-software.com/blog/details.php?d=2007-03-11). 5 | 6 | Application preference windows aren’t difficult to create. Just create an NSWindowController, set up a toolbar, create a nib file with either a series of custom views, or with an NSTabView object. The problem is, just setting up the toolbar and view swapping mechanism takes a lot of code, and it’s basically the same for every application. Sounds like an excellent opportunity to create a new class. 7 | 8 | ![](https://github.com/kgn/DBPrefsWindowController/raw/master/prefswindow.png) 9 | 10 | The goal of DBPrefsWindowController is to reduce the overhead of creating preference tabs to one line of code for each toolbar icon. This is achieved with an NSWindowController subclass named DBPrefsWindowController. 11 | 12 | Using DBPrefsWindowController 13 | ------ 14 | 15 | If you’re comfortable with subclassing and working with Interface Builder, you’ll be able to figure out how to use it from the included example project. Basically you just subclass it and connect your .h file to a nib file of custom views. The nib file should be named *Preferences*. Then just call `-addView:label:` to specify which views to display and what labels to use: 16 | 17 | - (void)setupToolbar 18 | { 19 | [self addView:generalPreferenceView label:@"General"]; 20 | [self addView:colorsPreferenceView label:@"Colors"]; 21 | [self addView:playbackPreferenceView label:@"Playback"]; 22 | [self addView:updatePreferenceView label:@"Update"]; 23 | [self addView:advancedPreferenceView label:@"Advanced"]; 24 | } 25 | 26 | When setup this way, DBPrefsWindowController will look for image files with names that match the labels supplied here. If your application is localized, you can instead call `-addView:label:image:` to specify the images to use for the toolbar icons. 27 | 28 | That’s really all there is to it. If you’ve already created a nib file with separate views for your preferences window, you can just use it instead of creating a new nib file. Either rename your nib file *Preferences*, or override the +nibName class method so it returns the name of your existing nib file. 29 | 30 | Documentation 31 | ------ 32 | 33 | The DBPrefsWindowController class is designed to be subclassed for each application in which it is used. The subclass should be set as the File’s Owner for a nib file named “Preferences.” The subclass should have NSView instances which are IBOutlets connected to views in the nib file. 34 | 35 | The nib file does not need to be connected to a window. If it is, it will be ignored and a new window will be created to display the preference views. 36 | 37 | + (DBPrefsWindowController *)sharedPrefsWindowController 38 | 39 | This class method returns a shared instance of the DBPrefsWindowController class. 40 | 41 | + (NSString *)nibName 42 | 43 | Override this class if you want to use a nib file named something other than *Preferences*. 44 | 45 | - (void)setupToolbar 46 | 47 | Override this method with calls to `-addView:label:` or `-addView:label:image:` to populate the toolbar. 48 | 49 | - (void)addView:(NSView *)view label:(NSString *)label 50 | 51 | Call this method as many times as needed from `-setupToolbar` to add new toolbar icons and custom views to the preferences window. An image with a name that matches the label should be available in the application bundle. It will be used as the toolbar icon. 52 | 53 | - (void)addView:(NSView *)view label:(NSString *)label image:(NSImage *)image 54 | 55 | This method can be used instead of `-addView:label:` if the application is localized, or if you just want to use icons with names that differ from the toolbar button labels. 56 | 57 | - (IBAction)showWindow:(id)sender 58 | 59 | Call this method to display the preferences window. For example: `[[AppPrefsWindowController sharedPrefsWindowController] showWindow:nil];` 60 | 61 | - (void)setCrossFade:(BOOL)fade` 62 | 63 | Call this method to enable or disable the cross-fade effect when switching views. The default value is `YES`. 64 | 65 | - (void) setShiftSlowsAnimation:(BOOL)slow 66 | 67 | Call this method to enable or disable the use of the shift key to slow down the animation when switching views. The default value is `YES`. 68 | 69 | -------------------------------------------------------------------------------- /Resources/Advanced.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kgn/DBPrefsWindowController/b7d34e07a97ca9d3bed63d3abe5043a19b632490/Resources/Advanced.png -------------------------------------------------------------------------------- /Resources/Colors.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kgn/DBPrefsWindowController/b7d34e07a97ca9d3bed63d3abe5043a19b632490/Resources/Colors.tiff -------------------------------------------------------------------------------- /Resources/English.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1070 5 | 11E2620 6 | 2541 7 | 1138.47 8 | 569.00 9 | 10 | com.apple.InterfaceBuilder.CocoaPlugin 11 | 2541 12 | 13 | 14 | NSCustomObject 15 | NSMenu 16 | NSMenuItem 17 | 18 | 19 | com.apple.InterfaceBuilder.CocoaPlugin 20 | 21 | 22 | PluginDependencyRecalculationVersion 23 | 24 | 25 | 26 | 27 | 28 | NSApplication 29 | 30 | 31 | 32 | FirstResponder 33 | 34 | 35 | NSApplication 36 | 37 | 38 | MainMenu 39 | 40 | 41 | 42 | DBPrefsWindowController 43 | 44 | 1048576 45 | 2147483647 46 | 47 | NSImage 48 | NSMenuCheckmark 49 | 50 | 51 | NSImage 52 | NSMenuMixedState 53 | 54 | submenuAction: 55 | 56 | DBPrefsWindowController 57 | 58 | 59 | 60 | About DBPrefsWindowController 61 | 62 | 2147483647 63 | 64 | 65 | 66 | 67 | 68 | YES 69 | YES 70 | 71 | 72 | 1048576 73 | 2147483647 74 | 75 | 76 | 77 | 78 | 79 | Preferences… 80 | , 81 | 1048576 82 | 2147483647 83 | 84 | 85 | 86 | 87 | 88 | YES 89 | YES 90 | 91 | 92 | 1048576 93 | 2147483647 94 | 95 | 96 | 97 | 98 | 99 | Services 100 | 101 | 1048576 102 | 2147483647 103 | 104 | 105 | submenuAction: 106 | 107 | 108 | Services 109 | 110 | 111 | _NSServicesMenu 112 | 113 | 114 | 115 | 116 | YES 117 | YES 118 | 119 | 120 | 1048576 121 | 2147483647 122 | 123 | 124 | 125 | 126 | 127 | Hide DBPrefsWindowController 128 | h 129 | 1048576 130 | 2147483647 131 | 132 | 133 | 134 | 135 | 136 | Hide Others 137 | h 138 | 1572864 139 | 2147483647 140 | 141 | 142 | 143 | 144 | 145 | Show All 146 | 147 | 1048576 148 | 2147483647 149 | 150 | 151 | 152 | 153 | 154 | YES 155 | YES 156 | 157 | 158 | 1048576 159 | 2147483647 160 | 161 | 162 | 163 | 164 | 165 | Quit DBPrefsWindowController 166 | q 167 | 1048576 168 | 2147483647 169 | 170 | 171 | 172 | 173 | _NSAppleMenu 174 | 175 | 176 | 177 | 178 | File 179 | 180 | 1048576 181 | 2147483647 182 | 183 | 184 | submenuAction: 185 | 186 | File 187 | 188 | 189 | 190 | Close 191 | w 192 | 1048576 193 | 2147483647 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | Edit 203 | 204 | 1048576 205 | 2147483647 206 | 207 | 208 | submenuAction: 209 | 210 | 211 | Edit 212 | 213 | 214 | 215 | 216 | Undo 217 | z 218 | 1048576 219 | 2147483647 220 | 221 | 222 | 223 | 224 | 225 | Redo 226 | Z 227 | 1048576 228 | 2147483647 229 | 230 | 231 | 232 | 233 | 234 | YES 235 | YES 236 | 237 | 238 | 1048576 239 | 2147483647 240 | 241 | 242 | 243 | 244 | 245 | Cut 246 | x 247 | 1048576 248 | 2147483647 249 | 250 | 251 | 252 | 253 | 254 | Copy 255 | c 256 | 1048576 257 | 2147483647 258 | 259 | 260 | 261 | 262 | 263 | Paste 264 | v 265 | 1048576 266 | 2147483647 267 | 268 | 269 | 270 | 271 | 272 | Paste and Match Style 273 | V 274 | 1572864 275 | 2147483647 276 | 277 | 278 | 279 | 280 | 281 | Delete 282 | 283 | 1048576 284 | 2147483647 285 | 286 | 287 | 288 | 289 | 290 | Select All 291 | a 292 | 1048576 293 | 2147483647 294 | 295 | 296 | 297 | 298 | 299 | YES 300 | YES 301 | 302 | 303 | 1048576 304 | 2147483647 305 | 306 | 307 | 308 | 309 | 310 | Find 311 | 312 | 1048576 313 | 2147483647 314 | 315 | 316 | submenuAction: 317 | 318 | 319 | Find 320 | 321 | 322 | 323 | 324 | Find… 325 | f 326 | 1048576 327 | 2147483647 328 | 329 | 330 | 1 331 | 332 | 333 | 334 | Find Next 335 | g 336 | 1048576 337 | 2147483647 338 | 339 | 340 | 2 341 | 342 | 343 | 344 | Find Previous 345 | G 346 | 1048576 347 | 2147483647 348 | 349 | 350 | 3 351 | 352 | 353 | 354 | Use Selection for Find 355 | e 356 | 1048576 357 | 2147483647 358 | 359 | 360 | 7 361 | 362 | 363 | 364 | Jump to Selection 365 | j 366 | 1048576 367 | 2147483647 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | Spelling 377 | 378 | 1048576 379 | 2147483647 380 | 381 | 382 | submenuAction: 383 | 384 | Spelling 385 | 386 | 387 | 388 | Spelling… 389 | : 390 | 1048576 391 | 2147483647 392 | 393 | 394 | 395 | 396 | 397 | Check Spelling 398 | ; 399 | 1048576 400 | 2147483647 401 | 402 | 403 | 404 | 405 | 406 | Check Spelling as You Type 407 | 408 | 1048576 409 | 2147483647 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | Window 422 | 423 | 1048576 424 | 2147483647 425 | 426 | 427 | submenuAction: 428 | 429 | 430 | Window 431 | 432 | 433 | 434 | 435 | Minimize 436 | m 437 | 1048576 438 | 2147483647 439 | 440 | 441 | 442 | 443 | 444 | Zoom 445 | 446 | 1048576 447 | 2147483647 448 | 449 | 450 | 451 | 452 | 453 | YES 454 | YES 455 | 456 | 457 | 1048576 458 | 2147483647 459 | 460 | 461 | 462 | 463 | 464 | Bring All to Front 465 | 466 | 1048576 467 | 2147483647 468 | 469 | 470 | 471 | 472 | _NSWindowsMenu 473 | 474 | 475 | 476 | _NSMainMenu 477 | 478 | 479 | AppController 480 | 481 | 482 | 483 | 484 | 485 | 486 | terminate: 487 | 488 | 489 | 490 | 139 491 | 492 | 493 | 494 | orderFrontStandardAboutPanel: 495 | 496 | 497 | 498 | 142 499 | 500 | 501 | 502 | hideOtherApplications: 503 | 504 | 505 | 506 | 146 507 | 508 | 509 | 510 | hide: 511 | 512 | 513 | 514 | 152 515 | 516 | 517 | 518 | unhideAllApplications: 519 | 520 | 521 | 522 | 153 523 | 524 | 525 | 526 | delegate 527 | 528 | 529 | 530 | 209 531 | 532 | 533 | 534 | performMiniaturize: 535 | 536 | 537 | 538 | 37 539 | 540 | 541 | 542 | arrangeInFront: 543 | 544 | 545 | 546 | 39 547 | 548 | 549 | 550 | cut: 551 | 552 | 553 | 554 | 175 555 | 556 | 557 | 558 | paste: 559 | 560 | 561 | 562 | 176 563 | 564 | 565 | 566 | redo: 567 | 568 | 569 | 570 | 178 571 | 572 | 573 | 574 | selectAll: 575 | 576 | 577 | 578 | 179 579 | 580 | 581 | 582 | undo: 583 | 584 | 585 | 586 | 180 587 | 588 | 589 | 590 | copy: 591 | 592 | 593 | 594 | 181 595 | 596 | 597 | 598 | showGuessPanel: 599 | 600 | 601 | 602 | 188 603 | 604 | 605 | 606 | checkSpelling: 607 | 608 | 609 | 610 | 190 611 | 612 | 613 | 614 | toggleContinuousSpellChecking: 615 | 616 | 617 | 618 | 192 619 | 620 | 621 | 622 | performClose: 623 | 624 | 625 | 626 | 193 627 | 628 | 629 | 630 | delete: 631 | 632 | 633 | 634 | 195 635 | 636 | 637 | 638 | performZoom: 639 | 640 | 641 | 642 | 198 643 | 644 | 645 | 646 | performFindPanelAction: 647 | 648 | 649 | 650 | 199 651 | 652 | 653 | 654 | performFindPanelAction: 655 | 656 | 657 | 658 | 200 659 | 660 | 661 | 662 | performFindPanelAction: 663 | 664 | 665 | 666 | 201 667 | 668 | 669 | 670 | performFindPanelAction: 671 | 672 | 673 | 674 | 202 675 | 676 | 677 | 678 | centerSelectionInVisibleArea: 679 | 680 | 681 | 682 | 203 683 | 684 | 685 | 686 | pasteAsPlainText: 687 | 688 | 689 | 690 | 205 691 | 692 | 693 | 694 | openPreferences: 695 | 696 | 697 | 698 | 210 699 | 700 | 701 | 702 | 703 | 704 | 0 705 | 706 | 707 | 708 | 709 | 710 | -2 711 | 712 | 713 | File's Owner 714 | 715 | 716 | -1 717 | 718 | 719 | First Responder 720 | 721 | 722 | 29 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | MainMenu 732 | 733 | 734 | 19 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 24 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 5 754 | 755 | 756 | 757 | 758 | 23 759 | 760 | 761 | 762 | 763 | 92 764 | 765 | 766 | 767 | 768 | 197 769 | 770 | 771 | 772 | 773 | 56 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 57 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 58 800 | 801 | 802 | 803 | 804 | 129 805 | 806 | 807 | 808 | 809 | 131 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 130 818 | 819 | 820 | 821 | 822 | 134 823 | 824 | 825 | 826 | 827 | 136 828 | 829 | 830 | 831 | 832 | 143 833 | 834 | 835 | 836 | 837 | 144 838 | 839 | 840 | 841 | 842 | 145 843 | 844 | 845 | 846 | 847 | 149 848 | 849 | 850 | 851 | 852 | 150 853 | 854 | 855 | 856 | 857 | 196 858 | 859 | 860 | 861 | 862 | 83 863 | 864 | 865 | 866 | 867 | 868 | 869 | 870 | 81 871 | 872 | 873 | 874 | 875 | 876 | 877 | 878 | 73 879 | 880 | 881 | 882 | 883 | 163 884 | 885 | 886 | 887 | 888 | 889 | 890 | 891 | 169 892 | 893 | 894 | 895 | 896 | 897 | 898 | 899 | 900 | 901 | 902 | 903 | 904 | 905 | 906 | 907 | 908 | 909 | 910 | 156 911 | 912 | 913 | 914 | 915 | 157 916 | 917 | 918 | 919 | 920 | 158 921 | 922 | 923 | 924 | 925 | 160 926 | 927 | 928 | 929 | 930 | 164 931 | 932 | 933 | 934 | 935 | 168 936 | 937 | 938 | 939 | 940 | 941 | 942 | 943 | 159 944 | 945 | 946 | 947 | 948 | 949 | 950 | 951 | 952 | 953 | 954 | 955 | 154 956 | 957 | 958 | 959 | 960 | 155 961 | 962 | 963 | 964 | 965 | 161 966 | 967 | 968 | 969 | 970 | 162 971 | 972 | 973 | 974 | 975 | 167 976 | 977 | 978 | 979 | 980 | 171 981 | 982 | 983 | 984 | 985 | 172 986 | 987 | 988 | 989 | 990 | 173 991 | 992 | 993 | 994 | 995 | 174 996 | 997 | 998 | 999 | 1000 | 184 1001 | 1002 | 1003 | 1004 | 1005 | 1006 | 1007 | 1008 | 185 1009 | 1010 | 1011 | 1012 | 1013 | 1014 | 1015 | 1016 | 1017 | 1018 | 187 1019 | 1020 | 1021 | 1022 | 1023 | 189 1024 | 1025 | 1026 | 1027 | 1028 | 191 1029 | 1030 | 1031 | 1032 | 1033 | 204 1034 | 1035 | 1036 | 1037 | 1038 | 208 1039 | 1040 | 1041 | AppController 1042 | 1043 | 1044 | -3 1045 | 1046 | 1047 | Application 1048 | 1049 | 1050 | 1051 | 1052 | com.apple.InterfaceBuilder.CocoaPlugin 1053 | com.apple.InterfaceBuilder.CocoaPlugin 1054 | com.apple.InterfaceBuilder.CocoaPlugin 1055 | com.apple.InterfaceBuilder.CocoaPlugin 1056 | com.apple.InterfaceBuilder.CocoaPlugin 1057 | com.apple.InterfaceBuilder.CocoaPlugin 1058 | com.apple.InterfaceBuilder.CocoaPlugin 1059 | com.apple.InterfaceBuilder.CocoaPlugin 1060 | com.apple.InterfaceBuilder.CocoaPlugin 1061 | com.apple.InterfaceBuilder.CocoaPlugin 1062 | com.apple.InterfaceBuilder.CocoaPlugin 1063 | com.apple.InterfaceBuilder.CocoaPlugin 1064 | com.apple.InterfaceBuilder.CocoaPlugin 1065 | com.apple.InterfaceBuilder.CocoaPlugin 1066 | com.apple.InterfaceBuilder.CocoaPlugin 1067 | com.apple.InterfaceBuilder.CocoaPlugin 1068 | com.apple.InterfaceBuilder.CocoaPlugin 1069 | com.apple.InterfaceBuilder.CocoaPlugin 1070 | com.apple.InterfaceBuilder.CocoaPlugin 1071 | com.apple.InterfaceBuilder.CocoaPlugin 1072 | com.apple.InterfaceBuilder.CocoaPlugin 1073 | com.apple.InterfaceBuilder.CocoaPlugin 1074 | com.apple.InterfaceBuilder.CocoaPlugin 1075 | com.apple.InterfaceBuilder.CocoaPlugin 1076 | com.apple.InterfaceBuilder.CocoaPlugin 1077 | com.apple.InterfaceBuilder.CocoaPlugin 1078 | com.apple.InterfaceBuilder.CocoaPlugin 1079 | com.apple.InterfaceBuilder.CocoaPlugin 1080 | com.apple.InterfaceBuilder.CocoaPlugin 1081 | com.apple.InterfaceBuilder.CocoaPlugin 1082 | com.apple.InterfaceBuilder.CocoaPlugin 1083 | com.apple.InterfaceBuilder.CocoaPlugin 1084 | com.apple.InterfaceBuilder.CocoaPlugin 1085 | com.apple.InterfaceBuilder.CocoaPlugin 1086 | com.apple.InterfaceBuilder.CocoaPlugin 1087 | com.apple.InterfaceBuilder.CocoaPlugin 1088 | com.apple.InterfaceBuilder.CocoaPlugin 1089 | com.apple.InterfaceBuilder.CocoaPlugin 1090 | com.apple.InterfaceBuilder.CocoaPlugin 1091 | com.apple.InterfaceBuilder.CocoaPlugin 1092 | com.apple.InterfaceBuilder.CocoaPlugin 1093 | com.apple.InterfaceBuilder.CocoaPlugin 1094 | com.apple.InterfaceBuilder.CocoaPlugin 1095 | com.apple.InterfaceBuilder.CocoaPlugin 1096 | com.apple.InterfaceBuilder.CocoaPlugin 1097 | com.apple.InterfaceBuilder.CocoaPlugin 1098 | com.apple.InterfaceBuilder.CocoaPlugin 1099 | com.apple.InterfaceBuilder.CocoaPlugin 1100 | com.apple.InterfaceBuilder.CocoaPlugin 1101 | com.apple.InterfaceBuilder.CocoaPlugin 1102 | com.apple.InterfaceBuilder.CocoaPlugin 1103 | com.apple.InterfaceBuilder.CocoaPlugin 1104 | 1105 | 1106 | 1107 | 1108 | 1109 | 211 1110 | 1111 | 1112 | 1113 | 1114 | AppController 1115 | NSObject 1116 | 1117 | openPreferences: 1118 | id 1119 | 1120 | 1121 | openPreferences: 1122 | 1123 | openPreferences: 1124 | id 1125 | 1126 | 1127 | 1128 | IBProjectSource 1129 | ./Classes/AppController.h 1130 | 1131 | 1132 | 1133 | 1134 | 0 1135 | IBCocoaFramework 1136 | 1137 | com.apple.InterfaceBuilder.CocoaPlugin.macosx 1138 | 1139 | 1140 | YES 1141 | 3 1142 | 1143 | {11, 11} 1144 | {10, 3} 1145 | 1146 | 1147 | 1148 | -------------------------------------------------------------------------------- /Resources/General.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kgn/DBPrefsWindowController/b7d34e07a97ca9d3bed63d3abe5043a19b632490/Resources/General.png -------------------------------------------------------------------------------- /Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | com.mere-mortal-software.dbprefswindowcontroller 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | NSMainNibFile 24 | MainMenu 25 | NSPrincipalClass 26 | NSApplication 27 | 28 | 29 | -------------------------------------------------------------------------------- /Resources/Playback.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kgn/DBPrefsWindowController/b7d34e07a97ca9d3bed63d3abe5043a19b632490/Resources/Playback.tiff -------------------------------------------------------------------------------- /Resources/Preferences.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1070 5 | 11E2620 6 | 2541 7 | 1138.47 8 | 569.00 9 | 10 | com.apple.InterfaceBuilder.CocoaPlugin 11 | 2541 12 | 13 | 14 | NSButton 15 | NSButtonCell 16 | NSColorWell 17 | NSCustomObject 18 | NSCustomView 19 | NSImageCell 20 | NSImageView 21 | NSMatrix 22 | NSMenu 23 | NSMenuItem 24 | NSPopUpButton 25 | NSPopUpButtonCell 26 | NSSlider 27 | NSSliderCell 28 | NSTextField 29 | NSTextFieldCell 30 | NSUserDefaultsController 31 | 32 | 33 | com.apple.InterfaceBuilder.CocoaPlugin 34 | 35 | 36 | PluginDependencyRecalculationVersion 37 | 38 | 39 | 40 | 41 | AppPrefsWindowController 42 | 43 | 44 | FirstResponder 45 | 46 | 47 | NSApplication 48 | 49 | 50 | 51 | 264 52 | 53 | 54 | 55 | 256 56 | {{135, 177}, {63, 18}} 57 | 58 | 59 | YES 60 | 61 | 67239424 62 | 0 63 | Red 64 | 65 | LucidaGrande 66 | 13 67 | 1044 68 | 69 | 70 | 1211912703 71 | 2 72 | 73 | NSImage 74 | NSSwitch 75 | 76 | 77 | NSSwitch 78 | 79 | 80 | 81 | 200 82 | 25 83 | 84 | 85 | 86 | 87 | 256 88 | {{45, 178}, {87, 17}} 89 | 90 | 91 | YES 92 | 93 | 67239424 94 | 71303168 95 | Label Colors: 96 | 97 | 98 | 99 | 6 100 | System 101 | controlColor 102 | 103 | 3 104 | MC42NjY2NjY2NjY3AA 105 | 106 | 107 | 108 | 6 109 | System 110 | controlTextColor 111 | 112 | 3 113 | MAA 114 | 115 | 116 | 117 | 118 | 119 | 120 | 256 121 | {{135, 157}, {63, 18}} 122 | 123 | 124 | YES 125 | 126 | 67239424 127 | 0 128 | Green 129 | 130 | 131 | 1211912703 132 | 2 133 | 134 | 135 | 136 | 137 | 200 138 | 25 139 | 140 | 141 | 142 | 143 | 256 144 | {{135, 137}, {63, 18}} 145 | 146 | 147 | YES 148 | 149 | 67239424 150 | 0 151 | Blue 152 | 153 | 154 | 1211912703 155 | 2 156 | 157 | 158 | 159 | 160 | 200 161 | 25 162 | 163 | 164 | 165 | 166 | 256 167 | {{135, 117}, {69, 18}} 168 | 169 | 170 | YES 171 | 172 | 67239424 173 | 0 174 | Orange 175 | 176 | 177 | 1211912703 178 | 2 179 | 180 | 181 | 182 | 183 | 200 184 | 25 185 | 186 | 187 | 188 | 189 | 256 190 | {{135, 97}, {69, 18}} 191 | 192 | 193 | YES 194 | 195 | 67239424 196 | 0 197 | Yellow 198 | 199 | 200 | 1211912703 201 | 2 202 | 203 | 204 | 205 | 206 | 200 207 | 25 208 | 209 | 210 | 211 | 212 | 256 213 | {{135, 77}, {69, 18}} 214 | 215 | 216 | YES 217 | 218 | 67239424 219 | 0 220 | Purple 221 | 222 | 223 | 1211912703 224 | 2 225 | 226 | 227 | 228 | 229 | 200 230 | 25 231 | 232 | 233 | 234 | 235 | 256 236 | {{135, 57}, {76, 18}} 237 | 238 | 239 | YES 240 | 241 | 67239424 242 | 0 243 | Magenta 244 | 245 | 246 | 1211912703 247 | 2 248 | 249 | 250 | 251 | 252 | 200 253 | 25 254 | 255 | 256 | 257 | 258 | 256 259 | {{65, 24}, {67, 17}} 260 | 261 | 262 | YES 263 | 264 | 67239424 265 | 71303168 266 | Highlight: 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 256 276 | {{134, 18}, {120, 26}} 277 | 278 | 279 | YES 280 | 281 | -2076049856 282 | 2048 283 | 284 | 285 | 109199615 286 | 1 287 | 288 | LucidaGrande 289 | 13 290 | 16 291 | 292 | 293 | 294 | 295 | 296 | 400 297 | 75 298 | 299 | 300 | Light Green 301 | 302 | 1048576 303 | 2147483647 304 | 1 305 | 306 | NSImage 307 | NSMenuCheckmark 308 | 309 | 310 | NSImage 311 | NSMenuMixedState 312 | 313 | _popUpItemAction: 314 | 315 | 316 | YES 317 | 318 | 319 | OtherViews 320 | 321 | 322 | 323 | 324 | Light Blue 325 | 326 | 1048576 327 | 2147483647 328 | 329 | 330 | _popUpItemAction: 331 | 332 | 333 | 334 | 335 | 336 | Light Gray 337 | 338 | 1048576 339 | 2147483647 340 | 341 | 342 | _popUpItemAction: 343 | 344 | 345 | 346 | 347 | 1 348 | 3 349 | YES 350 | YES 351 | 1 352 | 353 | 354 | 355 | {300, 213} 356 | 357 | 358 | NSView 359 | NSResponder 360 | 361 | 362 | 363 | 256 364 | 365 | 366 | 367 | 264 368 | {{76, 93}, {206, 21}} 369 | 370 | YES 371 | 372 | 67239424 373 | 0 374 | 375 | 376 | 377 | 378 | Helvetica 379 | 12 380 | 16 381 | 382 | 383 | 100 384 | 0.0 385 | 50 386 | 0.0 387 | 0 388 | 1 389 | NO 390 | NO 391 | 392 | 393 | 394 | 395 | 264 396 | {{17, 97}, {56, 17}} 397 | 398 | YES 399 | 400 | 67239424 401 | 71303168 402 | Volume: 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 256 412 | {{76, 68}, {206, 21}} 413 | 414 | YES 415 | 416 | 67239424 417 | 0 418 | 419 | 420 | 421 | 422 | 423 | 100 424 | 0.0 425 | 50 426 | 0.0 427 | 0 428 | 1 429 | NO 430 | NO 431 | 432 | 433 | 434 | 435 | 256 436 | {{17, 72}, {57, 17}} 437 | 438 | YES 439 | 440 | 67239424 441 | 71303168 442 | Trebble: 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 256 452 | {{76, 43}, {206, 21}} 453 | 454 | YES 455 | 456 | 67239424 457 | 0 458 | 459 | 460 | 461 | 462 | 463 | 100 464 | 0.0 465 | 50 466 | 0.0 467 | 0 468 | 1 469 | NO 470 | NO 471 | 472 | 473 | 474 | 475 | 256 476 | {{37, 47}, {37, 17}} 477 | 478 | YES 479 | 480 | 67239424 481 | 71303168 482 | Bass: 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 256 492 | {{76, 18}, {206, 21}} 493 | 494 | YES 495 | 496 | 67239424 497 | 0 498 | 499 | 500 | 501 | 502 | 503 | 100 504 | 0.0 505 | 50 506 | 0.0 507 | 0 508 | 1 509 | NO 510 | NO 511 | 512 | 513 | 514 | 515 | 256 516 | {{24, 22}, {50, 17}} 517 | 518 | YES 519 | 520 | 67239424 521 | 71303168 522 | Effects: 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | {300, 132} 531 | 532 | NSView 533 | 534 | NSResponder 535 | 536 | 537 | 538 | 256 539 | 540 | 541 | 542 | 256 543 | {{36, 58}, {229, 18}} 544 | 545 | YES 546 | 547 | 67239424 548 | 0 549 | Automatically Check for Updates 550 | 551 | 552 | 1211912703 553 | 2 554 | 555 | 556 | 557 | 558 | 200 559 | 25 560 | 561 | 562 | 563 | 564 | 256 565 | {{95, 14}, {111, 32}} 566 | 567 | YES 568 | 569 | 67239424 570 | 134217728 571 | Check Now 572 | 573 | 574 | -2038284033 575 | 1 576 | 577 | 578 | 579 | 580 | 581 | 200 582 | 25 583 | 584 | 585 | 586 | {300, 94} 587 | 588 | NSView 589 | 590 | NSResponder 591 | 592 | 593 | YES 594 | 595 | 596 | 597 | 256 598 | 599 | 600 | 601 | 256 602 | {{25, 58}, {252, 18}} 603 | 604 | YES 605 | 606 | 67239424 607 | 0 608 | Open Preferences Window at Startup 609 | 610 | 611 | 1211912703 612 | 2 613 | 614 | 615 | 616 | 617 | 200 618 | 25 619 | 620 | 621 | 622 | 623 | 256 624 | {{25, 38}, {133, 18}} 625 | 626 | YES 627 | 628 | 67239424 629 | 0 630 | Cross-fade Views 631 | 632 | 633 | 1211912703 634 | 2 635 | 636 | 637 | 638 | 639 | 200 640 | 25 641 | 642 | 643 | 644 | 645 | 256 646 | {{25, 18}, {186, 18}} 647 | 648 | YES 649 | 650 | 67239424 651 | 0 652 | Shift Key Slows Animation 653 | 654 | 655 | 1211912703 656 | 2 657 | 658 | 659 | 660 | 661 | 200 662 | 25 663 | 664 | 665 | 666 | {300, 94} 667 | 668 | NSView 669 | 670 | NSResponder 671 | 672 | 673 | 674 | 256 675 | 676 | 677 | 678 | 256 679 | {{73, 199}, {101, 17}} 680 | 681 | YES 682 | 683 | 67239424 684 | 71303168 685 | Difficulty Level: 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 256 695 | {{175, 178}, {59, 38}} 696 | 697 | YES 698 | 2 699 | 1 700 | 701 | 702 | -2080244224 703 | 0 704 | Easy 705 | 706 | 707 | 1211912703 708 | 0 709 | 710 | NSRadioButton 711 | 712 | 713 | 714 | 715 | 716 | 200 717 | 25 718 | 719 | 720 | 67239424 721 | 0 722 | Hard 723 | 724 | 725 | 1 726 | 1211912703 727 | 0 728 | 729 | 730 | 731 | 200 732 | 25 733 | 734 | 735 | {59, 18} 736 | {4, 2} 737 | 1143472128 738 | NSActionCell 739 | 740 | 67239424 741 | 0 742 | Radio 743 | 744 | 1211912703 745 | 0 746 | 747 | 549453824 748 | {18, 18} 749 | 750 | 751 | 752 | 753 | 754 | TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA 755 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw 756 | IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 757 | 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 758 | dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA 759 | AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG 760 | AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 761 | 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 762 | 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 763 | 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 764 | 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD 765 | AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns 766 | AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 767 | 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ 768 | /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ 769 | ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl 770 | YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA 771 | AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF 772 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD 773 | AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu 774 | AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 775 | AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB 776 | AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES 777 | AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS 778 | AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 779 | 780 | 781 | 782 | 783 | 784 | 3 785 | MCAwAA 786 | 787 | 788 | 789 | 400 790 | 75 791 | 792 | 793 | 794 | 795 | 3 796 | MQA 797 | 798 | 799 | 800 | 801 | 802 | 256 803 | {{61, 157}, {113, 17}} 804 | 805 | YES 806 | 807 | 67239424 808 | 71303168 809 | Things to Ignore: 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 256 819 | 820 | Apple PDF pasteboard type 821 | Apple PICT pasteboard type 822 | Apple PNG pasteboard type 823 | NSFilenamesPboardType 824 | NeXT Encapsulated PostScript v1.2 pasteboard type 825 | NeXT TIFF v4.0 pasteboard type 826 | 827 | {{174, 51}, {62, 62}} 828 | 829 | YES 830 | 831 | 404880896 832 | 0 833 | 0 834 | 0 835 | 2 836 | NO 837 | 838 | YES 839 | 840 | 841 | 842 | 256 843 | {{125, 93}, {49, 17}} 844 | 845 | YES 846 | 847 | 67239424 848 | 71303168 849 | Avatar: 850 | 851 | 852 | 853 | 854 | 855 | 856 | 857 | 858 | 256 859 | 860 | 861 | NSColor pasteboard type 862 | 863 | 864 | {{177, 22}, {52, 24}} 865 | 866 | YES 867 | YES 868 | 869 | 1 870 | MC4wNTgxMzA0OTkgMC4wNTU1NDE4OTkgMQA 871 | 872 | 873 | 874 | 875 | 256 876 | {{91, 26}, {83, 17}} 877 | 878 | YES 879 | 880 | 67239424 881 | 71303168 882 | Background: 883 | 884 | 885 | 886 | 887 | 888 | 889 | 890 | 891 | 256 892 | {{175, 136}, {63, 18}} 893 | 894 | YES 895 | 896 | 67239424 897 | 0 898 | iChat 899 | 900 | 901 | 1211912703 902 | 2 903 | 904 | 905 | 906 | 907 | 200 908 | 25 909 | 910 | 911 | 912 | 913 | 256 914 | {{175, 116}, {63, 18}} 915 | 916 | YES 917 | 918 | 67239424 919 | 0 920 | SMS 921 | 922 | 923 | 1211912703 924 | 2 925 | 926 | 927 | 928 | 929 | 200 930 | 25 931 | 932 | 933 | 934 | 935 | 256 936 | {{175, 156}, {63, 18}} 937 | 938 | YES 939 | 940 | 67239424 941 | 0 942 | Email 943 | 944 | 945 | 1211912703 946 | 2 947 | 948 | 949 | 950 | 951 | 200 952 | 25 953 | 954 | 955 | 956 | {300, 234} 957 | NSView 958 | NSResponder 959 | 960 | 961 | 962 | 963 | 964 | 965 | colorsPreferenceView 966 | 967 | 968 | 969 | 49 970 | 971 | 972 | 973 | playbackPreferenceView 974 | 975 | 976 | 977 | 50 978 | 979 | 980 | 981 | advancedPreferenceView 982 | 983 | 984 | 985 | 125 986 | 987 | 988 | 989 | generalPreferenceView 990 | 991 | 992 | 993 | 126 994 | 995 | 996 | 997 | updatesPreferenceView 998 | 999 | 1000 | 1001 | 148 1002 | 1003 | 1004 | 1005 | nextKeyView 1006 | 1007 | 1008 | 1009 | 202 1010 | 1011 | 1012 | 1013 | value: values.red 1014 | 1015 | 1016 | 1017 | 1018 | 1019 | value: values.red 1020 | value 1021 | values.red 1022 | 1023 | NSNullPlaceholder 1024 | 1025 | 1026 | 2 1027 | 1028 | 1029 | 93 1030 | 1031 | 1032 | 1033 | nextKeyView 1034 | 1035 | 1036 | 1037 | 203 1038 | 1039 | 1040 | 1041 | value: values.green 1042 | 1043 | 1044 | 1045 | 1046 | 1047 | value: values.green 1048 | value 1049 | values.green 1050 | 1051 | NSNullPlaceholder 1052 | 1053 | 1054 | 2 1055 | 1056 | 1057 | 96 1058 | 1059 | 1060 | 1061 | nextKeyView 1062 | 1063 | 1064 | 1065 | 204 1066 | 1067 | 1068 | 1069 | value: values.blue 1070 | 1071 | 1072 | 1073 | 1074 | 1075 | value: values.blue 1076 | value 1077 | values.blue 1078 | 1079 | NSNullPlaceholder 1080 | 1081 | 1082 | 2 1083 | 1084 | 1085 | 97 1086 | 1087 | 1088 | 1089 | nextKeyView 1090 | 1091 | 1092 | 1093 | 205 1094 | 1095 | 1096 | 1097 | value: values.orange 1098 | 1099 | 1100 | 1101 | 1102 | 1103 | value: values.orange 1104 | value 1105 | values.orange 1106 | 2 1107 | 1108 | 1109 | 81 1110 | 1111 | 1112 | 1113 | nextKeyView 1114 | 1115 | 1116 | 1117 | 206 1118 | 1119 | 1120 | 1121 | value: values.yellow 1122 | 1123 | 1124 | 1125 | 1126 | 1127 | value: values.yellow 1128 | value 1129 | values.yellow 1130 | 2 1131 | 1132 | 1133 | 82 1134 | 1135 | 1136 | 1137 | nextKeyView 1138 | 1139 | 1140 | 1141 | 207 1142 | 1143 | 1144 | 1145 | value: values.purple 1146 | 1147 | 1148 | 1149 | 1150 | 1151 | value: values.purple 1152 | value 1153 | values.purple 1154 | 2 1155 | 1156 | 1157 | 83 1158 | 1159 | 1160 | 1161 | nextKeyView 1162 | 1163 | 1164 | 1165 | 208 1166 | 1167 | 1168 | 1169 | value: values.magenta 1170 | 1171 | 1172 | 1173 | 1174 | 1175 | value: values.magenta 1176 | value 1177 | values.magenta 1178 | 2 1179 | 1180 | 1181 | 84 1182 | 1183 | 1184 | 1185 | nextKeyView 1186 | 1187 | 1188 | 1189 | 209 1190 | 1191 | 1192 | 1193 | nextKeyView 1194 | 1195 | 1196 | 1197 | 212 1198 | 1199 | 1200 | 1201 | value: values.volume 1202 | 1203 | 1204 | 1205 | 1206 | 1207 | value: values.volume 1208 | value 1209 | values.volume 1210 | 1211 | NSNullPlaceholder 1212 | 1213 | 1 1214 | 1 1215 | NO 1216 | YES 1217 | 1 1218 | AgAAAAAAAAAAAAAAAAAAAA 1219 | 1220 | 1221 | 2 1222 | 1223 | 1224 | 88 1225 | 1226 | 1227 | 1228 | nextKeyView 1229 | 1230 | 1231 | 1232 | 213 1233 | 1234 | 1235 | 1236 | value: values.trebble 1237 | 1238 | 1239 | 1240 | 1241 | 1242 | value: values.trebble 1243 | value 1244 | values.trebble 1245 | 1246 | NSNullPlaceholder 1247 | 1248 | 1 1249 | 1 1250 | NO 1251 | YES 1252 | 1 1253 | BQAAAAAAAAAAAAAAAAAAAA 1254 | 1255 | 1256 | 2 1257 | 1258 | 1259 | 89 1260 | 1261 | 1262 | 1263 | nextKeyView 1264 | 1265 | 1266 | 1267 | 214 1268 | 1269 | 1270 | 1271 | value: values.bass 1272 | 1273 | 1274 | 1275 | 1276 | 1277 | value: values.bass 1278 | value 1279 | values.bass 1280 | 1281 | NSNullPlaceholder 1282 | 1283 | 1 1284 | 1 1285 | NO 1286 | YES 1287 | 1 1288 | BQAAAAAAAAAAAAAAAAAAAA 1289 | 1290 | 1291 | 2 1292 | 1293 | 1294 | 90 1295 | 1296 | 1297 | 1298 | nextKeyView 1299 | 1300 | 1301 | 1302 | 215 1303 | 1304 | 1305 | 1306 | value: values.effects 1307 | 1308 | 1309 | 1310 | 1311 | 1312 | value: values.effects 1313 | value 1314 | values.effects 1315 | 1316 | NSNullPlaceholder 1317 | 1318 | 0 1319 | 0 1320 | NO 1321 | NO 1322 | 1 1323 | AAAAAAAAAAAAAAAAAAAAAA 1324 | 1325 | 1326 | 2 1327 | 1328 | 1329 | 92 1330 | 1331 | 1332 | 1333 | nextKeyView 1334 | 1335 | 1336 | 1337 | 216 1338 | 1339 | 1340 | 1341 | selectedValue: values.highlight 1342 | 1343 | 1344 | 1345 | 1346 | 1347 | selectedValue: values.highlight 1348 | selectedValue 1349 | values.highlight 1350 | 1351 | NSNullPlaceholder 1352 | Light Green 1353 | 1354 | 2 1355 | 1356 | 1357 | 162 1358 | 1359 | 1360 | 1361 | nextKeyView 1362 | 1363 | 1364 | 1365 | 210 1366 | 1367 | 1368 | 1369 | nextKeyView 1370 | 1371 | 1372 | 1373 | 217 1374 | 1375 | 1376 | 1377 | value: values.checkForUpdates 1378 | 1379 | 1380 | 1381 | 1382 | 1383 | value: values.checkForUpdates 1384 | value 1385 | values.checkForUpdates 1386 | 1387 | NSNullPlaceholder 1388 | 1389 | 1390 | 2 1391 | 1392 | 1393 | 98 1394 | 1395 | 1396 | 1397 | nextKeyView 1398 | 1399 | 1400 | 1401 | 218 1402 | 1403 | 1404 | 1405 | nextKeyView 1406 | 1407 | 1408 | 1409 | 219 1410 | 1411 | 1412 | 1413 | nextKeyView 1414 | 1415 | 1416 | 1417 | 220 1418 | 1419 | 1420 | 1421 | nextKeyView 1422 | 1423 | 1424 | 1425 | 201 1426 | 1427 | 1428 | 1429 | value: values.openAtStartup 1430 | 1431 | 1432 | 1433 | 1434 | 1435 | value: values.openAtStartup 1436 | value 1437 | values.openAtStartup 1438 | 2 1439 | 1440 | 1441 | 104 1442 | 1443 | 1444 | 1445 | nextKeyView 1446 | 1447 | 1448 | 1449 | 221 1450 | 1451 | 1452 | 1453 | value: values.fade 1454 | 1455 | 1456 | 1457 | 1458 | 1459 | value: values.fade 1460 | value 1461 | values.fade 1462 | 2 1463 | 1464 | 1465 | 105 1466 | 1467 | 1468 | 1469 | nextKeyView 1470 | 1471 | 1472 | 1473 | 222 1474 | 1475 | 1476 | 1477 | selectedValue: values.steps 1478 | 1479 | 1480 | 1481 | 1482 | 1483 | selectedValue: values.steps 1484 | selectedValue 1485 | values.steps 1486 | 1487 | NSNullPlaceholder 1488 | Easy 1489 | 1490 | 2 1491 | 1492 | 1493 | 193 1494 | 1495 | 1496 | 1497 | nextKeyView 1498 | 1499 | 1500 | 1501 | 196 1502 | 1503 | 1504 | 1505 | value: values.avatar 1506 | 1507 | 1508 | 1509 | 1510 | 1511 | value: values.avatar 1512 | value 1513 | values.avatar 1514 | 1515 | NSValueTransformerName 1516 | NSUnarchiveFromData 1517 | 1518 | 2 1519 | 1520 | 1521 | 192 1522 | 1523 | 1524 | 1525 | nextKeyView 1526 | 1527 | 1528 | 1529 | 200 1530 | 1531 | 1532 | 1533 | value: values.background 1534 | 1535 | 1536 | 1537 | 1538 | 1539 | value: values.background 1540 | value 1541 | values.background 1542 | 1543 | NSValueTransformerName 1544 | NSUnarchiveFromData 1545 | 1546 | 2 1547 | 1548 | 1549 | 187 1550 | 1551 | 1552 | 1553 | nextKeyView 1554 | 1555 | 1556 | 1557 | 211 1558 | 1559 | 1560 | 1561 | value: values.ignoreEmail 1562 | 1563 | 1564 | 1565 | 1566 | 1567 | value: values.ignoreEmail 1568 | value 1569 | values.ignoreEmail 1570 | 1571 | NSNullPlaceholder 1572 | 1573 | 1574 | 2 1575 | 1576 | 1577 | 180 1578 | 1579 | 1580 | 1581 | nextKeyView 1582 | 1583 | 1584 | 1585 | 197 1586 | 1587 | 1588 | 1589 | value: values.ignoreiChat 1590 | 1591 | 1592 | 1593 | 1594 | 1595 | value: values.ignoreiChat 1596 | value 1597 | values.ignoreiChat 1598 | 1599 | NSNullPlaceholder 1600 | 1601 | 1602 | 2 1603 | 1604 | 1605 | 179 1606 | 1607 | 1608 | 1609 | nextKeyView 1610 | 1611 | 1612 | 1613 | 198 1614 | 1615 | 1616 | 1617 | value: values.ignoreSMS 1618 | 1619 | 1620 | 1621 | 1622 | 1623 | value: values.ignoreSMS 1624 | value 1625 | values.ignoreSMS 1626 | 1627 | NSNullPlaceholder 1628 | 1629 | 1630 | 2 1631 | 1632 | 1633 | 183 1634 | 1635 | 1636 | 1637 | nextKeyView 1638 | 1639 | 1640 | 1641 | 199 1642 | 1643 | 1644 | 1645 | value: values.shiftSlowsAnimation 1646 | 1647 | 1648 | 1649 | 1650 | 1651 | value: values.shiftSlowsAnimation 1652 | value 1653 | values.shiftSlowsAnimation 1654 | 2 1655 | 1656 | 1657 | 195 1658 | 1659 | 1660 | 1661 | nextKeyView 1662 | 1663 | 1664 | 1665 | 223 1666 | 1667 | 1668 | 1669 | 1670 | 1671 | 0 1672 | 1673 | 1674 | 1675 | 1676 | 1677 | -2 1678 | 1679 | 1680 | File's Owner 1681 | 1682 | 1683 | -1 1684 | 1685 | 1686 | First Responder 1687 | 1688 | 1689 | 5 1690 | 1691 | 1692 | 1693 | 1694 | 1695 | 1696 | 1697 | 1698 | 1699 | 1700 | 1701 | 1702 | 1703 | 1704 | Colors 1705 | 1706 | 1707 | 11 1708 | 1709 | 1710 | 1711 | 1712 | 1713 | 1714 | 1715 | 12 1716 | 1717 | 1718 | 1719 | 1720 | 1721 | 1722 | 1723 | 13 1724 | 1725 | 1726 | 1727 | 1728 | 1729 | 1730 | 1731 | 14 1732 | 1733 | 1734 | 1735 | 1736 | 1737 | 1738 | 1739 | 15 1740 | 1741 | 1742 | 1743 | 1744 | 1745 | 1746 | 1747 | 16 1748 | 1749 | 1750 | 1751 | 1752 | 1753 | 1754 | 1755 | 17 1756 | 1757 | 1758 | 1759 | 1760 | 1761 | 1762 | 1763 | 18 1764 | 1765 | 1766 | 1767 | 1768 | 1769 | 1770 | 1771 | 28 1772 | 1773 | 1774 | 1775 | 1776 | 1777 | 1778 | 1779 | 29 1780 | 1781 | 1782 | 1783 | 1784 | 1785 | 1786 | 1787 | 19 1788 | 1789 | 1790 | 1791 | 1792 | 1793 | 1794 | 1795 | 1796 | 1797 | 1798 | 1799 | 1800 | Playback 1801 | 1802 | 1803 | 20 1804 | 1805 | 1806 | 1807 | 1808 | 1809 | 1810 | 1811 | 21 1812 | 1813 | 1814 | 1815 | 1816 | 1817 | 1818 | 1819 | 22 1820 | 1821 | 1822 | 1823 | 1824 | 1825 | 1826 | 1827 | 23 1828 | 1829 | 1830 | 1831 | 1832 | 1833 | 1834 | 1835 | 24 1836 | 1837 | 1838 | 1839 | 1840 | 1841 | 1842 | 1843 | 25 1844 | 1845 | 1846 | 1847 | 1848 | 1849 | 1850 | 1851 | 26 1852 | 1853 | 1854 | 1855 | 1856 | 1857 | 1858 | 1859 | 27 1860 | 1861 | 1862 | 1863 | 1864 | 1865 | 1866 | 1867 | 68 1868 | 1869 | 1870 | 1871 | 1872 | 1873 | 1874 | Updates 1875 | 1876 | 1877 | 69 1878 | 1879 | 1880 | 1881 | 1882 | 1883 | 1884 | 1885 | 70 1886 | 1887 | 1888 | 1889 | 1890 | 1891 | 1892 | 1893 | 72 1894 | 1895 | 1896 | Shared Defaults 1897 | 1898 | 1899 | 99 1900 | 1901 | 1902 | 1903 | 1904 | 1905 | 1906 | 1907 | General 1908 | 1909 | 1910 | 101 1911 | 1912 | 1913 | 1914 | 1915 | 1916 | 1917 | 1918 | 102 1919 | 1920 | 1921 | 1922 | 1923 | 1924 | 1925 | 1926 | 194 1927 | 1928 | 1929 | 1930 | 1931 | 1932 | 1933 | 1934 | 100 1935 | 1936 | 1937 | 1938 | 1939 | 1940 | 1941 | 1942 | 1943 | 1944 | 1945 | 1946 | 1947 | 1948 | 1949 | Advanced 1950 | 1951 | 1952 | 109 1953 | 1954 | 1955 | 1956 | 1957 | 1958 | 1959 | 1960 | 110 1961 | 1962 | 1963 | 1964 | 1965 | 1966 | 1967 | 1968 | 1969 | 1970 | 149 1971 | 1972 | 1973 | 1974 | 1975 | 150 1976 | 1977 | 1978 | 1979 | 1980 | 135 1981 | 1982 | 1983 | 1984 | 1985 | 1986 | 1987 | 1988 | 151 1989 | 1990 | 1991 | 1992 | 1993 | 1994 | 1995 | 1996 | 152 1997 | 1998 | 1999 | 2000 | 2001 | 2002 | 2003 | 2004 | 158 2005 | 2006 | 2007 | 2008 | 2009 | 159 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 174 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 175 2026 | 2027 | 2028 | 2029 | 2030 | 2031 | 2032 | 2033 | 176 2034 | 2035 | 2036 | 2037 | 2038 | 2039 | 2040 | 2041 | 225 2042 | 2043 | 2044 | 2045 | 2046 | 226 2047 | 2048 | 2049 | 2050 | 2051 | 227 2052 | 2053 | 2054 | 2055 | 2056 | 228 2057 | 2058 | 2059 | 2060 | 2061 | 229 2062 | 2063 | 2064 | 2065 | 2066 | 230 2067 | 2068 | 2069 | 2070 | 2071 | 231 2072 | 2073 | 2074 | 2075 | 2076 | 232 2077 | 2078 | 2079 | 2080 | 2081 | 233 2082 | 2083 | 2084 | 2085 | 2086 | 234 2087 | 2088 | 2089 | 2090 | 2091 | 2092 | 2093 | 2094 | 235 2095 | 2096 | 2097 | 2098 | 2099 | 236 2100 | 2101 | 2102 | 2103 | 2104 | 237 2105 | 2106 | 2107 | 2108 | 2109 | 238 2110 | 2111 | 2112 | 2113 | 2114 | 239 2115 | 2116 | 2117 | 2118 | 2119 | 240 2120 | 2121 | 2122 | 2123 | 2124 | 241 2125 | 2126 | 2127 | 2128 | 2129 | 242 2130 | 2131 | 2132 | 2133 | 2134 | 243 2135 | 2136 | 2137 | 2138 | 2139 | 244 2140 | 2141 | 2142 | 2143 | 2144 | 245 2145 | 2146 | 2147 | 2148 | 2149 | 246 2150 | 2151 | 2152 | 2153 | 2154 | 247 2155 | 2156 | 2157 | 2158 | 2159 | 248 2160 | 2161 | 2162 | 2163 | 2164 | 249 2165 | 2166 | 2167 | 2168 | 2169 | 250 2170 | 2171 | 2172 | 2173 | 2174 | 251 2175 | 2176 | 2177 | 2178 | 2179 | 252 2180 | 2181 | 2182 | 2183 | 2184 | 253 2185 | 2186 | 2187 | 2188 | 2189 | 254 2190 | 2191 | 2192 | 2193 | 2194 | 255 2195 | 2196 | 2197 | 2198 | 2199 | 256 2200 | 2201 | 2202 | 2203 | 2204 | 30 2205 | 2206 | 2207 | 2208 | 2209 | 2210 | 2211 | 2212 | 2213 | 2214 | 33 2215 | 2216 | 2217 | 2218 | 2219 | 32 2220 | 2221 | 2222 | 2223 | 2224 | 31 2225 | 2226 | 2227 | 2228 | 2229 | -3 2230 | 2231 | 2232 | Application 2233 | 2234 | 2235 | 2236 | 2237 | com.apple.InterfaceBuilder.CocoaPlugin 2238 | com.apple.InterfaceBuilder.CocoaPlugin 2239 | com.apple.InterfaceBuilder.CocoaPlugin 2240 | com.apple.InterfaceBuilder.CocoaPlugin 2241 | com.apple.InterfaceBuilder.CocoaPlugin 2242 | com.apple.InterfaceBuilder.CocoaPlugin 2243 | com.apple.InterfaceBuilder.CocoaPlugin 2244 | com.apple.InterfaceBuilder.CocoaPlugin 2245 | com.apple.InterfaceBuilder.CocoaPlugin 2246 | com.apple.InterfaceBuilder.CocoaPlugin 2247 | com.apple.InterfaceBuilder.CocoaPlugin 2248 | com.apple.InterfaceBuilder.CocoaPlugin 2249 | com.apple.InterfaceBuilder.CocoaPlugin 2250 | com.apple.InterfaceBuilder.CocoaPlugin 2251 | com.apple.InterfaceBuilder.CocoaPlugin 2252 | com.apple.InterfaceBuilder.CocoaPlugin 2253 | com.apple.InterfaceBuilder.CocoaPlugin 2254 | com.apple.InterfaceBuilder.CocoaPlugin 2255 | com.apple.InterfaceBuilder.CocoaPlugin 2256 | com.apple.InterfaceBuilder.CocoaPlugin 2257 | com.apple.InterfaceBuilder.CocoaPlugin 2258 | com.apple.InterfaceBuilder.CocoaPlugin 2259 | com.apple.InterfaceBuilder.CocoaPlugin 2260 | com.apple.InterfaceBuilder.CocoaPlugin 2261 | com.apple.InterfaceBuilder.CocoaPlugin 2262 | com.apple.InterfaceBuilder.CocoaPlugin 2263 | com.apple.InterfaceBuilder.CocoaPlugin 2264 | com.apple.InterfaceBuilder.CocoaPlugin 2265 | com.apple.InterfaceBuilder.CocoaPlugin 2266 | com.apple.InterfaceBuilder.CocoaPlugin 2267 | com.apple.InterfaceBuilder.CocoaPlugin 2268 | com.apple.InterfaceBuilder.CocoaPlugin 2269 | com.apple.InterfaceBuilder.CocoaPlugin 2270 | com.apple.InterfaceBuilder.CocoaPlugin 2271 | com.apple.InterfaceBuilder.CocoaPlugin 2272 | com.apple.InterfaceBuilder.CocoaPlugin 2273 | com.apple.InterfaceBuilder.CocoaPlugin 2274 | com.apple.InterfaceBuilder.CocoaPlugin 2275 | com.apple.InterfaceBuilder.CocoaPlugin 2276 | com.apple.InterfaceBuilder.CocoaPlugin 2277 | com.apple.InterfaceBuilder.CocoaPlugin 2278 | com.apple.InterfaceBuilder.CocoaPlugin 2279 | com.apple.InterfaceBuilder.CocoaPlugin 2280 | com.apple.InterfaceBuilder.CocoaPlugin 2281 | com.apple.InterfaceBuilder.CocoaPlugin 2282 | com.apple.InterfaceBuilder.CocoaPlugin 2283 | com.apple.InterfaceBuilder.CocoaPlugin 2284 | com.apple.InterfaceBuilder.CocoaPlugin 2285 | com.apple.InterfaceBuilder.CocoaPlugin 2286 | com.apple.InterfaceBuilder.CocoaPlugin 2287 | com.apple.InterfaceBuilder.CocoaPlugin 2288 | com.apple.InterfaceBuilder.CocoaPlugin 2289 | com.apple.InterfaceBuilder.CocoaPlugin 2290 | com.apple.InterfaceBuilder.CocoaPlugin 2291 | com.apple.InterfaceBuilder.CocoaPlugin 2292 | com.apple.InterfaceBuilder.CocoaPlugin 2293 | com.apple.InterfaceBuilder.CocoaPlugin 2294 | com.apple.InterfaceBuilder.CocoaPlugin 2295 | com.apple.InterfaceBuilder.CocoaPlugin 2296 | com.apple.InterfaceBuilder.CocoaPlugin 2297 | com.apple.InterfaceBuilder.CocoaPlugin 2298 | com.apple.InterfaceBuilder.CocoaPlugin 2299 | com.apple.InterfaceBuilder.CocoaPlugin 2300 | com.apple.InterfaceBuilder.CocoaPlugin 2301 | com.apple.InterfaceBuilder.CocoaPlugin 2302 | com.apple.InterfaceBuilder.CocoaPlugin 2303 | com.apple.InterfaceBuilder.CocoaPlugin 2304 | com.apple.InterfaceBuilder.CocoaPlugin 2305 | com.apple.InterfaceBuilder.CocoaPlugin 2306 | com.apple.InterfaceBuilder.CocoaPlugin 2307 | com.apple.InterfaceBuilder.CocoaPlugin 2308 | com.apple.InterfaceBuilder.CocoaPlugin 2309 | com.apple.InterfaceBuilder.CocoaPlugin 2310 | com.apple.InterfaceBuilder.CocoaPlugin 2311 | com.apple.InterfaceBuilder.CocoaPlugin 2312 | com.apple.InterfaceBuilder.CocoaPlugin 2313 | com.apple.InterfaceBuilder.CocoaPlugin 2314 | com.apple.InterfaceBuilder.CocoaPlugin 2315 | com.apple.InterfaceBuilder.CocoaPlugin 2316 | com.apple.InterfaceBuilder.CocoaPlugin 2317 | 2318 | 2319 | 2320 | 2321 | 2322 | 256 2323 | 2324 | 2325 | 2326 | 2327 | AppPrefsWindowController 2328 | DBPrefsWindowController 2329 | 2330 | NSView 2331 | NSView 2332 | NSView 2333 | NSView 2334 | NSView 2335 | 2336 | 2337 | 2338 | advancedPreferenceView 2339 | NSView 2340 | 2341 | 2342 | colorsPreferenceView 2343 | NSView 2344 | 2345 | 2346 | generalPreferenceView 2347 | NSView 2348 | 2349 | 2350 | playbackPreferenceView 2351 | NSView 2352 | 2353 | 2354 | updatesPreferenceView 2355 | NSView 2356 | 2357 | 2358 | 2359 | IBProjectSource 2360 | ./Classes/AppPrefsWindowController.h 2361 | 2362 | 2363 | 2364 | DBPrefsWindowController 2365 | NSWindowController 2366 | 2367 | IBProjectSource 2368 | ./Classes/DBPrefsWindowController.h 2369 | 2370 | 2371 | 2372 | 2373 | 0 2374 | IBCocoaFramework 2375 | 2376 | com.apple.InterfaceBuilder.CocoaPlugin.macosx 2377 | 2378 | 2379 | YES 2380 | 3 2381 | 2382 | {11, 11} 2383 | {10, 3} 2384 | {15, 15} 2385 | 2386 | 2387 | 2388 | -------------------------------------------------------------------------------- /Resources/Updates.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kgn/DBPrefsWindowController/b7d34e07a97ca9d3bed63d3abe5043a19b632490/Resources/Updates.tiff -------------------------------------------------------------------------------- /Source/AppController.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppController.m 3 | // 4 | 5 | #import 6 | 7 | @interface AppController : NSObject 8 | 9 | - (IBAction)openPreferences:(id)sender; 10 | 11 | @end 12 | -------------------------------------------------------------------------------- /Source/AppController.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppController.m 3 | // 4 | 5 | #import "AppController.h" 6 | #import "AppPrefsWindowController.h" 7 | 8 | @implementation AppController 9 | 10 | + (void)initialize{ 11 | NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 12 | NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys: 13 | @"YES", @"openAtStartup", 14 | @"YES", @"fade", 15 | @"YES", @"shiftSlowsAnimation", 16 | nil]; 17 | [defaults registerDefaults:appDefaults]; 18 | } 19 | 20 | - (void)awakeFromNib{ 21 | NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 22 | [defaults addObserver:self 23 | forKeyPath:@"fade" 24 | options:NSKeyValueObservingOptionOld 25 | context:NULL]; 26 | [defaults addObserver:self 27 | forKeyPath:@"shiftSlowsAnimation" 28 | options:NSKeyValueObservingOptionOld 29 | context:NULL]; 30 | if([[NSUserDefaults standardUserDefaults] boolForKey:@"openAtStartup"]){ 31 | [self openPreferences:self]; 32 | } 33 | } 34 | 35 | - (void)dealloc{ 36 | NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 37 | [defaults removeObserver:self forKeyPath:@"fade"]; 38 | [defaults removeObserver:self forKeyPath:@"shiftSlowsAnimation"]; 39 | } 40 | 41 | - (IBAction)openPreferences:(id)sender{ 42 | [[AppPrefsWindowController sharedPrefsWindowController] showWindow:nil]; 43 | } 44 | 45 | - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ 46 | [[AppPrefsWindowController sharedPrefsWindowController] setCrossFade:[[NSUserDefaults standardUserDefaults] boolForKey:@"fade"]]; 47 | [[AppPrefsWindowController sharedPrefsWindowController] setShiftSlowsAnimation:[[NSUserDefaults standardUserDefaults] boolForKey:@"shiftSlowsAnimation"]]; 48 | } 49 | 50 | @end 51 | -------------------------------------------------------------------------------- /Source/AppPrefsWindowController.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppPrefsWindowController.h 3 | // 4 | 5 | #import 6 | #import "DBPrefsWindowController.h" 7 | 8 | @interface AppPrefsWindowController : DBPrefsWindowController 9 | 10 | @property (strong, nonatomic) IBOutlet NSView *generalPreferenceView; 11 | @property (strong, nonatomic) IBOutlet NSView *colorsPreferenceView; 12 | @property (strong, nonatomic) IBOutlet NSView *playbackPreferenceView; 13 | @property (strong, nonatomic) IBOutlet NSView *updatesPreferenceView; 14 | @property (strong, nonatomic) IBOutlet NSView *advancedPreferenceView; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /Source/AppPrefsWindowController.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppPrefsWindowController.m 3 | // 4 | 5 | #import "AppPrefsWindowController.h" 6 | 7 | @implementation AppPrefsWindowController 8 | 9 | - (void)setupToolbar{ 10 | [self addView:self.generalPreferenceView label:@"General"]; 11 | [self addView:self.colorsPreferenceView label:@"Colors"]; 12 | [self addView:self.playbackPreferenceView label:@"Playback"]; 13 | [self addView:self.updatesPreferenceView label:@"Updates"]; 14 | [self addFlexibleSpacer]; 15 | [self addView:self.advancedPreferenceView label:@"Advanced"]; 16 | 17 | // Optional configuration settings. 18 | [self setCrossFade:[[NSUserDefaults standardUserDefaults] boolForKey:@"fade"]]; 19 | [self setShiftSlowsAnimation:[[NSUserDefaults standardUserDefaults] boolForKey:@"shiftSlowsAnimation"]]; 20 | } 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /Source/DBPrefsWindowController.h: -------------------------------------------------------------------------------- 1 | // 2 | // DBPrefsWindowController.h 3 | // 4 | // Created by Dave Batton 5 | // http://www.Mere-Mortal-Software.com/blog/ 6 | // 7 | // Updated by David Keegan 8 | // https://github.com/kgn/DBPrefsWindowController 9 | // 10 | // Copyright 2007. Some rights reserved. 11 | // This work is licensed under a Creative Commons license: 12 | // http://creativecommons.org/licenses/by/3.0/ 13 | 14 | #import 15 | 16 | @interface DBPrefsWindowController : NSWindowController 17 | 18 | @property (nonatomic) BOOL crossFade; 19 | @property (nonatomic) BOOL shiftSlowsAnimation; 20 | 21 | + (DBPrefsWindowController *)sharedPrefsWindowController; 22 | + (NSString *)nibName; 23 | 24 | - (void)setupToolbar; 25 | - (void)addFlexibleSpacer; 26 | - (void)addView:(NSView *)view label:(NSString *)label; 27 | - (void)addView:(NSView *)view label:(NSString *)label image:(NSImage *)image; 28 | 29 | - (void)toggleActivePreferenceView:(NSToolbarItem *)toolbarItem; 30 | - (void)displayViewForIdentifier:(NSString *)identifier animate:(BOOL)animate; 31 | - (void)crossFadeView:(NSView *)oldView withView:(NSView *)newView; 32 | - (NSRect)frameForView:(NSView *)view; 33 | 34 | // select both the view & toolbar item for the given identifier 35 | - (void)loadViewForIdentifier:(NSString *)identifier animate:(BOOL)animate; 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /Source/DBPrefsWindowController.m: -------------------------------------------------------------------------------- 1 | // 2 | // DBPrefsWindowController.m 3 | // 4 | 5 | #import "DBPrefsWindowController.h" 6 | 7 | @interface DBPrefsWindowController() 8 | @property (nonatomic, strong) NSMutableArray *toolbarIdentifiers; 9 | @property (nonatomic, strong) NSMutableDictionary *toolbarViews; 10 | @property (nonatomic, strong) NSMutableDictionary *toolbarItems; 11 | @property (nonatomic, strong) NSViewAnimation *viewAnimation; 12 | @property (nonatomic, strong) NSView *contentSubview; 13 | @end 14 | 15 | @implementation DBPrefsWindowController 16 | 17 | #pragma mark - 18 | #pragma mark Class Methods 19 | 20 | + (DBPrefsWindowController *)sharedPrefsWindowController{ 21 | static DBPrefsWindowController *_sharedPrefsWindowController = nil; 22 | if(!_sharedPrefsWindowController){ 23 | _sharedPrefsWindowController = [[self alloc] initWithWindowNibName:[self nibName]]; 24 | } 25 | return _sharedPrefsWindowController; 26 | } 27 | 28 | // Subclasses can override this to use a nib with a different name. 29 | + (NSString *)nibName{ 30 | return @"Preferences"; 31 | } 32 | 33 | 34 | #pragma mark - 35 | #pragma mark Setup & Teardown 36 | 37 | - (id)initWithWindow:(NSWindow *)window{ 38 | if((self = [super initWithWindow:nil])){ 39 | // Set up an array and some dictionaries to keep track 40 | // of the views we'll be displaying. 41 | self.toolbarIdentifiers = [[NSMutableArray alloc] init]; 42 | self.toolbarViews = [[NSMutableDictionary alloc] init]; 43 | self.toolbarItems = [[NSMutableDictionary alloc] init]; 44 | 45 | // Set up an NSViewAnimation to animate the transitions. 46 | self.viewAnimation = [[NSViewAnimation alloc] init]; 47 | [self.viewAnimation setAnimationBlockingMode:NSAnimationNonblocking]; 48 | [self.viewAnimation setAnimationCurve:NSAnimationEaseInOut]; 49 | [self.viewAnimation setDelegate:(id)self]; 50 | 51 | self.crossFade = YES; 52 | self.shiftSlowsAnimation = YES; 53 | } 54 | return self; 55 | } 56 | 57 | - (void)windowDidLoad{ 58 | // Create a new window to display the preference views. 59 | // If the developer attached a window to this controller 60 | // in Interface Builder, it gets replaced with this one. 61 | NSWindow *window = 62 | [[NSWindow alloc] initWithContentRect:NSMakeRect(0,0,1000,1000) 63 | styleMask:(NSTitledWindowMask | 64 | NSClosableWindowMask | 65 | NSMiniaturizableWindowMask) 66 | backing:NSBackingStoreBuffered 67 | defer:YES]; 68 | [self setWindow:window]; 69 | self.contentSubview = [[NSView alloc] initWithFrame:[[[self window] contentView] frame]]; 70 | [self.contentSubview setAutoresizingMask:(NSViewMinYMargin | NSViewWidthSizable)]; 71 | [[[self window] contentView] addSubview:self.contentSubview]; 72 | [[self window] setShowsToolbarButton:NO]; 73 | } 74 | 75 | 76 | #pragma mark - 77 | #pragma mark Configuration 78 | 79 | - (void)setupToolbar{ 80 | // Subclasses must override this method to add items to the 81 | // toolbar by calling -addView:label: or -addView:label:image:. 82 | } 83 | 84 | - (void)addToolbarItemForIdentifier:(NSString *)identifier 85 | label:(NSString *)label 86 | image:(NSImage *)image 87 | selector:(SEL)selector { 88 | [self.toolbarIdentifiers addObject:identifier]; 89 | 90 | NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:identifier]; 91 | [item setLabel:label]; 92 | [item setImage:image]; 93 | [item setTarget:self]; 94 | [item setAction:selector]; 95 | 96 | (self.toolbarItems)[identifier] = item; 97 | } 98 | 99 | - (void)addFlexibleSpacer { 100 | [self addToolbarItemForIdentifier:NSToolbarFlexibleSpaceItemIdentifier label:nil image:nil selector:nil]; 101 | } 102 | 103 | - (void)addView:(NSView *)view label:(NSString *)label{ 104 | [self addView:view label:label image:[NSImage imageNamed:label]]; 105 | } 106 | 107 | - (void)addView:(NSView *)view label:(NSString *)label image:(NSImage *)image{ 108 | if(view == nil){ 109 | return; 110 | } 111 | 112 | NSString *identifier = [label copy]; 113 | (self.toolbarViews)[identifier] = view; 114 | [self addToolbarItemForIdentifier:identifier 115 | label:label 116 | image:image 117 | selector:@selector(toggleActivePreferenceView:)]; 118 | } 119 | 120 | 121 | #pragma mark - 122 | #pragma mark Overriding Methods 123 | 124 | - (IBAction)showWindow:(id)sender{ 125 | // This forces the resources in the nib to load. 126 | [self window]; 127 | 128 | // Clear the last setup and get a fresh one. 129 | [self.toolbarIdentifiers removeAllObjects]; 130 | [self.toolbarViews removeAllObjects]; 131 | [self.toolbarItems removeAllObjects]; 132 | [self setupToolbar]; 133 | 134 | if(![_toolbarIdentifiers count]){ 135 | return; 136 | } 137 | 138 | if([[self window] toolbar] == nil){ 139 | NSToolbar *toolbar = [[NSToolbar alloc] initWithIdentifier:@"DBPreferencesToolbar"]; 140 | [toolbar setAllowsUserCustomization:NO]; 141 | [toolbar setAutosavesConfiguration:NO]; 142 | [toolbar setSizeMode:NSToolbarSizeModeDefault]; 143 | [toolbar setDisplayMode:NSToolbarDisplayModeIconAndLabel]; 144 | [toolbar setDelegate:(id)self]; 145 | [[self window] setToolbar:toolbar]; 146 | } 147 | 148 | NSString *firstIdentifier = (self.toolbarIdentifiers)[0]; 149 | [[[self window] toolbar] setSelectedItemIdentifier:firstIdentifier]; 150 | [self displayViewForIdentifier:firstIdentifier animate:NO]; 151 | 152 | [[self window] center]; 153 | 154 | [super showWindow:sender]; 155 | } 156 | 157 | 158 | #pragma mark - 159 | #pragma mark Toolbar 160 | 161 | - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar{ 162 | return self.toolbarIdentifiers; 163 | } 164 | 165 | - (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar{ 166 | return self.toolbarIdentifiers; 167 | } 168 | 169 | - (NSArray *)toolbarSelectableItemIdentifiers:(NSToolbar *)toolbar{ 170 | return self.toolbarIdentifiers; 171 | } 172 | 173 | - (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)identifier willBeInsertedIntoToolbar:(BOOL)willBeInserted{ 174 | return (self.toolbarItems)[identifier]; 175 | } 176 | 177 | - (void)toggleActivePreferenceView:(NSToolbarItem *)toolbarItem{ 178 | [self displayViewForIdentifier:[toolbarItem itemIdentifier] animate:YES]; 179 | } 180 | 181 | - (void)displayViewForIdentifier:(NSString *)identifier animate:(BOOL)animate{ 182 | // Find the view we want to display. 183 | NSView *newView = (self.toolbarViews)[identifier]; 184 | 185 | // See if there are any visible views. 186 | NSView *oldView = nil; 187 | if([[self.contentSubview subviews] count] > 0) { 188 | // Get a list of all of the views in the window. Usually at this 189 | // point there is just one visible view. But if the last fade 190 | // hasn't finished, we need to get rid of it now before we move on. 191 | NSEnumerator *subviewsEnum = [[self.contentSubview subviews] reverseObjectEnumerator]; 192 | 193 | // The first one (last one added) is our visible view. 194 | oldView = [subviewsEnum nextObject]; 195 | 196 | // Remove any others. 197 | NSView *reallyOldView = nil; 198 | while((reallyOldView = [subviewsEnum nextObject]) != nil){ 199 | [reallyOldView removeFromSuperviewWithoutNeedingDisplay]; 200 | } 201 | } 202 | 203 | if(![newView isEqualTo:oldView]){ 204 | NSRect frame = [newView bounds]; 205 | frame.origin.y = NSHeight([self.contentSubview frame]) - NSHeight([newView bounds]); 206 | [newView setFrame:frame]; 207 | [self.contentSubview addSubview:newView]; 208 | [[self window] setInitialFirstResponder:newView]; 209 | 210 | if(animate && [self crossFade]){ 211 | [self crossFadeView:oldView withView:newView]; 212 | }else{ 213 | [oldView removeFromSuperviewWithoutNeedingDisplay]; 214 | [newView setHidden:NO]; 215 | [[self window] setFrame:[self frameForView:newView] display:YES animate:animate]; 216 | } 217 | 218 | [[self window] setTitle:[(self.toolbarItems)[identifier] label]]; 219 | } 220 | } 221 | 222 | - (void)loadViewForIdentifier:(NSString *)identifier animate:(BOOL)animate { 223 | [[[self window] toolbar] setSelectedItemIdentifier:identifier]; 224 | [self displayViewForIdentifier:identifier animate:animate]; 225 | } 226 | 227 | 228 | #pragma mark - 229 | #pragma mark Cross-Fading Methods 230 | 231 | - (void)crossFadeView:(NSView *)oldView withView:(NSView *)newView{ 232 | [self.viewAnimation stopAnimation]; 233 | 234 | if([self shiftSlowsAnimation] && [[[self window] currentEvent] modifierFlags] & NSShiftKeyMask){ 235 | [self.viewAnimation setDuration:1.25]; 236 | }else{ 237 | [self.viewAnimation setDuration:0.25]; 238 | } 239 | 240 | NSDictionary *fadeOutDictionary = 241 | @{NSViewAnimationTargetKey: oldView, 242 | NSViewAnimationEffectKey: NSViewAnimationFadeOutEffect}; 243 | 244 | NSDictionary *fadeInDictionary = 245 | @{NSViewAnimationTargetKey: newView, 246 | NSViewAnimationEffectKey: NSViewAnimationFadeInEffect}; 247 | 248 | NSDictionary *resizeDictionary = 249 | @{NSViewAnimationTargetKey: [self window], 250 | NSViewAnimationStartFrameKey: [NSValue valueWithRect:[[self window] frame]], 251 | NSViewAnimationEndFrameKey: [NSValue valueWithRect:[self frameForView:newView]]}; 252 | 253 | NSArray *animationArray = 254 | @[fadeOutDictionary, 255 | fadeInDictionary, 256 | resizeDictionary]; 257 | 258 | [self.viewAnimation setViewAnimations:animationArray]; 259 | [self.viewAnimation startAnimation]; 260 | } 261 | 262 | - (void)animationDidEnd:(NSAnimation *)animation{ 263 | NSView *subview; 264 | 265 | // Get a list of all of the views in the window. Hopefully 266 | // at this point there are two. One is visible and one is hidden. 267 | NSEnumerator *subviewsEnum = [[self.contentSubview subviews] reverseObjectEnumerator]; 268 | 269 | // This is our visible view. Just get past it. 270 | [subviewsEnum nextObject]; 271 | 272 | // Remove everything else. There should be just one, but 273 | // if the user does a lot of fast clicking, we might have 274 | // more than one to remove. 275 | while((subview = [subviewsEnum nextObject]) != nil){ 276 | [subview removeFromSuperviewWithoutNeedingDisplay]; 277 | } 278 | 279 | // This is a work-around that prevents the first 280 | // toolbar icon from becoming highlighted. 281 | [[self window] makeFirstResponder:nil]; 282 | } 283 | 284 | // Calculate the window size for the new view. 285 | - (NSRect)frameForView:(NSView *)view{ 286 | NSRect windowFrame = [[self window] frame]; 287 | NSRect contentRect = [[self window] contentRectForFrameRect:windowFrame]; 288 | float windowTitleAndToolbarHeight = NSHeight(windowFrame) - NSHeight(contentRect); 289 | 290 | windowFrame.size.height = NSHeight([view frame]) + windowTitleAndToolbarHeight; 291 | windowFrame.size.width = NSWidth([view frame]); 292 | windowFrame.origin.y = NSMaxY([[self window] frame]) - NSHeight(windowFrame); 293 | 294 | return windowFrame; 295 | } 296 | 297 | // Close the window with cmd+w incase the app doesn't have an app menu 298 | - (void)keyDown:(NSEvent *)theEvent{ 299 | NSString *key = [theEvent charactersIgnoringModifiers]; 300 | if(([theEvent modifierFlags] & NSCommandKeyMask) && [key isEqualToString:@"w"]){ 301 | [self close]; 302 | }else{ 303 | [super keyDown:theEvent]; 304 | } 305 | } 306 | 307 | @end 308 | -------------------------------------------------------------------------------- /Source/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // 10 March 2007 4 | // 5 | 6 | 7 | #import 8 | 9 | int main(int argc, char *argv[]) 10 | { 11 | return NSApplicationMain(argc, (const char **) argv); 12 | } 13 | -------------------------------------------------------------------------------- /prefswindow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kgn/DBPrefsWindowController/b7d34e07a97ca9d3bed63d3abe5043a19b632490/prefswindow.png --------------------------------------------------------------------------------