module Controller.Menu.Table.Add (columnEventHandler,rowEventHandler ,addRow,addColumn) where import Control.Monad (forM_) import Data.Char (chr,ord) import Data.List (intercalate) import Controller (Controller,onView,onGridModel,onGridView) import Controller.Cell (updateInView) import qualified Model.Grid as GridM import qualified View.Component.Grid as GridV import View.Dialog.Complex (Layout (..),Widget (..),Modifier (..) ,showSimpleDialog,cancelButton) import Util (breakAt) import I18n (__) data AddBy = N | Labels data Parameters = Parameters { addBy :: AddBy , n :: Int , labels :: [String]} columnEventHandler :: Controller () columnEventHandler = do result <- onView $ showSimpleDialog (__ "Add columns") (dialog $ __ "Add columns by") $ Parameters N 0 [] case result of Nothing -> return () Just (Parameters {addBy=N, n=n}) -> forM_ [1..n] $ \_ -> addColumn Nothing Just (Parameters {addBy=Labels, labels=labels}) -> forM_ labels $ addColumn . Just rowEventHandler :: Controller () rowEventHandler = do result <- onView $ showSimpleDialog (__ "Add rows") (dialog $ __ "Add rows by") $ Parameters N 0 [] case result of Nothing -> return () Just (Parameters {addBy=N, n=n}) -> forM_ [1..n] $ \_ -> addRow Nothing Just (Parameters {addBy=Labels, labels=labels}) -> forM_ labels $ addRow . Just dialog :: String -> Layout Parameters () dialog radioBoxCaption = let setLabels p labels = p {labels = breakAt ',' labels} getLabels = intercalate "," . labels setAddBy p 0 = p {addBy = N} setAddBy p 1 = p {addBy = Labels} getAddBy p = case addBy p of N -> 0; Labels -> 1 setN p n = p {n = n} in Modifier Margin $ Column [ Row [ Widget $ RadioBox radioBoxCaption [__ "Number \"n\"",__ "Labels \"label1[,label2,...]\""] getAddBy setAddBy , Column [ Widget $ Spinner 0 maxBound n setN , Widget $ TextEntry getLabels setLabels]] , Modifier Center $ Row [ Widget $ DefaultButton (__ "&Add") () , cancelButton]] {- Reihenfolge wichtig: 1. zu View hinzufügen 2. zu Model hinzufügen -} addRow,addColumn :: Maybe String -> Controller () addRow caption = do rows <- onGridView GridV.numDataRows let name = maybe (autoRowName rows) id caption onGridView $ GridV.addRow name onGridModel (GridM.addRow name) >>= updateInView where autoRowName i = show $ i+1 addColumn caption = do cols <- onGridView GridV.numDataColumns let name = maybe (autoColumnName cols) id caption onGridView $ GridV.addColumn name onGridModel (GridM.addColumn name) >>= updateInView where autoColumnName i = let number = (i `div` 26) + 1 in replicate number $ chr $ (i `mod` 26) + ord 'A'