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

module HROOT.Class.TArrow.Implementation where


import HROOT.TypeCast

import HROOT.Class.TArrow.RawType
import HROOT.Class.TArrow.FFI
import HROOT.Class.TArrow.Interface
import HROOT.Class.TArrow.Cast
import HROOT.Class.TClass.RawType
import HROOT.Class.TClass.Cast
import HROOT.Class.TClass.Interface
import HROOT.Class.TLine.RawType
import HROOT.Class.TLine.Cast
import HROOT.Class.TLine.Interface
import HROOT.Class.TAttFill.RawType
import HROOT.Class.TAttFill.Cast
import HROOT.Class.TAttFill.Interface
import HROOT.Class.TObject.RawType
import HROOT.Class.TObject.Cast
import HROOT.Class.TObject.Interface
import HROOT.Class.TAttLine.RawType
import HROOT.Class.TAttLine.Cast
import HROOT.Class.TAttLine.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 ITArrow TArrow where
instance ITLine TArrow where
  drawLine = xform4 c_tarrow_drawline
  drawLineNDC = xform4 c_tarrow_drawlinendc
  paintLine = xform4 c_tarrow_paintline
  paintLineNDC = xform4 c_tarrow_paintlinendc
  setX1 = xform1 c_tarrow_setx1
  setX2 = xform1 c_tarrow_setx2
  setY1 = xform1 c_tarrow_sety1
  setY2 = xform1 c_tarrow_sety2
instance ITAttFill TArrow where
  setFillColor = xform1 c_tarrow_setfillcolor
  setFillStyle = xform1 c_tarrow_setfillstyle
instance ITObject TArrow where
  draw = xform1 c_tarrow_draw
  findObject = xform1 c_tarrow_findobject
  getName = xform0 c_tarrow_getname
  isA = xform0 c_tarrow_isa
  isFolder = xform0 c_tarrow_isfolder
  isEqual = xform1 c_tarrow_isequal
  isSortable = xform0 c_tarrow_issortable
  paint = xform1 c_tarrow_paint
  printObj = xform1 c_tarrow_printobj
  recursiveRemove = xform1 c_tarrow_recursiveremove
  saveAs = xform2 c_tarrow_saveas
  useCurrentStyle = xform0 c_tarrow_usecurrentstyle
  write = xform3 c_tarrow_write
instance ITAttLine TArrow where
  getLineColor = xform0 c_tarrow_getlinecolor
  getLineStyle = xform0 c_tarrow_getlinestyle
  getLineWidth = xform0 c_tarrow_getlinewidth
  resetAttLine = xform1 c_tarrow_resetattline
  setLineAttributes = xform0 c_tarrow_setlineattributes
  setLineColor = xform1 c_tarrow_setlinecolor
  setLineStyle = xform1 c_tarrow_setlinestyle
  setLineWidth = xform1 c_tarrow_setlinewidth
instance IDeletable TArrow where
  delete = xform0 c_tarrow_delete

instance ITArrow (Exist TArrow) where

instance ITLine (Exist TArrow) where
  drawLine (ETArrow x) = drawLine x
  drawLineNDC (ETArrow x) = drawLineNDC x
  paintLine (ETArrow x) = paintLine x
  paintLineNDC (ETArrow x) = paintLineNDC x
  setX1 (ETArrow x) = setX1 x
  setX2 (ETArrow x) = setX2 x
  setY1 (ETArrow x) = setY1 x
  setY2 (ETArrow x) = setY2 x
instance ITAttFill (Exist TArrow) where
  setFillColor (ETArrow x) = setFillColor x
  setFillStyle (ETArrow x) = setFillStyle x
instance ITObject (Exist TArrow) where
  draw (ETArrow x) = draw x
  findObject (ETArrow x) = findObject x
  getName (ETArrow x) = getName x
  isA (ETArrow x) = isA x
  isFolder (ETArrow x) = isFolder x
  isEqual (ETArrow x) = isEqual x
  isSortable (ETArrow x) = isSortable x
  paint (ETArrow x) = paint x
  printObj (ETArrow x) = printObj x
  recursiveRemove (ETArrow x) = recursiveRemove x
  saveAs (ETArrow x) = saveAs x
  useCurrentStyle (ETArrow x) = useCurrentStyle x
  write (ETArrow x) = write x
instance ITAttLine (Exist TArrow) where
  getLineColor (ETArrow x) = getLineColor x
  getLineStyle (ETArrow x) = getLineStyle x
  getLineWidth (ETArrow x) = getLineWidth x
  resetAttLine (ETArrow x) = resetAttLine x
  setLineAttributes (ETArrow x) = setLineAttributes x
  setLineColor (ETArrow x) = setLineColor x
  setLineStyle (ETArrow x) = setLineStyle x
  setLineWidth (ETArrow x) = setLineWidth x
instance IDeletable (Exist TArrow) where
  delete (ETArrow x) = delete x


newTArrow :: Double -> Double -> Double -> Double -> Double -> String -> IO TArrow
newTArrow = xform5 c_tarrow_newtarrow



instance FPtr (Exist TArrow) where
  type Raw (Exist TArrow) = RawTArrow
  get_fptr (ETArrow obj) = castForeignPtr (get_fptr obj)
  cast_fptr_to_obj fptr = ETArrow (cast_fptr_to_obj (fptr :: ForeignPtr RawTArrow) :: TArrow)