GraphAbstraction.hs revision 9e5c10805bd50b5baaf6bf1f6a3f085c7afb17d8
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder{-# LANGUAGE FlexibleInstances #-}
f9e0b18852b238ddb649d341194e05d7200d1bbeChristian MaederModule : $Header$
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian MaederDescription : Interface for graph viewing and abstraction
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian MaederCopyright : (c) Thiemo Wiedemeyer, T. Mossakowski, Uni Bremen 2002-2008
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian MaederLicense : GPLv2 or higher, see LICENSE.txt
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian MaederMaintainer : raider@informatik.uni-bremen.de
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian MaederStability : provisional
f9e0b18852b238ddb649d341194e05d7200d1bbeChristian MaederPortability : non-portable (relies on Logic via DevGraph)
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian MaederInterface for graph viewing and abstraction.
f9e0b18852b238ddb649d341194e05d7200d1bbeChristian Maeder -- * Creation and display
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder -- * Node interface
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder , isHiddenNode
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder -- * Edge interface
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder , hideSetOfEdgeTypes
64e1905404e5135e98a26d2ab4150b6764956576Christian Maeder , isHiddenEdge
64e1905404e5135e98a26d2ab4150b6764956576Christian Maeder -- * Conversion and update of graph
64e1905404e5135e98a26d2ab4150b6764956576Christian Maeder , applyChanges
64e1905404e5135e98a26d2ab4150b6764956576Christian Maeder -- * Direct manipulation of uDrawGraph
64e1905404e5135e98a26d2ab4150b6764956576Christian Maeder , layoutImproveAll
64e1905404e5135e98a26d2ab4150b6764956576Christian Maeder , showTemporaryMessage
4c7f058cdd19ce67b2b5d4b7f69703d0f8a21e38Christian Maeder , deactivateGraphWindow
4c7f058cdd19ce67b2b5d4b7f69703d0f8a21e38Christian Maeder , activateGraphWindow
4c7f058cdd19ce67b2b5d4b7f69703d0f8a21e38Christian Maeder , closeGraphWindow
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maederimport GUI.Utils (pulseBar)
67869d63d1725c79e4c07b51acd466a31932b275Christian Maederimport qualified UDrawGraph.Types as DVT
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maederimport Events.Synchronized (synchronize)
64e1905404e5135e98a26d2ab4150b6764956576Christian Maederimport Data.List (partition)
64e1905404e5135e98a26d2ab4150b6764956576Christian Maederimport qualified Data.Map as Map
64e1905404e5135e98a26d2ab4150b6764956576Christian Maederimport Data.Maybe (isNothing)
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maederimport Control.Concurrent (threadDelay)
67869d63d1725c79e4c07b51acd466a31932b275Christian Maeder-- | uDrawGraph graph
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maedertype OurGraph =
64e1905404e5135e98a26d2ab4150b6764956576Christian Maeder Graph DaVinciGraph
64e1905404e5135e98a26d2ab4150b6764956576Christian Maeder DaVinciGraphParms
62eaa2fb831613d8a6e59687f83a45be1041ab17Christian Maeder DaVinciNodeType
64e1905404e5135e98a26d2ab4150b6764956576Christian Maeder DaVinciNodeTypeParms
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder DaVinciArcType
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder DaVinciArcTypeParms
67869d63d1725c79e4c07b51acd466a31932b275Christian Maeder-- | Node id type
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maedertype NodeId = Int
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder-- | Node value
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maedertype NodeValue = (String, NodeId)
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder-- | Edge value
67869d63d1725c79e4c07b51acd466a31932b275Christian Maedertype EdgeValue = (String, EdgeId, Maybe (LEdge DGLinkLab))
64e1905404e5135e98a26d2ab4150b6764956576Christian Maeder-- | Datastructure for changes, storing all needed information for change
64e1905404e5135e98a26d2ab4150b6764956576Christian Maeder -- Node changes
62eaa2fb831613d8a6e59687f83a45be1041ab17Christian Maeder = AddNode NodeId DGNodeType String Bool
64e1905404e5135e98a26d2ab4150b6764956576Christian Maeder | DelNode NodeId
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder | ChangeNodeType NodeId DGNodeType
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder | ShowNode NodeId
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder | HideNode NodeId
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder -- Edge changes
67869d63d1725c79e4c07b51acd466a31932b275Christian Maeder | AddEdge EdgeId DGEdgeType NodeId NodeId String (Maybe (LEdge DGLinkLab))
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder | DelEdge EdgeId
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder | ShowEdge EdgeId
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder | HideEdge EdgeId
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder -- Compressed edge changes
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder | AddCompEdge (NodeId, NodeId, DGEdgeType, Bool)
67869d63d1725c79e4c07b51acd466a31932b275Christian Maeder | DelCompEdge (NodeId, NodeId, DGEdgeType, Bool)
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder-- | Internal node
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maederdata GANode = GANode
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder { udgNode :: Maybe (DaVinciNode NodeValue) -- ^ uDrawGraph node
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder , ganType :: DGNodeType -- ^ ID of nodetype
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder , ganValue :: NodeValue -- ^ Holds the nodevalue for uDrawGraph node
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder-- | Internal edge
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maederdata GAEdge = GAEdge
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder { udgEdge :: Maybe (DaVinciArc EdgeValue) -- ^ uDrawGraph edge
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder , ganFrom :: NodeId -- ^ ID of source node
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder , ganTo :: NodeId -- ^ID of target node
67869d63d1725c79e4c07b51acd466a31932b275Christian Maeder , gaeType :: DGEdgeType -- ^ ID of edgetype
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder , gaeValue :: EdgeValue -- ^ Holds the edgevalue for uDrawGraph edge
ecf557c0b4f953106755a239da2c0b168064d3f4Christian Maeder-- | Internal node type
ecf557c0b4f953106755a239da2c0b168064d3f4Christian Maederdata GANodeType = GANodeType
ecf557c0b4f953106755a239da2c0b168064d3f4Christian Maeder { udgNodeType :: DaVinciNodeType NodeValue
ecf557c0b4f953106755a239da2c0b168064d3f4Christian Maeder-- | Internal edge type
ecf557c0b4f953106755a239da2c0b168064d3f4Christian Maederdata GAEdgeType = GAEdgeType
ecf557c0b4f953106755a239da2c0b168064d3f4Christian Maeder { udgEdgeType :: DaVinciArcType EdgeValue
ecf557c0b4f953106755a239da2c0b168064d3f4Christian Maeder , udgCompressed :: (DaVinciArcType EdgeValue, DaVinciArcType EdgeValue)
ecf557c0b4f953106755a239da2c0b168064d3f4Christian Maeder , gaeHidden :: Bool
ecf557c0b4f953106755a239da2c0b168064d3f4Christian Maeder{- | Main datastructure for carrying around the graph,
ecf557c0b4f953106755a239da2c0b168064d3f4Christian Maeder both internally (nodes as integers), and at the daVinci level -}
ecf557c0b4f953106755a239da2c0b168064d3f4Christian Maederdata AbstractionGraph = AbstractionGraph
ecf557c0b4f953106755a239da2c0b168064d3f4Christian Maeder { theGraph :: OurGraph
ecf557c0b4f953106755a239da2c0b168064d3f4Christian Maeder , nodes :: Map.Map NodeId GANode
de66af0f4b27f08f81c7ca9c573ef9cdf7ca7a07Christian Maeder , edges :: Map.Map EdgeId GAEdge
de66af0f4b27f08f81c7ca9c573ef9cdf7ca7a07Christian Maeder , nodeTypes :: Map.Map DGNodeType GANodeType
de66af0f4b27f08f81c7ca9c573ef9cdf7ca7a07Christian Maeder , edgeTypes :: Map.Map DGEdgeType GAEdgeType
de66af0f4b27f08f81c7ca9c573ef9cdf7ca7a07Christian Maeder , compressedEdges :: Map.Map (NodeId, NodeId, DGEdgeType, Bool) GAEdge
64e1905404e5135e98a26d2ab4150b6764956576Christian Maeder-- | IORef for main datastructure
64e1905404e5135e98a26d2ab4150b6764956576Christian Maedertype GraphInfo = IORef AbstractionGraph
64e1905404e5135e98a26d2ab4150b6764956576Christian Maederinstance Eq (DaVinciNode NodeValue) where
64e1905404e5135e98a26d2ab4150b6764956576Christian Maederinstance Eq (DaVinciArc EdgeValue) where
64e1905404e5135e98a26d2ab4150b6764956576Christian Maeder-- | Wrapper for functions with read access
, nodes = Map.empty
, edges = Map.empty
, nodeTypes = Map.empty
, edgeTypes = Map.empty
, compressedEdges = Map.empty
, nodes = Map.empty
, edges = Map.empty
, nodeTypes = Map.fromList $ zip nTypeNames
, edgeTypes = Map.fromList $ zip eTypeNames
, compressedEdges = Map.empty
get :: (Show k, Ord k) => k -> Map.Map k a -> a
get key = Map.findWithDefault (error $ "get: id unknown: " ++ show key) key
addNode g nId nType nName hidden = if Map.member nId $ nodes g
return g { nodes = Map.insert nId node $ nodes g }
return g { nodes = Map.delete nId $ nodes g }
return g { nodes = Map.insert nId node {udgNode = Nothing} $ nodes g }
g { nodes = Map.insert nId node { udgNode = Just node' } $ nodes g }
return g { nodes = Map.insert nId node { ganType = nType } $ nodes g }
if Map.member eId $ edges g
return g { edges = Map.insert eId edge $ edges g }
return g { edges = Map.delete eId $ edges g }
return g { compressedEdges = Map.insert ce edge $ compressedEdges g }
return g { compressedEdges = Map.delete ce $ compressedEdges g }
return g { edges = Map.insert eId edge { udgEdge = Nothing } $ edges g }
let (hEdges, sEdges) = Map.foldrWithKey (\ eid e (he, se) ->
g' = g { edgeTypes = Map.mapWithKey
(update, exit) <- pulseBar "Updating graph" "hiding/showing edge types..."
return g { edges = Map.insert eId edge { udgEdge = Just edge' } es }
$ Map.toList $ edges g)
oce = Map.keys $ compressedEdges g
$ Map.keys $ nodes g
$ Map.keys $ edges g
doInGraphContext :: DVT.DaVinciCmd -- ^ uDrawGraph command