| /***************************************************************************** |
| * RemoteControlContainer.m |
| * RemoteControlWrapper |
| * |
| * Created by Martin Kahr on 11.03.06 under a MIT-style license. |
| * Copyright (c) 2006 martinkahr.com. All rights reserved. |
| * |
| * Code modified and adapted to OpenOffice.org |
| * by Eric Bachard on 11.08.2008 under the same License |
| * |
| * 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 "RemoteControlContainer.h" |
| |
| @implementation RemoteControlContainer |
| |
| - (id) initWithDelegate: (id) _remoteControlDelegate { |
| if ( (self = [super initWithDelegate:_remoteControlDelegate]) ) { |
| remoteControls = [[NSMutableArray alloc] init]; |
| #ifdef DEBUG |
| NSLog( @"Apple Remote: ControlContainer initWithDelegate ok"); |
| } |
| else { |
| NSLog( @"Apple Remote: RemoteControlContainer initWithDelegate failed"); |
| #endif |
| } |
| |
| return self; |
| } |
| |
| - (void) dealloc { |
| [self stopListening: self]; |
| [remoteControls release]; |
| [super dealloc]; |
| } |
| |
| - (BOOL) instantiateAndAddRemoteControlDeviceWithClass: (Class) clazz { |
| BOOL toReturn = NO; |
| RemoteControl* remoteControl = [[clazz alloc] initWithDelegate: delegate]; |
| if (remoteControl) { |
| [remoteControls addObject: remoteControl]; |
| [remoteControl addObserver: self forKeyPath:@"listeningToRemote" options:NSKeyValueObservingOptionNew context:nil]; |
| toReturn = YES; |
| } |
| #ifdef DEBUG |
| else { |
| NSLog( @"Apple Remote: ControlContainer instantiateAndAddRemoteControlDeviceWithClass failed"); |
| toReturn = NO; |
| } |
| #endif |
| return toReturn; |
| } |
| |
| - (unsigned int) count { |
| return [remoteControls count]; |
| } |
| |
| - (void) reset { |
| [self willChangeValueForKey:@"listeningToRemote"]; |
| [self didChangeValueForKey:@"listeningToRemote"]; |
| #ifdef DEBUG |
| // debug purpose |
| NSLog( @"Apple Remote: reset... (after listening)"); |
| #endif |
| } |
| |
| - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { |
| [self reset]; |
| } |
| |
| - (void) setListeningToRemote: (BOOL) value { |
| int i; |
| for(i=0; i < [remoteControls count]; i++) { |
| [[remoteControls objectAtIndex: i] setListeningToRemote: value]; |
| } |
| if (value && value != [self isListeningToRemote]) [self performSelector:@selector(reset) withObject:nil afterDelay:0.01]; |
| } |
| - (BOOL) isListeningToRemote { |
| int i; |
| for(i=0; i < [remoteControls count]; i++) { |
| if ([[remoteControls objectAtIndex: i] isListeningToRemote]) { |
| return YES; |
| } |
| } |
| return NO; |
| } |
| |
| - (void) startListening: (id) sender { |
| #ifdef DEBUG |
| NSLog(@"Apple Remote: start listening to events... "); |
| #endif |
| int i; |
| for(i=0; i < [remoteControls count]; i++) { |
| [[remoteControls objectAtIndex: i] startListening: sender]; |
| } |
| } |
| - (void) stopListening: (id) sender { |
| #ifdef DEBUG |
| NSLog(@"Apple Remote: stopListening to events... "); |
| #endif |
| int i; |
| for(i=0; i < [remoteControls count]; i++) { |
| [[remoteControls objectAtIndex: i] stopListening: sender]; |
| } |
| } |
| |
| - (BOOL) isOpenInExclusiveMode { |
| BOOL mode = YES; |
| int i; |
| for(i=0; i < [remoteControls count]; i++) { |
| mode = mode && ([[remoteControls objectAtIndex: i] isOpenInExclusiveMode]); |
| } |
| return mode; |
| } |
| - (void) setOpenInExclusiveMode: (BOOL) value { |
| int i; |
| for(i=0; i < [remoteControls count]; i++) { |
| [[remoteControls objectAtIndex: i] setOpenInExclusiveMode:value]; |
| } |
| } |
| |
| @end |