| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 | 
							- //
 
- //  RadioButton.m
 
- //
 
- //  Created by Sergey Nikitenko on 3/5/13.
 
- //  Copyright 2013 Sergey Nikitenko. All rights reserved.
 
- //
 
- //  Permission is hereby granted, free of charge, to any person obtaining a copy
 
- //  of this software and associated documentation files (the "Software"), to deal
 
- //  in the Software without restriction, including without limitation the rights
 
- //  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 
- //  copies of the Software, and to permit persons to whom the Software is
 
- //  furnished to do so, subject to the following conditions:
 
- //
 
- //  The above copyright notice and this permission notice shall be included in
 
- //  all copies or substantial portions of the Software.
 
- //
 
- //  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 
- //  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 
- //  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 
- //  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 
- //  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 
- //  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 
- //  THE SOFTWARE.
 
- //
 
- #import "RadioButton.h"
 
- @interface RadioButton()
 
- {
 
- 	NSMutableArray* _sharedLinks;
 
- }
 
- @end
 
- @implementation RadioButton
 
- - (id)initWithFrame:(CGRect)frame
 
- {
 
-     self = [super initWithFrame:frame];
 
-     if (self) {
 
- 		if(![[self allTargets] containsObject:self]) {
 
- 			[super addTarget:self action:@selector(onTouchUpInside) forControlEvents:UIControlEventTouchUpInside];
 
- 		}
 
-     }
 
-     return self;
 
- }
 
- -(void) awakeFromNib
 
- {
 
- 	if(![[self allTargets] containsObject:self]) {
 
- 		[super addTarget:self action:@selector(onTouchUpInside) forControlEvents:UIControlEventTouchUpInside];
 
- 	}
 
- }
 
- -(void) addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents
 
- {
 
- 	// 'self' should be the first target
 
- 	if(![[self allTargets] containsObject:self]) {
 
- 		[super addTarget:self action:@selector(onTouchUpInside) forControlEvents:UIControlEventTouchUpInside];
 
- 	}
 
- 	[super addTarget:target action:action forControlEvents:controlEvents];
 
- }
 
- -(void) onTouchUpInside
 
- {
 
- 	[self setSelected:YES distinct:YES sendControlEvent:YES];
 
- }
 
- -(void) setGroupButtons:(NSArray *)buttons
 
- {
 
- 	if(!_sharedLinks) {
 
- 		for(RadioButton* rb in buttons) {
 
- 			if(rb->_sharedLinks) {
 
- 				_sharedLinks = rb->_sharedLinks;
 
- 				break;
 
- 			}
 
- 		}
 
- 		if(!_sharedLinks) {
 
- 			_sharedLinks = [[NSMutableArray alloc] initWithCapacity:[buttons count]+1];
 
- 		}
 
- 	}
 
- 	BOOL (^btnExistsInList)(NSArray*, RadioButton*) = ^(NSArray* list, RadioButton* rb){
 
- 		for(NSValue* v in list) {
 
- 			if([v nonretainedObjectValue]==rb) {
 
- 				return YES;
 
- 			}
 
- 		}
 
- 		return NO;
 
- 	};
 
- 	if(!btnExistsInList(_sharedLinks, self)) {
 
- 		[_sharedLinks addObject:[NSValue valueWithNonretainedObject:self]];
 
- 	}
 
- 	for(RadioButton* rb in buttons) {
 
- 		if(rb->_sharedLinks!=_sharedLinks) {
 
- 			if(!rb->_sharedLinks) {
 
- 				rb->_sharedLinks = _sharedLinks;
 
- 			} else {
 
- 				for(NSValue* v in rb->_sharedLinks) {
 
- 					RadioButton* vrb = [v nonretainedObjectValue];
 
- 					if(!btnExistsInList(_sharedLinks, vrb)) {
 
- 						[_sharedLinks addObject:v];
 
- 						vrb->_sharedLinks = _sharedLinks;
 
- 					}
 
- 				}
 
- 			}
 
- 		}
 
- 		if(!btnExistsInList(_sharedLinks, rb)) {
 
- 			[_sharedLinks addObject:[NSValue valueWithNonretainedObject:rb]];
 
- 		}
 
- 	}
 
- }
 
- -(NSArray*) groupButtons
 
- {
 
- 	if([_sharedLinks count]) {
 
- 		NSMutableArray* buttons = [[NSMutableArray alloc] initWithCapacity:[_sharedLinks count]];
 
- 		for(NSValue* v in _sharedLinks) {
 
- 			[buttons addObject:[v nonretainedObjectValue]];
 
- 		}
 
- 		return buttons;
 
- 	}
 
- 	return nil;
 
- }
 
- -(RadioButton*) selectedButton
 
- {
 
- 	if([self isSelected]) {
 
- 		return self;
 
- 	} else {
 
- 		for(NSValue* v in _sharedLinks) {
 
- 			RadioButton* rb = [v nonretainedObjectValue];
 
- 			if([rb isSelected]) {
 
- 				return rb;
 
- 			}
 
- 		}
 
- 	}
 
- 	return nil;
 
- }
 
- -(void) setSelected:(BOOL)selected
 
- {
 
- 	[self setSelected:selected distinct:YES sendControlEvent:NO];
 
- }
 
- -(void) setButtonSelected:(BOOL)selected sendControlEvent:(BOOL)sendControlEvent
 
- {
 
- 	BOOL valueChanged = (self.selected != selected);
 
- 	[super setSelected:selected];
 
- 	if(valueChanged && sendControlEvent) {
 
- 		[self sendActionsForControlEvents:UIControlEventValueChanged];
 
- 	}
 
- }
 
- -(void) setSelected:(BOOL)selected distinct:(BOOL)distinct sendControlEvent:(BOOL)sendControlEvent
 
- {
 
- 	[self setButtonSelected:selected sendControlEvent:sendControlEvent];
 
- 	if( distinct && (selected || [_sharedLinks count]==2) )
 
- 	{
 
- 		selected = !selected;
 
- 		for(NSValue* v in _sharedLinks) {
 
- 			RadioButton* rb = [v nonretainedObjectValue];
 
- 			if(rb!=self) {
 
- 				[rb setButtonSelected:selected sendControlEvent:sendControlEvent];
 
- 			}
 
- 		}
 
- 	}
 
- }
 
- -(void) deselectAllButtons
 
- {
 
- 	for(NSValue* v in _sharedLinks) {
 
- 		RadioButton* rb = [v nonretainedObjectValue];
 
- 		[rb setButtonSelected:NO sendControlEvent:NO];
 
- 	}
 
- }
 
- -(void) setSelectedWithTag:(NSInteger)tag
 
- {
 
- 	if(self.tag == tag) {
 
- 		[self setSelected:YES distinct:YES sendControlEvent:NO];
 
- 	} else {
 
- 		for(NSValue* v in _sharedLinks) {
 
- 			RadioButton* rb = [v nonretainedObjectValue];
 
- 			if(rb.tag == tag) {
 
- 				[rb setSelected:YES distinct:YES sendControlEvent:NO];
 
- 				break;
 
- 			}
 
- 		}
 
- 	}
 
- }
 
- - (void)dealloc
 
- {
 
- 	for(NSValue* v in _sharedLinks) {
 
- 		if([v nonretainedObjectValue]==self) {
 
- 			[_sharedLinks removeObjectIdenticalTo:v];
 
- 			break;
 
- 		}
 
- 	}
 
- }
 
- @end
 
 
  |