{-# LINE 2 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
{-# LANGUAGE Rank2Types #-}
{-# LINE 3 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
module Graphics.UI.Gtk.ModelView.TreeModel (
  TreeModel,
  TreeModelClass,
  castToTreeModel, gTypeTreeModel,
  toTreeModel,
  TypedTreeModel,
  TypedTreeModelClass,
  toTypedTreeModel,
  TreeIter(..),
  TreePath,
  ColumnId,
  makeColumnIdInt,
  makeColumnIdBool,
  makeColumnIdString,
  makeColumnIdPixbuf,
  invalidColumnId,
  columnIdToNumber,
  stringToTreePath,
  treeModelGetFlags,
  treeModelGetIter,
  treeModelGetIterFromString,
  treeModelGetIterFirst,
  treeModelGetPath,
  treeModelGetValue,
  treeModelIterNext,
  treeModelIterChildren,
  treeModelIterHasChild,
  treeModelIterNChildren,
  treeModelIterNthChild,
  treeModelIterParent,
  treeModelForeach,
  treeModelGetStringFromIter,
  treeModelRefNode,
  treeModelUnrefNode,
  treeModelRowChanged,
  treeModelRowInserted,
  treeModelRowHasChildToggled,
  treeModelRowDeleted,
  treeModelRowsReordered,
  rowChanged,
  rowInserted,
  rowHasChildToggled,
  rowDeleted,
  rowsReordered,
  ) where
import Control.Monad (liftM)
import System.Glib.FFI
import System.Glib.Flags (toFlags)
import System.Glib.UTFString
import Graphics.UI.Gtk.Signals
{-# LINE 164 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
import Graphics.UI.Gtk.Types
{-# LINE 165 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
import System.Glib.GValue (GValue(GValue), allocaGValue)
import Graphics.UI.Gtk.ModelView.CustomStore (TreeModelFlags(..))
import Graphics.UI.Gtk.ModelView.Types (TypedTreeModel,
                                             TypedTreeModelClass,
                                             toTypedTreeModel,
                                             TreeIter(..),
                                             receiveTreeIter,
                                             peekTreeIter,
                                             TreePath,
                                             NativeTreePath(..),
                                             withTreePath,
                                             fromTreePath,
                                             peekTreePath,
                                             stringToTreePath,
                                             ColumnId(..),
                                             ColumnAccess(..))
import System.Glib.GValueTypes ( valueGetInt, valueGetBool,
                                     valueGetString, valueGetGObject )
{-# LINE 184 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
makeColumnIdInt :: Int -> ColumnId row Int
makeColumnIdInt = ColumnId valueGetInt CAInt
makeColumnIdBool :: Int -> ColumnId row Bool
makeColumnIdBool = ColumnId valueGetBool CABool
makeColumnIdString :: GlibString string => Int -> ColumnId row string
makeColumnIdString = ColumnId valueGetString CAString
makeColumnIdPixbuf :: Int -> ColumnId row Pixbuf
makeColumnIdPixbuf = ColumnId valueGetGObject CAPixbuf
columnIdToNumber :: ColumnId row ty -> Int
columnIdToNumber (ColumnId _ _ i) = i
invalidColumnId :: ColumnId row ty
invalidColumnId = ColumnId (error "invalidColumnId: no GValue extractor")
  (error "invalidColumnId: no access type") (-1)
instance Eq (ColumnId row ty) where
  (ColumnId _ _ i1) == (ColumnId _ _ i2) = i1==i2
instance Show (ColumnId row ty) where
  show (ColumnId _ _ i) = show i
treeModelGetFlags :: TreeModelClass self => self -> IO [TreeModelFlags]
treeModelGetFlags self =
  liftM (toFlags . fromIntegral) $
  (\(TreeModel arg1) -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_model_get_flags argPtr1)
{-# LINE 235 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
    (toTreeModel self)
treeModelGetIterFromString :: (TreeModelClass self, GlibString string) => self
 -> string 
 -> IO (Maybe TreeIter)
treeModelGetIterFromString self pathString =
  receiveTreeIter $ \iterPtr ->
  withUTFString pathString $ \pathStringPtr ->
  (\(TreeModel arg1) arg2 arg3 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_model_get_iter_from_string argPtr1 arg2 arg3)
{-# LINE 250 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
    (toTreeModel self)
    iterPtr
    pathStringPtr
treeModelGetIter :: TreeModelClass self => self
 -> TreePath 
 -> IO (Maybe TreeIter)
treeModelGetIter _ [] = return Nothing
treeModelGetIter self path =
  receiveTreeIter $ \iterPtr ->
  withTreePath path $ \path ->
  (\(TreeModel arg1) arg2 (NativeTreePath arg3) -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_model_get_iter argPtr1 arg2 arg3)
{-# LINE 269 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
    (toTreeModel self)
    iterPtr
    path
treeModelGetIterFirst :: TreeModelClass self => self
 -> IO (Maybe TreeIter)
treeModelGetIterFirst self =
  receiveTreeIter $ \iterPtr ->
  (\(TreeModel arg1) arg2 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_model_get_iter_first argPtr1 arg2)
{-# LINE 283 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
    (toTreeModel self)
    iterPtr
treeModelGetPath :: TreeModelClass self => self
 -> TreeIter -> IO TreePath
treeModelGetPath self iter =
  with iter $ \iterPtr ->
  (\(TreeModel arg1) arg2 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_model_get_path argPtr1 arg2)
{-# LINE 296 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
    (toTreeModel self)
    iterPtr
  >>= fromTreePath
treeModelGetValue :: TreeModelClass self => self
 -> TreeIter
 -> ColumnId row ty 
 -> IO ty
treeModelGetValue self iter (ColumnId getter _ colId) =
  allocaGValue $ \gVal ->
  with iter $ \iterPtr -> do
  (\(TreeModel arg1) arg2 arg3 (GValue arg4) -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_model_get_value argPtr1 arg2 arg3 arg4)
{-# LINE 310 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
    (toTreeModel self)
    iterPtr
    (fromIntegral colId)
    gVal
  getter gVal
treeModelIterNext :: TreeModelClass self => self -> TreeIter -> IO (Maybe TreeIter)
treeModelIterNext self iter =
  receiveTreeIter $ \iterPtr -> do
  poke iterPtr iter
  (\(TreeModel arg1) arg2 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_model_iter_next argPtr1 arg2)
{-# LINE 325 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
    (toTreeModel self)
    iterPtr
treeModelIterChildren :: TreeModelClass self => self
 -> TreeIter 
 -> IO (Maybe TreeIter)
treeModelIterChildren self parent =
  receiveTreeIter $ \iterPtr ->
  with parent $ \parentPtr ->
  (\(TreeModel arg1) arg2 arg3 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_model_iter_children argPtr1 arg2 arg3)
{-# LINE 339 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
    (toTreeModel self)
    iterPtr
    parentPtr
treeModelIterHasChild :: TreeModelClass self => self
 -> TreeIter 
 -> IO Bool 
treeModelIterHasChild self iter =
  liftM toBool $
  with iter $ \iterPtr ->
  (\(TreeModel arg1) arg2 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_model_iter_has_child argPtr1 arg2)
{-# LINE 353 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
    (toTreeModel self)
    iterPtr
treeModelIterNChildren :: TreeModelClass self => self
 -> Maybe TreeIter 
 -> IO Int 
treeModelIterNChildren self iter =
  liftM fromIntegral $
  maybeWith with iter $ \iterPtr ->
  (\(TreeModel arg1) arg2 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_model_iter_n_children argPtr1 arg2)
{-# LINE 367 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
    (toTreeModel self)
    iterPtr
treeModelIterNthChild :: TreeModelClass self => self
 -> Maybe TreeIter 
                   
 -> Int 
 -> IO (Maybe TreeIter)
treeModelIterNthChild self parent n =
  receiveTreeIter $ \iterPtr ->
  maybeWith with parent $ \parentPtr ->
  (\(TreeModel arg1) arg2 arg3 arg4 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_model_iter_nth_child argPtr1 arg2 arg3 arg4)
{-# LINE 385 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
    (toTreeModel self)
    iterPtr
    parentPtr
    (fromIntegral n)
treeModelIterParent :: TreeModelClass self => self
 -> TreeIter
 -> IO (Maybe TreeIter)
treeModelIterParent self child =
  receiveTreeIter $ \iterPtr ->
  with child $ \childPtr ->
  (\(TreeModel arg1) arg2 arg3 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_model_iter_parent argPtr1 arg2 arg3)
{-# LINE 400 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
    (toTreeModel self)
    iterPtr
    childPtr
treeModelForeach :: TreeModelClass self => self -> (TreeIter -> IO Bool) -> IO ()
treeModelForeach self fun = do
  fPtr <- mkTreeModelForeachFunc (\_ _ iterPtr _ -> do
    
    
    
    
    iter <- peek iterPtr
    liftM (fromIntegral.fromBool) $ fun iter
    )
  (\(TreeModel arg1) arg2 arg3 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_model_foreach argPtr1 arg2 arg3)
{-# LINE 420 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
    (toTreeModel self)
    fPtr
    nullPtr
  freeHaskellFunPtr fPtr
type TreeModelForeachFunc = FunPtr (((Ptr TreeModel) -> ((Ptr NativeTreePath) -> ((Ptr TreeIter) -> ((Ptr ()) -> (IO CInt))))))
{-# LINE 426 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
foreign import ccall "wrapper" mkTreeModelForeachFunc ::
  (Ptr TreeModel -> Ptr NativeTreePath -> Ptr TreeIter -> Ptr () -> IO CInt) ->
  IO TreeModelForeachFunc
treeModelGetStringFromIter :: (TreeModelClass self, GlibString string) => self
 -> TreeIter 
 -> IO string 
treeModelGetStringFromIter self iter = with iter $ \iter ->
  (\(TreeModel arg1) arg2 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_model_get_string_from_iter argPtr1 arg2)
{-# LINE 444 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
    (toTreeModel self)
    iter
  >>= readUTFString
treeModelRefNode :: TreeModelClass self => self
 -> TreeIter 
 -> IO ()
treeModelRefNode self iter = with iter $ \iter ->
  (\(TreeModel arg1) arg2 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_model_ref_node argPtr1 arg2)
{-# LINE 468 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
    (toTreeModel self)
    iter
treeModelUnrefNode :: TreeModelClass self => self
 -> TreeIter 
 -> IO ()
treeModelUnrefNode self iter = with iter $ \iter ->
  (\(TreeModel arg1) arg2 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_model_unref_node argPtr1 arg2)
{-# LINE 484 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
    (toTreeModel self)
    iter
treeModelRowChanged :: TreeModelClass self => self
 -> TreePath 
 -> TreeIter 
 -> IO ()
treeModelRowChanged self path iter =
  with iter $ \iter ->
  withTreePath path $ \path ->
  (\(TreeModel arg1) (NativeTreePath arg2) arg3 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_model_row_changed argPtr1 arg2 arg3)
{-# LINE 503 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
    (toTreeModel self)
    path
    iter
treeModelRowInserted :: TreeModelClass self => self
 -> TreePath 
 -> TreeIter 
 -> IO ()
treeModelRowInserted self path iter =
  with iter $ \iter ->
  withTreePath path $ \path ->
  (\(TreeModel arg1) (NativeTreePath arg2) arg3 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_model_row_inserted argPtr1 arg2 arg3)
{-# LINE 523 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
    (toTreeModel self)
    path
    iter
treeModelRowHasChildToggled :: TreeModelClass self => self
 -> TreePath 
 -> TreeIter 
 -> IO ()
treeModelRowHasChildToggled self path iter =
  with iter $ \iter ->
  withTreePath path $ \path ->
  (\(TreeModel arg1) (NativeTreePath arg2) arg3 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_model_row_has_child_toggled argPtr1 arg2 arg3)
{-# LINE 544 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
    (toTreeModel self)
    path
    iter
treeModelRowDeleted :: TreeModelClass self => self
 -> TreePath 
             
 -> IO ()
treeModelRowDeleted self path =
  withTreePath path $ \path ->
  (\(TreeModel arg1) (NativeTreePath arg2) -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_model_row_deleted argPtr1 arg2)
{-# LINE 566 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
    (toTreeModel self)
    path
treeModelRowsReordered :: TreeModelClass self => self
 -> TreePath 
             
 -> Maybe TreeIter 
                   
                   
 -> [Int] 
            
 -> IO ()
treeModelRowsReordered self path iter array = do
  n <- treeModelIterNChildren self iter
  let l = length array
  if n/=l then error ("treeModelRowsReordered: passed-in array is of size "
                      ++show l++" but there are "++show n++
                      " children at path "++show path) else
    withTreePath path $ \path ->
    maybeWith with iter $ \iter ->
    withArray (map fromIntegral array) $ \newOrderPtr ->
    (\(TreeModel arg1) (NativeTreePath arg2) arg3 arg4 -> withForeignPtr arg1 $ \argPtr1 ->gtk_tree_model_rows_reordered argPtr1 arg2 arg3 arg4)
{-# LINE 599 "./Graphics/UI/Gtk/ModelView/TreeModel.chs" #-}
      (toTreeModel self)
      path
      iter
      newOrderPtr
rowChanged :: TreeModelClass self => Signal self (TreePath -> TreeIter -> IO ())
rowChanged = Signal (connect_BOXED_BOXED__NONE "row-changed" peekTreePath peekTreeIter)
rowInserted :: TreeModelClass self => Signal self (TreePath -> TreeIter -> IO ())
rowInserted = Signal (connect_BOXED_BOXED__NONE "row-inserted" peekTreePath peekTreeIter)
rowHasChildToggled :: TreeModelClass self => Signal self (TreePath -> TreeIter -> IO ())
rowHasChildToggled = Signal (connect_BOXED_BOXED__NONE "row-has-child-toggled" peekTreePath peekTreeIter)
rowDeleted :: TreeModelClass self => Signal self (TreePath -> IO ())
rowDeleted = Signal (connect_BOXED__NONE "row-deleted" peekTreePath)
rowsReordered :: TreeModelClass self =>
                 Signal self (TreePath -> Maybe TreeIter -> [Int] -> IO ())
rowsReordered = Signal $ \after model user ->
  connect_BOXED_BOXED_PTR__NONE "rows-reordered" peekTreePath
    (maybePeek peekTreeIter) after model $ \path iter arrayPtr -> do
      n <- treeModelIterNChildren model iter
      
      newOrder <- peekArray n arrayPtr
      user path iter (map fromIntegral (newOrder :: [(CInt)]))
foreign import ccall safe "gtk_tree_model_get_flags"
  gtk_tree_model_get_flags :: ((Ptr TreeModel) -> (IO CInt))
foreign import ccall safe "gtk_tree_model_get_iter_from_string"
  gtk_tree_model_get_iter_from_string :: ((Ptr TreeModel) -> ((Ptr TreeIter) -> ((Ptr CChar) -> (IO CInt))))
foreign import ccall safe "gtk_tree_model_get_iter"
  gtk_tree_model_get_iter :: ((Ptr TreeModel) -> ((Ptr TreeIter) -> ((Ptr NativeTreePath) -> (IO CInt))))
foreign import ccall safe "gtk_tree_model_get_iter_first"
  gtk_tree_model_get_iter_first :: ((Ptr TreeModel) -> ((Ptr TreeIter) -> (IO CInt)))
foreign import ccall safe "gtk_tree_model_get_path"
  gtk_tree_model_get_path :: ((Ptr TreeModel) -> ((Ptr TreeIter) -> (IO (Ptr NativeTreePath))))
foreign import ccall safe "gtk_tree_model_get_value"
  gtk_tree_model_get_value :: ((Ptr TreeModel) -> ((Ptr TreeIter) -> (CInt -> ((Ptr GValue) -> (IO ())))))
foreign import ccall safe "gtk_tree_model_iter_next"
  gtk_tree_model_iter_next :: ((Ptr TreeModel) -> ((Ptr TreeIter) -> (IO CInt)))
foreign import ccall safe "gtk_tree_model_iter_children"
  gtk_tree_model_iter_children :: ((Ptr TreeModel) -> ((Ptr TreeIter) -> ((Ptr TreeIter) -> (IO CInt))))
foreign import ccall safe "gtk_tree_model_iter_has_child"
  gtk_tree_model_iter_has_child :: ((Ptr TreeModel) -> ((Ptr TreeIter) -> (IO CInt)))
foreign import ccall safe "gtk_tree_model_iter_n_children"
  gtk_tree_model_iter_n_children :: ((Ptr TreeModel) -> ((Ptr TreeIter) -> (IO CInt)))
foreign import ccall safe "gtk_tree_model_iter_nth_child"
  gtk_tree_model_iter_nth_child :: ((Ptr TreeModel) -> ((Ptr TreeIter) -> ((Ptr TreeIter) -> (CInt -> (IO CInt)))))
foreign import ccall safe "gtk_tree_model_iter_parent"
  gtk_tree_model_iter_parent :: ((Ptr TreeModel) -> ((Ptr TreeIter) -> ((Ptr TreeIter) -> (IO CInt))))
foreign import ccall safe "gtk_tree_model_foreach"
  gtk_tree_model_foreach :: ((Ptr TreeModel) -> ((FunPtr ((Ptr TreeModel) -> ((Ptr NativeTreePath) -> ((Ptr TreeIter) -> ((Ptr ()) -> (IO CInt)))))) -> ((Ptr ()) -> (IO ()))))
foreign import ccall safe "gtk_tree_model_get_string_from_iter"
  gtk_tree_model_get_string_from_iter :: ((Ptr TreeModel) -> ((Ptr TreeIter) -> (IO (Ptr CChar))))
foreign import ccall safe "gtk_tree_model_ref_node"
  gtk_tree_model_ref_node :: ((Ptr TreeModel) -> ((Ptr TreeIter) -> (IO ())))
foreign import ccall safe "gtk_tree_model_unref_node"
  gtk_tree_model_unref_node :: ((Ptr TreeModel) -> ((Ptr TreeIter) -> (IO ())))
foreign import ccall safe "gtk_tree_model_row_changed"
  gtk_tree_model_row_changed :: ((Ptr TreeModel) -> ((Ptr NativeTreePath) -> ((Ptr TreeIter) -> (IO ()))))
foreign import ccall safe "gtk_tree_model_row_inserted"
  gtk_tree_model_row_inserted :: ((Ptr TreeModel) -> ((Ptr NativeTreePath) -> ((Ptr TreeIter) -> (IO ()))))
foreign import ccall safe "gtk_tree_model_row_has_child_toggled"
  gtk_tree_model_row_has_child_toggled :: ((Ptr TreeModel) -> ((Ptr NativeTreePath) -> ((Ptr TreeIter) -> (IO ()))))
foreign import ccall safe "gtk_tree_model_row_deleted"
  gtk_tree_model_row_deleted :: ((Ptr TreeModel) -> ((Ptr NativeTreePath) -> (IO ())))
foreign import ccall safe "gtk_tree_model_rows_reordered"
  gtk_tree_model_rows_reordered :: ((Ptr TreeModel) -> ((Ptr NativeTreePath) -> ((Ptr TreeIter) -> ((Ptr CInt) -> (IO ())))))