1/*
2 * Copyright (C) 2012-2013 Samsung Electronics
3 * Copyright (C) 2012 Intel Corporation
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
23 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include "config.h"
28#include "ewk_text_checker.h"
29
30#if ENABLE(SPELLCHECK)
31#include "TextCheckerClientEfl.h"
32
33using namespace WebKit;
34
35static Eina_List* convertLanguagesToEinaList(const Vector<String>& languages)
36{
37    Eina_List* listOflanguages = 0;
38    size_t numberOfLanguages = languages.size();
39
40    for (size_t i = 0; i < numberOfLanguages; ++i)
41        listOflanguages = eina_list_append(listOflanguages, eina_stringshare_add(languages[i].utf8().data()));
42
43    return listOflanguages;
44}
45
46#define EWK_TEXT_CHECKER_CALLBACK_SET(TYPE_NAME, NAME)            \
47void ewk_text_checker_##NAME##_cb_set(TYPE_NAME cb)               \
48{                                                                 \
49    TextCheckerClientEfl::instance().clientCallbacks().NAME = cb; \
50}
51
52#else
53
54// Defines an empty API to do not break build.
55#define EWK_TEXT_CHECKER_CALLBACK_SET(TYPE_NAME, NAME)  \
56void ewk_text_checker_##NAME##_cb_set(TYPE_NAME)        \
57{                                                       \
58}
59#endif // ENABLE(SPELLCHECK)
60
61Eina_Bool ewk_text_checker_continuous_spell_checking_enabled_get()
62{
63#if ENABLE(SPELLCHECK)
64    return TextCheckerClientEfl::instance().isContinuousSpellCheckingEnabled();
65#else
66    return false;
67#endif
68}
69
70void ewk_text_checker_continuous_spell_checking_enabled_set(Eina_Bool enable)
71{
72#if ENABLE(SPELLCHECK)
73    WKTextCheckerContinuousSpellCheckingEnabledStateChanged(!!enable);
74#else
75    UNUSED_PARAM(enable);
76#endif
77}
78
79Eina_List* ewk_text_checker_spell_checking_available_languages_get()
80{
81    Eina_List* listOflanguages = 0;
82#if ENABLE(SPELLCHECK)
83    // FIXME: Expose WK2 C API to get available spell checking languages.
84    listOflanguages = convertLanguagesToEinaList(TextCheckerClientEfl::instance().availableSpellCheckingLanguages());
85#endif
86    return listOflanguages;
87}
88
89void ewk_text_checker_spell_checking_languages_set(const char* languages)
90{
91#if ENABLE(SPELLCHECK)
92    Vector<String> newLanguages;
93    String::fromUTF8(languages).split(',', newLanguages);
94
95    // FIXME: Expose WK2 C API to set spell checking languages.
96    TextCheckerClientEfl::instance().updateSpellCheckingLanguages(newLanguages);
97#else
98    UNUSED_PARAM(languages);
99#endif
100}
101
102Eina_List* ewk_text_checker_spell_checking_languages_get()
103{
104    Eina_List* listOflanguages = 0;
105#if ENABLE(SPELLCHECK)
106    // FIXME: Expose WK2 C API to get loaded spell checking languages.
107    listOflanguages = convertLanguagesToEinaList(TextCheckerClientEfl::instance().loadedSpellCheckingLanguages());
108#endif
109    return listOflanguages;
110}
111
112EWK_TEXT_CHECKER_CALLBACK_SET(Ewk_Text_Checker_Continuous_Spell_Checking_Change_Cb, continuous_spell_checking_change)
113EWK_TEXT_CHECKER_CALLBACK_SET(Ewk_Text_Checker_Unique_Spell_Document_Tag_Get_Cb, unique_spell_document_tag_get)
114EWK_TEXT_CHECKER_CALLBACK_SET(Ewk_Text_Checker_Unique_Spell_Document_Tag_Close_Cb, unique_spell_document_tag_close)
115EWK_TEXT_CHECKER_CALLBACK_SET(Ewk_Text_Checker_String_Spelling_Check_Cb, string_spelling_check)
116EWK_TEXT_CHECKER_CALLBACK_SET(Ewk_Text_Checker_Word_Guesses_Get_Cb, word_guesses_get)
117EWK_TEXT_CHECKER_CALLBACK_SET(Ewk_Text_Checker_Word_Learn_Cb, word_learn)
118EWK_TEXT_CHECKER_CALLBACK_SET(Ewk_Text_Checker_Word_Ignore_Cb, word_ignore)
119