packages feed

AutoForms-0.4.0: src/Graphics/UI/AF/WxForm/WxFilePath.hs

{-# LANGUAGE RankNTypes, ScopedTypeVariables, TypeOperators #-}
{-# OPTIONS -fno-warn-orphans #-}

module Graphics.UI.AF.WxForm.WxFilePath () where

import qualified Graphics.UI.AF.General as AF

import Graphics.UI.AF.WxForm.WxFormImplementation
import Graphics.UI.WX hiding (Widget, value, dialog)
import Graphics.UI.AF.General.CustomTypes
import Graphics.UI.AF.WxForm.WxList()  -- must import as AFFilePath and AFDirectoryPath both contains a string ([Char])

{- Who made what?

Shelarcy made the AFDirectoryPath and merged it with AFFilePath.

Mads Lindstrøm made AFFilePath.

-}

instance ECCreator AFFilePath
    where
    makeEC x = dialogEC "file" filePath AFFilePath dialog' x
       where
           dialog' w _ = fileOpenDialog w True True "Choose file ..." [("Any file", ["*"])] "" ""

instance ECCreator AFDirectoryPath
     where
     makeEC x = dialogEC "directory" directoryPath AFDirectoryPath dialog' x
        where
            dialog' w val = dirOpenDialog w True "Choose directory ..." val

dialogEC :: (Eq a, Show a) =>
            String
         -> (a -> String)
         -> (String -> a)
         -> (forall w. Window w -> String -> IO (Maybe String))
         -> MakeEC a
dialogEC typeName fromType toType dialog' value = AF.builderToCom $
    do Parent w <- getPanel
       chooseB  <- io $ button w [ text := "Choose " ++ typeName ++ " ..."
                                 , enabled := True]
       te <- io $ textEntry w [processEnter := True]
       let gui = singleGui (badConstrLabel typeName)
                    (row 5 [hfill $ widget te, widget chooseB]) hfill
           setGuiValue x = set te [ text := fromType x ]
           setGuiEnable enable =
               do set chooseB  [ enabled := enable ]
                  set te [ enabled := enable ]
       (comH, parms) <- addCustomGui value setGuiValue te gui
       
       io $ set te [ on focus := \_ ->
                         do get te text >>= testInputParm' parms SetOnReject . toType
                            propagateEvent
                   ]
       io $ set chooseB [ on command :=
                             do val <- get te text
                                maybePath <- dialog' w val
                                maybe (return()) (testInputParm' parms SetOnAccept . toType)
                                      maybePath
                        ]
       return $ typeLift (\cio -> cio { pickSetEnabled = setGuiEnable }) comH