package ch.rakudave.jnetmap.view.properties;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Line2D;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import ch.rakudave.jnetmap.controller.Controller;
import ch.rakudave.jnetmap.controller.command.Command;
import ch.rakudave.jnetmap.model.Connection;
import ch.rakudave.jnetmap.model.IF.NetworkIF;
import ch.rakudave.jnetmap.model.device.Device;
import ch.rakudave.jnetmap.model.device.Device.Type;
import ch.rakudave.jnetmap.util.Icons;
import ch.rakudave.jnetmap.util.Lang;
import ch.rakudave.jnetmap.util.SwingHelper;
import ch.rakudave.jnetmap.util.logging.Logger;
import ch.rakudave.jnetmap.view.components.TabPanel;
import ch.rakudave.jnetmap.view.jung.EdgeTransformers;
import ch.rakudave.jnetmap.view.preferences.PreferencePanel;
import edu.uci.ics.jung.graph.util.Pair;
@SuppressWarnings("serial")
public class ConnectionProperties extends JDialog {
public ConnectionProperties(final Frame owner, final Connection c) {
super(owner, Lang.getNoHTML("connection.properties"), ModalityType.DOCUMENT_MODAL);
setLayout(new BorderLayout(5, 5));
setPreferredSize(new Dimension(800,350));
setMaximumSize(new Dimension(850,400));
Pair<Device> pair = Controller.getCurrentMap().getEndpoints(c);
NetworkIF nif1 = pair.getFirst().getInterfaceFor(c), nif2 = pair.getSecond().getInterfaceFor(c);
JPanel deviceNames = new JPanel(new GridLayout(1,3));
JLabel leftDevice = new JLabel(pair.getFirst().getName(), (Type.Other.equals(pair.getFirst().getType()))?
Icons.fromBase64(pair.getFirst().getOtherID()):Icons.getCisco(pair.getFirst().getType().toString().toLowerCase()), JLabel.CENTER);
leftDevice.setHorizontalTextPosition(JLabel.CENTER);
leftDevice.setVerticalTextPosition(JLabel.BOTTOM);
JPanel centerLine = new JPanel() {
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setStroke(EdgeTransformers.strokeTransformer().transform(c));
g2d.setPaint(c.getStatus().getColor());
g2d.draw(new Line2D.Double(new Point(0, 32), new Point(super.getWidth(), 32)));
}
};
JLabel rightDevice = new JLabel(pair.getSecond().getName(), (Type.Other.equals(pair.getSecond().getType()))?
Icons.fromBase64(pair.getSecond().getOtherID()):Icons.getCisco(pair.getSecond().getType().toString().toLowerCase()), JLabel.CENTER);
rightDevice.setHorizontalTextPosition(JLabel.CENTER);
rightDevice.setVerticalTextPosition(JLabel.BOTTOM);
deviceNames.add(leftDevice);
deviceNames.add(centerLine);
deviceNames.add(rightDevice);
JPanel centerWrapper = new JPanel(new GridLayout(1, 3));
final PreferencePanel leftInterface = InterfaceProperties.getInnerPanel(owner, nif1);
JPanel connectionPanel = new JPanel(new GridLayout(0, 1, 5, 5));
connectionPanel.setBorder(BorderFactory.createEmptyBorder(0, 50, 0, 50));
final JComboBox connectionType = new JComboBox(Connection.Type.values());
connectionType.setSelectedItem(c.getType());
final JTextField bandwidth = new JTextField(String.valueOf(c.getBandwidth()));
connectionPanel.add(new JLabel(Lang.get("connection.type")));
connectionPanel.add(connectionType);
connectionPanel.add(new JLabel(Lang.get("connection.bandwidth")));
connectionPanel.add(bandwidth);
connectionPanel.add(new JLabel(""));
connectionPanel.add(new JLabel(""));
connectionPanel.add(new JLabel(""));
final PreferencePanel rightInterface = InterfaceProperties.getInnerPanel(owner, nif2);
centerWrapper.add(leftInterface);
centerWrapper.add(connectionPanel);
centerWrapper.add(rightInterface);
JPanel bottomRow = new JPanel(new FlowLayout(FlowLayout.TRAILING, 5, 5));
final JDialog _this = this;
JButton cancel = new JButton(Lang.get("action.cancel"), Icons.get("cancel"));
cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
_this.dispose();
}
});
JButton ok = new JButton(Lang.get("action.ok"), Icons.get("ok"));
ok.setPreferredSize(cancel.getPreferredSize());
ok.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
leftInterface.save();
rightInterface.save();
//TODO skip new command if nothing has changed
Controller.getCurrentMap().getHistory().execute(new Command() {
Connection.Type oltType = c.getType(), newType = (Connection.Type) connectionType.getSelectedItem();
double oldBandwidth = c.getBandwidth(), newBandwidth;
@Override
public Object undo() {
c.setType(oltType);
c.setBandwidth(oldBandwidth);
return null;
}
@Override
public Object redo() {
try {
newBandwidth = Double.valueOf(bandwidth.getText());
} catch (NumberFormatException e) {
Logger.warn(bandwidth.getText() + " is not a number!", e);
}
c.setType(newType);
c.setBandwidth(newBandwidth);
return null;
}
});
_this.dispose();
if (TabPanel.getCurrentTab() != null) TabPanel.getCurrentTab().repaint();
}
});
bottomRow.add(cancel);
bottomRow.add(ok);
add(deviceNames, BorderLayout.NORTH);
add(centerWrapper, BorderLayout.CENTER);
add(bottomRow, BorderLayout.SOUTH);
pack();
SwingHelper.centerTo(owner, this);
bandwidth.requestFocus();
setVisible(true);
}
}