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.util.Vector;
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.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import net.xeoh.plugins.base.util.PluginManagerUtil;
import ch.rakudave.jnetmap.controller.Controller;
import ch.rakudave.jnetmap.model.Map;
import ch.rakudave.jnetmap.plugins.Notifier;
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 MapProperties extends JDialog {
public MapProperties(final Frame owner, final Map m) {
super(owner, Lang.getNoHTML("map.properties"), ModalityType.DOCUMENT_MODAL);
setLayout(new BorderLayout(5, 5));
setPreferredSize(new Dimension(400,400));
JPanel topWrapper = new JPanel(new GridLayout(0, 2, 5, 5));
topWrapper.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
final SpinnerNumberModel updateInterval = new SpinnerNumberModel(m.getUpdateInterval(), 1, 60, 1);
JSpinner updateSpinner = new JSpinner(updateInterval);
topWrapper.add(new JLabel(Lang.get("map.updateinterval")));
topWrapper.add(updateSpinner);
JPanel listWrapper = new JPanel(new BorderLayout());
listWrapper.setBorder(BorderFactory.createTitledBorder(Lang.getNoHTML("map.notifiers")));
final JList listenerList = new JList(new Vector<Notifier>(m.getStatusListeners()));
listenerList.setCellRenderer(new IconListRenderer(true));
JPanel addWrapper = new JPanel(new BorderLayout());
final JComboBox addSelector = new JComboBox(new Vector<Notifier>() {{
for (Notifier p : new PluginManagerUtil(Controller.pm).getPlugins(Notifier.class)) {
try {
add(p);
} catch (Exception e) {
Logger.error("Unable to load plugin " + p, e);
}
}
}});
addSelector.setRenderer(new IconListRenderer(false));
JButton addListener = new JButton(Lang.get("action.add"), Icons.get("add"));
addListener.setPreferredSize(new Dimension(100, 30));
addListener.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Notifier newListener = ((Notifier) addSelector.getSelectedItem()).create();
m.addStatusListener(newListener);
newListener.showPropertiesWindow(owner, true);
listenerList.setListData(new Vector<Notifier>(m.getStatusListeners()));
}
});
addWrapper.add(addSelector, BorderLayout.CENTER);
addWrapper.add(addListener, BorderLayout.EAST);
JPanel listManipulators = new JPanel();
listManipulators.setLayout(new BoxLayout(listManipulators, BoxLayout.PAGE_AXIS));
JButton removeListener = new JButton(Lang.get("action.remove"), Icons.get("remove"));
removeListener.setPreferredSize(new Dimension(100, 30));
removeListener.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (listenerList.getSelectedIndex() == -1) return;
m.removeStatusListener((Notifier) listenerList.getSelectedValue());
listenerList.setListData(new Vector<Notifier>(m.getStatusListeners()));
}
});
JButton editListener = new JButton(Lang.get("action.edit"), Icons.get("edit"));
editListener.setPreferredSize(new Dimension(100, 30));
editListener.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (listenerList.getSelectedIndex() == -1) return;
((Notifier) listenerList.getSelectedValue()).showPropertiesWindow(owner, false);
listenerList.setListData(new Vector<Notifier>(m.getStatusListeners()));
}
});
listManipulators.add(removeListener);
listManipulators.add(editListener);
listManipulators.add(Box.createVerticalGlue());
listWrapper.add(addWrapper, BorderLayout.NORTH);
listWrapper.add(listenerList, BorderLayout.CENTER);
listWrapper.add(listManipulators, 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) {
m.setUpdateInterval(updateInterval.getNumber().intValue());
m.getHistory().setSaved(false);
_this.dispose();
if (TabPanel.getCurrentTab() != null) TabPanel.getCurrentTab().repaint();
}
});
bottomRow.add(cancel);
bottomRow.add(ok);
add(topWrapper, BorderLayout.NORTH);
add(listWrapper, BorderLayout.CENTER);
add(bottomRow, BorderLayout.SOUTH);
pack();
SwingHelper.centerTo(owner, this);
setVisible(true);
}
private class IconListRenderer extends DefaultListCellRenderer {
private boolean showName;
public IconListRenderer(boolean showName) {
this.showName = showName;
}
@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;
Notifier l = (Notifier) value;
label.setText((showName)?l.getPluginName()+": "+l.getName():l.getPluginName());
label.setIcon(l.getIcon());
return label;
}
}
}