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"