{-# LANGUAGE ForeignFunctionInterface, TypeFamilies, MultiParamTypeClasses, 
             FlexibleInstances, TypeSynonymInstances, EmptyDataDecls, 
             OverlappingInstances, IncoherentInstances #-}

module HROOT.Class.TFile.Implementation where


import HROOT.TypeCast

import HROOT.Class.TFile.RawType
import HROOT.Class.TFile.FFI
import HROOT.Class.TFile.Interface
import HROOT.Class.TFile.Cast
import HROOT.Class.TList.RawType
import HROOT.Class.TList.Cast
import HROOT.Class.TList.Interface
import HROOT.Class.TKey.RawType
import HROOT.Class.TKey.Cast
import HROOT.Class.TKey.Interface
import HROOT.Class.TClass.RawType
import HROOT.Class.TClass.Cast
import HROOT.Class.TClass.Interface
import HROOT.Class.TDirectoryFile.RawType
import HROOT.Class.TDirectoryFile.Cast
import HROOT.Class.TDirectoryFile.Interface
import HROOT.Class.TDirectory.RawType
import HROOT.Class.TDirectory.Cast
import HROOT.Class.TDirectory.Interface
import HROOT.Class.TNamed.RawType
import HROOT.Class.TNamed.Cast
import HROOT.Class.TNamed.Interface
import HROOT.Class.TObject.RawType
import HROOT.Class.TObject.Cast
import HROOT.Class.TObject.Interface
import HROOT.Class.Deletable.RawType
import HROOT.Class.Deletable.Cast
import HROOT.Class.Deletable.Interface

import Data.Word
-- import Foreign.C            
-- import Foreign.Ptr
import Foreign.ForeignPtr

import System.IO.Unsafe


instance ITFile TFile where
instance ITDirectoryFile TFile where
  getListOfKeys = xform0 c_tfile_getlistofkeys
instance ITDirectory TFile where
  append = xform2 c_tfile_append
  addD = xform2 c_tfile_addd
  appendKey = xform1 c_tfile_appendkey
  close = xform1 c_tfile_close
  get = xform1 c_tfile_get
instance ITNamed TFile where
  setName = xform1 c_tfile_setname
  setNameTitle = xform2 c_tfile_setnametitle
  setTitle = xform1 c_tfile_settitle
instance ITObject TFile where
  draw = xform1 c_tfile_draw
  findObject = xform1 c_tfile_findobject
  getName = xform0 c_tfile_getname
  isA = xform0 c_tfile_isa
  isFolder = xform0 c_tfile_isfolder
  isEqual = xform1 c_tfile_isequal
  isSortable = xform0 c_tfile_issortable
  paint = xform1 c_tfile_paint
  printObj = xform1 c_tfile_printobj
  recursiveRemove = xform1 c_tfile_recursiveremove
  saveAs = xform2 c_tfile_saveas
  useCurrentStyle = xform0 c_tfile_usecurrentstyle
  write = xform3 c_tfile_write
instance IDeletable TFile where
  delete = xform0 c_tfile_delete

instance ITFile (Exist TFile) where

instance ITDirectoryFile (Exist TFile) where
  getListOfKeys (ETFile x) = getListOfKeys x
instance ITDirectory (Exist TFile) where
  append (ETFile x) = append x
  addD (ETFile x) = addD x
  appendKey (ETFile x) = appendKey x
  close (ETFile x) = close x
  get (ETFile x) = get x
instance ITNamed (Exist TFile) where
  setName (ETFile x) = setName x
  setNameTitle (ETFile x) = setNameTitle x
  setTitle (ETFile x) = setTitle x
instance ITObject (Exist TFile) where
  draw (ETFile x) = draw x
  findObject (ETFile x) = findObject x
  getName (ETFile x) = getName x
  isA (ETFile x) = isA x
  isFolder (ETFile x) = isFolder x
  isEqual (ETFile x) = isEqual x
  isSortable (ETFile x) = isSortable x
  paint (ETFile x) = paint x
  printObj (ETFile x) = printObj x
  recursiveRemove (ETFile x) = recursiveRemove x
  saveAs (ETFile x) = saveAs x
  useCurrentStyle (ETFile x) = useCurrentStyle x
  write (ETFile x) = write x
instance IDeletable (Exist TFile) where
  delete (ETFile x) = delete x


newTFile :: String -> String -> String -> Int -> IO TFile
newTFile = xform3 c_tfile_newtfile





instance FPtr (Exist TFile) where
  type Raw (Exist TFile) = RawTFile
  get_fptr (ETFile obj) = castForeignPtr (get_fptr obj)
  cast_fptr_to_obj fptr = ETFile (cast_fptr_to_obj (fptr :: ForeignPtr RawTFile) :: TFile)