/*
 * Copyright (C) 2006 Nikolas Zimmermann <zimmermann@kde.org>
 * Copyright (C) 2006 Zack Rusin <zack@kde.org>
 * Copyright (C) 2006 Apple Computer, Inc.
 * Copyright (C) 2010 Martin Robinson <mrobinson@webkit.org>
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef EditorClientGtk_h
#define EditorClientGtk_h

#include "EditorClient.h"
#include "TextCheckerClient.h"

#include <wtf/Deque.h>
#include <wtf/Forward.h>
#include <wtf/gobject/GOwnPtr.h>
#include <wtf/gobject/GRefPtr.h>

#if ENABLE(SPELLCHECK)
#include "TextCheckerClientEnchant.h"
#else
#include "EmptyClients.h"
#endif

typedef struct _WebKitWebView WebKitWebView;

namespace WebCore {
class Frame;
class KeyboardEvent;
}

namespace WebKit {

class EditorClient : public WebCore::EditorClient {
    protected:
        bool m_isInRedo;

        WTF::Deque<WTF::RefPtr<WebCore::EditCommand> > undoStack;
        WTF::Deque<WTF::RefPtr<WebCore::EditCommand> > redoStack;

    public:
        EditorClient(WebKitWebView*);
        ~EditorClient();
        WebKitWebView* webView() { return m_webView; }
        bool treatContextCommitAsKeyEvent() { return m_treatContextCommitAsKeyEvent; }
        bool preventNextCompositionCommit() { return m_preventNextCompositionCommit; }
        void clearPendingComposition() { m_pendingComposition.set(0); }
        bool hasPendingComposition() { return m_pendingComposition; }
        void addPendingEditorCommand(const char* command) { m_pendingEditorCommands.append(command); }
        void updatePendingComposition(const char*);
        void generateEditorCommands(const WebCore::KeyboardEvent*);
        bool executePendingEditorCommands(WebCore::Frame*, bool);

        // from EditorClient
        virtual void pageDestroyed();

        virtual bool shouldDeleteRange(WebCore::Range*);
        virtual bool shouldShowDeleteInterface(WebCore::HTMLElement*);
        virtual bool smartInsertDeleteEnabled();
        virtual bool isSelectTrailingWhitespaceEnabled();
        virtual bool isContinuousSpellCheckingEnabled();
        virtual void toggleContinuousSpellChecking();
        virtual bool isGrammarCheckingEnabled();
        virtual void toggleGrammarChecking();
        virtual int spellCheckerDocumentTag();

        virtual bool shouldBeginEditing(WebCore::Range*);
        virtual bool shouldEndEditing(WebCore::Range*);
        virtual bool shouldInsertNode(WebCore::Node*, WebCore::Range*, WebCore::EditorInsertAction);
        virtual bool shouldInsertText(const WTF::String&, WebCore::Range*, WebCore::EditorInsertAction);
        virtual bool shouldChangeSelectedRange(WebCore::Range* fromRange, WebCore::Range* toRange, WebCore::EAffinity, bool stillSelecting);

        virtual bool shouldApplyStyle(WebCore::CSSStyleDeclaration*, WebCore::Range*);

        virtual bool shouldMoveRangeAfterDelete(WebCore::Range*, WebCore::Range*);

        virtual void didBeginEditing();
        virtual void respondToChangedContents();
        virtual void respondToChangedSelection();
        virtual void didEndEditing();
        virtual void didWriteSelectionToPasteboard();
        virtual void didSetSelectionTypesForPasteboard();

        virtual void registerCommandForUndo(WTF::PassRefPtr<WebCore::EditCommand>);
        virtual void registerCommandForRedo(WTF::PassRefPtr<WebCore::EditCommand>);
        virtual void clearUndoRedoOperations();

        virtual bool canCopyCut(bool defaultValue) const;
        virtual bool canPaste(bool defaultValue) const;
        virtual bool canUndo() const;
        virtual bool canRedo() const;

        virtual void undo();
        virtual void redo();

        virtual void handleKeyboardEvent(WebCore::KeyboardEvent*);
        virtual void handleInputMethodKeydown(WebCore::KeyboardEvent*);
        virtual void handleInputMethodMousePress();

        virtual void textFieldDidBeginEditing(WebCore::Element*);
        virtual void textFieldDidEndEditing(WebCore::Element*);
        virtual void textDidChangeInTextField(WebCore::Element*);
        virtual bool doTextFieldCommandFromEvent(WebCore::Element*, WebCore::KeyboardEvent*);
        virtual void textWillBeDeletedInTextField(WebCore::Element*);
        virtual void textDidChangeInTextArea(WebCore::Element*);

        virtual WebCore::TextCheckerClient* textChecker() { return &m_textCheckerClient; }

        virtual void updateSpellingUIWithGrammarString(const WTF::String&, const WebCore::GrammarDetail&);
        virtual void updateSpellingUIWithMisspelledWord(const WTF::String&);
        virtual void showSpellingUI(bool show);
        virtual bool spellingUIIsShowing();
        virtual void willSetInputMethodState();
        virtual void setInputMethodState(bool enabled);

    private:
#if ENABLE(SPELLCHECK)
        TextCheckerClientEnchant m_textCheckerClient;
#else
        WebCore::EmptyTextCheckerClient m_textCheckerClient;
#endif
        WebKitWebView* m_webView;
        bool m_preventNextCompositionCommit;
        bool m_treatContextCommitAsKeyEvent;
        GOwnPtr<gchar> m_pendingComposition;
        Vector<const char*> m_pendingEditorCommands;
        GRefPtr<GtkWidget> m_nativeWidget;
    };
}

#endif

// vim: ts=4 sw=4 et
