/*
* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:   extension of WebCore::EditorClient
*
*/

#ifndef WebEditorClient_h
#define WebEditorClient_h

#include "EditorClient.h"


class WebView;

class WebEditorClient : public WebCore::EditorClient {
public:     
	enum TEdwinHotKeys 
		{
        /** Cut. */
		EHotKeyCut,

        /** Copy. */
		EHotKeyCopy,

        /** Paste. */
		EHotKeyPaste
		};		 
    WebEditorClient(WebView* webview);
     virtual ~WebEditorClient() {}
     void pageDestroyed();
    
     bool shouldDeleteRange(WebCore::Range*);
     bool shouldShowDeleteInterface(WebCore::HTMLElement*);
     bool smartInsertDeleteEnabled(); 
     bool isContinuousSpellCheckingEnabled();
     void toggleContinuousSpellChecking();
     bool isGrammarCheckingEnabled();
     void toggleGrammarChecking();
     int spellCheckerDocumentTag();
    
     bool selectWordBeforeMenuEvent();
     bool isEditable();

     bool shouldBeginEditing(WebCore::Range*);
     bool shouldEndEditing(WebCore::Range*);
     bool shouldInsertNode(WebCore::Node*, WebCore::Range*, WebCore::EditorInsertAction);
     bool shouldInsertText(WebCore::String, WebCore::Range*, WebCore::EditorInsertAction);
     bool shouldChangeSelectedRange(WebCore::Range* fromRange, WebCore::Range* toRange, WebCore::EAffinity, bool stillSelecting);
    
     bool shouldApplyStyle(WebCore::CSSStyleDeclaration*, WebCore::Range*);
     bool shouldMoveRangeAfterDelete(WebCore::Range*, WebCore::Range*);

     void didBeginEditing();
     void respondToChangedContents();
     void respondToChangedSelection();
     void didEndEditing();
     void didWriteSelectionToPasteboard();
     void didSetSelectionTypesForPasteboard();
    
     void registerCommandForUndo(PassRefPtr<WebCore::EditCommand>);
     void registerCommandForRedo(PassRefPtr<WebCore::EditCommand>);
     void clearUndoRedoOperations();

     bool canUndo() const;
     bool canRedo() const;
    
     void undo();
     void redo();

     void handleKeypress(WebCore::KeyboardEvent*);
     void handleInputMethodKeypress(WebCore::KeyboardEvent*);
             
     void textFieldDidBeginEditing(WebCore::Element*);
     void textFieldDidEndEditing(WebCore::Element*);
     void textDidChangeInTextField(WebCore::Element*);
     bool doTextFieldCommandFromEvent(WebCore::Element*, WebCore::KeyboardEvent*);
     void textWillBeDeletedInTextField(WebCore::Element*);
     void textDidChangeInTextArea(WebCore::Element*);
     void ignoreWordInSpellDocument(const WebCore::String&);
     void learnWord(const WebCore::String&);
     void checkSpellingOfString(const UChar*, int length, int* misspellingLocation, int* misspellingLength);
     void checkGrammarOfString(const UChar*, int length, Vector<WebCore::GrammarDetail>&, int* badGrammarLocation, int* badGrammarLength);
     void updateSpellingUIWithGrammarString(const WebCore::String&, const WebCore::GrammarDetail& detail);
     void updateSpellingUIWithMisspelledWord(const WebCore::String&);
     void showSpellingUI(bool show);
     bool spellingUIIsShowing();
     void getGuessesForWord(const WebCore::String&, Vector<WebCore::String>& guesses);     
     void setInputMethodState(bool enabled);
     void preFocusChange(WebCore::Node* oldNode, WebCore::Node* newNode);
     
private:
    void handleInsertText(WebCore::Frame* frame, const WebCore::String& text);
    void handleDeleteText(WebCore::Frame* frame);

private:
    WebView* m_webView;
    bool     m_shouldEndEditing;
};


#endif // WebEditorClient_h
