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

    The GActionMap interface is implemented by 'GI.Gio.Interfaces.ActionGroup.ActionGroup'
    implementations that operate by containing a number of
    named 'GI.Gio.Interfaces.Action.Action' instances, such as 'GI.Gio.Objects.SimpleActionGroup.SimpleActionGroup'.

    One useful application of this interface is to map the
    names of actions from various action groups to unique,
    prefixed names (e.g. by prepending \"app.\" or \"win.\").
    This is the motivation for the \'Map\' part of the interface
    name.

    /Since: 2.32/
    -}

    #define ENABLE_OVERLOADING \
           (!defined(__HADDOCK_VERSION__))

    module GI.Gio.Interfaces.ActionMap
        (

    -- * Exported types
        ActionMap(..)                           ,
        noActionMap                             ,
        IsActionMap                             ,
        toActionMap                             ,

     -- * Methods
    -- ** addAction #method:addAction#

    #if ENABLE_OVERLOADING
        ActionMapAddActionMethodInfo            ,
    #endif
        actionMapAddAction                      ,

    -- ** addActionEntries #method:addActionEntries#

    #if ENABLE_OVERLOADING
        ActionMapAddActionEntriesMethodInfo     ,
    #endif
        actionMapAddActionEntries               ,

    -- ** lookupAction #method:lookupAction#

    #if ENABLE_OVERLOADING
        ActionMapLookupActionMethodInfo         ,
    #endif
        actionMapLookupAction                   ,

    -- ** removeAction #method:removeAction#

    #if ENABLE_OVERLOADING
        ActionMapRemoveActionMethodInfo         ,
    #endif
        actionMapRemoveAction                   ,

        ) 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 qualified GI.GObject.Objects.Object as GObject.Object
    import {-# SOURCE #-} qualified GI.Gio.Interfaces.Action as Gio.Action
    import {-# SOURCE #-} qualified GI.Gio.Structs.ActionEntry as Gio.ActionEntry

    -- interface ActionMap
    -- | Memory-managed wrapper type.
    newtype ActionMap = ActionMap (ManagedPtr ActionMap)
    -- | A convenience alias for `Nothing` :: `Maybe` `ActionMap`.
    noActionMap :: Maybe ActionMap
    noActionMap = Nothing

    #if ENABLE_OVERLOADING
    type instance O.SignalList ActionMap = ActionMapSignalList
    type ActionMapSignalList = ('[ '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)])

    #endif

    foreign import ccall "g_action_map_get_type"
        c_g_action_map_get_type :: IO GType

    instance GObject ActionMap where
        gobjectType _ = c_g_action_map_get_type

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

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

    #if ENABLE_OVERLOADING
    instance O.HasAttributeList ActionMap
    type instance O.AttributeList ActionMap = ActionMapAttributeList
    type ActionMapAttributeList = ('[ ] :: [(Symbol, *)])
    #endif

    #if ENABLE_OVERLOADING
    #endif

    #if ENABLE_OVERLOADING
    type family ResolveActionMapMethod (t :: Symbol) (o :: *) :: * where
        ResolveActionMapMethod "addAction" o = ActionMapAddActionMethodInfo
        ResolveActionMapMethod "addActionEntries" o = ActionMapAddActionEntriesMethodInfo
        ResolveActionMapMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
        ResolveActionMapMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
        ResolveActionMapMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
        ResolveActionMapMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
        ResolveActionMapMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
        ResolveActionMapMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
        ResolveActionMapMethod "lookupAction" o = ActionMapLookupActionMethodInfo
        ResolveActionMapMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
        ResolveActionMapMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
        ResolveActionMapMethod "ref" o = GObject.Object.ObjectRefMethodInfo
        ResolveActionMapMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
        ResolveActionMapMethod "removeAction" o = ActionMapRemoveActionMethodInfo
        ResolveActionMapMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
        ResolveActionMapMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
        ResolveActionMapMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
        ResolveActionMapMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
        ResolveActionMapMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
        ResolveActionMapMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
        ResolveActionMapMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
        ResolveActionMapMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
        ResolveActionMapMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
        ResolveActionMapMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
        ResolveActionMapMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
        ResolveActionMapMethod l o = O.MethodResolutionFailed l o

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

    #if MIN_VERSION_base(4,9,0)
    instance (info ~ ResolveActionMapMethod t ActionMap, O.MethodInfo info ActionMap p) => O.IsLabel t (ActionMap -> 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

    -- method ActionMap::add_action
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "action_map", argType = TInterface (Name {namespace = "Gio", name = "ActionMap"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GActionMap", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "action", argType = TInterface (Name {namespace = "Gio", name = "Action"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GAction", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Nothing
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_action_map_add_action" g_action_map_add_action ::
        Ptr ActionMap ->                        -- action_map : TInterface (Name {namespace = "Gio", name = "ActionMap"})
        Ptr Gio.Action.Action ->                -- action : TInterface (Name {namespace = "Gio", name = "Action"})
        IO ()

    {- |
    Adds an action to the /@actionMap@/.

    If the action map already contains an action with the same name
    as /@action@/ then the old action is dropped from the action map.

    The action map takes its own reference on /@action@/.

    /Since: 2.32/
    -}
    actionMapAddAction ::
        (B.CallStack.HasCallStack, MonadIO m, IsActionMap a, Gio.Action.IsAction b) =>
        a
        {- ^ /@actionMap@/: a 'GI.Gio.Interfaces.ActionMap.ActionMap' -}
        -> b
        {- ^ /@action@/: a 'GI.Gio.Interfaces.Action.Action' -}
        -> m ()
    actionMapAddAction actionMap action = liftIO $ do
        actionMap' <- unsafeManagedPtrCastPtr actionMap
        action' <- unsafeManagedPtrCastPtr action
        g_action_map_add_action actionMap' action'
        touchManagedPtr actionMap
        touchManagedPtr action
        return ()

    #if ENABLE_OVERLOADING
    data ActionMapAddActionMethodInfo
    instance (signature ~ (b -> m ()), MonadIO m, IsActionMap a, Gio.Action.IsAction b) => O.MethodInfo ActionMapAddActionMethodInfo a signature where
        overloadedMethod _ = actionMapAddAction

    #endif

    -- method ActionMap::add_action_entries
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "action_map", argType = TInterface (Name {namespace = "Gio", name = "ActionMap"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GActionMap", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "entries", argType = TCArray False (-1) 2 (TInterface (Name {namespace = "Gio", name = "ActionEntry"})), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a pointer to\n          the first item in an array of #GActionEntry structs", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "n_entries", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the length of @entries, or -1 if @entries is %NULL-terminated", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "user_data", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "the user data for signal connections", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : [Arg {argCName = "n_entries", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the length of @entries, or -1 if @entries is %NULL-terminated", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- returnType : Nothing
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_action_map_add_action_entries" g_action_map_add_action_entries ::
        Ptr ActionMap ->                        -- action_map : TInterface (Name {namespace = "Gio", name = "ActionMap"})
        Ptr Gio.ActionEntry.ActionEntry ->      -- entries : TCArray False (-1) 2 (TInterface (Name {namespace = "Gio", name = "ActionEntry"}))
        Int32 ->                                -- n_entries : TBasicType TInt
        Ptr () ->                               -- user_data : TBasicType TPtr
        IO ()

    {- |
    A convenience function for creating multiple 'GI.Gio.Objects.SimpleAction.SimpleAction' instances
    and adding them to a 'GI.Gio.Interfaces.ActionMap.ActionMap'.

    Each action is constructed as per one 'GI.Gio.Structs.ActionEntry.ActionEntry'.

    === /C code/
    >
    >static void
    >activate_quit (GSimpleAction *simple,
    >               GVariant      *parameter,
    >               gpointer       user_data)
    >{
    >  exit (0);
    >}
    >
    >static void
    >activate_print_string (GSimpleAction *simple,
    >                       GVariant      *parameter,
    >                       gpointer       user_data)
    >{
    >  g_print ("%s\n", g_variant_get_string (parameter, NULL));
    >}
    >
    >static GActionGroup *
    >create_action_group (void)
    >{
    >  const GActionEntry entries[] = {
    >    { "quit",         activate_quit              },
    >    { "print-string", activate_print_string, "s" }
    >  };
    >  GSimpleActionGroup *group;
    >
    >  group = g_simple_action_group_new ();
    >  g_action_map_add_action_entries (G_ACTION_MAP (group), entries, G_N_ELEMENTS (entries), NULL);
    >
    >  return G_ACTION_GROUP (group);
    >}

    /Since: 2.32/
    -}
    actionMapAddActionEntries ::
        (B.CallStack.HasCallStack, MonadIO m, IsActionMap a) =>
        a
        {- ^ /@actionMap@/: a 'GI.Gio.Interfaces.ActionMap.ActionMap' -}
        -> [Gio.ActionEntry.ActionEntry]
        {- ^ /@entries@/: a pointer to
              the first item in an array of 'GI.Gio.Structs.ActionEntry.ActionEntry' structs -}
        -> Ptr ()
        {- ^ /@userData@/: the user data for signal connections -}
        -> m ()
    actionMapAddActionEntries actionMap entries userData = liftIO $ do
        let nEntries = fromIntegral $ length entries
        actionMap' <- unsafeManagedPtrCastPtr actionMap
        entries' <- mapM unsafeManagedPtrGetPtr entries
        entries'' <- packBlockArray 64 entries'
        g_action_map_add_action_entries actionMap' entries'' nEntries userData
        touchManagedPtr actionMap
        mapM_ touchManagedPtr entries
        freeMem entries''
        return ()

    #if ENABLE_OVERLOADING
    data ActionMapAddActionEntriesMethodInfo
    instance (signature ~ ([Gio.ActionEntry.ActionEntry] -> Ptr () -> m ()), MonadIO m, IsActionMap a) => O.MethodInfo ActionMapAddActionEntriesMethodInfo a signature where
        overloadedMethod _ = actionMapAddActionEntries

    #endif

    -- method ActionMap::lookup_action
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "action_map", argType = TInterface (Name {namespace = "Gio", name = "ActionMap"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GActionMap", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "action_name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the name of an action", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Just (TInterface (Name {namespace = "Gio", name = "Action"}))
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_action_map_lookup_action" g_action_map_lookup_action ::
        Ptr ActionMap ->                        -- action_map : TInterface (Name {namespace = "Gio", name = "ActionMap"})
        CString ->                              -- action_name : TBasicType TUTF8
        IO (Ptr Gio.Action.Action)

    {- |
    Looks up the action with the name /@actionName@/ in /@actionMap@/.

    If no such action exists, returns 'Nothing'.

    /Since: 2.32/
    -}
    actionMapLookupAction ::
        (B.CallStack.HasCallStack, MonadIO m, IsActionMap a) =>
        a
        {- ^ /@actionMap@/: a 'GI.Gio.Interfaces.ActionMap.ActionMap' -}
        -> T.Text
        {- ^ /@actionName@/: the name of an action -}
        -> m Gio.Action.Action
        {- ^ __Returns:__ a 'GI.Gio.Interfaces.Action.Action', or 'Nothing' -}
    actionMapLookupAction actionMap actionName = liftIO $ do
        actionMap' <- unsafeManagedPtrCastPtr actionMap
        actionName' <- textToCString actionName
        result <- g_action_map_lookup_action actionMap' actionName'
        checkUnexpectedReturnNULL "actionMapLookupAction" result
        result' <- (newObject Gio.Action.Action) result
        touchManagedPtr actionMap
        freeMem actionName'
        return result'

    #if ENABLE_OVERLOADING
    data ActionMapLookupActionMethodInfo
    instance (signature ~ (T.Text -> m Gio.Action.Action), MonadIO m, IsActionMap a) => O.MethodInfo ActionMapLookupActionMethodInfo a signature where
        overloadedMethod _ = actionMapLookupAction

    #endif

    -- method ActionMap::remove_action
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "action_map", argType = TInterface (Name {namespace = "Gio", name = "ActionMap"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GActionMap", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "action_name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the name of the action", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Nothing
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_action_map_remove_action" g_action_map_remove_action ::
        Ptr ActionMap ->                        -- action_map : TInterface (Name {namespace = "Gio", name = "ActionMap"})
        CString ->                              -- action_name : TBasicType TUTF8
        IO ()

    {- |
    Removes the named action from the action map.

    If no action of this name is in the map then nothing happens.

    /Since: 2.32/
    -}
    actionMapRemoveAction ::
        (B.CallStack.HasCallStack, MonadIO m, IsActionMap a) =>
        a
        {- ^ /@actionMap@/: a 'GI.Gio.Interfaces.ActionMap.ActionMap' -}
        -> T.Text
        {- ^ /@actionName@/: the name of the action -}
        -> m ()
    actionMapRemoveAction actionMap actionName = liftIO $ do
        actionMap' <- unsafeManagedPtrCastPtr actionMap
        actionName' <- textToCString actionName
        g_action_map_remove_action actionMap' actionName'
        touchManagedPtr actionMap
        freeMem actionName'
        return ()

    #if ENABLE_OVERLOADING
    data ActionMapRemoveActionMethodInfo
    instance (signature ~ (T.Text -> m ()), MonadIO m, IsActionMap a) => O.MethodInfo ActionMapRemoveActionMethodInfo a signature where
        overloadedMethod _ = actionMapRemoveAction

    #endif