/*****************************************************************************
 * RemoteMainController.m
 *
 * 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 "RemoteMainController.h"
#import "AppleRemote.h"
#import "GlobalKeyboardDevice.h"
#import "RemoteControlContainer.h"
#import "MultiClickRemoteBehavior.h"

// -------------------------------------------------------------------------------------------
// Sample Code 3: Multi Click Behavior and Hold Event Simulation
// -------------------------------------------------------------------------------------------

@implementation AppleRemoteMainController

- (id) init {
    self = [super init];  // because we redefined our own init instead of use the fu..nny awakeFromNib 
    if (self != nil) {

        // 1. instantiate the desired behavior for the remote control device
        remoteControlBehavior = [[MultiClickRemoteBehavior alloc] init];	

        // 2. configure the behavior
        [remoteControlBehavior setDelegate: self];
		
        // 3. a Remote Control Container manages a number of devices and conforms to the RemoteControl interface
        //    Therefore you can enable or disable all the devices of the container with a single "startListening:" call.
        RemoteControlContainer* container = [[RemoteControlContainer alloc] initWithDelegate: remoteControlBehavior];

        if ( [container instantiateAndAddRemoteControlDeviceWithClass: [AppleRemote class]] != 0 ) {
#ifdef DEBUG
            NSLog(@"[container instantiateAndAddRemoteControlDeviceWithClass: [AppleRemote class]] successfull");
        }
        else {
            NSLog(@"[container instantiateAndAddRemoteControlDeviceWithClass: [AppleRemote class]] failed");
#endif
        }

        if ( [container instantiateAndAddRemoteControlDeviceWithClass: [GlobalKeyboardDevice class]] != 0 ) {
#ifdef DEBUG
            NSLog(@"[container instantiateAndAddRemoteControlDeviceWithClass: [GlobalKeyboardDevice class]] successfull");
        }
        else {
            NSLog(@"[container instantiateAndAddRemoteControlDeviceWithClass: [GlobalKeyboardDevice class]] failed");
#endif
        }	
        // to give the binding mechanism a chance to see the change of the attribute
        [self setValue: container forKey: @"remoteControl"];	
#ifdef DEBUG
            NSLog(@"AppleRemoteMainController init done");
#endif
    }
    else 
        NSLog(@"AppleRemoteMainController init failed");
    return self;
}

- (void) postTheEvent: (short int)buttonIdentifier modifierFlags:(int)modifierFlags
{
    [NSApp postEvent: 
    [NSEvent    otherEventWithType:NSApplicationDefined
                location:NSZeroPoint
                modifierFlags:modifierFlags
                timestamp: 0
                windowNumber:[[NSApp keyWindow] windowNumber]
                context:nil
                subtype:AppleRemoteControlEvent
                data1: buttonIdentifier 
                data2: 0]
    atStart: NO];
}


- (void) remoteButton: (RemoteControlEventIdentifier)buttonIdentifier pressedDown: (BOOL) pressedDown clickCount: (unsigned int)clickCount
{
    NSString* pressed = @"";
#ifdef DEBUG
    NSString* buttonName = nil;
#endif
    if (pressedDown)
    {
        pressed = @"(AppleRemoteMainController: button pressed)";

#ifdef DEBUG
        switch(buttonIdentifier) 
        {
            case kRemoteButtonPlus:         buttonName = @"Volume up";              break;  // MEDIA_COMMAND_VOLUME_UP  ( see vcl/inc/vcl/cmdevt.hxx )
            case kRemoteButtonMinus:        buttonName = @"Volume down";            break;  // MEDIA_COMMAND_VOLUME_DOWN
            case kRemoteButtonMenu:         buttonName = @"Menu";                   break;  // MEDIA_COMMAND_MENU
            case kRemoteButtonPlay:         buttonName = @"Play";                   break;  // MEDIA_COMMAND_PLAY
            case kRemoteButtonRight:        buttonName = @"Next slide";             break;  // MEDIA_COMMAND_NEXTTRACK
            case kRemoteButtonLeft:         buttonName = @"Left";                   break;  // MEDIA_COMMAND_PREVIOUSTRACK
            case kRemoteButtonRight_Hold:   buttonName = @"Last slide";             break;  // MEDIA_COMMAND_NEXTTRACK_HOLD
            case kRemoteButtonLeft_Hold:    buttonName = @"First slide";            break;  // MEDIA_COMMAND_PREVIOUSTRACK_HOLD
            case kRemoteButtonPlus_Hold:    buttonName = @"Volume up holding";      break;
            case kRemoteButtonMinus_Hold:   buttonName = @"Volume down holding";    break;
            case kRemoteButtonPlay_Hold:    buttonName = @"Play (sleep mode)";      break;  // MEDIA_COMMAND_PLAY_HOLD
            case kRemoteButtonMenu_Hold:    buttonName = @"Menu (long)";            break;  // MEDIA_COMMAND_MENU_HOLD
            case kRemoteControl_Switched:   buttonName = @"Remote Control Switched";break;

            default:    NSLog( @"AppleRemoteMainController: Unmapped event for button %d", buttonIdentifier);   break;
        }
#endif
        [ self postTheEvent:buttonIdentifier modifierFlags: 0 ];
    }
    else // not pressed
    {
        pressed = @"(AppleRemoteMainController: button released)";
    }

#ifdef DEBUG
	//NSLog(@"Button %@ pressed %@", buttonName, pressed);
	NSString* clickCountString = @"";
	if (clickCount > 1) clickCountString = [NSString stringWithFormat: @"%d clicks", clickCount];
	NSString* feedbackString = [NSString stringWithFormat:@"(Value:%4d) %@  %@ %@",buttonIdentifier, buttonName, pressed, clickCountString];

	// print out events
	NSLog(@"%@", feedbackString);

    if (pressedDown == NO) printf("\n");
	// simulate slow processing of events
	// [NSThread sleepUntilDate: [NSDate dateWithTimeIntervalSinceNow: 0.5]];
#endif
}

- (void) dealloc {
    [remoteControl autorelease];
	[remoteControlBehavior autorelease];
	[super dealloc];
}

// for bindings access
- (RemoteControl*) remoteControl {
	return remoteControl;
}

- (MultiClickRemoteBehavior*) remoteBehavior {
	return remoteControlBehavior;
}

@end
