lhae-0.0.3: src/Controller/Menu/Table/Filter.hs
module Controller.Menu.Table.Filter (rowEventHandler,columnEventHandler)
where
import Prelude hiding (filter)
import Control.Applicative ((<$>))
import Control.Monad (forM,forM_,when)
import Data.Maybe (catMaybes)
import Data.Either (partitionEithers)
import Controller (Controller,onView,onGridView,onGridModel)
import qualified Controller.Grid as Grid
import Controller.Canonical (addRowInput,addColumnInput)
import I18n (__)
import View.Dialog.Complex (Layout (..),Widget (..),Modifier (..)
,showSimpleDialog,cancelButton)
import View.Dialog.Simple (warning)
import View.Component.Grid (numDataRows,numDataColumns
,getRowValues,getColumnValues)
import Model.CellContent (CellValue (BoolValue))
import Model.Grid (evaluateString)
import Util (justWhen)
rowEventHandler :: Controller ()
rowEventHandler = do
result <- onView $ showSimpleDialog (__ "Filter rows") dialog ""
justWhen result filterRows
columnEventHandler :: Controller ()
columnEventHandler = do
result <- onView $ showSimpleDialog (__ "Filter columns") dialog ""
justWhen result filterColumns
dialog :: Layout String ()
dialog =
Modifier Margin $ Column
[ Grid [[ Label $ __ "Filter condition"
, Modifier (MinSize (200,-1)) $ FocusOn $ TextEntry id (\_ -> id)]
]
, Modifier Center $ Row [ Widget $ DefaultButton (__ "&Filter") ()
, cancelButton]]
filterRows :: String -> Controller ()
filterRows input = do
n <- onGridView numDataRows
(rows,others) <-
do (others,rows) <- partitionEithers <$> forM [0..n-1] filter
return (catMaybes rows,take 10 others)
when (not $ null rows) $
Grid.new >> (forM_ rows $ addRowInput Nothing)
when (not $ null others) $
onView $ warning $ unlines $ (__ "Unexpected results:"):others
where
filter i =
do result <- onGridModel $ evaluateString ('=':input) (i,-1)
case result of
BoolValue True -> (Right . Just) <$>
(onGridView $ getRowValues i)
BoolValue False -> return $ Right Nothing
_ -> return $ Left $ show result
filterColumns :: String -> Controller ()
filterColumns input = do
n <- onGridView numDataColumns
(cols,others) <-
do (others,cols) <- partitionEithers <$> forM [0..n-1] filter
return (catMaybes cols,take 10 others)
when (not $ null cols) $
Grid.new >> (forM_ cols $ addColumnInput Nothing)
when (not $ null others) $
onView $ warning $ unlines $ (__ "Unexpected results:"):others
where
filter i =
do result <- onGridModel $ evaluateString ('=':input) (-1,i)
case result of
BoolValue True -> (Right . Just) <$>
(onGridView $ getColumnValues i)
BoolValue False -> return $ Right Nothing
_ -> return $ Left $ show result