org.eclipse.ui.tests.manual.TestBackgroundSaveEditor.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ui.tests.manual.TestBackgroundSaveEditor.java

Source

/*******************************************************************************
 * Copyright (c) 2006, 2007 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 org.eclipse.ui.tests.manual;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeansObservables;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.window.IShellProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.ISaveablePart;
import org.eclipse.ui.ISaveablesSource;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.Saveable;
import org.eclipse.ui.internal.WorkbenchMessages;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.part.EditorPart;
import org.eclipse.ui.progress.IJobRunnable;

/**
 * @since 3.3
 * 
 */
public class TestBackgroundSaveEditor extends EditorPart implements ISaveablesSource {

    public class MySaveable extends Saveable {

        PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);

        private boolean dirty;

        public void doSave(IProgressMonitor monitor) throws CoreException {
            SubMonitor subMonitor = SubMonitor.convert(monitor, 2);
            IJobRunnable runnable = doSave(subMonitor.newChild(1), getSite());
            if (runnable != null) {
                runnable.run(subMonitor.newChild(1));
            }
            monitor.done();
        }

        public IJobRunnable doSave(IProgressMonitor monitor, IShellProvider shellProvider) throws CoreException {
            monitor.beginTask("Saving in the foreground", data.foregroundSaveTime);
            data.setOutput("");
            for (int i = 0; i < data.foregroundSaveTime; i++) {
                if (monitor.isCanceled()) {
                    return null;
                }
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
                data.setOutput(data.getInput().substring(0, Math.min(i, data.getInput().length())));
                monitor.worked(1);
            }
            if (data.throwExceptionInForeground) {
                throw new CoreException(
                        new Status(IStatus.ERROR, "org.eclipse.ui.tests", "Saving in the foreground failed"));
            }
            monitor.done();
            if (!data.saveInBackground) {
                data.setOutput(data.getInput());
                setDirty(false);
                return null;
            }
            IJobRunnable result = new IJobRunnable() {
                public IStatus run(IProgressMonitor monitor) {
                    monitor.beginTask("Saving in the background", data.backgroundSaveTime);
                    for (int i = 0; i < data.backgroundSaveTime; i++) {
                        if (monitor.isCanceled()) {
                            return Status.CANCEL_STATUS;
                        }
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                        }
                        data.setOutput(data.getInput().substring(0,
                                Math.min(i + data.foregroundSaveTime, data.getInput().length())));
                        monitor.worked(1);
                    }
                    if (data.throwExceptionInBackground) {
                        return new Status(IStatus.ERROR, "org.eclipse.ui.tests", "Saving in the background failed");
                    }
                    data.setOutput(data.getInput());
                    setDirty(false);
                    monitor.done();
                    return Status.OK_STATUS;
                }
            };
            return result;
        }

        public boolean equals(Object object) {
            return this == object;
        }

        public ImageDescriptor getImageDescriptor() {
            return input.getImageDescriptor();
        }

        public String getName() {
            return input.getName();
        }

        public String getToolTipText() {
            return input.getToolTipText();
        }

        public int hashCode() {
            return System.identityHashCode(this);
        }

        public boolean isDirty() {
            return dirty;
        }

        public void setDirty(boolean dirty) {
            firePropertyChange("dirty", new Boolean(this.dirty), new Boolean(this.dirty = dirty));
            getSite().getShell().getDisplay().syncExec(new Runnable() {
                public void run() {
                    TestBackgroundSaveEditor.this.firePropertyChange(ISaveablePart.PROP_DIRTY);
                }
            });
        }

        public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
            changeSupport.addPropertyChangeListener(propertyName, listener);
        }

        void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
            changeSupport.firePropertyChange(propertyName, oldValue, newValue);
        }

        public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
            changeSupport.removePropertyChangeListener(propertyName, listener);
        }
    }

    private MySaveable mySaveable;
    private Text inputText;
    private IEditorInput input;

    public TestBackgroundSaveEditor() {
        mySaveable = new MySaveable();
    }

    public void createPartControl(Composite parent) {
        Realm realm = SWTObservables.getRealm(parent.getDisplay());
        final DataBindingContext dbc = new DataBindingContext(realm);
        parent.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                dbc.dispose();
            }
        });

        final IObservableValue inputObservable = BeansObservables.observeValue(realm, data, "input");
        final IObservableValue outputObservable = BeansObservables.observeValue(realm, data, "output");

        createInputGroup(parent, dbc, inputObservable);
        createOptionsGroup(parent, realm, dbc);
        createOutputGroup(parent, dbc, outputObservable);

        GridLayoutFactory.swtDefaults().numColumns(3).equalWidth(true).generateLayout(parent);
    }

    private void createOutputGroup(Composite parent, final DataBindingContext dbc,
            final IObservableValue outputObservable) {
        Group outputGroup = new Group(parent, SWT.NONE);
        outputGroup.setText("Output");
        Text outputText = new Text(outputGroup, SWT.BORDER | SWT.READ_ONLY | SWT.MULTI);
        GridDataFactory.fillDefaults().grab(true, true).applyTo(outputText);
        dbc.bindValue(SWTObservables.observeText(outputText, SWT.NONE), outputObservable, null, null);
        GridLayoutFactory.swtDefaults().generateLayout(outputGroup);
    }

    private void createOptionsGroup(Composite parent, Realm realm, final DataBindingContext dbc) {
        Group optionsGroup = new Group(parent, SWT.NONE);
        optionsGroup.setText("Options");

        Button dirtyButton = new Button(optionsGroup, SWT.CHECK);
        new Label(optionsGroup, SWT.NONE).setText("Editor is dirty");
        IObservableValue dirtyObservable = BeansObservables.observeValue(realm, mySaveable, "dirty");
        dbc.bindValue(SWTObservables.observeSelection(dirtyButton), dirtyObservable, null, null);
        // IObservableValue inputAndOutputDiffer = new ComputedValue(realm) {
        // protected Object calculate() {
        // return new Boolean(!Util.equals(inputObservable.getValue(),
        // outputObservable.getValue()));
        // }
        // };
        // dbc.bindValue(dirtyObservable, inputAndOutputDiffer, null);

        Button saveInBackgroundButton = new Button(optionsGroup, SWT.CHECK);
        new Label(optionsGroup, SWT.NONE).setText("Do part of the save in the background");
        dbc.bindValue(SWTObservables.observeSelection(saveInBackgroundButton),
                BeansObservables.observeValue(realm, data, "saveInBackground"), null, null);

        Button foregroundExceptionButton = new Button(optionsGroup, SWT.CHECK);
        new Label(optionsGroup, SWT.NONE).setText("Throw exception while saving in the foreground");
        dbc.bindValue(SWTObservables.observeSelection(foregroundExceptionButton),
                BeansObservables.observeValue(realm, data, "throwExceptionInForeground"), null, null);

        Button backgroundExceptionButton = new Button(optionsGroup, SWT.CHECK);
        new Label(optionsGroup, SWT.NONE).setText("Throw exception while saving in the background");
        dbc.bindValue(SWTObservables.observeSelection(backgroundExceptionButton),
                BeansObservables.observeValue(realm, data, "throwExceptionInBackground"), null, null);

        new Label(optionsGroup, SWT.NONE).setText("Foreground save time:");
        Text optionsForegroundTime = new Text(optionsGroup, SWT.BORDER);
        dbc.bindValue(SWTObservables.observeText(optionsForegroundTime, SWT.Modify),
                BeansObservables.observeValue(realm, data, "foregroundSaveTime"), null, null);

        new Label(optionsGroup, SWT.NONE).setText("Background save time:");
        Text optionsBackgroundTime = new Text(optionsGroup, SWT.BORDER);
        dbc.bindValue(SWTObservables.observeText(optionsBackgroundTime, SWT.Modify),
                BeansObservables.observeValue(realm, data, "backgroundSaveTime"), null, null);

        GridLayoutFactory.swtDefaults().numColumns(2).generateLayout(optionsGroup);
    }

    private void createInputGroup(Composite parent, final DataBindingContext dbc,
            final IObservableValue inputObservable) {
        Group inputGroup = new Group(parent, SWT.NONE);
        inputGroup.setText("Input");

        inputText = new Text(inputGroup, SWT.BORDER | SWT.MULTI);
        dbc.bindValue(SWTObservables.observeText(inputText, SWT.Modify), inputObservable, null, null);

        GridLayoutFactory.swtDefaults().generateLayout(inputGroup);
    }

    public void doSave(IProgressMonitor monitor) {
        try {
            mySaveable.doSave(monitor);
        } catch (CoreException e) {
            String title = "Save failed";
            WorkbenchPlugin.log(title, new Status(IStatus.WARNING, PlatformUI.PLUGIN_ID, 0, title, e));
            MessageDialog.openError(getSite().getShell(), WorkbenchMessages.Error, title + ':' + e.getMessage());
        }
    }

    public void doSaveAs() {
        Assert.isTrue(false, "Should not be called");
    }

    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
        if (!(input instanceof IFileEditorInput))
            throw new PartInitException("Invalid Input: Must be IFileEditorInput");
        setSite(site);
        setInput(input);
        this.input = input;
    }

    public boolean isDirty() {
        return mySaveable.isDirty();
    }

    public boolean isSaveAsAllowed() {
        return false;
    }

    public void setFocus() {
        inputText.setFocus();
    }

    public static class Data {
        PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
        public String input = "";
        public String output = "";
        public String buffer;
        public boolean saveInBackground;
        public boolean throwExceptionInForeground;
        public boolean throwExceptionInBackground;
        public int foregroundSaveTime;
        public int backgroundSaveTime;

        public String getOutput() {
            return output;
        }

        public void setOutput(String output) {
            firePropertyChange("output", this.output, this.output = output);
        }

        public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
            changeSupport.addPropertyChangeListener(propertyName, listener);
        }

        void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
            changeSupport.firePropertyChange(propertyName, oldValue, newValue);
        }

        public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
            changeSupport.removePropertyChangeListener(propertyName, listener);
        }

        /**
         * @return Returns the input.
         */
        public String getInput() {
            return input;
        }

        /**
         * @param input
         *            The input to set.
         */
        public void setInput(String input) {
            this.input = input;
        }

        /**
         * @return Returns the buffer.
         */
        public String getBuffer() {
            return buffer;
        }

        /**
         * @param buffer
         *            The buffer to set.
         */
        public void setBuffer(String buffer) {
            this.buffer = buffer;
        }

        /**
         * @return Returns the saveInBackground.
         */
        public boolean isSaveInBackground() {
            return saveInBackground;
        }

        /**
         * @param saveInBackground
         *            The saveInBackground to set.
         */
        public void setSaveInBackground(boolean saveInBackground) {
            this.saveInBackground = saveInBackground;
        }

        /**
         * @return Returns the throwExceptionInForeground.
         */
        public boolean isThrowExceptionInForeground() {
            return throwExceptionInForeground;
        }

        /**
         * @param throwExceptionInForeground
         *            The throwExceptionInForeground to set.
         */
        public void setThrowExceptionInForeground(boolean throwExceptionInForeground) {
            this.throwExceptionInForeground = throwExceptionInForeground;
        }

        /**
         * @return Returns the throwExceptionInBackground.
         */
        public boolean isThrowExceptionInBackground() {
            return throwExceptionInBackground;
        }

        /**
         * @param throwExceptionInBackground
         *            The throwExceptionInBackground to set.
         */
        public void setThrowExceptionInBackground(boolean throwExceptionInBackground) {
            this.throwExceptionInBackground = throwExceptionInBackground;
        }

        /**
         * @return Returns the foregroundSaveTime.
         */
        public int getForegroundSaveTime() {
            return foregroundSaveTime;
        }

        /**
         * @param foregroundSaveTime
         *            The foregroundSaveTime to set.
         */
        public void setForegroundSaveTime(int foregroundSaveTime) {
            this.foregroundSaveTime = foregroundSaveTime;
        }

        /**
         * @return Returns the backgroundSaveTime.
         */
        public int getBackgroundSaveTime() {
            return backgroundSaveTime;
        }

        /**
         * @param backgroundSaveTime
         *            The backgroundSaveTime to set.
         */
        public void setBackgroundSaveTime(int backgroundSaveTime) {
            this.backgroundSaveTime = backgroundSaveTime;
        }
    }

    private Data data = new Data();

    public Saveable[] getActiveSaveables() {
        return new Saveable[] { mySaveable };
    }

    public Saveable[] getSaveables() {
        return new Saveable[] { mySaveable };
    }

}