{- |
Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
License    : LGPL-2.1
Maintainer : Iñaki García Etxebarria (garetxe@gmail.com)
-}

module GI.WebKit.Interfaces.SpellChecker
    ( 

-- * Exported types
    SpellChecker(..)                        ,
    noSpellChecker                          ,
    SpellCheckerK                           ,
    toSpellChecker                          ,


 -- * Methods
-- ** spellCheckerCheckSpellingOfString
    spellCheckerCheckSpellingOfString       ,


-- ** spellCheckerGetAutocorrectSuggestionsForMisspelledWord
    spellCheckerGetAutocorrectSuggestionsForMisspelledWord,


-- ** spellCheckerGetGuessesForWord
    spellCheckerGetGuessesForWord           ,


-- ** spellCheckerIgnoreWord
    spellCheckerIgnoreWord                  ,


-- ** spellCheckerLearnWord
    spellCheckerLearnWord                   ,


-- ** spellCheckerUpdateSpellCheckingLanguages
    spellCheckerUpdateSpellCheckingLanguages,




    ) where

import Prelude ()
import Data.GI.Base.ShortPrelude

import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map

import GI.WebKit.Types
import GI.WebKit.Callbacks
import qualified GI.GObject as GObject

-- interface SpellChecker 

newtype SpellChecker = SpellChecker (ForeignPtr SpellChecker)
noSpellChecker :: Maybe SpellChecker
noSpellChecker = Nothing

type instance AttributeList SpellChecker = SpellCheckerAttributeList
type SpellCheckerAttributeList = ('[ ] :: [(Symbol, *)])

type instance SignalList SpellChecker = SpellCheckerSignalList
type SpellCheckerSignalList = ('[ '("notify", GObject.ObjectNotifySignalInfo), '("notify::[property]", GObjectNotifySignalInfo)] :: [(Symbol, *)])

foreign import ccall "webkit_spell_checker_get_type"
    c_webkit_spell_checker_get_type :: IO GType

type instance ParentTypes SpellChecker = SpellCheckerParentTypes
type SpellCheckerParentTypes = '[GObject.Object]

instance GObject SpellChecker where
    gobjectIsInitiallyUnowned _ = False
    gobjectType _ = c_webkit_spell_checker_get_type
    

class GObject o => SpellCheckerK o
instance (GObject o, IsDescendantOf SpellChecker o) => SpellCheckerK o

toSpellChecker :: SpellCheckerK o => o -> IO SpellChecker
toSpellChecker = unsafeCastTo SpellChecker

-- method SpellChecker::check_spelling_of_string
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "WebKit" "SpellChecker", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "string", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "misspelling_location", argType = TBasicType TInt32, direction = DirectionOut, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferEverything},Arg {argName = "misspelling_length", argType = TBasicType TInt32, direction = DirectionOut, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferEverything}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "WebKit" "SpellChecker", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "string", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "webkit_spell_checker_check_spelling_of_string" webkit_spell_checker_check_spelling_of_string :: 
    Ptr SpellChecker ->                     -- _obj : TInterface "WebKit" "SpellChecker"
    CString ->                              -- string : TBasicType TUTF8
    Ptr Int32 ->                            -- misspelling_location : TBasicType TInt32
    Ptr Int32 ->                            -- misspelling_length : TBasicType TInt32
    IO ()


spellCheckerCheckSpellingOfString ::
    (MonadIO m, SpellCheckerK a) =>
    a ->                                    -- _obj
    T.Text ->                               -- string
    m (Int32,Int32)
spellCheckerCheckSpellingOfString _obj string = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    string' <- textToCString string
    misspelling_location <- allocMem :: IO (Ptr Int32)
    misspelling_length <- allocMem :: IO (Ptr Int32)
    webkit_spell_checker_check_spelling_of_string _obj' string' misspelling_location misspelling_length
    misspelling_location' <- peek misspelling_location
    misspelling_length' <- peek misspelling_length
    touchManagedPtr _obj
    freeMem string'
    freeMem misspelling_location
    freeMem misspelling_length
    return (misspelling_location', misspelling_length')

-- method SpellChecker::get_autocorrect_suggestions_for_misspelled_word
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "WebKit" "SpellChecker", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "word", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "WebKit" "SpellChecker", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "word", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TUTF8
-- throws : False
-- Skip return : False

foreign import ccall "webkit_spell_checker_get_autocorrect_suggestions_for_misspelled_word" webkit_spell_checker_get_autocorrect_suggestions_for_misspelled_word :: 
    Ptr SpellChecker ->                     -- _obj : TInterface "WebKit" "SpellChecker"
    CString ->                              -- word : TBasicType TUTF8
    IO CString


spellCheckerGetAutocorrectSuggestionsForMisspelledWord ::
    (MonadIO m, SpellCheckerK a) =>
    a ->                                    -- _obj
    T.Text ->                               -- word
    m T.Text
spellCheckerGetAutocorrectSuggestionsForMisspelledWord _obj word = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    word' <- textToCString word
    result <- webkit_spell_checker_get_autocorrect_suggestions_for_misspelled_word _obj' word'
    checkUnexpectedReturnNULL "webkit_spell_checker_get_autocorrect_suggestions_for_misspelled_word" result
    result' <- cstringToText result
    freeMem result
    touchManagedPtr _obj
    freeMem word'
    return result'

-- method SpellChecker::get_guesses_for_word
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "WebKit" "SpellChecker", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "word", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "context", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = True, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "WebKit" "SpellChecker", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "word", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "context", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = True, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TCArray True (-1) (-1) (TBasicType TUTF8)
-- throws : False
-- Skip return : False

foreign import ccall "webkit_spell_checker_get_guesses_for_word" webkit_spell_checker_get_guesses_for_word :: 
    Ptr SpellChecker ->                     -- _obj : TInterface "WebKit" "SpellChecker"
    CString ->                              -- word : TBasicType TUTF8
    CString ->                              -- context : TBasicType TUTF8
    IO (Ptr CString)


spellCheckerGetGuessesForWord ::
    (MonadIO m, SpellCheckerK a) =>
    a ->                                    -- _obj
    T.Text ->                               -- word
    Maybe (T.Text) ->                       -- context
    m [T.Text]
spellCheckerGetGuessesForWord _obj word context = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    word' <- textToCString word
    maybeContext <- case context of
        Nothing -> return nullPtr
        Just jContext -> do
            jContext' <- textToCString jContext
            return jContext'
    result <- webkit_spell_checker_get_guesses_for_word _obj' word' maybeContext
    checkUnexpectedReturnNULL "webkit_spell_checker_get_guesses_for_word" result
    result' <- unpackZeroTerminatedUTF8CArray result
    mapZeroTerminatedCArray freeMem result
    freeMem result
    touchManagedPtr _obj
    freeMem word'
    freeMem maybeContext
    return result'

-- method SpellChecker::ignore_word
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "WebKit" "SpellChecker", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "word", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "WebKit" "SpellChecker", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "word", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "webkit_spell_checker_ignore_word" webkit_spell_checker_ignore_word :: 
    Ptr SpellChecker ->                     -- _obj : TInterface "WebKit" "SpellChecker"
    CString ->                              -- word : TBasicType TUTF8
    IO ()


spellCheckerIgnoreWord ::
    (MonadIO m, SpellCheckerK a) =>
    a ->                                    -- _obj
    T.Text ->                               -- word
    m ()
spellCheckerIgnoreWord _obj word = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    word' <- textToCString word
    webkit_spell_checker_ignore_word _obj' word'
    touchManagedPtr _obj
    freeMem word'
    return ()

-- method SpellChecker::learn_word
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "WebKit" "SpellChecker", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "word", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "WebKit" "SpellChecker", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "word", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "webkit_spell_checker_learn_word" webkit_spell_checker_learn_word :: 
    Ptr SpellChecker ->                     -- _obj : TInterface "WebKit" "SpellChecker"
    CString ->                              -- word : TBasicType TUTF8
    IO ()


spellCheckerLearnWord ::
    (MonadIO m, SpellCheckerK a) =>
    a ->                                    -- _obj
    T.Text ->                               -- word
    m ()
spellCheckerLearnWord _obj word = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    word' <- textToCString word
    webkit_spell_checker_learn_word _obj' word'
    touchManagedPtr _obj
    freeMem word'
    return ()

-- method SpellChecker::update_spell_checking_languages
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "WebKit" "SpellChecker", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "languages", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = True, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "WebKit" "SpellChecker", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "languages", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = True, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "webkit_spell_checker_update_spell_checking_languages" webkit_spell_checker_update_spell_checking_languages :: 
    Ptr SpellChecker ->                     -- _obj : TInterface "WebKit" "SpellChecker"
    CString ->                              -- languages : TBasicType TUTF8
    IO ()


spellCheckerUpdateSpellCheckingLanguages ::
    (MonadIO m, SpellCheckerK a) =>
    a ->                                    -- _obj
    Maybe (T.Text) ->                       -- languages
    m ()
spellCheckerUpdateSpellCheckingLanguages _obj languages = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    maybeLanguages <- case languages of
        Nothing -> return nullPtr
        Just jLanguages -> do
            jLanguages' <- textToCString jLanguages
            return jLanguages'
    webkit_spell_checker_update_spell_checking_languages _obj' maybeLanguages
    touchManagedPtr _obj
    freeMem maybeLanguages
    return ()