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