1/***************************************************************************** 2 * RemoteControlContainer.m 3 * RemoteControlWrapper 4 * 5 * Created by Martin Kahr on 11.03.06 under a MIT-style license. 6 * Copyright (c) 2006 martinkahr.com. All rights reserved. 7 * 8 * Code modified and adapted to OpenOffice.org 9 * by Eric Bachard on 11.08.2008 under the same License 10 * 11 * Permission is hereby granted, free of charge, to any person obtaining a 12 * copy of this software and associated documentation files (the "Software"), 13 * to deal in the Software without restriction, including without limitation 14 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 15 * and/or sell copies of the Software, and to permit persons to whom the 16 * Software is furnished to do so, subject to the following conditions: 17 * 18 * The above copyright notice and this permission notice shall be included 19 * in all copies or substantial portions of the Software. 20 * 21 * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 24 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 26 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 27 * THE SOFTWARE. 28 * 29 *****************************************************************************/ 30 31#import "RemoteControlContainer.h" 32 33@implementation RemoteControlContainer 34 35- (id) initWithDelegate: (id) _remoteControlDelegate { 36 if ( (self = [super initWithDelegate:_remoteControlDelegate]) ) { 37 remoteControls = [[NSMutableArray alloc] init]; 38#ifdef DEBUG 39 NSLog(@"RemoteControlContainer initWithDelegate ok"); 40 } 41 else { 42 NSLog(@"RemoteControlContainer initWithDelegate failed"); 43#endif 44 } 45 46 return self; 47} 48 49- (void) dealloc { 50 [self stopListening: self]; 51 [remoteControls release]; 52 [super dealloc]; 53} 54 55- (BOOL) instantiateAndAddRemoteControlDeviceWithClass: (Class) clazz { 56 BOOL toReturn = NO; 57 RemoteControl* remoteControl = [[clazz alloc] initWithDelegate: delegate]; 58 if (remoteControl) { 59 [remoteControls addObject: remoteControl]; 60 [remoteControl addObserver: self forKeyPath:@"listeningToRemote" options:NSKeyValueObservingOptionNew context:nil]; 61 toReturn = YES; 62 } 63#ifdef DEBUG 64 else { 65 NSLog(@"RemoteControlContainer instantiateAndAddRemoteControlDeviceWithClass failed"); 66 toReturn = NO; 67 } 68#endif 69 return toReturn; 70} 71 72- (unsigned int) count { 73 return [remoteControls count]; 74} 75 76- (void) reset { 77 [self willChangeValueForKey:@"listeningToRemote"]; 78 [self didChangeValueForKey:@"listeningToRemote"]; 79#ifdef DEBUG 80 // debug purpose 81 NSLog(@"reset... (after listening to remote)"); 82#endif 83} 84 85- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 86 [self reset]; 87} 88 89- (void) setListeningToRemote: (BOOL) value { 90 int i; 91 for(i=0; i < [remoteControls count]; i++) { 92 [[remoteControls objectAtIndex: i] setListeningToRemote: value]; 93 } 94 if (value && value != [self isListeningToRemote]) [self performSelector:@selector(reset) withObject:nil afterDelay:0.01]; 95} 96- (BOOL) isListeningToRemote { 97 int i; 98 for(i=0; i < [remoteControls count]; i++) { 99 if ([[remoteControls objectAtIndex: i] isListeningToRemote]) { 100 return YES; 101 } 102 } 103 return NO; 104} 105 106- (void) startListening: (id) sender { 107#ifdef DEBUG 108 NSLog(@"startListening to events... "); 109#endif 110 int i; 111 for(i=0; i < [remoteControls count]; i++) { 112 [[remoteControls objectAtIndex: i] startListening: sender]; 113 } 114} 115- (void) stopListening: (id) sender { 116#ifdef DEBUG 117 NSLog(@"stopListening to events... "); 118#endif 119 int i; 120 for(i=0; i < [remoteControls count]; i++) { 121 [[remoteControls objectAtIndex: i] stopListening: sender]; 122 } 123} 124 125- (BOOL) isOpenInExclusiveMode { 126 BOOL mode = YES; 127 int i; 128 for(i=0; i < [remoteControls count]; i++) { 129 mode = mode && ([[remoteControls objectAtIndex: i] isOpenInExclusiveMode]); 130 } 131 return mode; 132} 133- (void) setOpenInExclusiveMode: (BOOL) value { 134 int i; 135 for(i=0; i < [remoteControls count]; i++) { 136 [[remoteControls objectAtIndex: i] setOpenInExclusiveMode:value]; 137 } 138} 139 140@end 141