PfeBrowserGUI.hs

module PfeBrowserGUI(module PfeBrowserGUI,posLabel) where
import List(groupBy,sortBy)
import Maybe(isNothing)
--import Char(isSpace)

import AllFudgets
import FudExtras(popupMenuF',staticHyperGraphicsF')
import ContribFudgets(menuIcon,item,itemValue)--menuBarF,delayedSubMenuItem,idT,cmdItem
import HyperGraphicsF2
import TreeBrowser as B(treeBrowserF',Tree(..))
import HistoryButtonsF
import ListUtil(chopList,breakAt,mapFst)

import PfePlumbing
import PfeBrowserColors as C
import DrawLex(drawLex,fakeLex,posLabel,rootLabel,isCertAnnot)

import HsLexerPass1(lexerPass0)
import HsTokens as T
import HsName(ModuleName(..),parseModuleName)

import OpTypes(cmpBy)
import PrettyPrint(pp,(<+>))
import MUtils(apSnd)

textEditorPopupF = 
    inputPopupF "Editor" (spF $ oldScrollF True (500,600) inputEditorF) Nothing
  where spF = spacer1F (noStretchS False False)

newCertPopupF :: F ToNewCertPopup FromNewCertPopup
newCertPopupF =
    snd>^=<inputPopupF title newCertF Nothing >=^< pre
  where
    title = "Create a new certificate"
    pre inp = (Just title,Just inp)

newCertF = tableF 2 (typeF `inputPairF` (nameF `inputPairF` conclF))
  where
    typeF = labelF "Type" >*<
              (inputChange>^=<dynF nullLF
               >=^< Left . radioButtonsF>=^^<idempotSP>=^<map certTypeItem)
    radioButtonsF [] = labelF "No certificate types available?!"
    radioButtonsF items@(item1:_) =
      radioGroupF [(itemValue item,item)|item<-items] (itemValue item1)

    nameF = labelF "Name" >*< stringF
    conclF = labelF "Conclusion" >*< stringF

    certTypeItem (cert,(icon,_,_)) = item cert (hboxD [g icon,g cert])

graphDispF :: F ToGraph FromGraph
graphDispF =
    mapFilterSP leaf>^^=<
    vScrollF (treeBrowserF' g0)>=^<graphTree.sortBy (cmpBy (fst.snd))
  where
    g0 = graphTree []
    leaf (B.Leaf l) = Just (itemValue l)
    leaf _ = Nothing

    graphTree g =
	Node "Module Graph" [Node "Files" (filepaths2trees g),
			     Node "Modules" (map mitem g)]
      where
	mitem n@((_,(m,_))) = B.Leaf (item n (pp m))

    filepaths2trees = list2trees . map withpath
      where
	list2trees = map tree . groupBy eqHead . sortBy (cmpBy fst)

	--tree ([]:_) = ??
	tree [([f],p)] = B.Leaf (item p f)
	tree ((x:xs,p):ys) = Node x (list2trees ((xs,p):mapFst tail ys))

	eqHead (x:xs,_) (y:ys,_) = x==y
	eqHead ([],_) ([],_) = True
	eqHead _ _ = False

	withpath n@(path,_) = (chopList (breakAt '/') path,n)

refDispF :: F ToRefs InfoLbl
refDispF = scrollF (staticHyperGraphicsF' pm initD)
  where pm = setSizing Dynamic . setFont refFont
        initD = padD 20 $ g $
		 "Welcome to the "++myversion++"!"

data ModPos = MP ModuleName (Maybe Label) deriving (Eq)

instance Graphic ModPos where
  measureGraphicK (MP m optpos) =
      measureGraphicK (pp $ m<+>fmap (line.lblPos) optpos)

nodeInfoF :: F ToNodeInfo FromNodeInfo
nodeInfoF =
    --simpleGroupF [] $
    vBoxF (fileF>*<hBoxF (historyF>*<nodeF))
  where
      -- Input is: ((f,(n,is)),es)+Pos

    fileF = Right >^=< ldispF  "File:" >=^< fst.fst >=^^< filterLeftSP

    historyF =
        post >^=<
        loopThroughRightF (absF ignore0)
		          (historyButtonsF{- >==< teeF show "history: "-})
        >=^< mpos
      where
	mpos = mapEither mpos1 mpos2
        mpos1 ((f,(n,is)),es) = MP n Nothing
	mpos2 (m,p) = MP m (Just p)
	post (MP m optpos) = Left (m,optpos)

	ignore0 = getSP $ either repeat (either makehistory (const ignore0))

	repeat cur = putSP (Right cur) $ ignore cur
	makehistory new = putSP (Left (Left new)) $ ignore new
	replace new = putSP (Left (Right new)) $ ignore new

	ignore cur@(MP m op) = getSP $ either repeat (either newmod updpos)
          where
	    newmod new@(MP m' Nothing) | m'==m = ignore cur
	    newmod new = makehistory new

	    updpos new | new==cur = ignore cur
	    updpos new@(MP m' _) | m'==m && isNothing op = replace new
	    updpos new = makehistory new

    nodeF = (moduleF>*<dynImportMenusF)  >=^^< filterLeftSP
    moduleF = post . parseModuleName >^=< ldispF "Module:" >=^< pp.fst.snd.fst
      where post m = Left (m,Nothing)

    ldispF l = l `labLeftOfF` strF
      where strF = stringInputF --' (setSizing Dynamic)

    dynImportMenusF =
       dynModuleMenuF "Imports" >=^< snd.snd.fst
        >*<dynModuleMenuF "Imported By" >=^< snd
 
    dynModuleMenuF lbl = popupMenuF' 1 [] (menuLblF lbl)>=^<pre
      where pre ms = Left [((m,Nothing),pp m)|m<-take 30 ms]
			   -- !! no indication if menu is truncated

    menuLblF lbl = labelF' pm (hboxcD [g lbl,g menuIcon])
      where pm = setBorderWidth 1 . setBgColor paperColor

    --fud1>|<fud2 = stripEither>^=<prodF fud1 fud2

sourceDispF :: F ToSource FromSource
sourceDispF =
    wCreateGCtx rootGCtx (gcFontA sourceFont) $ \ gctx ->
    loadColorsF gctx sourceDispF'

sourceDispF' colgc =
    scrollF (mousePointSP>^^=<hyperGraphicsF2' pm init)>=^<either replace id
  where
    pm = setFont sourceFont . setGfxEventMask [GfxButtonMask,GfxMotionMask]
    init = drawLex undefined undefined undefined colgc [] [] [] empty
    empty = lexerPass0 (replicate 24 '\n'++replicate 80 ' ') -- for initial size
    replace (dir,icons,(path,(m,_)),ts,rs,cs,na) =
      replaceGfx rootLabel $ drawLex dir icons m colgc rs cs na ts

    mousePointSP = idempotSP -==- mapFilterSP label
      where
        label event =
          do (lbl,_):_ <- gfxEventPaths event
	     case event of
	       GfxButtonEvent {gfxType=Pressed,gfxButton=b} -> Just (Just b,lbl)
	       GfxMotionEvent {} -> Just (Nothing,lbl)
	       _ -> Nothing

highlightGfxs off on = ChangeGfx $ change off False++change on True
  where change paths on = [(path,(on,Nothing))|path<-paths]

hilite off on = Right (highlightGfxs off on)
mkvis lbl = Right (ShowGfx lbl (Nothing,Nothing))
setwaitcursor =  Right (ChangeGfxFontCursor 150)
setlinkcursor =  Right (ChangeGfxFontCursor 60)
setnormalcursor = Right (ChangeGfxCursor cursorNone)
showsrctext = Right . replaceGfx rootLabel . fakeLex

isCertTokenRef = isCertToken . fst
isCertToken token =
  do (NestedComment,(_,s)) <- return token
     isCertAnnot s


-- Moved file path definitions to ../../property/pfe/PFE_Certs.hs

sourceFont = argKey "sourcefont" defaultFont
refFont = argKey "reffont" defaultFont

Plain-text version of PfeBrowserGUI.hs | Valid HTML?