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"