package ch.rakudave.NetMap;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.EnumSet;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JColorChooser;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.ScrollPaneConstants;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.filechooser.FileNameExtensionFilter;
@Deprecated
public class Preferences {
protected boolean openLast = true, askToScan = true, history = true, askToSave = true, drawGrid, drawLegend = true, drawStats = true,
trayIcon = true, rememberSize = false, rememberPosition = false, checkForUpdates = true, ignoreTriggers = true, triggerBackup;
protected int undo = 10, pingTimeout = 3000, scanTimeout = 50;
protected float pingInterval;
protected Vector<String> types, imageURLs;
protected Vector<Image> images;
protected Dimension windowSize;
protected Point windowPosition;
protected Color background = Color.white;
private JDialog p;
private NetMap parent;
private DefaultListModel model;
private JList iconList;
public Preferences(NetMap parent) {
this.parent = parent;
load();
}
private String configChooser() {
JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("jNetMap Config (*.conf)","conf");
chooser.setFileFilter(filter);
int returnValue = chooser.showSaveDialog(p);
if (returnValue != JFileChooser.APPROVE_OPTION) return null; // canceled
return chooser.getSelectedFile().toString();
}
private boolean copyFile(String fromFile, String toFile) {
FileInputStream from = null;
FileOutputStream to = null;
try {
from = new FileInputStream(fromFile);
to = new FileOutputStream(toFile);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = from.read(buffer)) != -1)
to.write(buffer, 0, bytesRead); // write
return true;
} catch (Exception e) {
return false;
} finally {
if (from != null)
try {
from.close();
} catch (IOException e) {
;
}
if (to != null)
try {
to.close();
} catch (IOException e) {
;
}
}
}
private void exportConf(Component c) {
String path = configChooser();
if (path == null) return;
if (!path.matches("(.*).conf")) path += ".conf";
boolean success = copyFile(System.getProperty("user.home")+"/.jNetMap.conf", path);
if (!success) JOptionPane.showMessageDialog(c, "Failed to export config file!", "Error", JOptionPane.ERROR_MESSAGE);
}
// show icon settings dialog
private void iconSettings(final int index) {
final JDialog a = new JDialog(p,"Add Icon");
a.setLayout(new BorderLayout());
JPanel label = new JPanel(new GridLayout(2,1,5,5));
label.setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 0));
label.add(new JLabel("Name: "));
label.add(new JLabel("Image: "));
JPanel input = new JPanel(new GridLayout(2,1,5,5));
input.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0));
final JTextField name = new JTextField((index > -1)?types.get(index):"");
final JTextField path = new JTextField((index > -1)?imageURLs.get(index):"");
input.add(name);
input.add(path);
JPanel button = new JPanel(new GridLayout(2,1,5,5));
button.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5));
button.add(new JLabel());
JButton browse = new JButton("...");
// open image selection dialog
browse.addActionListener(new ActionListener () {@Override public void actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("Images","jpeg", "jpg", "JPG", "JPEG", "gif", "png");
chooser.setFileFilter(filter);
if (chooser.showOpenDialog(p) != JFileChooser.APPROVE_OPTION) return;
path.setText(chooser.getSelectedFile().getPath());
}});
browse.setPreferredSize(new Dimension(20,20));
button.add(browse);
JPanel go = new JPanel();
go.setLayout(new BoxLayout(go, BoxLayout.X_AXIS));
go.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JButton cancel = new JButton("Cancel");
cancel.setPreferredSize(new Dimension(90,25));
cancel.addActionListener(new ActionListener () {@Override public void actionPerformed(ActionEvent e) {a.dispose();}});
JButton ok = new JButton("Ok");
ok.setPreferredSize(new Dimension(90,25));
// apply changes or create new icon if needed
ok.addActionListener(new ActionListener () {@Override public void actionPerformed(ActionEvent e) {
if (name.getText().isEmpty() || path.getText().isEmpty()) {
JOptionPane.showMessageDialog(p, "Name and path can not be are empty!","Error", JOptionPane.ERROR_MESSAGE);
} else {
if (index > -1) {
types.set(index, name.getText());
imageURLs.set(index, path.getText());
model.set(index, name.getText());
} else {
types.add(name.getText());
imageURLs.add(path.getText());
model.addElement(name.getText());
}
loadImages();
a.dispose();
}
}});
go.add(Box.createHorizontalGlue());
go.add(cancel);
go.add(Box.createHorizontalStrut(10));
go.add(ok);
go.add(Box.createHorizontalGlue());
a.add(label, BorderLayout.WEST);
a.add(input, BorderLayout.CENTER);
a.add(button, BorderLayout.EAST);
a.add(go, BorderLayout.SOUTH);
a.pack();
a.setMinimumSize(new Dimension(400,110));
a.setLocation(parent.f.getLocation());
a.setVisible(true);
}
private void importConf(Component c) {
String path = configChooser();
if (path == null) return;
boolean success = copyFile(path, System.getProperty("user.home")+"/.jNetMap.conf");
if (!success) {
JOptionPane.showMessageDialog(c, "Failed to import config file!", "Error", JOptionPane.ERROR_MESSAGE);
return;
}
load();
p.dispose();
parent.canvas.repaint();
}
@SuppressWarnings("unchecked")
public void load() {
FileInputStream in = null;
ObjectInputStream obj = null;
try { // read from settings file
in = new FileInputStream(System.getProperty("user.home")+"/.jNetMap.conf");
obj = new ObjectInputStream(in);
drawGrid = obj.readBoolean();
drawLegend = obj.readBoolean();
drawStats = obj.readBoolean();
parent.triggers = new Triggers(parent, (String) obj.readObject(), (String) obj.readObject(), (String) obj.readObject());
pingInterval = obj.readFloat();
parent.recentFiles = (Vector<String>) obj.readObject();
parent.currentFile = (String) obj.readObject();
types = (Vector<String>) obj.readObject();
imageURLs = (Vector<String>) obj.readObject();
openLast = obj.readBoolean();
askToScan = obj.readBoolean();
history = obj.readBoolean();
askToSave = obj.readBoolean();
pingTimeout = obj.readInt();
scanTimeout = obj.readInt();
undo = obj.readInt();
trayIcon = obj.readBoolean();
rememberSize = obj.readBoolean();
windowSize = (Dimension) obj.readObject();
rememberPosition = obj.readBoolean();
windowPosition = (Point) obj.readObject();
checkForUpdates = obj.readBoolean();
ignoreTriggers = obj.readBoolean();
triggerBackup = ignoreTriggers;
background = (Color) obj.readObject();
obj.close();
} catch (Exception e) { // fill unknown fields with defaults
if (parent.triggers == null) parent.triggers = new Triggers(parent, "", "","");
if (parent.recentFiles == null) parent.recentFiles = new Vector<String>();
if (types == null) {
types = new Vector<String>(12);
types.add("Workstation");types.add("Laptop");types.add("Server");types.add("Printer");types.add("Wireless");types.add("Router");
types.add("Switch");types.add("NAS");types.add("Mediacenter");types.add("Gaming console");types.add("Firewall");types.add("Other");
}
if (imageURLs == null) {
imageURLs = new Vector<String>();
}
System.out.println("Error: Failed to load (some) settings! Filling unknown fields with defaults.");
}
loadImages();
}
private void loadImages() {
images = new Vector<Image>(imageURLs.size()+12);
// read default images
for (Icon icon : EnumSet.range(Icon.WORKSTATION, Icon.OTHER)) images.add(icon.getImage());
// read additional images and resize them
for (String url : imageURLs) images.add(Toolkit.getDefaultToolkit().getImage(url).getScaledInstance(48, 48, Image.SCALE_SMOOTH));
}
public void save() { // write all environment variables to the settings.conf file
FileOutputStream out = null;
ObjectOutputStream obj = null;
try {
try { // try to parse ping interval
pingInterval = Float.parseFloat(parent.interval.getText());
} catch (Exception e) {}
File conf = new File(System.getProperty("user.home")+"/.jNetMap.conf");
out = new FileOutputStream(conf);
obj = new ObjectOutputStream(out);
obj.writeBoolean(drawGrid);
obj.writeBoolean(drawLegend);
obj.writeBoolean(drawStats);
obj.writeObject(parent.triggers.greenAction);
obj.writeObject(parent.triggers.orangeAction);
obj.writeObject(parent.triggers.redAction);
obj.writeFloat(pingInterval);
obj.writeObject(parent.recentFiles);
obj.writeObject(parent.currentFile);
obj.writeObject(types);
obj.writeObject(imageURLs);
obj.writeBoolean(openLast);
obj.writeBoolean(askToScan);
obj.writeBoolean(history);
obj.writeBoolean(askToSave);
obj.writeInt(pingTimeout);
obj.writeInt(scanTimeout);
obj.writeInt(undo);
obj.writeBoolean(trayIcon);
obj.writeBoolean(rememberSize);
obj.writeObject(parent.f.getSize());
obj.writeBoolean(rememberPosition);
obj.writeObject(parent.f.getLocationOnScreen());
obj.writeBoolean(checkForUpdates);
obj.writeBoolean(triggerBackup);
obj.writeObject(background);
obj.close();
out.close();
} catch (Exception e) {
System.out.println("Error: Failed to save settings!");
}
}
/**
* Show preferences dialog
*/
public void showDialog() {
p = new JDialog(parent.f, "Preferences");
p.setLayout(new BorderLayout());
JMenuBar menu = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenuItem exportConfig = new JMenuItem("Export");
exportConfig.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_E,java.awt.Event.CTRL_MASK));
exportConfig.addActionListener(new ActionListener() {@Override public void actionPerformed(ActionEvent e) {exportConf(p);}});
JMenuItem importConfig = new JMenuItem("Import");
importConfig.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_I,java.awt.Event.CTRL_MASK));
importConfig.addActionListener(new ActionListener() {@Override public void actionPerformed(ActionEvent e) {importConf(p);}});
fileMenu.add(exportConfig);
fileMenu.add(importConfig);
menu.add(fileMenu);
p.setJMenuBar(menu);
final JLabel preview = new JLabel(" ",new ImageIcon(Icon.WORKSTATION.getImage()), SwingConstants.LEFT);
JPanel center = new JPanel();
center.setLayout(new BoxLayout(center, BoxLayout.Y_AXIS));
JPanel general = new JPanel(new GridLayout(6,2,5,5));
general.setBorder(BorderFactory.createTitledBorder("General"));
final JCheckBox file = new JCheckBox("Open last file on startup", openLast);
final JCheckBox ask = new JCheckBox("Ask to scan network if there's no last file", askToScan);
final JCheckBox hist = new JCheckBox("Remember file history", history);
final JCheckBox save = new JCheckBox("Prompt to save on exit", askToSave);
final JCheckBox size = new JCheckBox("Restore window size", rememberSize);
final JCheckBox position = new JCheckBox("Restore window position", rememberPosition);
final JCheckBox update = new JCheckBox("Check for updates", checkForUpdates);
final JCheckBox noTriggers = new JCheckBox("Ignore triggers on statup", triggerBackup);
final JCheckBox tray = new JCheckBox("Show Tray Icon (requires restart)", trayIcon);
JPanel undoWrapper = new JPanel(new GridLayout(1,2,5,5));
final JSpinner undoSpinner = new JSpinner(new SpinnerNumberModel(undo, 5, 50, 1));
undoWrapper.add(new JLabel(" Maximum undo steps: "));
undoWrapper.add(undoSpinner);
JPanel colorWrapper = new JPanel(new GridLayout(1,2,5,5));
final JButton color = new JButton();
color.setBackground(background);
color.setBorder(BorderFactory.createBevelBorder(0));
color.addActionListener(new ActionListener() {@Override
public void actionPerformed(ActionEvent e) {
Color newBackground = JColorChooser.showDialog(p, "Choose a background color", background);
if (newBackground != null) {
background = newBackground;
color.setBackground(background);
}
}});
colorWrapper.add(new JLabel("Background color:"));
colorWrapper.add(color);
general.add(file);
general.add(hist);
general.add(ask);
general.add(save);
general.add(size);
general.add(position);
general.add(tray);
general.add(noTriggers);
general.add(update);
general.add(undoWrapper);
general.add(new JLabel());
general.add(colorWrapper);
JPanel timeout = new JPanel(new GridLayout(2,2,5,5));
timeout.setBorder(BorderFactory.createTitledBorder("Timeout"));
final JTextField ping = new JTextField(pingTimeout+"");
final JTextField scan = new JTextField(scanTimeout+"");
timeout.add(new JLabel(" Ping timeout in ms: (default: 3000) "));
timeout.add(ping);
timeout.add(new JLabel(" Scan timeout in ms: (UNIX: 50, Win: 1000+) "));
timeout.add(scan);
JPanel triggers = new JPanel(new GridLayout(5,2,5,5));
triggers.setBorder(BorderFactory.createTitledBorder("Triggers"));
final JTextField green = new JTextField(parent.triggers.greenAction);
final JTextField orange = new JTextField(parent.triggers.orangeAction);
final JTextField red = new JTextField(parent.triggers.redAction);
triggers.add(new JLabel(" Device turns green: "));
triggers.add(green);
triggers.add(new JLabel(" Device turns orange: "));
triggers.add(orange);
triggers.add(new JLabel(" Device turns red: "));
triggers.add(red);
triggers.add(new JLabel(" Variables: "));
triggers.add(new JLabel("%n: Name %a: Address %p: Port %t: Type ID"));
triggers.add(new JLabel(" Example: "));
triggers.add(new JLabel("./emailme.sh %n (%a) is_down"));
JPanel icons = new JPanel(new BorderLayout());
icons.setBorder(BorderFactory.createTitledBorder("Icons"));
model = new DefaultListModel();
for (String type : types) model.addElement(type);
iconList = new JList(model);
iconList.setLayoutOrientation(JList.VERTICAL_WRAP);
iconList.setSelectedIndex(0);
JPanel buttonWrapper = new JPanel();
buttonWrapper.setLayout(new BoxLayout(buttonWrapper, BoxLayout.Y_AXIS));
JButton add = new JButton("add");
add.addActionListener(new ActionListener() {@Override public void actionPerformed(ActionEvent e) {iconSettings(-1);}});
add.setMinimumSize(new Dimension(80,25));
add.setMaximumSize(new Dimension(80,25));
final JButton edit = new JButton("edit");
edit.addActionListener(new ActionListener() {@Override public void actionPerformed(ActionEvent e) {
if (iconList.getSelectedIndex() > 11)
iconSettings(iconList.getSelectedIndex()); // show icon settings dialog for selected item
}});
edit.setMinimumSize(new Dimension(80,25));
edit.setMaximumSize(new Dimension(80,25));
edit.setEnabled(false);
final JButton remove = new JButton("remove");
remove.addActionListener(new ActionListener() {@Override public void actionPerformed(ActionEvent e) {
if (iconList.getSelectedIndex() > 11) { // remove selected item from all vectors
types.remove(iconList.getSelectedIndex());
imageURLs.remove(iconList.getSelectedIndex()-12);
images.remove(iconList.getSelectedIndex());
model.remove(iconList.getSelectedIndex());
iconList.setSelectedIndex(0);
remove.setEnabled(false); // reset list and buttons
edit.setEnabled(false);
preview.setIcon(new ImageIcon(Icon.WORKSTATION.getImage()));
}
}});
remove.setMinimumSize(new Dimension(80,25));
remove.setMaximumSize(new Dimension(80,25));
remove.setEnabled(false);
preview.setHorizontalTextPosition(SwingConstants.LEFT);
iconList.addListSelectionListener(new ListSelectionListener() {@Override
public void valueChanged(ListSelectionEvent e) {
if (iconList.getSelectedIndex() < 12) {
remove.setEnabled(false);
edit.setEnabled(false);
} else {
remove.setEnabled(true);
edit.setEnabled(true);
}
preview.setIcon(new ImageIcon(images.get(iconList.getSelectedIndex())));
}
});
buttonWrapper.add(add);
buttonWrapper.add(Box.createVerticalStrut(5));
buttonWrapper.add(edit);
buttonWrapper.add(Box.createVerticalStrut(5));
buttonWrapper.add(remove);
buttonWrapper.add(Box.createVerticalStrut(5));
buttonWrapper.add(preview);
buttonWrapper.add(Box.createVerticalGlue());
icons.add(buttonWrapper, BorderLayout.EAST);
icons.add(new JScrollPane(iconList), BorderLayout.CENTER);
center.add(general);
center.add(timeout);
center.add(triggers);
center.add(icons);
JPanel south = new JPanel();
south.setLayout(new BoxLayout(south, BoxLayout.X_AXIS));
south.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 6));
JButton cancel = new JButton("Cancel");
cancel.addActionListener(new ActionListener() {@Override public void actionPerformed(ActionEvent e) {p.dispose();}});
cancel.setPreferredSize(new Dimension(90,25));
JButton ok = new JButton("Save");
// read all fields and write them to the settings file
ok.addActionListener(new ActionListener() {@Override public void actionPerformed(ActionEvent e) {
openLast = file.isSelected();
askToScan = ask.isSelected();
history = hist.isSelected();
askToSave = save.isSelected();
rememberSize = size.isSelected();
rememberPosition = position.isSelected();
trayIcon = tray.isSelected();
triggerBackup = noTriggers.isSelected();
checkForUpdates = update.isSelected();
undo = Integer.parseInt(undoSpinner.getValue().toString());
try {pingTimeout = Integer.parseInt(ping.getText());} catch (Exception ex) {pingTimeout = 3000;}
try {scanTimeout = Integer.parseInt(scan.getText());} catch (Exception ex) {scanTimeout = 50;}
parent.triggers.greenAction = green.getText();
parent.triggers.orangeAction = orange.getText();
parent.triggers.redAction = red.getText();
p.dispose();
loadImages();
parent.canvas.repaint();
save();
}});
ok.setPreferredSize(new Dimension(90,25));
south.add(Box.createHorizontalGlue());
south.add(cancel);
south.add(Box.createHorizontalStrut(10));
south.add(ok);
south.add(Box.createHorizontalGlue());
p.add(new JScrollPane(center, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER), BorderLayout.CENTER);
p.add(south, BorderLayout.SOUTH);
p.pack();
p.setMinimumSize(new Dimension(625,360));
p.setLocation(parent.f.getLocationOnScreen());
p.setVisible(true);
}
}