├── .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 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
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 |
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  
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 | 
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
--------------------------------------------------------------------------------