ext.org.eclipse.jdt.internal.ui.refactoring.ChangeExceptionHandler.java Source code

Java tutorial

Introduction

Here is the source code for ext.org.eclipse.jdt.internal.ui.refactoring.ChangeExceptionHandler.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2011 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package ext.org.eclipse.jdt.internal.ui.refactoring;

import java.lang.reflect.InvocationTargetException;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.ProgressMonitorWrapper;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;

import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;

import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;

import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.CompositeChange;
import org.eclipse.ltk.core.refactoring.Refactoring;

import patch.org.eclipse.jdt.internal.ui.JavaPlugin;

import ext.org.eclipse.jdt.internal.corext.util.Messages;
import ext.org.eclipse.jdt.internal.ui.actions.WorkbenchRunnableAdapter;
import ext.org.eclipse.jdt.internal.ui.util.ExceptionHandler;

/**
 * Copy of org.eclipse.ltk.internal.ui.refactoring.ChangeExceptionHandler
 *
 */
public class ChangeExceptionHandler {

    public static class NotCancelableProgressMonitor extends ProgressMonitorWrapper {
        public NotCancelableProgressMonitor(IProgressMonitor monitor) {
            super(monitor);
        }

        @Override
        public void setCanceled(boolean b) {
            // ignore set cancel
        }

        @Override
        public boolean isCanceled() {
            return false;
        }
    }

    private Shell fParent;
    private String fName;

    private static class RefactorErrorDialog extends ErrorDialog {
        public RefactorErrorDialog(Shell parentShell, String dialogTitle, String dialogMessage, IStatus status,
                int displayMask) {
            super(parentShell, dialogTitle, dialogMessage, status, displayMask);
        }

        @Override
        protected void createButtonsForButtonBar(Composite parent) {
            super.createButtonsForButtonBar(parent);
            Button ok = getButton(IDialogConstants.OK_ID);
            ok.setText(RefactoringMessages.ChangeExceptionHandler_undo_button);
            Button abort = createButton(parent, IDialogConstants.CANCEL_ID,
                    RefactoringMessages.ChangeExceptionHandler_abort_button, true);
            abort.moveBelow(ok);
            abort.setFocus();
        }

        @Override
        protected Control createMessageArea(Composite parent) {
            Control result = super.createMessageArea(parent);
            new Label(parent, SWT.NONE); // filler
            Label label = new Label(parent, SWT.NONE);
            label.setText(RefactoringMessages.ChangeExceptionHandler_message);
            label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
            applyDialogFont(result);
            return result;
        }
    }

    public ChangeExceptionHandler(Shell parent, Refactoring refactoring) {
        fParent = parent;
        fName = refactoring.getName();
    }

    public void handle(Change change, RuntimeException exception) {
        JavaPlugin.log(exception);
        IStatus status = null;
        if (exception.getMessage() == null) {
            status = new Status(IStatus.ERROR, JavaPlugin.getPluginId(), IStatus.ERROR,
                    RefactoringMessages.ChangeExceptionHandler_status_without_detail, exception);
        } else {
            status = new Status(IStatus.ERROR, JavaPlugin.getPluginId(), IStatus.ERROR, exception.getMessage(),
                    exception);
        }
        handle(change, status);
    }

    public void handle(Change change, CoreException exception) {
        JavaPlugin.log(exception);
        handle(change, exception.getStatus());
    }

    private void handle(Change change, IStatus status) {
        if (change instanceof CompositeChange) {
            Change undo = ((CompositeChange) change).getUndoUntilException();
            if (undo != null) {
                JavaPlugin.log(status);
                final ErrorDialog dialog = new RefactorErrorDialog(fParent,
                        RefactoringMessages.ChangeExceptionHandler_dialog_title,
                        Messages.format(RefactoringMessages.ChangeExceptionHandler_dialog_message, fName), status,
                        IStatus.OK | IStatus.INFO | IStatus.WARNING | IStatus.ERROR);
                int result = dialog.open();
                if (result == IDialogConstants.OK_ID) {
                    performUndo(undo);
                }
                return;
            }
        }
        ErrorDialog dialog = new ErrorDialog(fParent, RefactoringMessages.ChangeExceptionHandler_dialog_title,
                Messages.format(RefactoringMessages.ChangeExceptionHandler_dialog_message, fName), status,
                IStatus.OK | IStatus.INFO | IStatus.WARNING | IStatus.ERROR);
        dialog.open();
    }

    private void performUndo(final Change undo) {
        IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
            public void run(IProgressMonitor monitor) throws CoreException {
                monitor.beginTask("", 11); //$NON-NLS-1$
                try {
                    undo.initializeValidationData(
                            new NotCancelableProgressMonitor(new SubProgressMonitor(monitor, 1)));
                    if (undo.isValid(new SubProgressMonitor(monitor, 1)).hasFatalError()) {
                        monitor.done();
                        return;
                    }
                    undo.perform(new SubProgressMonitor(monitor, 9));
                } finally {
                    undo.dispose();
                }
            }
        };
        WorkbenchRunnableAdapter adapter = new WorkbenchRunnableAdapter(runnable,
                ResourcesPlugin.getWorkspace().getRoot());
        ProgressMonitorDialog dialog = new ProgressMonitorDialog(fParent);
        try {
            dialog.run(false, false, adapter);
        } catch (InvocationTargetException e) {
            ExceptionHandler.handle(e, fParent, RefactoringMessages.ChangeExceptionHandler_undo_dialog_title,
                    RefactoringMessages.ChangeExceptionHandler_undo_dialog_message + fName);
        } catch (InterruptedException e) {
            // can't happen
        }
    }
}