/* ****************************************************************************** * Copyright (c) 2006-2012 XMind Ltd. and others. * * This file is a part of XMind 3. XMind releases 3 and * above are dual-licensed under the Eclipse Public License (EPL), * which is available at http://www.eclipse.org/legal/epl-v10.html * and the GNU Lesser General Public License (LGPL), * which is available at http://www.gnu.org/licenses/lgpl.html * See http://www.xmind.net/license.html for details. * * Contributors: * XMind Ltd. - initial API and implementation *******************************************************************************/ package org.xmind.ui.internal.editor; import org.eclipse.jface.dialogs.ErrorSupportProvider; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; 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.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.Hyperlink; import org.eclipse.ui.statushandlers.AbstractStatusAreaProvider; import org.eclipse.ui.statushandlers.StatusAdapter; import org.xmind.ui.internal.MindMapUIPlugin; import org.xmind.ui.internal.statushandlers.StatusDetails; import org.xmind.ui.internal.statushandlers.StatusHandlerMessages; public class ErrorDialogPane2 extends DialogPane { private final StatusDetails details; private final ErrorSupportProvider supportProvider; private Composite composite; private Runnable closeCallback; public ErrorDialogPane2(StatusAdapter error, ErrorSupportProvider supportProvider) { this.details = new StatusDetails(error); this.supportProvider = supportProvider; this.closeCallback = null; } @Override protected Control createDialogContents(Composite parent) { composite = (Composite) super.createDialogContents(parent); GridLayout gridLayout = new GridLayout(1, false); gridLayout.marginWidth = 0; gridLayout.marginHeight = 0; gridLayout.verticalSpacing = 20; gridLayout.horizontalSpacing = 0; composite.setLayout(gridLayout); composite.setBackground(parent.getBackground()); Control titleArea = createTitleArea(composite); titleArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); ((GridData) titleArea.getLayoutData()).widthHint = 280; Control detailsArea = createDetailsArea(composite); detailsArea .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); ((GridData) detailsArea.getLayoutData()).widthHint = 300; ((GridData) detailsArea.getLayoutData()).heightHint = 80; return composite; } @Override protected int getPreferredWidth() { return 500; } private Control createTitleArea(Composite parent) { Composite area = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(2, false); layout.marginWidth = 0; layout.marginHeight = 0; area.setLayout(layout); area.setBackground(parent.getBackground()); Label titleImageLabel = new Label(area, SWT.NONE); titleImageLabel.setImage(details.getImage()); titleImageLabel.setLayoutData( new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false)); titleImageLabel.setBackground(parent.getBackground()); Composite messageParent = new Composite(area, SWT.NONE); messageParent.setLayout(new GridLayout()); messageParent.setBackground(parent.getBackground()); Label messageLabel = new Label(messageParent, SWT.WRAP); messageLabel.setText(details.getMessage()); messageLabel .setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true)); messageLabel.setBackground(parent.getBackground()); if (supportProvider != null) { if (supportProvider instanceof AbstractStatusAreaProvider && ((AbstractStatusAreaProvider) supportProvider) .validFor(details.getStatusAdapter())) { ((AbstractStatusAreaProvider) supportProvider) .createSupportArea(messageParent, details.getStatusAdapter()); } else if (supportProvider .validFor(details.getStatusAdapter().getStatus())) { supportProvider.createSupportArea(messageParent, details.getStatusAdapter().getStatus()); } } return area; } private Control createDetailsArea(Composite parent) { Composite area = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(1, false); layout.marginWidth = 0; layout.marginHeight = 0; layout.verticalSpacing = 0; layout.horizontalSpacing = 0; area.setLayout(layout); Text detailsText = new Text(area, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL); detailsText.setEditable(false); detailsText.setText(details.getFullText()); detailsText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); return area; } protected void createButtonsForButtonBar(Composite parent) { createButton(parent, IDialogConstants.CLOSE_ID, StatusHandlerMessages.RuntimeErrorDialog_CloseButton_Text, true); } @Override protected void createBlankArea(Composite buttonBar) { Composite composite = new Composite(buttonBar, SWT.NONE); GridLayout layout = new GridLayout(1, false); layout.marginWidth = 0; layout.marginHeight = 0; layout.verticalSpacing = 0; layout.horizontalSpacing = 0; composite.setLayout(layout); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); composite.setBackground(buttonBar.getBackground()); Hyperlink report = new Hyperlink(composite, SWT.LEFT); report.setText( StatusHandlerMessages.RuntimeErrorDialog_ReportHyperlink_Text); report.setUnderlined(true); report.addHyperlinkListener(new HyperlinkAdapter() { public void linkActivated(HyperlinkEvent e) { reportPressed(); } }); report.setBackground(composite.getBackground()); } private void reportPressed() { try { MindMapUIPlugin.getDefault().getErrorReporter().report(details); } catch (InterruptedException e) { return; } close(); } @Override protected boolean closePressed() { setReturnCode(IDialogConstants.CLOSE_ID); close(); if (closeCallback != null) { Display.getCurrent().asyncExec(closeCallback); } return true; } /** * @param closeCallback * the closeCallback to set */ public void setCloseCallback(Runnable closeCallback) { this.closeCallback = closeCallback; } protected void escapeKeyPressed() { triggerButton(IDialogConstants.CLOSE_ID); } public void dispose() { super.dispose(); composite = null; } public void setFocus() { if (composite != null && !composite.isDisposed()) { composite.setFocus(); } } }