module Menu where import TextArea import Execute import Graphics.UI.Gtk import qualified Control.Exception as Exc import System.Exit import Data.Maybe import Control.Monad.IO.Class import Data.List {-TODO Refactor text to an 'link' to the entry text for the ability to save files Handels the button press and open or saves a file -} fileChooserEventHandler :: Window -> TextArea -> FileChooserDialog -> ResponseId -> String -> IO() fileChooserEventHandler window area fileChooser response mode |response == ResponseOk = do dir <- fileChooserGetFilename fileChooser let path = fromJust dir set window[windowTitle := path] case mode of "OpenFile" -> do content <- readFile path deserializeTextArea area content syntaxHighlighting area widgetDestroy fileChooser return() "SaveFile" -> do code <- (serializeTextAreaContent area) writeFile path code widgetDestroy fileChooser return() |response == ResponseCancel = do widgetDestroy fileChooser return () |otherwise = return () --checking for a legal path in window title to save whitout dialog saveFile :: Window -> TextArea -> IO Bool saveFile window area = do code <- serializeTextAreaContent area dir <- get window windowTitle if "/" `isInfixOf` dir && not("/" `isSuffixOf` dir) then do writeFile dir code return True else fileDialog window area "SaveFile" >> return True {- TODO Refactor text to an 'link' to the entry text for the ability to save files Passes the enventhandler for fileDialog and starts it -} runFileChooser :: Window -> TextArea -> FileChooserDialog -> String -> IO() runFileChooser window area fileChooser mode = do on fileChooser response hand dialogRun fileChooser return() where hand resp = fileChooserEventHandler window area fileChooser resp mode {- Setup a file chooser with modes OpenFile and SaveFile TODO Refactor text to an 'link' to the entry text for the ability to save files -} fileDialog :: Window -> TextArea -> String -> IO() fileDialog window area mode = do case mode of "OpenFile" -> do fileChooser <- fileChooserDialogNew (Just mode) (Just window) FileChooserActionOpen [("open",ResponseOk),("cancel",ResponseCancel)] runFileChooser window area fileChooser mode "SaveFile" -> do fileChooser <- fileChooserDialogNew (Just mode) (Just window) FileChooserActionSave [("save",ResponseOk),("cancel",ResponseCancel)] fileChooserSetDoOverwriteConfirmation fileChooser True runFileChooser window area fileChooser mode return () {- TODO Refactor text to an 'link' to the entry text for the ability to save files Setups the menu -} createMenu :: Window -> TextArea -> TextBuffer -> IO MenuBar createMenu window area output= do menuBar <- menuBarNew-- container for menus menuFile <- menuNew menuHelp <- menuNew menuFileItem <- menuItemNewWithLabel "File" menuOpenItem <- menuItemNewWithLabel "open crtl+o" menuSaveItem <- menuItemNewWithLabel "save ctrl+s" menuCloseItem <- menuItemNewWithLabel "quit ctrl+s" menuCompileItem <- menuItemNewWithLabel "compile ctrl+F5" menuHelpItem <- menuItemNewWithLabel "Help" menuAboutItem <- menuItemNewWithLabel "About" --Bind the subemenu to menu menuItemSetSubmenu menuFileItem menuFile menuItemSetSubmenu menuHelpItem menuHelp --File and Help menu menuShellAppend menuBar menuFileItem menuShellAppend menuBar menuHelpItem --Insert items in menus menuShellAppend menuFile menuOpenItem menuShellAppend menuFile menuSaveItem menuShellAppend menuFile menuCloseItem menuShellAppend menuFile menuCompileItem menuShellAppend menuHelp menuAboutItem --setting actions for the menu on menuOpenItem menuItemActivate (fileDialog window area "OpenFile") on menuSaveItem menuItemActivate (saveFile window area >> return()) on menuCloseItem menuItemActivate mainQuit on menuCompileItem menuItemActivate (compileOpenFile window area output >> return ()) --setting shortcuts in relation to menuBar on window keyPressEvent $ do modi <- eventModifier key <- eventKeyName liftIO $ case modi of [Control] -> case key of "q" -> mainQuit >> return True "s" -> saveFile window area >> return True "o" -> fileDialog window area "OpenFile" >> return True "F5" -> compileOpenFile window area output _ -> return False _ -> return False return menuBar compileOpenFile ::Window -> TextArea -> TextBuffer -> IO Bool compileOpenFile window area output = do textBufferSetText output "Compiling Execute" (exitCode,out,err) <-compile window if exitCode == (ExitSuccess) then textBufferSetText output "Compiling succsessful" else textBufferSetText output ("Compiling failed: "++['\n']++err) return True