HaRe-0.6: tools/pfe/Browser/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