package ch.rakudave.jnetmap.view.properties;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.filechooser.FileNameExtensionFilter;
import ch.rakudave.jnetmap.controller.Controller;
import ch.rakudave.jnetmap.controller.command.Command;
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;
@SuppressWarnings("serial")
public class DeviceProperties extends JDialog {
private Device d;
public DeviceProperties(final Frame owner, Device device, final boolean isNew) {
super(owner, Lang.getNoHTML("device.properties"), ModalityType.DOCUMENT_MODAL);
d = device;
setLayout(new BorderLayout(5, 5));
setPreferredSize(new Dimension(350,500));
final Type oldType = (d.getType() != null)?d.getType():Type.Workstation;
JPanel iconPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
final JLabel deviceIcon = new JLabel((Type.Other.equals(oldType))?Icons.fromBase64(d.getOtherID()):Icons.getCisco(oldType.toString().toLowerCase()));
iconPanel.add(Box.createVerticalStrut(64));
iconPanel.add(deviceIcon);
iconPanel.add(Box.createVerticalStrut(64));
JPanel centerWrapper = new JPanel(new BorderLayout());
centerWrapper.setBorder(BorderFactory.createEmptyBorder(2, 5, 2, 5));
JPanel propPanel = new JPanel(new GridLayout(0, 2, 5, 5));
final JTextField otherID = new JTextField(d.getOtherID());
final JComboBox typeCombo = new JComboBox(Device.Type.values());
typeCombo.setSelectedItem(oldType);
typeCombo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if ("other".equals(typeCombo.getSelectedItem().toString().toLowerCase())) {
File f = SwingHelper.openDialog(owner, new FileNameExtensionFilter("PNG Image", "png"));
if (f != null) {
String base64 = Icons.getBase64(f);
otherID.setText(base64);
deviceIcon.setIcon(Icons.fromBase64(base64));
} else {
deviceIcon.setIcon(Icons.getCisco(oldType.toString().toLowerCase()));
typeCombo.setSelectedItem(oldType);
}
} else {
deviceIcon.setIcon(Icons.getCisco(typeCombo.getSelectedItem().toString().toLowerCase()));
otherID.setText("");
}
}
});
final JTextField deviceName = new JTextField(d.getName());
final JTextField deviceDesc = new JTextField(d.getDesctription());
final JTextField deviceLocation = new JTextField(d.getLocation());
final JTextField deviceVendor = new JTextField(d.getVendor());
final JTextField deviceModel = new JTextField(d.getModel());
propPanel.add(new JLabel(Lang.get("device.type"))); propPanel.add(typeCombo);
propPanel.add(new JLabel(Lang.get("device.name"))); propPanel.add(deviceName);
propPanel.add(new JLabel(Lang.get("device.description"))); propPanel.add(deviceDesc);
propPanel.add(new JLabel(Lang.get("device.location"))); propPanel.add(deviceLocation);
propPanel.add(new JLabel(Lang.get("device.vendor"))); propPanel.add(deviceVendor);
propPanel.add(new JLabel(Lang.get("device.model"))); propPanel.add(deviceModel);
propPanel.add(new JLabel(Lang.get("device.interfaces"))); propPanel.add(new JLabel());
final JList interfaceList = new JList(d.getInterfaces().toArray());
interfaceList.setCellRenderer(new IFListRenderer());
JPanel interfaceManipulators = new JPanel();
interfaceManipulators.setLayout(new BoxLayout(interfaceManipulators, BoxLayout.PAGE_AXIS));
JButton removeInterface = new JButton(Lang.get("action.remove"), Icons.get("remove"));
removeInterface.setPreferredSize(new Dimension(100, 30));
removeInterface.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (interfaceList.getSelectedValue() == null) return;
if (JOptionPane.showConfirmDialog(owner, Lang.get("message.confirm.delete")
.replaceAll("%name%", ((NetworkIF) interfaceList.getSelectedValue()).getName()),
Lang.getNoHTML("action.delete"), JOptionPane.YES_NO_OPTION) == 1) return;
Controller.getCurrentMap().removeEdge(((NetworkIF) interfaceList.getSelectedValue()).getConnection());
interfaceList.setListData(d.getInterfaces().toArray());
}
});
JButton editInterface = new JButton(Lang.get("action.edit"), Icons.get("edit"));
editInterface.setPreferredSize(new Dimension(100, 30));
editInterface.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (interfaceList.getSelectedValue() == null) return;
new InterfaceProperties(owner, ((NetworkIF) interfaceList.getSelectedValue()));
interfaceList.setListData(d.getInterfaces().toArray());
}
});
interfaceManipulators.add(removeInterface);
interfaceManipulators.add(editInterface);
interfaceManipulators.add(Box.createVerticalGlue());
centerWrapper.add(propPanel, BorderLayout.NORTH);
centerWrapper.add(new JScrollPane(interfaceList, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), BorderLayout.CENTER);
centerWrapper.add(interfaceManipulators, BorderLayout.EAST);
JPanel bottomRow = new JPanel(new FlowLayout(FlowLayout.RIGHT, 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) {
final Type newType = (Type)typeCombo.getSelectedItem();
final String oldName = d.getName(), newName = deviceName.getText(),
oldID = d.getOtherID(), newID = otherID.getText(),
oldDesc = d.getDesctription(), newDesc = deviceDesc.getText(),
oldLocation = d.getLocation(), newLocation = deviceLocation.getText(),
oldVendor = d.getVendor(), newVentor = deviceVendor.getText(),
oldModel = d.getModel(), newModel = deviceModel.getText();
//TODO skip new command if nothing has changed
Controller.getCurrentMap().getHistory().execute(new Command() {
@Override
public Object undo() {
d.setType(oldType);
d.setOtherID(oldID);
d.setName(oldName);
d.setDescription(oldDesc);
d.setLocation(oldLocation);
d.setVendor(oldVendor);
d.setModel(oldModel);
return null;
}
@Override
public Object redo() {
d.setType(newType);
d.setOtherID(newID);
d.setName(newName);
d.setDescription(newDesc);
d.setLocation(newLocation);
d.setVendor(newVentor);
d.setModel(newModel);
return null;
}
});
_this.dispose();
if (TabPanel.getCurrentTab() != null) TabPanel.getCurrentTab().repaint();
}
});
if (!isNew) bottomRow.add(cancel);
bottomRow.add(ok);
add(iconPanel, BorderLayout.NORTH);
add(centerWrapper, BorderLayout.CENTER);
add(bottomRow, BorderLayout.SOUTH);
pack();
SwingHelper.centerTo(owner, this);
deviceName.requestFocus();
setVisible(true);
}
private class IFListRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JLabel label = (JLabel) super.getListCellRendererComponent(list,
value, index, isSelected, cellHasFocus);
if (value == null) return label;
NetworkIF nif = (NetworkIF) value;
try {
label.setText(nif.toString() + " -> " + Controller.getCurrentMap().getOpposite(d, nif.getConnection()));
} catch (Exception e) {
Logger.debug("Failed to get opposite of "+nif.toString(), e);
}
return label;
}
}
}