/***************************************************************************** * 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