20 package net.sf.gridarta.gui.dialog.errorview;
22 import java.awt.Component;
23 import java.awt.Dialog;
24 import java.awt.Dimension;
25 import java.lang.reflect.InvocationTargetException;
26 import java.util.EnumMap;
28 import java.util.concurrent.Semaphore;
29 import javax.swing.JButton;
30 import javax.swing.JOptionPane;
31 import javax.swing.JScrollPane;
32 import javax.swing.JTree;
33 import javax.swing.SwingUtilities;
34 import javax.swing.tree.DefaultMutableTreeNode;
35 import javax.swing.tree.DefaultTreeModel;
36 import javax.swing.tree.TreePath;
40 import net.
sf.japi.swing.action.ActionBuilder;
41 import net.
sf.japi.swing.action.ActionBuilderFactory;
42 import net.
sf.japi.swing.action.ActionMethod;
43 import org.jetbrains.annotations.NotNull;
44 import org.jetbrains.annotations.Nullable;
56 private static final ActionBuilder
ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder(
"net.sf.gridarta");
62 private final DefaultTreeModel
treeModel =
new DefaultTreeModel(
null);
130 addEntry(categoryName, lineNo +
": " + message);
136 addEntry(categoryName,
"Warning: " + message);
141 addEntry(categoryName,
"Warning: line " + lineNo +
": " + message);
150 final Runnable runnable = () -> {
153 category.
add(errorEntry);
156 if (SwingUtilities.isEventDispatchThread()) {
160 SwingUtilities.invokeAndWait(runnable);
161 }
catch (
final InterruptedException ignored) {
162 Thread.currentThread().interrupt();
163 }
catch (
final InvocationTargetException ex) {
164 throw new RuntimeException(ex);
177 if (existingErrorEntry !=
null) {
178 return existingErrorEntry;
214 final JScrollPane scrollPane =
new JScrollPane(tree);
215 tree.setExpandsSelectedPaths(
true);
216 final TreePath path =
new TreePath(
new Object[] {
treeRoot, category, errorEntry, });
217 tree.setSelectionPath(path);
218 tree.scrollPathToVisible(path);
220 final JOptionPane pane =
new JOptionPane(scrollPane, JOptionPane.PLAIN_MESSAGE, JOptionPane.DEFAULT_OPTION,
null,
new Object[] { okButton, },
okButton) {
223 private static final long serialVersionUID = 1L;
226 public void setValue(@Nullable
final Object newValue) {
227 super.setValue(newValue);
228 if (newValue != UNINITIALIZED_VALUE) {
234 pane.setPreferredSize(
new Dimension(800, 600));
238 pane.selectInitialValue();
250 final Runnable runnable = () -> {
254 if (SwingUtilities.isEventDispatchThread()) {
258 SwingUtilities.invokeAndWait(runnable);
259 }
catch (
final InvocationTargetException ex) {
260 throw new RuntimeException(ex);
267 if (Thread.interrupted()) {
268 throw new InterruptedException(
"current thread was interrupted");