packages feed

lhae-0.0.3: src/Controller/Dialog.hs

module Controller.Dialog (openFileDialog,saveFileDialog
                         ,chooseColumnDialog
                         ,chooseColumnsDialog
                         ,chooseRowDialog
                         ,chooseRowsDialog
                         ,chooseColumnsAndTableDialog,chooseRowsAndTableDialog
                         ,previewImage,warning
                         ,nonNumericDataWarningText,nonNumericDataWarning
                         ,noColumnsSelectedText,noColumnsSelected
                         ,noRowsSelectedText,noRowsSelected
                         ,whenSure)
    where

import Control.Applicative ((<$>))
import Control.Monad (when)
import Graphics.UI.WX (Prop ((:=)),on)
import qualified Graphics.UI.WX as WX
import qualified Graphics.UI.WXCore as WXC
import System.FilePath (takeDirectory)
import Controller (Controller,onView,onGridView,setOnConfig,getFromConfig)
import View (View,frame)
import View.Component.Grid (getColumnLabels,getRowLabels)
import View.GridPage (captions)
import View.Dialog.Complex (Layout (..),Widget (..),Modifier (..)
                           ,showSimpleDialog,okButton,cancelButton)
import qualified View.Dialog.Simple as Simple
import Config (getLastHandledPathForDialogs,setLastHandledPath)
import Util (justWhen)
import I18n (__)

openFileDialog :: String -> [(String,[String])] -> Controller (Maybe FilePath)
openFileDialog caption filters = do
  lastPath <- getFromConfig getLastHandledPathForDialogs
  result <- onView $ \view -> 
            WX.fileOpenDialog (frame view) True True caption
            ((__ "Any file",["*"]) : filters) lastPath ""
  justWhen result $ setOnConfig . setLastHandledPath . takeDirectory
  return result

saveFileDialog :: String -> [(String,[String])] -> Controller (Maybe FilePath)
saveFileDialog caption filters = do
  lastPath <- getFromConfig getLastHandledPathForDialogs
  result <- onView $ \view -> 
            WX.fileSaveDialog (frame view) True True caption
            ((__ "Any file",["*"]) : filters) lastPath ""
  justWhen result $ setOnConfig . setLastHandledPath . takeDirectory
  return result

chooseOneFromListDialog :: String -> String -> String -> [String]
                        -> Maybe Int -> Controller (Maybe Int)
chooseOneFromListDialog dialogCaption listCaption okLabel list init =
    let listBox = SingleListBox list id $ \_ -> id
        dialog = Modifier Margin $ Column
          [ Modifier (Boxed listCaption) $ Modifier HFill $ Widget listBox
          , Modifier Center $ Row [ Widget $ DefaultButton okLabel ()
                                  , cancelButton]]
    in
      maybe Nothing id 
        <$> (onView $ showSimpleDialog dialogCaption dialog init)

chooseSomeFromListDialog :: String -> String -> String -> [String]
                         -> [Int] -> Controller [Int]
chooseSomeFromListDialog dialogCaption listCaption okLabel list init =
    let listBox = MultiListBox list id $ \_ -> id
        dialog = Modifier Margin $ Column
          [ Modifier (Boxed listCaption) $ Modifier HFill $ Widget listBox
          , Modifier Center $ Row [ Widget $ DefaultButton okLabel ()
                                  , cancelButton]]
    in
      maybe [] id 
        <$> (onView $ showSimpleDialog dialogCaption dialog init)

chooseColumnDialog :: String -> String -> Maybe Int -> Controller (Maybe Int)
chooseColumnDialog caption okLabel init = do
  labels <- onGridView getColumnLabels 
  chooseOneFromListDialog caption (__ "Column") okLabel labels init

chooseRowDialog :: String -> String -> Maybe Int -> Controller (Maybe Int)
chooseRowDialog caption okLabel init = do
  labels <- onGridView getRowLabels 
  chooseOneFromListDialog caption (__ "Row") okLabel labels init

chooseColumnsDialog :: String -> String -> [Int] -> Controller [Int]
chooseColumnsDialog caption okLabel init = do
  labels <- onGridView getColumnLabels 
  chooseSomeFromListDialog caption (__ "Columns") okLabel labels init

chooseRowsDialog :: String -> String -> [Int] -> Controller [Int]
chooseRowsDialog caption okLabel init = do
  labels <- onGridView getRowLabels 
  chooseSomeFromListDialog caption (__ "Rows") okLabel labels init

chooseSomethingAndTableDialog :: String -> String -> String -> [String]
                              -> [Int] -> Controller (Maybe ([Int],Maybe Int))
chooseSomethingAndTableDialog dialogCaption someCaption okLabel something init = do
  tableCaptions <- onView captions
  let someList = MultiListBox something fst
                   $ \(_,table) some -> (some,table)
      tableList = SingleListBox tableCaptions snd
                    $ \(some,_) table -> (some,table)
      dialog = Modifier Margin $ Column
               [ Modifier Center $ Row
                   [ Modifier (Boxed someCaption) $ Modifier HFill $ Widget someList
                   , Label $ __ "to"
                   , Modifier (Boxed $ __ "Table") $ Widget tableList
                   ]
               , Modifier Center $ Row 
                   [Widget $ DefaultButton okLabel (), cancelButton]]
  onView $ showSimpleDialog dialogCaption dialog (init,Nothing)

chooseColumnsAndTableDialog :: String -> String -> [Int]
                            -> Controller (Maybe ([Int],Maybe Int))
chooseColumnsAndTableDialog caption okLabel init = do
  labels <- onGridView getColumnLabels 
  chooseSomethingAndTableDialog caption (__ "Columns") okLabel labels init

chooseRowsAndTableDialog :: String -> String -> [Int]
                            -> Controller (Maybe ([Int],Maybe Int))
chooseRowsAndTableDialog caption okLabel init = do
  labels <- onGridView getRowLabels 
  chooseSomethingAndTableDialog caption (__ "Rows") okLabel labels init

previewImage :: WXC.Bitmap () -> Controller ()
previewImage bitmap = 
    let drawBitmap dc _ = WX.drawBitmap dc bitmap WX.pointZero False []
        makeWindow dialog = do
          size <- do width <- WXC.bitmapGetWidth bitmap
                     height <- WXC.bitmapGetHeight bitmap
                     return (width,height)

          WX.scrolledWindow dialog [ WX.virtualSize := uncurry WX.sz size
                                   , WX.clientSize := uncurry WX.sz size
                                   , on WX.paint := drawBitmap]
        dialog = Modifier Margin $ Column
                 [ Widget $ ScrolledWindow makeWindow
                 , Modifier Center $ okButton ()]
    in
      onView (showSimpleDialog (__ "Preview") dialog ()) >> return ()

warning :: String -> Controller ()
warning = onView . Simple.warning

nonNumericDataWarningText :: [String] -> String
nonNumericDataWarningText labels = 
    unwords [__ "Column(s)",show labels,__ "contains non-numeric data"]

nonNumericDataWarning :: [String] -> Controller ()
nonNumericDataWarning = warning . nonNumericDataWarningText

noColumnsSelectedText :: String
noColumnsSelectedText = __ "No columns selected"

noColumnsSelected :: Controller ()
noColumnsSelected = warning noColumnsSelectedText

noRowsSelectedText :: String
noRowsSelectedText = __ "No rows selected"

noRowsSelected :: Controller ()
noRowsSelected = warning noRowsSelectedText

whenSure :: String -> Controller () -> Controller ()
whenSure caption doThis =
    let caption' = caption ++ ": " ++ (__ "Are you sure?")
    in do
      sure <- onView $ \view -> 
              WX.confirmDialog (frame view) caption' caption' False
      when sure doThis