Merge remote-tracking branch

'origin/GP-737_ghidra007_PR-2964_layout_names' (Closes #2964)
This commit is contained in:
ghidra1 2021-05-12 15:27:43 -04:00
commit df72f24b58
3 changed files with 56 additions and 45 deletions

View File

@ -111,64 +111,64 @@
<BLOCKQUOTE>
<BLOCKQUOTE>
<UL>
<LI><A name="Compact_Hierarchical">
<LI><A name="Compact Hierarchical"/>
<B>Compact Hierarchical</B> is the <B>TidierTree Layout Algorithm</B>. It builds a tree
structure and attempts to reduce horizontal space.</LI>
<LI><A name="Hierarchical">
<B>Hierarchical</B> is a basic Tree algorithm. It prioritizes 'important' edges while
constructing the tree.</LI>
<LI><A name="Hierarchical"/>
<B>Hierarchical</B> is a basic Tree algorithm with the root(s) at the top.</LI>
<LI><A name="Compact Radial">
<LI><A name="Compact Radial"/>
<B>Compact Radial</B> is the <B>TidierTree Layout Algorithm</B> with the root(s) at the
center and child vertices radiating outwards.</LI>
<LI><B>Hierarchical MinCross</B> is the <B>Sugiyama Layout Algorithm</B>. It attempts to
route edges around vertices in order to reduce crossing.There are four layering
algorithms:</LI>
<LI><A name="Hierarchical MinCross"/>
<B>Hierarchical MinCross</B> is the <B>Sugiyama Layout Algorithm with optimizations</B>. It attempts to
route edges around vertices in order to reduce crossing. There are four layering
algorithms (below)</LI>
<LI style="list-style: none">
<LI><A name="Vertical Hierarchical MinCross"/>
<B>Vertical Hierarchical MinCross</B> is the <B>Sugiyama Layout Algorithm with optimizations</B>. It attempts to
route edges around vertices in order to reduce crossing. If there is a favored EdgeType, an attempt is made to
line up those favored edges so they are vertical in the presentation. There are four layering
algorithms:</LI>
<UL>
<LI><A name="Hierarchical_MinCross_Top_Down">
<B>Top Down</B> - biases the vertices to the top</LI>
<LI><B>Top Down</B> - Biases the vertices to the top. Sources on the top row.</LI>
<LI><A name="Hierarchical_MinCross_Longest_Path">
<B>Longest Path</B> - biases the vertices to the bottom</LI>
<LI><B>Longest Path</B> - Biases the vertices to the bottom. Sinks are on the bottom row.</LI>
<LI><A name="Hierarchical_MinCross_Network_Simplex">
<B>Network Simplex</B> - layers after finding an 'optimal tree'</LI>
<LI><B>Network Simplex</B> - Layers after finding an 'optimal tree' by not considering longer edges.</LI>
<LI><A name="Hierarchical_MinCross_Coffman_Graham">
<B>Coffman Graham</B> - biases the vertices using a scheduling algorithm to minimize
length</LI>
<LI><B>Coffman Graham</B> - Biases the vertices using a scheduling algorithm to minimize
length. Tends to balance the graph around the middle.</LI>
</UL>
</LI>
<LI><A name="Circle">
<B>Circle</B> will arrange vertices in a Circle. If there are not too many edges (less
than specified in the jungrapht.circle.reduceEdgeCrossingMaxEdges property with a default
of 200), it will attempt to reduce edge crossing by rearranging the vertices.</LI>
<LI><A name="Circle"/>
<B>Circle</B> will arrange vertices in a Circle. </LI>
<LI><A name="Force_Balanced">
<LI><A name="Force Balanced"/>
<B>Force Balanced</B> is a <B>Force Directed Layout Algorithm</B> using the the <B>Kamada
Kawai</B> approach. It attempts to balance the graph by considering vertices and edge
Kawai</B> algorithm. It attempts to balance the graph by considering vertices and edge
connections.</LI>
<LI><A name="Force_Directed">
<LI><A name="Force Directed"/>
<B>Force Directed</B> is a <B>Force Directed Layout Algorithm</B> using the
<B>Fructermann Reingold</B> approach. It pushes unconnected vertices apart and draws
connected vertices together.</LI>
<LI><A name="Radial">
<LI><A name="Radial"/>
<B>Radial</B> is a Tree structure with the root(s) at the center and child vertices
radiating outwards.</LI>
<LI><A name="Balloon">
<LI><A name="Balloon"/>
<B>Balloon</B> is a Tree structure with the root(s) at the centers of circles in a radial
pattern</LI>
<LI><A name="Gem__Graph_Embedder_">
<B>GEM</B> is a Force Directed layout with locally separated components</LI>
<LI><A name="GEM"/>
<B>GEM (Graph Embedder)</B> is a Force Directed layout with locally separated components</LI>
</UL>
</BLOCKQUOTE>
</BLOCKQUOTE>

View File

@ -51,7 +51,6 @@ import org.jungrapht.visualization.renderers.Renderer;
import org.jungrapht.visualization.renderers.Renderer.VertexLabel;
import org.jungrapht.visualization.renderers.Renderer.VertexLabel.Position;
import org.jungrapht.visualization.selection.MutableSelectedState;
import org.jungrapht.visualization.selection.VertexEndpointsSelectedEdgeSelectedState;
import org.jungrapht.visualization.transform.*;
import org.jungrapht.visualization.transform.shape.MagnifyImageLensSupport;
import org.jungrapht.visualization.transform.shape.MagnifyShapeTransformer;
@ -755,7 +754,17 @@ public class DefaultGraphDisplay implements GraphDisplay {
for (String layoutName : names) {
ActionState<String> state = new ActionState<>(layoutName,
DefaultDisplayGraphIcons.LAYOUT_ALGORITHM_ICON, layoutName);
state.setHelpLocation(new HelpLocation(ACTION_OWNER, layoutName));
// condense hierarchical action help to the top-level help description
String anchor = layoutName;
if (layoutName.contains(LayoutFunction.VERT_MIN_CROSS)) {
anchor = LayoutFunction.VERT_MIN_CROSS;
}
else if (layoutName.contains(LayoutFunction.MIN_CROSS)) {
anchor = LayoutFunction.MIN_CROSS;
}
state.setHelpLocation(new HelpLocation(ACTION_OWNER, anchor));
actionStates.add(state);
}
return actionStates;

View File

@ -41,18 +41,20 @@ class LayoutFunction
static final String CIRCLE = "Circle";
static final String TIDIER_TREE = "Compact Hierarchical";
static final String TIDIER_RADIAL_TREE = "Compact Radial";
static final String MIN_CROSS = "Hierarchical MinCross"; //not an alg, just a parent category
static final String MIN_CROSS_TOP_DOWN = "Hierarchical MinCross Top Down";
static final String MIN_CROSS_LONGEST_PATH = "Hierarchical MinCross Longest Path";
static final String MIN_CROSS_NETWORK_SIMPLEX = "Hierarchical MinCross Network Simplex";
static final String MIN_CROSS_COFFMAN_GRAHAM = "Hierarchical MinCross Coffman Graham";
static final String EXP_MIN_CROSS_TOP_DOWN = "Experimental Hierarchical MinCross Top Down";
static final String EXP_MIN_CROSS_LONGEST_PATH = "Experimental Hierarchical MinCross Longest Path";
static final String EXP_MIN_CROSS_NETWORK_SIMPLEX = "Experimental Hierarchical MinCross Network Simplex";
static final String EXP_MIN_CROSS_COFFMAN_GRAHAM = "Experimental Hierarchical MinCross Coffman Graham";
static final String VERT_MIN_CROSS = "Vertical Hierarchical MinCross"; //not an alg, just a parent category
static final String VERT_MIN_CROSS_TOP_DOWN = "Vertical Hierarchical MinCross Top Down";
static final String VERT_MIN_CROSS_LONGEST_PATH = "Vertical Hierarchical MinCross Longest Path";
static final String VERT_MIN_CROSS_NETWORK_SIMPLEX = "Vertical Hierarchical MinCross Network Simplex";
static final String VERT_MIN_CROSS_COFFMAN_GRAHAM = "Vertical Hierarchical MinCross Coffman Graham";
static final String TREE = "Hierarchical";
static final String RADIAL = "Radial";
static final String BALLOON = "Balloon";
static final String GEM = "Gem (Graph Embedder)";
static final String GEM = "GEM";
Predicate<AttributedEdge> favoredEdgePredicate;
Comparator<AttributedEdge> edgeTypeComparator;
@ -66,10 +68,10 @@ class LayoutFunction
return new String[] { TIDIER_TREE, TREE,
TIDIER_RADIAL_TREE, MIN_CROSS_TOP_DOWN, MIN_CROSS_LONGEST_PATH,
MIN_CROSS_NETWORK_SIMPLEX, MIN_CROSS_COFFMAN_GRAHAM, CIRCLE,
EXP_MIN_CROSS_TOP_DOWN,
EXP_MIN_CROSS_LONGEST_PATH,
EXP_MIN_CROSS_NETWORK_SIMPLEX,
EXP_MIN_CROSS_COFFMAN_GRAHAM,
VERT_MIN_CROSS_TOP_DOWN,
VERT_MIN_CROSS_LONGEST_PATH,
VERT_MIN_CROSS_NETWORK_SIMPLEX,
VERT_MIN_CROSS_COFFMAN_GRAHAM,
KAMADA_KAWAI, FRUCTERMAN_REINGOLD, RADIAL, BALLOON, GEM
};
}
@ -112,25 +114,25 @@ class LayoutFunction
.<AttributedVertex, AttributedEdge> edgeAwareBuilder()
.edgeComparator(edgeTypeComparator)
.layering(Layering.COFFMAN_GRAHAM);
case EXP_MIN_CROSS_TOP_DOWN:
case VERT_MIN_CROSS_TOP_DOWN:
return EiglspergerLayoutAlgorithm
.<AttributedVertex, AttributedEdge> edgeAwareBuilder()
.edgeComparator(edgeTypeComparator)
.favoredEdgePredicate(favoredEdgePredicate)
.layering(Layering.TOP_DOWN);
case EXP_MIN_CROSS_LONGEST_PATH:
case VERT_MIN_CROSS_LONGEST_PATH:
return EiglspergerLayoutAlgorithm
.<AttributedVertex, AttributedEdge> edgeAwareBuilder()
.edgeComparator(edgeTypeComparator)
.favoredEdgePredicate(favoredEdgePredicate)
.layering(Layering.LONGEST_PATH);
case EXP_MIN_CROSS_NETWORK_SIMPLEX:
case VERT_MIN_CROSS_NETWORK_SIMPLEX:
return EiglspergerLayoutAlgorithm
.<AttributedVertex, AttributedEdge> edgeAwareBuilder()
.edgeComparator(edgeTypeComparator)
.favoredEdgePredicate(favoredEdgePredicate)
.layering(Layering.NETWORK_SIMPLEX);
case EXP_MIN_CROSS_COFFMAN_GRAHAM:
case VERT_MIN_CROSS_COFFMAN_GRAHAM:
return EiglspergerLayoutAlgorithm
.<AttributedVertex, AttributedEdge> edgeAwareBuilder()
.edgeComparator(edgeTypeComparator)