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

/No description available in the introspection data./
-}

#define ENABLE_OVERLOADING (MIN_VERSION_haskell_gi_overloading(1,0,0) \
       && !defined(__HADDOCK_VERSION__))

module GI.WebKit2.Objects.OptionMenu
    (

-- * Exported types
    OptionMenu(..)                          ,
    IsOptionMenu                            ,
    toOptionMenu                            ,
    noOptionMenu                            ,


 -- * Methods
-- ** activateItem #method:activateItem#

#if ENABLE_OVERLOADING
    OptionMenuActivateItemMethodInfo        ,
#endif
    optionMenuActivateItem                  ,


-- ** close #method:close#

#if ENABLE_OVERLOADING
    OptionMenuCloseMethodInfo               ,
#endif
    optionMenuClose                         ,


-- ** getItem #method:getItem#

#if ENABLE_OVERLOADING
    OptionMenuGetItemMethodInfo             ,
#endif
    optionMenuGetItem                       ,


-- ** getNItems #method:getNItems#

#if ENABLE_OVERLOADING
    OptionMenuGetNItemsMethodInfo           ,
#endif
    optionMenuGetNItems                     ,


-- ** selectItem #method:selectItem#

#if ENABLE_OVERLOADING
    OptionMenuSelectItemMethodInfo          ,
#endif
    optionMenuSelectItem                    ,




 -- * Signals
-- ** close #signal:close#

    C_OptionMenuCloseCallback               ,
    OptionMenuCloseCallback                 ,
#if ENABLE_OVERLOADING
    OptionMenuCloseSignalInfo               ,
#endif
    afterOptionMenuClose                    ,
    genClosure_OptionMenuClose              ,
    mk_OptionMenuCloseCallback              ,
    noOptionMenuCloseCallback               ,
    onOptionMenuClose                       ,
    wrap_OptionMenuCloseCallback            ,




    ) 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.GClosure as B.GClosure
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.GI.Base.Properties as B.Properties
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 GHC.OverloadedLabels as OL

import qualified GI.GObject.Objects.Object as GObject.Object
import {-# SOURCE #-} qualified GI.WebKit2.Structs.OptionMenuItem as WebKit2.OptionMenuItem

-- | Memory-managed wrapper type.
newtype OptionMenu = OptionMenu (ManagedPtr OptionMenu)
foreign import ccall "webkit_option_menu_get_type"
    c_webkit_option_menu_get_type :: IO GType

instance GObject OptionMenu where
    gobjectType = c_webkit_option_menu_get_type


-- | Type class for types which can be safely cast to `OptionMenu`, for instance with `toOptionMenu`.
class (GObject o, O.IsDescendantOf OptionMenu o) => IsOptionMenu o
instance (GObject o, O.IsDescendantOf OptionMenu o) => IsOptionMenu o

instance O.HasParentTypes OptionMenu
type instance O.ParentTypes OptionMenu = '[GObject.Object.Object]

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

-- | A convenience alias for `Nothing` :: `Maybe` `OptionMenu`.
noOptionMenu :: Maybe OptionMenu
noOptionMenu = Nothing

#if ENABLE_OVERLOADING
type family ResolveOptionMenuMethod (t :: Symbol) (o :: *) :: * where
    ResolveOptionMenuMethod "activateItem" o = OptionMenuActivateItemMethodInfo
    ResolveOptionMenuMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
    ResolveOptionMenuMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
    ResolveOptionMenuMethod "close" o = OptionMenuCloseMethodInfo
    ResolveOptionMenuMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
    ResolveOptionMenuMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
    ResolveOptionMenuMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
    ResolveOptionMenuMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
    ResolveOptionMenuMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
    ResolveOptionMenuMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
    ResolveOptionMenuMethod "ref" o = GObject.Object.ObjectRefMethodInfo
    ResolveOptionMenuMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
    ResolveOptionMenuMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
    ResolveOptionMenuMethod "selectItem" o = OptionMenuSelectItemMethodInfo
    ResolveOptionMenuMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
    ResolveOptionMenuMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
    ResolveOptionMenuMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
    ResolveOptionMenuMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
    ResolveOptionMenuMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
    ResolveOptionMenuMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
    ResolveOptionMenuMethod "getItem" o = OptionMenuGetItemMethodInfo
    ResolveOptionMenuMethod "getNItems" o = OptionMenuGetNItemsMethodInfo
    ResolveOptionMenuMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
    ResolveOptionMenuMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
    ResolveOptionMenuMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
    ResolveOptionMenuMethod "setDataFull" o = GObject.Object.ObjectSetDataFullMethodInfo
    ResolveOptionMenuMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
    ResolveOptionMenuMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveOptionMenuMethod t OptionMenu, O.MethodInfo info OptionMenu p) => OL.IsLabel t (OptionMenu -> 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

-- signal OptionMenu::close
{- |
Emitted when closing a 'GI.WebKit2.Objects.OptionMenu.OptionMenu' is requested. This can happen
when the user explicitly calls 'GI.WebKit2.Objects.OptionMenu.optionMenuClose' or when the
element is detached from the current page.

/Since: 2.18/
-}
type OptionMenuCloseCallback =
    IO ()

-- | A convenience synonym for @`Nothing` :: `Maybe` `OptionMenuCloseCallback`@.
noOptionMenuCloseCallback :: Maybe OptionMenuCloseCallback
noOptionMenuCloseCallback = Nothing

-- | Type for the callback on the (unwrapped) C side.
type C_OptionMenuCloseCallback =
    Ptr () ->                               -- object
    Ptr () ->                               -- user_data
    IO ()

-- | Generate a function pointer callable from C code, from a `C_OptionMenuCloseCallback`.
foreign import ccall "wrapper"
    mk_OptionMenuCloseCallback :: C_OptionMenuCloseCallback -> IO (FunPtr C_OptionMenuCloseCallback)

-- | Wrap the callback into a `GClosure`.
genClosure_OptionMenuClose :: MonadIO m => OptionMenuCloseCallback -> m (GClosure C_OptionMenuCloseCallback)
genClosure_OptionMenuClose cb = liftIO $ do
    let cb' = wrap_OptionMenuCloseCallback cb
    mk_OptionMenuCloseCallback cb' >>= B.GClosure.newGClosure


-- | Wrap a `OptionMenuCloseCallback` into a `C_OptionMenuCloseCallback`.
wrap_OptionMenuCloseCallback ::
    OptionMenuCloseCallback ->
    C_OptionMenuCloseCallback
wrap_OptionMenuCloseCallback _cb _ _ = do
    _cb


{- |
Connect a signal handler for the “@close@” signal, to be run before the default handler.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Signals.on' optionMenu #close callback
@
-}
onOptionMenuClose :: (IsOptionMenu a, MonadIO m) => a -> OptionMenuCloseCallback -> m SignalHandlerId
onOptionMenuClose obj cb = liftIO $ do
    let cb' = wrap_OptionMenuCloseCallback cb
    cb'' <- mk_OptionMenuCloseCallback cb'
    connectSignalFunPtr obj "close" cb'' SignalConnectBefore

{- |
Connect a signal handler for the “@close@” signal, to be run after the default handler.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Signals.after' optionMenu #close callback
@
-}
afterOptionMenuClose :: (IsOptionMenu a, MonadIO m) => a -> OptionMenuCloseCallback -> m SignalHandlerId
afterOptionMenuClose obj cb = liftIO $ do
    let cb' = wrap_OptionMenuCloseCallback cb
    cb'' <- mk_OptionMenuCloseCallback cb'
    connectSignalFunPtr obj "close" cb'' SignalConnectAfter


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

#if ENABLE_OVERLOADING
#endif

#if ENABLE_OVERLOADING
data OptionMenuCloseSignalInfo
instance SignalInfo OptionMenuCloseSignalInfo where
    type HaskellCallbackType OptionMenuCloseSignalInfo = OptionMenuCloseCallback
    connectSignal _ obj cb connectMode = do
        let cb' = wrap_OptionMenuCloseCallback cb
        cb'' <- mk_OptionMenuCloseCallback cb'
        connectSignalFunPtr obj "close" cb'' connectMode

type instance O.SignalList OptionMenu = OptionMenuSignalList
type OptionMenuSignalList = ('[ '("close", OptionMenuCloseSignalInfo), '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)])

#endif

-- method OptionMenu::activate_item
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "menu", argType = TInterface (Name {namespace = "WebKit2", name = "OptionMenu"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #WebKitOptionMenu", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "index", argType = TBasicType TUInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the index of the item", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "webkit_option_menu_activate_item" webkit_option_menu_activate_item ::
    Ptr OptionMenu ->                       -- menu : TInterface (Name {namespace = "WebKit2", name = "OptionMenu"})
    Word32 ->                               -- index : TBasicType TUInt
    IO ()

{- |
Activates the 'GI.WebKit2.Structs.OptionMenuItem.OptionMenuItem' at /@index@/ in /@menu@/. Activating an item changes the value
of the element making the item the active one. You are expected to close the menu with
'GI.WebKit2.Objects.OptionMenu.optionMenuClose' after activating an item, calling this function again will have no
effect.

/Since: 2.18/
-}
optionMenuActivateItem ::
    (B.CallStack.HasCallStack, MonadIO m, IsOptionMenu a) =>
    a
    {- ^ /@menu@/: a 'GI.WebKit2.Objects.OptionMenu.OptionMenu' -}
    -> Word32
    {- ^ /@index@/: the index of the item -}
    -> m ()
optionMenuActivateItem menu index = liftIO $ do
    menu' <- unsafeManagedPtrCastPtr menu
    webkit_option_menu_activate_item menu' index
    touchManagedPtr menu
    return ()

#if ENABLE_OVERLOADING
data OptionMenuActivateItemMethodInfo
instance (signature ~ (Word32 -> m ()), MonadIO m, IsOptionMenu a) => O.MethodInfo OptionMenuActivateItemMethodInfo a signature where
    overloadedMethod _ = optionMenuActivateItem

#endif

-- method OptionMenu::close
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "menu", argType = TInterface (Name {namespace = "WebKit2", name = "OptionMenu"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #WebKitOptionMenu", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "webkit_option_menu_close" webkit_option_menu_close ::
    Ptr OptionMenu ->                       -- menu : TInterface (Name {namespace = "WebKit2", name = "OptionMenu"})
    IO ()

{- |
Request to close a 'GI.WebKit2.Objects.OptionMenu.OptionMenu'. This emits WebKitOptionMenu::close signal.
This function should always be called to notify WebKit that the associated
menu has been closed. If the menu is closed and neither 'GI.WebKit2.Objects.OptionMenu.optionMenuSelectItem'
nor 'GI.WebKit2.Objects.OptionMenu.optionMenuActivateItem' have been called, the element value remains
unchanged.

/Since: 2.18/
-}
optionMenuClose ::
    (B.CallStack.HasCallStack, MonadIO m, IsOptionMenu a) =>
    a
    {- ^ /@menu@/: a 'GI.WebKit2.Objects.OptionMenu.OptionMenu' -}
    -> m ()
optionMenuClose menu = liftIO $ do
    menu' <- unsafeManagedPtrCastPtr menu
    webkit_option_menu_close menu'
    touchManagedPtr menu
    return ()

#if ENABLE_OVERLOADING
data OptionMenuCloseMethodInfo
instance (signature ~ (m ()), MonadIO m, IsOptionMenu a) => O.MethodInfo OptionMenuCloseMethodInfo a signature where
    overloadedMethod _ = optionMenuClose

#endif

-- method OptionMenu::get_item
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "menu", argType = TInterface (Name {namespace = "WebKit2", name = "OptionMenu"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #WebKitOptionMenu", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "index", argType = TBasicType TUInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the index of the item", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "WebKit2", name = "OptionMenuItem"}))
-- throws : False
-- Skip return : False

foreign import ccall "webkit_option_menu_get_item" webkit_option_menu_get_item ::
    Ptr OptionMenu ->                       -- menu : TInterface (Name {namespace = "WebKit2", name = "OptionMenu"})
    Word32 ->                               -- index : TBasicType TUInt
    IO (Ptr WebKit2.OptionMenuItem.OptionMenuItem)

{- |
Returns the 'GI.WebKit2.Structs.OptionMenuItem.OptionMenuItem' at /@index@/ in /@menu@/.

/Since: 2.18/
-}
optionMenuGetItem ::
    (B.CallStack.HasCallStack, MonadIO m, IsOptionMenu a) =>
    a
    {- ^ /@menu@/: a 'GI.WebKit2.Objects.OptionMenu.OptionMenu' -}
    -> Word32
    {- ^ /@index@/: the index of the item -}
    -> m (Maybe WebKit2.OptionMenuItem.OptionMenuItem)
    {- ^ __Returns:__ a 'GI.WebKit2.Structs.OptionMenuItem.OptionMenuItem' of /@menu@/. -}
optionMenuGetItem menu index = liftIO $ do
    menu' <- unsafeManagedPtrCastPtr menu
    result <- webkit_option_menu_get_item menu' index
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- (newBoxed WebKit2.OptionMenuItem.OptionMenuItem) result'
        return result''
    touchManagedPtr menu
    return maybeResult

#if ENABLE_OVERLOADING
data OptionMenuGetItemMethodInfo
instance (signature ~ (Word32 -> m (Maybe WebKit2.OptionMenuItem.OptionMenuItem)), MonadIO m, IsOptionMenu a) => O.MethodInfo OptionMenuGetItemMethodInfo a signature where
    overloadedMethod _ = optionMenuGetItem

#endif

-- method OptionMenu::get_n_items
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "menu", argType = TInterface (Name {namespace = "WebKit2", name = "OptionMenu"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #WebKitOptionMenu", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUInt)
-- throws : False
-- Skip return : False

foreign import ccall "webkit_option_menu_get_n_items" webkit_option_menu_get_n_items ::
    Ptr OptionMenu ->                       -- menu : TInterface (Name {namespace = "WebKit2", name = "OptionMenu"})
    IO Word32

{- |
Gets the length of the /@menu@/.

/Since: 2.18/
-}
optionMenuGetNItems ::
    (B.CallStack.HasCallStack, MonadIO m, IsOptionMenu a) =>
    a
    {- ^ /@menu@/: a 'GI.WebKit2.Objects.OptionMenu.OptionMenu' -}
    -> m Word32
    {- ^ __Returns:__ the number of 'GI.WebKit2.Structs.OptionMenuItem.OptionMenuItem'\<!-- -->s in /@menu@/ -}
optionMenuGetNItems menu = liftIO $ do
    menu' <- unsafeManagedPtrCastPtr menu
    result <- webkit_option_menu_get_n_items menu'
    touchManagedPtr menu
    return result

#if ENABLE_OVERLOADING
data OptionMenuGetNItemsMethodInfo
instance (signature ~ (m Word32), MonadIO m, IsOptionMenu a) => O.MethodInfo OptionMenuGetNItemsMethodInfo a signature where
    overloadedMethod _ = optionMenuGetNItems

#endif

-- method OptionMenu::select_item
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "menu", argType = TInterface (Name {namespace = "WebKit2", name = "OptionMenu"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #WebKitOptionMenu", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "index", argType = TBasicType TUInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the index of the item", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "webkit_option_menu_select_item" webkit_option_menu_select_item ::
    Ptr OptionMenu ->                       -- menu : TInterface (Name {namespace = "WebKit2", name = "OptionMenu"})
    Word32 ->                               -- index : TBasicType TUInt
    IO ()

{- |
Selects the 'GI.WebKit2.Structs.OptionMenuItem.OptionMenuItem' at /@index@/ in /@menu@/. Selecting an item changes the
text shown by the combo button, but it doesn\'t change the value of the element. You need to
explicitly activate the item with 'GI.WebKit2.Objects.OptionMenu.optionMenuSelectItem' or close the menu with
'GI.WebKit2.Objects.OptionMenu.optionMenuClose' in which case the currently selected item will be activated.

/Since: 2.18/
-}
optionMenuSelectItem ::
    (B.CallStack.HasCallStack, MonadIO m, IsOptionMenu a) =>
    a
    {- ^ /@menu@/: a 'GI.WebKit2.Objects.OptionMenu.OptionMenu' -}
    -> Word32
    {- ^ /@index@/: the index of the item -}
    -> m ()
optionMenuSelectItem menu index = liftIO $ do
    menu' <- unsafeManagedPtrCastPtr menu
    webkit_option_menu_select_item menu' index
    touchManagedPtr menu
    return ()

#if ENABLE_OVERLOADING
data OptionMenuSelectItemMethodInfo
instance (signature ~ (Word32 -> m ()), MonadIO m, IsOptionMenu a) => O.MethodInfo OptionMenuSelectItemMethodInfo a signature where
    overloadedMethod _ = optionMenuSelectItem

#endif