{-# LINE 2 "./Graphics/UI/Gtk/ModelView/TreeSortable.chs" #-}
module Graphics.UI.Gtk.ModelView.TreeSortable (
  TreeSortable,
  TreeSortableClass,
  castToTreeSortable, gTypeTreeSortable,
  toTreeSortable,
  SortColumnId,
  treeSortableDefaultSortColumnId,
  treeSortableGetSortColumnId,
  treeSortableSetSortColumnId,
  treeSortableSetSortFunc,
  treeSortableSetDefaultSortFunc,
  treeSortableHasDefaultSortFunc,
  treeSortableSortColumnChanged,
  sortColumnChanged
  ) where
import Control.Monad (liftM)
import System.Glib.FFI
import Graphics.UI.Gtk.Types
{-# LINE 95 "./Graphics/UI/Gtk/ModelView/TreeSortable.chs" #-}
import Graphics.UI.Gtk.General.Enums (SortType(..))
import Graphics.UI.Gtk.Signals
{-# LINE 97 "./Graphics/UI/Gtk/ModelView/TreeSortable.chs" #-}
import Graphics.UI.Gtk.ModelView.Types
{-# LINE 98 "./Graphics/UI/Gtk/ModelView/TreeSortable.chs" #-}
import Graphics.UI.Gtk.General.Structs (SortColumnId,
                                         treeSortableDefaultSortColumnId )
{-# LINE 102 "./Graphics/UI/Gtk/ModelView/TreeSortable.chs" #-}
treeSortableGetSortColumnId :: TreeSortableClass self => self
 -> IO (SortType, Bool, SortColumnId) 
                     
                     
                     
treeSortableGetSortColumnId self =
  alloca $ \orderPtr -> alloca $ \sortColumnIdPtr -> do
  columnSet <- liftM toBool $ (\(TreeSortable arg1) arg2 arg3 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_sortable_get_sort_column_id argPtr1 arg2 arg3)
{-# LINE 119 "./Graphics/UI/Gtk/ModelView/TreeSortable.chs" #-}
    (toTreeSortable self)
    sortColumnIdPtr
    orderPtr
  order <- peek orderPtr
  sortColumnId <- peek sortColumnIdPtr
  return (toEnum (fromIntegral order), columnSet, fromIntegral sortColumnId)
treeSortableSetSortColumnId :: TreeSortableClass self => self
 -> SortColumnId 
 -> SortType 
 -> IO ()
treeSortableSetSortColumnId self sortColumnId order =
  (\(TreeSortable arg1) arg2 arg3 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_sortable_set_sort_column_id argPtr1 arg2 arg3)
{-# LINE 140 "./Graphics/UI/Gtk/ModelView/TreeSortable.chs" #-}
    (toTreeSortable self)
    (fromIntegral sortColumnId)
    ((fromIntegral . fromEnum) order)
treeSortableSetSortFunc :: TreeSortableClass self => self
 -> SortColumnId 
                                
 -> (TreeIter -> TreeIter -> IO Ordering)
                                
 -> IO ()
treeSortableSetSortFunc self sortColumnId sortFunc = do
  fPtr <- mkTreeIterCompareFunc (\_ iter1Ptr iter2Ptr _ -> do
    iter1 <- peek iter1Ptr
    iter2 <- peek iter2Ptr
    liftM orderToGInt $ sortFunc iter1 iter2)
  (\(TreeSortable arg1) arg2 arg3 arg4 arg5 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_sortable_set_sort_func argPtr1 arg2 arg3 arg4 arg5)
{-# LINE 162 "./Graphics/UI/Gtk/ModelView/TreeSortable.chs" #-}
    (toTreeSortable self)
    (fromIntegral sortColumnId)
    fPtr (castFunPtrToPtr fPtr) destroyFunPtr
orderToGInt :: Ordering -> (CInt)
{-# LINE 167 "./Graphics/UI/Gtk/ModelView/TreeSortable.chs" #-}
orderToGInt LT = -1
orderToGInt EQ = 0
orderToGInt GT = 1
type TreeIterCompareFunc = FunPtr (((Ptr TreeModel) -> ((Ptr TreeIter) -> ((Ptr TreeIter) -> ((Ptr ()) -> (IO CInt))))))
{-# LINE 172 "./Graphics/UI/Gtk/ModelView/TreeSortable.chs" #-}
foreign import ccall "wrapper" mkTreeIterCompareFunc ::
  (Ptr TreeModel -> Ptr TreeIter -> Ptr TreeIter -> Ptr () -> IO (CInt)) ->
  IO TreeIterCompareFunc
treeSortableSetDefaultSortFunc :: TreeSortableClass self => self
 -> Maybe (TreeIter -> TreeIter -> IO Ordering)
                                
                                
 -> IO ()
treeSortableSetDefaultSortFunc self Nothing = do
  (\(TreeSortable arg1) arg2 arg3 arg4 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_sortable_set_default_sort_func argPtr1 arg2 arg3 arg4)
{-# LINE 194 "./Graphics/UI/Gtk/ModelView/TreeSortable.chs" #-}
    (toTreeSortable self)
    nullFunPtr nullPtr nullFunPtr
treeSortableSetDefaultSortFunc self (Just sortFunc) = do
  fPtr <- mkTreeIterCompareFunc (\_ iter1Ptr iter2Ptr _ -> do
    iter1 <- peek iter1Ptr
    iter2 <- peek iter2Ptr
    liftM orderToGInt $ sortFunc iter1 iter2)
  (\(TreeSortable arg1) arg2 arg3 arg4 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_sortable_set_default_sort_func argPtr1 arg2 arg3 arg4)
{-# LINE 202 "./Graphics/UI/Gtk/ModelView/TreeSortable.chs" #-}
    (toTreeSortable self)
    fPtr (castFunPtrToPtr fPtr) destroyFunPtr
treeSortableSortColumnChanged :: TreeSortableClass self => self -> IO ()
treeSortableSortColumnChanged self =
  (\(TreeSortable arg1) -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_sortable_sort_column_changed argPtr1)
{-# LINE 211 "./Graphics/UI/Gtk/ModelView/TreeSortable.chs" #-}
    (toTreeSortable self)
treeSortableHasDefaultSortFunc :: TreeSortableClass self => self
 -> IO Bool 
treeSortableHasDefaultSortFunc self =
  liftM toBool $
  (\(TreeSortable arg1) -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_sortable_has_default_sort_func argPtr1)
{-# LINE 224 "./Graphics/UI/Gtk/ModelView/TreeSortable.chs" #-}
    (toTreeSortable self)
sortColumnChanged :: TreeSortableClass self => Signal self (IO ())
sortColumnChanged = Signal (connect_NONE__NONE "sort-column-changed")
foreign import ccall unsafe "gtk_tree_sortable_get_sort_column_id"
  gtk_tree_sortable_get_sort_column_id :: ((Ptr TreeSortable) -> ((Ptr CInt) -> ((Ptr CInt) -> (IO CInt))))
foreign import ccall safe "gtk_tree_sortable_set_sort_column_id"
  gtk_tree_sortable_set_sort_column_id :: ((Ptr TreeSortable) -> (CInt -> (CInt -> (IO ()))))
foreign import ccall safe "gtk_tree_sortable_set_sort_func"
  gtk_tree_sortable_set_sort_func :: ((Ptr TreeSortable) -> (CInt -> ((FunPtr ((Ptr TreeModel) -> ((Ptr TreeIter) -> ((Ptr TreeIter) -> ((Ptr ()) -> (IO CInt)))))) -> ((Ptr ()) -> ((FunPtr ((Ptr ()) -> (IO ()))) -> (IO ()))))))
foreign import ccall safe "gtk_tree_sortable_set_default_sort_func"
  gtk_tree_sortable_set_default_sort_func :: ((Ptr TreeSortable) -> ((FunPtr ((Ptr TreeModel) -> ((Ptr TreeIter) -> ((Ptr TreeIter) -> ((Ptr ()) -> (IO CInt)))))) -> ((Ptr ()) -> ((FunPtr ((Ptr ()) -> (IO ()))) -> (IO ())))))
foreign import ccall safe "gtk_tree_sortable_sort_column_changed"
  gtk_tree_sortable_sort_column_changed :: ((Ptr TreeSortable) -> (IO ()))
foreign import ccall safe "gtk_tree_sortable_has_default_sort_func"
  gtk_tree_sortable_has_default_sort_func :: ((Ptr TreeSortable) -> (IO CInt))