/*******************************************************************************
* gMix open source project - https://svs.informatik.uni-hamburg.de/gmix/
* Copyright (C) 2014 SVS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
package staticContent.evaluation.simulator.gui.customElements;
import java.awt.BorderLayout;
import java.awt.Color;
import java.io.IOException;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.naming.ldap.UnsolicitedNotificationEvent;
import javax.swing.JOptionPane;
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.TreeSelectionModel;
import org.apache.log4j.Logger;
import staticContent.evaluation.simulator.annotations.property.SimProp;
import staticContent.evaluation.simulator.conf.service.UserConfigService;
import staticContent.evaluation.simulator.gui.customElements.structure.HelpTreeNode;
import staticContent.evaluation.simulator.gui.helper.ValueComparator;
import staticContent.evaluation.simulator.gui.pluginRegistry.SimPropRegistry;
/**
* Builds the menu for the {@link SimHelpContentPanel}
*
* @author nachkonvention
*
*/
@SuppressWarnings("serial")
public class SimHelpMenuPanel extends JPanel implements TreeSelectionListener {
private static Logger logger = Logger.getLogger(SimHelpMenuPanel.class);
private static SimHelpMenuPanel instance = null;
private static String path = "etc/html/plugins/";
private static Map<String, String> layerMapDisplayNameToConfigName;
private static Map<String, SimProp> propertyMap;
private static Map<String, String> registeredPlugins;
private static JTree tree;
/**
* Singleton
*
* @return an instance of {@link SimHelpMenuPanel}
*/
public static SimHelpMenuPanel getInstance() {
if (instance == null) {
instance = new SimHelpMenuPanel();
}
return instance;
}
private SimHelpMenuPanel() {
this.initialize();
}
private void initialize() {
DefaultMutableTreeNode top = new DefaultMutableTreeNode("gMixSim Help");
createNodes(top);
tree = new JTree(top);
tree.getSelectionModel().setSelectionMode(
TreeSelectionModel.SINGLE_TREE_SELECTION);
tree.addTreeSelectionListener(this);
this.setLayout(new BorderLayout());
this.setBackground(Color.WHITE);
this.add(new JScrollPane(tree), BorderLayout.CENTER);
}
private void createNodes(DefaultMutableTreeNode top) {
DefaultMutableTreeNode category = null;
DefaultMutableTreeNode node = null;
layerMapDisplayNameToConfigName = SimPropRegistry.getInstance()
.getLayerMapDisplayNameToConfigName();
propertyMap = SimPropRegistry.getInstance().getProperties();
registeredPlugins = SimPropRegistry.getInstance()
.getRegisteredPlugins();
Map<String, Integer> layerMap = SimPropRegistry.getInstance()
.getLayerMapDisplayNameToOrder();
ValueComparator comperatorLayer = new ValueComparator(layerMap);
TreeMap<String, Integer> sortedLayerMap = new TreeMap<String, Integer>(
comperatorLayer);
sortedLayerMap.putAll(layerMap);
category = new DefaultMutableTreeNode("Videotutorials");
top.add(category);
category.add(new DefaultMutableTreeNode(new HelpTreeNode(
"Load and Start", "http://www.youtube.com/watch?v=cVH1mCc5EvU")));
category.add(new DefaultMutableTreeNode(new HelpTreeNode(
"Configuratrion Tool", "http://www.youtube.com/watch?v=cVH1mCc5EvU")));
category.add(new DefaultMutableTreeNode(new HelpTreeNode(
"Experiments and Graphs", "http://www.youtube.com/watch?v=cVH1mCc5EvU")));
for (String layer : sortedLayerMap.keySet()) {
category = new DefaultMutableTreeNode(layer);
top.add(category);
for (String prop : propertyMap.keySet()) {
if (propertyMap.get(prop).getPluginID().equals("")
&& (propertyMap.get(prop).isSuperclass() || propertyMap
.get(prop).isGlobal())
&& propertyMap
.get(prop)
.getPluginLayerID()
.equals(layerMapDisplayNameToConfigName
.get(layer))) {
node = new DefaultMutableTreeNode(new HelpTreeNode(prop,
path + prop + ".html"));
category.add(node);
}
}
for (String plugin : registeredPlugins.keySet()) {
if (registeredPlugins.get(plugin).equals(
layerMapDisplayNameToConfigName.get(layer))) {
node = new DefaultMutableTreeNode(new HelpTreeNode(plugin,
path + plugin + ".html"));
category.add(node);
}
}
}
}
/*
* (non-Javadoc)
*
* @see
* javax.swing.event.TreeSelectionListener#valueChanged(javax.swing.event
* .TreeSelectionEvent)
*/
public void valueChanged(TreeSelectionEvent e) {
// Returns the last path element of the selection.
// This method is useful only when the selection model allows a single
// selection.
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree
.getLastSelectedPathComponent();
if (node == null) {
return;
}
Object nodeInfo = node.getUserObject();
if (node.isLeaf()) {
boolean fallback = false;
final String IMAGE_PATTERN = "\\b(http|https)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
Pattern pattern = Pattern.compile(IMAGE_PATTERN);
HelpTreeNode helpTreeNode = (HelpTreeNode) nodeInfo;
pattern.matcher(helpTreeNode.getHelpTreeNodeURL());
Matcher matcher = pattern
.matcher(helpTreeNode.getHelpTreeNodeURL());
if (matcher.matches()) { // Videotutorials
try {
java.awt.Desktop.getDesktop().browse(java.net.URI.create(helpTreeNode.getHelpTreeNodeURL()));
} catch ( java.lang.UnsupportedOperationException ex ) {
fallback = true;
} catch (IOException e1) {
e1.printStackTrace();
}
if ( fallback ){
try {
new ProcessBuilder(UserConfigService.getBRWOSER_PATH(), helpTreeNode.getHelpTreeNodeURL()).start();
} catch (IOException e2) {
e2.printStackTrace();
}
} else {
JOptionPane.showMessageDialog(this, "Can not find Browser. Plase specify the variable \"BROWSER_PATH\" " +
"in \"/inputOutput/simulator/config/user.properties\" ");
}
} else { // static pages
logger.error(helpTreeNode.getHelpTreeNodeName() + " "
+ helpTreeNode.getHelpTreeNodeURL());
displayURL(helpTreeNode.getHelpTreeNodeURL());
}
}
}
/**
* Loads a given url into the SimHelpContentPanel
*
* @param helpTreeNodeURL
* is the url which should be loaded
*/
private void displayURL(String helpTreeNodeURL) {
SimHelpContentPanel p = SimHelpContentPanel.getInstance();
String urlString = helpTreeNodeURL.toString();
p.loadURL(urlString);
p.repaint();
}
}