blob: bf51c9698bd2f08722d8d4c26a74b5c7ae6250e4 [file] [log] [blame]
/*******************************************************************************
* 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 };
}
}