packages feed

lhae-0.0.3: src/Controller/Menu/Table/Copy.hs

module Controller.Menu.Table.Copy 
    (columnEventHandler,rowEventHandler
    ,columnEventHandlerWith,rowEventHandlerWith
    ,formulaEventHandler,formulaAtEventHandler)
    where

import Control.Applicative ((<$>))
import Control.Monad (forM_,forM)
import Controller (Controller,onView,onGridView,onGridModel)
import Controller.Dialog (chooseColumnsAndTableDialog,chooseRowsAndTableDialog
                         ,warning)
import Controller.Grid (changePageTo,writeCellInput)
import Controller.Canonical (getColumnInput,addColumnInput)
import View.Dialog.Complex (Layout (..),Widget (..),Modifier (..)
                           ,showSimpleDialog,cancelButton)
import View.Component.Grid (getRowLabel,getColumnLabel)
import Model.Grid (getCell,dependencyCoordsFromInput)
import Model.Cell (input)
import Model.CellContent (CellExpr (NamedReference),CellReference(Named)
                         ,NamedReference (NamedCell))
import Util (justWhen)
import I18n (__)
import CellCoordinate (CellCoord)

columnEventHandler,rowEventHandler :: Controller ()
columnEventHandler = columnEventHandlerWith []
rowEventHandler = rowEventHandlerWith []

columnEventHandlerWith,rowEventHandlerWith :: [Int] -> Controller ()
columnEventHandlerWith init = do
  result <- chooseColumnsAndTableDialog (__ "Copy columns") (__ "C&opy") init
  justWhen result $ \(cols,table) ->
      justWhen table $ copyColumnsTo cols

rowEventHandlerWith init = do
  result <- chooseRowsAndTableDialog (__ "Copy rows") (__ "C&opy") init
  justWhen result $ \(rows,table) ->
      justWhen table $ copyRowsTo rows

copyColumnsTo,copyRowsTo :: [Int] -> Int -> Controller ()
copyColumnsTo cols tableN = do
  columnData <- forM cols getColumnInput
  changePageTo tableN
  forM_ columnData $ \(label,xs) -> addColumnInput (Just label) xs

copyRowsTo rows tableN = do
  columnData <- forM rows getColumnInput
  changePageTo tableN
  forM_ columnData $ \(label,xs) -> addColumnInput (Just label) xs

data CopyFormulaParameters = CopyFormulaParameters 
    { source :: String
    , destination :: String
    }

defaultParams :: String -> CopyFormulaParameters
defaultParams s = CopyFormulaParameters s ""

formulaEventHandler :: Controller ()
formulaEventHandler = do
  result <- onView $ showSimpleDialog (__ "Copy formula")
            copyFormulaDialog $ defaultParams ""
  justWhen result copyFormula

formulaAtEventHandler :: CellCoord -> Controller ()
formulaAtEventHandler (r,c) = do
  ref <- do row <- onGridView $ getRowLabel r
            col <- onGridView $ getColumnLabel c
            return $ NamedReference $ NamedCell $ Named (row,col)

  result <- onView $ showSimpleDialog (__ "Copy formula")
            copyFormulaDialog $ defaultParams $ show ref
  justWhen result copyFormula

copyFormulaDialog :: Layout CopyFormulaParameters ()
copyFormulaDialog =
    let setSource p s = p {source = s}
        setDest p d = p {destination = d}
    in
      Modifier Margin $ Column 
        [ Grid [[ Label $ __ "Source"
                , Modifier HFill $ Widget $ TextEntry source setSource]
               ,[ Label $ __ "Destination"
                , Modifier (MinSize (200,-1)) $ Widget $ TextEntry destination setDest]
               ]
        , Modifier Center $ Row [ Widget $ DefaultButton (__ "C&opy") ()
                                , cancelButton]]

copyFormula :: CopyFormulaParameters -> Controller ()
copyFormula params = do
  src <- onGridModel $ dependencyCoordsFromInput $ '=':source params
  dest <- onGridModel $ dependencyCoordsFromInput $ '=':destination params
  case (src,dest) of
    ([s],_:_) -> do formula <- input <$> (onGridModel $ getCell s)
                    writeCellInput $ map (\d -> (d,formula)) dest 
    _ -> warning $ __ "No valid source or destination selected"