module Controller.Menu.File.Save (saveAsEventHandler,saveEventHandler) where import Control.Monad (forM) import Control.Monad.Trans (liftIO) import Controller (Controller,onGridView,onGridModel) import Controller.Dialog (saveFileDialog) import View.Component.Grid (getRowLabel,getColumnLabel ,numDataRows,numDataColumns) import Util (justWhen) import Util.Sexp (Sexp(..),prettyPrint) import Model.Cell (input) import Model.Grid (getCell,getFilePath,save) import I18n (__) saveAsEventHandler,saveEventHandler :: Controller () saveAsEventHandler = do result <- saveFileDialog (__ "Save") [(__ "Tables",["*.table"])] justWhen result saveAs saveEventHandler = do do result <- onGridModel getFilePath case result of Nothing -> saveAsEventHandler Just path -> saveAs path saveAs :: FilePath -> Controller () saveAs filePath = do toSexp >>= liftIO . writeFile filePath . prettyPrint onGridModel $ save filePath toSexp :: Controller Sexp toSexp = do maxRow <- do r <- onGridView numDataRows return $ r-1 maxCol <- do c <- onGridView numDataColumns return $ c-1 rows <- forM [0..maxRow] $ onGridView . getRowLabel cols <- forM [0..maxCol] $ onGridView . getColumnLabel rowList <- forM [0..maxRow] $ \row -> do cells <- forM [0..maxCol] $ \col -> onGridModel $ getCell (row,col) return $ List $ map (Atom . input) cells return $ List [ List $ map Atom rows, List $ map Atom cols , List rowList]