/*******************************************************************************
* Copyright (c) 2008 Vlad Dumitrescu and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Vlad Dumitrescu
*******************************************************************************/
package org.erlide.ui.prefs;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.progress.UIJob;
import org.eclipse.wb.swt.SWTResourceManager;
import org.erlide.engine.ErlangEngine;
import org.erlide.engine.services.SystemInfoService;
import org.erlide.util.ErlLogger;
import org.erlide.util.LogUtil;
public class ReportPreferencePage extends PreferencePage
implements IWorkbenchPreferencePage {
public ReportPreferencePage() {
}
private Button sendButton;
private Label responseLabel_1;
private Text locationLabel;
Text fcontact;
Text fbody;
Text ftitle;
private Label responseLabel;
Button attachTechnicalDataButton;
private Label lblDescription;
@Override
protected Control createContents(final Composite parent) {
final Composite panel = new Composite(parent, SWT.NONE);
panel.setLayout(new GridLayout(2, false));
final Label titleLabel = new Label(panel, SWT.NONE);
titleLabel.setAlignment(SWT.RIGHT);
{
final GridData gridData = new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1,
1);
gridData.widthHint = 60;
titleLabel.setLayoutData(gridData);
}
titleLabel.setText("Title:");
ftitle = new Text(panel, SWT.BORDER);
ftitle.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
lblDescription = new Label(panel, SWT.NONE);
lblDescription.setAlignment(SWT.RIGHT);
lblDescription
.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false, 1, 1));
lblDescription.setText("Description:");
fbody = new Text(panel, SWT.V_SCROLL | SWT.MULTI | SWT.BORDER | SWT.WRAP);
{
final GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1);
gridData.heightHint = 150;
fbody.setLayoutData(gridData);
}
fbody.setText("(enter error description here, paste any relevant code too)");
final Label contactoptionalLabel = new Label(panel, SWT.NONE);
contactoptionalLabel.setAlignment(SWT.RIGHT);
contactoptionalLabel.setText("Contact (email):");
fcontact = new Text(panel, SWT.BORDER);
fcontact.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
fcontact.setText(System.getProperty("user.name"));
attachTechnicalDataButton = new Button(panel, SWT.CHECK);
attachTechnicalDataButton
.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false, 2, 1));
attachTechnicalDataButton.setSelection(true);
attachTechnicalDataButton
.setText(" Attach technical data (eclipse and erlide logs) ");
sendButton = new Button(panel, SWT.NONE);
{
final GridData gridData = new GridData(SWT.CENTER, SWT.CENTER, false, false,
2, 1);
gridData.widthHint = 243;
sendButton.setLayoutData(gridData);
}
sendButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
postReport();
}
});
sendButton.setText("Create report");
responseLabel = new Label(panel, SWT.CENTER);
responseLabel.setVisible(false);
responseLabel
.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false, 2, 1));
responseLabel.setText(
"The report was saved in the location below, you can now close this window.");
locationLabel = new Text(panel, SWT.CENTER | SWT.WRAP | SWT.READ_ONLY);
locationLabel.setVisible(false);
locationLabel.setForeground(SWTResourceManager.getColor(SWT.COLOR_DARK_BLUE));
locationLabel
.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
locationLabel.setBackground(
Display.getCurrent().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
locationLabel.setText("location");
responseLabel_1 = new Label(panel, SWT.CENTER);
responseLabel_1.setVisible(false);
responseLabel_1
.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
responseLabel_1
.setText("Please attach the report if you are writing a trouble ticket.");
noDefaultAndApplyButton();
return panel;
}
protected void postReport() {
sendButton.setText("Generating report, please wait...");
sendButton.setEnabled(false);
sendButton.update();
final boolean attach = attachTechnicalDataButton.getSelection();
final String title = ftitle.getText();
final String contact = fcontact.getText();
final String body = fbody.getText();
final Job j = new Job("send error report") {
@Override
public IStatus run(final IProgressMonitor monitor) {
final String location = LogUtil.getReportFile();
final ProblemData data = gatherProblemData(attach, title, contact, body);
sendToDisk(location, data);
final Job inner = new UIJob("update report ui") {
@Override
public IStatus runInUIThread(final IProgressMonitor amonitor) {
sendButton.setText("Done!");
responseLabel.setVisible(true);
locationLabel.setText(location);
locationLabel.setVisible(true);
responseLabel_1.setVisible(true);
return Status.OK_STATUS;
}
};
inner.setPriority(Job.INTERACTIVE);
inner.setSystem(true);
inner.schedule();
return Status.OK_STATUS;
}
};
j.setPriority(Job.SHORT);
j.setSystem(true);
j.schedule();
}
private static void fetchErlangSystemInfo() {
final SystemInfoService sysinfo = ErlangEngine.getInstance()
.getService(SystemInfoService.class);
final String info = sysinfo.get();
ErlLogger.info("\n++++++++++++++++++++++\n" + info);
}
void sendToDisk(final String location, final ProblemData data) {
final File report = new File(location);
try (final OutputStream out = new FileOutputStream(report);
final PrintWriter pw = new PrintWriter(out)) {
report.createNewFile();
pw.println(data.summary);
pw.println(data.reporter);
pw.println(data.description);
pw.println("\n==================================\n");
pw.println(data.platformLog);
pw.println("\n==================================\n");
pw.println(data.erlideLog);
pw.flush();
} catch (final IOException e) {
ErlLogger.warn(e);
}
}
@Override
public void init(final IWorkbench workbench) {
}
public static ProblemData gatherProblemData(final boolean attach, final String title,
final String contact, final String body) {
fetchErlangSystemInfo();
String plog = "N/A";
String elog = "N/A";
if (attach) {
plog = LogUtil.fetchPlatformLog();
elog = LogUtil.fetchErlideLog();
}
final ProblemData data = new ProblemData(title, contact, body, plog, elog);
return data;
}
}