blob: cd5d80a9eda86e3314de0ceaa7efba6313a0b1fa [file] [log] [blame]
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSQMessagesViewController
//
//
// GitHub
// https://github.com/jessesquires/JSQMessagesViewController
//
//
// License
// Copyright (c) 2014 Jesse Squires
// Released under an MIT license: http://opensource.org/licenses/MIT
//
#import "JSQMessagesInputToolbar.h"
#import "JSQMessagesComposerTextView.h"
#import "JSQMessagesToolbarButtonFactory.h"
#import "UIColor+JSQMessages.h"
#import "UIImage+JSQMessages.h"
#import "UIView+JSQMessages.h"
static void * kJSQMessagesInputToolbarKeyValueObservingContext = &kJSQMessagesInputToolbarKeyValueObservingContext;
@interface JSQMessagesInputToolbar ()
@property (assign, nonatomic) BOOL jsq_isObserving;
@end
@implementation JSQMessagesInputToolbar
@dynamic delegate;
#pragma mark - Initialization
- (void)awakeFromNib
{
[super awakeFromNib];
[self setTranslatesAutoresizingMaskIntoConstraints:NO];
self.jsq_isObserving = NO;
self.sendButtonOnRight = YES;
self.preferredDefaultHeight = 44.0f;
self.maximumHeight = NSNotFound;
JSQMessagesToolbarContentView *toolbarContentView = [self loadToolbarContentView];
toolbarContentView.frame = self.frame;
[self addSubview:toolbarContentView];
[self jsq_pinAllEdgesOfSubview:toolbarContentView];
[self setNeedsUpdateConstraints];
_contentView = toolbarContentView;
[self jsq_addObservers];
self.contentView.leftBarButtonItem = [JSQMessagesToolbarButtonFactory defaultAccessoryButtonItem];
self.contentView.rightBarButtonItem = [JSQMessagesToolbarButtonFactory defaultSendButtonItem];
[self toggleSendButtonEnabled];
}
- (JSQMessagesToolbarContentView *)loadToolbarContentView
{
NSArray *nibViews = [[NSBundle bundleForClass:[JSQMessagesInputToolbar class]] loadNibNamed:NSStringFromClass([JSQMessagesToolbarContentView class])
owner:nil
options:nil];
return nibViews.firstObject;
}
- (void)dealloc
{
[self jsq_removeObservers];
}
#pragma mark - Setters
- (void)setPreferredDefaultHeight:(CGFloat)preferredDefaultHeight
{
NSParameterAssert(preferredDefaultHeight > 0.0f);
_preferredDefaultHeight = preferredDefaultHeight;
}
#pragma mark - Actions
- (void)jsq_leftBarButtonPressed:(UIButton *)sender
{
[self.delegate messagesInputToolbar:self didPressLeftBarButton:sender];
}
- (void)jsq_rightBarButtonPressed:(UIButton *)sender
{
[self.delegate messagesInputToolbar:self didPressRightBarButton:sender];
}
#pragma mark - Input toolbar
- (void)toggleSendButtonEnabled
{
BOOL hasText = [self.contentView.textView hasText];
if (self.sendButtonOnRight) {
self.contentView.rightBarButtonItem.enabled = hasText;
}
else {
self.contentView.leftBarButtonItem.enabled = hasText;
}
}
#pragma mark - Key-value observing
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (context == kJSQMessagesInputToolbarKeyValueObservingContext) {
if (object == self.contentView) {
if ([keyPath isEqualToString:NSStringFromSelector(@selector(leftBarButtonItem))]) {
[self.contentView.leftBarButtonItem removeTarget:self
action:NULL
forControlEvents:UIControlEventTouchUpInside];
[self.contentView.leftBarButtonItem addTarget:self
action:@selector(jsq_leftBarButtonPressed:)
forControlEvents:UIControlEventTouchUpInside];
}
else if ([keyPath isEqualToString:NSStringFromSelector(@selector(rightBarButtonItem))]) {
[self.contentView.rightBarButtonItem removeTarget:self
action:NULL
forControlEvents:UIControlEventTouchUpInside];
[self.contentView.rightBarButtonItem addTarget:self
action:@selector(jsq_rightBarButtonPressed:)
forControlEvents:UIControlEventTouchUpInside];
}
[self toggleSendButtonEnabled];
}
}
}
- (void)jsq_addObservers
{
if (self.jsq_isObserving) {
return;
}
[self.contentView addObserver:self
forKeyPath:NSStringFromSelector(@selector(leftBarButtonItem))
options:0
context:kJSQMessagesInputToolbarKeyValueObservingContext];
[self.contentView addObserver:self
forKeyPath:NSStringFromSelector(@selector(rightBarButtonItem))
options:0
context:kJSQMessagesInputToolbarKeyValueObservingContext];
self.jsq_isObserving = YES;
}
- (void)jsq_removeObservers
{
if (!_jsq_isObserving) {
return;
}
@try {
[_contentView removeObserver:self
forKeyPath:NSStringFromSelector(@selector(leftBarButtonItem))
context:kJSQMessagesInputToolbarKeyValueObservingContext];
[_contentView removeObserver:self
forKeyPath:NSStringFromSelector(@selector(rightBarButtonItem))
context:kJSQMessagesInputToolbarKeyValueObservingContext];
}
@catch (NSException *__unused exception) { }
_jsq_isObserving = NO;
}
@end