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