module Graphics.UI.AF.General.EditFile ( editFile ) where import Graphics.UI.AF.General.AutoForm import Graphics.UI.AF.General.Misc import Graphics.UI.AF.General.MySYB import Graphics.UI.AF.General.CustomTypes import Control.Monad.Error editFile :: ( Read t, AutoForm wxAct comH builder satCxt com , Sat (satCxt t), Eq t, Show t, MonadIO builder, MonadIO wxAct , TypePresentation t wxAct comH builder satCxt com) => FilePath -> t -> builder () editFile filename defaultValue = do entry <- fromFile filename defaultValue (errorDialog "Error loading file") entryHandle <- builderCom entry -- FIXME: should be changed to mkCom laiter chState <- makeChangedState entryHandle let saveFile = do x <- getValue entryHandle liftIO $ writeFile filename $ show x setValue chState $ Unchanged x button "Save" saveFile >>= enabledWhen chState (== Changed) -- FIXME: missing saveAs button button "Quit" closeWindow return () -- |Tries to read a file from disc. If an error occurs the 'onError' function is called. fromFile :: (MonadIO m, Read a) => FilePath -- ^The file to read. -> a -- ^Default value. -> (String -> m ()) -- ^This is called if an error occurs while trying to read the file. -> m a fromFile filename defaultValue onError = do entry <- liftIO $ (do entryText <- readFile filename e <- readIO entryText return $ Right e ) `catch` (return . Left . show) case entry of Left "" -> return defaultValue Left s -> do onError s return defaultValue Right x -> return x