/*
 * Copyright (C) 2001 Peter Kelly (pmk@post.com)
 * Copyright (C) 2001 Tobias Anton (anton@stud.fbi.fh-darmstadt.de)
 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
 * Copyright (C) 2003, 2004, 2005, 2006, 2008 Apple Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 *
 */

#pragma once

#include "EventModifierInit.h"
#include "PlatformEvent.h"
#include "UIEvent.h"

namespace WebCore {

class UIEventWithKeyState : public UIEvent {
public:
	typedef PlatformEvent::Modifier Modifier;

	bool ctrlKey() const { return m_ctrlKey; }
	bool shiftKey() const { return m_shiftKey; }
	bool altKey() const { return m_altKey; }
	bool metaKey() const { return m_metaKey; }
    bool altGraphKey() const { return m_altGraphKey; }
    bool capsLockKey() const { return m_capsLockKey; }

    OptionSet<Modifier> modifierKeys() const
    {
    	OptionSet<Modifier> modifiers;
    	if (ctrlKey())
    		modifiers.add(Modifier::CtrlKey);
    	if (shiftKey())
    		modifiers.add(Modifier::ShiftKey);
    	if (altKey())
    		modifiers.add(Modifier::AltKey);
    	if (metaKey())
    		modifiers.add(Modifier::MetaKey);
    	if (altGraphKey())
    		modifiers.add(Modifier::AltGraphKey);
    	if (capsLockKey())
    		modifiers.add(Modifier::CapsLockKey);
    	return modifiers;
    }

protected:
	UIEventWithKeyState()
		: m_ctrlKey(false)
		, m_altKey(false)
		, m_shiftKey(false)
		, m_metaKey(false)
		, m_altGraphKey(false)
		, m_capsLockKey(false)
	{
	}

	UIEventWithKeyState(const AtomicString& type, bool canBubble, bool cancelable, IsComposed isComposed,
		PassRefPtr<AbstractView> view, int detail, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey, bool capsLockKey)
		: UIEvent(type, canBubble, cancelable, isComposed, view, detail)
		, m_ctrlKey(ctrlKey)
		, m_altKey(altKey)
		, m_shiftKey(shiftKey)
		, m_metaKey(metaKey)
		, m_altGraphKey(altGraphKey)
		, m_capsLockKey(capsLockKey)
	{
	}

    UIEventWithKeyState(const AtomicString& type, const EventModifierInit& initializer)
        : UIEvent(type, initializer)
        , m_ctrlKey(initializer.ctrlKey)
        , m_altKey(initializer.altKey)
        , m_shiftKey(initializer.shiftKey)
        , m_metaKey(initializer.metaKey)
    	, m_altGraphKey(initializer.modifierAltGraph)
    	, m_capsLockKey(initializer.modifierCapsLock)
    {
    }

	// Expose these so init functions can set them.
	bool m_ctrlKey;
	bool m_altKey;
	bool m_shiftKey;
	bool m_metaKey;
    bool m_altGraphKey;
    bool m_capsLockKey;
};

UIEventWithKeyState* findEventWithKeyState(Event*);

} // namespace WebCore
