/* ********************************************************************** **
** Copyright notice **
** **
** (c) 2005-2011 RSSOwl Development Team **
** http://www.rssowl.org/ **
** **
** 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.rssowl.org/legal/epl-v10.html **
** **
** A copy is found in the file epl-v10.html and important notices to the **
** license from the team is found in the textfile LICENSE.txt distributed **
** in this package. **
** **
** This copyright notice MUST APPEAR in all copies of the file! **
** **
** Contributors: **
** RSSOwl Development Team - initial API and implementation **
** **
** ********************************************************************** */
package org.rssowl.ui.internal.dialogs.fatal;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
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.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.rssowl.core.persist.service.ProfileLockedException;
import org.rssowl.core.util.StringUtils;
import org.rssowl.ui.internal.OwlUI;
import org.rssowl.ui.internal.dialogs.CustomWizardDialog;
import org.rssowl.ui.internal.util.BrowserUtils;
import org.rssowl.ui.internal.util.LayoutUtils;
/**
* Part of the {@link FatalErrorWizard} to give information on the fatal error.
*
* @author bpasero
*/
public class ErrorInfoPage extends WizardPage {
private final IStatus fErrorStatus;
private Menu fCopyMenu;
private final boolean fHasNextPage;
ErrorInfoPage(String pageName, IStatus errorStatus, boolean hasNextPage) {
super(pageName, pageName, null);
fErrorStatus = errorStatus;
fHasNextPage = hasNextPage;
}
/*
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
public void createControl(Composite parent) {
/* Title Image and Message */
setImageDescriptor(OwlUI.getImageDescriptor("icons/wizban/welcome_wiz.gif")); //$NON-NLS-1$
setMessage(Messages.ErrorInfoPage_RSSOWL_CRASH, IMessageProvider.WARNING);
/* Container */
Composite container = new Composite(parent, SWT.NONE);
container.setLayout(LayoutUtils.createGridLayout(1, 5, 5));
if (!fHasNextPage)
((GridLayout) container.getLayout()).marginBottom = 5;
/* Error Details */
Label errorDetailsLabel = new Label(container, SWT.NONE);
errorDetailsLabel.setText(Messages.ErrorInfoPage_ERROR_DETAILS);
errorDetailsLabel.setFont(OwlUI.getBold(JFaceResources.DIALOG_FONT));
errorDetailsLabel.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
String msg = null;
/* Out of memory error */
if (fErrorStatus.getException() instanceof OutOfMemoryError) {
if (StringUtils.isSet(fErrorStatus.getMessage()))
msg = NLS.bind(Messages.ErrorInfoPage_OOM_ERROR_N, fErrorStatus.getMessage());
else
msg = Messages.ErrorInfoPage_OOM_ERROR;
}
/* Profile Locked by another Instance */
else if (fErrorStatus.getException() instanceof ProfileLockedException) {
if (StringUtils.isSet(fErrorStatus.getMessage()))
msg = NLS.bind(Messages.ErrorInfoPage_LOCKED_ERROR_N, fErrorStatus.getMessage());
else
msg = Messages.ErrorInfoPage_LOCKED_ERROR;
}
/* Any other error */
else {
if (StringUtils.isSet(fErrorStatus.getMessage()))
msg = NLS.bind(Messages.ErrorInfoPage_STARTUP_ERROR_N, fErrorStatus.getMessage());
else
msg = Messages.ErrorInfoPage_STARTUP_ERROR;
}
final Label errorDetailsTextLabel = new Label(container, SWT.WRAP);
errorDetailsTextLabel.setText(msg);
errorDetailsTextLabel.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
((GridData) errorDetailsTextLabel.getLayoutData()).widthHint = 200;
/* Context Menu to copy the error message */
fCopyMenu = new Menu(errorDetailsTextLabel.getShell(), SWT.POP_UP);
MenuItem copyItem = new MenuItem(fCopyMenu, SWT.PUSH);
copyItem.setText(Messages.ErrorInfoPage_COPY);
copyItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
OwlUI.getClipboard(fCopyMenu.getDisplay()).setContents(new Object[] { errorDetailsTextLabel.getText() }, new Transfer[] { TextTransfer.getInstance() });
}
});
errorDetailsTextLabel.setMenu(fCopyMenu);
/* Report Crash (not for OutOfMemory and ProfileLockedException */
if (!(fErrorStatus.getException() instanceof ProfileLockedException) && !(fErrorStatus.getException() instanceof OutOfMemoryError)) {
Label crashReportLabel = new Label(container, SWT.NONE);
crashReportLabel.setText(Messages.ErrorInfoPage_LET_US_KNOW);
crashReportLabel.setFont(OwlUI.getBold(JFaceResources.DIALOG_FONT));
crashReportLabel.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
((GridData) crashReportLabel.getLayoutData()).verticalIndent = 10;
Link crashReportTextLabel = new Link(container, SWT.WRAP);
crashReportTextLabel.setText(Messages.ErrorInfoPage_SEND_LOGS_ADVISE);
crashReportTextLabel.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
crashReportTextLabel.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
try {
if ("save".equals(e.text)) //$NON-NLS-1$
OwlUI.saveCrashReport(getShell());
else
BrowserUtils.sendErrorLog();
} catch (Throwable t) {
setMessage(t.getMessage(), IMessageProvider.ERROR);
}
}
});
}
/* Further Steps */
{
Label furtherStepsLabel = new Label(container, SWT.NONE);
furtherStepsLabel.setText(Messages.ErrorInfoPage_FURTHER_STEPS);
furtherStepsLabel.setFont(OwlUI.getBold(JFaceResources.DIALOG_FONT));
furtherStepsLabel.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
((GridData) furtherStepsLabel.getLayoutData()).verticalIndent = 10;
Link moreInfoLabel = new Link(container, SWT.WRAP);
if (fErrorStatus.getException() instanceof ProfileLockedException)
moreInfoLabel.setText(Messages.ErrorInfoPage_LOCKED_PROFILE_ADVISE);
else
moreInfoLabel.setText(fHasNextPage ? Messages.ErrorInfoPage_NEXT_PAGE_ADVISE : Messages.ErrorInfoPage_GENERAL_ERROR_ADVISE);
moreInfoLabel.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
((GridData) moreInfoLabel.getLayoutData()).widthHint = 200;
moreInfoLabel.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
try {
if ("faq".equals(e.text)) //$NON-NLS-1$
BrowserUtils.openFAQ(fErrorStatus);
else if ("forum".equals(e.text)) //$NON-NLS-1$
BrowserUtils.openHelpForum(fErrorStatus);
} catch (Throwable t) {
setMessage(t.getMessage(), IMessageProvider.ERROR);
}
}
});
}
Dialog.applyDialogFont(container);
setControl(container);
}
/*
* @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean)
*/
@Override
public void setVisible(boolean visible) {
super.setVisible(visible);
/* Transfer Focus to Buttons, otherwise a link is focussed which looks weird */
if (visible) {
Button focusButton = ((CustomWizardDialog) getContainer()).getButton(IDialogConstants.NEXT_ID);
if (focusButton == null)
focusButton = ((CustomWizardDialog) getContainer()).getButton(IDialogConstants.FINISH_ID);
if (focusButton != null)
focusButton.setFocus();
}
}
/*
* @see org.eclipse.jface.dialogs.DialogPage#dispose()
*/
@Override
public void dispose() {
super.dispose();
if (fCopyMenu != null && !fCopyMenu.isDisposed())
fCopyMenu.dispose();
}
}