-- an eyeball test for unicode handling
-- loads a file of UTF-8 encoded strings (hardcoded below) and displays widgets
-- for each one of the strings
-- Eric Kow 2006

module Main where

import UTF8

import Graphics.UI.WX
import Graphics.UI.WXCore
import System.IO
import Control.Monad (liftM)
import Data.Word (Word8)
import Foreign.Marshal.Array

main :: IO ()
main = start sampler

sampler :: IO ()
sampler =
 do f  <- frame [text := "UTF-8 viewer"]
    pnl <- panel f []
    nb  <- notebook pnl []
    --
    sLines <- liftM lines readTestFile
    let bunchOf label thing =
         do p  <- panel nb []
            ws <- mapM (\t -> thing p [ text := t, tooltip := t ]) sLines
            return $ tab label $ container p $ margin 10 $ column 1 $ map widget ws
        bunchOfSel label thing =
         do p <- panel nb []
            w <- thing p [on select ::= logSelect sLines]
            return $ tab label $ container p $ margin 10 $ widget w
    -- manually created tabs
    p1 <- panel nb []
    let for1 thing =
          do w <- thing p1 [ on select ::= logSelect sLines, items := sLines ]
             set w [ selection := 0 ]
             return w
    p1choice <- for1 choice
    p1combo  <- for1 comboBox
    p1slist  <- for1 singleListBox
    p1mlist  <- multiListBox p1 [ items := sLines ]
    let t1 = tab "Selectors" $ container p1 $ margin 10 $ column 1 $
             [ label "choice", widget p1choice
             , label "combo" , widget p1combo
             , label "s-list", widget p1slist
             , label "m-list", widget p1mlist ]
    p2 <- panel nb []
    let t2 = tab "Labels" $ container p2 $ column 1 $ map label sLines
    --
    textlog <- textCtrl pnl [enabled := False, wrap := WrapNone]
    textCtrlMakeLogActiveTarget textlog
    logMessage "logging enabled"
    --
    ts <- sequence [ bunchOf "Static" staticText
                   , bunchOf "TextEntry" textEntry
                   , bunchOf "Checks" checkBox
                   , bunchOf "Buttons" button
                   , bunchOfSel "Radio"  (\p -> radioBox p Vertical sLines)
                   ]
    --
    set f [layout := container pnl $ hfill $ column 0
            [ hfill $ tabs nb $ t1:t2:ts
            , hfill $ widget textlog ]
          ]
 where
    logSelect labels w
      = do i <- get w selection
           s <- get w (item i)
           logMessage ("selected index: " ++ show i ++ ": " ++ s)

--  from the mailing list
hGetBytes :: Handle -> Int -> IO [Word8]
hGetBytes h c = allocaArray c $ \p ->
                  do c' <- hGetBuf h p c
                     peekArray c' p

readTestFile :: IO String
readTestFile =
 do h  <- openBinaryFile testFile ReadMode
    hsize <- hFileSize h
    ws <- hGetBytes h $ fromIntegral hsize
    return . fst . decode $ ws

testFile :: FilePath
testFile = "utf-tests"
