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

module HROOT.Class.TLine.Implementation where


import HROOT.TypeCast

import HROOT.Class.TLine.RawType
import HROOT.Class.TLine.FFI
import HROOT.Class.TLine.Interface
import HROOT.Class.TLine.Cast
import HROOT.Class.TClass.RawType
import HROOT.Class.TClass.Cast
import HROOT.Class.TClass.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 ITLine TLine where
  drawLine = xform4 c_tline_drawline
  drawLineNDC = xform4 c_tline_drawlinendc
  paintLine = xform4 c_tline_paintline
  paintLineNDC = xform4 c_tline_paintlinendc
  setX1 = xform1 c_tline_setx1
  setX2 = xform1 c_tline_setx2
  setY1 = xform1 c_tline_sety1
  setY2 = xform1 c_tline_sety2
instance ITObject TLine where
  draw = xform1 c_tline_draw
  findObject = xform1 c_tline_findobject
  getName = xform0 c_tline_getname
  isA = xform0 c_tline_isa
  isFolder = xform0 c_tline_isfolder
  isEqual = xform1 c_tline_isequal
  isSortable = xform0 c_tline_issortable
  paint = xform1 c_tline_paint
  printObj = xform1 c_tline_printobj
  recursiveRemove = xform1 c_tline_recursiveremove
  saveAs = xform2 c_tline_saveas
  useCurrentStyle = xform0 c_tline_usecurrentstyle
  write = xform3 c_tline_write
instance ITAttLine TLine where
  getLineColor = xform0 c_tline_getlinecolor
  getLineStyle = xform0 c_tline_getlinestyle
  getLineWidth = xform0 c_tline_getlinewidth
  resetAttLine = xform1 c_tline_resetattline
  setLineAttributes = xform0 c_tline_setlineattributes
  setLineColor = xform1 c_tline_setlinecolor
  setLineStyle = xform1 c_tline_setlinestyle
  setLineWidth = xform1 c_tline_setlinewidth
instance IDeletable TLine where
  delete = xform0 c_tline_delete

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


newTLine :: Double -> Double -> Double -> Double -> IO TLine
newTLine = xform3 c_tline_newtline

tLineGetX1 :: TLine -> IO Double
tLineGetX1 = xform0 c_tline_tlinegetx1

tLineGetX2 :: TLine -> IO Double
tLineGetX2 = xform0 c_tline_tlinegetx2

tLineGetY1 :: TLine -> IO Double
tLineGetY1 = xform0 c_tline_tlinegety1

tLineGetY2 :: TLine -> IO Double
tLineGetY2 = xform0 c_tline_tlinegety2

tLineIsHorizontal :: TLine -> IO Int
tLineIsHorizontal = xform0 c_tline_tlineishorizontal

tLineIsVertical :: TLine -> IO Int
tLineIsVertical = xform0 c_tline_tlineisvertical

tLineSetHorizontal :: TLine -> Int -> IO ()
tLineSetHorizontal = xform1 c_tline_tlinesethorizontal

tLineSetVertical :: TLine -> Int -> IO ()
tLineSetVertical = xform1 c_tline_tlinesetvertical



instance FPtr (Exist TLine) where
  type Raw (Exist TLine) = RawTLine
  get_fptr (ETLine obj) = castForeignPtr (get_fptr obj)
  cast_fptr_to_obj fptr = ETLine (cast_fptr_to_obj (fptr :: ForeignPtr RawTLine) :: TLine)