{- |
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.WebKit2.Objects.PrintOperation
    ( 

-- * Exported types
    PrintOperation(..)                      ,
    PrintOperationK                         ,
    toPrintOperation                        ,
    noPrintOperation                        ,


 -- * Methods
-- ** printOperationGetPageSetup
    printOperationGetPageSetup              ,


-- ** printOperationGetPrintSettings
    printOperationGetPrintSettings          ,


-- ** printOperationNew
    printOperationNew                       ,


-- ** printOperationPrint
    printOperationPrint                     ,


-- ** printOperationRunDialog
    printOperationRunDialog                 ,


-- ** printOperationSetPageSetup
    printOperationSetPageSetup              ,


-- ** printOperationSetPrintSettings
    printOperationSetPrintSettings          ,




 -- * Properties
-- ** PageSetup
    PrintOperationPageSetupPropertyInfo     ,
    constructPrintOperationPageSetup        ,
    getPrintOperationPageSetup              ,
    setPrintOperationPageSetup              ,


-- ** PrintSettings
    PrintOperationPrintSettingsPropertyInfo ,
    constructPrintOperationPrintSettings    ,
    getPrintOperationPrintSettings          ,
    setPrintOperationPrintSettings          ,


-- ** WebView
    PrintOperationWebViewPropertyInfo       ,
    constructPrintOperationWebView          ,
    getPrintOperationWebView                ,




 -- * Signals
-- ** Failed
    PrintOperationFailedCallback            ,
    PrintOperationFailedCallbackC           ,
    PrintOperationFailedSignalInfo          ,
    afterPrintOperationFailed               ,
    mkPrintOperationFailedCallback          ,
    noPrintOperationFailedCallback          ,
    onPrintOperationFailed                  ,
    printOperationFailedCallbackWrapper     ,
    printOperationFailedClosure             ,


-- ** Finished
    PrintOperationFinishedCallback          ,
    PrintOperationFinishedCallbackC         ,
    PrintOperationFinishedSignalInfo        ,
    afterPrintOperationFinished             ,
    mkPrintOperationFinishedCallback        ,
    noPrintOperationFinishedCallback        ,
    onPrintOperationFinished                ,
    printOperationFinishedCallbackWrapper   ,
    printOperationFinishedClosure           ,




    ) 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.WebKit2.Types
import GI.WebKit2.Callbacks
import qualified GI.GObject as GObject
import qualified GI.Gtk as Gtk

newtype PrintOperation = PrintOperation (ForeignPtr PrintOperation)
foreign import ccall "webkit_print_operation_get_type"
    c_webkit_print_operation_get_type :: IO GType

type instance ParentTypes PrintOperation = PrintOperationParentTypes
type PrintOperationParentTypes = '[GObject.Object]

instance GObject PrintOperation where
    gobjectIsInitiallyUnowned _ = False
    gobjectType _ = c_webkit_print_operation_get_type
    

class GObject o => PrintOperationK o
instance (GObject o, IsDescendantOf PrintOperation o) => PrintOperationK o

toPrintOperation :: PrintOperationK o => o -> IO PrintOperation
toPrintOperation = unsafeCastTo PrintOperation

noPrintOperation :: Maybe PrintOperation
noPrintOperation = Nothing

-- signal PrintOperation::failed
type PrintOperationFailedCallback =
    Ptr () ->
    IO ()

noPrintOperationFailedCallback :: Maybe PrintOperationFailedCallback
noPrintOperationFailedCallback = Nothing

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

foreign import ccall "wrapper"
    mkPrintOperationFailedCallback :: PrintOperationFailedCallbackC -> IO (FunPtr PrintOperationFailedCallbackC)

printOperationFailedClosure :: PrintOperationFailedCallback -> IO Closure
printOperationFailedClosure cb = newCClosure =<< mkPrintOperationFailedCallback wrapped
    where wrapped = printOperationFailedCallbackWrapper cb

printOperationFailedCallbackWrapper ::
    PrintOperationFailedCallback ->
    Ptr () ->
    Ptr () ->
    Ptr () ->
    IO ()
printOperationFailedCallbackWrapper _cb _ error_ _ = do
    _cb  error_

onPrintOperationFailed :: (GObject a, MonadIO m) => a -> PrintOperationFailedCallback -> m SignalHandlerId
onPrintOperationFailed obj cb = liftIO $ connectPrintOperationFailed obj cb SignalConnectBefore
afterPrintOperationFailed :: (GObject a, MonadIO m) => a -> PrintOperationFailedCallback -> m SignalHandlerId
afterPrintOperationFailed obj cb = connectPrintOperationFailed obj cb SignalConnectAfter

connectPrintOperationFailed :: (GObject a, MonadIO m) =>
                               a -> PrintOperationFailedCallback -> SignalConnectMode -> m SignalHandlerId
connectPrintOperationFailed obj cb after = liftIO $ do
    cb' <- mkPrintOperationFailedCallback (printOperationFailedCallbackWrapper cb)
    connectSignalFunPtr obj "failed" cb' after

-- signal PrintOperation::finished
type PrintOperationFinishedCallback =
    IO ()

noPrintOperationFinishedCallback :: Maybe PrintOperationFinishedCallback
noPrintOperationFinishedCallback = Nothing

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

foreign import ccall "wrapper"
    mkPrintOperationFinishedCallback :: PrintOperationFinishedCallbackC -> IO (FunPtr PrintOperationFinishedCallbackC)

printOperationFinishedClosure :: PrintOperationFinishedCallback -> IO Closure
printOperationFinishedClosure cb = newCClosure =<< mkPrintOperationFinishedCallback wrapped
    where wrapped = printOperationFinishedCallbackWrapper cb

printOperationFinishedCallbackWrapper ::
    PrintOperationFinishedCallback ->
    Ptr () ->
    Ptr () ->
    IO ()
printOperationFinishedCallbackWrapper _cb _ _ = do
    _cb 

onPrintOperationFinished :: (GObject a, MonadIO m) => a -> PrintOperationFinishedCallback -> m SignalHandlerId
onPrintOperationFinished obj cb = liftIO $ connectPrintOperationFinished obj cb SignalConnectBefore
afterPrintOperationFinished :: (GObject a, MonadIO m) => a -> PrintOperationFinishedCallback -> m SignalHandlerId
afterPrintOperationFinished obj cb = connectPrintOperationFinished obj cb SignalConnectAfter

connectPrintOperationFinished :: (GObject a, MonadIO m) =>
                                 a -> PrintOperationFinishedCallback -> SignalConnectMode -> m SignalHandlerId
connectPrintOperationFinished obj cb after = liftIO $ do
    cb' <- mkPrintOperationFinishedCallback (printOperationFinishedCallbackWrapper cb)
    connectSignalFunPtr obj "finished" cb' after

-- VVV Prop "page-setup"
   -- Type: TInterface "Gtk" "PageSetup"
   -- Flags: [PropertyReadable,PropertyWritable]

getPrintOperationPageSetup :: (MonadIO m, PrintOperationK o) => o -> m Gtk.PageSetup
getPrintOperationPageSetup obj = liftIO $ getObjectPropertyObject obj "page-setup" Gtk.PageSetup

setPrintOperationPageSetup :: (MonadIO m, PrintOperationK o, Gtk.PageSetupK a) => o -> a -> m ()
setPrintOperationPageSetup obj val = liftIO $ setObjectPropertyObject obj "page-setup" val

constructPrintOperationPageSetup :: (Gtk.PageSetupK a) => a -> IO ([Char], GValue)
constructPrintOperationPageSetup val = constructObjectPropertyObject "page-setup" val

data PrintOperationPageSetupPropertyInfo
instance AttrInfo PrintOperationPageSetupPropertyInfo where
    type AttrAllowedOps PrintOperationPageSetupPropertyInfo = '[ 'AttrSet, 'AttrConstruct, 'AttrGet]
    type AttrSetTypeConstraint PrintOperationPageSetupPropertyInfo = Gtk.PageSetupK
    type AttrBaseTypeConstraint PrintOperationPageSetupPropertyInfo = PrintOperationK
    type AttrGetType PrintOperationPageSetupPropertyInfo = Gtk.PageSetup
    type AttrLabel PrintOperationPageSetupPropertyInfo = "PrintOperation::page-setup"
    attrGet _ = getPrintOperationPageSetup
    attrSet _ = setPrintOperationPageSetup
    attrConstruct _ = constructPrintOperationPageSetup

-- VVV Prop "print-settings"
   -- Type: TInterface "Gtk" "PrintSettings"
   -- Flags: [PropertyReadable,PropertyWritable]

getPrintOperationPrintSettings :: (MonadIO m, PrintOperationK o) => o -> m Gtk.PrintSettings
getPrintOperationPrintSettings obj = liftIO $ getObjectPropertyObject obj "print-settings" Gtk.PrintSettings

setPrintOperationPrintSettings :: (MonadIO m, PrintOperationK o, Gtk.PrintSettingsK a) => o -> a -> m ()
setPrintOperationPrintSettings obj val = liftIO $ setObjectPropertyObject obj "print-settings" val

constructPrintOperationPrintSettings :: (Gtk.PrintSettingsK a) => a -> IO ([Char], GValue)
constructPrintOperationPrintSettings val = constructObjectPropertyObject "print-settings" val

data PrintOperationPrintSettingsPropertyInfo
instance AttrInfo PrintOperationPrintSettingsPropertyInfo where
    type AttrAllowedOps PrintOperationPrintSettingsPropertyInfo = '[ 'AttrSet, 'AttrConstruct, 'AttrGet]
    type AttrSetTypeConstraint PrintOperationPrintSettingsPropertyInfo = Gtk.PrintSettingsK
    type AttrBaseTypeConstraint PrintOperationPrintSettingsPropertyInfo = PrintOperationK
    type AttrGetType PrintOperationPrintSettingsPropertyInfo = Gtk.PrintSettings
    type AttrLabel PrintOperationPrintSettingsPropertyInfo = "PrintOperation::print-settings"
    attrGet _ = getPrintOperationPrintSettings
    attrSet _ = setPrintOperationPrintSettings
    attrConstruct _ = constructPrintOperationPrintSettings

-- VVV Prop "web-view"
   -- Type: TInterface "WebKit2" "WebView"
   -- Flags: [PropertyReadable,PropertyWritable,PropertyConstructOnly]

getPrintOperationWebView :: (MonadIO m, PrintOperationK o) => o -> m WebView
getPrintOperationWebView obj = liftIO $ getObjectPropertyObject obj "web-view" WebView

constructPrintOperationWebView :: (WebViewK a) => a -> IO ([Char], GValue)
constructPrintOperationWebView val = constructObjectPropertyObject "web-view" val

data PrintOperationWebViewPropertyInfo
instance AttrInfo PrintOperationWebViewPropertyInfo where
    type AttrAllowedOps PrintOperationWebViewPropertyInfo = '[ 'AttrConstruct, 'AttrGet]
    type AttrSetTypeConstraint PrintOperationWebViewPropertyInfo = WebViewK
    type AttrBaseTypeConstraint PrintOperationWebViewPropertyInfo = PrintOperationK
    type AttrGetType PrintOperationWebViewPropertyInfo = WebView
    type AttrLabel PrintOperationWebViewPropertyInfo = "PrintOperation::web-view"
    attrGet _ = getPrintOperationWebView
    attrSet _ = undefined
    attrConstruct _ = constructPrintOperationWebView

type instance AttributeList PrintOperation = PrintOperationAttributeList
type PrintOperationAttributeList = ('[ '("page-setup", PrintOperationPageSetupPropertyInfo), '("print-settings", PrintOperationPrintSettingsPropertyInfo), '("web-view", PrintOperationWebViewPropertyInfo)] :: [(Symbol, *)])

data PrintOperationFailedSignalInfo
instance SignalInfo PrintOperationFailedSignalInfo where
    type HaskellCallbackType PrintOperationFailedSignalInfo = PrintOperationFailedCallback
    connectSignal _ = connectPrintOperationFailed

data PrintOperationFinishedSignalInfo
instance SignalInfo PrintOperationFinishedSignalInfo where
    type HaskellCallbackType PrintOperationFinishedSignalInfo = PrintOperationFinishedCallback
    connectSignal _ = connectPrintOperationFinished

type instance SignalList PrintOperation = PrintOperationSignalList
type PrintOperationSignalList = ('[ '("failed", PrintOperationFailedSignalInfo), '("finished", PrintOperationFinishedSignalInfo), '("notify", GObject.ObjectNotifySignalInfo), '("notify::[property]", GObjectNotifySignalInfo)] :: [(Symbol, *)])

-- method PrintOperation::new
-- method type : Constructor
-- Args : [Arg {argName = "web_view", argType = TInterface "WebKit2" "WebView", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "web_view", argType = TInterface "WebKit2" "WebView", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TInterface "WebKit2" "PrintOperation"
-- throws : False
-- Skip return : False

foreign import ccall "webkit_print_operation_new" webkit_print_operation_new :: 
    Ptr WebView ->                          -- web_view : TInterface "WebKit2" "WebView"
    IO (Ptr PrintOperation)


printOperationNew ::
    (MonadIO m, WebViewK a) =>
    a ->                                    -- web_view
    m PrintOperation
printOperationNew web_view = liftIO $ do
    let web_view' = unsafeManagedPtrCastPtr web_view
    result <- webkit_print_operation_new web_view'
    checkUnexpectedReturnNULL "webkit_print_operation_new" result
    result' <- (wrapObject PrintOperation) result
    touchManagedPtr web_view
    return result'

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

foreign import ccall "webkit_print_operation_get_page_setup" webkit_print_operation_get_page_setup :: 
    Ptr PrintOperation ->                   -- _obj : TInterface "WebKit2" "PrintOperation"
    IO (Ptr Gtk.PageSetup)


printOperationGetPageSetup ::
    (MonadIO m, PrintOperationK a) =>
    a ->                                    -- _obj
    m Gtk.PageSetup
printOperationGetPageSetup _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    result <- webkit_print_operation_get_page_setup _obj'
    checkUnexpectedReturnNULL "webkit_print_operation_get_page_setup" result
    result' <- (newObject Gtk.PageSetup) result
    touchManagedPtr _obj
    return result'

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

foreign import ccall "webkit_print_operation_get_print_settings" webkit_print_operation_get_print_settings :: 
    Ptr PrintOperation ->                   -- _obj : TInterface "WebKit2" "PrintOperation"
    IO (Ptr Gtk.PrintSettings)


printOperationGetPrintSettings ::
    (MonadIO m, PrintOperationK a) =>
    a ->                                    -- _obj
    m Gtk.PrintSettings
printOperationGetPrintSettings _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    result <- webkit_print_operation_get_print_settings _obj'
    checkUnexpectedReturnNULL "webkit_print_operation_get_print_settings" result
    result' <- (newObject Gtk.PrintSettings) result
    touchManagedPtr _obj
    return result'

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

foreign import ccall "webkit_print_operation_print" webkit_print_operation_print :: 
    Ptr PrintOperation ->                   -- _obj : TInterface "WebKit2" "PrintOperation"
    IO ()


printOperationPrint ::
    (MonadIO m, PrintOperationK a) =>
    a ->                                    -- _obj
    m ()
printOperationPrint _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    webkit_print_operation_print _obj'
    touchManagedPtr _obj
    return ()

-- method PrintOperation::run_dialog
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "WebKit2" "PrintOperation", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "parent", argType = TInterface "Gtk" "Window", direction = DirectionIn, mayBeNull = True, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "WebKit2" "PrintOperation", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "parent", argType = TInterface "Gtk" "Window", direction = DirectionIn, mayBeNull = True, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TInterface "WebKit2" "PrintOperationResponse"
-- throws : False
-- Skip return : False

foreign import ccall "webkit_print_operation_run_dialog" webkit_print_operation_run_dialog :: 
    Ptr PrintOperation ->                   -- _obj : TInterface "WebKit2" "PrintOperation"
    Ptr Gtk.Window ->                       -- parent : TInterface "Gtk" "Window"
    IO CUInt


printOperationRunDialog ::
    (MonadIO m, PrintOperationK a, Gtk.WindowK b) =>
    a ->                                    -- _obj
    Maybe (b) ->                            -- parent
    m PrintOperationResponse
printOperationRunDialog _obj parent = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    maybeParent <- case parent of
        Nothing -> return nullPtr
        Just jParent -> do
            let jParent' = unsafeManagedPtrCastPtr jParent
            return jParent'
    result <- webkit_print_operation_run_dialog _obj' maybeParent
    let result' = (toEnum . fromIntegral) result
    touchManagedPtr _obj
    whenJust parent touchManagedPtr
    return result'

-- method PrintOperation::set_page_setup
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "WebKit2" "PrintOperation", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "page_setup", argType = TInterface "Gtk" "PageSetup", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "WebKit2" "PrintOperation", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "page_setup", argType = TInterface "Gtk" "PageSetup", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "webkit_print_operation_set_page_setup" webkit_print_operation_set_page_setup :: 
    Ptr PrintOperation ->                   -- _obj : TInterface "WebKit2" "PrintOperation"
    Ptr Gtk.PageSetup ->                    -- page_setup : TInterface "Gtk" "PageSetup"
    IO ()


printOperationSetPageSetup ::
    (MonadIO m, PrintOperationK a, Gtk.PageSetupK b) =>
    a ->                                    -- _obj
    b ->                                    -- page_setup
    m ()
printOperationSetPageSetup _obj page_setup = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    let page_setup' = unsafeManagedPtrCastPtr page_setup
    webkit_print_operation_set_page_setup _obj' page_setup'
    touchManagedPtr _obj
    touchManagedPtr page_setup
    return ()

-- method PrintOperation::set_print_settings
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "WebKit2" "PrintOperation", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "print_settings", argType = TInterface "Gtk" "PrintSettings", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "WebKit2" "PrintOperation", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "print_settings", argType = TInterface "Gtk" "PrintSettings", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "webkit_print_operation_set_print_settings" webkit_print_operation_set_print_settings :: 
    Ptr PrintOperation ->                   -- _obj : TInterface "WebKit2" "PrintOperation"
    Ptr Gtk.PrintSettings ->                -- print_settings : TInterface "Gtk" "PrintSettings"
    IO ()


printOperationSetPrintSettings ::
    (MonadIO m, PrintOperationK a, Gtk.PrintSettingsK b) =>
    a ->                                    -- _obj
    b ->                                    -- print_settings
    m ()
printOperationSetPrintSettings _obj print_settings = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    let print_settings' = unsafeManagedPtrCastPtr print_settings
    webkit_print_operation_set_print_settings _obj' print_settings'
    touchManagedPtr _obj
    touchManagedPtr print_settings
    return ()