{- |
Module : MainWindow.hs
Description : .
Maintainer : Kelvin Glaß, Chritoph Graebnitz, Kristin Knorr, Nicolas Lehmann (c)
License : MIT
Stability : experimental
The MainWindow-module depicts the main window of the editor.
-}
module MainWindow (
create
)
where
-- imports --
import qualified Graphics.UI.Gtk as Gtk
import qualified MenuBar as MB
import qualified ToolBar as TB
import qualified FooterBar as FB
import qualified TextArea as TA
import TextAreaContent as TAC
import qualified InteractionField as IAF
import Data.IORef
import qualified Interpreter as IN
import qualified Paths_rail_compiler_editor as Path
import Control.Monad
-- functions --
afterEvent evt ta footer =
evt (TA.drawingArea ta) $ \event -> do
let posRef = TA.currentPosition ta
readIORef posRef >>= FB.setPosition footer
return True
-- | creates a mainWindow
create :: IO ()
create = do
Gtk.initGUI
-- create and configure main window
window <- Gtk.windowNew
iconpath <- Path.getDataFileName "data/icon.png"
pb <- Gtk.pixbufNewFromFile iconpath
Gtk.windowSetIcon window (Just pb)
Gtk.onDestroy window Gtk.mainQuit
interDT <- IAF.create
let boxView = IAF.getContainer interDT
footer <- FB.create
let hboxInfoLine = FB.getContainer footer
-- create TextArea with TextAreaContent
tac <- TAC.init 100 100 (IAF.getInputBuffer interDT) (IAF.getOutputBuffer interDT)
ta <- TA.initTextAreaWithContent tac
lwin <- TA.getTextAreaContainer ta
-- reset label with current position
afterEvent Gtk.afterKeyPress ta footer
afterEvent Gtk.afterButtonPress ta footer
-- pack TextArea and InteractionField
boxLay <- Gtk.hBoxNew False 0
Gtk.boxPackStart boxLay lwin Gtk.PackGrow 1
vSep <- Gtk.vSeparatorNew
Gtk.boxPackStart boxLay vSep Gtk.PackNatural 2
Gtk.boxPackEnd boxLay boxView Gtk.PackNatural 1
table <- Gtk.tableNew 5 1 False
-- avoid setting focus through key-events
Gtk.containerSetFocusChain table [Gtk.toWidget $ TA.drawingArea ta]
-- buffer for plug 'n' play
let bufferOut = IAF.getOutputBuffer interDT
let bufferIn = IAF.getInputBuffer interDT
Gtk.on bufferIn Gtk.bufferInsertText $ \iter string -> do
putStrLn "In"
tac <- readIORef (TA.textAreaContent ta)
cnt <- readIORef (TAC.context tac)
let flags = TAC.railFlags cnt
if TAC.Interpret `elem` flags
then IN.interpret tac
else when (TAC.Step `elem` flags) $ IN.step tac
menuBar <- MB.create window ta bufferOut bufferIn
extraBar <- TB.create ta footer interDT
vSepa <- Gtk.hSeparatorNew
-- fill table layout
Gtk.tableAttach table menuBar 0 1 0 1 [Gtk.Fill] [Gtk.Fill] 0 0
Gtk.tableAttach table extraBar 0 1 1 2 [Gtk.Fill] [Gtk.Fill] 0 0
Gtk.tableAttach table boxLay 0 1 2 3 [Gtk.Expand,Gtk.Fill] [Gtk.Expand,Gtk.Fill] 0 0
Gtk.tableAttach table vSepa 0 1 3 4 [Gtk.Fill] [Gtk.Fill] 0 0
Gtk.tableAttach table hboxInfoLine 0 1 4 5 [Gtk.Fill] [Gtk.Fill] 2 2
Gtk.set window [Gtk.containerChild Gtk.:= table,
Gtk.windowDefaultHeight Gtk.:= 550,
Gtk.windowDefaultWidth Gtk.:= 850,
Gtk.windowWindowPosition Gtk.:= Gtk.WinPosCenter]
Gtk.widgetShowAll window
Gtk.mainGUI