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

-- * Exported types
    RecentManager(..)                       ,
    RecentManagerK                          ,
    toRecentManager                         ,
    noRecentManager                         ,


 -- * Methods
-- ** recentManagerAddFull
    recentManagerAddFull                    ,


-- ** recentManagerAddItem
    recentManagerAddItem                    ,


-- ** recentManagerGetDefault
    recentManagerGetDefault                 ,


-- ** recentManagerGetItems
    recentManagerGetItems                   ,


-- ** recentManagerHasItem
    recentManagerHasItem                    ,


-- ** recentManagerLookupItem
    recentManagerLookupItem                 ,


-- ** recentManagerMoveItem
    recentManagerMoveItem                   ,


-- ** recentManagerNew
    recentManagerNew                        ,


-- ** recentManagerPurgeItems
    recentManagerPurgeItems                 ,


-- ** recentManagerRemoveItem
    recentManagerRemoveItem                 ,




 -- * Properties
-- ** Filename
    RecentManagerFilenamePropertyInfo       ,
    constructRecentManagerFilename          ,
    getRecentManagerFilename                ,


-- ** Size
    RecentManagerSizePropertyInfo           ,
    getRecentManagerSize                    ,




 -- * Signals
-- ** Changed
    RecentManagerChangedCallback            ,
    RecentManagerChangedCallbackC           ,
    RecentManagerChangedSignalInfo          ,
    afterRecentManagerChanged               ,
    mkRecentManagerChangedCallback          ,
    noRecentManagerChangedCallback          ,
    onRecentManagerChanged                  ,
    recentManagerChangedCallbackWrapper     ,
    recentManagerChangedClosure             ,




    ) 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

newtype RecentManager = RecentManager (ForeignPtr RecentManager)
foreign import ccall "gtk_recent_manager_get_type"
    c_gtk_recent_manager_get_type :: IO GType

type instance ParentTypes RecentManager = RecentManagerParentTypes
type RecentManagerParentTypes = '[GObject.Object]

instance GObject RecentManager where
    gobjectIsInitiallyUnowned _ = False
    gobjectType _ = c_gtk_recent_manager_get_type
    

class GObject o => RecentManagerK o
instance (GObject o, IsDescendantOf RecentManager o) => RecentManagerK o

toRecentManager :: RecentManagerK o => o -> IO RecentManager
toRecentManager = unsafeCastTo RecentManager

noRecentManager :: Maybe RecentManager
noRecentManager = Nothing

-- signal RecentManager::changed
type RecentManagerChangedCallback =
    IO ()

noRecentManagerChangedCallback :: Maybe RecentManagerChangedCallback
noRecentManagerChangedCallback = Nothing

type RecentManagerChangedCallbackC =
    Ptr () ->                               -- object
    Ptr () ->                               -- user_data
    IO ()

foreign import ccall "wrapper"
    mkRecentManagerChangedCallback :: RecentManagerChangedCallbackC -> IO (FunPtr RecentManagerChangedCallbackC)

recentManagerChangedClosure :: RecentManagerChangedCallback -> IO Closure
recentManagerChangedClosure cb = newCClosure =<< mkRecentManagerChangedCallback wrapped
    where wrapped = recentManagerChangedCallbackWrapper cb

recentManagerChangedCallbackWrapper ::
    RecentManagerChangedCallback ->
    Ptr () ->
    Ptr () ->
    IO ()
recentManagerChangedCallbackWrapper _cb _ _ = do
    _cb 

onRecentManagerChanged :: (GObject a, MonadIO m) => a -> RecentManagerChangedCallback -> m SignalHandlerId
onRecentManagerChanged obj cb = liftIO $ connectRecentManagerChanged obj cb SignalConnectBefore
afterRecentManagerChanged :: (GObject a, MonadIO m) => a -> RecentManagerChangedCallback -> m SignalHandlerId
afterRecentManagerChanged obj cb = connectRecentManagerChanged obj cb SignalConnectAfter

connectRecentManagerChanged :: (GObject a, MonadIO m) =>
                               a -> RecentManagerChangedCallback -> SignalConnectMode -> m SignalHandlerId
connectRecentManagerChanged obj cb after = liftIO $ do
    cb' <- mkRecentManagerChangedCallback (recentManagerChangedCallbackWrapper cb)
    connectSignalFunPtr obj "changed" cb' after

-- VVV Prop "filename"
   -- Type: TBasicType TUTF8
   -- Flags: [PropertyReadable,PropertyWritable,PropertyConstructOnly]

getRecentManagerFilename :: (MonadIO m, RecentManagerK o) => o -> m T.Text
getRecentManagerFilename obj = liftIO $ getObjectPropertyString obj "filename"

constructRecentManagerFilename :: T.Text -> IO ([Char], GValue)
constructRecentManagerFilename val = constructObjectPropertyString "filename" val

data RecentManagerFilenamePropertyInfo
instance AttrInfo RecentManagerFilenamePropertyInfo where
    type AttrAllowedOps RecentManagerFilenamePropertyInfo = '[ 'AttrConstruct, 'AttrGet]
    type AttrSetTypeConstraint RecentManagerFilenamePropertyInfo = (~) T.Text
    type AttrBaseTypeConstraint RecentManagerFilenamePropertyInfo = RecentManagerK
    type AttrGetType RecentManagerFilenamePropertyInfo = T.Text
    type AttrLabel RecentManagerFilenamePropertyInfo = "RecentManager::filename"
    attrGet _ = getRecentManagerFilename
    attrSet _ = undefined
    attrConstruct _ = constructRecentManagerFilename

-- VVV Prop "size"
   -- Type: TBasicType TInt32
   -- Flags: [PropertyReadable]

getRecentManagerSize :: (MonadIO m, RecentManagerK o) => o -> m Int32
getRecentManagerSize obj = liftIO $ getObjectPropertyCInt obj "size"

data RecentManagerSizePropertyInfo
instance AttrInfo RecentManagerSizePropertyInfo where
    type AttrAllowedOps RecentManagerSizePropertyInfo = '[ 'AttrGet]
    type AttrSetTypeConstraint RecentManagerSizePropertyInfo = (~) ()
    type AttrBaseTypeConstraint RecentManagerSizePropertyInfo = RecentManagerK
    type AttrGetType RecentManagerSizePropertyInfo = Int32
    type AttrLabel RecentManagerSizePropertyInfo = "RecentManager::size"
    attrGet _ = getRecentManagerSize
    attrSet _ = undefined
    attrConstruct _ = undefined

type instance AttributeList RecentManager = RecentManagerAttributeList
type RecentManagerAttributeList = ('[ '("filename", RecentManagerFilenamePropertyInfo), '("size", RecentManagerSizePropertyInfo)] :: [(Symbol, *)])

data RecentManagerChangedSignalInfo
instance SignalInfo RecentManagerChangedSignalInfo where
    type HaskellCallbackType RecentManagerChangedSignalInfo = RecentManagerChangedCallback
    connectSignal _ = connectRecentManagerChanged

type instance SignalList RecentManager = RecentManagerSignalList
type RecentManagerSignalList = ('[ '("changed", RecentManagerChangedSignalInfo), '("notify", GObject.ObjectNotifySignalInfo), '("notify::[property]", GObjectNotifySignalInfo)] :: [(Symbol, *)])

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

foreign import ccall "gtk_recent_manager_new" gtk_recent_manager_new :: 
    IO (Ptr RecentManager)


recentManagerNew ::
    (MonadIO m) =>
    m RecentManager
recentManagerNew  = liftIO $ do
    result <- gtk_recent_manager_new
    checkUnexpectedReturnNULL "gtk_recent_manager_new" result
    result' <- (wrapObject RecentManager) result
    return result'

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

foreign import ccall "gtk_recent_manager_add_full" gtk_recent_manager_add_full :: 
    Ptr RecentManager ->                    -- _obj : TInterface "Gtk" "RecentManager"
    CString ->                              -- uri : TBasicType TUTF8
    Ptr RecentData ->                       -- recent_data : TInterface "Gtk" "RecentData"
    IO CInt


recentManagerAddFull ::
    (MonadIO m, RecentManagerK a) =>
    a ->                                    -- _obj
    T.Text ->                               -- uri
    RecentData ->                           -- recent_data
    m Bool
recentManagerAddFull _obj uri recent_data = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    uri' <- textToCString uri
    let recent_data' = unsafeManagedPtrGetPtr recent_data
    result <- gtk_recent_manager_add_full _obj' uri' recent_data'
    let result' = (/= 0) result
    touchManagedPtr _obj
    touchManagedPtr recent_data
    freeMem uri'
    return result'

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

foreign import ccall "gtk_recent_manager_add_item" gtk_recent_manager_add_item :: 
    Ptr RecentManager ->                    -- _obj : TInterface "Gtk" "RecentManager"
    CString ->                              -- uri : TBasicType TUTF8
    IO CInt


recentManagerAddItem ::
    (MonadIO m, RecentManagerK a) =>
    a ->                                    -- _obj
    T.Text ->                               -- uri
    m Bool
recentManagerAddItem _obj uri = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    uri' <- textToCString uri
    result <- gtk_recent_manager_add_item _obj' uri'
    let result' = (/= 0) result
    touchManagedPtr _obj
    freeMem uri'
    return result'

-- method RecentManager::get_items
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "Gtk" "RecentManager", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "Gtk" "RecentManager", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TGList (TInterface "Gtk" "RecentInfo")
-- throws : False
-- Skip return : False

foreign import ccall "gtk_recent_manager_get_items" gtk_recent_manager_get_items :: 
    Ptr RecentManager ->                    -- _obj : TInterface "Gtk" "RecentManager"
    IO (Ptr (GList (Ptr RecentInfo)))


recentManagerGetItems ::
    (MonadIO m, RecentManagerK a) =>
    a ->                                    -- _obj
    m [RecentInfo]
recentManagerGetItems _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    result <- gtk_recent_manager_get_items _obj'
    checkUnexpectedReturnNULL "gtk_recent_manager_get_items" result
    result' <- unpackGList result
    result'' <- mapM (wrapBoxed RecentInfo) result'
    g_list_free result
    touchManagedPtr _obj
    return result''

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

foreign import ccall "gtk_recent_manager_has_item" gtk_recent_manager_has_item :: 
    Ptr RecentManager ->                    -- _obj : TInterface "Gtk" "RecentManager"
    CString ->                              -- uri : TBasicType TUTF8
    IO CInt


recentManagerHasItem ::
    (MonadIO m, RecentManagerK a) =>
    a ->                                    -- _obj
    T.Text ->                               -- uri
    m Bool
recentManagerHasItem _obj uri = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    uri' <- textToCString uri
    result <- gtk_recent_manager_has_item _obj' uri'
    let result' = (/= 0) result
    touchManagedPtr _obj
    freeMem uri'
    return result'

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

foreign import ccall "gtk_recent_manager_lookup_item" gtk_recent_manager_lookup_item :: 
    Ptr RecentManager ->                    -- _obj : TInterface "Gtk" "RecentManager"
    CString ->                              -- uri : TBasicType TUTF8
    Ptr (Ptr GError) ->                     -- error
    IO (Ptr RecentInfo)


recentManagerLookupItem ::
    (MonadIO m, RecentManagerK a) =>
    a ->                                    -- _obj
    T.Text ->                               -- uri
    m RecentInfo
recentManagerLookupItem _obj uri = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    uri' <- textToCString uri
    onException (do
        result <- propagateGError $ gtk_recent_manager_lookup_item _obj' uri'
        checkUnexpectedReturnNULL "gtk_recent_manager_lookup_item" result
        result' <- (wrapBoxed RecentInfo) result
        touchManagedPtr _obj
        freeMem uri'
        return result'
     ) (do
        freeMem uri'
     )

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

foreign import ccall "gtk_recent_manager_move_item" gtk_recent_manager_move_item :: 
    Ptr RecentManager ->                    -- _obj : TInterface "Gtk" "RecentManager"
    CString ->                              -- uri : TBasicType TUTF8
    CString ->                              -- new_uri : TBasicType TUTF8
    Ptr (Ptr GError) ->                     -- error
    IO CInt


recentManagerMoveItem ::
    (MonadIO m, RecentManagerK a) =>
    a ->                                    -- _obj
    T.Text ->                               -- uri
    Maybe (T.Text) ->                       -- new_uri
    m ()
recentManagerMoveItem _obj uri new_uri = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    uri' <- textToCString uri
    maybeNew_uri <- case new_uri of
        Nothing -> return nullPtr
        Just jNew_uri -> do
            jNew_uri' <- textToCString jNew_uri
            return jNew_uri'
    onException (do
        _ <- propagateGError $ gtk_recent_manager_move_item _obj' uri' maybeNew_uri
        touchManagedPtr _obj
        freeMem uri'
        freeMem maybeNew_uri
        return ()
     ) (do
        freeMem uri'
        freeMem maybeNew_uri
     )

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

foreign import ccall "gtk_recent_manager_purge_items" gtk_recent_manager_purge_items :: 
    Ptr RecentManager ->                    -- _obj : TInterface "Gtk" "RecentManager"
    Ptr (Ptr GError) ->                     -- error
    IO Int32


recentManagerPurgeItems ::
    (MonadIO m, RecentManagerK a) =>
    a ->                                    -- _obj
    m Int32
recentManagerPurgeItems _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    onException (do
        result <- propagateGError $ gtk_recent_manager_purge_items _obj'
        touchManagedPtr _obj
        return result
     ) (do
        return ()
     )

-- method RecentManager::remove_item
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "Gtk" "RecentManager", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "uri", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "Gtk" "RecentManager", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "uri", 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_recent_manager_remove_item" gtk_recent_manager_remove_item :: 
    Ptr RecentManager ->                    -- _obj : TInterface "Gtk" "RecentManager"
    CString ->                              -- uri : TBasicType TUTF8
    Ptr (Ptr GError) ->                     -- error
    IO CInt


recentManagerRemoveItem ::
    (MonadIO m, RecentManagerK a) =>
    a ->                                    -- _obj
    T.Text ->                               -- uri
    m ()
recentManagerRemoveItem _obj uri = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    uri' <- textToCString uri
    onException (do
        _ <- propagateGError $ gtk_recent_manager_remove_item _obj' uri'
        touchManagedPtr _obj
        freeMem uri'
        return ()
     ) (do
        freeMem uri'
     )

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

foreign import ccall "gtk_recent_manager_get_default" gtk_recent_manager_get_default :: 
    IO (Ptr RecentManager)


recentManagerGetDefault ::
    (MonadIO m) =>
    m RecentManager
recentManagerGetDefault  = liftIO $ do
    result <- gtk_recent_manager_get_default
    checkUnexpectedReturnNULL "gtk_recent_manager_get_default" result
    result' <- (newObject RecentManager) result
    return result'