1 package de.lathanda.eos.gui;
3 import de.lathanda.eos.base.ResourceLoader;
4 import de.lathanda.eos.base.util.GuiToolkit;
5 import de.lathanda.eos.common.gui.Messages;
6 import de.lathanda.eos.spi.LanguageManager;
8 import java.awt.Desktop;
9 import java.awt.Dimension;
11 import java.awt.Toolkit;
12 import javax.swing.tree.DefaultMutableTreeNode;
13 import javax.swing.tree.TreeNode;
14 import javax.swing.tree.TreePath;
16 import java.io.IOException;
17 import java.io.InputStream;
19 import java.net.URISyntaxException;
21 import java.util.Enumeration;
23 import javax.swing.JFrame;
24 import javax.swing.JOptionPane;
25 import javax.swing.JTree;
26 import javax.swing.event.HyperlinkEvent;
27 import javax.swing.text.html.HTMLEditorKit;
28 import javax.xml.parsers.DocumentBuilder;
29 import javax.xml.parsers.DocumentBuilderFactory;
30 import javax.xml.parsers.ParserConfigurationException;
31 import org.w3c.dom.Document;
32 import org.w3c.dom.NodeList;
33 import org.w3c.dom.Node;
34 import org.xml.sax.SAXException;
35 import static de.lathanda.eos.base.icons.Icons.*;
42 public class Help extends JFrame {
43 private static final long serialVersionUID = -5024616463654399568L;
47 private static Help help =
null;
55 }
else if (help.isVisible()) {
58 Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
59 help.setBounds((
int) (screen.width * 0.5), 0, (
int) (screen.height * 0.9), (
int) (screen.width * 0.5));
61 help.setIconImage(LOGO);
62 help.setVisible(
true);
66 private void resetDivider() {
73 private static DefaultMutableTreeNode topics;
77 private static String defaultHtml;
88 private static void createTopics() {
89 InputStream xmlData =
null;
91 xmlData = LanguageManager.getInstance().getHelpXml();
92 DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
93 DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
94 Document doc = dBuilder.parse(xmlData);
95 NodeList xmlchildren = doc.getChildNodes();
96 for (
int i = 0; i < xmlchildren.getLength(); i++) {
97 Node xmlchild = xmlchildren.item(i);
98 if (xmlchild.getNodeName().equals(
"help")) {
99 topics =
new DefaultMutableTreeNode(
new TreeEntry(xmlchild));
100 fillTree(topics, xmlchild);
104 }
catch (ParserConfigurationException | SAXException | IOException e) {
105 JOptionPane.showMessageDialog(
null, e.getLocalizedMessage(), Messages.getString(
"InternalError.Title"),
106 JOptionPane.ERROR_MESSAGE);
108 ResourceLoader.closeQuietly(xmlData);
119 private static void fillTree(DefaultMutableTreeNode treenode, Node xmlnode) {
120 NodeList xmlchildren = xmlnode.getChildNodes();
121 for (
int i = 0; i < xmlchildren.getLength(); i++) {
122 Node xmlchild = xmlchildren.item(i);
123 if (xmlchild.getNodeName().equals(
"node")) {
124 TreeEntry treeEntry =
new TreeEntry(xmlchild);
125 if (defaultHtml ==
null || defaultHtml.isEmpty()) {
126 defaultHtml = treeEntry.getHtmlfile();
128 DefaultMutableTreeNode treechild =
new DefaultMutableTreeNode(treeEntry);
129 treenode.add(treechild);
130 fillTree(treechild, xmlchild);
141 private static class TreeEntry {
145 private final String title;
149 private final String htmlfile;
156 private TreeEntry(Node xmlnode) {
157 Node item = xmlnode.getAttributes().getNamedItem(
"title");
159 title = item.getNodeValue();
163 item = xmlnode.getAttributes().getNamedItem(
"html");
165 htmlfile = item.getNodeValue();
172 public String toString() {
176 public String getHtmlfile() {
185 HTMLEditorKit kit =
new HTMLEditorKit();
192 treeTopic.setRootVisible(
false);
194 txtHelp.setEditorKit(kit);
196 javax.swing.text.Document doc = kit.createDefaultDocument();
197 txtHelp.setDocument(doc);
198 setHtml(defaultHtml);
204 private void initComponents() {
206 helpSplit =
new javax.swing.JSplitPane();
207 scrollTopic =
new javax.swing.JScrollPane();
208 treeTopic =
new javax.swing.JTree(topics);
209 scrollHelp =
new javax.swing.JScrollPane();
210 txtHelp =
new javax.swing.JTextPane();
212 helpSplit.setResizeWeight(1);
214 treeTopic.addTreeSelectionListener(evt -> treeTopicValueChanged(evt));
215 expandAll(treeTopic);
216 scrollTopic.setViewportView(treeTopic);
218 helpSplit.setRightComponent(scrollTopic);
220 txtHelp.setEditable(
false);
222 txtHelp.addHyperlinkListener(e -> hyperlinkUpdate(e));
223 scrollHelp.setViewportView(txtHelp);
225 helpSplit.setLeftComponent(scrollHelp);
228 getContentPane().add(helpSplit);
237 private void expandAll(JTree tree) {
238 expandAll(tree,
new TreePath((TreeNode) tree.getModel().getRoot()));
247 private void expandAll(JTree tree, TreePath parent) {
248 TreeNode node = (TreeNode) parent.getLastPathComponent();
249 for (Enumeration<?> e = node.children(); e.hasMoreElements();) {
250 TreeNode n = (TreeNode) e.nextElement();
251 TreePath path = parent.pathByAddingChild(n);
252 expandAll(tree, path);
254 tree.expandPath(parent);
262 private void hyperlinkUpdate(HyperlinkEvent e) {
264 if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
265 URL target = e.getURL();
266 if (target.getProtocol().equals(
"file")) {
267 treeTopic.clearSelection();
268 txtHelp.setPage(target);
269 }
else if (target.getProtocol().equals(
"jar")) {
270 treeTopic.clearSelection();
271 txtHelp.setPage(target);
273 URI uri = target.toURI();
274 Desktop.getDesktop().browse(uri);
277 }
catch (IOException | URISyntaxException ioe) {
278 JOptionPane.showMessageDialog(
null, ioe.getLocalizedMessage(), Messages.getString(
"Info.Error.Title"),
279 JOptionPane.ERROR_MESSAGE);
288 private void treeTopicValueChanged(javax.swing.event.TreeSelectionEvent evt) {
289 DefaultMutableTreeNode node = (DefaultMutableTreeNode) treeTopic.getLastSelectedPathComponent();
292 TreeEntry entry = (TreeEntry) node.getUserObject();
293 setHtml(entry.getHtmlfile());
302 private void setHtml(String filename) {
303 if (filename.equals(
""))
306 URL url = ClassLoader.getSystemClassLoader().getResource(filename);
307 txtHelp.setPage(url);
308 }
catch (IOException ioe) {
309 JOptionPane.showMessageDialog(
null, ioe.getLocalizedMessage(), Messages.getString(
"Info.Error.Title"),
310 JOptionPane.ERROR_MESSAGE);
314 private javax.swing.JSplitPane helpSplit;
315 private javax.swing.JScrollPane scrollHelp;
316 private javax.swing.JScrollPane scrollTopic;
317 private javax.swing.JTree treeTopic;
318 private javax.swing.JTextPane txtHelp;
static String getString(String id)