Package ch.rakudave.NetMap

Source Code of ch.rakudave.NetMap.Preferences

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);
  }
}
TOP

Related Classes of ch.rakudave.NetMap.Preferences

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.