packages feed

lhae-0.0.2: src/Controller/Menu/Table/Add.hs

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'