Permalink
Browse files

Initial commit

  • Loading branch information...
0 parents commit 0b7fc557a5faeddeb297d4d6c3be6803c388c144 @soffes soffes committed Nov 8, 2010
7 .gitignore
@@ -0,0 +1,7 @@
+.DS_Store
+build
+*.mode1v3
+*.pbxuser
+*.perspectivev3
+*.xcworkspace
+xcuserdata
3 .gitmodules
@@ -0,0 +1,3 @@
+[submodule "Demo/SSToolkit"]
+ path = Demo/SSToolkit
+ url = git://github.com/samsoffes/sstoolkit.git
24 Classes/SSMessageTableViewCell.h
@@ -0,0 +1,24 @@
+//
+// SSMessageTableViewCell.h
+// Messages
+//
+// Created by Sam Soffes on 3/10/10.
+// Copyright 2010 Sam Soffes. All rights reserved.
+//
+
+typedef enum {
+ SSMessageTableViewCellMessageStyleGray = 0,
+ SSMessageTableViewCellMessageStyleGreen = 1
+} SSMessageTableViewCellMessageStyle;
+
+@class SSMessageTableViewCellBubbleView;
+
+@interface SSMessageTableViewCell : UITableViewCell {
+
+ SSMessageTableViewCellBubbleView *bubbleView;
+}
+
+@property (nonatomic, copy) NSString *messageText;
+@property (nonatomic, assign) SSMessageTableViewCellMessageStyle messageStyle;
+
+@end
58 Classes/SSMessageTableViewCell.m
@@ -0,0 +1,58 @@
+//
+// SSMessageTableViewCell.m
+// Messages
+//
+// Created by Sam Soffes on 3/10/10.
+// Copyright 2010 Sam Soffes. All rights reserved.
+//
+
+#import "SSMessageTableViewCell.h"
+#import "SSMessageTableViewCellBubbleView.h"
+
+@implementation SSMessageTableViewCell
+
+#pragma mark NSObject
+
+- (void)dealloc {
+ [bubbleView release];
+ [super dealloc];
+}
+
+#pragma mark UITableViewCell
+
+- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
+ if ((self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier])) {
+ self.selectionStyle = UITableViewCellSelectionStyleNone;
+ self.textLabel.hidden = YES;
+
+ bubbleView = [[SSMessageTableViewCellBubbleView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.contentView.frame.size.width, self.contentView.frame.size.height)];
+ bubbleView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+ [self.contentView addSubview:bubbleView];
+ [self.contentView sendSubviewToBack:bubbleView];
+ }
+ return self;
+}
+
+#pragma mark Getters
+
+- (SSMessageTableViewCellMessageStyle)messageStyle {
+ return bubbleView.messageStyle;
+}
+
+
+- (NSString *)messageText {
+ return bubbleView.messageText;
+}
+
+#pragma mark Setters
+
+- (void)setMessageStyle:(SSMessageTableViewCellMessageStyle)aMessageStyle {
+ bubbleView.messageStyle = aMessageStyle;
+}
+
+
+- (void)setMessageText:(NSString *)text {
+ bubbleView.messageText = text;
+}
+
+@end
25 Classes/SSMessageTableViewCellBubbleView.h
@@ -0,0 +1,25 @@
+//
+// SSMessageTableViewCellBubbleView.h
+// Messages
+//
+// Created by Sam Soffes on 3/10/10.
+// Copyright 2010 Sam Soffes. All rights reserved.
+//
+
+#import "SSMessageTableViewCell.h"
+
+@interface SSMessageTableViewCellBubbleView : UIView {
+
+ NSString *messageText;
+ SSMessageTableViewCellMessageStyle messageStyle;
+}
+
+@property (nonatomic, copy) NSString *messageText;
+@property (nonatomic, assign) SSMessageTableViewCellMessageStyle messageStyle;
+
++ (UIImage *)bubbleImageForMessageStyle:(SSMessageTableViewCellMessageStyle)aMessageStyle;
++ (CGSize)textSizeForText:(NSString *)text;
++ (CGSize)bubbleSizeForText:(NSString *)text;
++ (CGFloat)cellHeightForText:(NSString *)text;
+
+@end
74 Classes/SSMessageTableViewCellBubbleView.m
@@ -0,0 +1,74 @@
+//
+// SSMessageTableViewCellBubbleView.m
+// Messages
+//
+// Created by Sam Soffes on 3/10/10.
+// Copyright 2010 Sam Soffes. All rights reserved.
+//
+
+#import "SSMessageTableViewCellBubbleView.h"
+
+#define kFont [UIFont systemFontOfSize:15.0]
+static UILineBreakMode kLineBreakMode = UILineBreakModeWordWrap;
+static CGFloat kMaxWidth = 223.0; // TODO: Make dynamic
+static CGFloat kPaddingTop = 6.0;
+static CGFloat kPaddingBottom = 8.0;
+static CGFloat kMarginTop = 2.0;
+static CGFloat kMarginBottom = 2.0;
+
+@implementation SSMessageTableViewCellBubbleView
+
+@synthesize messageText;
+@synthesize messageStyle;
+
+#pragma mark Class Methods
+
++ (UIImage *)bubbleImageForMessageStyle:(SSMessageTableViewCellMessageStyle)aMessageStyle {
+ UIImage *image;
+ if (aMessageStyle == SSMessageTableViewCellMessageStyleGreen) {
+ image = [[UIImage imageNamed:@"SSMessageTableViewCellBackgroundGreen.png"] stretchableImageWithLeftCapWidth:17 topCapHeight:14];
+ } else {
+ image = [[UIImage imageNamed:@"SSMessageTableViewCellBackgroundGray.png"] stretchableImageWithLeftCapWidth:24 topCapHeight:14];
+ }
+ return image;
+}
+
+
++ (CGSize)textSizeForText:(NSString *)text {
+ CGSize maxSize = CGSizeMake(kMaxWidth - 38.0, 1000.0);
+ return [text sizeWithFont:kFont constrainedToSize:maxSize lineBreakMode:kLineBreakMode];
+}
+
+
++ (CGSize)bubbleSizeForText:(NSString *)text {
+ CGSize textSize = [self textSizeForText:text];
+ return CGSizeMake(textSize.width + 38.0, textSize.height + kPaddingTop + kPaddingBottom);
+}
+
+
++ (CGFloat)cellHeightForText:(NSString *)text {
+ return [self bubbleSizeForText:text].height + kMarginTop + kMarginBottom;
+}
+
+#pragma mark UIView
+
+- (id)initWithFrame:(CGRect)frame {
+ if (self = [super initWithFrame:frame]) {
+ self.backgroundColor = [UIColor colorWithRed:0.859 green:0.886 blue:0.929 alpha:1.0];
+ }
+ return self;
+}
+
+
+- (void)drawRect:(CGRect)frame {
+ UIImage *bubbleImage = [[self class] bubbleImageForMessageStyle:messageStyle];
+ CGSize bubbleSize = [[self class] bubbleSizeForText:messageText];
+ CGRect bubbleFrame = CGRectMake((messageStyle == SSMessageTableViewCellMessageStyleGreen ? self.frame.size.width - bubbleSize.width : 0.0), kMarginTop, bubbleSize.width, bubbleSize.height);
+ [bubbleImage drawInRect:bubbleFrame];
+
+ CGSize textSize = [[self class] textSizeForText:messageText];
+ CGRect textFrame = CGRectMake(((messageStyle == SSMessageTableViewCellMessageStyleGreen) ? (13.0 + bubbleFrame.origin.x) : 23.0), kPaddingTop + kMarginTop, textSize.width, textSize.height);
+ [messageText drawInRect:textFrame withFont:kFont lineBreakMode:kLineBreakMode alignment:(messageStyle == SSMessageTableViewCellMessageStyleGreen) ? UITextAlignmentRight : UITextAlignmentLeft];
+}
+
+@end
30 Classes/SSMessagesViewController.h
@@ -0,0 +1,30 @@
+//
+// SSMessagesViewController.h
+// Messages
+//
+// This is an abstract class for displaying a UI similar
+// to Apple's SMS application. A subclass should
+// override the messageStyleForRowAtIndexPath: and
+// textForRowAtIndexPath: to customize this class.
+//
+// Created by Sam Soffes on 3/10/10.
+// Copyright 2010 Sam Soffes. All rights reserved.
+//
+
+#import "SSMessageTableViewCell.h"
+
+@class SSGradientView;
+
+@interface SSMessagesViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate> {
+
+ UITableView *_tableView;
+ SSGradientView *_inputView;
+ UIButton *_sendButton;
+}
+
+@property (nonatomic, retain, readonly) UITableView *tableView;
+
+- (SSMessageTableViewCellMessageStyle)messageStyleForRowAtIndexPath:(NSIndexPath *)indexPath;
+- (NSString *)textForRowAtIndexPath:(NSIndexPath *)indexPath;
+
+@end
161 Classes/SSMessagesViewController.m
@@ -0,0 +1,161 @@
+//
+// SSMessagesViewController.m
+// Messages
+//
+// Created by Sam Soffes on 3/10/10.
+// Copyright 2010 Sam Soffes. All rights reserved.
+//
+
+#import "SSMessagesViewController.h"
+#import "SSMessageTableViewCell.h"
+#import "SSMessageTableViewCellBubbleView.h"
+#import <SSToolkit/SSGradientView.h>
+#import <SSToolkit/SSTextField.h>
+
+CGFloat kInputHeight = 40.0;
+
+@implementation SSMessagesViewController
+
+@synthesize tableView = _tableView;
+
+#pragma mark NSObject
+
+- (id)init {
+ return [self initWithNibName:nil bundle:nil];
+}
+
+
+- (void)dealloc {
+ [_tableView release];
+ [_inputView release];
+ [_sendButton release];
+ [super dealloc];
+}
+
+
+#pragma mark UITableViewController
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
+ if (self = [super initWithNibName:nil bundle:nil]) {
+ self.view.backgroundColor = [UIColor colorWithRed:0.859 green:0.886 blue:0.929 alpha:1.0];
+
+ // Table view
+ _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width, self.view.frame.size.height - kInputHeight) style:UITableViewStylePlain];
+ _tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+ _tableView.backgroundColor = self.view.backgroundColor;
+ _tableView.dataSource = self;
+ _tableView.delegate = self;
+ _tableView.separatorColor = self.view.backgroundColor;
+ [self.view addSubview:_tableView];
+
+ // Input
+ _inputView = [[SSGradientView alloc] initWithFrame:CGRectMake(0.0, self.view.frame.size.height - kInputHeight, self.view.frame.size.width, kInputHeight)];
+ _inputView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
+ _inputView.hasBottomBorder = NO;
+ _inputView.topBorderColor = [UIColor colorWithRed:0.733 green:0.741 blue:0.745 alpha:1.0];
+ _inputView.topColor = [UIColor colorWithRed:0.914 green:0.922 blue:0.929 alpha:1.0];
+ _inputView.bottomColor = [UIColor colorWithRed:0.765 green:0.773 blue:0.788 alpha:1.0];
+ [self.view addSubview:_inputView];
+
+ // Text field
+ SSTextField *textField = [[SSTextField alloc] initWithFrame:CGRectMake(6.0, 8.0, self.view.frame.size.width - 75.0, 27.0)];
+ textField.autoresizingMask = UIViewAutoresizingFlexibleWidth;
+ textField.background = [[UIImage imageNamed:@"SSMessagesViewControllerTextFieldBackground.png"] stretchableImageWithLeftCapWidth:12 topCapHeight:0];
+ textField.delegate = self;
+ textField.font = [UIFont systemFontOfSize:15.0];
+ textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
+ textField.textInsets = UIEdgeInsetsMake(0.0, 12.0, 0.0, 12.0);
+ [_inputView addSubview:textField];
+ [textField release];
+
+ // Send button
+ _sendButton = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
+ _sendButton.frame = CGRectMake(self.view.frame.size.width - 65.0, 8.0, 59.0, 27.0);
+ _sendButton.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
+ _sendButton.titleLabel.font = [UIFont boldSystemFontOfSize:16.0];
+ _sendButton.titleLabel.shadowOffset = CGSizeMake(0.0, -1.0);
+ [_sendButton setBackgroundImage:[[UIImage imageNamed:@"SSMessagesViewControllerSendButtonBackground.png"] stretchableImageWithLeftCapWidth:12 topCapHeight:0] forState:UIControlStateNormal];
+ [_sendButton setTitle:@"Send" forState:UIControlStateNormal];
+ [_sendButton setTitleColor:[UIColor colorWithWhite:1.0 alpha:0.4] forState:UIControlStateNormal];
+ [_sendButton setTitleShadowColor:[UIColor colorWithRed:0.325 green:0.463 blue:0.675 alpha:1.0] forState:UIControlStateNormal];
+ [_inputView addSubview:_sendButton];
+ }
+ return self;
+}
+
+
+#pragma mark SSMessagesViewController
+
+// This method is intended to be overridden by subclasses
+- (SSMessageTableViewCellMessageStyle)messageStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
+ return SSMessageTableViewCellMessageStyleGray;
+}
+
+
+// This method is intended to be overridden by subclasses
+- (NSString *)textForRowAtIndexPath:(NSIndexPath *)indexPath {
+ return nil;
+}
+
+
+#pragma mark UITableViewDataSource
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
+ return 1;
+}
+
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+ return 0;
+}
+
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+
+ static NSString *cellIdentifier = @"cellIdentifier";
+
+ SSMessageTableViewCell *cell = (SSMessageTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
+ if (cell == nil) {
+ cell = [[[SSMessageTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
+ }
+
+ cell.messageStyle = [self messageStyleForRowAtIndexPath:indexPath];
+ cell.messageText = [self textForRowAtIndexPath:indexPath];
+
+ return cell;
+}
+
+
+#pragma mark UITableViewDelegate
+
+- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
+ return [SSMessageTableViewCellBubbleView cellHeightForText:[self textForRowAtIndexPath:indexPath]];
+}
+
+
+#pragma mark UITextFieldDelegate
+
+- (void)textFieldDidBeginEditing:(UITextField *)textField {
+ [UIView beginAnimations:@"beginEditing" context:_inputView];
+ [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
+ [UIView setAnimationDuration:0.3];
+ _tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 216.0, 0.0);
+ _tableView.scrollIndicatorInsets = _tableView.contentInset;
+ _inputView.frame = CGRectMake(0.0, 160.0, self.view.frame.size.width, kInputHeight);
+ [_sendButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
+ [UIView commitAnimations];
+}
+
+
+- (void)textFieldDidEndEditing:(UITextField *)textField {
+ [UIView beginAnimations:@"endEditing" context:_inputView];
+ [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
+ [UIView setAnimationDuration:0.3];
+ _tableView.contentInset = UIEdgeInsetsZero;
+ _tableView.scrollIndicatorInsets = UIEdgeInsetsZero;
+ _inputView.frame = CGRectMake(0.0, _tableView.frame.size.height, self.view.frame.size.width, kInputHeight);
+ [_sendButton setTitleColor:[UIColor colorWithWhite:1.0 alpha:0.4] forState:UIControlStateNormal];
+ [UIView commitAnimations];
+}
+
+@end
15 Demo/Classes/MDAppDelegate.h
@@ -0,0 +1,15 @@
+//
+// MDAppDelegate.h
+// Messages Demo
+//
+// Created by Sam Soffes on 11/7/10.
+// Copyright 2010 Sam Soffes. All rights reserved.
+//
+
+@interface MDAppDelegate : NSObject <UIApplicationDelegate> {
+
+ UIWindow *_window;
+}
+
+@end
+
38 Demo/Classes/MDAppDelegate.m
@@ -0,0 +1,38 @@
+//
+// MDAppDelegate.m
+// Messages Demo
+//
+// Created by Sam Soffes on 11/7/10.
+// Copyright 2010 Sam Soffes. All rights reserved.
+//
+
+#import "MDAppDelegate.h"
+#import "MDDemoViewController.h"
+
+@implementation MDAppDelegate
+
+#pragma mark NSObject
+
+- (void)dealloc {
+ [_window release];
+ [super dealloc];
+}
+
+
+#pragma mark UIApplicationDelegate
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+ MDDemoViewController *viewController = [[MDDemoViewController alloc] init];
+ UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
+ [viewController release];
+
+ _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
+ _window.rootViewController = navigationController;
+ [_window makeKeyAndVisible];
+
+ [navigationController release];
+
+ return YES;
+}
+
+@end
15 Demo/Classes/MDDemoViewController.h
@@ -0,0 +1,15 @@
+//
+// MDDemoViewController.h
+// Messages Demo
+//
+// Created by Sam Soffes on 11/7/10.
+// Copyright 2010 Sam Soffes. All rights reserved.
+//
+
+#import "SSMessagesViewController.h"
+
+@interface MDDemoViewController : SSMessagesViewController {
+
+}
+
+@end
61 Demo/Classes/MDDemoViewController.m
@@ -0,0 +1,61 @@
+//
+// MDDemoViewController.m
+// Messages Demo
+//
+// Created by Sam Soffes on 11/7/10.
+// Copyright 2010 Sam Soffes. All rights reserved.
+//
+
+#import "MDDemoViewController.h"
+#import "SSMessageTableViewCell.h"
+
+@implementation MDDemoViewController
+
+NSString *lorem[] = {
+ @"Hi",
+ @"This is a work in progress",
+ @"Ya I know",
+ @"Fine then\nI see how it is",
+ @"Do you? Do you really?",
+ @"Yes"
+};
+
+#pragma mark UIViewController
+
+- (void)viewDidLoad {
+ [super viewDidLoad];
+ self.title = @"Messages";
+}
+
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
+ if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
+ return toInterfaceOrientation != UIInterfaceOrientationPortraitUpsideDown;
+ }
+ return YES;
+}
+
+
+#pragma mark SSMessagesViewController
+
+- (SSMessageTableViewCellMessageStyle)messageStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
+ if (indexPath.row % 2) {
+ return SSMessageTableViewCellMessageStyleGreen;
+ }
+ return SSMessageTableViewCellMessageStyleGray;
+}
+
+
+- (NSString *)textForRowAtIndexPath:(NSIndexPath *)indexPath {
+ return lorem[indexPath.row];
+}
+
+
+#pragma mark UITableViewDataSource
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+ return sizeof(lorem) / sizeof(NSString *);
+}
+
+
+@end
355 Demo/Messages Demo.xcodeproj/project.pbxproj
@@ -0,0 +1,355 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 45;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 1D3623260D0F684500981E51 /* MDAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* MDAppDelegate.m */; };
+ 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
+ 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
+ 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };
+ 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; };
+ B27D0FC912878A3300B58D1D /* MDDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B27D0FC812878A3300B58D1D /* MDDemoViewController.m */; };
+ B27D0FD412878AA300B58D1D /* SSMessagesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B27D0FCF12878AA300B58D1D /* SSMessagesViewController.m */; };
+ B27D0FD512878AA300B58D1D /* SSMessageTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = B27D0FD112878AA300B58D1D /* SSMessageTableViewCell.m */; };
+ B27D0FD612878AA300B58D1D /* SSMessageTableViewCellBubbleView.m in Sources */ = {isa = PBXBuildFile; fileRef = B27D0FD312878AA300B58D1D /* SSMessageTableViewCellBubbleView.m */; };
+ B27D0FDC12878AAB00B58D1D /* SSMessagesViewControllerSendButtonBackground.png in Resources */ = {isa = PBXBuildFile; fileRef = B27D0FD812878AAB00B58D1D /* SSMessagesViewControllerSendButtonBackground.png */; };
+ B27D0FDD12878AAB00B58D1D /* SSMessagesViewControllerTextFieldBackground.png in Resources */ = {isa = PBXBuildFile; fileRef = B27D0FD912878AAB00B58D1D /* SSMessagesViewControllerTextFieldBackground.png */; };
+ B27D0FDE12878AAB00B58D1D /* SSMessageTableViewCellBackgroundGray.png in Resources */ = {isa = PBXBuildFile; fileRef = B27D0FDA12878AAB00B58D1D /* SSMessageTableViewCellBackgroundGray.png */; };
+ B27D0FDF12878AAB00B58D1D /* SSMessageTableViewCellBackgroundGreen.png in Resources */ = {isa = PBXBuildFile; fileRef = B27D0FDB12878AAB00B58D1D /* SSMessageTableViewCellBackgroundGreen.png */; };
+ B27D0FF012878B2200B58D1D /* SSToolkit.bundle in Resources */ = {isa = PBXBuildFile; fileRef = B27D0FEF12878B2200B58D1D /* SSToolkit.bundle */; };
+ B27D0FFA12878B2700B58D1D /* libTWToolkit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B27D0FEE12878B1900B58D1D /* libTWToolkit.a */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ B27D0FED12878B1900B58D1D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = B27D0FE412878B1900B58D1D /* SSToolkit.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = D2AAC07E0554694100DB518D /* libTWToolkit.a */;
+ remoteInfo = SSToolkit;
+ };
+ B27D0FFB12878B2D00B58D1D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = B27D0FE412878B1900B58D1D /* SSToolkit.xcodeproj */;
+ proxyType = 1;
+ remoteGlobalIDString = D2AAC07D0554694100DB518D /* SSToolkit */;
+ remoteInfo = SSToolkit;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+ 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ 1D3623240D0F684500981E51 /* MDAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MDAppDelegate.h; sourceTree = "<group>"; };
+ 1D3623250D0F684500981E51 /* MDAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MDAppDelegate.m; sourceTree = "<group>"; };
+ 1D6058910D05DD3D006BFB54 /* Messages Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Messages Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+ 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ 32CA4F630368D1EE00C91783 /* Messages_Demo_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Messages_Demo_Prefix.pch; sourceTree = "<group>"; };
+ 8D1107310486CEB800E47090 /* Messages_Demo-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Messages_Demo-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = "<group>"; };
+ B27D0FC712878A3300B58D1D /* MDDemoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MDDemoViewController.h; sourceTree = "<group>"; };
+ B27D0FC812878A3300B58D1D /* MDDemoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MDDemoViewController.m; sourceTree = "<group>"; };
+ B27D0FCE12878AA300B58D1D /* SSMessagesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SSMessagesViewController.h; path = ../../../../../Code/samsoffes/ssmessagesviewcontroller/Classes/SSMessagesViewController.h; sourceTree = "<group>"; };
+ B27D0FCF12878AA300B58D1D /* SSMessagesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SSMessagesViewController.m; path = ../../../../../Code/samsoffes/ssmessagesviewcontroller/Classes/SSMessagesViewController.m; sourceTree = "<group>"; };
+ B27D0FD012878AA300B58D1D /* SSMessageTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SSMessageTableViewCell.h; path = ../../../../../Code/samsoffes/ssmessagesviewcontroller/Classes/SSMessageTableViewCell.h; sourceTree = "<group>"; };
+ B27D0FD112878AA300B58D1D /* SSMessageTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SSMessageTableViewCell.m; path = ../../../../../Code/samsoffes/ssmessagesviewcontroller/Classes/SSMessageTableViewCell.m; sourceTree = "<group>"; };
+ B27D0FD212878AA300B58D1D /* SSMessageTableViewCellBubbleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SSMessageTableViewCellBubbleView.h; path = ../../../../../Code/samsoffes/ssmessagesviewcontroller/Classes/SSMessageTableViewCellBubbleView.h; sourceTree = "<group>"; };
+ B27D0FD312878AA300B58D1D /* SSMessageTableViewCellBubbleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SSMessageTableViewCellBubbleView.m; path = ../../../../../Code/samsoffes/ssmessagesviewcontroller/Classes/SSMessageTableViewCellBubbleView.m; sourceTree = "<group>"; };
+ B27D0FD812878AAB00B58D1D /* SSMessagesViewControllerSendButtonBackground.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = SSMessagesViewControllerSendButtonBackground.png; sourceTree = "<group>"; };
+ B27D0FD912878AAB00B58D1D /* SSMessagesViewControllerTextFieldBackground.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = SSMessagesViewControllerTextFieldBackground.png; sourceTree = "<group>"; };
+ B27D0FDA12878AAB00B58D1D /* SSMessageTableViewCellBackgroundGray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = SSMessageTableViewCellBackgroundGray.png; sourceTree = "<group>"; };
+ B27D0FDB12878AAB00B58D1D /* SSMessageTableViewCellBackgroundGreen.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = SSMessageTableViewCellBackgroundGreen.png; sourceTree = "<group>"; };
+ B27D0FE412878B1900B58D1D /* SSToolkit.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SSToolkit.xcodeproj; path = ../../../../../Code/samsoffes/ssmessagesviewcontroller/Demo/SSToolkit/SSToolkit.xcodeproj; sourceTree = "<group>"; };
+ B27D0FEF12878B2200B58D1D /* SSToolkit.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = SSToolkit.bundle; path = ../../../../Code/samsoffes/ssmessagesviewcontroller/Demo/SSToolkit/Resources/SSToolkit.bundle; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 1D60588F0D05DD3D006BFB54 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */,
+ 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */,
+ 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */,
+ B27D0FFA12878B2700B58D1D /* libTWToolkit.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 080E96DDFE201D6D7F000001 /* Classes */ = {
+ isa = PBXGroup;
+ children = (
+ B27D0FE412878B1900B58D1D /* SSToolkit.xcodeproj */,
+ 1D3623240D0F684500981E51 /* MDAppDelegate.h */,
+ 1D3623250D0F684500981E51 /* MDAppDelegate.m */,
+ B27D0FC712878A3300B58D1D /* MDDemoViewController.h */,
+ B27D0FC812878A3300B58D1D /* MDDemoViewController.m */,
+ B27D0FCE12878AA300B58D1D /* SSMessagesViewController.h */,
+ B27D0FCF12878AA300B58D1D /* SSMessagesViewController.m */,
+ B27D0FD012878AA300B58D1D /* SSMessageTableViewCell.h */,
+ B27D0FD112878AA300B58D1D /* SSMessageTableViewCell.m */,
+ B27D0FD212878AA300B58D1D /* SSMessageTableViewCellBubbleView.h */,
+ B27D0FD312878AA300B58D1D /* SSMessageTableViewCellBubbleView.m */,
+ );
+ path = Classes;
+ sourceTree = "<group>";
+ };
+ 19C28FACFE9D520D11CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 1D6058910D05DD3D006BFB54 /* Messages Demo.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = {
+ isa = PBXGroup;
+ children = (
+ 080E96DDFE201D6D7F000001 /* Classes */,
+ 29B97315FDCFA39411CA2CEA /* Other Sources */,
+ 29B97317FDCFA39411CA2CEA /* Resources */,
+ 29B97323FDCFA39411CA2CEA /* Frameworks */,
+ 19C28FACFE9D520D11CA2CBB /* Products */,
+ );
+ name = CustomTemplate;
+ sourceTree = "<group>";
+ };
+ 29B97315FDCFA39411CA2CEA /* Other Sources */ = {
+ isa = PBXGroup;
+ children = (
+ 32CA4F630368D1EE00C91783 /* Messages_Demo_Prefix.pch */,
+ 29B97316FDCFA39411CA2CEA /* main.m */,
+ );
+ name = "Other Sources";
+ sourceTree = "<group>";
+ };
+ 29B97317FDCFA39411CA2CEA /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ B27D0FD712878AAB00B58D1D /* Images */,
+ B27D0FEF12878B2200B58D1D /* SSToolkit.bundle */,
+ 8D1107310486CEB800E47090 /* Messages_Demo-Info.plist */,
+ );
+ name = Resources;
+ sourceTree = "<group>";
+ };
+ 29B97323FDCFA39411CA2CEA /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */,
+ 1D30AB110D05D00D00671497 /* Foundation.framework */,
+ 288765FC0DF74451002DB57D /* CoreGraphics.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ B27D0FD712878AAB00B58D1D /* Images */ = {
+ isa = PBXGroup;
+ children = (
+ B27D0FD812878AAB00B58D1D /* SSMessagesViewControllerSendButtonBackground.png */,
+ B27D0FD912878AAB00B58D1D /* SSMessagesViewControllerTextFieldBackground.png */,
+ B27D0FDA12878AAB00B58D1D /* SSMessageTableViewCellBackgroundGray.png */,
+ B27D0FDB12878AAB00B58D1D /* SSMessageTableViewCellBackgroundGreen.png */,
+ );
+ name = Images;
+ path = ../../../../Code/samsoffes/ssmessagesviewcontroller/Images;
+ sourceTree = "<group>";
+ };
+ B27D0FEA12878B1900B58D1D /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ B27D0FEE12878B1900B58D1D /* libTWToolkit.a */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 1D6058900D05DD3D006BFB54 /* Messages Demo */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Messages Demo" */;
+ buildPhases = (
+ 1D60588D0D05DD3D006BFB54 /* Resources */,
+ 1D60588E0D05DD3D006BFB54 /* Sources */,
+ 1D60588F0D05DD3D006BFB54 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ B27D0FFC12878B2D00B58D1D /* PBXTargetDependency */,
+ );
+ name = "Messages Demo";
+ productName = "Messages Demo";
+ productReference = 1D6058910D05DD3D006BFB54 /* Messages Demo.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 29B97313FDCFA39411CA2CEA /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Messages Demo" */;
+ compatibilityVersion = "Xcode 3.1";
+ developmentRegion = English;
+ hasScannedForEncodings = 1;
+ knownRegions = (
+ English,
+ Japanese,
+ French,
+ German,
+ );
+ mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */;
+ projectDirPath = "";
+ projectReferences = (
+ {
+ ProductGroup = B27D0FEA12878B1900B58D1D /* Products */;
+ ProjectRef = B27D0FE412878B1900B58D1D /* SSToolkit.xcodeproj */;
+ },
+ );
+ projectRoot = "";
+ targets = (
+ 1D6058900D05DD3D006BFB54 /* Messages Demo */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXReferenceProxy section */
+ B27D0FEE12878B1900B58D1D /* libTWToolkit.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libTWToolkit.a;
+ remoteRef = B27D0FED12878B1900B58D1D /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+/* End PBXReferenceProxy section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 1D60588D0D05DD3D006BFB54 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ B27D0FDC12878AAB00B58D1D /* SSMessagesViewControllerSendButtonBackground.png in Resources */,
+ B27D0FDD12878AAB00B58D1D /* SSMessagesViewControllerTextFieldBackground.png in Resources */,
+ B27D0FDE12878AAB00B58D1D /* SSMessageTableViewCellBackgroundGray.png in Resources */,
+ B27D0FDF12878AAB00B58D1D /* SSMessageTableViewCellBackgroundGreen.png in Resources */,
+ B27D0FF012878B2200B58D1D /* SSToolkit.bundle in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 1D60588E0D05DD3D006BFB54 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 1D60589B0D05DD56006BFB54 /* main.m in Sources */,
+ 1D3623260D0F684500981E51 /* MDAppDelegate.m in Sources */,
+ B27D0FC912878A3300B58D1D /* MDDemoViewController.m in Sources */,
+ B27D0FD412878AA300B58D1D /* SSMessagesViewController.m in Sources */,
+ B27D0FD512878AA300B58D1D /* SSMessageTableViewCell.m in Sources */,
+ B27D0FD612878AA300B58D1D /* SSMessageTableViewCellBubbleView.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ B27D0FFC12878B2D00B58D1D /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ name = SSToolkit;
+ targetProxy = B27D0FFB12878B2D00B58D1D /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+ 1D6058940D05DD3E006BFB54 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = Messages_Demo_Prefix.pch;
+ HEADER_SEARCH_PATHS = SSToolkit;
+ INFOPLIST_FILE = "Messages_Demo-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 3.1.3;
+ PRODUCT_NAME = "Messages Demo";
+ };
+ name = Debug;
+ };
+ 1D6058950D05DD3E006BFB54 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = Messages_Demo_Prefix.pch;
+ HEADER_SEARCH_PATHS = SSToolkit;
+ INFOPLIST_FILE = "Messages_Demo-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 3.1.3;
+ PRODUCT_NAME = "Messages Demo";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ C01FCF4F08A954540054247B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ PREBINDING = NO;
+ SDKROOT = iphoneos;
+ };
+ name = Debug;
+ };
+ C01FCF5008A954540054247B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
+ PREBINDING = NO;
+ SDKROOT = iphoneos;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Messages Demo" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1D6058940D05DD3E006BFB54 /* Debug */,
+ 1D6058950D05DD3E006BFB54 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Messages Demo" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C01FCF4F08A954540054247B /* Debug */,
+ C01FCF5008A954540054247B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
+}
28 Demo/Messages_Demo-Info.plist
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleDisplayName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIconFile</key>
+ <string></string>
+ <key>CFBundleIdentifier</key>
+ <string>com.samsoffes.ssmessagesviewcontroller.demo</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+</dict>
+</plist>
14 Demo/Messages_Demo_Prefix.pch
@@ -0,0 +1,14 @@
+//
+// Messages_Demo_Prefix.pch
+// Messages Demo
+//
+// Created by Sam Soffes on 11/7/10.
+// Copyright 2010 Sam Soffes. All rights reserved.
+//
+// Prefix header for all source files of the 'Messages Demo' target in the 'Messages Demo' project
+//
+
+#ifdef __OBJC__
+ #import <Foundation/Foundation.h>
+ #import <UIKit/UIKit.h>
+#endif
1 Demo/SSToolkit
@@ -0,0 +1 @@
+Subproject commit 2a6faca7400fc9243ee5b8c7394b47c3828b4d32
15 Demo/main.m
@@ -0,0 +1,15 @@
+//
+// main.m
+// Messages Demo
+//
+// Created by Sam Soffes on 11/7/10.
+// Copyright 2010 Sam Soffes. All rights reserved.
+//
+
+int main(int argc, char *argv[]) {
+
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+ int retVal = UIApplicationMain(argc, argv, nil, @"MDAppDelegate");
+ [pool release];
+ return retVal;
+}
BIN Images/SSMessageTableViewCellBackgroundGray.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN Images/SSMessageTableViewCellBackgroundGreen.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN Images/SSMessagesViewControllerSendButtonBackground.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN Images/SSMessagesViewControllerTextFieldBackground.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 0b7fc55

Please sign in to comment.