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

See 'GI.Atk.Objects.Socket.Socket'
-}

#define ENABLE_OVERLOADING \
       (!defined(__HADDOCK_VERSION__))

module GI.Atk.Objects.Plug
    (

-- * Exported types
    Plug(..)                                ,
    IsPlug                                  ,
    toPlug                                  ,
    noPlug                                  ,


 -- * Methods
-- ** getId #method:getId#

#if ENABLE_OVERLOADING
    PlugGetIdMethodInfo                     ,
#endif
    plugGetId                               ,


-- ** new #method:new#

    plugNew                                 ,


-- ** setChild #method:setChild#

#if ENABLE_OVERLOADING
    PlugSetChildMethodInfo                  ,
#endif
    plugSetChild                            ,




    ) 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.GValue as B.GValue
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 {-# SOURCE #-} qualified GI.Atk.Interfaces.Component as Atk.Component
import {-# SOURCE #-} qualified GI.Atk.Objects.Object as Atk.Object
import qualified GI.GObject.Objects.Object as GObject.Object

-- | Memory-managed wrapper type.
newtype Plug = Plug (ManagedPtr Plug)
foreign import ccall "atk_plug_get_type"
    c_atk_plug_get_type :: IO GType

instance GObject Plug where
    gobjectType _ = c_atk_plug_get_type


-- | Type class for types which can be safely cast to `Plug`, for instance with `toPlug`.
class GObject o => IsPlug o
#if MIN_VERSION_base(4,9,0)
instance {-# OVERLAPPABLE #-} (GObject a, O.UnknownAncestorError Plug a) =>
    IsPlug a
#endif
instance IsPlug Plug
instance Atk.Object.IsObject Plug
instance GObject.Object.IsObject Plug
instance Atk.Component.IsComponent Plug

-- | Cast to `Plug`, for types for which this is known to be safe. For general casts, use `Data.GI.Base.ManagedPtr.castTo`.
toPlug :: (MonadIO m, IsPlug o) => o -> m Plug
toPlug = liftIO . unsafeCastTo Plug

-- | A convenience alias for `Nothing` :: `Maybe` `Plug`.
noPlug :: Maybe Plug
noPlug = Nothing

#if ENABLE_OVERLOADING
type family ResolvePlugMethod (t :: Symbol) (o :: *) :: * where
    ResolvePlugMethod "addRelationship" o = Atk.Object.ObjectAddRelationshipMethodInfo
    ResolvePlugMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
    ResolvePlugMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
    ResolvePlugMethod "contains" o = Atk.Component.ComponentContainsMethodInfo
    ResolvePlugMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
    ResolvePlugMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
    ResolvePlugMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
    ResolvePlugMethod "grabFocus" o = Atk.Component.ComponentGrabFocusMethodInfo
    ResolvePlugMethod "initialize" o = Atk.Object.ObjectInitializeMethodInfo
    ResolvePlugMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
    ResolvePlugMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
    ResolvePlugMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
    ResolvePlugMethod "notifyStateChange" o = Atk.Object.ObjectNotifyStateChangeMethodInfo
    ResolvePlugMethod "peekParent" o = Atk.Object.ObjectPeekParentMethodInfo
    ResolvePlugMethod "ref" o = GObject.Object.ObjectRefMethodInfo
    ResolvePlugMethod "refAccessibleAtPoint" o = Atk.Component.ComponentRefAccessibleAtPointMethodInfo
    ResolvePlugMethod "refAccessibleChild" o = Atk.Object.ObjectRefAccessibleChildMethodInfo
    ResolvePlugMethod "refRelationSet" o = Atk.Object.ObjectRefRelationSetMethodInfo
    ResolvePlugMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
    ResolvePlugMethod "refStateSet" o = Atk.Object.ObjectRefStateSetMethodInfo
    ResolvePlugMethod "removeFocusHandler" o = Atk.Component.ComponentRemoveFocusHandlerMethodInfo
    ResolvePlugMethod "removePropertyChangeHandler" o = Atk.Object.ObjectRemovePropertyChangeHandlerMethodInfo
    ResolvePlugMethod "removeRelationship" o = Atk.Object.ObjectRemoveRelationshipMethodInfo
    ResolvePlugMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
    ResolvePlugMethod "scrollTo" o = Atk.Component.ComponentScrollToMethodInfo
    ResolvePlugMethod "scrollToPoint" o = Atk.Component.ComponentScrollToPointMethodInfo
    ResolvePlugMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
    ResolvePlugMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
    ResolvePlugMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
    ResolvePlugMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
    ResolvePlugMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
    ResolvePlugMethod "getAccessibleId" o = Atk.Object.ObjectGetAccessibleIdMethodInfo
    ResolvePlugMethod "getAlpha" o = Atk.Component.ComponentGetAlphaMethodInfo
    ResolvePlugMethod "getAttributes" o = Atk.Object.ObjectGetAttributesMethodInfo
    ResolvePlugMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
    ResolvePlugMethod "getDescription" o = Atk.Object.ObjectGetDescriptionMethodInfo
    ResolvePlugMethod "getExtents" o = Atk.Component.ComponentGetExtentsMethodInfo
    ResolvePlugMethod "getId" o = PlugGetIdMethodInfo
    ResolvePlugMethod "getIndexInParent" o = Atk.Object.ObjectGetIndexInParentMethodInfo
    ResolvePlugMethod "getLayer" o = Atk.Object.ObjectGetLayerMethodInfo
    ResolvePlugMethod "getMdiZorder" o = Atk.Object.ObjectGetMdiZorderMethodInfo
    ResolvePlugMethod "getNAccessibleChildren" o = Atk.Object.ObjectGetNAccessibleChildrenMethodInfo
    ResolvePlugMethod "getName" o = Atk.Object.ObjectGetNameMethodInfo
    ResolvePlugMethod "getObjectLocale" o = Atk.Object.ObjectGetObjectLocaleMethodInfo
    ResolvePlugMethod "getParent" o = Atk.Object.ObjectGetParentMethodInfo
    ResolvePlugMethod "getPosition" o = Atk.Component.ComponentGetPositionMethodInfo
    ResolvePlugMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
    ResolvePlugMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
    ResolvePlugMethod "getRole" o = Atk.Object.ObjectGetRoleMethodInfo
    ResolvePlugMethod "getSize" o = Atk.Component.ComponentGetSizeMethodInfo
    ResolvePlugMethod "setAccessibleId" o = Atk.Object.ObjectSetAccessibleIdMethodInfo
    ResolvePlugMethod "setChild" o = PlugSetChildMethodInfo
    ResolvePlugMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
    ResolvePlugMethod "setDescription" o = Atk.Object.ObjectSetDescriptionMethodInfo
    ResolvePlugMethod "setExtents" o = Atk.Component.ComponentSetExtentsMethodInfo
    ResolvePlugMethod "setName" o = Atk.Object.ObjectSetNameMethodInfo
    ResolvePlugMethod "setParent" o = Atk.Object.ObjectSetParentMethodInfo
    ResolvePlugMethod "setPosition" o = Atk.Component.ComponentSetPositionMethodInfo
    ResolvePlugMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
    ResolvePlugMethod "setRole" o = Atk.Object.ObjectSetRoleMethodInfo
    ResolvePlugMethod "setSize" o = Atk.Component.ComponentSetSizeMethodInfo
    ResolvePlugMethod l o = O.MethodResolutionFailed l o

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

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

#endif

#if ENABLE_OVERLOADING
instance O.HasAttributeList Plug
type instance O.AttributeList Plug = PlugAttributeList
type PlugAttributeList = ('[ '("accessibleComponentLayer", Atk.Object.ObjectAccessibleComponentLayerPropertyInfo), '("accessibleComponentMdiZorder", Atk.Object.ObjectAccessibleComponentMdiZorderPropertyInfo), '("accessibleDescription", Atk.Object.ObjectAccessibleDescriptionPropertyInfo), '("accessibleHypertextNlinks", Atk.Object.ObjectAccessibleHypertextNlinksPropertyInfo), '("accessibleName", Atk.Object.ObjectAccessibleNamePropertyInfo), '("accessibleParent", Atk.Object.ObjectAccessibleParentPropertyInfo), '("accessibleRole", Atk.Object.ObjectAccessibleRolePropertyInfo), '("accessibleTableCaption", Atk.Object.ObjectAccessibleTableCaptionPropertyInfo), '("accessibleTableCaptionObject", Atk.Object.ObjectAccessibleTableCaptionObjectPropertyInfo), '("accessibleTableColumnDescription", Atk.Object.ObjectAccessibleTableColumnDescriptionPropertyInfo), '("accessibleTableColumnHeader", Atk.Object.ObjectAccessibleTableColumnHeaderPropertyInfo), '("accessibleTableRowDescription", Atk.Object.ObjectAccessibleTableRowDescriptionPropertyInfo), '("accessibleTableRowHeader", Atk.Object.ObjectAccessibleTableRowHeaderPropertyInfo), '("accessibleTableSummary", Atk.Object.ObjectAccessibleTableSummaryPropertyInfo), '("accessibleValue", Atk.Object.ObjectAccessibleValuePropertyInfo)] :: [(Symbol, *)])
#endif

#if ENABLE_OVERLOADING
#endif

#if ENABLE_OVERLOADING
type instance O.SignalList Plug = PlugSignalList
type PlugSignalList = ('[ '("activeDescendantChanged", Atk.Object.ObjectActiveDescendantChangedSignalInfo), '("boundsChanged", Atk.Component.ComponentBoundsChangedSignalInfo), '("childrenChanged", Atk.Object.ObjectChildrenChangedSignalInfo), '("focusEvent", Atk.Object.ObjectFocusEventSignalInfo), '("notify", GObject.Object.ObjectNotifySignalInfo), '("propertyChange", Atk.Object.ObjectPropertyChangeSignalInfo), '("stateChange", Atk.Object.ObjectStateChangeSignalInfo), '("visibleDataChanged", Atk.Object.ObjectVisibleDataChangedSignalInfo)] :: [(Symbol, *)])

#endif

-- method Plug::new
-- method type : Constructor
-- Args : []
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Atk", name = "Plug"}))
-- throws : False
-- Skip return : False

foreign import ccall "atk_plug_new" atk_plug_new ::
    IO (Ptr Plug)

{- |
Creates a new 'GI.Atk.Objects.Plug.Plug' instance.

/Since: 1.30/
-}
plugNew ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    m Plug
    {- ^ __Returns:__ the newly created 'GI.Atk.Objects.Plug.Plug' -}
plugNew  = liftIO $ do
    result <- atk_plug_new
    checkUnexpectedReturnNULL "plugNew" result
    result' <- (wrapObject Plug) result
    return result'

#if ENABLE_OVERLOADING
#endif

-- method Plug::get_id
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "plug", argType = TInterface (Name {namespace = "Atk", name = "Plug"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "an #AtkPlug", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUTF8)
-- throws : False
-- Skip return : False

foreign import ccall "atk_plug_get_id" atk_plug_get_id ::
    Ptr Plug ->                             -- plug : TInterface (Name {namespace = "Atk", name = "Plug"})
    IO CString

{- |
Gets the unique ID of an 'GI.Atk.Objects.Plug.Plug' object, which can be used to
embed inside of an 'GI.Atk.Objects.Socket.Socket' using 'GI.Atk.Objects.Socket.socketEmbed'.

Internally, this calls a class function that should be registered
by the IPC layer (usually at-spi2-atk). The implementor of an
'GI.Atk.Objects.Plug.Plug' object should call this function (after atk-bridge is
loaded) and pass the value to the process implementing the
'GI.Atk.Objects.Socket.Socket', so it could embed the plug.

/Since: 1.30/
-}
plugGetId ::
    (B.CallStack.HasCallStack, MonadIO m, IsPlug a) =>
    a
    {- ^ /@plug@/: an 'GI.Atk.Objects.Plug.Plug' -}
    -> m T.Text
    {- ^ __Returns:__ the unique ID for the plug -}
plugGetId plug = liftIO $ do
    plug' <- unsafeManagedPtrCastPtr plug
    result <- atk_plug_get_id plug'
    checkUnexpectedReturnNULL "plugGetId" result
    result' <- cstringToText result
    freeMem result
    touchManagedPtr plug
    return result'

#if ENABLE_OVERLOADING
data PlugGetIdMethodInfo
instance (signature ~ (m T.Text), MonadIO m, IsPlug a) => O.MethodInfo PlugGetIdMethodInfo a signature where
    overloadedMethod _ = plugGetId

#endif

-- method Plug::set_child
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "plug", argType = TInterface (Name {namespace = "Atk", name = "Plug"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "an #AtkPlug to be set as accessible parent of @child.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "child", argType = TInterface (Name {namespace = "Atk", name = "Object"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "an #AtkObject to be set as accessible child of @plug.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "atk_plug_set_child" atk_plug_set_child ::
    Ptr Plug ->                             -- plug : TInterface (Name {namespace = "Atk", name = "Plug"})
    Ptr Atk.Object.Object ->                -- child : TInterface (Name {namespace = "Atk", name = "Object"})
    IO ()

{- |
Sets /@child@/ as accessible child of /@plug@/ and /@plug@/ as accessible parent of
/@child@/. /@child@/ can be NULL.

In some cases, one can not use the AtkPlug type directly as accessible
object for the toplevel widget of the application. For instance in the gtk
case, GtkPlugAccessible can not inherit both from GtkWindowAccessible and
from AtkPlug. In such a case, one can create, in addition to the standard
accessible object for the toplevel widget, an AtkPlug object, and make the
former the child of the latter by calling 'GI.Atk.Objects.Plug.plugSetChild'.

/Since: 2.35.0/
-}
plugSetChild ::
    (B.CallStack.HasCallStack, MonadIO m, IsPlug a, Atk.Object.IsObject b) =>
    a
    {- ^ /@plug@/: an 'GI.Atk.Objects.Plug.Plug' to be set as accessible parent of /@child@/. -}
    -> b
    {- ^ /@child@/: an 'GI.Atk.Objects.Object.Object' to be set as accessible child of /@plug@/. -}
    -> m ()
plugSetChild plug child = liftIO $ do
    plug' <- unsafeManagedPtrCastPtr plug
    child' <- unsafeManagedPtrCastPtr child
    atk_plug_set_child plug' child'
    touchManagedPtr plug
    touchManagedPtr child
    return ()

#if ENABLE_OVERLOADING
data PlugSetChildMethodInfo
instance (signature ~ (b -> m ()), MonadIO m, IsPlug a, Atk.Object.IsObject b) => O.MethodInfo PlugSetChildMethodInfo a signature where
    overloadedMethod _ = plugSetChild

#endif