{- |
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.Gtk.Objects.TextTagTable
    ( 

-- * Exported types
    TextTagTable(..)                        ,
    TextTagTableK                           ,
    toTextTagTable                          ,
    noTextTagTable                          ,


 -- * Methods
-- ** textTagTableAdd
    textTagTableAdd                         ,


-- ** textTagTableForeach
    textTagTableForeach                     ,


-- ** textTagTableGetSize
    textTagTableGetSize                     ,


-- ** textTagTableLookup
    textTagTableLookup                      ,


-- ** textTagTableNew
    textTagTableNew                         ,


-- ** textTagTableRemove
    textTagTableRemove                      ,




 -- * Signals
-- ** TagAdded
    TextTagTableTagAddedCallback            ,
    TextTagTableTagAddedCallbackC           ,
    TextTagTableTagAddedSignalInfo          ,
    afterTextTagTableTagAdded               ,
    mkTextTagTableTagAddedCallback          ,
    noTextTagTableTagAddedCallback          ,
    onTextTagTableTagAdded                  ,
    textTagTableTagAddedCallbackWrapper     ,
    textTagTableTagAddedClosure             ,


-- ** TagChanged
    TextTagTableTagChangedCallback          ,
    TextTagTableTagChangedCallbackC         ,
    TextTagTableTagChangedSignalInfo        ,
    afterTextTagTableTagChanged             ,
    mkTextTagTableTagChangedCallback        ,
    noTextTagTableTagChangedCallback        ,
    onTextTagTableTagChanged                ,
    textTagTableTagChangedCallbackWrapper   ,
    textTagTableTagChangedClosure           ,


-- ** TagRemoved
    TextTagTableTagRemovedCallback          ,
    TextTagTableTagRemovedCallbackC         ,
    TextTagTableTagRemovedSignalInfo        ,
    afterTextTagTableTagRemoved             ,
    mkTextTagTableTagRemovedCallback        ,
    noTextTagTableTagRemovedCallback        ,
    onTextTagTableTagRemoved                ,
    textTagTableTagRemovedCallbackWrapper   ,
    textTagTableTagRemovedClosure           ,




    ) 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.Gtk.Types
import GI.Gtk.Callbacks
import qualified GI.GObject as GObject

newtype TextTagTable = TextTagTable (ForeignPtr TextTagTable)
foreign import ccall "gtk_text_tag_table_get_type"
    c_gtk_text_tag_table_get_type :: IO GType

type instance ParentTypes TextTagTable = TextTagTableParentTypes
type TextTagTableParentTypes = '[GObject.Object, Buildable]

instance GObject TextTagTable where
    gobjectIsInitiallyUnowned _ = False
    gobjectType _ = c_gtk_text_tag_table_get_type
    

class GObject o => TextTagTableK o
instance (GObject o, IsDescendantOf TextTagTable o) => TextTagTableK o

toTextTagTable :: TextTagTableK o => o -> IO TextTagTable
toTextTagTable = unsafeCastTo TextTagTable

noTextTagTable :: Maybe TextTagTable
noTextTagTable = Nothing

-- signal TextTagTable::tag-added
type TextTagTableTagAddedCallback =
    TextTag ->
    IO ()

noTextTagTableTagAddedCallback :: Maybe TextTagTableTagAddedCallback
noTextTagTableTagAddedCallback = Nothing

type TextTagTableTagAddedCallbackC =
    Ptr () ->                               -- object
    Ptr TextTag ->
    Ptr () ->                               -- user_data
    IO ()

foreign import ccall "wrapper"
    mkTextTagTableTagAddedCallback :: TextTagTableTagAddedCallbackC -> IO (FunPtr TextTagTableTagAddedCallbackC)

textTagTableTagAddedClosure :: TextTagTableTagAddedCallback -> IO Closure
textTagTableTagAddedClosure cb = newCClosure =<< mkTextTagTableTagAddedCallback wrapped
    where wrapped = textTagTableTagAddedCallbackWrapper cb

textTagTableTagAddedCallbackWrapper ::
    TextTagTableTagAddedCallback ->
    Ptr () ->
    Ptr TextTag ->
    Ptr () ->
    IO ()
textTagTableTagAddedCallbackWrapper _cb _ tag _ = do
    tag' <- (newObject TextTag) tag
    _cb  tag'

onTextTagTableTagAdded :: (GObject a, MonadIO m) => a -> TextTagTableTagAddedCallback -> m SignalHandlerId
onTextTagTableTagAdded obj cb = liftIO $ connectTextTagTableTagAdded obj cb SignalConnectBefore
afterTextTagTableTagAdded :: (GObject a, MonadIO m) => a -> TextTagTableTagAddedCallback -> m SignalHandlerId
afterTextTagTableTagAdded obj cb = connectTextTagTableTagAdded obj cb SignalConnectAfter

connectTextTagTableTagAdded :: (GObject a, MonadIO m) =>
                               a -> TextTagTableTagAddedCallback -> SignalConnectMode -> m SignalHandlerId
connectTextTagTableTagAdded obj cb after = liftIO $ do
    cb' <- mkTextTagTableTagAddedCallback (textTagTableTagAddedCallbackWrapper cb)
    connectSignalFunPtr obj "tag-added" cb' after

-- signal TextTagTable::tag-changed
type TextTagTableTagChangedCallback =
    TextTag ->
    Bool ->
    IO ()

noTextTagTableTagChangedCallback :: Maybe TextTagTableTagChangedCallback
noTextTagTableTagChangedCallback = Nothing

type TextTagTableTagChangedCallbackC =
    Ptr () ->                               -- object
    Ptr TextTag ->
    CInt ->
    Ptr () ->                               -- user_data
    IO ()

foreign import ccall "wrapper"
    mkTextTagTableTagChangedCallback :: TextTagTableTagChangedCallbackC -> IO (FunPtr TextTagTableTagChangedCallbackC)

textTagTableTagChangedClosure :: TextTagTableTagChangedCallback -> IO Closure
textTagTableTagChangedClosure cb = newCClosure =<< mkTextTagTableTagChangedCallback wrapped
    where wrapped = textTagTableTagChangedCallbackWrapper cb

textTagTableTagChangedCallbackWrapper ::
    TextTagTableTagChangedCallback ->
    Ptr () ->
    Ptr TextTag ->
    CInt ->
    Ptr () ->
    IO ()
textTagTableTagChangedCallbackWrapper _cb _ tag size_changed _ = do
    tag' <- (newObject TextTag) tag
    let size_changed' = (/= 0) size_changed
    _cb  tag' size_changed'

onTextTagTableTagChanged :: (GObject a, MonadIO m) => a -> TextTagTableTagChangedCallback -> m SignalHandlerId
onTextTagTableTagChanged obj cb = liftIO $ connectTextTagTableTagChanged obj cb SignalConnectBefore
afterTextTagTableTagChanged :: (GObject a, MonadIO m) => a -> TextTagTableTagChangedCallback -> m SignalHandlerId
afterTextTagTableTagChanged obj cb = connectTextTagTableTagChanged obj cb SignalConnectAfter

connectTextTagTableTagChanged :: (GObject a, MonadIO m) =>
                                 a -> TextTagTableTagChangedCallback -> SignalConnectMode -> m SignalHandlerId
connectTextTagTableTagChanged obj cb after = liftIO $ do
    cb' <- mkTextTagTableTagChangedCallback (textTagTableTagChangedCallbackWrapper cb)
    connectSignalFunPtr obj "tag-changed" cb' after

-- signal TextTagTable::tag-removed
type TextTagTableTagRemovedCallback =
    TextTag ->
    IO ()

noTextTagTableTagRemovedCallback :: Maybe TextTagTableTagRemovedCallback
noTextTagTableTagRemovedCallback = Nothing

type TextTagTableTagRemovedCallbackC =
    Ptr () ->                               -- object
    Ptr TextTag ->
    Ptr () ->                               -- user_data
    IO ()

foreign import ccall "wrapper"
    mkTextTagTableTagRemovedCallback :: TextTagTableTagRemovedCallbackC -> IO (FunPtr TextTagTableTagRemovedCallbackC)

textTagTableTagRemovedClosure :: TextTagTableTagRemovedCallback -> IO Closure
textTagTableTagRemovedClosure cb = newCClosure =<< mkTextTagTableTagRemovedCallback wrapped
    where wrapped = textTagTableTagRemovedCallbackWrapper cb

textTagTableTagRemovedCallbackWrapper ::
    TextTagTableTagRemovedCallback ->
    Ptr () ->
    Ptr TextTag ->
    Ptr () ->
    IO ()
textTagTableTagRemovedCallbackWrapper _cb _ tag _ = do
    tag' <- (newObject TextTag) tag
    _cb  tag'

onTextTagTableTagRemoved :: (GObject a, MonadIO m) => a -> TextTagTableTagRemovedCallback -> m SignalHandlerId
onTextTagTableTagRemoved obj cb = liftIO $ connectTextTagTableTagRemoved obj cb SignalConnectBefore
afterTextTagTableTagRemoved :: (GObject a, MonadIO m) => a -> TextTagTableTagRemovedCallback -> m SignalHandlerId
afterTextTagTableTagRemoved obj cb = connectTextTagTableTagRemoved obj cb SignalConnectAfter

connectTextTagTableTagRemoved :: (GObject a, MonadIO m) =>
                                 a -> TextTagTableTagRemovedCallback -> SignalConnectMode -> m SignalHandlerId
connectTextTagTableTagRemoved obj cb after = liftIO $ do
    cb' <- mkTextTagTableTagRemovedCallback (textTagTableTagRemovedCallbackWrapper cb)
    connectSignalFunPtr obj "tag-removed" cb' after

type instance AttributeList TextTagTable = TextTagTableAttributeList
type TextTagTableAttributeList = ('[ ] :: [(Symbol, *)])

data TextTagTableTagAddedSignalInfo
instance SignalInfo TextTagTableTagAddedSignalInfo where
    type HaskellCallbackType TextTagTableTagAddedSignalInfo = TextTagTableTagAddedCallback
    connectSignal _ = connectTextTagTableTagAdded

data TextTagTableTagChangedSignalInfo
instance SignalInfo TextTagTableTagChangedSignalInfo where
    type HaskellCallbackType TextTagTableTagChangedSignalInfo = TextTagTableTagChangedCallback
    connectSignal _ = connectTextTagTableTagChanged

data TextTagTableTagRemovedSignalInfo
instance SignalInfo TextTagTableTagRemovedSignalInfo where
    type HaskellCallbackType TextTagTableTagRemovedSignalInfo = TextTagTableTagRemovedCallback
    connectSignal _ = connectTextTagTableTagRemoved

type instance SignalList TextTagTable = TextTagTableSignalList
type TextTagTableSignalList = ('[ '("notify", GObject.ObjectNotifySignalInfo), '("tag-added", TextTagTableTagAddedSignalInfo), '("tag-changed", TextTagTableTagChangedSignalInfo), '("tag-removed", TextTagTableTagRemovedSignalInfo), '("notify::[property]", GObjectNotifySignalInfo)] :: [(Symbol, *)])

-- method TextTagTable::new
-- method type : Constructor
-- Args : []
-- Lengths : []
-- hInArgs : []
-- returnType : TInterface "Gtk" "TextTagTable"
-- throws : False
-- Skip return : False

foreign import ccall "gtk_text_tag_table_new" gtk_text_tag_table_new :: 
    IO (Ptr TextTagTable)


textTagTableNew ::
    (MonadIO m) =>
    m TextTagTable
textTagTableNew  = liftIO $ do
    result <- gtk_text_tag_table_new
    checkUnexpectedReturnNULL "gtk_text_tag_table_new" result
    result' <- (wrapObject TextTagTable) result
    return result'

-- method TextTagTable::add
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "Gtk" "TextTagTable", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "tag", argType = TInterface "Gtk" "TextTag", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "Gtk" "TextTagTable", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "tag", argType = TInterface "Gtk" "TextTag", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TBoolean
-- throws : False
-- Skip return : False

foreign import ccall "gtk_text_tag_table_add" gtk_text_tag_table_add :: 
    Ptr TextTagTable ->                     -- _obj : TInterface "Gtk" "TextTagTable"
    Ptr TextTag ->                          -- tag : TInterface "Gtk" "TextTag"
    IO CInt


textTagTableAdd ::
    (MonadIO m, TextTagTableK a, TextTagK b) =>
    a ->                                    -- _obj
    b ->                                    -- tag
    m Bool
textTagTableAdd _obj tag = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    let tag' = unsafeManagedPtrCastPtr tag
    result <- gtk_text_tag_table_add _obj' tag'
    let result' = (/= 0) result
    touchManagedPtr _obj
    touchManagedPtr tag
    return result'

-- method TextTagTable::foreach
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "Gtk" "TextTagTable", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "func", argType = TInterface "Gtk" "TextTagTableForeach", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeCall, argClosure = 2, argDestroy = -1, transfer = TransferNothing},Arg {argName = "data", argType = TBasicType TVoid, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "Gtk" "TextTagTable", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "func", argType = TInterface "Gtk" "TextTagTableForeach", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeCall, argClosure = 2, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "gtk_text_tag_table_foreach" gtk_text_tag_table_foreach :: 
    Ptr TextTagTable ->                     -- _obj : TInterface "Gtk" "TextTagTable"
    FunPtr TextTagTableForeachC ->          -- func : TInterface "Gtk" "TextTagTableForeach"
    Ptr () ->                               -- data : TBasicType TVoid
    IO ()


textTagTableForeach ::
    (MonadIO m, TextTagTableK a) =>
    a ->                                    -- _obj
    TextTagTableForeach ->                  -- func
    m ()
textTagTableForeach _obj func = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    func' <- mkTextTagTableForeach (textTagTableForeachWrapper Nothing func)
    let data_ = nullPtr
    gtk_text_tag_table_foreach _obj' func' data_
    safeFreeFunPtr $ castFunPtrToPtr func'
    touchManagedPtr _obj
    return ()

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

foreign import ccall "gtk_text_tag_table_get_size" gtk_text_tag_table_get_size :: 
    Ptr TextTagTable ->                     -- _obj : TInterface "Gtk" "TextTagTable"
    IO Int32


textTagTableGetSize ::
    (MonadIO m, TextTagTableK a) =>
    a ->                                    -- _obj
    m Int32
textTagTableGetSize _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    result <- gtk_text_tag_table_get_size _obj'
    touchManagedPtr _obj
    return result

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

foreign import ccall "gtk_text_tag_table_lookup" gtk_text_tag_table_lookup :: 
    Ptr TextTagTable ->                     -- _obj : TInterface "Gtk" "TextTagTable"
    CString ->                              -- name : TBasicType TUTF8
    IO (Ptr TextTag)


textTagTableLookup ::
    (MonadIO m, TextTagTableK a) =>
    a ->                                    -- _obj
    T.Text ->                               -- name
    m TextTag
textTagTableLookup _obj name = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    name' <- textToCString name
    result <- gtk_text_tag_table_lookup _obj' name'
    checkUnexpectedReturnNULL "gtk_text_tag_table_lookup" result
    result' <- (newObject TextTag) result
    touchManagedPtr _obj
    freeMem name'
    return result'

-- method TextTagTable::remove
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "Gtk" "TextTagTable", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "tag", argType = TInterface "Gtk" "TextTag", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "Gtk" "TextTagTable", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "tag", argType = TInterface "Gtk" "TextTag", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "gtk_text_tag_table_remove" gtk_text_tag_table_remove :: 
    Ptr TextTagTable ->                     -- _obj : TInterface "Gtk" "TextTagTable"
    Ptr TextTag ->                          -- tag : TInterface "Gtk" "TextTag"
    IO ()


textTagTableRemove ::
    (MonadIO m, TextTagTableK a, TextTagK b) =>
    a ->                                    -- _obj
    b ->                                    -- tag
    m ()
textTagTableRemove _obj tag = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    let tag' = unsafeManagedPtrCastPtr tag
    gtk_text_tag_table_remove _obj' tag'
    touchManagedPtr _obj
    touchManagedPtr tag
    return ()