package ch.rakudave.jnetmap.view.preferences;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTextArea;
import javax.swing.filechooser.FileNameExtensionFilter;
import net.xeoh.plugins.base.util.PluginManagerUtil;
import ch.rakudave.jnetmap.controller.Actions;
import ch.rakudave.jnetmap.controller.Controller;
import ch.rakudave.jnetmap.plugins.Plugin;
import ch.rakudave.jnetmap.util.IO;
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;
/**
* @author rakudave
*/
@SuppressWarnings("serial")
public class PluginPanel extends PreferencePanel {
private JPanel pluginList;
public PluginPanel() {
setLayout(new BorderLayout());
title = Lang.getNoHTML("preferences.plugins");
pluginList = new JPanel();
pluginList.setLayout(new BoxLayout(pluginList, BoxLayout.PAGE_AXIS));
for (Plugin p : new PluginManagerUtil(Controller.pm).getPlugins(Plugin.class)) {
pluginList.add(new PluginInfo(p));
pluginList.add(new JSeparator());
}
pluginList.add(Box.createVerticalGlue());
final PluginPanel _this = this;
JPanel bottom = new JPanel(new BorderLayout());
JButton add = SwingHelper.createAlignedButton(new AbstractAction(Lang.get("preferences.plugins.get"), Icons.get("down")) {
@Override
public void actionPerformed(ActionEvent e) {
Actions.openWebsite("http://jnetmap.sourceforge.net?file=kop4.php");
}
});
JButton install = SwingHelper.createAlignedButton(new AbstractAction(Lang.get("action.install"), Icons.get("install")) {
@Override
public void actionPerformed(ActionEvent e) {
File f = SwingHelper.openDialog(_this, new FileNameExtensionFilter("Java Archive File", "jar"));
try {
IO.copy(new FileInputStream(f), IO.pluginDir + "/" + f.getName());
JOptionPane.showMessageDialog(_this, Lang.get("message.import.restart"),
f.getName(), JOptionPane.INFORMATION_MESSAGE);
} catch (FileNotFoundException e1) {
Logger.error("Failed to install plugin " + f, e1);
JOptionPane.showMessageDialog(_this, Lang.get("message.import.error"),
f.getName(), JOptionPane.ERROR_MESSAGE);
}
}
});
bottom.add(add, BorderLayout.WEST);
bottom.add(install, BorderLayout.EAST);
add(new JScrollPane(pluginList, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), BorderLayout.CENTER);
add(bottom, BorderLayout.SOUTH);
}
@Override
public void save() {}
private class PluginInfo extends JPanel {
public PluginInfo(final Plugin p) {
super(new BorderLayout(5, 5));
final JPanel _this = this;
setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel bottom = new JPanel();
bottom.setLayout(new BoxLayout(bottom, BoxLayout.LINE_AXIS));
JButton delete = SwingHelper.createAlignedButton(new AbstractAction(Lang.get("action.delete"), Icons.get("close")) {
@Override
public void actionPerformed(ActionEvent e) {
int action = JOptionPane.showConfirmDialog(_this, Lang.get("message.confirm.delete").replaceAll("%name%", p.getPluginName()),
Lang.get("action.delete"), JOptionPane.OK_CANCEL_OPTION);
if (action != 0) return;
if (IO.tryRemovePlugin(p)) {
for (Component c : _this.getComponents()) {
c.setEnabled(false);
}
_this.setEnabled(false);
setEnabled(false);
} else {
Logger.error("Unable to remove plugin "+p.getPluginName());
}
}
});
delete.setMaximumSize(new Dimension(50,30));
bottom.add(new JLabel("by " + p.getAuthor()));
bottom.add(Box.createHorizontalGlue());
bottom.add(delete);
JTextArea ta = new JTextArea(p.getDescription());
ta.setLineWrap(true);
ta.setWrapStyleWord(true);
ta.setFocusable(false);
ta.setBackground(new Color(getBackground().getRGB()));
add(new JLabel(p.getPluginName(), p.getIcon(), JLabel.LEFT), BorderLayout.NORTH);
add(ta, BorderLayout.CENTER);
add(bottom, BorderLayout.SOUTH);
}
}
}