added menu entry Help > Display Log Messages

master
Stefan Dollase 2016-11-21 05:03:40 +01:00
parent f8b6a4ac2e
commit 5ed128d544
4 changed files with 50 additions and 33 deletions

View File

@ -184,20 +184,11 @@ public class Amidst {
String message = "Amidst has encounted an uncaught exception on the thread " + thread;
try {
AmidstLogger.crash(e, message);
displayCrashWindow(message, AmidstLogger.getAllMessages());
CrashWindow.showAfterCrash();
} catch (Throwable t) {
System.err.println("Amidst crashed!");
System.err.println(message);
e.printStackTrace();
}
}
private static void displayCrashWindow(final String message, final String allMessages) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
CrashWindow.show(message, allMessages, () -> System.exit(4));
}
});
}
}

View File

@ -11,37 +11,54 @@ import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;
import amidst.documentation.AmidstThread;
import amidst.documentation.CalledOnlyBy;
import amidst.documentation.NotThreadSafe;
import amidst.logging.AmidstLogger;
import net.miginfocom.swing.MigLayout;
@NotThreadSafe
public enum CrashWindow {
INSTANCE;
CRASHING("Amidst crashed!", true, () -> {
System.exit(4);
}),
INTEREST("Log Messages", false, () -> {
// noop
});
@CalledOnlyBy(AmidstThread.EDT)
public static void show(String message, String logMessages, Runnable executeOnClose) {
INSTANCE.set(message, logMessages, executeOnClose);
public static void showAfterCrash() {
String allMessages = AmidstLogger.getAllMessages();
SwingUtilities.invokeLater(() -> CRASHING.set(allMessages));
}
private final JLabel messageLabel;
public static void showForInterest() {
String allMessages = AmidstLogger.getAllMessages();
SwingUtilities.invokeLater(() -> INTEREST.set(allMessages));
}
private final JLabel pleaseReportLabel;
private final JTextField pleaseReportTextField;
private final JTextArea logMessagesTextArea;
private final JFrame frame;
private volatile Runnable executeOnClose;
private final boolean isCrashing;
private final Runnable executeOnClose;
@CalledOnlyBy(AmidstThread.EDT)
private CrashWindow() {
this.messageLabel = createMessageLabel();
private CrashWindow(String title, boolean isCrashing, Runnable executeOnClose) {
this.isCrashing = isCrashing;
this.executeOnClose = executeOnClose;
if (isCrashing) {
this.pleaseReportLabel = new JLabel("Please report this bug on:");
this.pleaseReportTextField = createReportingTextField();
} else {
this.pleaseReportLabel = null;
this.pleaseReportTextField = null;
}
this.logMessagesTextArea = createLogMessagesTextArea();
this.frame = createFrame();
}
@CalledOnlyBy(AmidstThread.EDT)
private JLabel createMessageLabel() {
return new JLabel();
this.frame = createFrame(title);
}
@CalledOnlyBy(AmidstThread.EDT)
@ -53,18 +70,19 @@ public enum CrashWindow {
}
@CalledOnlyBy(AmidstThread.EDT)
private JFrame createFrame() {
JFrame result = new JFrame("Amidst crashed!");
private JFrame createFrame(String title) {
JFrame result = new JFrame(title);
result.getContentPane().setLayout(new MigLayout());
result.add(messageLabel, "growx, pushx, wrap");
result.add(new JLabel("Please report this bug on:"), "growx, pushx, wrap");
result.add(createReportingTextField(), "growx, pushx, wrap");
if (isCrashing) {
result.add(pleaseReportLabel, "growx, pushx, wrap");
result.add(pleaseReportTextField, "growx, pushx, wrap");
}
result.add(createLogMessagesScrollPane(logMessagesTextArea), "grow, push");
result.setSize(800, 600);
result.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
result.dispose();
result.setVisible(false);
executeOnClose.run();
}
});
@ -88,10 +106,11 @@ public enum CrashWindow {
}
@CalledOnlyBy(AmidstThread.EDT)
public void set(String message, String logMessages, Runnable executeOnClose) {
this.messageLabel.setText(message);
public void set(String logMessages) {
if (isCrashing) {
this.pleaseReportTextField.selectAll();
}
this.logMessagesTextArea.setText(logMessages);
this.executeOnClose = executeOnClose;
this.frame.setVisible(true);
}
}

View File

@ -16,6 +16,7 @@ import amidst.Application;
import amidst.documentation.AmidstThread;
import amidst.documentation.CalledOnlyBy;
import amidst.documentation.NotThreadSafe;
import amidst.gui.crash.CrashWindow;
import amidst.gui.main.menu.MovePlayerPopupMenu;
import amidst.gui.main.viewer.ViewerFacade;
import amidst.logging.AmidstLogger;
@ -241,6 +242,11 @@ public class Actions {
}
}
@CalledOnlyBy(AmidstThread.EDT)
public void displayLogMessages() {
CrashWindow.showForInterest();
}
@CalledOnlyBy(AmidstThread.EDT)
public void checkForUpdates() {
application.checkForUpdates(mainWindow);

View File

@ -148,6 +148,7 @@ public class AmidstMenuBuilder {
JMenu result = new JMenu("Help");
result.setMnemonic(KeyEvent.VK_H);
// @formatter:off
Menus.item(result, actions::displayLogMessages, "Display Log Messages", KeyEvent.VK_M);
Menus.item(result, actions::checkForUpdates, "Check for Updates", KeyEvent.VK_U);
Menus.item(result, actions::viewLicense, "View Licenses", KeyEvent.VK_L);
Menus.item(result, actions::about, "About", KeyEvent.VK_A);