/**********************************************************************
 * LeechCraft - modular cross-platform feature rich internet client.
 * Copyright (C) 2006-2012  Georg Rudoy
 *
 * Boost Software License - Version 1.0 - August 17th, 2003
 *
 * Permission is hereby granted, free of charge, to any person or organization
 * obtaining a copy of the software and accompanying documentation covered by
 * this license (the "Software") to use, reproduce, display, distribute,
 * execute, and transmit the Software, and to prepare derivative works of the
 * Software, and to permit third-parties to whom the Software is furnished to
 * do so, all subject to the following:
 *
 * The copyright notices in the Software and this entire statement, including
 * the above license grant, this restriction and the following disclaimer,
 * must be included in all copies of the Software, in whole or in part, and
 * all derivative works of the Software, unless such copies or derivative
 * works are solely in the form of machine-executable object code generated by
 * a source language processor.
 *
 * 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT
 * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
 * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 **********************************************************************/

#include "fullscreen.h"
#include <AppKit/NSView.h>
#include <AppKit/NSWindow.h>
#include <Foundation/NSNotification.h>
#include <QMainWindow>
#include <QSysInfo>
#include <QtGlobal>

@interface WindowObserver : NSObject
{
	QMainWindow *Window_;
}

- (id) initWithMainWindow:(QMainWindow*)w;

- (void) notifyDidEnterFullScreen:(NSNotification*)notification;
- (void) notifyDidExitFullScreen:(NSNotification*)notification;

@end

@implementation WindowObserver

- (id) initWithMainWindow:(QMainWindow*)w
{
	if ((self = [self init]))
		Window_ = w;
	return self;
}

- (void) notifyDidEnterFullScreen:(NSNotification*)notification
{
	Q_UNUSED(notification)
}

- (void) notifyDidExitFullScreen:(NSNotification*)notification
{
	Q_UNUSED(notification)
}

@end

static WindowObserver *observer = nil;

static bool SupportsFSImpl ()
{
	return QSysInfo::MacintoshVersion >= QSysInfo::MV_LION;
}

static void AddActionImpl (QMainWindow *window)
{
	if (!SupportsFSImpl ())
		return;

	NSView *nsview = (NSView *) window->winId();
	NSWindow *nswindow = [nsview window];
	[nswindow setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];

	if (observer == nil)
		observer = [[WindowObserver alloc] initWithMainWindow:window];
	NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
	[nc addObserver:observer selector:@selector(notifyDidEnterFullScreen:)
		name:NSWindowDidEnterFullScreenNotification object:nswindow];
	[nc addObserver:observer selector:@selector(notifyDidExitFullScreen:)
		name:NSWindowDidExitFullScreenNotification object:nswindow];
}

static void ToggleImpl (QMainWindow *window)
{
	if (!SupportsFSImpl ())
		return;

	NSView *nsview = (NSView *) window->winId();
	NSWindow *nswindow = [nsview window];
	[nswindow performSelector:@selector(toggleFullScreen:) withObject: nil];
}

namespace LeechCraft
{
namespace Pierre
{
namespace FS
{
	bool SupportsFS ()
	{
		return SupportsFSImpl ();
	}

	void AddAction (QMainWindow *w)
	{
		AddActionImpl (w);
	}

	void Toggle (QMainWindow *w)
	{
		ToggleImpl (w);
	}
}
}
}
