{- |
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.WebKit2WebExtension.Interfaces.DOMEventTarget
    ( 

-- * Exported types
    DOMEventTarget(..)                      ,
    noDOMEventTarget                        ,
    IsDOMEventTarget                        ,
    toDOMEventTarget                        ,


 -- * Methods
-- ** addEventListener #method:addEventListener#
    DOMEventTargetAddEventListenerMethodInfo,
    dOMEventTargetAddEventListener          ,


-- ** dispatchEvent #method:dispatchEvent#
    DOMEventTargetDispatchEventMethodInfo   ,
    dOMEventTargetDispatchEvent             ,


-- ** removeEventListener #method:removeEventListener#
    DOMEventTargetRemoveEventListenerMethodInfo,
    dOMEventTargetRemoveEventListener       ,




    ) where

import Data.GI.Base.ShortPrelude
import qualified Data.GI.Base.ShortPrelude as SP
import qualified Data.GI.Base.Overloading as O
import qualified Prelude as P

import qualified Data.GI.Base.Attributes as GI.Attributes
import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr
import qualified Data.GI.Base.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map
import qualified Foreign.Ptr as FP

import qualified GI.GObject.Objects.Object as GObject.Object
import {-# SOURCE #-} qualified GI.WebKit2WebExtension.Objects.DOMEvent as WebKit2WebExtension.DOMEvent

-- interface DOMEventTarget 
newtype DOMEventTarget = DOMEventTarget (ManagedPtr DOMEventTarget)
noDOMEventTarget :: Maybe DOMEventTarget
noDOMEventTarget = Nothing

type instance O.SignalList DOMEventTarget = DOMEventTargetSignalList
type DOMEventTargetSignalList = ('[ '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)])

foreign import ccall "webkit_dom_event_target_get_type"
    c_webkit_dom_event_target_get_type :: IO GType

instance GObject DOMEventTarget where
    gobjectType _ = c_webkit_dom_event_target_get_type
    

class GObject o => IsDOMEventTarget o
#if MIN_VERSION_base(4,9,0)
instance {-# OVERLAPPABLE #-} (GObject a, O.UnknownAncestorError DOMEventTarget a) =>
    IsDOMEventTarget a
#endif
instance IsDOMEventTarget DOMEventTarget
instance GObject.Object.IsObject DOMEventTarget

toDOMEventTarget :: IsDOMEventTarget o => o -> IO DOMEventTarget
toDOMEventTarget = unsafeCastTo DOMEventTarget

instance O.HasAttributeList DOMEventTarget
type instance O.AttributeList DOMEventTarget = DOMEventTargetAttributeList
type DOMEventTargetAttributeList = ('[ ] :: [(Symbol, *)])

type family ResolveDOMEventTargetMethod (t :: Symbol) (o :: *) :: * where
    ResolveDOMEventTargetMethod "addEventListener" o = DOMEventTargetAddEventListenerMethodInfo
    ResolveDOMEventTargetMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
    ResolveDOMEventTargetMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
    ResolveDOMEventTargetMethod "dispatchEvent" o = DOMEventTargetDispatchEventMethodInfo
    ResolveDOMEventTargetMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
    ResolveDOMEventTargetMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
    ResolveDOMEventTargetMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
    ResolveDOMEventTargetMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
    ResolveDOMEventTargetMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
    ResolveDOMEventTargetMethod "ref" o = GObject.Object.ObjectRefMethodInfo
    ResolveDOMEventTargetMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
    ResolveDOMEventTargetMethod "removeEventListener" o = DOMEventTargetRemoveEventListenerMethodInfo
    ResolveDOMEventTargetMethod "replaceData" o = GObject.Object.ObjectReplaceDataMethodInfo
    ResolveDOMEventTargetMethod "replaceQdata" o = GObject.Object.ObjectReplaceQdataMethodInfo
    ResolveDOMEventTargetMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
    ResolveDOMEventTargetMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
    ResolveDOMEventTargetMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
    ResolveDOMEventTargetMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
    ResolveDOMEventTargetMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
    ResolveDOMEventTargetMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
    ResolveDOMEventTargetMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
    ResolveDOMEventTargetMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
    ResolveDOMEventTargetMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
    ResolveDOMEventTargetMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
    ResolveDOMEventTargetMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
    ResolveDOMEventTargetMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveDOMEventTargetMethod t DOMEventTarget, O.MethodInfo info DOMEventTarget p) => O.IsLabelProxy t (DOMEventTarget -> p) where
    fromLabelProxy _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)

#if MIN_VERSION_base(4,9,0)
instance (info ~ ResolveDOMEventTargetMethod t DOMEventTarget, O.MethodInfo info DOMEventTarget p) => O.IsLabel t (DOMEventTarget -> p) where
    fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#endif

-- method DOMEventTarget::add_event_listener
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "target", argType = TInterface (Name {namespace = "WebKit2WebExtension", name = "DOMEventTarget"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #WebKitDOMEventTarget", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "event_name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #gchar", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "handler", argType = TInterface (Name {namespace = "GObject", name = "Closure"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #GClosure", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "use_capture", argType = TBasicType TBoolean, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #gboolean", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "webkit_dom_event_target_add_event_listener_with_closure" webkit_dom_event_target_add_event_listener_with_closure :: 
    Ptr DOMEventTarget ->                   -- target : TInterface (Name {namespace = "WebKit2WebExtension", name = "DOMEventTarget"})
    CString ->                              -- event_name : TBasicType TUTF8
    Ptr Closure ->                          -- handler : TInterface (Name {namespace = "GObject", name = "Closure"})
    CInt ->                                 -- use_capture : TBasicType TBoolean
    IO CInt

{- |
Version of @/webkit_dom_event_target_add_event_listener()/@ using a closure
instead of a callbacks for easier binding in other languages.
-}
dOMEventTargetAddEventListener ::
    (B.CallStack.HasCallStack, MonadIO m, IsDOMEventTarget a) =>
    a
    {- ^ /@target@/: A 'GI.WebKit2WebExtension.Interfaces.DOMEventTarget.DOMEventTarget' -}
    -> T.Text
    {- ^ /@eventName@/: A @/gchar/@ -}
    -> Closure
    {- ^ /@handler@/: A 'GI.GObject.Structs.Closure.Closure' -}
    -> Bool
    {- ^ /@useCapture@/: A 'Bool' -}
    -> m Bool
    {- ^ __Returns:__ a 'Bool' -}
dOMEventTargetAddEventListener target eventName handler useCapture = liftIO $ do
    target' <- unsafeManagedPtrCastPtr target
    eventName' <- textToCString eventName
    handler' <- unsafeManagedPtrGetPtr handler
    let useCapture' = (fromIntegral . fromEnum) useCapture
    result <- webkit_dom_event_target_add_event_listener_with_closure target' eventName' handler' useCapture'
    let result' = (/= 0) result
    touchManagedPtr target
    touchManagedPtr handler
    freeMem eventName'
    return result'

data DOMEventTargetAddEventListenerMethodInfo
instance (signature ~ (T.Text -> Closure -> Bool -> m Bool), MonadIO m, IsDOMEventTarget a) => O.MethodInfo DOMEventTargetAddEventListenerMethodInfo a signature where
    overloadedMethod _ = dOMEventTargetAddEventListener

-- method DOMEventTarget::dispatch_event
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "target", argType = TInterface (Name {namespace = "WebKit2WebExtension", name = "DOMEventTarget"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #WebKitDOMEventTarget", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "event", argType = TInterface (Name {namespace = "WebKit2WebExtension", name = "DOMEvent"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #WebKitDOMEvent", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : True
-- Skip return : False

foreign import ccall "webkit_dom_event_target_dispatch_event" webkit_dom_event_target_dispatch_event :: 
    Ptr DOMEventTarget ->                   -- target : TInterface (Name {namespace = "WebKit2WebExtension", name = "DOMEventTarget"})
    Ptr WebKit2WebExtension.DOMEvent.DOMEvent -> -- event : TInterface (Name {namespace = "WebKit2WebExtension", name = "DOMEvent"})
    Ptr (Ptr GError) ->                     -- error
    IO CInt

{- |
/No description available in the introspection data./
-}
dOMEventTargetDispatchEvent ::
    (B.CallStack.HasCallStack, MonadIO m, IsDOMEventTarget a, WebKit2WebExtension.DOMEvent.IsDOMEvent b) =>
    a
    {- ^ /@target@/: A 'GI.WebKit2WebExtension.Interfaces.DOMEventTarget.DOMEventTarget' -}
    -> b
    {- ^ /@event@/: A 'GI.WebKit2WebExtension.Objects.DOMEvent.DOMEvent' -}
    -> m ()
    {- ^ /(Can throw 'Data.GI.Base.GError.GError')/ -}
dOMEventTargetDispatchEvent target event = liftIO $ do
    target' <- unsafeManagedPtrCastPtr target
    event' <- unsafeManagedPtrCastPtr event
    onException (do
        _ <- propagateGError $ webkit_dom_event_target_dispatch_event target' event'
        touchManagedPtr target
        touchManagedPtr event
        return ()
     ) (do
        return ()
     )

data DOMEventTargetDispatchEventMethodInfo
instance (signature ~ (b -> m ()), MonadIO m, IsDOMEventTarget a, WebKit2WebExtension.DOMEvent.IsDOMEvent b) => O.MethodInfo DOMEventTargetDispatchEventMethodInfo a signature where
    overloadedMethod _ = dOMEventTargetDispatchEvent

-- method DOMEventTarget::remove_event_listener
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "target", argType = TInterface (Name {namespace = "WebKit2WebExtension", name = "DOMEventTarget"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #WebKitDOMEventTarget", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "event_name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #gchar", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "handler", argType = TInterface (Name {namespace = "GObject", name = "Closure"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #GClosure", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "use_capture", argType = TBasicType TBoolean, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #gboolean", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "webkit_dom_event_target_remove_event_listener_with_closure" webkit_dom_event_target_remove_event_listener_with_closure :: 
    Ptr DOMEventTarget ->                   -- target : TInterface (Name {namespace = "WebKit2WebExtension", name = "DOMEventTarget"})
    CString ->                              -- event_name : TBasicType TUTF8
    Ptr Closure ->                          -- handler : TInterface (Name {namespace = "GObject", name = "Closure"})
    CInt ->                                 -- use_capture : TBasicType TBoolean
    IO CInt

{- |
Version of @/webkit_dom_event_target_remove_event_listener()/@ using a closure
instead of a callbacks for easier binding in other languages.
-}
dOMEventTargetRemoveEventListener ::
    (B.CallStack.HasCallStack, MonadIO m, IsDOMEventTarget a) =>
    a
    {- ^ /@target@/: A 'GI.WebKit2WebExtension.Interfaces.DOMEventTarget.DOMEventTarget' -}
    -> T.Text
    {- ^ /@eventName@/: A @/gchar/@ -}
    -> Closure
    {- ^ /@handler@/: A 'GI.GObject.Structs.Closure.Closure' -}
    -> Bool
    {- ^ /@useCapture@/: A 'Bool' -}
    -> m Bool
    {- ^ __Returns:__ a 'Bool' -}
dOMEventTargetRemoveEventListener target eventName handler useCapture = liftIO $ do
    target' <- unsafeManagedPtrCastPtr target
    eventName' <- textToCString eventName
    handler' <- unsafeManagedPtrGetPtr handler
    let useCapture' = (fromIntegral . fromEnum) useCapture
    result <- webkit_dom_event_target_remove_event_listener_with_closure target' eventName' handler' useCapture'
    let result' = (/= 0) result
    touchManagedPtr target
    touchManagedPtr handler
    freeMem eventName'
    return result'

data DOMEventTargetRemoveEventListenerMethodInfo
instance (signature ~ (T.Text -> Closure -> Bool -> m Bool), MonadIO m, IsDOMEventTarget a) => O.MethodInfo DOMEventTargetRemoveEventListenerMethodInfo a signature where
    overloadedMethod _ = dOMEventTargetRemoveEventListener