import Graphics.UI.Gtk
import Graphics.UI.Gtk.Gdk.GC

---------------------------------------------------------------------------

main :: IO ()
-- choose the one you want!
--main = main1
--main = main2
--main = main3
--main = main4
--main = main5
main = main6
--main = main7

---------------------------------------------------------------------------
-- window

main1 :: IO ()
main1 =
  do initGUI
     win <- windowNew
     windowSetTitle win "My Title"
     win `onDestroy` mainQuit
     widgetShowAll win
     mainGUI

---------------------------------------------------------------------------
-- button

main2 :: IO ()
main2 =
  do initGUI
     win <- windowNew
     windowSetTitle win "My Title"
     win `onDestroy` mainQuit

     but <- buttonNewWithLabel "Click Me!"
     but `onClicked` putStrLn "someone clicked on me!"
       
     containerAdd win but
     widgetShowAll win
     mainGUI

---------------------------------------------------------------------------
-- layout

main3 :: IO ()
main3 =
  do initGUI
     win <- windowNew
     windowSetTitle win "My Title"
     win `onDestroy` mainQuit

     apa  <- buttonNewWithLabel "Apa"
     bepa <- buttonNewWithLabel "Bepa"
     cepa <- buttonNewWithLabel "Cepa"

     row  <- hBoxNew False 5
     containerAdd row apa
     containerAdd row bepa
     containerAdd row cepa

     containerAdd win row
     widgetShowAll win
     mainGUI

---------------------------------------------------------------------------
-- label

main4 :: IO ()
main4 =
  do initGUI
     win <- windowNew
     windowSetTitle win "My Title"
     win `onDestroy` mainQuit

     lab <- labelNew Nothing
     labelSetText lab "Some other text"
       
     containerAdd win lab
     widgetShowAll win
     mainGUI

---------------------------------------------------------------------------
-- entry

main5 :: IO ()
main5 =
  do initGUI
     win <- windowNew
     windowSetTitle win "My Title"
     win `onDestroy` mainQuit

     ent <- entryNew
     entrySetText ent "(type here and press Return)"
     ent `onEntryActivate` do s <- entryGetText ent
                              print s
       
     containerAdd win ent
     widgetShowAll win
     mainGUI

---------------------------------------------------------------------------
-- canvas

main6 :: IO ()
main6 =
  do initGUI
     win <- windowNew
     windowSetTitle win "My Title"
     win `onDestroy` mainQuit

     can <- drawingAreaNew
     can `onSizeRequest` return (Requisition 500 300)
     can `onExpose` drawCanvas1 can -- choose here!

     containerAdd win can
     widgetShowAll win
     mainGUI

drawCanvas1 :: DrawingArea -> event -> IO Bool
drawCanvas1 can _evt =
  do dw <- widgetGetDrawWindow can
     drawWindowClear dw
     gc <- gcNew dw
     drawLine dw gc (10,10) (100,100)
     return True -- everything is OK

drawCanvas2 :: DrawingArea -> event -> IO Bool
drawCanvas2 can _evt =
  do dw <- widgetGetDrawWindow can
     drawWindowClear dw
     redAndThick <- gcNewWithValues dw newGCValues{ foreground = red
                                                  , lineWidth  = 5
                                                  }
     drawLine dw redAndThick (10,10) (100,100)
     return True -- everything is OK
 where
  red = Color 65535 0 0

---------------------------------------------------------------------------
-- mouse

main7 :: IO ()
main7 =
  do initGUI
     win <- windowNew
     windowSetTitle win "My Title"
     win `onDestroy` mainQuit

     can <- drawingAreaNew
     can `onSizeRequest` return (Requisition 500 300)
     can `onButtonPress` mouseClick can

     containerAdd win can
     widgetShowAll win
     mainGUI

mouseClick :: DrawingArea -> event -> IO Bool
mouseClick can _evt =
  do p <- widgetGetPointer can
     putStrLn ("clicked: " ++ show p)
     return True -- everything is OK

---------------------------------------------------------------------------