content: module PfePlumbing(module PfePlumbing,module P) where
  import AllFudgets as P(PixmapImage,Drawing,Gfx,Graphic(..),Button,Click,GfxCommand)
  
  import PFE0 as P(ModuleNode,ModuleGraph)
  import PFE_Certs as P(CertType,CertName,QCertName,CertStatus)
  import HsModule as P(ModuleName)
  import HsTokens as P(Token)
  import HsLexerPos as P(Pos(..))
  --import RefsTypes(Orig,Refs,isDef)
  import ScopeModule as P(XRefInfo)
  import PNT(PNT)
  import HsIdent(HsIdentI)
  import SrcLoc(SrcLoc,srcPath,srcLoc)
  import ConvRefsTypes(simpSrcLoc)
  import NameMaps(Role(..),Context(..))
  import TypedIds(IdTy(Assertion))
  import PfeBrowserMenu as P(MenuCmd)
  import OpTypes(eqBy,cmpBy)
  import CertServers as P(CertServers,Attrs,Name)
  import CertCmd(CertCmd)
  import StatusIndicator(Status)
  import Now(compileDate)
  
  myname = "Programatica Haskell Browser"
  myversion = myname++" version "++compileDate
  
  type Refs=[XRefInfo]
  type Orig=XRefInfo
  
  type CertIcons = [(CertType,(PixmapImage,PixmapImage,PixmapImage))]
                             --(valid,invalid,unknown)
  type Icons = (PixmapImage,CertIcons) -- (bad,certicons)
  type CertsStatus = [(CertName,CertStatus)]
  type CertsNoAnnot = [(String{-AssertionName-},[CertName])]
  
  type SrcToken = (Token,(Pos,String))
  newtype Label = Lbl {unLbl::(SrcToken,Maybe Orig)} --deriving (Show)
  
  lblPos = fst.snd.fst.unLbl
  
  assertionDefLbl (Lbl ((_,(_,s)),Just ((Def _,_),_,[(_,Assertion)]))) = Just s
  assertionDefLbl _ = Nothing
  
  isDefLbl (Lbl (_,Just ((r,_),_,_))) = isDef r
  isDefLbl _ = False
  
  isDef (Def (Instance _)) = False
  isDef (Def _) = True
  isDef _ = False
  
  refPos :: XRefInfo -> Pos
  addRefPos :: XRefInfo -> (Pos,XRefInfo)
  refPos r@(_,n,_) = simpSrcLoc (srcLoc n)
  addRefPos r = (refPos r,r)
  srcLocLbl loc = SrcLocLbl (srcPath loc,simpSrcLoc loc)
  
  instance Eq Label where (==) = eqBy lblPos
  instance Ord Label where compare = cmpBy lblPos
  
  type LexDrawing = Drawing Label Gfx
  
  data InfoWindow
    = CertInfo | CertTypes | PendingCmds
    | ErrorMsg | Evidence | Exports | Interface | Pretty
    deriving (Eq,Show,Bounded,Enum)
  
  data InfoLbl
     = CertLbl CertName
     | DefLbl (HsIdentI PNT) | SrcLocLbl (FilePath,Pos) | ModuleLbl ModuleName
     | CertCmd CertCmd | CreateCert (CertName,String)
     | CertEdit (CertType,(CertName,Attrs))
     | CertShowText String
     | ShowErrorMsg InfoDrawing
     deriving (Show)
  
  type InfoDrawing = Drawing InfoLbl Gfx
  
  instance Graphic InfoWindow where measureGraphicK = measureGraphicK . show
  
  type PfeMenuCmd = MenuCmd InfoWindow
  
  type FromMenuBar = PfeMenuCmd
  type FromInfoWindows = Either (InfoWindow,Bool) (InfoWindow,InfoLbl)
  type FromGraph = ModuleNode
  type FromNodeInfo = Either (ModuleName,Maybe Label) FilePath
  type FromSource = (Maybe Button,Label)
  type FromRefs = InfoLbl
  type FromMessagePopup = Click
  type FromModuleDisp = Either FromNodeInfo (Either FromSource FromRefs)
  
  type ToModuleDisp = Either ToNodeInfo (Either ToSource ToRefs)
  toSource = _toModuleDisp . Right . Left
  toRefs = _toModuleDisp . Right . Right
  
  type FromPopups = Either (Either FromMessagePopup FromNewCertPopup)
  		         (Either FromCertAttrsEditors FromTextEditor)
  type ToPopups = Either (Either ToMessagePopup ToNewCertPopup)
  	               (Either ToCertAttrsEditors ToTextEditor)
  
  type FromCertServer = (Bool,[Either String String])
  type ToCertServer = String
  
  type ToNewCertPopup = (CertIcons,(CertName,String))
  type FromNewCertPopup = (CertType,(CertName,String))
  
  type ToCertAttrsEditors = Either CertServers (CertType,(CertName,Attrs))
  type FromCertAttrsEditors = (CertType,(CertName,Attrs))
  
  type ToTextEditor = (Maybe String, Maybe String)
  type FromTextEditor = (ToTextEditor,String)
  
  type ToMenuBar = PfeMenuCmd
  type ToInfoWindows = (InfoWindow,Either Bool InfoDrawing)
  type ToGraph = ModuleGraph
  type ToNodeInfo = Either (ModuleNode,[ModuleName]) -- (...,imported by)
                           (ModuleName,Label) -- add position to history
  type ToSource =
      Either (FilePath,Icons,ModuleNode,[SrcToken],Refs,CertsStatus,CertsNoAnnot)
             (GfxCommand Label LexDrawing)
  type ToRefs = InfoDrawing
  type ToMessagePopup = [String]
  
  data Level = Syntax | Scoping | Typing deriving (Eq,Show,Bounded,Enum)
  
  type ToStatus = (Level,Status)
  type FromStatus = ()
  
  type In  = Either (Either (Either (Either FromMenuBar FromStatus)
                                    FromInfoWindows)
  			  (Either FromGraph FromModuleDisp))
  		  (Either FromPopups FromCertServer)
  type Out = Either (Either (Either (Either ToMenuBar ToStatus) ToInfoWindows)
                            (Either ToGraph ToModuleDisp))
  	          (Either ToPopups ToCertServer)
  toMenuBar = toOut . Left . Left . Left . Left
  toInfoWindows = toOut . Left  . Left . Right
  _toModuleDisp = toOut . Left . Right . Right
  toOut = Right -- see FudgetIOMonad1
  