packages feed

lhae-0.0.3: src/Controller/Menu/File/Save.hs

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]