import TestSample          ( myConfig, Config(..), TestTalker )
import Control.EventDriven ( putEvent_, initializeTalker )
import Graphics.UI.Gtk
import Graphics.UI.Gtk.Gdk.GC
import Graphics.Rendering.Cairo
import Data.IORef

data Config2 iface = Config2 {

  initialize :: IO iface

 }

{-
gtkConfig :: Config2 ( IORef String )
gtkConfig = Config2 {

--  initialize = initializeGtk

 }
-}

{-
initializeGtk ::
  IO ( IORef TestTalker, IORef String, IORef String, PangoLayout )
-}
initializeGtk = do

  talker  <- newIORef $ initializeTalker ( initV myConfig ) ( kbind myConfig )
  buffer  <- newIORef ""
  monitor <- newIORef ""

  initGUI
  window <- windowNew
  canvas <- drawingAreaNew
  set window [ containerChild := canvas ]
  pc  <- cairoCreateContext Nothing
  lay <- layoutText pc ""

  on canvas exposeEvent $ do
    win <- eventWindow
    liftIO $ do
      gc <- gcNew win
      renderWithDrawable win $ do
        moveTo 0 0
        showLayout lay
    return True

  onDestroy window mainQuit

  return ( window, canvas, talker, buffer, monitor, lay )

main :: IO ()
main = do

  ( window, canvas, talker, buffer, monitor, lay ) <- initializeGtk

  on window keyPressEvent $ do
    keyNam  <- eventKeyName
    keyChar <- fmap keyToChar eventKeyVal
    liftIO $ case ( keyChar, keyNam ) of
         ( Nothing, "Return" ) -> do
           cmd <- readIORef buffer
           tk  <- readIORef talker
           let outputToCanvas n = do
                 modifyIORef monitor (++ '\n' : show n)
                 return n
           mtk <- putEvent_ ( ebind myConfig ) outputToCanvas tk cmd
           case mtk of
                Nothing  -> mainQuit
                Just ntk -> writeIORef talker ntk
           writeIORef buffer ""
           modifyIORef monitor (++ "\n")
         ( Just c , _        ) -> do modifyIORef buffer  (++ [ c ])
                                     modifyIORef monitor (++ [ c ])
         _                     -> return ()
    liftIO $ do
      cmd <- readIORef monitor
      layoutSetText lay cmd
      widgetQueueDraw canvas
    return True

  widgetShowAll window
  mainGUI
