/*
 * Copyright (C) 2012 Igalia S.L.
 *
 * 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.
 */

#if !defined(__WEBKIT_H_INSIDE__) && !defined(WEBKIT2_COMPILATION)
#error "Only <wpe/webkit.h> can be included directly."
#endif

#ifndef WebKitInputMethodContext_h
#define WebKitInputMethodContext_h

#include <glib-object.h>
#include <wpe/WebKitDefines.h>
#include <wpe/WebKitColor.h>
#include <wpe/wpe.h>

G_BEGIN_DECLS

#define WEBKIT_TYPE_INPUT_METHOD_CONTEXT            (webkit_input_method_context_get_type())
#define WEBKIT_INPUT_METHOD_CONTEXT(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), WEBKIT_TYPE_INPUT_METHOD_CONTEXT, WebKitInputMethodContext))
#define WEBKIT_INPUT_METHOD_CONTEXT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass),  WEBKIT_TYPE_INPUT_METHOD_CONTEXT, WebKitInputMethodContextClass))
#define WEBKIT_IS_INPUT_METHOD_CONTEXT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), WEBKIT_TYPE_INPUT_METHOD_CONTEXT))
#define WEBKIT_IS_INPUT_METHOD_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),  WEBKIT_TYPE_INPUT_METHOD_CONTEXT))
#define WEBKIT_INPUT_METHOD_CONTEXT_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj),  WEBKIT_TYPE_INPUT_METHOD_CONTEXT, WebKitInputMethodContextClass))

#define WEBKIT_TYPE_INPUT_METHOD_UNDERLINE          (webkit_input_method_underline_get_type())

/**
 * WebKitInputPurpose:
 * @WEBKIT_INPUT_PURPOSE_FREE_FORM: Editable element expects any characters
 * @WEBKIT_INPUT_PURPOSE_DIGITS: Editable element expects digits
 * @WEBKIT_INPUT_PURPOSE_NUMBER: Editable element expects a number
 * @WEBKIT_INPUT_PURPOSE_PHONE: Editable element expects a telephone
 * @WEBKIT_INPUT_PURPOSE_URL: Editable element expects a URL
 * @WEBKIT_INPUT_PURPOSE_EMAIL: Editable element expects an email
 * @WEBKIT_INPUT_PURPOSE_PASSWORD: Editable element expects a password
 *
 * Enum values used to describe the primary purpose of the active editable element.
 *
 * Since: 2.28
 */
typedef enum {
    WEBKIT_INPUT_PURPOSE_FREE_FORM,
    WEBKIT_INPUT_PURPOSE_DIGITS,
    WEBKIT_INPUT_PURPOSE_NUMBER,
    WEBKIT_INPUT_PURPOSE_PHONE,
    WEBKIT_INPUT_PURPOSE_URL,
    WEBKIT_INPUT_PURPOSE_EMAIL,
    WEBKIT_INPUT_PURPOSE_PASSWORD
} WebKitInputPurpose;

/**
 * WebKitInputHints:
 * @WEBKIT_INPUT_HINT_NONE: No special behavior suggested
 * @WEBKIT_INPUT_HINT_SPELLCHECK: Suggest spell checking
 * @WEBKIT_INPUT_HINT_LOWERCASE: Suggest to not autocapitlize
 * @WEBKIT_INPUT_HINT_UPPERCASE_CHARS: Suggest to capitalize all text
 * @WEBKIT_INPUT_HINT_UPPERCASE_WORDS: Suggest to capitalize the first character of each word
 * @WEBKIT_INPUT_HINT_UPPERCASE_SENTENCES: Suggest to capitalize the first word of each sentence
 * @WEBKIT_INPUT_HINT_INHIBIT_OSK: Suggest to not show an onscreen keyboard
 *
 * Enum values used to describe hints that might be taken into account by input methods.
 *
 * Since: 2.28
 */
typedef enum {
    WEBKIT_INPUT_HINT_NONE                = 0,
    WEBKIT_INPUT_HINT_SPELLCHECK          = 1 << 0,
    WEBKIT_INPUT_HINT_LOWERCASE           = 1 << 1,
    WEBKIT_INPUT_HINT_UPPERCASE_CHARS     = 1 << 2,
    WEBKIT_INPUT_HINT_UPPERCASE_WORDS     = 1 << 3,
    WEBKIT_INPUT_HINT_UPPERCASE_SENTENCES = 1 << 4,
    WEBKIT_INPUT_HINT_INHIBIT_OSK         = 1 << 5
} WebKitInputHints;

typedef struct _WebKitInputMethodContext        WebKitInputMethodContext;
typedef struct _WebKitInputMethodContextClass   WebKitInputMethodContextClass;
typedef struct _WebKitInputMethodContextPrivate WebKitInputMethodContextPrivate;
typedef struct _WebKitInputMethodUnderline      WebKitInputMethodUnderline;

struct _WebKitInputMethodContext {
    GObject parent;

    /*< private >*/
    WebKitInputMethodContextPrivate *priv;
};

struct _WebKitInputMethodContextClass {
    GObjectClass parent_class;

    /* Signals */
    void     (* preedit_started)    (WebKitInputMethodContext        *context);
    void     (* preedit_changed)    (WebKitInputMethodContext        *context);
    void     (* preedit_finished)   (WebKitInputMethodContext        *context);
    void     (* committed)          (WebKitInputMethodContext        *context,
                                     const char                      *text);
    void     (* delete_surrounding) (WebKitInputMethodContext        *context,
                                     int                              offset,
                                     guint                            n_chars);

    /* Virtual functions */
    void     (* set_enable_preedit) (WebKitInputMethodContext        *context,
                                     gboolean                         enabled);
    void     (* get_preedit)        (WebKitInputMethodContext        *context,
                                     gchar                          **text,
                                     GList                          **underlines,
                                     guint                           *cursor_offset);
    gboolean (* filter_key_event)   (WebKitInputMethodContext        *context,
                                     struct wpe_input_keyboard_event *key_event);
    void     (* notify_focus_in)    (WebKitInputMethodContext        *context);
    void     (* notify_focus_out)   (WebKitInputMethodContext        *context);
    void     (* notify_cursor_area) (WebKitInputMethodContext        *context,
                                     int                              x,
                                     int                              y,
                                     int                              width,
                                     int                              height);
    void     (* notify_surrounding) (WebKitInputMethodContext        *context,
                                     const gchar                     *text,
                                     guint                            length,
                                     guint                            cursor_index,
                                     guint                            selection_index);
    void     (* reset)              (WebKitInputMethodContext        *context);

    void (*_webkit_reserved0) (void);
    void (*_webkit_reserved1) (void);
    void (*_webkit_reserved2) (void);
    void (*_webkit_reserved3) (void);
    void (*_webkit_reserved4) (void);
    void (*_webkit_reserved5) (void);
    void (*_webkit_reserved6) (void);
    void (*_webkit_reserved7) (void);
};

WEBKIT_API GType
webkit_input_method_context_get_type           (void);

WEBKIT_API void
webkit_input_method_context_set_enable_preedit (WebKitInputMethodContext        *context,
                                                gboolean                         enabled);

WEBKIT_API void
webkit_input_method_context_get_preedit        (WebKitInputMethodContext        *context,
                                                char                           **text,
                                                GList                          **underlines,
                                                guint                           *cursor_offset);

WEBKIT_API gboolean
webkit_input_method_context_filter_key_event   (WebKitInputMethodContext        *context,
                                                struct wpe_input_keyboard_event *key_event);

WEBKIT_API void
webkit_input_method_context_notify_focus_in    (WebKitInputMethodContext        *context);

WEBKIT_API void
webkit_input_method_context_notify_focus_out   (WebKitInputMethodContext        *context);

WEBKIT_API void
webkit_input_method_context_notify_cursor_area (WebKitInputMethodContext        *context,
                                                int                              x,
                                                int                              y,
                                                int                              width,
                                                int                              height);

WEBKIT_API void
webkit_input_method_context_notify_surrounding (WebKitInputMethodContext        *context,
                                                const gchar                     *text,
                                                int                              length,
                                                guint                            cursor_index,
                                                guint                            selection_index);

WEBKIT_API void
webkit_input_method_context_reset              (WebKitInputMethodContext        *context);


WEBKIT_API GType
webkit_input_method_underline_get_type         (void);

WEBKIT_API WebKitInputMethodUnderline *
webkit_input_method_underline_new              (guint                            start_offset,
                                                guint                            end_offset);

WEBKIT_API WebKitInputMethodUnderline *
webkit_input_method_underline_copy             (WebKitInputMethodUnderline      *underline);

WEBKIT_API void
webkit_input_method_underline_free             (WebKitInputMethodUnderline      *underline);

WEBKIT_API void
webkit_input_method_underline_set_color        (WebKitInputMethodUnderline      *underline,
                                                WebKitColor                     *color);

WEBKIT_API WebKitInputPurpose
webkit_input_method_context_get_input_purpose  (WebKitInputMethodContext        *context);

WEBKIT_API void
webkit_input_method_context_set_input_purpose  (WebKitInputMethodContext        *context,
                                                WebKitInputPurpose               purpose);

WEBKIT_API WebKitInputHints
webkit_input_method_context_get_input_hints    (WebKitInputMethodContext        *context);

WEBKIT_API void
webkit_input_method_context_set_input_hints    (WebKitInputMethodContext        *context,
                                                WebKitInputHints                 hints);


G_END_DECLS

#endif
