content: {- |
  Module      :  ./GUI/ConsoleUtils.hs
  Description :  simple command line dialogs
  Copyright   :  (c) C. Maeder, Uni Bremen 2002-2005
  License     :  GPLv2 or higher, see LICENSE.txt
  
  Maintainer  :  Christian.Maeder@dfki.de
  Stability   :  provisional
  Portability :  portable
  
  gui utilities that work via the console instead of using HTk
  
     The interface should remain compatible with GUI.HTkUtils
     so that GUI.Utils can reexport functions of both modules
     based on the presence of UNI_PACKAGE.
  
  -}
  
  module GUI.ConsoleUtils where
  
  import Data.Char
  import Data.List
  import Control.Monad ( unless )
  
  infoDialog :: String -> String -> IO ()
  infoDialog _title msg = putStrLn msg
  
  -- | present a list of choices and return the selection
  listBox :: String -> [String] -> IO (Maybe Int)
  listBox prompt choices = do
     putStrLn prompt
     mapM_ putStrLn $ zipWith (\ n -> (shows n ": " ++)) [0 :: Int ..] choices
     putStrLn "Please enter a number on the next line"
     s <- getLine
     if all isDigit s then
            let n = foldl ( \ r a -> r * 10 + digitToInt a) 0 s in
                if n >= length choices then
                   putStrLn "number to large, try again"
                   >> listBox prompt choices
                else putStrLn ("you have chosen entry \"" ++ choices !! n)
                     >> return (Just n)
        else putStrLn ("illegal input \"" ++ s ++ "\" try again")
             >> listBox prompt choices
  
  -- | show text and ask to save it
  createTextSaveDisplay :: String -- ^ title of the window
                        -> String -- ^ default filename for saving the text
                        -> String -- ^ text to be displayed
                        -> IO ()
  createTextSaveDisplay t f txt = do
      putStrLn t
      putStrLn $ replicate (length t) '='
      putStrLn ""
      putStrLn txt
      putStrLn ""
      askFileNameAndSave f txt
  
  
  -- | ask for a file name
  askFileNameAndSave :: String -- ^ default filename for saving the text
                     -> String -- ^ text to be saved
                     -> IO ()
  askFileNameAndSave f txt = do
      putStrLn $ "save text in file \"" ++ f ++ "\"? (y/n)"
      s <- getLine
      if "y" `isPrefixOf` map toLower s then writeFile f txt
        else do
        putStrLn "enter new file name (or abort with return):"
        n <- getLine
        unless (null n) $ askFileNameAndSave n txt
  