{- |
Module : ToolBar.hs
Description : .
Maintainer : Kelvin Glaß, Chritoph Graebnitz, Kristin Knorr, Nicolas Lehmann (c)
License : MIT
Stability : experimental
The ToolBar-module depicts the tool bar at the top of the main window below the menu bar.
-}
module ToolBar (
create
)
where
-- imports --
import Data.IORef
import qualified KeyHandler as KH
import qualified FooterBar as FB
import qualified InteractionField as IDF
import qualified TextArea as TA
import qualified Graphics.UI.Gtk as Gtk
import qualified Interpreter as IN
import qualified Lexer
import qualified TextAreaContent as TAC
import qualified Data.Map as Map
import Control.Monad
-- functions --
processWith area dataBuffer funcBuffer fn = do
tac <- readIORef $ TA.textAreaContent area
intCtxt <- readIORef $ TAC.context tac
fn tac
intCtxt <- readIORef $ TAC.context tac
TA.redrawContent area
Gtk.textBufferSetText dataBuffer $ unlines $ map show $ TAC.dataStack intCtxt
Gtk.textBufferSetText funcBuffer $ unlines $ map (\(x,_,_)->x) $ TAC.funcStack intCtxt
let fS = TAC.funcStack intCtxt
if not (null fS)
then do
let ip = (\(_,x,_) -> (Lexer.posx x,Lexer.posy x)) $ head fS
print ip
else do
let ip = (0,0)
print ip
return True
-- | creates a toolbar
create area footer interDT= do
toolBar <- Gtk.menuBarNew
-- create step button
image <- Gtk.imageNewFromStock Gtk.stockMediaPlay Gtk.IconSizeMenu
step <- Gtk.imageMenuItemNewWithLabel ""
Gtk.imageMenuItemSetImage step image
Gtk.menuShellAppend toolBar step
-- create run button
imageD <- Gtk.imageNewFromStock Gtk.stockGoForward Gtk.IconSizeMenu
run <- Gtk.imageMenuItemNewWithLabel ""
Gtk.imageMenuItemSetImage run imageD
Gtk.menuShellAppend toolBar run
variables <- Gtk.menuItemNewWithLabel "variables"
reset <- Gtk.menuItemNewWithLabel "reset"
-- create mode-menu
mode <- Gtk.menuNew
-- create modes
insertMode <- Gtk.radioMenuItemNewWithLabel "insert"
replaceMode <- Gtk.radioMenuItemNewWithLabelFromWidget insertMode "replace"
smartMode <- Gtk.radioMenuItemNewWithLabelFromWidget insertMode "smart"
highlightCheck <- Gtk.checkMenuItemNewWithLabel "highlighting"
Gtk.checkMenuItemSetActive highlightCheck True
let dataBuffer = IDF.getDataStackBuffer interDT
let funcBuffer = IDF.getFunctionStackBuffer interDT
Gtk.onButtonPress run $ \event -> processWith area dataBuffer funcBuffer IN.interpret
Gtk.onButtonPress step $ \event -> processWith area dataBuffer funcBuffer IN.step
bufferVariables <- Gtk.textBufferNew Nothing
Gtk.onButtonPress variables $ \event -> do
tac <- readIORef $ TA.textAreaContent area
intCtxt <- readIORef $ TAC.context tac
let list = TAC.funcStack intCtxt
unless (null list) $ do
let vars = unlines $ map (\(x,y)-> x ++ " = " ++ show y) $ Map.toList $ (\(_,_,x) -> x)$ head list
Gtk.textBufferSetText bufferVariables vars
Gtk.postGUIAsync $ IDF.textViewWindowShow bufferVariables "Variables"
return True
Gtk.onButtonPress reset $ \event-> do
tac <- readIORef $ TA.textAreaContent area
Gtk.textBufferSetText bufferVariables ""
Gtk.textBufferSetText dataBuffer ""
Gtk.textBufferSetText funcBuffer ""
IN.reset tac
TA.redrawContent area
return True
-- set mode action
Gtk.on insertMode Gtk.menuItemActivate$ do
TA.setInputMode area KH.Insert
FB.setMode footer KH.Insert
Gtk.on replaceMode Gtk.menuItemActivate $ do
TA.setInputMode area KH.Replace
FB.setMode footer KH.Replace
Gtk.on smartMode Gtk.menuItemActivate$ do
TA.setInputMode area KH.Smart
FB.setMode footer KH.Smart
Gtk.on highlightCheck Gtk.menuItemActivate$ do
isActive <- Gtk.checkMenuItemGetActive highlightCheck
TA.setHighlighting area isActive
-- configure mode-menu
modeItem <- Gtk.menuItemNewWithLabel "mode"
Gtk.menuItemSetSubmenu modeItem mode
Gtk.menuShellAppend toolBar modeItem
Gtk.menuShellAppend mode insertMode
Gtk.menuShellAppend mode replaceMode
Gtk.menuShellAppend mode smartMode
Gtk.menuShellAppend mode highlightCheck
Gtk.menuShellAppend toolBar variables
Gtk.menuShellAppend toolBar reset
return toolBar