{- |
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.CssProvider
    ( 

-- * Exported types
    CssProvider(..)                         ,
    CssProviderK                            ,
    toCssProvider                           ,
    noCssProvider                           ,


 -- * Methods
-- ** cssProviderGetDefault
    cssProviderGetDefault                   ,


-- ** cssProviderGetNamed
    cssProviderGetNamed                     ,


-- ** cssProviderLoadFromData
    cssProviderLoadFromData                 ,


-- ** cssProviderLoadFromFile
    cssProviderLoadFromFile                 ,


-- ** cssProviderLoadFromPath
    cssProviderLoadFromPath                 ,


-- ** cssProviderLoadFromResource
    cssProviderLoadFromResource             ,


-- ** cssProviderNew
    cssProviderNew                          ,


-- ** cssProviderToString
    cssProviderToString                     ,




 -- * Signals
-- ** ParsingError
    CssProviderParsingErrorCallback         ,
    CssProviderParsingErrorCallbackC        ,
    CssProviderParsingErrorSignalInfo       ,
    afterCssProviderParsingError            ,
    cssProviderParsingErrorCallbackWrapper  ,
    cssProviderParsingErrorClosure          ,
    mkCssProviderParsingErrorCallback       ,
    noCssProviderParsingErrorCallback       ,
    onCssProviderParsingError               ,




    ) 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
import qualified GI.Gio as Gio

newtype CssProvider = CssProvider (ForeignPtr CssProvider)
foreign import ccall "gtk_css_provider_get_type"
    c_gtk_css_provider_get_type :: IO GType

type instance ParentTypes CssProvider = CssProviderParentTypes
type CssProviderParentTypes = '[GObject.Object, StyleProvider]

instance GObject CssProvider where
    gobjectIsInitiallyUnowned _ = False
    gobjectType _ = c_gtk_css_provider_get_type
    

class GObject o => CssProviderK o
instance (GObject o, IsDescendantOf CssProvider o) => CssProviderK o

toCssProvider :: CssProviderK o => o -> IO CssProvider
toCssProvider = unsafeCastTo CssProvider

noCssProvider :: Maybe CssProvider
noCssProvider = Nothing

-- signal CssProvider::parsing-error
type CssProviderParsingErrorCallback =
    CssSection ->
    GError ->
    IO ()

noCssProviderParsingErrorCallback :: Maybe CssProviderParsingErrorCallback
noCssProviderParsingErrorCallback = Nothing

type CssProviderParsingErrorCallbackC =
    Ptr () ->                               -- object
    Ptr CssSection ->
    Ptr GError ->
    Ptr () ->                               -- user_data
    IO ()

foreign import ccall "wrapper"
    mkCssProviderParsingErrorCallback :: CssProviderParsingErrorCallbackC -> IO (FunPtr CssProviderParsingErrorCallbackC)

cssProviderParsingErrorClosure :: CssProviderParsingErrorCallback -> IO Closure
cssProviderParsingErrorClosure cb = newCClosure =<< mkCssProviderParsingErrorCallback wrapped
    where wrapped = cssProviderParsingErrorCallbackWrapper cb

cssProviderParsingErrorCallbackWrapper ::
    CssProviderParsingErrorCallback ->
    Ptr () ->
    Ptr CssSection ->
    Ptr GError ->
    Ptr () ->
    IO ()
cssProviderParsingErrorCallbackWrapper _cb _ section error_ _ = do
    section' <- (newBoxed CssSection) section
    error_' <- (newBoxed GError) error_
    _cb  section' error_'

onCssProviderParsingError :: (GObject a, MonadIO m) => a -> CssProviderParsingErrorCallback -> m SignalHandlerId
onCssProviderParsingError obj cb = liftIO $ connectCssProviderParsingError obj cb SignalConnectBefore
afterCssProviderParsingError :: (GObject a, MonadIO m) => a -> CssProviderParsingErrorCallback -> m SignalHandlerId
afterCssProviderParsingError obj cb = connectCssProviderParsingError obj cb SignalConnectAfter

connectCssProviderParsingError :: (GObject a, MonadIO m) =>
                                  a -> CssProviderParsingErrorCallback -> SignalConnectMode -> m SignalHandlerId
connectCssProviderParsingError obj cb after = liftIO $ do
    cb' <- mkCssProviderParsingErrorCallback (cssProviderParsingErrorCallbackWrapper cb)
    connectSignalFunPtr obj "parsing-error" cb' after

type instance AttributeList CssProvider = CssProviderAttributeList
type CssProviderAttributeList = ('[ ] :: [(Symbol, *)])

data CssProviderParsingErrorSignalInfo
instance SignalInfo CssProviderParsingErrorSignalInfo where
    type HaskellCallbackType CssProviderParsingErrorSignalInfo = CssProviderParsingErrorCallback
    connectSignal _ = connectCssProviderParsingError

type instance SignalList CssProvider = CssProviderSignalList
type CssProviderSignalList = ('[ '("notify", GObject.ObjectNotifySignalInfo), '("parsing-error", CssProviderParsingErrorSignalInfo), '("notify::[property]", GObjectNotifySignalInfo)] :: [(Symbol, *)])

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

foreign import ccall "gtk_css_provider_new" gtk_css_provider_new :: 
    IO (Ptr CssProvider)


cssProviderNew ::
    (MonadIO m) =>
    m CssProvider
cssProviderNew  = liftIO $ do
    result <- gtk_css_provider_new
    checkUnexpectedReturnNULL "gtk_css_provider_new" result
    result' <- (wrapObject CssProvider) result
    return result'

-- method CssProvider::load_from_data
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "Gtk" "CssProvider", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "data", argType = TCArray False (-1) 2 (TBasicType TUInt8), direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "length", argType = TBasicType TInt64, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : [Arg {argName = "length", argType = TBasicType TInt64, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "Gtk" "CssProvider", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "data", argType = TCArray False (-1) 2 (TBasicType TUInt8), direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TBoolean
-- throws : True
-- Skip return : False

foreign import ccall "gtk_css_provider_load_from_data" gtk_css_provider_load_from_data :: 
    Ptr CssProvider ->                      -- _obj : TInterface "Gtk" "CssProvider"
    Ptr Word8 ->                            -- data : TCArray False (-1) 2 (TBasicType TUInt8)
    Int64 ->                                -- length : TBasicType TInt64
    Ptr (Ptr GError) ->                     -- error
    IO CInt


cssProviderLoadFromData ::
    (MonadIO m, CssProviderK a) =>
    a ->                                    -- _obj
    ByteString ->                           -- data
    m ()
cssProviderLoadFromData _obj data_ = liftIO $ do
    let length_ = fromIntegral $ B.length data_
    let _obj' = unsafeManagedPtrCastPtr _obj
    data_' <- packByteString data_
    onException (do
        _ <- propagateGError $ gtk_css_provider_load_from_data _obj' data_' length_
        touchManagedPtr _obj
        freeMem data_'
        return ()
     ) (do
        freeMem data_'
     )

-- method CssProvider::load_from_file
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "Gtk" "CssProvider", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "file", argType = TInterface "Gio" "File", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "Gtk" "CssProvider", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "file", argType = TInterface "Gio" "File", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TBoolean
-- throws : True
-- Skip return : False

foreign import ccall "gtk_css_provider_load_from_file" gtk_css_provider_load_from_file :: 
    Ptr CssProvider ->                      -- _obj : TInterface "Gtk" "CssProvider"
    Ptr Gio.File ->                         -- file : TInterface "Gio" "File"
    Ptr (Ptr GError) ->                     -- error
    IO CInt


cssProviderLoadFromFile ::
    (MonadIO m, CssProviderK a, Gio.FileK b) =>
    a ->                                    -- _obj
    b ->                                    -- file
    m ()
cssProviderLoadFromFile _obj file = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    let file' = unsafeManagedPtrCastPtr file
    onException (do
        _ <- propagateGError $ gtk_css_provider_load_from_file _obj' file'
        touchManagedPtr _obj
        touchManagedPtr file
        return ()
     ) (do
        return ()
     )

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

foreign import ccall "gtk_css_provider_load_from_path" gtk_css_provider_load_from_path :: 
    Ptr CssProvider ->                      -- _obj : TInterface "Gtk" "CssProvider"
    CString ->                              -- path : TBasicType TUTF8
    Ptr (Ptr GError) ->                     -- error
    IO CInt


cssProviderLoadFromPath ::
    (MonadIO m, CssProviderK a) =>
    a ->                                    -- _obj
    T.Text ->                               -- path
    m ()
cssProviderLoadFromPath _obj path = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    path' <- textToCString path
    onException (do
        _ <- propagateGError $ gtk_css_provider_load_from_path _obj' path'
        touchManagedPtr _obj
        freeMem path'
        return ()
     ) (do
        freeMem path'
     )

-- method CssProvider::load_from_resource
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "Gtk" "CssProvider", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "resource_path", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "Gtk" "CssProvider", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "resource_path", 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 "gtk_css_provider_load_from_resource" gtk_css_provider_load_from_resource :: 
    Ptr CssProvider ->                      -- _obj : TInterface "Gtk" "CssProvider"
    CString ->                              -- resource_path : TBasicType TUTF8
    IO ()


cssProviderLoadFromResource ::
    (MonadIO m, CssProviderK a) =>
    a ->                                    -- _obj
    T.Text ->                               -- resource_path
    m ()
cssProviderLoadFromResource _obj resource_path = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    resource_path' <- textToCString resource_path
    gtk_css_provider_load_from_resource _obj' resource_path'
    touchManagedPtr _obj
    freeMem resource_path'
    return ()

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

foreign import ccall "gtk_css_provider_to_string" gtk_css_provider_to_string :: 
    Ptr CssProvider ->                      -- _obj : TInterface "Gtk" "CssProvider"
    IO CString


cssProviderToString ::
    (MonadIO m, CssProviderK a) =>
    a ->                                    -- _obj
    m T.Text
cssProviderToString _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    result <- gtk_css_provider_to_string _obj'
    checkUnexpectedReturnNULL "gtk_css_provider_to_string" result
    result' <- cstringToText result
    freeMem result
    touchManagedPtr _obj
    return result'

-- method CssProvider::get_default
-- method type : MemberFunction
-- Args : []
-- Lengths : []
-- hInArgs : []
-- returnType : TInterface "Gtk" "CssProvider"
-- throws : False
-- Skip return : False

foreign import ccall "gtk_css_provider_get_default" gtk_css_provider_get_default :: 
    IO (Ptr CssProvider)


cssProviderGetDefault ::
    (MonadIO m) =>
    m CssProvider
cssProviderGetDefault  = liftIO $ do
    result <- gtk_css_provider_get_default
    checkUnexpectedReturnNULL "gtk_css_provider_get_default" result
    result' <- (newObject CssProvider) result
    return result'

-- method CssProvider::get_named
-- method type : MemberFunction
-- Args : [Arg {argName = "name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "variant", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = True, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "variant", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = True, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TInterface "Gtk" "CssProvider"
-- throws : False
-- Skip return : False

foreign import ccall "gtk_css_provider_get_named" gtk_css_provider_get_named :: 
    CString ->                              -- name : TBasicType TUTF8
    CString ->                              -- variant : TBasicType TUTF8
    IO (Ptr CssProvider)


cssProviderGetNamed ::
    (MonadIO m) =>
    T.Text ->                               -- name
    Maybe (T.Text) ->                       -- variant
    m CssProvider
cssProviderGetNamed name variant = liftIO $ do
    name' <- textToCString name
    maybeVariant <- case variant of
        Nothing -> return nullPtr
        Just jVariant -> do
            jVariant' <- textToCString jVariant
            return jVariant'
    result <- gtk_css_provider_get_named name' maybeVariant
    checkUnexpectedReturnNULL "gtk_css_provider_get_named" result
    result' <- (newObject CssProvider) result
    freeMem name'
    freeMem maybeVariant
    return result'