blob: b3425cc0cb0f5f40cdbe752e305e23e9e8d7bf01 [file] [log] [blame]
/*
* Copyright (c) 2014 Eike Stepper (Berlin, Germany) 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.oomph.ui;
import org.eclipse.oomph.util.StringUtil;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Text;
import java.io.PrintWriter;
import java.io.StringWriter;
/**
* @author Eike Stepper
*/
public class ErrorDialog extends MessageDialog
{
private static final int TEXT_LINE_COUNT = 15;
private final Throwable throwable;
private final int detailsButtonID;
private Text text;
private ErrorDialog(String title, Throwable throwable)
{
this(title, throwable, 0, 1, IDialogConstants.OK_LABEL, IDialogConstants.SHOW_DETAILS_LABEL);
}
protected ErrorDialog(String title, Throwable throwable, int defaultButtonID, int detailsButtonID, String... dialogButtonLabels)
{
super(null, title, null, "Internal error:" + StringUtil.NL + getMessage(throwable), MessageDialog.ERROR, dialogButtonLabels, defaultButtonID);
this.throwable = throwable;
this.detailsButtonID = detailsButtonID;
setShellStyle(SWT.SHELL_TRIM | SWT.BORDER | SWT.APPLICATION_MODAL);
}
protected void createDropDownText(Composite parent)
{
text = new Text(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
text.setFont(parent.getFont());
StringWriter stringWriter = new StringWriter();
PrintWriter out = new PrintWriter(stringWriter);
throwable.printStackTrace(out);
out.close();
text.setText(stringWriter.toString());
GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_VERTICAL);
data.heightHint = text.getLineHeight() * TEXT_LINE_COUNT;
data.horizontalSpan = 2;
text.setLayoutData(data);
}
@Override
protected void buttonPressed(int buttonId)
{
if (buttonId == detailsButtonID)
{
toggleDetailsArea();
}
else
{
super.buttonPressed(buttonId);
}
}
private void toggleDetailsArea()
{
Point windowSize = getShell().getSize();
Point oldSize = getContents().computeSize(SWT.DEFAULT, SWT.DEFAULT);
if (text != null)
{
text.dispose();
text = null;
getButton(detailsButtonID).setText(IDialogConstants.SHOW_DETAILS_LABEL);
}
else
{
createDropDownText((Composite)getContents());
getButton(detailsButtonID).setText(IDialogConstants.HIDE_DETAILS_LABEL);
}
Point newSize = getContents().computeSize(SWT.DEFAULT, SWT.DEFAULT);
getShell().setSize(new Point(windowSize.x, windowSize.y + newSize.y - oldSize.y));
}
private static String getMessage(Throwable t)
{
try
{
String message = getMessageRecursively(t);
if (!StringUtil.isEmpty(message))
{
return message;
}
}
catch (Throwable ex)
{
//$FALL-THROUGH$
}
return t.getClass().getSimpleName();
}
private static String getMessageRecursively(Throwable t)
{
String message = t.getMessage();
if (StringUtil.isEmpty(message))
{
Throwable cause = t.getCause();
if (cause != null)
{
return getMessageRecursively(cause);
}
}
return message;
}
private static void openWithDetail(Throwable detail)
{
ErrorDialog dialog = new ErrorDialog("Error", detail);
dialog.open();
}
public static void open(final Throwable detail)
{
if (Display.getCurrent() == Display.getDefault())
{
openWithDetail(detail);
}
else
{
Display.getDefault().syncExec(new Runnable()
{
public void run()
{
openWithDetail(detail);
}
});
}
}
}