{- |
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.Interfaces.PrintOperationPreview
    ( 

-- * Exported types
    PrintOperationPreview(..)               ,
    noPrintOperationPreview                 ,
    IsPrintOperationPreview                 ,
    toPrintOperationPreview                 ,


 -- * Methods
-- ** endPreview #method:endPreview#
    PrintOperationPreviewEndPreviewMethodInfo,
    printOperationPreviewEndPreview         ,


-- ** isSelected #method:isSelected#
    PrintOperationPreviewIsSelectedMethodInfo,
    printOperationPreviewIsSelected         ,


-- ** renderPage #method:renderPage#
    PrintOperationPreviewRenderPageMethodInfo,
    printOperationPreviewRenderPage         ,




 -- * Signals
-- ** gotPageSize #signal:gotPageSize#
    C_PrintOperationPreviewGotPageSizeCallback,
    PrintOperationPreviewGotPageSizeCallback,
    PrintOperationPreviewGotPageSizeSignalInfo,
    afterPrintOperationPreviewGotPageSize   ,
    genClosure_PrintOperationPreviewGotPageSize,
    mk_PrintOperationPreviewGotPageSizeCallback,
    noPrintOperationPreviewGotPageSizeCallback,
    onPrintOperationPreviewGotPageSize      ,
    wrap_PrintOperationPreviewGotPageSizeCallback,


-- ** ready #signal:ready#
    C_PrintOperationPreviewReadyCallback    ,
    PrintOperationPreviewReadyCallback      ,
    PrintOperationPreviewReadySignalInfo    ,
    afterPrintOperationPreviewReady         ,
    genClosure_PrintOperationPreviewReady   ,
    mk_PrintOperationPreviewReadyCallback   ,
    noPrintOperationPreviewReadyCallback    ,
    onPrintOperationPreviewReady            ,
    wrap_PrintOperationPreviewReadyCallback ,




    ) 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.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.Gtk.Objects.PageSetup as Gtk.PageSetup
import {-# SOURCE #-} qualified GI.Gtk.Objects.PrintContext as Gtk.PrintContext

-- interface PrintOperationPreview 
newtype PrintOperationPreview = PrintOperationPreview (ManagedPtr PrintOperationPreview)
noPrintOperationPreview :: Maybe PrintOperationPreview
noPrintOperationPreview = Nothing

type family ResolvePrintOperationPreviewMethod (t :: Symbol) (o :: *) :: * where
    ResolvePrintOperationPreviewMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
    ResolvePrintOperationPreviewMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
    ResolvePrintOperationPreviewMethod "endPreview" o = PrintOperationPreviewEndPreviewMethodInfo
    ResolvePrintOperationPreviewMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
    ResolvePrintOperationPreviewMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
    ResolvePrintOperationPreviewMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
    ResolvePrintOperationPreviewMethod "isSelected" o = PrintOperationPreviewIsSelectedMethodInfo
    ResolvePrintOperationPreviewMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
    ResolvePrintOperationPreviewMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
    ResolvePrintOperationPreviewMethod "ref" o = GObject.Object.ObjectRefMethodInfo
    ResolvePrintOperationPreviewMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
    ResolvePrintOperationPreviewMethod "renderPage" o = PrintOperationPreviewRenderPageMethodInfo
    ResolvePrintOperationPreviewMethod "replaceData" o = GObject.Object.ObjectReplaceDataMethodInfo
    ResolvePrintOperationPreviewMethod "replaceQdata" o = GObject.Object.ObjectReplaceQdataMethodInfo
    ResolvePrintOperationPreviewMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
    ResolvePrintOperationPreviewMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
    ResolvePrintOperationPreviewMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
    ResolvePrintOperationPreviewMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
    ResolvePrintOperationPreviewMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
    ResolvePrintOperationPreviewMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
    ResolvePrintOperationPreviewMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
    ResolvePrintOperationPreviewMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
    ResolvePrintOperationPreviewMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
    ResolvePrintOperationPreviewMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
    ResolvePrintOperationPreviewMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
    ResolvePrintOperationPreviewMethod l o = O.MethodResolutionFailed l o

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

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

-- signal PrintOperationPreview::got-page-size
type PrintOperationPreviewGotPageSizeCallback =
    Gtk.PrintContext.PrintContext ->
    Gtk.PageSetup.PageSetup ->
    IO ()

noPrintOperationPreviewGotPageSizeCallback :: Maybe PrintOperationPreviewGotPageSizeCallback
noPrintOperationPreviewGotPageSizeCallback = Nothing

type C_PrintOperationPreviewGotPageSizeCallback =
    Ptr () ->                               -- object
    Ptr Gtk.PrintContext.PrintContext ->
    Ptr Gtk.PageSetup.PageSetup ->
    Ptr () ->                               -- user_data
    IO ()

foreign import ccall "wrapper"
    mk_PrintOperationPreviewGotPageSizeCallback :: C_PrintOperationPreviewGotPageSizeCallback -> IO (FunPtr C_PrintOperationPreviewGotPageSizeCallback)

genClosure_PrintOperationPreviewGotPageSize :: PrintOperationPreviewGotPageSizeCallback -> IO Closure
genClosure_PrintOperationPreviewGotPageSize cb = do
    let cb' = wrap_PrintOperationPreviewGotPageSizeCallback cb
    mk_PrintOperationPreviewGotPageSizeCallback cb' >>= newCClosure


wrap_PrintOperationPreviewGotPageSizeCallback ::
    PrintOperationPreviewGotPageSizeCallback ->
    Ptr () ->
    Ptr Gtk.PrintContext.PrintContext ->
    Ptr Gtk.PageSetup.PageSetup ->
    Ptr () ->
    IO ()
wrap_PrintOperationPreviewGotPageSizeCallback _cb _ context pageSetup _ = do
    context' <- (newObject Gtk.PrintContext.PrintContext) context
    pageSetup' <- (newObject Gtk.PageSetup.PageSetup) pageSetup
    _cb  context' pageSetup'


onPrintOperationPreviewGotPageSize :: (GObject a, MonadIO m) => a -> PrintOperationPreviewGotPageSizeCallback -> m SignalHandlerId
onPrintOperationPreviewGotPageSize obj cb = liftIO $ connectPrintOperationPreviewGotPageSize obj cb SignalConnectBefore
afterPrintOperationPreviewGotPageSize :: (GObject a, MonadIO m) => a -> PrintOperationPreviewGotPageSizeCallback -> m SignalHandlerId
afterPrintOperationPreviewGotPageSize obj cb = connectPrintOperationPreviewGotPageSize obj cb SignalConnectAfter

connectPrintOperationPreviewGotPageSize :: (GObject a, MonadIO m) =>
                                           a -> PrintOperationPreviewGotPageSizeCallback -> SignalConnectMode -> m SignalHandlerId
connectPrintOperationPreviewGotPageSize obj cb after = liftIO $ do
    let cb' = wrap_PrintOperationPreviewGotPageSizeCallback cb
    cb'' <- mk_PrintOperationPreviewGotPageSizeCallback cb'
    connectSignalFunPtr obj "got-page-size" cb'' after

-- signal PrintOperationPreview::ready
type PrintOperationPreviewReadyCallback =
    Gtk.PrintContext.PrintContext ->
    IO ()

noPrintOperationPreviewReadyCallback :: Maybe PrintOperationPreviewReadyCallback
noPrintOperationPreviewReadyCallback = Nothing

type C_PrintOperationPreviewReadyCallback =
    Ptr () ->                               -- object
    Ptr Gtk.PrintContext.PrintContext ->
    Ptr () ->                               -- user_data
    IO ()

foreign import ccall "wrapper"
    mk_PrintOperationPreviewReadyCallback :: C_PrintOperationPreviewReadyCallback -> IO (FunPtr C_PrintOperationPreviewReadyCallback)

genClosure_PrintOperationPreviewReady :: PrintOperationPreviewReadyCallback -> IO Closure
genClosure_PrintOperationPreviewReady cb = do
    let cb' = wrap_PrintOperationPreviewReadyCallback cb
    mk_PrintOperationPreviewReadyCallback cb' >>= newCClosure


wrap_PrintOperationPreviewReadyCallback ::
    PrintOperationPreviewReadyCallback ->
    Ptr () ->
    Ptr Gtk.PrintContext.PrintContext ->
    Ptr () ->
    IO ()
wrap_PrintOperationPreviewReadyCallback _cb _ context _ = do
    context' <- (newObject Gtk.PrintContext.PrintContext) context
    _cb  context'


onPrintOperationPreviewReady :: (GObject a, MonadIO m) => a -> PrintOperationPreviewReadyCallback -> m SignalHandlerId
onPrintOperationPreviewReady obj cb = liftIO $ connectPrintOperationPreviewReady obj cb SignalConnectBefore
afterPrintOperationPreviewReady :: (GObject a, MonadIO m) => a -> PrintOperationPreviewReadyCallback -> m SignalHandlerId
afterPrintOperationPreviewReady obj cb = connectPrintOperationPreviewReady obj cb SignalConnectAfter

connectPrintOperationPreviewReady :: (GObject a, MonadIO m) =>
                                     a -> PrintOperationPreviewReadyCallback -> SignalConnectMode -> m SignalHandlerId
connectPrintOperationPreviewReady obj cb after = liftIO $ do
    let cb' = wrap_PrintOperationPreviewReadyCallback cb
    cb'' <- mk_PrintOperationPreviewReadyCallback cb'
    connectSignalFunPtr obj "ready" cb'' after

instance O.HasAttributeList PrintOperationPreview
type instance O.AttributeList PrintOperationPreview = PrintOperationPreviewAttributeList
type PrintOperationPreviewAttributeList = ('[ ] :: [(Symbol, *)])

data PrintOperationPreviewGotPageSizeSignalInfo
instance SignalInfo PrintOperationPreviewGotPageSizeSignalInfo where
    type HaskellCallbackType PrintOperationPreviewGotPageSizeSignalInfo = PrintOperationPreviewGotPageSizeCallback
    connectSignal _ = connectPrintOperationPreviewGotPageSize

data PrintOperationPreviewReadySignalInfo
instance SignalInfo PrintOperationPreviewReadySignalInfo where
    type HaskellCallbackType PrintOperationPreviewReadySignalInfo = PrintOperationPreviewReadyCallback
    connectSignal _ = connectPrintOperationPreviewReady

type instance O.SignalList PrintOperationPreview = PrintOperationPreviewSignalList
type PrintOperationPreviewSignalList = ('[ '("gotPageSize", PrintOperationPreviewGotPageSizeSignalInfo), '("notify", GObject.Object.ObjectNotifySignalInfo), '("ready", PrintOperationPreviewReadySignalInfo)] :: [(Symbol, *)])

foreign import ccall "gtk_print_operation_preview_get_type"
    c_gtk_print_operation_preview_get_type :: IO GType

instance GObject PrintOperationPreview where
    gobjectType _ = c_gtk_print_operation_preview_get_type
    

class GObject o => IsPrintOperationPreview o
#if MIN_VERSION_base(4,9,0)
instance {-# OVERLAPPABLE #-} (GObject a, O.UnknownAncestorError PrintOperationPreview a) =>
    IsPrintOperationPreview a
#endif
instance IsPrintOperationPreview PrintOperationPreview
instance GObject.Object.IsObject PrintOperationPreview

toPrintOperationPreview :: IsPrintOperationPreview o => o -> IO PrintOperationPreview
toPrintOperationPreview = unsafeCastTo PrintOperationPreview

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

foreign import ccall "gtk_print_operation_preview_end_preview" gtk_print_operation_preview_end_preview :: 
    Ptr PrintOperationPreview ->            -- preview : TInterface (Name {namespace = "Gtk", name = "PrintOperationPreview"})
    IO ()

{- |
Ends a preview.

This function must be called to finish a custom print preview.

@since 2.10
-}
printOperationPreviewEndPreview ::
    (B.CallStack.HasCallStack, MonadIO m, IsPrintOperationPreview a) =>
    a
    {- ^ /@preview@/: a 'GI.Gtk.Interfaces.PrintOperationPreview.PrintOperationPreview' -}
    -> m ()
printOperationPreviewEndPreview preview = liftIO $ do
    preview' <- unsafeManagedPtrCastPtr preview
    gtk_print_operation_preview_end_preview preview'
    touchManagedPtr preview
    return ()

data PrintOperationPreviewEndPreviewMethodInfo
instance (signature ~ (m ()), MonadIO m, IsPrintOperationPreview a) => O.MethodInfo PrintOperationPreviewEndPreviewMethodInfo a signature where
    overloadedMethod _ = printOperationPreviewEndPreview

-- method PrintOperationPreview::is_selected
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "preview", argType = TInterface (Name {namespace = "Gtk", name = "PrintOperationPreview"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GtkPrintOperationPreview", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "page_nr", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a page number", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "gtk_print_operation_preview_is_selected" gtk_print_operation_preview_is_selected :: 
    Ptr PrintOperationPreview ->            -- preview : TInterface (Name {namespace = "Gtk", name = "PrintOperationPreview"})
    Int32 ->                                -- page_nr : TBasicType TInt
    IO CInt

{- |
Returns whether the given page is included in the set of pages that
have been selected for printing.

@since 2.10
-}
printOperationPreviewIsSelected ::
    (B.CallStack.HasCallStack, MonadIO m, IsPrintOperationPreview a) =>
    a
    {- ^ /@preview@/: a 'GI.Gtk.Interfaces.PrintOperationPreview.PrintOperationPreview' -}
    -> Int32
    {- ^ /@pageNr@/: a page number -}
    -> m Bool
    {- ^ __Returns:__ 'True' if the page has been selected for printing -}
printOperationPreviewIsSelected preview pageNr = liftIO $ do
    preview' <- unsafeManagedPtrCastPtr preview
    result <- gtk_print_operation_preview_is_selected preview' pageNr
    let result' = (/= 0) result
    touchManagedPtr preview
    return result'

data PrintOperationPreviewIsSelectedMethodInfo
instance (signature ~ (Int32 -> m Bool), MonadIO m, IsPrintOperationPreview a) => O.MethodInfo PrintOperationPreviewIsSelectedMethodInfo a signature where
    overloadedMethod _ = printOperationPreviewIsSelected

-- method PrintOperationPreview::render_page
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "preview", argType = TInterface (Name {namespace = "Gtk", name = "PrintOperationPreview"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GtkPrintOperationPreview", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "page_nr", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the page to render", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "gtk_print_operation_preview_render_page" gtk_print_operation_preview_render_page :: 
    Ptr PrintOperationPreview ->            -- preview : TInterface (Name {namespace = "Gtk", name = "PrintOperationPreview"})
    Int32 ->                                -- page_nr : TBasicType TInt
    IO ()

{- |
Renders a page to the preview, using the print context that
was passed to the 'GI.Gtk.Objects.PrintOperation.PrintOperation'::@/preview/@ handler together
with /@preview@/.

A custom iprint preview should use this function in its ::expose
handler to render the currently selected page.

Note that this function requires a suitable cairo context to
be associated with the print context.

@since 2.10
-}
printOperationPreviewRenderPage ::
    (B.CallStack.HasCallStack, MonadIO m, IsPrintOperationPreview a) =>
    a
    {- ^ /@preview@/: a 'GI.Gtk.Interfaces.PrintOperationPreview.PrintOperationPreview' -}
    -> Int32
    {- ^ /@pageNr@/: the page to render -}
    -> m ()
printOperationPreviewRenderPage preview pageNr = liftIO $ do
    preview' <- unsafeManagedPtrCastPtr preview
    gtk_print_operation_preview_render_page preview' pageNr
    touchManagedPtr preview
    return ()

data PrintOperationPreviewRenderPageMethodInfo
instance (signature ~ (Int32 -> m ()), MonadIO m, IsPrintOperationPreview a) => O.MethodInfo PrintOperationPreviewRenderPageMethodInfo a signature where
    overloadedMethod _ = printOperationPreviewRenderPage