├── .gitattributes ├── CHANGELOG.md ├── LICENSE ├── PFAboutWindow.podspec ├── PFAboutWindow ├── PFAboutWindow.xib ├── PFAboutWindowController.h └── PFAboutWindowController.m ├── PFAboutWindowExample ├── PFAboutWindowExample.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ ├── xcshareddata │ │ │ └── PFAboutWindowExample.xccheckout │ │ └── xcuserdata │ │ │ └── soneejohn.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ └── xcuserdata │ │ └── soneejohn.xcuserdatad │ │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ ├── PFAboutWindowExample.xcscheme │ │ └── xcschememanagement.plist ├── PFAboutWindowExample │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Base.lproj │ │ └── MainMenu.xib │ ├── Credits.rtf │ ├── EULA.rtf │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Info.plist │ ├── Localizable.strings │ └── main.m └── PFAboutWindowExampleTests │ ├── Info.plist │ └── PFAboutWindowExampleTests.m ├── README.md └── screenshots ├── PFAboutWindow.gif └── PFAboutWindowFR.gif /.gitattributes: -------------------------------------------------------------------------------- 1 | ./PFAboutWindow.podspec linguist-vendored 2 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## PFAboutWindow Change Log 2 | **Created: V/XII/MMXV** 3 | (05/12/2015) 4 | 5 | ##### PFAboutWindow 1.0.1 6 | **What’s New:** 7 | * Improved compatibility for OS X Mavericks 8 | 9 | ##### PFAboutWindow 1.0.0 10 | **What’s New:** 11 | * Initial release 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-2016 Perceval F 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /PFAboutWindow.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | 3 | # ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 4 | s.name = "PFAboutWindow" 5 | s.version = "1.1.1" 6 | s.summary = "A replacement for the 'About' dialog." 7 | 8 | s.description = <<-DESC 9 | A sleek replacement for the otherwise bleak 'About' dialog. 10 | Its nice, looks like xCode6's one, and offers the following abilities 11 | 12 | * Open the app's website by clicking its (big) icon (in the dialog) (see Usage below), 13 | * Extend the dialog to show the 'License Agreement', or 14 | * The 'Acknowledgments' (see Content below), 15 | * Translate the button's text (see Localization below), 16 | * Change the background and text colors 17 | DESC 18 | 19 | s.homepage = "https://github.com/perfaram/PFAboutWindow" 20 | s.screenshots = "https://raw.githubusercontent.com/perfaram/PFAboutWindow/master/screenshots/PFAboutWindow.gif" 21 | 22 | # ――― Spec License ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 23 | s.license = "MIT" 24 | 25 | # ――― Author Metadata ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 26 | s.author = "Perceval FARAMAZ" 27 | 28 | # ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 29 | s.osx.deployment_target = "10.9" 30 | 31 | # ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 32 | s.source = { :git => "https://github.com/perfaram/PFAboutWindow.git" } 33 | 34 | # ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 35 | s.source_files = "PFAboutWindow/**/*.{h,m,xib}" 36 | 37 | # ――― Resources ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 38 | 39 | # ――― Project Linking ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 40 | 41 | # ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 42 | 43 | end 44 | -------------------------------------------------------------------------------- /PFAboutWindow/PFAboutWindow.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 | 55 | 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 | 96 | 101 | 102 | 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 | -------------------------------------------------------------------------------- /PFAboutWindow/PFAboutWindowController.h: -------------------------------------------------------------------------------- 1 | // 2 | // PFAboutWindowController.m 3 | // 4 | // Copyright (c) 2015 Perceval FARAMAZ (@perfaram). All rights reserved. 5 | // 6 | 7 | #import 8 | 9 | /** 10 | * The about window. 11 | */ 12 | @interface PFAboutWindowController : NSWindowController 13 | 14 | /** 15 | * The application name. 16 | * Default: CFBundleName 17 | */ 18 | @property (copy) NSString *appName; 19 | 20 | /** 21 | * The application version. 22 | * Default: "Version %@ (Build %@)", CFBundleVersion, CFBundleShortVersionString 23 | */ 24 | @property (copy) NSString *appVersion; 25 | 26 | /** 27 | * The copyright line. 28 | * Default: NSHumanReadableCopyright 29 | */ 30 | @property (copy) NSAttributedString *appCopyright; 31 | 32 | /** 33 | * The credits. 34 | * Default: contents of file at [[NSBundle mainBundle] pathForResource:@"Credits" ofType:@"rtf"]; 35 | */ 36 | @property (copy) NSAttributedString *appCredits; 37 | 38 | /** 39 | * The EULA. 40 | * Default: contents of file at [[NSBundle mainBundle] pathForResource:@"EULA" ofType:@"rtf"]; 41 | */ 42 | @property (copy) NSAttributedString *appEULA; 43 | 44 | /** 45 | * The URL pointing to the app's website. 46 | * Default: none 47 | */ 48 | @property (strong) NSURL *appURL; 49 | 50 | /** 51 | * The current text shown. 52 | */ 53 | @property (copy) NSAttributedString *textShown; 54 | 55 | @property int windowState; 56 | 57 | /** 58 | * Visit the website. 59 | * 60 | * @param sender The object making the call. 61 | */ 62 | - (IBAction)visitWebsite:(id)sender; 63 | 64 | /** 65 | * Show credits for libraries used etc. 66 | * 67 | * @param sender The object making the call. 68 | */ 69 | - (IBAction)showCredits:(id)sender; 70 | 71 | /** 72 | * Show the End User License Agreement for your app. 73 | * 74 | * @param sender The object making the call. 75 | */ 76 | - (IBAction)showEULA:(id)sender; 77 | 78 | /** 79 | * Show the Copyrights for your app. 80 | * 81 | * @param sender The object making the call. 82 | */ 83 | - (IBAction)showCopyright:(id)sender; 84 | 85 | /** 86 | * Called when window is about to close. 87 | * 88 | * @param sender The object making the call. 89 | */ 90 | - (BOOL)windowShouldClose:(id)sender; 91 | 92 | /** 93 | * Specify whether or not the window should use a shadow. 94 | * Default: YES 95 | */ 96 | @property (assign) BOOL windowShouldHaveShadow; 97 | 98 | /** 99 | * Select the text (Acknowledgments & EULA) color. 100 | * Default : light grey 101 | */ 102 | - (instancetype) initWithBackgroundColor:(NSColor*)background titleColor:(NSColor*)title textColor:(NSColor*)text; 103 | 104 | @end 105 | -------------------------------------------------------------------------------- /PFAboutWindow/PFAboutWindowController.m: -------------------------------------------------------------------------------- 1 | // 2 | // PFAboutWindowController.m 3 | // 4 | // Copyright (c) 2015 Perceval FARAMAZ (@perfaram). All rights reserved. 5 | // 6 | 7 | #import "PFAboutWindowController.h" 8 | 9 | @interface PFAboutWindowController() 10 | 11 | /** The window nib to load. */ 12 | + (NSString *)nibName; 13 | 14 | /** The info view. */ 15 | @property (assign) IBOutlet NSView *infoView; 16 | 17 | /** The main text view. */ 18 | @property (assign) IBOutlet NSTextView *textField; 19 | 20 | /** The app version's text view. */ 21 | @property (assign) IBOutlet NSTextField *versionField; 22 | 23 | /** The app version's text view. */ 24 | @property (assign) IBOutlet NSTextField *nameField; 25 | 26 | /** The button that opens the app's website. */ 27 | @property (assign) IBOutlet NSButton *visitWebsiteButton; 28 | 29 | /** The button that opens the EULA. */ 30 | @property (assign) IBOutlet NSButton *EULAButton; 31 | 32 | /** The button that opens the credits. */ 33 | @property (assign) IBOutlet NSButton *creditsButton; 34 | 35 | /** The view that's currently active. */ 36 | @property (assign) NSView *activeView; 37 | 38 | /** The string to hold the credits if we're showing them in same window. */ 39 | @property (copy) NSAttributedString *creditsString; 40 | 41 | /** Select a background color (defaults to white). */ 42 | @property () NSColor *backgroundColor; 43 | 44 | /** Select the title (app name & version) color (defaults to black). */ 45 | @property () NSColor *titleColor; 46 | 47 | /** Select the text (Acknowledgments & EULA) color (defaults to light grey). */ 48 | @property () NSColor *textColor; 49 | 50 | @end 51 | 52 | @implementation PFAboutWindowController 53 | 54 | #pragma mark - Class Methods 55 | 56 | + (NSString *)nibName { 57 | return @"PFAboutWindow"; 58 | } 59 | 60 | #pragma mark - Overrides 61 | 62 | - (id)init { 63 | self.windowShouldHaveShadow = YES; 64 | self.backgroundColor = [NSColor whiteColor]; 65 | self.titleColor = [NSColor blackColor]; 66 | self.textColor = (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_9) ? [NSColor lightGrayColor] : [NSColor tertiaryLabelColor]; 67 | 68 | return [super initWithWindowNibName:[[self class] nibName]]; 69 | } 70 | 71 | - (void)windowDidLoad { 72 | [super windowDidLoad]; 73 | self.windowState = 0; 74 | self.infoView.layer.cornerRadius = 10.0; 75 | self.window.backgroundColor = self.backgroundColor; 76 | [self.window setHasShadow:self.windowShouldHaveShadow]; 77 | // Change highlight of the `visitWebsiteButton` when it's clicked. Otherwise, the button will have a highlight around it which isn't visually pleasing. 78 | [self.visitWebsiteButton.cell setHighlightsBy:NSContentsCellMask]; 79 | 80 | // Load variables 81 | NSDictionary *bundleDict = [[NSBundle mainBundle] infoDictionary]; 82 | 83 | // Set app name 84 | if(!self.appName) { 85 | self.appName = [bundleDict objectForKey:@"CFBundleName"]; 86 | } 87 | 88 | // Set app version 89 | if(!self.appVersion) { 90 | NSString *version = [bundleDict objectForKey:@"CFBundleVersion"]; 91 | NSString *shortVersion = [bundleDict objectForKey:@"CFBundleShortVersionString"]; 92 | self.appVersion = [NSString stringWithFormat:NSLocalizedString(@"Version %@ (Build %@)", @"Version %@ (Build %@), displayed in the about window"), shortVersion, version]; 93 | } 94 | 95 | // Set copyright 96 | if(!self.appCopyright) { 97 | self.appCopyright = [[NSAttributedString alloc] initWithString:[bundleDict objectForKey:@"NSHumanReadableCopyright"] attributes:@{ 98 | NSFontAttributeName:[NSFont fontWithName:@"HelveticaNeue" size:11]/*/NSParagraphStyleAttributeName : paragraphStyle*/}]; 99 | } 100 | 101 | // Code that can potentially throw an exception 102 | // Set credits 103 | if(!self.appCredits) { 104 | @try { 105 | self.appCredits = [[NSAttributedString alloc] initWithPath:[[NSBundle mainBundle] pathForResource:@"Credits" ofType:@"rtf"] documentAttributes:nil]; 106 | } 107 | @catch (NSException *exception) { 108 | // hide the credits button 109 | [self.creditsButton setHidden:YES]; 110 | NSLog(@"PFAboutWindowController did handle exception: %@",exception); 111 | } 112 | } 113 | // Set EULA 114 | if(!self.appEULA) { 115 | @try { 116 | self.appEULA = [[NSAttributedString alloc] initWithPath:[[NSBundle mainBundle] pathForResource:@"EULA" ofType:@"rtf"] documentAttributes:nil]; 117 | } 118 | @catch (NSException *exception) { 119 | // hide the eula button 120 | [self.EULAButton setHidden:YES]; 121 | NSLog(@"PFAboutWindowController did handle exception: %@",exception); 122 | } 123 | } 124 | 125 | [self.textField.textStorage setAttributedString:self.appCopyright]; 126 | self.creditsButton.title = NSLocalizedString(@"Credits", @"Caption of the 'Credits' button in the about window"); 127 | self.EULAButton.title = NSLocalizedString(@"License Agreement", @"Caption of the 'License Agreement' button in the about window"); 128 | 129 | _textField.textColor = self.textColor; 130 | _versionField.textColor = self.titleColor; 131 | _nameField.textColor = self.titleColor; 132 | self.window.backgroundColor = self.backgroundColor; 133 | } 134 | 135 | -(void) showCredits:(id)sender { 136 | if (self.windowState!=1) { 137 | CGFloat amountToIncreaseHeight = 100; 138 | NSRect oldFrame = [self.window frame]; 139 | oldFrame.size.height += amountToIncreaseHeight; 140 | oldFrame.origin.y -= amountToIncreaseHeight; 141 | [self.window setFrame:oldFrame display:YES animate:NSAnimationLinear]; 142 | self.windowState = 1; 143 | } 144 | [self.textField.textStorage setAttributedString:self.appCredits]; 145 | _textField.textColor = self.textColor; 146 | } 147 | 148 | -(void) showEULA:(id)sender { 149 | if (self.windowState!=1) { 150 | CGFloat amountToIncreaseHeight = 100; 151 | NSRect oldFrame = [self.window frame]; 152 | oldFrame.size.height += amountToIncreaseHeight; 153 | oldFrame.origin.y -= amountToIncreaseHeight; 154 | [self.window setFrame:oldFrame display:YES animate:NSAnimationLinear]; 155 | self.windowState = 1; 156 | } 157 | [self.textField.textStorage setAttributedString:self.appEULA]; 158 | _textField.textColor = self.textColor; 159 | } 160 | 161 | -(void) showCopyright:(id)sender { 162 | if (self.windowState!=0) { 163 | CGFloat amountToIncreaseHeight = -100; 164 | NSRect oldFrame = [self.window frame]; 165 | oldFrame.size.height += amountToIncreaseHeight; 166 | oldFrame.origin.y -= amountToIncreaseHeight; 167 | [self.window setFrame:oldFrame display:YES animate:NSAnimationLinear]; 168 | self.windowState = 0; 169 | } 170 | [self.textField.textStorage setAttributedString:self.appCopyright]; 171 | _textField.textColor = self.textColor; 172 | } 173 | 174 | - (IBAction)visitWebsite:(id)sender { 175 | [[NSWorkspace sharedWorkspace] openURL:self.appURL]; 176 | } 177 | 178 | - (void)showWindow:(id)sender 179 | { 180 | // make sure the window will be visible and centered 181 | [NSApp activateIgnoringOtherApps:YES]; 182 | [self.window center]; 183 | [self showCopyright:sender]; 184 | [super showWindow:sender]; 185 | } 186 | 187 | #pragma mark - Public Methods 188 | 189 | - (id)initWithBackgroundColor:(NSColor*)background titleColor:(NSColor*)title textColor:(NSColor*)text { 190 | self.windowShouldHaveShadow = YES; 191 | self.backgroundColor = background; 192 | self.titleColor = title; 193 | self.textColor = text; 194 | return [super initWithWindowNibName:[[self class] nibName]]; 195 | } 196 | 197 | @end 198 | -------------------------------------------------------------------------------- /PFAboutWindowExample/PFAboutWindowExample.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 0B8307F01AD6AF3D0001B4C3 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B8307EF1AD6AF3D0001B4C3 /* AppDelegate.m */; }; 11 | 0B8307F21AD6AF3D0001B4C3 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B8307F11AD6AF3D0001B4C3 /* main.m */; }; 12 | 0B8307F41AD6AF3D0001B4C3 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0B8307F31AD6AF3D0001B4C3 /* Images.xcassets */; }; 13 | 0B8307F71AD6AF3D0001B4C3 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0B8307F51AD6AF3D0001B4C3 /* MainMenu.xib */; }; 14 | 0B8308031AD6AF3D0001B4C3 /* PFAboutWindowExampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B8308021AD6AF3D0001B4C3 /* PFAboutWindowExampleTests.m */; }; 15 | 0B8308131AD6C2500001B4C3 /* PFAboutWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0B8308101AD6C2500001B4C3 /* PFAboutWindow.xib */; }; 16 | 0B8308141AD6C2500001B4C3 /* PFAboutWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B8308121AD6C2500001B4C3 /* PFAboutWindowController.m */; }; 17 | 0B8308161AD6C2F20001B4C3 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 0B8308151AD6C2F20001B4C3 /* Credits.rtf */; }; 18 | 0B8308181AD7AFD90001B4C3 /* EULA.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 0B8308171AD7AFD90001B4C3 /* EULA.rtf */; }; 19 | 0B83081A1AD80D300001B4C3 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0B8308191AD80D300001B4C3 /* Localizable.strings */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXContainerItemProxy section */ 23 | 0B8307FD1AD6AF3D0001B4C3 /* PBXContainerItemProxy */ = { 24 | isa = PBXContainerItemProxy; 25 | containerPortal = 0B8307E11AD6AF3D0001B4C3 /* Project object */; 26 | proxyType = 1; 27 | remoteGlobalIDString = 0B8307E81AD6AF3D0001B4C3; 28 | remoteInfo = PFAboutWindowExample; 29 | }; 30 | /* End PBXContainerItemProxy section */ 31 | 32 | /* Begin PBXFileReference section */ 33 | 0B8307E91AD6AF3D0001B4C3 /* PFAboutWindowExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PFAboutWindowExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 34 | 0B8307ED1AD6AF3D0001B4C3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 35 | 0B8307EE1AD6AF3D0001B4C3 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 36 | 0B8307EF1AD6AF3D0001B4C3 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 37 | 0B8307F11AD6AF3D0001B4C3 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 38 | 0B8307F31AD6AF3D0001B4C3 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 39 | 0B8307F61AD6AF3D0001B4C3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 40 | 0B8307FC1AD6AF3D0001B4C3 /* PFAboutWindowExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PFAboutWindowExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 0B8308011AD6AF3D0001B4C3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 42 | 0B8308021AD6AF3D0001B4C3 /* PFAboutWindowExampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFAboutWindowExampleTests.m; sourceTree = ""; }; 43 | 0B8308101AD6C2500001B4C3 /* PFAboutWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = PFAboutWindow.xib; path = ../../PFAboutWindow/PFAboutWindow.xib; sourceTree = ""; }; 44 | 0B8308111AD6C2500001B4C3 /* PFAboutWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PFAboutWindowController.h; path = ../../PFAboutWindow/PFAboutWindowController.h; sourceTree = ""; }; 45 | 0B8308121AD6C2500001B4C3 /* PFAboutWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PFAboutWindowController.m; path = ../../PFAboutWindow/PFAboutWindowController.m; sourceTree = ""; }; 46 | 0B8308151AD6C2F20001B4C3 /* Credits.rtf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.rtf; path = Credits.rtf; sourceTree = ""; }; 47 | 0B8308171AD7AFD90001B4C3 /* EULA.rtf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.rtf; path = EULA.rtf; sourceTree = ""; }; 48 | 0B8308191AD80D300001B4C3 /* Localizable.strings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; path = Localizable.strings; sourceTree = ""; }; 49 | /* End PBXFileReference section */ 50 | 51 | /* Begin PBXFrameworksBuildPhase section */ 52 | 0B8307E61AD6AF3D0001B4C3 /* Frameworks */ = { 53 | isa = PBXFrameworksBuildPhase; 54 | buildActionMask = 2147483647; 55 | files = ( 56 | ); 57 | runOnlyForDeploymentPostprocessing = 0; 58 | }; 59 | 0B8307F91AD6AF3D0001B4C3 /* Frameworks */ = { 60 | isa = PBXFrameworksBuildPhase; 61 | buildActionMask = 2147483647; 62 | files = ( 63 | ); 64 | runOnlyForDeploymentPostprocessing = 0; 65 | }; 66 | /* End PBXFrameworksBuildPhase section */ 67 | 68 | /* Begin PBXGroup section */ 69 | 0B8307E01AD6AF3D0001B4C3 = { 70 | isa = PBXGroup; 71 | children = ( 72 | 0B8307EB1AD6AF3D0001B4C3 /* PFAboutWindowExample */, 73 | 0B8307FF1AD6AF3D0001B4C3 /* PFAboutWindowExampleTests */, 74 | 0B8307EA1AD6AF3D0001B4C3 /* Products */, 75 | ); 76 | sourceTree = ""; 77 | }; 78 | 0B8307EA1AD6AF3D0001B4C3 /* Products */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | 0B8307E91AD6AF3D0001B4C3 /* PFAboutWindowExample.app */, 82 | 0B8307FC1AD6AF3D0001B4C3 /* PFAboutWindowExampleTests.xctest */, 83 | ); 84 | name = Products; 85 | sourceTree = ""; 86 | }; 87 | 0B8307EB1AD6AF3D0001B4C3 /* PFAboutWindowExample */ = { 88 | isa = PBXGroup; 89 | children = ( 90 | 0B8308101AD6C2500001B4C3 /* PFAboutWindow.xib */, 91 | 0B8308111AD6C2500001B4C3 /* PFAboutWindowController.h */, 92 | 0B8308121AD6C2500001B4C3 /* PFAboutWindowController.m */, 93 | 0B8308191AD80D300001B4C3 /* Localizable.strings */, 94 | 0B8307EE1AD6AF3D0001B4C3 /* AppDelegate.h */, 95 | 0B8307EF1AD6AF3D0001B4C3 /* AppDelegate.m */, 96 | 0B8307F31AD6AF3D0001B4C3 /* Images.xcassets */, 97 | 0B8307F51AD6AF3D0001B4C3 /* MainMenu.xib */, 98 | 0B8307EC1AD6AF3D0001B4C3 /* Supporting Files */, 99 | ); 100 | path = PFAboutWindowExample; 101 | sourceTree = ""; 102 | }; 103 | 0B8307EC1AD6AF3D0001B4C3 /* Supporting Files */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | 0B8307ED1AD6AF3D0001B4C3 /* Info.plist */, 107 | 0B8307F11AD6AF3D0001B4C3 /* main.m */, 108 | 0B8308151AD6C2F20001B4C3 /* Credits.rtf */, 109 | 0B8308171AD7AFD90001B4C3 /* EULA.rtf */, 110 | ); 111 | name = "Supporting Files"; 112 | sourceTree = ""; 113 | }; 114 | 0B8307FF1AD6AF3D0001B4C3 /* PFAboutWindowExampleTests */ = { 115 | isa = PBXGroup; 116 | children = ( 117 | 0B8308021AD6AF3D0001B4C3 /* PFAboutWindowExampleTests.m */, 118 | 0B8308001AD6AF3D0001B4C3 /* Supporting Files */, 119 | ); 120 | path = PFAboutWindowExampleTests; 121 | sourceTree = ""; 122 | }; 123 | 0B8308001AD6AF3D0001B4C3 /* Supporting Files */ = { 124 | isa = PBXGroup; 125 | children = ( 126 | 0B8308011AD6AF3D0001B4C3 /* Info.plist */, 127 | ); 128 | name = "Supporting Files"; 129 | sourceTree = ""; 130 | }; 131 | /* End PBXGroup section */ 132 | 133 | /* Begin PBXNativeTarget section */ 134 | 0B8307E81AD6AF3D0001B4C3 /* PFAboutWindowExample */ = { 135 | isa = PBXNativeTarget; 136 | buildConfigurationList = 0B8308061AD6AF3D0001B4C3 /* Build configuration list for PBXNativeTarget "PFAboutWindowExample" */; 137 | buildPhases = ( 138 | 0B8307E51AD6AF3D0001B4C3 /* Sources */, 139 | 0B8307E61AD6AF3D0001B4C3 /* Frameworks */, 140 | 0B8307E71AD6AF3D0001B4C3 /* Resources */, 141 | ); 142 | buildRules = ( 143 | ); 144 | dependencies = ( 145 | ); 146 | name = PFAboutWindowExample; 147 | productName = PFAboutWindowExample; 148 | productReference = 0B8307E91AD6AF3D0001B4C3 /* PFAboutWindowExample.app */; 149 | productType = "com.apple.product-type.application"; 150 | }; 151 | 0B8307FB1AD6AF3D0001B4C3 /* PFAboutWindowExampleTests */ = { 152 | isa = PBXNativeTarget; 153 | buildConfigurationList = 0B8308091AD6AF3D0001B4C3 /* Build configuration list for PBXNativeTarget "PFAboutWindowExampleTests" */; 154 | buildPhases = ( 155 | 0B8307F81AD6AF3D0001B4C3 /* Sources */, 156 | 0B8307F91AD6AF3D0001B4C3 /* Frameworks */, 157 | 0B8307FA1AD6AF3D0001B4C3 /* Resources */, 158 | ); 159 | buildRules = ( 160 | ); 161 | dependencies = ( 162 | 0B8307FE1AD6AF3D0001B4C3 /* PBXTargetDependency */, 163 | ); 164 | name = PFAboutWindowExampleTests; 165 | productName = PFAboutWindowExampleTests; 166 | productReference = 0B8307FC1AD6AF3D0001B4C3 /* PFAboutWindowExampleTests.xctest */; 167 | productType = "com.apple.product-type.bundle.unit-test"; 168 | }; 169 | /* End PBXNativeTarget section */ 170 | 171 | /* Begin PBXProject section */ 172 | 0B8307E11AD6AF3D0001B4C3 /* Project object */ = { 173 | isa = PBXProject; 174 | attributes = { 175 | LastUpgradeCheck = 0620; 176 | ORGANIZATIONNAME = faramaz; 177 | TargetAttributes = { 178 | 0B8307E81AD6AF3D0001B4C3 = { 179 | CreatedOnToolsVersion = 6.2; 180 | }; 181 | 0B8307FB1AD6AF3D0001B4C3 = { 182 | CreatedOnToolsVersion = 6.2; 183 | TestTargetID = 0B8307E81AD6AF3D0001B4C3; 184 | }; 185 | }; 186 | }; 187 | buildConfigurationList = 0B8307E41AD6AF3D0001B4C3 /* Build configuration list for PBXProject "PFAboutWindowExample" */; 188 | compatibilityVersion = "Xcode 3.2"; 189 | developmentRegion = English; 190 | hasScannedForEncodings = 0; 191 | knownRegions = ( 192 | en, 193 | Base, 194 | ); 195 | mainGroup = 0B8307E01AD6AF3D0001B4C3; 196 | productRefGroup = 0B8307EA1AD6AF3D0001B4C3 /* Products */; 197 | projectDirPath = ""; 198 | projectRoot = ""; 199 | targets = ( 200 | 0B8307E81AD6AF3D0001B4C3 /* PFAboutWindowExample */, 201 | 0B8307FB1AD6AF3D0001B4C3 /* PFAboutWindowExampleTests */, 202 | ); 203 | }; 204 | /* End PBXProject section */ 205 | 206 | /* Begin PBXResourcesBuildPhase section */ 207 | 0B8307E71AD6AF3D0001B4C3 /* Resources */ = { 208 | isa = PBXResourcesBuildPhase; 209 | buildActionMask = 2147483647; 210 | files = ( 211 | 0B8308181AD7AFD90001B4C3 /* EULA.rtf in Resources */, 212 | 0B83081A1AD80D300001B4C3 /* Localizable.strings in Resources */, 213 | 0B8307F41AD6AF3D0001B4C3 /* Images.xcassets in Resources */, 214 | 0B8307F71AD6AF3D0001B4C3 /* MainMenu.xib in Resources */, 215 | 0B8308131AD6C2500001B4C3 /* PFAboutWindow.xib in Resources */, 216 | 0B8308161AD6C2F20001B4C3 /* Credits.rtf in Resources */, 217 | ); 218 | runOnlyForDeploymentPostprocessing = 0; 219 | }; 220 | 0B8307FA1AD6AF3D0001B4C3 /* Resources */ = { 221 | isa = PBXResourcesBuildPhase; 222 | buildActionMask = 2147483647; 223 | files = ( 224 | ); 225 | runOnlyForDeploymentPostprocessing = 0; 226 | }; 227 | /* End PBXResourcesBuildPhase section */ 228 | 229 | /* Begin PBXSourcesBuildPhase section */ 230 | 0B8307E51AD6AF3D0001B4C3 /* Sources */ = { 231 | isa = PBXSourcesBuildPhase; 232 | buildActionMask = 2147483647; 233 | files = ( 234 | 0B8307F21AD6AF3D0001B4C3 /* main.m in Sources */, 235 | 0B8307F01AD6AF3D0001B4C3 /* AppDelegate.m in Sources */, 236 | 0B8308141AD6C2500001B4C3 /* PFAboutWindowController.m in Sources */, 237 | ); 238 | runOnlyForDeploymentPostprocessing = 0; 239 | }; 240 | 0B8307F81AD6AF3D0001B4C3 /* Sources */ = { 241 | isa = PBXSourcesBuildPhase; 242 | buildActionMask = 2147483647; 243 | files = ( 244 | 0B8308031AD6AF3D0001B4C3 /* PFAboutWindowExampleTests.m in Sources */, 245 | ); 246 | runOnlyForDeploymentPostprocessing = 0; 247 | }; 248 | /* End PBXSourcesBuildPhase section */ 249 | 250 | /* Begin PBXTargetDependency section */ 251 | 0B8307FE1AD6AF3D0001B4C3 /* PBXTargetDependency */ = { 252 | isa = PBXTargetDependency; 253 | target = 0B8307E81AD6AF3D0001B4C3 /* PFAboutWindowExample */; 254 | targetProxy = 0B8307FD1AD6AF3D0001B4C3 /* PBXContainerItemProxy */; 255 | }; 256 | /* End PBXTargetDependency section */ 257 | 258 | /* Begin PBXVariantGroup section */ 259 | 0B8307F51AD6AF3D0001B4C3 /* MainMenu.xib */ = { 260 | isa = PBXVariantGroup; 261 | children = ( 262 | 0B8307F61AD6AF3D0001B4C3 /* Base */, 263 | ); 264 | name = MainMenu.xib; 265 | sourceTree = ""; 266 | }; 267 | /* End PBXVariantGroup section */ 268 | 269 | /* Begin XCBuildConfiguration section */ 270 | 0B8308041AD6AF3D0001B4C3 /* Debug */ = { 271 | isa = XCBuildConfiguration; 272 | buildSettings = { 273 | ALWAYS_SEARCH_USER_PATHS = NO; 274 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 275 | CLANG_CXX_LIBRARY = "libc++"; 276 | CLANG_ENABLE_MODULES = YES; 277 | CLANG_ENABLE_OBJC_ARC = YES; 278 | CLANG_WARN_BOOL_CONVERSION = YES; 279 | CLANG_WARN_CONSTANT_CONVERSION = YES; 280 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 281 | CLANG_WARN_EMPTY_BODY = YES; 282 | CLANG_WARN_ENUM_CONVERSION = YES; 283 | CLANG_WARN_INT_CONVERSION = YES; 284 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 285 | CLANG_WARN_UNREACHABLE_CODE = YES; 286 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 287 | CODE_SIGN_IDENTITY = "-"; 288 | COPY_PHASE_STRIP = NO; 289 | ENABLE_STRICT_OBJC_MSGSEND = YES; 290 | GCC_C_LANGUAGE_STANDARD = gnu99; 291 | GCC_DYNAMIC_NO_PIC = NO; 292 | GCC_OPTIMIZATION_LEVEL = 0; 293 | GCC_PREPROCESSOR_DEFINITIONS = ( 294 | "DEBUG=1", 295 | "$(inherited)", 296 | ); 297 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 298 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 299 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 300 | GCC_WARN_UNDECLARED_SELECTOR = YES; 301 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 302 | GCC_WARN_UNUSED_FUNCTION = YES; 303 | GCC_WARN_UNUSED_VARIABLE = YES; 304 | MACOSX_DEPLOYMENT_TARGET = 10.10; 305 | MTL_ENABLE_DEBUG_INFO = YES; 306 | ONLY_ACTIVE_ARCH = YES; 307 | SDKROOT = macosx; 308 | }; 309 | name = Debug; 310 | }; 311 | 0B8308051AD6AF3D0001B4C3 /* Release */ = { 312 | isa = XCBuildConfiguration; 313 | buildSettings = { 314 | ALWAYS_SEARCH_USER_PATHS = NO; 315 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 316 | CLANG_CXX_LIBRARY = "libc++"; 317 | CLANG_ENABLE_MODULES = YES; 318 | CLANG_ENABLE_OBJC_ARC = YES; 319 | CLANG_WARN_BOOL_CONVERSION = YES; 320 | CLANG_WARN_CONSTANT_CONVERSION = YES; 321 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 322 | CLANG_WARN_EMPTY_BODY = YES; 323 | CLANG_WARN_ENUM_CONVERSION = YES; 324 | CLANG_WARN_INT_CONVERSION = YES; 325 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 326 | CLANG_WARN_UNREACHABLE_CODE = YES; 327 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 328 | CODE_SIGN_IDENTITY = "-"; 329 | COPY_PHASE_STRIP = NO; 330 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 331 | ENABLE_NS_ASSERTIONS = NO; 332 | ENABLE_STRICT_OBJC_MSGSEND = YES; 333 | GCC_C_LANGUAGE_STANDARD = gnu99; 334 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 335 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 336 | GCC_WARN_UNDECLARED_SELECTOR = YES; 337 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 338 | GCC_WARN_UNUSED_FUNCTION = YES; 339 | GCC_WARN_UNUSED_VARIABLE = YES; 340 | MACOSX_DEPLOYMENT_TARGET = 10.10; 341 | MTL_ENABLE_DEBUG_INFO = NO; 342 | SDKROOT = macosx; 343 | }; 344 | name = Release; 345 | }; 346 | 0B8308071AD6AF3D0001B4C3 /* Debug */ = { 347 | isa = XCBuildConfiguration; 348 | buildSettings = { 349 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 350 | COMBINE_HIDPI_IMAGES = YES; 351 | INFOPLIST_FILE = PFAboutWindowExample/Info.plist; 352 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 353 | PRODUCT_NAME = "$(TARGET_NAME)"; 354 | }; 355 | name = Debug; 356 | }; 357 | 0B8308081AD6AF3D0001B4C3 /* Release */ = { 358 | isa = XCBuildConfiguration; 359 | buildSettings = { 360 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 361 | COMBINE_HIDPI_IMAGES = YES; 362 | INFOPLIST_FILE = PFAboutWindowExample/Info.plist; 363 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 364 | PRODUCT_NAME = "$(TARGET_NAME)"; 365 | }; 366 | name = Release; 367 | }; 368 | 0B83080A1AD6AF3D0001B4C3 /* Debug */ = { 369 | isa = XCBuildConfiguration; 370 | buildSettings = { 371 | BUNDLE_LOADER = "$(TEST_HOST)"; 372 | COMBINE_HIDPI_IMAGES = YES; 373 | FRAMEWORK_SEARCH_PATHS = ( 374 | "$(DEVELOPER_FRAMEWORKS_DIR)", 375 | "$(inherited)", 376 | ); 377 | GCC_PREPROCESSOR_DEFINITIONS = ( 378 | "DEBUG=1", 379 | "$(inherited)", 380 | ); 381 | INFOPLIST_FILE = PFAboutWindowExampleTests/Info.plist; 382 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 383 | PRODUCT_NAME = "$(TARGET_NAME)"; 384 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PFAboutWindowExample.app/Contents/MacOS/PFAboutWindowExample"; 385 | }; 386 | name = Debug; 387 | }; 388 | 0B83080B1AD6AF3D0001B4C3 /* Release */ = { 389 | isa = XCBuildConfiguration; 390 | buildSettings = { 391 | BUNDLE_LOADER = "$(TEST_HOST)"; 392 | COMBINE_HIDPI_IMAGES = YES; 393 | FRAMEWORK_SEARCH_PATHS = ( 394 | "$(DEVELOPER_FRAMEWORKS_DIR)", 395 | "$(inherited)", 396 | ); 397 | INFOPLIST_FILE = PFAboutWindowExampleTests/Info.plist; 398 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 399 | PRODUCT_NAME = "$(TARGET_NAME)"; 400 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PFAboutWindowExample.app/Contents/MacOS/PFAboutWindowExample"; 401 | }; 402 | name = Release; 403 | }; 404 | /* End XCBuildConfiguration section */ 405 | 406 | /* Begin XCConfigurationList section */ 407 | 0B8307E41AD6AF3D0001B4C3 /* Build configuration list for PBXProject "PFAboutWindowExample" */ = { 408 | isa = XCConfigurationList; 409 | buildConfigurations = ( 410 | 0B8308041AD6AF3D0001B4C3 /* Debug */, 411 | 0B8308051AD6AF3D0001B4C3 /* Release */, 412 | ); 413 | defaultConfigurationIsVisible = 0; 414 | defaultConfigurationName = Release; 415 | }; 416 | 0B8308061AD6AF3D0001B4C3 /* Build configuration list for PBXNativeTarget "PFAboutWindowExample" */ = { 417 | isa = XCConfigurationList; 418 | buildConfigurations = ( 419 | 0B8308071AD6AF3D0001B4C3 /* Debug */, 420 | 0B8308081AD6AF3D0001B4C3 /* Release */, 421 | ); 422 | defaultConfigurationIsVisible = 0; 423 | defaultConfigurationName = Release; 424 | }; 425 | 0B8308091AD6AF3D0001B4C3 /* Build configuration list for PBXNativeTarget "PFAboutWindowExampleTests" */ = { 426 | isa = XCConfigurationList; 427 | buildConfigurations = ( 428 | 0B83080A1AD6AF3D0001B4C3 /* Debug */, 429 | 0B83080B1AD6AF3D0001B4C3 /* Release */, 430 | ); 431 | defaultConfigurationIsVisible = 0; 432 | defaultConfigurationName = Release; 433 | }; 434 | /* End XCConfigurationList section */ 435 | }; 436 | rootObject = 0B8307E11AD6AF3D0001B4C3 /* Project object */; 437 | } 438 | -------------------------------------------------------------------------------- /PFAboutWindowExample/PFAboutWindowExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /PFAboutWindowExample/PFAboutWindowExample.xcodeproj/project.xcworkspace/xcshareddata/PFAboutWindowExample.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | 1A1B13D8-14A2-4699-97D3-4D67AF5FB419 9 | IDESourceControlProjectName 10 | PFAboutWindowExample 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | 7BCDC6582A5AB53449720B4AEE2FF9BB911EE594 14 | https://github.com/SoneeJohn/PFAboutWindow.git 15 | 16 | IDESourceControlProjectPath 17 | PFAboutWindowExample/PFAboutWindowExample.xcodeproj 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | 7BCDC6582A5AB53449720B4AEE2FF9BB911EE594 21 | ../../.. 22 | 23 | IDESourceControlProjectURL 24 | https://github.com/SoneeJohn/PFAboutWindow.git 25 | IDESourceControlProjectVersion 26 | 111 27 | IDESourceControlProjectWCCIdentifier 28 | 7BCDC6582A5AB53449720B4AEE2FF9BB911EE594 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | 7BCDC6582A5AB53449720B4AEE2FF9BB911EE594 36 | IDESourceControlWCCName 37 | PFAboutWindow 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /PFAboutWindowExample/PFAboutWindowExample.xcodeproj/project.xcworkspace/xcuserdata/soneejohn.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfaram/PFAboutWindow/3e61c7f2b256784f1cdd0c7fdf039c7986e8c168/PFAboutWindowExample/PFAboutWindowExample.xcodeproj/project.xcworkspace/xcuserdata/soneejohn.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /PFAboutWindowExample/PFAboutWindowExample.xcodeproj/xcuserdata/soneejohn.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 20 | 21 | 22 | 24 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /PFAboutWindowExample/PFAboutWindowExample.xcodeproj/xcuserdata/soneejohn.xcuserdatad/xcschemes/PFAboutWindowExample.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 77 | 83 | 84 | 85 | 86 | 87 | 88 | 94 | 96 | 102 | 103 | 104 | 105 | 107 | 108 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /PFAboutWindowExample/PFAboutWindowExample.xcodeproj/xcuserdata/soneejohn.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | PFAboutWindowExample.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 0B8307E81AD6AF3D0001B4C3 16 | 17 | primary 18 | 19 | 20 | 0B8307FB1AD6AF3D0001B4C3 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /PFAboutWindowExample/PFAboutWindowExample/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // PFAboutWindowExample 4 | // 5 | // Created by Perceval FARAMAZ on 09/04/15. 6 | // Copyright (c) 2015 faramaz. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "../../PFAboutWindow/PFAboutWindowController.h" 11 | 12 | @interface AppDelegate : NSObject 13 | @property PFAboutWindowController *aboutWindowController; 14 | 15 | @end 16 | 17 | -------------------------------------------------------------------------------- /PFAboutWindowExample/PFAboutWindowExample/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // PFAboutWindowExample 4 | // 5 | // Created by Perceval FARAMAZ on 09/04/15. 6 | // Copyright (c) 2015 faramaz. 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 | NSColor* bgColor = [NSColor colorWithWhite:0.2 alpha:1]; 20 | //Sets About window color theme to dark 21 | self.aboutWindowController = [[PFAboutWindowController alloc] initWithBackgroundColor:bgColor titleColor:[NSColor whiteColor] textColor:[NSColor lightGrayColor]]; 22 | } 23 | 24 | - (void)applicationWillTerminate:(NSNotification *)aNotification { 25 | // Insert code here to tear down your application 26 | } 27 | 28 | - (IBAction)showAboutWindow:(id)sender { 29 | [self.aboutWindowController setAppURL:[[NSURL alloc] initWithString:@"http://app.faramaz.com"]]; 30 | [self.aboutWindowController setAppName:@"PFAbout"]; 31 | [self.aboutWindowController setAppCopyright:[[NSAttributedString alloc] initWithString:@"Copyright (c) 2015 Perceval F" 32 | attributes:@{ 33 | NSForegroundColorAttributeName : [NSColor tertiaryLabelColor], 34 | NSFontAttributeName : [NSFont fontWithName:@"HelveticaNeue" size:11]}]]; 35 | [self.aboutWindowController setWindowShouldHaveShadow:YES]; 36 | //Example of giving your own string, instead of using the content of the default Credits.rtf file 37 | [self.aboutWindowController setAppCredits:[NSAttributedString.alloc initWithString:@"Credits where credit's due"]]; 38 | [self.aboutWindowController showWindow:nil]; 39 | } 40 | 41 | @end 42 | -------------------------------------------------------------------------------- /PFAboutWindowExample/PFAboutWindowExample/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 | -------------------------------------------------------------------------------- /PFAboutWindowExample/PFAboutWindowExample/Credits.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg1252\cocoartf1344\cocoasubrtf720 2 | {\fonttbl\f0\fswiss\fcharset0 Helvetica;} 3 | {\colortbl;\red255\green255\blue255;} 4 | \margl1440\margr1440\vieww9000\viewh8400\viewkind0 5 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720 6 | 7 | \f0\b\fs24 \cf0 Engineering: 8 | \b0 \ 9 | If you can call it that.\ 10 | \ 11 | 12 | \b Human Interface Design: 13 | \b0 \ 14 | To some degree...\ 15 | \ 16 | 17 | \b Testing: 18 | \b0 \ 19 | Hopefully not nobody\ 20 | \ 21 | 22 | \b Documentation: 23 | \b0 \ 24 | Someday\ 25 | \ 26 | 27 | \b With special thanks to: 28 | \b0 \ 29 | Mom} -------------------------------------------------------------------------------- /PFAboutWindowExample/PFAboutWindowExample/EULA.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg1252\cocoartf1344\cocoasubrtf720 2 | {\fonttbl\f0\fswiss\fcharset0 Helvetica;} 3 | {\colortbl;\red255\green255\blue255;} 4 | \margl1440\margr1440\vieww9000\viewh8400\viewkind0 5 | \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural 6 | 7 | \f0\b\fs24 \cf0 The MIT License (MIT) 8 | \b0 \ 9 | \ 10 | Copyright (c) 2015 Perceval < 11 | \i perfaram 12 | \i0 > FARAMAZ\ 13 | \ 14 | Permission is hereby granted, free of charge, to any person obtaining a copy\ 15 | of this software and associated documentation files (the "Software"), to deal\ 16 | in the Software without restriction, including without limitation the rights\ 17 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ 18 | copies of the Software, and to permit persons to whom the Software is\ 19 | furnished to do so, subject to the following conditions:\ 20 | \ 21 | The above copyright notice and this permission notice shall be included in all\ 22 | copies or substantial portions of the Software.\ 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\ 24 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\ 25 | FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\ 26 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\ 27 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\ 28 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\ 29 | SOFTWARE.\ 30 | \ 31 | } -------------------------------------------------------------------------------- /PFAboutWindowExample/PFAboutWindowExample/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "size" : "16x16", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "size" : "16x16", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "size" : "32x32", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "size" : "32x32", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "size" : "128x128", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "size" : "128x128", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "size" : "256x256", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "size" : "256x256", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "mac", 45 | "size" : "512x512", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "mac", 50 | "size" : "512x512", 51 | "scale" : "2x" 52 | } 53 | ], 54 | "info" : { 55 | "version" : 1, 56 | "author" : "xcode" 57 | } 58 | } -------------------------------------------------------------------------------- /PFAboutWindowExample/PFAboutWindowExample/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | com.faramaz.$(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 © 2015 faramaz. All rights reserved. 29 | NSMainNibFile 30 | MainMenu 31 | NSPrincipalClass 32 | NSApplication 33 | 34 | 35 | -------------------------------------------------------------------------------- /PFAboutWindowExample/PFAboutWindowExample/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Localizable.strings 3 | PFAboutWindowExample 4 | 5 | Created by Perceval FARAMAZ on 10/04/15. 6 | Copyright (c) 2015 faramaz. All rights reserved. 7 | */ 8 | /* FRENCH : 9 | "Version %@ (Build %@)" = "Version %@ (%@)"; 10 | "Credits" = "Remerciements"; 11 | "EULA" = "CL Utilisateur Final"*/ 12 | 13 | "Version %@ (Build %@)" = "Version %@ (%@)"; 14 | "Credits" = "Acknowledgments"; 15 | "License Agreement" = "License"; 16 | -------------------------------------------------------------------------------- /PFAboutWindowExample/PFAboutWindowExample/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // PFAboutWindowExample 4 | // 5 | // Created by Perceval FARAMAZ on 09/04/15. 6 | // Copyright (c) 2015 faramaz. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, const char * argv[]) { 12 | return NSApplicationMain(argc, argv); 13 | } 14 | -------------------------------------------------------------------------------- /PFAboutWindowExample/PFAboutWindowExampleTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.faramaz.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /PFAboutWindowExample/PFAboutWindowExampleTests/PFAboutWindowExampleTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // PFAboutWindowExampleTests.m 3 | // PFAboutWindowExampleTests 4 | // 5 | // Created by Perceval FARAMAZ on 09/04/15. 6 | // Copyright (c) 2015 faramaz. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface PFAboutWindowExampleTests : XCTestCase 13 | 14 | @end 15 | 16 | @implementation PFAboutWindowExampleTests 17 | 18 | - (void)setUp { 19 | [super setUp]; 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | } 22 | 23 | - (void)tearDown { 24 | // Put teardown code here. This method is called after the invocation of each test method in the class. 25 | [super tearDown]; 26 | } 27 | 28 | - (void)testExample { 29 | // This is an example of a functional test case. 30 | XCTAssert(YES, @"Pass"); 31 | } 32 | 33 | - (void)testPerformanceExample { 34 | // This is an example of a performance test case. 35 | [self measureBlock:^{ 36 | // Put the code you want to measure the time of here. 37 | }]; 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PFAboutWindow ![License](https://img.shields.io/badge/License-MIT-lightgreen.svg) ![Platform](https://img.shields.io/badge/Platform-OSX-blue.svg) 2 | A sleek replacement for the otherwise bleak "About" dialog. Its nice, looks like Xcode 6's one, and offers the following abilities : 3 | * Open the app's website by clicking its (big) icon (in the dialog) (see *Usage* below) 4 | * Extend the dialog to show the "License Agreement", or 5 | * The "Acknowledgments" (see *Content* below), 6 | * Translate the button's text (see *Localization* below), 7 | * Change the background and text colors 8 | * [Also has a Swift version](https://github.com/T-Rex-Editor/TRexAboutWIndowController), by [@dehlen](https://github.com/dehlen) 9 | 10 | ![PFAboutWindow in action](https://raw.github.com/perfaram/PFAboutWindow/master/screenshots/PFAboutWindow.gif) 11 | > Pull request welcome ! 12 | 13 | ## Setup 14 | 15 | ### Manually 16 | 17 | Clone this repo and add files from `PFAboutWindow` to your project. 18 | 19 | ### Using [cocoapods](http://cocoapods.org/) 20 | 21 | Add `pod 'PFAboutWindow', :git => 'https://github.com/perfaram/PFAboutWindow.git'` to your `Podfile` and run `pod install`. 22 | Add `use_frameworks!` to the end of the `Podfile`. 23 | 24 | ## Usage 25 | 26 | For a live, detailed example, see in `PFAboutWindowExample` directory. 27 | 28 | 1. Import `PFAboutWindowController`: 29 | 30 | ```objc 31 | #import 32 | ``` 33 | 2. Create a strong reference to retain the controller, usually in a `@property` of your AppDelegate: 34 | 35 | ```objc 36 | @property PFAboutWindowController *aboutWindowController; 37 | ``` 38 | 3. Instantiate `PFAboutWindow` (in `applicationDidFinishLaunching:`, most likely) : 39 | 40 | ```objc 41 | self.aboutWindowController = [[PFAboutWindowController alloc] init]; 42 | ``` 43 | 44 | You may want to personalize what's going to show up on the window. As every property is accessible, you can tweak everything you want (see `PFAboutWindow/PFAboutWindowController.h` to see them all, and what they fall back to): 45 | ```objc 46 | [self.aboutWindowController setAppURL:[[NSURL alloc] initWithString:@"http://app.faramaz.com"]]; 47 | [self.aboutWindowController setAppCopyright:[[NSAttributedString alloc] initWithString:@"Nice Small String" 48 | attributes:@{ 49 | NSForegroundColorAttributeName:[NSColor tertiaryLabelColor], 50 | NSFontAttributeName:[NSFont fontWithName:@"HelveticaNeue" size:11]}]]; //NSAttributedStrings are real shit to work with 51 | [self.aboutWindowController setAppName:@"PFAbout"]; //'cause it's shorter 52 | ``` 53 | 54 | 4. Create an IBAction to display the window, and bind it to its caller (usually, the "About [your app]" menu item): 55 | ```objc 56 | - (IBAction)showAboutWindow:(id)sender { 57 | [self.aboutWindowController showWindow:nil]; 58 | } 59 | ``` 60 | 61 | 5. You may also want the localize the buttons' text : 62 | 63 | Add the following lines to your Localizable.string (below, for example, French) 64 | ``` 65 | /* Version %@ (Build %@), displayed in the about window */ 66 | "Version %@ (Build %@)" = "Version %@ (%@)"; 67 | 68 | /* Caption of the 'Acknowledgments' button in the about window */ 69 | "Credits" = "Remerciements"; 70 | 71 | /* Caption of the 'License Agreement' button in the about window */ 72 | "EULA" = "CL Utilisateur Final"; 73 | ``` 74 | 75 | ## Acknowledgments 76 | * Thanks to [**@DangerCove**](https://github.com/dangercove) for their DCOAboutWindow, which served as a ground for this (heavy) modification. 77 | * Thanks to [**@SoneeJohn**](https://github.com/SoneeJohn) for his numerous contributions 78 | 79 | ## License (MIT) 80 | The MIT License (MIT) 81 | 82 | Copyright (c) 2015-2016 Perceval [**@perfaram**](https://github.com/perfaram) FARAMAZ 83 | 84 | Permission is hereby granted, free of charge, to any person obtaining a copy 85 | of this software and associated documentation files (the "Software"), to deal 86 | in the Software without restriction, including without limitation the rights 87 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 88 | copies of the Software, and to permit persons to whom the Software is 89 | furnished to do so, subject to the following conditions: 90 | 91 | The above copyright notice and this permission notice shall be included in 92 | all copies or substantial portions of the Software. 93 | 94 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 95 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 96 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 97 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 98 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 99 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 100 | THE SOFTWARE. 101 | 102 | -------- 103 | ###### Published in the hope that it will be useful 104 | -------------------------------------------------------------------------------- /screenshots/PFAboutWindow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfaram/PFAboutWindow/3e61c7f2b256784f1cdd0c7fdf039c7986e8c168/screenshots/PFAboutWindow.gif -------------------------------------------------------------------------------- /screenshots/PFAboutWindowFR.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfaram/PFAboutWindow/3e61c7f2b256784f1cdd0c7fdf039c7986e8c168/screenshots/PFAboutWindowFR.gif --------------------------------------------------------------------------------