Skip to content

Commit 6c2ae44

Browse files
8344204: IGV: Button to enable/disable cutting of long edges
Reviewed-by: rcastanedalo, chagedorn
1 parent 4a7ce1d commit 6c2ae44

File tree

13 files changed

+176
-106
lines changed

13 files changed

+176
-106
lines changed

src/utils/IdealGraphVisualizer/HierarchicalLayout/src/main/java/com/sun/hotspot/igv/hierarchicallayout/HierarchicalCFGLayoutManager.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ public HierarchicalCFGLayoutManager() {
4545
fontMetrics = canvas.getFontMetrics(font);
4646
}
4747

48+
@Override
49+
public void setCutEdges(boolean enable) {
50+
subManager.setCutEdges(enable);
51+
manager.setCutEdges(enable);
52+
}
53+
4854
public void setSubManager(LayoutManager manager) {
4955
this.subManager = manager;
5056
}

src/utils/IdealGraphVisualizer/HierarchicalLayout/src/main/java/com/sun/hotspot/igv/hierarchicallayout/HierarchicalClusterLayoutManager.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,12 @@ public HierarchicalClusterLayoutManager(HierarchicalLayoutManager.Combine combin
4343
this.combine = combine;
4444
}
4545

46+
@Override
47+
public void setCutEdges(boolean enable) {
48+
subManager.setCutEdges(enable);
49+
manager.setCutEdges(enable);
50+
}
51+
4652
public void doLayout(LayoutGraph graph, Set<? extends Link> importantLinks) {
4753
doLayout(graph);
4854
}

src/utils/IdealGraphVisualizer/HierarchicalLayout/src/main/java/com/sun/hotspot/igv/hierarchicallayout/HierarchicalLayoutManager.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,9 @@ public void setLayerOffset(int layerOffset) {
136136
this.layerOffset = layerOffset;
137137
}
138138

139-
public void setMaxLayerLength(int v) {
140-
maxLayerLength = v;
139+
@Override
140+
public void setCutEdges(boolean enable) {
141+
maxLayerLength = enable ? 10 : -1;
141142
}
142143

143144
public void setMinLayerDifference(int v) {

src/utils/IdealGraphVisualizer/HierarchicalLayout/src/main/java/com/sun/hotspot/igv/hierarchicallayout/HierarchicalStableLayoutManager.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ public class HierarchicalStableLayoutManager {
3838
public static final int X_OFFSET = 8;
3939
public static final int LAYER_OFFSET = 8;
4040
// Algorithm global data structures
41-
private HashSet<? extends Vertex> currentVertices;
42-
private HashSet<? extends Link> currentLinks;
41+
private Set<? extends Vertex> currentVertices;
42+
private Set<? extends Link> currentLinks;
4343
private Set<Link> reversedLinks;
4444
private List<LayoutNode> nodes;
4545
private final HashMap<Vertex, LayoutNode> vertexToLayoutNode;
@@ -51,10 +51,19 @@ public class HierarchicalStableLayoutManager {
5151
private HashMap<Vertex, VertexAction> vertexToAction;
5252
private List<VertexAction> vertexActions;
5353
private List<LinkAction> linkActions;
54-
private HashSet<? extends Vertex> oldVertices;
55-
private HashSet<? extends Link> oldLinks;
54+
private Set<? extends Vertex> oldVertices;
55+
private Set<? extends Link> oldLinks;
5656
private boolean shouldRedrawLayout = true;
5757
private boolean shouldRemoveEmptyLayers = true;
58+
private boolean cutEdges = false;
59+
60+
public void doLayout(LayoutGraph layoutGraph) {
61+
boolean oldShouldRedrawLayout = shouldRedrawLayout;
62+
setShouldRedrawLayout(true);
63+
updateLayout(layoutGraph.getVertices(), layoutGraph.getLinks());
64+
setShouldRedrawLayout(oldShouldRedrawLayout);
65+
}
66+
5867

5968
enum Action {
6069
ADD,
@@ -90,6 +99,15 @@ public HierarchicalStableLayoutManager() {
9099
nodes = new ArrayList<>();
91100
}
92101

102+
public void setCutEdges(boolean enable) {
103+
cutEdges = enable;
104+
manager.setCutEdges(enable);
105+
}
106+
107+
public boolean getCutEdges() {
108+
return cutEdges;
109+
}
110+
93111
private int calculateOptimalBoth(LayoutNode n) {
94112
if (n.preds.isEmpty() && n.succs.isEmpty()) {
95113
return n.x;
@@ -396,7 +414,7 @@ public void setShouldRedrawLayout(boolean shouldRedrawLayout) {
396414
this.shouldRedrawLayout = shouldRedrawLayout;
397415
}
398416

399-
public void updateLayout(HashSet<? extends Vertex> vertices, HashSet<? extends Link> links) {
417+
public void updateLayout(Set<? extends Vertex> vertices, Set<? extends Link> links) {
400418
currentVertices = vertices;
401419
currentLinks = links;
402420
reversedLinks = new HashSet<>();

src/utils/IdealGraphVisualizer/HierarchicalLayout/src/main/java/com/sun/hotspot/igv/hierarchicallayout/LinearLayoutManager.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ public LinearLayoutManager(Map<? extends Vertex, Integer> vertexRank) {
3939
this.vertexRank = vertexRank;
4040
}
4141

42+
@Override
43+
public void setCutEdges(boolean enable) {}
44+
4245
@Override
4346
public void doLayout(LayoutGraph graph) {
4447
doLayout(graph, new HashSet<>());

src/utils/IdealGraphVisualizer/Layout/src/main/java/com/sun/hotspot/igv/layout/LayoutManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
*/
3232
public interface LayoutManager {
3333

34+
void setCutEdges(boolean enable);
35+
3436
void doLayout(LayoutGraph graph);
3537

3638
void doLayout(LayoutGraph graph, Set<? extends Link> importantLinks);

src/utils/IdealGraphVisualizer/View/src/main/java/com/sun/hotspot/igv/view/DiagramScene.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -700,20 +700,27 @@ private boolean isVisible(Connection c) {
700700
}
701701

702702
private void doStableSeaLayout(HashSet<Figure> visibleFigures, HashSet<Connection> visibleConnections) {
703-
hierarchicalStableLayoutManager.updateLayout(visibleFigures, visibleConnections);
703+
boolean enable = model.getCutEdges();
704+
boolean previous = hierarchicalStableLayoutManager.getCutEdges();
705+
hierarchicalStableLayoutManager.setCutEdges(enable);
706+
if (enable != previous) {
707+
hierarchicalStableLayoutManager.doLayout(new LayoutGraph(visibleConnections, visibleFigures));
708+
} else {
709+
hierarchicalStableLayoutManager.updateLayout(visibleFigures, visibleConnections);
710+
}
704711
}
705712

706713
private void doSeaLayout(HashSet<Figure> figures, HashSet<Connection> edges) {
707714
HierarchicalLayoutManager manager = new HierarchicalLayoutManager(HierarchicalLayoutManager.Combine.SAME_OUTPUTS);
708-
manager.setMaxLayerLength(10);
715+
manager.setCutEdges(model.getCutEdges());
709716
manager.doLayout(new LayoutGraph(edges, figures));
710717
hierarchicalStableLayoutManager.setShouldRedrawLayout(true);
711718
}
712719

713720
private void doClusteredLayout(HashSet<Connection> edges) {
714721
HierarchicalClusterLayoutManager m = new HierarchicalClusterLayoutManager(HierarchicalLayoutManager.Combine.SAME_OUTPUTS);
715722
HierarchicalLayoutManager manager = new HierarchicalLayoutManager(HierarchicalLayoutManager.Combine.SAME_OUTPUTS);
716-
manager.setMaxLayerLength(9);
723+
manager.setCutEdges(model.getCutEdges());
717724
manager.setMinLayerDifference(3);
718725
m.setManager(manager);
719726
m.setSubManager(new HierarchicalLayoutManager(HierarchicalLayoutManager.Combine.SAME_OUTPUTS));
@@ -724,7 +731,7 @@ private void doCFGLayout(HashSet<Figure> figures, HashSet<Connection> edges) {
724731
Diagram diagram = getModel().getDiagram();
725732
HierarchicalCFGLayoutManager m = new HierarchicalCFGLayoutManager();
726733
HierarchicalLayoutManager manager = new HierarchicalLayoutManager(HierarchicalLayoutManager.Combine.SAME_OUTPUTS);
727-
manager.setMaxLayerLength(9);
734+
manager.setCutEdges(model.getCutEdges());
728735
manager.setMinLayerDifference(1);
729736
manager.setLayoutSelfEdges(true);
730737
manager.setXOffset(25);

src/utils/IdealGraphVisualizer/View/src/main/java/com/sun/hotspot/igv/view/DiagramViewModel.java

Lines changed: 19 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import com.sun.hotspot.igv.graph.MatcherSelector;
3737
import com.sun.hotspot.igv.settings.Settings;
3838
import com.sun.hotspot.igv.util.RangeSliderModel;
39+
import com.sun.hotspot.igv.view.actions.CutEdgesAction;
3940
import com.sun.hotspot.igv.view.actions.GlobalSelectionAction;
4041
import java.awt.Color;
4142
import java.util.*;
@@ -68,8 +69,8 @@ public class DiagramViewModel extends RangeSliderModel implements ChangedListene
6869
private boolean showCFG;
6970
private boolean showNodeHull;
7071
private boolean showEmptyBlocks;
71-
private boolean hideDuplicates;
7272
private static boolean globalSelection = false;
73+
private static boolean cutEdges = false;
7374

7475
private final ChangedListener<FilterChain> filterChainChangedListener = changedFilterChain -> {
7576
assert filterChain == changedFilterChain;
@@ -80,6 +81,18 @@ public Group getGroup() {
8081
return group;
8182
}
8283

84+
public boolean getCutEdges() {
85+
return cutEdges;
86+
}
87+
88+
public void setCutEdges(boolean enable, boolean fire) {
89+
boolean prevEnable = cutEdges;
90+
cutEdges = enable;
91+
if (fire && prevEnable != enable) {
92+
diagramChangedEvent.fire();
93+
}
94+
}
95+
8396
public boolean getGlobalSelection() {
8497
return globalSelection;
8598
}
@@ -154,25 +167,6 @@ public void setShowEmptyBlocks(boolean b) {
154167
diagramChangedEvent.fire();
155168
}
156169

157-
public void setHideDuplicates(boolean hideDuplicates) {
158-
this.hideDuplicates = hideDuplicates;
159-
InputGraph currentGraph = getFirstGraph();
160-
if (hideDuplicates) {
161-
// Back up to the unhidden equivalent graph
162-
int index = graphs.indexOf(currentGraph);
163-
while (graphs.get(index).getProperties().get("_isDuplicate") != null) {
164-
index--;
165-
}
166-
currentGraph = graphs.get(index);
167-
}
168-
filterGraphs();
169-
selectGraph(currentGraph);
170-
}
171-
172-
public boolean getHideDuplicates() {
173-
return hideDuplicates;
174-
}
175-
176170
private void initGroup() {
177171
group.getChangedEvent().addListener(g -> {
178172
assert g == group;
@@ -191,6 +185,7 @@ private void initGroup() {
191185
public DiagramViewModel(DiagramViewModel model) {
192186
super(model);
193187
globalSelection = false;
188+
cutEdges = false;
194189
group = model.getGroup();
195190
initGroup();
196191
graphs = new ArrayList<>(model.graphs);
@@ -205,12 +200,12 @@ public DiagramViewModel(DiagramViewModel model) {
205200
filtersOrder = provider.getAllFiltersOrdered();
206201

207202
globalSelection = GlobalSelectionAction.get(GlobalSelectionAction.class).isSelected();
203+
cutEdges = CutEdgesAction.get(CutEdgesAction.class).isSelected();
208204
showCFG = model.getShowCFG();
209205
showSea = model.getShowSea();
210206
showBlocks = model.getShowBlocks();
211207
showNodeHull = model.getShowNodeHull();
212208
showEmptyBlocks = model.getShowEmptyBlocks();
213-
hideDuplicates = model.getHideDuplicates();
214209

215210
hiddenNodes = new HashSet<>(model.getHiddenNodes());
216211
selectedNodes = new HashSet<>();
@@ -228,13 +223,13 @@ public DiagramViewModel(InputGraph graph) {
228223
filtersOrder = provider.getAllFiltersOrdered();
229224

230225
globalSelection = GlobalSelectionAction.get(GlobalSelectionAction.class).isSelected();
226+
cutEdges = CutEdgesAction.get(CutEdgesAction.class).isSelected();
231227
showStableSea = Settings.get().getInt(Settings.DEFAULT_VIEW, Settings.DEFAULT_VIEW_DEFAULT) == Settings.DefaultView.STABLE_SEA_OF_NODES;
232228
showSea = Settings.get().getInt(Settings.DEFAULT_VIEW, Settings.DEFAULT_VIEW_DEFAULT) == Settings.DefaultView.SEA_OF_NODES;
233229
showBlocks = Settings.get().getInt(Settings.DEFAULT_VIEW, Settings.DEFAULT_VIEW_DEFAULT) == Settings.DefaultView.CLUSTERED_SEA_OF_NODES;
234230
showCFG = Settings.get().getInt(Settings.DEFAULT_VIEW, Settings.DEFAULT_VIEW_DEFAULT) == Settings.DefaultView.CONTROL_FLOW_GRAPH;
235231
showNodeHull = true;
236232
showEmptyBlocks = true;
237-
hideDuplicates = false;
238233

239234
hiddenNodes = new HashSet<>();
240235
selectedNodes = new HashSet<>();
@@ -422,11 +417,8 @@ private void filterGraphs() {
422417
ArrayList<InputGraph> result = new ArrayList<>();
423418
List<String> positions = new ArrayList<>();
424419
for (InputGraph graph : group.getGraphs()) {
425-
String duplicate = graph.getProperties().get("_isDuplicate");
426-
if (duplicate == null || !hideDuplicates) {
427-
result.add(graph);
428-
positions.add(graph.getName());
429-
}
420+
result.add(graph);
421+
positions.add(graph.getName());
430422
}
431423
this.graphs = result;
432424
setPositions(positions);
@@ -460,22 +452,12 @@ public InputGraph getSecondGraph() {
460452

461453
public void selectGraph(InputGraph graph) {
462454
int index = graphs.indexOf(graph);
463-
if (index == -1 && hideDuplicates) {
464-
// A graph was selected that's currently hidden, so unhide and select it.
465-
setHideDuplicates(false);
466-
index = graphs.indexOf(graph);
467-
}
468455
assert index != -1;
469456
setPositions(index, index);
470457
}
471458

472459
public void selectDiffGraph(InputGraph graph) {
473460
int index = graphs.indexOf(graph);
474-
if (index == -1 && hideDuplicates) {
475-
// A graph was selected that's currently hidden, so unhide and select it.
476-
setHideDuplicates(false);
477-
index = graphs.indexOf(graph);
478-
}
479461
assert index != -1;
480462
int firstIndex = getFirstPosition();
481463
int secondIndex = getSecondPosition();

src/utils/IdealGraphVisualizer/View/src/main/java/com/sun/hotspot/igv/view/EditorTopComponent.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,6 @@ public void mouseMoved(MouseEvent e) {}
210210
toolBar.addSeparator();
211211
toolBar.add(new JToggleButton(new PredSuccAction(diagramViewModel.getShowNodeHull())));
212212
toolBar.add(new JToggleButton(new ShowEmptyBlocksAction(cfgLayoutAction, diagramViewModel.getShowEmptyBlocks())));
213-
toolBar.add(new JToggleButton(new HideDuplicatesAction(diagramViewModel.getHideDuplicates())));
214213

215214
toolBar.addSeparator();
216215
UndoAction undoAction = UndoAction.get(UndoAction.class);
@@ -221,6 +220,11 @@ public void mouseMoved(MouseEvent e) {}
221220
toolBar.add(redoAction);
222221

223222
toolBar.addSeparator();
223+
224+
JToggleButton cutEdgesButton = new JToggleButton(CutEdgesAction.get(CutEdgesAction.class));
225+
cutEdgesButton.setHideActionText(true);
226+
toolBar.add(cutEdgesButton);
227+
224228
JToggleButton globalSelectionButton = new JToggleButton(GlobalSelectionAction.get(GlobalSelectionAction.class));
225229
globalSelectionButton.setHideActionText(true);
226230
toolBar.add(globalSelectionButton);
@@ -453,6 +457,7 @@ public TopComponent cloneComponent() {
453457
}
454458
etc.addSelectedNodes(selectedNodes, false);
455459
model.setGlobalSelection(GlobalSelectionAction.get(GlobalSelectionAction.class).isSelected(), false);
460+
model.setCutEdges(CutEdgesAction.get(CutEdgesAction.class).isSelected(), false);
456461
etc.resetUndoRedo();
457462

458463
int currentZoomLevel = scene.getZoomPercentage();

0 commit comments

Comments
 (0)