/*
 * Copyright (C) 2010 Google Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *     * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *     * 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.
 *     * Neither the name of Google Inc. nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "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 THE COPYRIGHT
 * OWNER 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 SKY_ENGINE_PUBLIC_WEB_WEBSPELLCHECKCLIENT_H_
#define SKY_ENGINE_PUBLIC_WEB_WEBSPELLCHECKCLIENT_H_

#include "../platform/WebString.h"
#include "../platform/WebVector.h"
#include "sky/engine/public/web/WebTextCheckingType.h"

namespace blink {

class WebString;
class WebTextCheckingCompletion;
struct WebTextCheckingResult;

class WebSpellCheckClient {
public:
    // The client should perform spell-checking on the given text. If the
    // text contains a misspelled word, then upon return misspelledOffset
    // will point to the start of the misspelled word, and misspelledLength
    // will indicates its length. Otherwise, if there was not a spelling
    // error, then upon return misspelledLength is 0. If optional_suggestions
    // is given, then it will be filled with suggested words (not a cheap step).
    virtual void spellCheck(const WebString& text,
                            int& misspelledOffset,
                            int& misspelledLength,
                            WebVector<WebString>* optionalSuggestions) { }

    // The client should perform spell-checking on the given text. This function will
    // enumerate all misspellings at once.
    virtual void checkTextOfParagraph(const WebString&,
                                      WebTextCheckingTypeMask mask,
                                      WebVector<WebTextCheckingResult>* results) { }

    // Requests asynchronous spelling and grammar checking, whose result should be
    // returned by passed completion object.
    virtual void requestCheckingOfText(const WebString& textToCheck,
                                       const WebVector<uint32_t>& markersInText,
                                       const WebVector<unsigned>& markerOffsets,
                                       WebTextCheckingCompletion* completionCallback) { }

    // Computes an auto-corrected replacement for a misspelled word. If no
    // replacement is found, then an empty string is returned.
    virtual WebString autoCorrectWord(const WebString& misspelledWord) { return WebString(); }

    // Show or hide the spelling UI.
    virtual void showSpellingUI(bool show) { }

    // Returns true if the spelling UI is showing.
    virtual bool isShowingSpellingUI() { return false; }

    // Update the spelling UI with the given word.
    virtual void updateSpellingUIWithMisspelledWord(const WebString& word) { }

protected:
    ~WebSpellCheckClient() { }
};

} // namespace blink

#endif  // SKY_ENGINE_PUBLIC_WEB_WEBSPELLCHECKCLIENT_H_
