Package ch.rakudave.jnetmap.view.preferences

Source Code of ch.rakudave.jnetmap.view.preferences.Preferences$TreeCard

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

Related Classes of ch.rakudave.jnetmap.view.preferences.Preferences$TreeCard

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.