packages feed

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