X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fnet%2Fsf%2Fopenrocket%2Fgui%2Fdialogs%2FBugReportDialog.java;fp=src%2Fnet%2Fsf%2Fopenrocket%2Fgui%2Fdialogs%2FBugReportDialog.java;h=4045e228238a77e81d64c9a241b401524dddbaf3;hb=0d0afe488300aca47d09ac7651f8185190afb21f;hp=0000000000000000000000000000000000000000;hpb=6afc62224f6f7e581b1d321e125ed97a6ec77dc1;p=debian%2Fopenrocket
diff --git a/src/net/sf/openrocket/gui/dialogs/BugReportDialog.java b/src/net/sf/openrocket/gui/dialogs/BugReportDialog.java
new file mode 100644
index 00000000..4045e228
--- /dev/null
+++ b/src/net/sf/openrocket/gui/dialogs/BugReportDialog.java
@@ -0,0 +1,370 @@
+package net.sf.openrocket.gui.dialogs;
+
+import java.awt.Desktop;
+import java.awt.Dialog;
+import java.awt.Dimension;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+
+import net.miginfocom.swing.MigLayout;
+import net.sf.openrocket.gui.components.ResizeLabel;
+import net.sf.openrocket.gui.components.SelectableLabel;
+import net.sf.openrocket.util.GUIUtil;
+import net.sf.openrocket.util.JarUtil;
+import net.sf.openrocket.util.Prefs;
+
+public class BugReportDialog extends JDialog {
+
+ private static final String REPORT_EMAIL = "openrocket-bugs@lists.sourceforge.net";
+
+ private static final String REPORT_URL =
+ "http://openrocket.sourceforge.net/actions/reportbug";
+
+ private static final String REPORT_VERSION_PARAM = "version";
+ private static final String REPORT_PARAM = "content";
+ private static final int REPORT_RESPONSE_CODE = HttpURLConnection.HTTP_CREATED;
+ private static final int REPORT_TIMEOUT = 10000; // in milliseconds
+
+
+ public BugReportDialog(Window parent, String labelText, String message) {
+ super(parent, "Bug report", Dialog.ModalityType.APPLICATION_MODAL);
+
+ JPanel panel = new JPanel(new MigLayout("fill"));
+
+ // Some fscking Swing bug that makes html labels initially way too high
+ JLabel label = new JLabel(labelText);
+ Dimension d = label.getPreferredSize();
+ d.width = 100000;
+ label.setMaximumSize(d);
+ panel.add(label, "gapleft para, wrap para");
+
+ label = new JLabel("If connected to the Internet, you can simply click " +
+ "Send bug report.");
+ d = label.getPreferredSize();
+ d.width = 100000;
+ label.setMaximumSize(d);
+ panel.add(label, "gapleft para, wrap");
+
+ panel.add(new JLabel("Otherwise, send the text below to the address: "),
+ "gapleft para, split 2, gapright rel");
+ panel.add(new SelectableLabel(REPORT_EMAIL), "growx, wrap para");
+
+
+ final JTextArea textArea = new JTextArea(message, 20, 70);
+ textArea.setEditable(true);
+ panel.add(new JScrollPane(textArea), "grow, wrap");
+
+
+ panel.add(new ResizeLabel("The information above may be included in a public " +
+ "bug report. Make sure it does not contain any sensitive information you " +
+ "do not want to be made public.", -1), "wrap para");
+
+
+
+ //// Close button
+ JButton close = new JButton("Close");
+ close.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ BugReportDialog.this.dispose();
+ }
+ });
+ panel.add(close, "right, sizegroup buttons, split");
+
+
+ //// Mail button
+// if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Action.MAIL)) {
+// JButton mail = new JButton("Open email");
+// mail.setToolTipText("Open email client with the suitable email ready.");
+// mail.addActionListener(new ActionListener() {
+// @Override
+// public void actionPerformed(ActionEvent e) {
+// String text = textArea.getText();
+// openEmail(text);
+// }
+// });
+// panel.add(mail, "right, sizegroup buttons");
+// }
+
+
+ //// Send button
+ JButton send = new JButton("Send bug report");
+ send.setToolTipText("Automatically send the bug report to the OpenRocket developers.");
+ send.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ String text = textArea.getText();
+ try {
+
+ sendReport(text);
+ // Success if we came here
+ JOptionPane.showMessageDialog(BugReportDialog.this,
+ new Object[] { "Bug report successfully sent.",
+ "Thank you for helping make OpenRocket better!" },
+ "Bug report sent", JOptionPane.INFORMATION_MESSAGE);
+
+ } catch (Exception ex) {
+ // Sending the message failed.
+ JOptionPane.showMessageDialog(BugReportDialog.this,
+ new Object[] { "OpenRocket was unable to send the bug report:",
+ ex.getClass().getSimpleName() + ": " + ex.getMessage(), " ",
+ "Please send the report manually to " + REPORT_EMAIL },
+ "Error sending report", JOptionPane.ERROR_MESSAGE);
+ }
+ }
+ });
+ panel.add(send, "right, sizegroup buttons");
+
+ this.add(panel);
+
+ this.validate();
+ this.pack();
+ this.pack();
+ this.setLocationRelativeTo(parent);
+ GUIUtil.installEscapeCloseOperation(this);
+// GUIUtil.setDefaultButton(close);
+ }
+
+
+
+ /**
+ * Show a general bug report dialog allowing the user to input information about
+ * the bug they encountered.
+ *
+ * @param parent the parent window (may be null).
+ */
+ public static void showBugReportDialog(Window parent) {
+
+ StringBuilder sb = new StringBuilder();
+
+ sb.append("---------- Bug report ----------\n");
+ sb.append('\n');
+ sb.append("Include detailed steps on how to trigger the bug:\n");
+ sb.append('\n');
+ sb.append("1. \n");
+ sb.append("2. \n");
+ sb.append("3. \n");
+ sb.append('\n');
+
+ sb.append("What does the software do and what in your opinion should it do in the " +
+ "case described above:\n");
+ sb.append('\n');
+ sb.append('\n');
+ sb.append('\n');
+
+ sb.append("Include your email address (optional; it helps if we can " +
+ "contact you in case we need additional information):\n");
+ sb.append('\n');
+ sb.append('\n');
+ sb.append('\n');
+
+
+ sb.append("(Do not modify anything below this line.)\n");
+ sb.append("---------- System information ----------\n");
+ addSystemInformation(sb);
+ sb.append("---------- End of information ----------\n");
+ sb.append('\n');
+
+ BugReportDialog reportDialog =
+ new BugReportDialog(parent,
+ "You can report a bug in OpenRocket by filling in and submitting " +
+ "the form below.
" +
+ "You can also report bugs and include attachments on the project " +
+ "web site.", sb.toString());
+ reportDialog.setVisible(true);
+ }
+
+
+ /**
+ * Show a dialog presented when an uncaught exception occurs.
+ *
+ * @param parent the parent window (may be null).
+ * @param t the thread that encountered the exception (may be null).
+ * @param e the exception.
+ */
+ public static void showExceptionDialog(Window parent, Thread t, Throwable e) {
+
+ StringBuilder sb = new StringBuilder();
+
+ sb.append("---------- Bug report ----------\n");
+ sb.append('\n');
+ sb.append("Please include a description about what actions you were " +
+ "performing when the exception occurred:\n");
+ sb.append('\n');
+ sb.append('\n');
+ sb.append('\n');
+ sb.append('\n');
+
+
+ sb.append("Include your email address (optional; it helps if we can " +
+ "contact you in case we need additional information):\n");
+ sb.append('\n');
+ sb.append('\n');
+ sb.append('\n');
+ sb.append('\n');
+
+ sb.append("(Do not modify anything below this line.)\n");
+ sb.append("---------- Exception stack trace ----------\n");
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ e.printStackTrace(pw);
+ sb.append(sw.getBuffer());
+ sb.append('\n');
+
+
+ sb.append("---------- Thread information ----------\n");
+ if (t == null) {
+ sb.append("Thread is not specified.");
+ } else {
+ sb.append(t + "\n");
+ }
+ sb.append('\n');
+
+
+ sb.append("---------- System information ----------\n");
+ addSystemInformation(sb);
+ sb.append("---------- End of information ----------\n");
+ sb.append('\n');
+
+ BugReportDialog reportDialog =
+ new BugReportDialog(parent, "Please include a short description about " +
+ "what you were doing when the exception occurred.", sb.toString());
+ reportDialog.setVisible(true);
+ }
+
+
+ private static void addSystemInformation(StringBuilder sb) {
+ sb.append("OpenRocket version: " + Prefs.getVersion() + "\n");
+ sb.append("OpenRocket source: " + Prefs.getBuildSource() + "\n");
+ sb.append("OpenRocket location: " + JarUtil.getCurrentJarFile() + "\n");
+ sb.append("System properties:\n");
+
+ // Sort the keys
+ SortedSet keys = new TreeSet();
+ for (Object key: System.getProperties().keySet()) {
+ keys.add((String)key);
+ }
+
+ for (String key: keys) {
+ String value = System.getProperty(key);
+ sb.append(" " + key + "=");
+ if (key.equals("line.separator")) {
+ for (char c: value.toCharArray()) {
+ sb.append(String.format("\\u%04x", (int)c));
+ }
+ } else {
+ sb.append(value);
+ }
+ sb.append('\n');
+ }
+ }
+
+
+
+ /**
+ * Send the provided report to the OpenRocket bug report URL. If the connection
+ * fails or the server does not respond with the correct response code, an
+ * exception is thrown.
+ *
+ * @param report the report to send.
+ * @throws IOException if an error occurs while connecting to the server or
+ * the server responds with a wrong response code.
+ */
+ private void sendReport(String report) throws IOException {
+ URL url = new URL(REPORT_URL);
+
+ HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+
+ connection.setConnectTimeout(REPORT_TIMEOUT);
+ connection.setInstanceFollowRedirects(true);
+ connection.setRequestMethod("POST");
+ connection.setUseCaches(false);
+
+ String post;
+ post = (REPORT_VERSION_PARAM + "=" + URLEncoder.encode(Prefs.getVersion(), "UTF-8")
+ + "&" + REPORT_PARAM + "=" + URLEncoder.encode(report, "UTF-8"));
+
+ OutputStreamWriter wr = null;
+ try {
+ // Send post information
+ connection.setDoOutput(true);
+ wr = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");
+ wr.write(post);
+ wr.flush();
+
+ if (connection.getResponseCode() != REPORT_RESPONSE_CODE) {
+ throw new IOException("Server responded with code " +
+ connection.getResponseCode() + ", expecting " + REPORT_RESPONSE_CODE);
+ }
+ } finally {
+ if (wr != null)
+ wr.close();
+ connection.disconnect();
+ }
+ }
+
+
+ /**
+ * Open the default email client with the suitable bug report.
+ * Note that this does not work on some systems even if Desktop.isSupported()
+ * claims so.
+ *
+ * @param text the bug report text.
+ * @return whether opening the client succeeded.
+ */
+ private boolean openEmail(String text) {
+ String version;
+
+ try {
+ text = URLEncoder.encode(text, "UTF-8");
+ version = URLEncoder.encode(Prefs.getVersion(), "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+
+
+
+ String mailto = "mailto:" + REPORT_EMAIL
+ + "?subject=Bug%20report%20for%20OpenRocket%20" + version
+ + "?body=" + text;
+ URI uri;
+ try {
+ uri = new URI(mailto);
+ } catch (URISyntaxException e) {
+ e.printStackTrace();
+ return false;
+ }
+
+ Desktop desktop = Desktop.getDesktop();
+ try {
+ desktop.mail(uri);
+ } catch (IOException e) {
+ e.printStackTrace();
+ return false;
+ }
+
+ return true;
+ }
+
+}