/*
* Licensed Materials - Property of Rogue Wave Software, Inc.
* © Copyright Rogue Wave Software, Inc. 2014, 2017
* © Copyright IBM Corp. 2009, 2014
* © Copyright ILOG 1996, 2009
* All Rights Reserved.
*
* Note to U.S. Government Users Restricted Rights:
* The Software and Documentation were developed at private expense and
* are "Commercial Items" as that term is defined at 48 CFR 2.101,
* consisting of "Commercial Computer Software" and
* "Commercial Computer Software Documentation", as such terms are
* used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
* as applicable.
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GradientPaint;
import java.awt.SystemColor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.JTextField;
import ilog.views.IlvApplyObject;
import ilog.views.IlvBufferedGraphicEnumeration;
import ilog.views.IlvConstantModeManagerFrame;
import ilog.views.IlvDefaultManagerFrame;
import ilog.views.IlvDirection;
import ilog.views.IlvGraphic;
import ilog.views.IlvGraphicEnumeration;
import ilog.views.IlvGrid;
import ilog.views.IlvHandlesSelection;
import ilog.views.IlvManagerView;
import ilog.views.IlvPoint;
import ilog.views.IlvRect;
import ilog.views.accelerator.IlvDeleteSelectionAccelerator;
import ilog.views.accelerator.IlvFitToSizeAccelerator;
import ilog.views.accelerator.IlvIdentityAccelerator;
import ilog.views.accelerator.IlvRotateAccelerator;
import ilog.views.accelerator.IlvScrollDownAccelerator;
import ilog.views.accelerator.IlvScrollLeftAccelerator;
import ilog.views.accelerator.IlvScrollRightAccelerator;
import ilog.views.accelerator.IlvScrollUpAccelerator;
import ilog.views.accelerator.IlvZoomInAccelerator;
import ilog.views.accelerator.IlvZoomOutAccelerator;
import ilog.views.graphic.IlvGeneralPath;
import ilog.views.graphic.IlvPolygon;
import ilog.views.hypergraph.IlvHyperEdge;
import ilog.views.hypergraph.IlvHyperEdgeEnd;
import ilog.views.hypergraph.IlvHyperGrapher;
import ilog.views.hypergraph.IlvSegmentedHyperEdge;
import ilog.views.hypergraph.crossing.IlvCrossingCalculation;
import ilog.views.hypergraph.edgeconnector.IlvHyperEdgeCenterConnector;
import ilog.views.hypergraph.edgeconnector.IlvHyperEdgeClippingConnector;
import ilog.views.hypergraph.edgeconnector.IlvHyperEdgeConnector;
import ilog.views.hypergraph.edgeconnector.IlvHyperEdgeFixedConnector;
import ilog.views.hypergraph.edgeconnector.IlvHyperEdgePinConnector;
import ilog.views.hypergraph.edgeconnector.IlvHyperGrapherPin;
import ilog.views.hypergraph.interactor.IlvMakeHyperEdgeInteractor;
import ilog.views.hypergraph.interactor.IlvMakeHyperEdgePinConnectorInteractor;
import ilog.views.hypergraph.interactor.IlvMakeSegmentedHyperEdgeInteractor;
import ilog.views.interactor.IlvSelectInteractor;
import ilog.views.interactor.IlvZoomViewInteractor;
import ilog.views.swing.IlvJManagerViewControlBar;
import ilog.views.swing.IlvJScrollManagerView;
import ilog.views.util.IlvProductUtil;
import ilog.views.util.swing.IlvSwingUtil;
import interactor.HyperEdgeConnectorInteractor;
import interactor.InteractorButton;
import interactor.MakeNodeInteractor;
import util.ResourceUtil;
/**
* This is a very simple application that uses the
* <code>IlvHyperGrapher</code>.
*/
public class HyperGrapherDemo extends JRootPane {
{
// This sample uses JViews Diagrammer features. When deploying an
// application that includes this code, you need to be in possession
// of a Rogue Wave JViews Diagrammer Deployment license.
IlvProductUtil.DeploymentLicenseRequired(IlvProductUtil.JViews_Diagrammer_Deployment);
}
/** The grapher */
IlvHyperGrapher grapher = new IlvHyperGrapher();
/** The view of the grapher */
IlvManagerView mgrview = new IlvManagerView(grapher);
/** The sample connectors */
IlvHyperEdgeClippingConnector sampleConnector1 = new IlvHyperEdgeClippingConnector();
IlvHyperEdgeCenterConnector sampleConnector2 = new IlvHyperEdgeCenterConnector();
IlvHyperEdgeFixedConnector sampleConnector3 = new IlvHyperEdgeFixedConnector();
IlvMakeHyperEdgePinConnectorInteractor makePinInteractor =
new IlvMakeHyperEdgePinConnectorInteractor();
IlvMakeSegmentedHyperEdgeInteractor makeSegEdgeInteractor =
new IlvMakeSegmentedHyperEdgeInteractor();
/**
* Initializes the application.
*/
public void init() {
// create the scroll manager view
IlvJScrollManagerView scrollManView = new IlvJScrollManagerView(mgrview);
// Some settings on the manager view and on the scroll manager view
mgrview.setAntialiasing(true);
mgrview.setKeepingAspectRatio(true);
mgrview.setBackground(Color.white);
mgrview.setForeground(SystemColor.windowText);
Color xc = SystemColor.windowText;
xc = new Color(255 - xc.getRed(), 255 - xc.getGreen(), 255 - xc.getBlue());
mgrview.setDefaultXORColor(xc);
mgrview.setDefaultGhostColor(SystemColor.windowText);
mgrview.setZoomFactorRange(0.02, 10.0);
mgrview.setWheelZoomingEnabled(true);
scrollManView.setWheelScrollingEnabled(true);
// Settings parameters for selection handles
IlvHandlesSelection.defaultHandleColor = Color.black;
IlvHandlesSelection.defaultHandleBackgroundColor = Color.white;
IlvHandlesSelection.defaultHandleShape = IlvHandlesSelection.SQUARE_SHAPE;
// menu
JMenuBar menuBar = new JMenuBar();
createMenus(menuBar);
setJMenuBar(menuBar);
// create the standard control bar
IlvJManagerViewControlBar controlBar = new IlvJManagerViewControlBar();
controlBar.setView(mgrview);
createToolbarButtons(controlBar);
// modify the interactors such that the demo looks better
IlvSelectInteractor selInter = (IlvSelectInteractor) controlBar.getSelectInteractor();
selInter.setOpaqueMove(true);
selInter.setOpaqueResize(true);
((IlvZoomViewInteractor) controlBar.getZoomViewInteractor()).setPermanent(true);
// set the initial interactor
mgrview.setInteractor(controlBar.getSelectInteractor());
// init interactors
makePinInteractor.setPinSize(4);
// fit things together
getContentPane().add(BorderLayout.NORTH, controlBar);
getContentPane().add(BorderLayout.CENTER, scrollManView);
// configure the grapher
initAccelerators();
// create the contents of a sample grapher
fillGrapher();
}
/**
* Create the additional toolbar buttons.
*/
private void createToolbarButtons(IlvJManagerViewControlBar controlBar) {
InteractorButton b;
controlBar.addSeparator();
/*
* b = new InteractorButton(new ExpandInteractor(), "gif/Expand.gif", mgrview);
* b.setToolTipText(ResourceUtil.getString("Expand.tooltip")); controlBar.add(b);
*/
IlvGeneralPath sample1 = new IlvGeneralPath(new Rectangle2D.Double(0, 0, 40, 40));
sample1.setFillPaint(new GradientPaint(0, 0, Color.white, 20, 30, Color.yellow));
sample1.setStrokePaint(Color.black);
sample1.setFillOn(true);
sample1.setStrokeOn(true);
sample1.setPaintAbsolute(false);
b = new InteractorButton(new MakeNodeInteractor(sample1), mgrview);
b.setToolTipText(ResourceUtil.getString("CreateRectangle.tooltip"));
controlBar.add(b);
IlvGeneralPath sample2 = new IlvGeneralPath(new Ellipse2D.Double(0, 0, 40, 40));
sample2.setFillPaint(new GradientPaint(0, 30, Color.yellow, 30, 30, new Color(150, 255, 255)));
sample2.setStrokePaint(Color.black);
sample2.setFillOn(true);
sample2.setStrokeOn(true);
sample2.setPaintAbsolute(false);
b = new InteractorButton(new MakeNodeInteractor(sample2), mgrview);
b.setToolTipText(ResourceUtil.getString("CreateCircle.tooltip"));
controlBar.add(b);
IlvPoint[] pts = new IlvPoint[10];
for (int i = 0; i < 10; i++) {
int r = (i % 2 == 0 ? 25 : 10);
double angle = Math.PI + i * 2 * Math.PI / 10;
double s = r * Math.sin(angle);
double c = r * Math.cos(angle);
pts[i] = new IlvPoint(s, c);
}
IlvPolygon sample3 = new IlvPolygon(pts);
sample3.setBackground(Color.black);
sample3.setForeground(new Color(255, 220, 130));
sample3.setFillOn(true);
sample3.setStrokeOn(true);
b = new InteractorButton(new MakeNodeInteractor(sample3), mgrview);
b.setToolTipText(ResourceUtil.getString("CreateStar.tooltip"));
controlBar.add(b);
IlvHyperGrapher sample4 = new IlvHyperGrapher();
IlvConstantModeManagerFrame frame = new IlvConstantModeManagerFrame();
frame.setOpaque(true);
frame.setMinimumMargin(5);
frame.setForeground(Color.black);
frame.setBackground(new Color(200, 200, 255, 128));
frame.setShowingTitle(false);
sample4.setFrame(frame);
sample4.addNode(sample1, true);
IlvGraphic n2 = sample1.copy();
n2.move(0, 70);
sample4.addNode(n2, true);
IlvGraphic n3 = sample1.copy();
n3.move(70, 0);
sample4.addNode(n3, true);
b = new InteractorButton(new MakeNodeInteractor(sample4), mgrview);
b.setToolTipText(ResourceUtil.getString("CreateSubgraphConstant.tooltip"));
controlBar.add(b);
IlvHyperGrapher sample5 = new IlvHyperGrapher();
IlvDefaultManagerFrame frame2 = new IlvDefaultManagerFrame();
frame2.setOpaque(true);
frame2.setTopMargin(5);
frame2.setBottomMargin(5);
frame2.setLeftMargin(5);
frame2.setRightMargin(5);
frame2.setForeground(Color.black);
frame2.setBackground(new Color(255, 220, 200, 128));
frame2.setShowingTitle(false);
sample5.setFrame(frame2);
sample5.addNode(sample1.copy(), true);
n2 = sample1.copy();
n2.move(0, 70);
sample5.addNode(n2, true);
n3 = sample1.copy();
n3.move(70, 70);
sample5.addNode(n3, true);
b = new InteractorButton(new MakeNodeInteractor(sample5), mgrview);
b.setToolTipText(ResourceUtil.getString("CreateSubgraphVariable.tooltip"));
controlBar.add(b);
controlBar.addSeparator();
b = new InteractorButton(new IlvMakeHyperEdgeInteractor(), "gif/HyperEdge.gif", mgrview);
b.setToolTipText(ResourceUtil.getString("CreateHyperEdge.tooltip"));
controlBar.add(b);
b = new InteractorButton(makeSegEdgeInteractor, "gif/SegmentedHyperEdge.gif", mgrview);
b.setToolTipText(ResourceUtil.getString("CreateSegHyperEdge.tooltip"));
controlBar.add(b);
controlBar.addSeparator();
b = new InteractorButton(makePinInteractor, "gif/PinConnector.gif", mgrview);
b.setToolTipText(ResourceUtil.getString("InstallPinConnector.tooltip"));
controlBar.add(b);
b = new InteractorButton(new HyperEdgeConnectorInteractor(sampleConnector1),
"gif/ClipConnector.gif", mgrview);
b.setToolTipText(ResourceUtil.getString("InstallClipConnector.tooltip"));
controlBar.add(b);
b = new InteractorButton(new HyperEdgeConnectorInteractor(sampleConnector2),
"gif/CenterConnector.gif", mgrview);
b.setToolTipText(ResourceUtil.getString("InstallCenterConnector.tooltip"));
controlBar.add(b);
b = new InteractorButton(new HyperEdgeConnectorInteractor(null), "gif/NoConnector.gif",
mgrview);
b.setToolTipText(ResourceUtil.getString("DeinstallConnector.tooltip"));
controlBar.add(b);
// alternative implementation of "no connector"
/*
* b = new InteractorButton(new HyperEdgeConnectorInteractor(sampleConnector3),
* "gif/NoConnector.gif", mgrview);
* b.setToolTipText(ResourceUtil.getString("DeinstallConnector.tooltip")); controlBar.add(b);
*/
}
/**
* Create the menu.
*/
private void createMenus(JMenuBar menuBar) {
JMenu menu = new JMenu(ResourceUtil.getString("File.menu.title"));
menuBar.add(menu);
JMenuItem mitem = new JMenuItem(ResourceUtil.getString("ClearWindow.menuitem.title"));
mitem.setActionCommand("ClearWindow");
mitem.addActionListener(actionListener);
menu.add(mitem);
mitem = new JMenuItem(ResourceUtil.getString("LoadFile.menuitem.title"));
mitem.setActionCommand("LoadFile");
mitem.addActionListener(actionListener);
menu.add(mitem);
mitem = new JMenuItem(ResourceUtil.getString("SaveFile.menuitem.title"));
mitem.setActionCommand("SaveFile");
mitem.addActionListener(actionListener);
menu.add(mitem);
mitem = new JMenuItem(ResourceUtil.getString("Quit.menuitem.title"));
mitem.setActionCommand("Quit");
mitem.addActionListener(actionListener);
menu.add(mitem);
menu = new JMenu(ResourceUtil.getString("Options.menu.title"));
menuBar.add(menu);
mitem = new JMenuItem(ResourceUtil.getString("ConnectorOptions.menuitem.title"));
mitem.setActionCommand("ConnectorOptions");
mitem.addActionListener(actionListener);
menu.add(mitem);
mitem = new JMenuItem(ResourceUtil.getString("GridOptions.menuitem.title"));
mitem.setActionCommand("GridOptions");
mitem.addActionListener(actionListener);
menu.add(mitem);
mitem = new JMenuItem(ResourceUtil.getString("CrossingOptions.menuitem.title"));
mitem.setActionCommand("CrossingOptions");
mitem.addActionListener(actionListener);
menu.add(mitem);
}
/**
* Action listener for the menu.
*/
private ActionListener actionListener = new ActionListener() {
Override
public void actionPerformed(ActionEvent action) {
String command = action.getActionCommand();
if (command.equals("ClearWindow")) {
grapher.deleteAll(true);
} else if (command.equals("LoadFile")) {
JFileChooser chooser = new JFileChooser(".");
chooser.addChoosableFileFilter(new javax.swing.filechooser.FileFilter() {
Override
public boolean accept(File f) {
return f.isDirectory() || f.getName().endsWith(".ivl");
}
Override
public String getDescription() {
return "*.ivl";
}
});
chooser.setDialogTitle(ResourceUtil.getString("Load.filechooser.title"));
int returnVal = chooser.showOpenDialog(HyperGrapherDemo.this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
String fileName = chooser.getSelectedFile().getPath();
try {
grapher.deleteAll(true);
grapher.read(fileName);
grapher.reDraw();
} catch (Exception ex) {
JOptionPane.showMessageDialog(HyperGrapherDemo.this,
"Cannot load file '" + fileName + "'", "Read Error", JOptionPane.ERROR_MESSAGE);
ex.printStackTrace();
}
}
} else if (command.equals("SaveFile")) {
JFileChooser chooser = new JFileChooser(".");
chooser.addChoosableFileFilter(new javax.swing.filechooser.FileFilter() {
Override
public boolean accept(File f) {
return f.isDirectory() || f.getName().endsWith(".ivl");
}
Override
public String getDescription() {
return "*.ivl";
}
});
chooser.setDialogTitle(ResourceUtil.getString("Save.filechooser.title"));
int returnVal = chooser.showSaveDialog(HyperGrapherDemo.this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
String fileName = chooser.getSelectedFile().getPath();
if (!fileName.endsWith(".ivl"))
fileName = fileName + ".ivl";
try {
grapher.write(fileName);
} catch (IOException ex) {
JOptionPane.showMessageDialog(HyperGrapherDemo.this,
"Cannot save file '" + fileName + "'", "Write Error", JOptionPane.ERROR_MESSAGE);
ex.printStackTrace();
}
}
} else if (command.equals("Quit")) {
System.exit(0);
} else if (command.equals("ConnectorOptions")) {
showConnectorOptionsDialog();
} else if (command.equals("GridOptions")) {
showGridOptionsDialog();
} else if (command.equals("CrossingOptions")) {
showCrossingOptionsDialog();
}
}
};
/**
* Initialize the accelerators.
*/
private void initAccelerators() {
grapher.addAccelerator(
new IlvDeleteSelectionAccelerator(KeyEvent.KEY_PRESSED, KeyEvent.VK_DELETE, 0));
grapher.addAccelerator(
new IlvIdentityAccelerator(KeyEvent.KEY_PRESSED, KeyEvent.VK_I, KeyEvent.CTRL_MASK));
grapher.addAccelerator(
new IlvZoomOutAccelerator(KeyEvent.KEY_PRESSED, KeyEvent.VK_U, KeyEvent.CTRL_MASK));
grapher.addAccelerator(
new IlvZoomInAccelerator(KeyEvent.KEY_PRESSED, KeyEvent.VK_Z, KeyEvent.CTRL_MASK));
grapher.addAccelerator(
new IlvFitToSizeAccelerator(KeyEvent.KEY_PRESSED, KeyEvent.VK_F, KeyEvent.CTRL_MASK));
grapher.addAccelerator(
new IlvRotateAccelerator(KeyEvent.KEY_PRESSED, KeyEvent.VK_R, KeyEvent.CTRL_MASK));
grapher.addAccelerator(new IlvScrollUpAccelerator(KeyEvent.KEY_PRESSED, KeyEvent.VK_UP, 0));
grapher.addAccelerator(new IlvScrollDownAccelerator(KeyEvent.KEY_PRESSED, KeyEvent.VK_DOWN, 0));
grapher
.addAccelerator(new IlvScrollRightAccelerator(KeyEvent.KEY_PRESSED, KeyEvent.VK_RIGHT, 0));
grapher.addAccelerator(new IlvScrollLeftAccelerator(KeyEvent.KEY_PRESSED, KeyEvent.VK_LEFT, 0));
}
/**
* Fill the contents of a grapher.
*/
private void fillGrapher() {
grapher.setLinksInsertionLayer(3);
IlvHyperEdgeEnd end;
IlvRect bbox;
IlvGeneralPath sample = new IlvGeneralPath(new Rectangle2D.Double(0, 0, 40, 40));
sample.setFillPaint(new GradientPaint(0, 0, Color.white, 20, 30, Color.yellow));
sample.setStrokePaint(Color.black);
sample.setFillOn(true);
sample.setStrokeOn(true);
sample.setPaintAbsolute(false);
// first create the nodes
IlvGraphic[] nodes = new IlvGraphic[24];
IlvHyperGrapher subgraph1 = new IlvHyperGrapher();
IlvHyperGrapher subgraph2 = new IlvHyperGrapher();
IlvDefaultManagerFrame frame = new IlvDefaultManagerFrame();
frame.setOpaque(true);
frame.setTopMargin(5);
frame.setBottomMargin(5);
frame.setLeftMargin(5);
frame.setRightMargin(5);
frame.setForeground(Color.black);
frame.setBackground(new Color(255, 220, 200, 128));
frame.setShowingTitle(false);
subgraph1.setFrame(frame);
frame = new IlvDefaultManagerFrame();
frame.setOpaque(true);
frame.setTopMargin(5);
frame.setBottomMargin(5);
frame.setLeftMargin(5);
frame.setRightMargin(5);
frame.setForeground(Color.black);
frame.setBackground(new Color(225, 220, 255, 128));
frame.setShowingTitle(false);
subgraph2.setFrame(frame);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 6; j++) {
if (i == 1 && j == 3) {
nodes[j * 4 + i] = nodes[(j - 1) * 4 + i];
nodes[j * 4 + i].resize(40, 120);
} else if (i == 3 && j == 2) {
nodes[j * 4 + i] = nodes[(j - 1) * 4 + i];
nodes[j * 4 + i].resize(40, 120);
} else if (i == 3 && j == 4) {
nodes[j * 4 + i] = nodes[(j - 1) * 4 + i];
nodes[j * 4 + i].resize(40, 120);
} else {
nodes[j * 4 + i] = sample.copy();
nodes[j * 4 + i].moveResize(new IlvRect(10 + i * 120, 10 + j * 80, 40, 40));
}
}
}
// add the nodes
IlvHyperGrapher owner;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 6; j++) {
owner = grapher;
if (i < 2 && j >= 4)
owner = subgraph2;
if (i == 2 && j >= 4)
owner = subgraph1;
if (nodes[j * 4 + i].getGraphicBag() == null)
owner.addNode(nodes[j * 4 + i], true);
}
}
subgraph1.addNode(subgraph2, true);
grapher.addNode(subgraph1, true);
// add a simple hyperedge
IlvHyperEdge hyperEdge = new IlvHyperEdge();
hyperEdge.setLineWidth(2);
for (int i = 0; i < 3; i++) {
end = hyperEdge.addFrom(nodes[i * 4]);
bbox = nodes[i * 4].boundingBox(null);
end.setPosition(new IlvPoint(bbox.x + bbox.width, bbox.y + 0.5 * bbox.height), null);
}
for (int i = 0; i < 2; i++) {
end = hyperEdge.addTo(nodes[i * 4 + 1]);
bbox = nodes[i * 4 + 1].boundingBox(null);
end.setPosition(new IlvPoint(bbox.x, bbox.y + 0.5 * bbox.height), null);
}
grapher.addHyperEdge(hyperEdge, true);
// add a segmented hyperedge
IlvSegmentedHyperEdge shyperEdge = new IlvSegmentedHyperEdge();
IlvSegmentedHyperEdge.Segment seg1, seg2, seg3, seg4, seg5, seg6, seg7, seg8, seg9, seg10;
shyperEdge.setLineWidth(2);
shyperEdge.setAutoConnect(false);
end = shyperEdge.addFrom(nodes[8]);
bbox = nodes[8].boundingBox(null);
end.setPosition(new IlvPoint(bbox.x + bbox.width, bbox.y + 0.5 * bbox.height), null);
seg1 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[9]);
bbox = nodes[9].boundingBox(null);
end.setPosition(new IlvPoint(bbox.x, bbox.y + 0.3 * bbox.height), null);
seg2 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[9]);
end.setPosition(new IlvPoint(bbox.x, bbox.y + 0.7 * bbox.height), null);
seg3 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addFrom(nodes[12]);
bbox = nodes[12].boundingBox(null);
end.setPosition(new IlvPoint(bbox.x + bbox.width, bbox.y + 0.5 * bbox.height), null);
seg4 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[17]);
bbox = nodes[17].boundingBox(null);
end.setPosition(new IlvPoint(bbox.x, bbox.y + 0.3 * bbox.height), null);
seg5 = shyperEdge.addSegment(end, 0);
seg6 = shyperEdge.addSegment(seg5, 90, 110, 0, null);
shyperEdge.connectSegments(seg1, seg6);
shyperEdge.connectSegments(seg2, seg6);
shyperEdge.connectSegments(seg3, seg6);
shyperEdge.connectSegments(seg4, seg6);
shyperEdge.setAutoConnect(true);
grapher.addHyperEdge(shyperEdge, true);
// another segmented hyperedge
shyperEdge = new IlvSegmentedHyperEdge();
shyperEdge.setLineWidth(2);
shyperEdge.setAutoConnect(false);
end = shyperEdge.addFrom(nodes[12]);
bbox = nodes[12].boundingBox(null);
end.setPosition(new IlvPoint(bbox.x + 0.5 * bbox.width, bbox.y + bbox.height), null);
seg1 = shyperEdge.addSegment(end, 90);
end = shyperEdge.addTo(nodes[16]);
bbox = nodes[16].boundingBox(null);
end.setPosition(new IlvPoint(bbox.x + 0.5 * bbox.width, bbox.y), null);
seg2 = shyperEdge.addSegment(end, 90);
end = shyperEdge.addTo(nodes[17]);
bbox = nodes[17].boundingBox(null);
end.setPosition(new IlvPoint(bbox.x, bbox.y + 0.7 * bbox.height), null);
seg3 = shyperEdge.addSegment(end, 0);
seg4 = shyperEdge.addSegment(seg3, 90, 90, 0, null);
seg5 = shyperEdge.addSegment(seg4, 0, 0, 310, null);
shyperEdge.connectSegments(seg1, seg5);
shyperEdge.connectSegments(seg2, seg5);
shyperEdge.setAutoConnect(true);
grapher.addHyperEdge(shyperEdge, true);
// yet another segmented hyperedge
shyperEdge = new IlvSegmentedHyperEdge();
shyperEdge.setLineWidth(2);
shyperEdge.setAutoConnect(false);
end = shyperEdge.addFrom(nodes[13]);
bbox = nodes[13].boundingBox(null);
end.setPosition(new IlvPoint(bbox.x + 0.5 * bbox.width, bbox.y + bbox.height), null);
seg1 = shyperEdge.addSegment(end, 90);
end = shyperEdge.addTo(nodes[17]);
bbox = nodes[17].boundingBox(null);
end.setPosition(new IlvPoint(bbox.x + 0.5 * bbox.width, bbox.y), null);
seg2 = shyperEdge.addSegment(end, 90);
end = shyperEdge.addTo(nodes[22]);
bbox = nodes[22].boundingBox(null);
end.setPosition(new IlvPoint(bbox.x, bbox.y + 0.5 * bbox.height), null);
seg3 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[21]);
bbox = nodes[21].boundingBox(null);
end.setPosition(new IlvPoint(bbox.x, bbox.y + 0.5 * bbox.height), null);
seg4 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[20]);
bbox = nodes[20].boundingBox(null);
end.setPosition(new IlvPoint(bbox.x + bbox.width, bbox.y + 0.5 * bbox.height), null);
seg5 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[16]);
bbox = nodes[16].boundingBox(null);
end.setPosition(new IlvPoint(bbox.x + bbox.width, bbox.y + 0.5 * bbox.height), null);
seg6 = shyperEdge.addSegment(end, 0);
seg7 = shyperEdge.addSegment(seg6, 90, 70, 0, null);
shyperEdge.connectSegments(seg7, seg5);
shyperEdge.connectSegments(seg7, seg4);
seg8 = shyperEdge.addSegment(seg7, 0, 0, 390, null);
seg9 = shyperEdge.addSegment(seg8, 90, 190, 0, null);
shyperEdge.connectSegments(seg9, seg3);
seg10 = shyperEdge.addSegment(seg9, 0, 0, 310, null);
shyperEdge.connectSegments(seg10, seg2);
shyperEdge.connectSegments(seg10, seg1);
shyperEdge.setAutoConnect(true);
grapher.addHyperEdge(shyperEdge, true);
// yet another segmented hyperedge
shyperEdge = new IlvSegmentedHyperEdge();
shyperEdge.setLineWidth(2);
shyperEdge.setAutoConnect(false);
end = shyperEdge.addFrom(nodes[18]);
bbox = nodes[18].boundingBox(null);
end.setPosition(new IlvPoint(bbox.x + 0.5 * bbox.width, bbox.y + bbox.height), null);
seg1 = shyperEdge.addSegment(end, 90);
end = shyperEdge.addTo(nodes[22]);
bbox = nodes[22].boundingBox(null);
end.setPosition(new IlvPoint(bbox.x + 0.2 * bbox.width, bbox.y), null);
seg2 = shyperEdge.addSegment(end, 90);
end = shyperEdge.addTo(nodes[22]);
end.setPosition(new IlvPoint(bbox.x + 0.4 * bbox.width, bbox.y), null);
seg3 = shyperEdge.addSegment(end, 90);
end = shyperEdge.addTo(nodes[22]);
end.setPosition(new IlvPoint(bbox.x + 0.6 * bbox.width, bbox.y), null);
seg4 = shyperEdge.addSegment(end, 90);
end = shyperEdge.addTo(nodes[22]);
end.setPosition(new IlvPoint(bbox.x + 0.8 * bbox.width, bbox.y), null);
seg5 = shyperEdge.addSegment(end, 90);
seg6 = shyperEdge.addSegment(seg1, 0, 0, 390, null);
shyperEdge.connectSegments(seg6, seg2);
shyperEdge.connectSegments(seg6, seg3);
shyperEdge.connectSegments(seg6, seg4);
shyperEdge.connectSegments(seg6, seg5);
shyperEdge.setAutoConnect(true);
grapher.addHyperEdge(shyperEdge, true);
// create pins
IlvHyperEdgePinConnector conn;
for (int i = 2; i < 4; i++) {
for (int j = 0; j < 6; j++) {
if (i == 2 && j > 3)
continue;
bbox = nodes[j * 4 + i].boundingBox(null);
conn = new IlvHyperEdgePinConnector(nodes[j * 4 + i]);
int n = 2;
if (bbox.height > 40)
n = 8;
for (int k = 0; k < n; k++) {
conn.addPin(new IlvHyperGrapherPin(new IlvPoint(0, (k + 1) / (n + 1.)),
new IlvPoint(-4, 0), 4, 0), true);
}
for (int k = 0; k < n; k++) {
conn.addPin(
new IlvHyperGrapherPin(new IlvPoint(1, (k + 1) / (n + 1.)), new IlvPoint(4, 0), 4, 0),
true);
}
}
}
// hyperedge from pins to pins
shyperEdge = new IlvSegmentedHyperEdge();
shyperEdge.setLineWidth(2);
shyperEdge.setAutoConnect(false);
end = shyperEdge.addFrom(nodes[2]);
bbox = nodes[2].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x + bbox.width, bbox.y + 0.7 * bbox.height), null);
seg1 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[3]);
bbox = nodes[3].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x, bbox.y + 0.3 * bbox.height), null);
seg2 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[3]);
bbox = nodes[3].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x + bbox.width, bbox.y + 0.3 * bbox.height), null);
seg3 = shyperEdge.addSegment(end, 0);
seg4 = shyperEdge.addSegment(seg1, 90, 330, 0, null);
shyperEdge.connectSegments(seg4, seg2);
seg5 = shyperEdge.addSegment(seg4, 0, 0, 70, null);
seg6 = shyperEdge.addSegment(seg5, 90, 450, 0, null);
shyperEdge.connectSegments(seg6, seg3);
shyperEdge.setAutoConnect(true);
grapher.addHyperEdge(shyperEdge, true);
// another hyperedge from pins to pins
shyperEdge = new IlvSegmentedHyperEdge();
shyperEdge.setLineWidth(2);
shyperEdge.setAutoConnect(false);
end = shyperEdge.addFrom(nodes[14]);
bbox = nodes[14].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x + bbox.width, bbox.y + 0.3 * bbox.height), null);
seg1 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[15]);
bbox = nodes[15].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x, bbox.y + 53), null);
seg2 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[7]);
bbox = nodes[7].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x, bbox.y + 106), null);
seg3 = shyperEdge.addSegment(end, 0);
seg4 = shyperEdge.addSegment(seg1, 90, 295 + 4 * 14, 0, null);
shyperEdge.connectSegments(seg4, seg2);
shyperEdge.connectSegments(seg4, seg3);
shyperEdge.setAutoConnect(true);
grapher.addHyperEdge(shyperEdge, true);
// another hyperedge from pins to pins
shyperEdge = new IlvSegmentedHyperEdge();
shyperEdge.setLineWidth(2);
shyperEdge.setAutoConnect(false);
end = shyperEdge.addFrom(nodes[14]);
bbox = nodes[14].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x + bbox.width, bbox.y + 0.7 * bbox.height), null);
seg1 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[15]);
bbox = nodes[15].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x, bbox.y + 66), null);
seg2 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[7]);
bbox = nodes[7].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x, bbox.y + 93), null);
seg3 = shyperEdge.addSegment(end, 0);
seg4 = shyperEdge.addSegment(seg1, 90, 295 + 3 * 14, 0, null);
shyperEdge.connectSegments(seg4, seg2);
shyperEdge.connectSegments(seg4, seg3);
shyperEdge.setAutoConnect(true);
grapher.addHyperEdge(shyperEdge, true);
// another hyperedge from pins to pins
shyperEdge = new IlvSegmentedHyperEdge();
shyperEdge.setLineWidth(2);
shyperEdge.setAutoConnect(false);
end = shyperEdge.addFrom(nodes[10]);
bbox = nodes[10].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x + bbox.width, bbox.y + 0.3 * bbox.height), null);
seg1 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[15]);
bbox = nodes[15].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x, bbox.y + 80), null);
seg2 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[7]);
bbox = nodes[7].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x, bbox.y + 80), null);
seg3 = shyperEdge.addSegment(end, 0);
seg4 = shyperEdge.addSegment(seg1, 90, 295 + 2 * 14, 0, null);
shyperEdge.connectSegments(seg4, seg2);
shyperEdge.connectSegments(seg4, seg3);
shyperEdge.setAutoConnect(true);
grapher.addHyperEdge(shyperEdge, true);
// another hyperedge from pins to pins
shyperEdge = new IlvSegmentedHyperEdge();
shyperEdge.setLineWidth(2);
shyperEdge.setAutoConnect(false);
end = shyperEdge.addFrom(nodes[10]);
bbox = nodes[10].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x + bbox.width, bbox.y + 0.7 * bbox.height), null);
seg1 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[15]);
bbox = nodes[15].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x, bbox.y + 93), null);
seg2 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[7]);
bbox = nodes[7].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x, bbox.y + 66), null);
seg3 = shyperEdge.addSegment(end, 0);
seg4 = shyperEdge.addSegment(seg1, 90, 295 + 14, 0, null);
shyperEdge.connectSegments(seg4, seg2);
shyperEdge.connectSegments(seg4, seg3);
end = shyperEdge.addTo(nodes[23]);
bbox = nodes[23].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x, bbox.y + 13), null);
seg5 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[23]);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x, bbox.y + 26), null);
seg6 = shyperEdge.addSegment(end, 0);
shyperEdge.connectSegments(seg4, seg5);
shyperEdge.connectSegments(seg4, seg6);
end = shyperEdge.addTo(nodes[10]);
bbox = nodes[10].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x, bbox.y + 13), null);
seg7 = shyperEdge.addSegment(end, 0);
seg8 = shyperEdge.addSegment(seg7, 90, 175 + 3 * 14, 0, null);
shyperEdge.connectSegments(seg8, seg3);
shyperEdge.setAutoConnect(true);
grapher.addHyperEdge(shyperEdge, true);
// another hyperedge from pins to pins
shyperEdge = new IlvSegmentedHyperEdge();
shyperEdge.setLineWidth(2);
shyperEdge.setAutoConnect(false);
end = shyperEdge.addFrom(nodes[6]);
bbox = nodes[6].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x, bbox.y + 0.3 * bbox.height), null);
seg1 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[2]);
bbox = nodes[2].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x, bbox.y + 0.7 * bbox.height), null);
seg2 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[10]);
bbox = nodes[10].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x, bbox.y + 0.7 * bbox.height), null);
seg3 = shyperEdge.addSegment(end, 0);
seg4 = shyperEdge.addSegment(seg1, 90, 175 + 2 * 14, 0, null);
shyperEdge.connectSegments(seg4, seg2);
shyperEdge.connectSegments(seg4, seg3);
shyperEdge.setAutoConnect(true);
grapher.addHyperEdge(shyperEdge, true);
// another hyperedge from pins to pins
shyperEdge = new IlvSegmentedHyperEdge();
shyperEdge.setLineWidth(2);
shyperEdge.setAutoConnect(false);
end = shyperEdge.addFrom(nodes[6]);
bbox = nodes[6].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x, bbox.y + 0.7 * bbox.height), null);
seg1 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[2]);
bbox = nodes[2].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x, bbox.y + 0.3 * bbox.height), null);
seg2 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[14]);
bbox = nodes[14].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x, bbox.y + 0.3 * bbox.height), null);
seg3 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[14]);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x, bbox.y + 0.7 * bbox.height), null);
seg4 = shyperEdge.addSegment(end, 0);
seg5 = shyperEdge.addSegment(seg1, 90, 175 + 14, 0, null);
shyperEdge.connectSegments(seg5, seg2);
shyperEdge.connectSegments(seg5, seg3);
shyperEdge.connectSegments(seg5, seg4);
shyperEdge.setAutoConnect(true);
grapher.addHyperEdge(shyperEdge, true);
// another hyperedge from pins to pins
shyperEdge = new IlvSegmentedHyperEdge();
shyperEdge.setLineWidth(2);
shyperEdge.setAutoConnect(false);
end = shyperEdge.addFrom(nodes[23]);
bbox = nodes[23].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x + bbox.width, bbox.y + 0.3 * bbox.height), null);
seg1 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[19]);
bbox = nodes[19].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x + bbox.width, bbox.y + 106), null);
seg2 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[19]);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x + bbox.width, bbox.y + 93), null);
seg3 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[19]);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x + bbox.width, bbox.y + 80), null);
seg4 = shyperEdge.addSegment(end, 0);
seg5 = shyperEdge.addSegment(seg1, 90, 450, 0, null);
shyperEdge.connectSegments(seg5, seg2);
shyperEdge.connectSegments(seg5, seg3);
shyperEdge.connectSegments(seg5, seg4);
shyperEdge.setAutoConnect(true);
grapher.addHyperEdge(shyperEdge, true);
// another hyperedge from pins to pins
shyperEdge = new IlvSegmentedHyperEdge();
shyperEdge.setLineWidth(2);
shyperEdge.setAutoConnect(false);
end = shyperEdge.addFrom(nodes[23]);
bbox = nodes[23].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x + bbox.width, bbox.y + 0.7 * bbox.height), null);
seg1 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[19]);
bbox = nodes[19].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x + bbox.width, bbox.y + 67), null);
seg2 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[19]);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x + bbox.width, bbox.y + 53), null);
seg3 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[19]);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x + bbox.width, bbox.y + 40), null);
seg4 = shyperEdge.addSegment(end, 0);
seg5 = shyperEdge.addSegment(seg1, 90, 470, 0, null);
shyperEdge.connectSegments(seg5, seg2);
shyperEdge.connectSegments(seg5, seg3);
shyperEdge.connectSegments(seg5, seg4);
shyperEdge.setAutoConnect(true);
grapher.addHyperEdge(shyperEdge, true);
// hyperedge with 45 degree segment
shyperEdge = new IlvSegmentedHyperEdge();
shyperEdge.setLineWidth(2);
shyperEdge.setAutoConnect(false);
end = shyperEdge.addFrom(nodes[6]);
bbox = nodes[6].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x + bbox.width, bbox.y + 0.7 * bbox.height), null);
seg1 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[7]);
bbox = nodes[7].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x, bbox.y + 13), null);
seg2 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[7]);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x, bbox.y + 40), null);
seg3 = shyperEdge.addSegment(end, 0);
seg4 = shyperEdge.addSegment(seg1, -45, 320, 116, null);
seg5 = shyperEdge.addSegment(seg1, 45, 320, 116, null);
shyperEdge.connectSegments(seg4, seg2);
shyperEdge.connectSegments(seg5, seg3);
shyperEdge.setAutoConnect(true);
grapher.addHyperEdge(shyperEdge, true);
// hyperedge with variable angle segments
shyperEdge = new IlvSegmentedHyperEdge();
shyperEdge.setLineWidth(2);
shyperEdge.setAutoConnect(false);
end = shyperEdge.addFrom(nodes[15]);
bbox = nodes[15].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x + bbox.width, bbox.y + 12), null);
seg1 = shyperEdge.addSegment(end, 0);
end = shyperEdge.addTo(nodes[7]);
bbox = nodes[7].boundingBox(null);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x + bbox.width, bbox.y + 13), null);
seg2 = shyperEdge.addSegment(end, 450, 100, null);
end = shyperEdge.addTo(nodes[7]);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x + bbox.width, bbox.y + 26), null);
seg3 = shyperEdge.addSegment(end, 450, 100, null);
end = shyperEdge.addTo(nodes[7]);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x + bbox.width, bbox.y + 40), null);
seg4 = shyperEdge.addSegment(end, 450, 100, null);
end = shyperEdge.addTo(nodes[7]);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x + bbox.width, bbox.y + 53), null);
seg5 = shyperEdge.addSegment(end, 450, 100, null);
end = shyperEdge.addTo(nodes[7]);
conn = (IlvHyperEdgePinConnector) IlvHyperEdgeConnector.Get(end);
conn.connect(end, new IlvPoint(bbox.x + bbox.width, bbox.y + 66), null);
seg6 = shyperEdge.addSegment(end, 450, 100, null);
seg7 = shyperEdge.addSegment(seg1, 90, 470, 0, null);
seg8 = shyperEdge.addSegment(seg7, 0, 0, bbox.y + 40, null);
shyperEdge.connectSegments(seg8, seg2);
shyperEdge.connectSegments(seg8, seg3);
shyperEdge.connectSegments(seg8, seg4);
shyperEdge.connectSegments(seg8, seg5);
shyperEdge.connectSegments(seg8, seg6);
shyperEdge.setAutoConnect(true);
grapher.addHyperEdge(shyperEdge, true);
}
// ---------------------------------------------------------------------------
// Options for hyperedge connectors
// whether we allow moving connection points
private boolean allowMovingConnPts = true;
// whether IlvHyperEdgeClippingConnector clips to center
private boolean clipToCenter = false;
// whether IlvHyperGrapherPins are visible
private boolean pinsVisible = true;
// whether IlvHyperGrapherPins are movable
private boolean pinsMovable = true;
// whether IlvHyperGrapherPins allow multiple hyperedge ends
private boolean allowMultiEnds = false;
// whether pins are in node layer, in front of node, or behind node
private int layerModeIndex = 0;
private static final int[] layerModes = new int[] {IlvHyperEdgeConnector.IN_NODE_LAYER,
IlvHyperEdgeConnector.IN_FRONT, IlvHyperEdgeConnector.IN_BACK};
// Whether pin dragging is restricted to the border of the bounding box
private boolean restrictToNodeBorder = true;
// The offset of the pin
private int pinOffsetIndex = 0;
private static final int[] pinOffsets = new int[] {3, 0, -3};
/**
* Shows the hyperedge connector options dialog.
*/
private void showConnectorOptionsDialog() {
Frame frame = JOptionPane.getFrameForComponent(this);
JDialog dialog = new ConnectorOptionsDialog(frame, this);
dialog.setVisible(true);
evaluateConnectorOptions();
}
/**
* Evaluates the hyperedge connector options.
*/
private void evaluateConnectorOptions() {
// use buffered enumeration since setLayerMode modifies the content
// of the grapher
IlvGraphicEnumeration e = new IlvBufferedGraphicEnumeration(grapher.getObjects(true));
while (e.hasMoreElements()) {
IlvGraphic g = e.nextElement();
final IlvHyperEdgeConnector conn = IlvHyperEdgeConnector.GetAttached(g);
if (conn != null) {
g.getGraphicBag().applyToObject(g, new IlvApplyObject() {
Override
public void apply(IlvGraphic g, Object arg) {
conn.setConnectionPointMoveAllowed(allowMovingConnPts);
conn.setLayerMode(layerModes[layerModeIndex]);
if (conn instanceof IlvHyperEdgeClippingConnector) {
IlvHyperEdgeClippingConnector cconn = (IlvHyperEdgeClippingConnector) conn;
cconn.setClipToCenter(clipToCenter);
}
if (conn instanceof IlvHyperEdgePinConnector) {
IlvHyperEdgePinConnector pconn = (IlvHyperEdgePinConnector) conn;
pconn.setPinDraggingRestrictedToNodeBorder(restrictToNodeBorder);
Iterator<?> iter = pconn.getPins();
while (iter.hasNext()) {
IlvHyperGrapherPin pin = (IlvHyperGrapherPin) iter.next();
pin.setVisible(pinsVisible);
pin.setMovable(pinsMovable);
// can only change this option if nothing is yet connected
if (!pin.getConnectedEnds().hasNext())
pin.setAllowMultiConnection(allowMultiEnds);
if (!pinsVisible)
pin.setDirection(IlvDirection.Center);
else
pin.setDirection(0);
if (restrictToNodeBorder) {
int offs = pinOffsets[pinOffsetIndex];
IlvHyperEdgePinConnector.snapPinToNodeBorder(pin, offs);
} else {
IlvPoint p = pin.getPosition(null);
pin.setAbsoluteOffset(0, 0);
pin.setPosition(p, null);
}
}
}
}
}, null, true);
}
}
// the sample connectors are not attached to any graphic, so they can be
// changed directly.
sampleConnector1.setConnectionPointMoveAllowed(allowMovingConnPts);
sampleConnector2.setConnectionPointMoveAllowed(allowMovingConnPts);
sampleConnector3.setConnectionPointMoveAllowed(allowMovingConnPts);
sampleConnector1.setClipToCenter(clipToCenter);
sampleConnector1.setLayerMode(layerModes[layerModeIndex]);
sampleConnector2.setLayerMode(layerModes[layerModeIndex]);
sampleConnector3.setLayerMode(layerModes[layerModeIndex]);
makePinInteractor.setConnectionPointMoveAllowed(allowMovingConnPts);
makePinInteractor.setPinLayerMode(layerModes[layerModeIndex]);
makePinInteractor.setPinVisible(pinsVisible);
makePinInteractor.setPinMovable(pinsMovable);
if (!restrictToNodeBorder)
makePinInteractor.setPinOffset(0);
else
makePinInteractor.setPinOffset(pinOffsets[pinOffsetIndex]);
makePinInteractor.setPinDraggingRestrictedToNodeBorder(restrictToNodeBorder);
if (!pinsVisible)
makePinInteractor.setPinDirection(IlvDirection.Center);
else
makePinInteractor.setPinDirection(0);
makePinInteractor.setPinAllowMultiConnection(allowMultiEnds);
}
/**
* The dialog class to show the hyperedge connector options.
*/
class ConnectorOptionsDialog extends JDialog implements ActionListener {
public ConnectorOptionsDialog(Frame frame, Component locationComp) {
super(frame, ResourceUtil.getString("ConnectorOptions.dialog.title"), true);
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
contentPane.add(BorderLayout.CENTER, panel);
addCheckBox(panel, "AllowMovingConnPts", this, allowMovingConnPts);
addCheckBox(panel, "ClipToCenter", this, clipToCenter);
addCheckBox(panel, "PinsWithMultiEnds", this, allowMultiEnds);
addCheckBox(panel, "PinsVisible", this, pinsVisible);
addCheckBox(panel, "PinsMovable", this, pinsMovable);
addCheckBox(panel, "PinsAtBorder", this, restrictToNodeBorder);
addListBox(panel, "PinLayer", new String[] {"InNodeLayer", "InFront", "InBack"}, this,
layerModeIndex);
addListBox(panel, "PinOffset", new String[] {"Outside", "Center", "Inside"}, this,
pinOffsetIndex);
layoutDialogPanel(panel);
JButton okayButton = new JButton(ResourceUtil.getString("Okay.button"));
okayButton.setActionCommand("Okay");
okayButton.addActionListener(this);
JPanel aux = new JPanel(new FlowLayout(FlowLayout.CENTER));
aux.add(okayButton);
contentPane.add(BorderLayout.SOUTH, aux);
pack();
setLocationRelativeTo(locationComp);
}
Override
public void actionPerformed(ActionEvent e) {
if ("AllowMovingConnPts".equals(e.getActionCommand())) {
JCheckBox box = (JCheckBox) e.getSource();
allowMovingConnPts = box.isSelected();
} else if ("ClipToCenter".equals(e.getActionCommand())) {
JCheckBox box = (JCheckBox) e.getSource();
clipToCenter = box.isSelected();
} else if ("PinsWithMultiEnds".equals(e.getActionCommand())) {
JCheckBox box = (JCheckBox) e.getSource();
allowMultiEnds = box.isSelected();
} else if ("PinsVisible".equals(e.getActionCommand())) {
JCheckBox box = (JCheckBox) e.getSource();
pinsVisible = box.isSelected();
} else if ("PinsMovable".equals(e.getActionCommand())) {
JCheckBox box = (JCheckBox) e.getSource();
pinsMovable = box.isSelected();
} else if ("PinsAtBorder".equals(e.getActionCommand())) {
JCheckBox box = (JCheckBox) e.getSource();
restrictToNodeBorder = box.isSelected();
} else if ("PinLayer".equals(e.getActionCommand())) {
SuppressWarnings("unchecked")
JComboBox<String> box = (JComboBox<String>) e.getSource();
layerModeIndex = box.getSelectedIndex();
} else if ("PinOffset".equals(e.getActionCommand())) {
SuppressWarnings("unchecked")
JComboBox<String> box = (JComboBox<String>) e.getSource();
pinOffsetIndex = box.getSelectedIndex();
} else if ("Okay".equals(e.getActionCommand())) {
setVisible(false);
}
}
}
// ---------------------------------------------------------------------------
// Options for grid
private boolean gridVisible = false;
private boolean gridActive = false;
private float gridSpacingX = 10;
private float gridSpacingY = 10;
private float gridBaseX = 0;
private float gridBaseY = 0;
/**
* Shows the grid options dialog.
*/
private void showGridOptionsDialog() {
Frame frame = JOptionPane.getFrameForComponent(this);
JDialog dialog = new GridOptionsDialog(frame, this);
dialog.setVisible(true);
evaluateGridOptions();
}
/**
* Evaluates the hyperedge connector options.
*/
private void evaluateGridOptions() {
if (gridVisible || gridActive) {
mgrview.setGrid(new IlvGrid(Color.black, new IlvPoint(gridBaseX, gridBaseY), gridSpacingX,
gridSpacingY, gridVisible, gridActive));
} else {
mgrview.setGrid(null);
}
grapher.reDraw();
}
/**
* The dialog class to show the grid options.
*/
class GridOptionsDialog extends JDialog implements ActionListener {
public GridOptionsDialog(Frame frame, Component locationComp) {
super(frame, ResourceUtil.getString("GridOptions.dialog.title"), true);
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
contentPane.add(BorderLayout.CENTER, panel);
addCheckBox(panel, "GridVisible", this, gridVisible);
addCheckBox(panel, "GridActive", this, gridActive);
addTextBox(panel, "GridSpacingX", 8, this, "" + gridSpacingX);
addTextBox(panel, "GridSpacingY", 8, this, "" + gridSpacingY);
addTextBox(panel, "GridBaseX", 8, this, "" + gridBaseX);
addTextBox(panel, "GridBaseY", 8, this, "" + gridBaseY);
layoutDialogPanel(panel);
JButton okayButton = new JButton(ResourceUtil.getString("Okay.button"));
okayButton.setActionCommand("Okay");
okayButton.addActionListener(this);
JPanel aux = new JPanel(new FlowLayout(FlowLayout.CENTER));
aux.add(okayButton);
contentPane.add(BorderLayout.SOUTH, aux);
pack();
setLocationRelativeTo(locationComp);
}
Override
public void actionPerformed(ActionEvent e) {
if ("GridVisible".equals(e.getActionCommand())) {
JCheckBox box = (JCheckBox) e.getSource();
gridVisible = box.isSelected();
} else if ("GridActive".equals(e.getActionCommand())) {
JCheckBox box = (JCheckBox) e.getSource();
gridActive = box.isSelected();
} else if ("GridSpacingX".equals(e.getActionCommand())) {
JTextField box = (JTextField) e.getSource();
gridSpacingX = parseFloat(box.getText(), 10);
} else if ("GridSpacingY".equals(e.getActionCommand())) {
JTextField box = (JTextField) e.getSource();
gridSpacingY = parseFloat(box.getText(), 10);
} else if ("GridBaseX".equals(e.getActionCommand())) {
JTextField box = (JTextField) e.getSource();
gridBaseX = parseFloat(box.getText(), 0);
} else if ("GridBaseY".equals(e.getActionCommand())) {
JTextField box = (JTextField) e.getSource();
gridBaseY = parseFloat(box.getText(), 0);
} else if ("Okay".equals(e.getActionCommand())) {
setVisible(false);
}
}
}
// ---------------------------------------------------------------------------
// Options for crossings
private boolean crossingEnabled = false;
private float gapSize = 2;
private boolean gapZoomable = true;
private int layerOfCrossingGraphic = -1;
/**
* Shows the grid options dialog.
*/
private void showCrossingOptionsDialog() {
Frame frame = JOptionPane.getFrameForComponent(this);
JDialog dialog = new CrossingOptionsDialog(frame, this);
dialog.setVisible(true);
evaluateCrossingOptions();
}
/**
* Evaluates the hyperedge crossing options.
*/
private void evaluateCrossingOptions() {
IlvCrossingCalculation.setCrossingEnabled(grapher, true, null, crossingEnabled, true);
IlvCrossingCalculation.setGap(grapher, true, null, gapSize, true);
IlvCrossingCalculation.setGapZoomable(grapher, true, null, gapZoomable, true);
IlvCrossingCalculation.setLayerOfCrossingGraphic(grapher, true, null, layerOfCrossingGraphic,
true);
makeSegEdgeInteractor.setCrossingEnabled(crossingEnabled);
makeSegEdgeInteractor.setGap(gapSize);
makeSegEdgeInteractor.setGapZoomable(gapZoomable);
makeSegEdgeInteractor.setLayerOfCrossingGraphic(layerOfCrossingGraphic);
}
/**
* The dialog class to show the crossing options.
*/
class CrossingOptionsDialog extends JDialog implements ActionListener {
public CrossingOptionsDialog(Frame frame, Component locationComp) {
super(frame, ResourceUtil.getString("CrossingOptions.dialog.title"), true);
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
contentPane.add(BorderLayout.CENTER, panel);
addCheckBox(panel, "CrossingEnabled", this, crossingEnabled);
addCheckBox(panel, "GapZoomable", this, gapZoomable);
addTextBox(panel, "GapSize", 8, this, "" + gapSize);
addTextBox(panel, "LayerOfCrossGraphic", 8, this, "" + layerOfCrossingGraphic);
layoutDialogPanel(panel);
JButton okayButton = new JButton(ResourceUtil.getString("Okay.button"));
okayButton.setActionCommand("Okay");
okayButton.addActionListener(this);
JPanel aux = new JPanel(new FlowLayout(FlowLayout.CENTER));
aux.add(okayButton);
contentPane.add(BorderLayout.SOUTH, aux);
pack();
setLocationRelativeTo(locationComp);
}
Override
public void actionPerformed(ActionEvent e) {
if ("CrossingEnabled".equals(e.getActionCommand())) {
JCheckBox box = (JCheckBox) e.getSource();
crossingEnabled = box.isSelected();
} else if ("GapSize".equals(e.getActionCommand())) {
JTextField box = (JTextField) e.getSource();
gapSize = parseFloat(box.getText(), 2);
} else if ("GapZoomable".equals(e.getActionCommand())) {
JCheckBox box = (JCheckBox) e.getSource();
gapZoomable = box.isSelected();
} else if ("LayerOfCrossGraphic".equals(e.getActionCommand())) {
JTextField box = (JTextField) e.getSource();
layerOfCrossingGraphic = (int) parseFloat(box.getText(), -1);
} else if ("Okay".equals(e.getActionCommand())) {
setVisible(false);
}
}
}
// ---------------------------------------------------------------------------
// Simple dialog build options
/**
* Adds a check box to the panel.
*/
private static void addCheckBox(JPanel panel, String labelKey, ActionListener actionListener,
boolean defaultValue) {
JPanel aux = new JPanel();
aux.setLayout(new FlowLayout(FlowLayout.LEADING));
JCheckBox cbox = new JCheckBox(ResourceUtil.getString(labelKey + ".title"), defaultValue);
cbox.setToolTipText(ResourceUtil.getString(labelKey + ".tooltip"));
cbox.setActionCommand(labelKey);
cbox.addActionListener(actionListener);
aux.add(cbox);
panel.add(aux);
}
/**
* Adds a list box to the panel.
*/
private static void addListBox(JPanel panel, String labelKey, String[] optionKeys,
ActionListener actionListener, int defaultIndex) {
JPanel aux = new JPanel();
aux.setLayout(new FlowLayout(FlowLayout.LEADING));
JLabel label = new JLabel(ResourceUtil.getString(labelKey + ".title"));
label.setToolTipText(ResourceUtil.getString(labelKey + ".tooltip"));
JComboBox<String> cbox = new JComboBox<String>();
for (int i = 0; i < optionKeys.length; i++) {
String s = ResourceUtil.getString(optionKeys[i] + ".option");
cbox.addItem(s);
}
cbox.setSelectedIndex(defaultIndex);
cbox.setActionCommand(labelKey);
cbox.addActionListener(actionListener);
aux.add(label);
aux.add(cbox);
panel.add(aux);
}
/**
* Adds a text field to the panel.
*/
private static void addTextBox(JPanel panel, String labelKey, int columns,
ActionListener actionListener, String defaultText) {
JPanel aux = new JPanel();
aux.setLayout(new FlowLayout(FlowLayout.LEADING));
JLabel label = new JLabel(ResourceUtil.getString(labelKey + ".title"));
label.setToolTipText(ResourceUtil.getString(labelKey + ".tooltip"));
final JTextField tbox = new JTextField(columns);
tbox.setText(defaultText);
tbox.setActionCommand(labelKey);
tbox.addActionListener(actionListener);
tbox.addFocusListener(new FocusListener() {
Override
public void focusGained(FocusEvent e) {}
Override
public void focusLost(FocusEvent e) {
tbox.postActionEvent();
}
});
aux.add(label);
aux.add(tbox);
panel.add(aux);
}
/**
* Layout a panel that was filled with {@link #addCheckBox},
* {@link #addListBox} etc.
*/
private static void layoutDialogPanel(JPanel panel) {
int maxWidth1 = 0;
int maxWidth2 = 0;
for (int i = 0; i < panel.getComponentCount(); i++) {
Component c = panel.getComponent(i);
if (c instanceof JPanel) {
JPanel aux = (JPanel) c;
if (aux.getComponentCount() > 1) {
Component c1 = aux.getComponent(0);
Component c2 = aux.getComponent(1);
Dimension d1 = c1.getPreferredSize();
Dimension d2 = c2.getPreferredSize();
maxWidth1 = Math.max(maxWidth1, d1.width);
maxWidth2 = Math.max(maxWidth2, d2.width);
}
}
}
for (int i = 0; i < panel.getComponentCount(); i++) {
Component c = panel.getComponent(i);
if (c instanceof JPanel) {
JPanel aux = (JPanel) c;
if (aux.getComponentCount() > 1) {
JComponent c1 = (JComponent) aux.getComponent(0);
JComponent c2 = (JComponent) aux.getComponent(1);
Dimension d1 = c1.getPreferredSize();
Dimension d2 = c2.getPreferredSize();
d1.width = maxWidth1;
d2.width = maxWidth2;
c1.setPreferredSize(d1);
c2.setPreferredSize(d2);
}
}
}
}
/**
* Parse a string to float.
*/
private static float parseFloat(String txt, float defValue) {
try {
return Float.parseFloat(txt.trim());
} catch (NumberFormatException ex) {
return defValue;
}
}
// ---------------------------------------------------------------------------
/**
* Allows you to run the demo as a standalone application.
*/
public static void main(String[] arg) {
HyperGrapherDemo app = new HyperGrapherDemo();
app.init();
JFrame frame = new JFrame("Hypergrapher Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 600);
frame.getContentPane().add(app);
frame.setVisible(true);
}
}