EOS 2  1.1.0
Einfache Objektbasierte Sprache
Help.java
gehe zur Dokumentation dieser Datei
1 package de.lathanda.eos.gui;
2 
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;
7 
8 import java.awt.Desktop;
9 import java.awt.Dimension;
10 import java.awt.Font;
11 import java.awt.Toolkit;
12 import javax.swing.tree.DefaultMutableTreeNode;
13 import javax.swing.tree.TreeNode;
14 import javax.swing.tree.TreePath;
15 
16 import java.io.IOException;
17 import java.io.InputStream;
18 import java.net.URI;
19 import java.net.URISyntaxException;
20 import java.net.URL;
21 import java.util.Enumeration;
22 
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.*;
36 
42 public class Help extends JFrame {
43  private static final long serialVersionUID = -5024616463654399568L;
47  private static Help help = null;
48 
52  public static void showHelp() {
53  if (help == null) {
54  help = new Help();
55  } else if (help.isVisible()) {
56  return;
57  }
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));
60  help.setTitle(Messages.getString("Help.Title"));
61  help.setIconImage(LOGO);
62  help.setVisible(true);
63  help.resetDivider();
64  }
65 
66  private void resetDivider() {
67  helpSplit.setDividerLocation(helpSplit.getWidth() - GuiToolkit.scaledSize(168));
68  }
69 
73  private static DefaultMutableTreeNode topics;
77  private static String defaultHtml;
81  static {
82  createTopics();
83  }
84 
88  private static void createTopics() {
89  InputStream xmlData = null;
90  try {
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);
101  break;
102  }
103  }
104  } catch (ParserConfigurationException | SAXException | IOException e) {
105  JOptionPane.showMessageDialog(null, e.getLocalizedMessage(), Messages.getString("InternalError.Title"),
106  JOptionPane.ERROR_MESSAGE);
107  } finally {
108  ResourceLoader.closeQuietly(xmlData);
109  }
110 
111  }
112 
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();
127  }
128  DefaultMutableTreeNode treechild = new DefaultMutableTreeNode(treeEntry);
129  treenode.add(treechild);
130  fillTree(treechild, xmlchild);
131  }
132  }
133  }
134 
141  private static class TreeEntry {
145  private final String title;
149  private final String htmlfile;
150 
156  private TreeEntry(Node xmlnode) {
157  Node item = xmlnode.getAttributes().getNamedItem("title");
158  if (item != null) {
159  title = item.getNodeValue();
160  } else {
161  title = "?";
162  }
163  item = xmlnode.getAttributes().getNamedItem("html");
164  if (item != null) {
165  htmlfile = item.getNodeValue();
166  } else {
167  htmlfile = "";
168  }
169  }
170 
171  @Override
172  public String toString() {
173  return title;
174  }
175 
176  public String getHtmlfile() {
177  return htmlfile;
178  }
179 
180  }
181 
185  HTMLEditorKit kit = new HTMLEditorKit();
186 
190  public Help() {
191  initComponents();
192  treeTopic.setRootVisible(false);
193  treeTopic.setFont(GuiToolkit.createFont(Font.SANS_SERIF, Font.PLAIN, 10));
194  txtHelp.setEditorKit(kit);
195  txtHelp.setFont(GuiToolkit.createFont(Font.SERIF, Font.PLAIN, 10));
196  javax.swing.text.Document doc = kit.createDefaultDocument();
197  txtHelp.setDocument(doc);
198  setHtml(defaultHtml);
199  }
200 
204  private void initComponents() {
205 
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();
211 
212  helpSplit.setResizeWeight(1);
213 
214  treeTopic.addTreeSelectionListener(evt -> treeTopicValueChanged(evt));
215  expandAll(treeTopic);
216  scrollTopic.setViewportView(treeTopic);
217 
218  helpSplit.setRightComponent(scrollTopic);
219 
220  txtHelp.setEditable(false);
221  txtHelp.setFont(GuiToolkit.createFont(Font.SANS_SERIF, Font.PLAIN, 10));
222  txtHelp.addHyperlinkListener(e -> hyperlinkUpdate(e));
223  scrollHelp.setViewportView(txtHelp);
224 
225  helpSplit.setLeftComponent(scrollHelp);
226 
227  helpSplit.setPreferredSize(GuiToolkit.scaledDimension(768, 517));
228  getContentPane().add(helpSplit);
229  pack();
230  }
231 
237  private void expandAll(JTree tree) {
238  expandAll(tree, new TreePath((TreeNode) tree.getModel().getRoot()));
239  }
240 
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);
253  }
254  tree.expandPath(parent);
255  }
256 
262  private void hyperlinkUpdate(HyperlinkEvent e) {
263  try {
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);
272  } else {
273  URI uri = target.toURI();
274  Desktop.getDesktop().browse(uri);
275  }
276  }
277  } catch (IOException | URISyntaxException ioe) {
278  JOptionPane.showMessageDialog(null, ioe.getLocalizedMessage(), Messages.getString("Info.Error.Title"),
279  JOptionPane.ERROR_MESSAGE);
280  }
281  }
282 
288  private void treeTopicValueChanged(javax.swing.event.TreeSelectionEvent evt) {
289  DefaultMutableTreeNode node = (DefaultMutableTreeNode) treeTopic.getLastSelectedPathComponent();
290  if (node == null)
291  return;
292  TreeEntry entry = (TreeEntry) node.getUserObject();
293  setHtml(entry.getHtmlfile());
294  }
295 
302  private void setHtml(String filename) {
303  if (filename.equals(""))
304  return;
305  try {
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);
311  }
312  }
313 
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;
319 }
static Dimension scaledDimension(int width, int height)
static Font createFont(String name, int style, int size)
Definition: GuiToolkit.java:89
static String getString(String id)
Definition: Messages.java:29
static void showHelp()
Definition: Help.java:52
Impressum