packages feed

lhae-0.0.2: src/Controller/Canonical.hs

module Controller.Canonical (Row,Column,RowData,ColumnData
                            ,getRow,getColumn
                            ,addRow,addColumn,addRow',addColumn'
                            ,writeRowData,writeColumnData)
    where

import Control.Monad (forM)
import Controller (Controller,onGridView) 
import Controller.Cell (getInput)     
import Controller.Grid (writeCells)
import qualified Controller.Menu.Table.Add as Add
import View.Component.Grid (numDataRows,numDataColumns,getColumnLabel
                           ,getRowLabel)
import CellCoordinate (coordRange)

type ColumnData = [String]
type Column = (String,ColumnData)
type RowData = [String]
type Row = (String,RowData)

getRow :: Int -> Controller Row
getRow row = do
  label <- onGridView $ getRowLabel row
  cells <- do cols <- onGridView numDataColumns
              forM [0..cols-1] $ \c -> getInput (row,c)
  return (label,cells)

getColumn :: Int -> Controller Column
getColumn col = do
  label <- onGridView $ getColumnLabel col
  cells <- do rows <- onGridView numDataRows
              forM [0..rows-1] $ \r -> getInput (r,col)
  return (label,cells)

addColumn :: (Maybe String,ColumnData) -> Controller ()
addColumn (label,cells) = do
  index <- onGridView numDataColumns
  Add.addColumn label
  writeColumnData index cells

addColumn' :: Column -> Controller ()
addColumn' (label,cells) = addColumn (Just label,cells)

addRow :: (Maybe String,RowData) -> Controller ()
addRow (label,cells) = do
  index <- onGridView numDataRows
  Add.addRow label
  writeRowData index cells

addRow' :: Row -> Controller ()
addRow' (label,cells) = addRow (Just label,cells)

writeColumnData :: Int -> ColumnData -> Controller ()
writeColumnData index columnData = do
  rowsInView <- onGridView numDataRows
  let range = let numRows = max rowsInView $ length columnData
              in coordRange ((0,index),(numRows-1,index))
  writeCells $ zip range columnData  

writeRowData :: Int -> RowData -> Controller ()
writeRowData index rowData = do
  colsInView <- onGridView numDataColumns
  let range = let numCols = max colsInView $ length rowData
              in coordRange ((index,0),(index,numCols-1))
  writeCells $ zip range rowData