package ch.rakudave.jnetmap.view.preferences;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Enumeration;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import net.xeoh.plugins.base.util.PluginManagerUtil;
import ch.rakudave.jnetmap.controller.Controller;
import ch.rakudave.jnetmap.plugins.Plugin;
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.IView;
import ch.rakudave.jnetmap.view.components.TabPanel;
/**
* @author rakudave
*/
public class Preferences extends JDialog {
private static final long serialVersionUID = 6209354869982252918L;
private DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode();
private JPanel container;
private IView parent;
public Preferences(IView parent) {
super((Window) parent, Lang.getNoHTML("menu.edit.preferences"), ModalityType.DOCUMENT_MODAL);
setPreferredSize(new Dimension(550, 500));
setLayout(new BorderLayout());
this.parent = parent;
final CardLayout cl = new CardLayout();
container = new JPanel(cl);
if (rootNode.getChildCount() == 0) {
addCard(new GeneralPanel((Window) parent));
addCard(new AppearancePanel((Window) parent));
addCard(new ToolBarPanel());
addCard(new PluginPanel());
for (Plugin p : new PluginManagerUtil(Controller.pm).getPlugins(Plugin.class)) {
if (p.hasSettings()) {
PreferencePanel panel = p.getSettingsPanel();
panel.title = p.getPluginName();
panel.parentTitle = Lang.getNoHTML("preferences.plugins");
addCard(panel);
}
}
addCard(new LoggingPanel());
}
JTree tree = new JTree(rootNode);
tree.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
tree.setRootVisible(false);
tree.addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent tse) {
TreeCard node = (TreeCard) ((DefaultMutableTreeNode) ((TreePath) tse
.getPath()).getLastPathComponent()).getUserObject();
if (node.nodePanel != null) {
String cardLayoutID = node.ID;
cl.show(container, cardLayoutID);
}
}
});
JPanel bottomRow = new JPanel(new FlowLayout(FlowLayout.TRAILING, 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) {
save();
_this.dispose();
if (TabPanel.getCurrentTab() != null) TabPanel.getCurrentTab().repaint();
}
});
bottomRow.add(cancel);
bottomRow.add(ok);
add(new JScrollPane(tree), BorderLayout.WEST);
add(container, BorderLayout.CENTER);
add(bottomRow, BorderLayout.SOUTH);
pack();
}
public void addCard(PreferencePanel card) {
TreeCard newCard = new TreeCard(card.getTitle(), card.getParentTitle(), card);
if (card.getParentTitle().isEmpty()) {
rootNode.add(new DefaultMutableTreeNode(newCard));
} else {
for (int i = 0; i < rootNode.getChildCount(); i++) {
@SuppressWarnings("unchecked")
Enumeration<DefaultMutableTreeNode> tree = rootNode.breadthFirstEnumeration();
tree.nextElement(); //skip root
while (tree.hasMoreElements()) {
DefaultMutableTreeNode child = tree.nextElement();
if (((TreeCard) child.getUserObject()).nodeName.equals(card.getParentTitle())) {
child.add(new DefaultMutableTreeNode(newCard));
return;
}
}
}
Logger.error("No parent named " + card.getParentTitle() + " was found!");
}
}
protected void save() {
@SuppressWarnings("unchecked")
Enumeration<DefaultMutableTreeNode> tree = rootNode.preorderEnumeration();
tree.nextElement(); //skip root
while (tree.hasMoreElements()) {
DefaultMutableTreeNode child = tree.nextElement();
TreeCard card = (TreeCard) child.getUserObject();
try {
card.nodePanel.save();
} catch (Exception e) {
Logger.error("Preferences of '" + card.nodeName + "' could not be saved", e);
}
}
}
@Override
public void setVisible(boolean b) {
SwingHelper.centerTo((Window) parent, this);
super.setVisible(b);
}
private class TreeCard {
private String nodeName;
private String ID;
private PreferencePanel nodePanel;
public TreeCard(String title, String parent, PreferencePanel panel) {
nodeName = title;
ID = parent.isEmpty() ? nodeName : parent + " - " + nodeName;
nodePanel = panel;
nodePanel.setBorder(BorderFactory.createTitledBorder(ID));
container.add(ID, nodePanel);
}
public String toString() {
return nodeName;
}
}
}