content: module PfeBrowserMonad where
  import Maybe(isJust)
  import Monad(when)
  import MT(lift)
  import AbstractIO
  
  import FudgetIOMonad1
  import PfePlumbing
  import PfeBrowserMenu(WindowCmd,ViewCmd,MenuCmd(..),WindowCmd(..))
  import PfeBrowserGUI
  import PNT(PNT)
  import SimpleGraphs(Graph)
  
  import PropParser(parse)
  import PropLexer({-LexerFlags,-}pLexerPass0)
  import PPU(PPHsMode)
  import TiPropDecorate(TiDecls) -- to choose result type from the type checker
  import PropPosSyntax(Id,HsName,HsDecl)
  import FreeNamesProp()
  import ScopeNamesProp()
  import NameMapsProp()
  import ReAssocProp()
  import MapDeclMProp() -- for removing pattern bindings in Pfe3Cmds.
  --import TiModule() -- instance ValueId PNT
  import TiProp()
  import PFE4
  import PFEdeps
  import PFE0
  import PFE_Certs
  import CertCmd(CertCmd)
  
  type Opts = ({-LexerFlags,-}((Bool, PPHsMode), String, [String]))
  
  -- PFE Browser monad:
  --type PfeFM = PFE0MT Id HsName [HsDecl] () (WithState PfeBrowserState FIOM)
  --type PfeFM = WithState PfeBrowserState (PFE0MT Id HsName [HsDecl] () FIOM)
  type PfeFM = PFE5MT Id HsName PNT [HsDecl] (TiDecls PNT) PfeBrowserState FIOM
  
  
  runPfeFM pfeFM ({-lexeropts,-}opts) =
      runPFE5 undefined (\n a->pfeFM) (pLexerPass0 {-lexeropts-},parse) opts
  
  pfeGet = lift getFM :: PfeFM In
  pfePut = lift . putFM
  pfeQuit = lift quitFM
  
  withWaitCursor :: PfeFM a -> PfeFM a -- polymorphic recursion...
  withWaitCursor cmd =
    do pfePut (toSource setwaitcursor)
       tryThen cmd $ pfePut (toSource setnormalcursor)
  
  putInfoWindow (w,x) = pfePut . toInfoWindows $ (w,Right x)
  
  popupInfoWindow (w,up) =
    do pfePut (toMenuBar (Windows (WindowCmd w up)))
       when (not up && w==CertInfo) $
         updStBr $ \ st ->st{certDisplay=Nothing}
  
  popupCertInfo qcert info =
      do putInfoWindow (CertInfo,info)
         popupInfoWindow (CertInfo,True)
         updStBr $ \ st -> st{certDisplay=Just qcert}
  
  getStBr :: PfeFM PfeBrowserState
  updStBr :: (PfeBrowserState->PfeBrowserState)->PfeFM ()
  
  getStBr = getSt5ext
  updStBr = updSt5ext
  setStBr = updStBr . const
  
  type TInfo = PFE4Info PNT (TiDecls PNT)
  type ViewMode = ViewCmd
  
  data PfeBrowserState
     = St { -- Mode
  	  viewMode :: ViewMode,
            -- The selected module:
  	  modnode::ModuleNode,
  	  mrefs::[XRefInfo],hilbls::[Label],
  	  types::Maybe TInfo,
  	  certs::[CertInfo],
  	  -- Project info:
  	  revgraph::Graph ModuleName,
  	  -- Cert display/state info:
  	  certDisplay    :: Maybe QCertName,  -- currently displayed cert
  	  certInProgress :: [CertCmd],  -- server command in progress or queued
  	  -- Project independent info:
  	  certServers :: CertServers,
  	  certIcons :: CertIcons,
  	  sadIcon :: PixmapImage }
  
  haveTypes = isJust . types
  modname = fst . snd . modnode
  noModuleNode = ("",(undefined,[])) -- for the initial state
  isNoModule (path,_) = null path
  --sccs = fst . snd . pfe2info
  --graph = concat . sccs
  icons st = (sadIcon st,certIcons st)
  