Files
ifogsim/src/org/fog/gui/dialog/AddLink.java
2021-04-06 00:45:28 +02:00

223 lines
6.8 KiB
Java

package org.fog.gui.dialog;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import org.fog.gui.core.Edge;
import org.fog.gui.core.Graph;
import org.fog.gui.core.Link;
import org.fog.gui.core.Node;
import org.fog.gui.core.NodeCellRenderer;
/** A dialog to add a new edge */
public class AddLink extends JDialog {
private static final long serialVersionUID = 4794808969864918000L;
private final Graph graph;
private JComboBox sourceNode;
private JComboBox targetNode;
private JTextField tfLatency;
public AddLink(final Graph graph, final JFrame frame) {
this.graph = graph;
setLayout(new BorderLayout());
add(createInputPanel(), BorderLayout.CENTER);
add(createButtonPanel(), BorderLayout.PAGE_END);
// show dialog
setTitle("Add Link");
setModal(true);
setPreferredSize(new Dimension(400, 200));
setResizable(false);
pack();
setLocationRelativeTo(frame); // must be called between pack and setVisible to work properly
setVisible(true);
}
@SuppressWarnings("unchecked")
private JPanel createInputPanel() {
Component rigid = Box.createRigidArea(new Dimension(10, 0));
JPanel inputPanelWrapper = new JPanel();
inputPanelWrapper.setLayout(new BoxLayout(inputPanelWrapper, BoxLayout.PAGE_AXIS));
JPanel inputPanel = new JPanel();
inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.LINE_AXIS));
JPanel textAreaPanel = new JPanel();
textAreaPanel.setLayout(new BoxLayout(textAreaPanel, BoxLayout.LINE_AXIS));
ComboBoxModel sourceNodeModel = new DefaultComboBoxModel(graph.getAdjacencyList().keySet().toArray());
sourceNodeModel.setSelectedItem(null);
sourceNode = new JComboBox(sourceNodeModel);
targetNode = new JComboBox();
sourceNode.setMaximumSize(sourceNode.getPreferredSize());
sourceNode.setMinimumSize(new Dimension(150, sourceNode.getPreferredSize().height));
sourceNode.setPreferredSize(new Dimension(150, sourceNode.getPreferredSize().height));
targetNode.setMaximumSize(targetNode.getPreferredSize());
targetNode.setMinimumSize(new Dimension(150, targetNode.getPreferredSize().height));
targetNode.setPreferredSize(new Dimension(150, targetNode.getPreferredSize().height));
NodeCellRenderer renderer = new NodeCellRenderer();
sourceNode.setRenderer(renderer);
targetNode.setRenderer(renderer);
sourceNode.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
// only display nodes which do not have already an edge
targetNode.removeAllItems();
Node selectedNode = (Node) sourceNode.getSelectedItem();
if (selectedNode != null) {
List<Node> nodesToDisplay = new ArrayList<Node>();
Set<Node> allNodes = graph.getAdjacencyList().keySet();
// get edged for selected node and throw out all target nodes where already an edge exists
List<Edge> edgesForSelectedNode = graph.getAdjacencyList().get(selectedNode);
Set<Node> nodesInEdges = new HashSet<Node>();
for (Edge edge : edgesForSelectedNode) {
nodesInEdges.add(edge.getNode());
}
if(!(selectedNode.getType().equals("SENSOR")||selectedNode.getType().equals("ACTUATOR")) || edgesForSelectedNode.size()==0){
for (Node node : allNodes) {
if((selectedNode.getType().equals("SENSOR")||selectedNode.getType().equals("ACTUATOR")) && !node.getType().equals("FOG_DEVICE"))
continue;
if (!node.equals(selectedNode) && !nodesInEdges.contains(node)) {
nodesToDisplay.add(node);
}
}
}
ComboBoxModel targetNodeModel = new DefaultComboBoxModel(nodesToDisplay.toArray());
targetNode.setModel(targetNodeModel);
}
}
});
inputPanel.add(sourceNode);
inputPanel.add(new Label("---->"));
inputPanel.add(targetNode);
inputPanel.add(Box.createHorizontalGlue());
inputPanelWrapper.add(inputPanel);
textAreaPanel.add(Box.createRigidArea(new Dimension(10, 0)));
textAreaPanel.add(new JLabel("Latency: "));
tfLatency = new JTextField();
tfLatency.setMaximumSize(tfLatency.getPreferredSize());
tfLatency.setMinimumSize(new Dimension(150, tfLatency.getPreferredSize().height));
tfLatency.setPreferredSize(new Dimension(150, tfLatency.getPreferredSize().height));
textAreaPanel.add(tfLatency);
textAreaPanel.add(Box.createHorizontalGlue());
inputPanelWrapper.add(textAreaPanel);
inputPanelWrapper.add(Box.createVerticalGlue());
inputPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
return inputPanelWrapper;
}
private JPanel createButtonPanel() {
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.LINE_AXIS));
JButton okBtn = new JButton("Ok");
JButton cancelBtn = new JButton("Cancel");
cancelBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setVisible(false);
}
});
okBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
double latency = 0;
boolean catchedError = false;
if (tfLatency.getText() == null || tfLatency.getText().isEmpty()) {
catchedError = true;
prompt("Please type latency", "Error");
}else {
try {
latency = Double.valueOf(tfLatency.getText());
} catch (NumberFormatException e1) {
catchedError = true;
prompt("Latency should be double type", "Error");
}
}
if (!catchedError) {
if (sourceNode.getSelectedItem() == null || targetNode.getSelectedItem() == null) {
prompt("Please select node", "Error");
} else {
Node source = (Node) sourceNode.getSelectedItem();
Node target = (Node) targetNode.getSelectedItem();
Link edge = new Link(target, latency);
graph.addEdge(source, edge);
setVisible(false);
}
}
}
});
buttonPanel.add(Box.createHorizontalGlue());
buttonPanel.add(okBtn);
buttonPanel.add(Box.createRigidArea(new Dimension(10, 0)));
buttonPanel.add(cancelBtn);
buttonPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
return buttonPanel;
}
private void prompt(String msg, String type){
JOptionPane.showMessageDialog(AddLink.this, msg, type, JOptionPane.ERROR_MESSAGE);
}
}