extract ResourceDeltaVisitor
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfFormEditor.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfFormEditor.java
index e4dc672..2387d72 100644
--- a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfFormEditor.java
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfFormEditor.java
@@ -8,12 +8,10 @@
  * Contributors:
  *     Anyware Technologies - initial API and implementation
  *
- * $Id: EmfFormEditor.java,v 1.36 2010/01/04 13:27:36 bcabe Exp $
+ * $Id: EmfFormEditor.java,v 1.37 2010/03/17 10:44:45 bcabe Exp $
  */
 package org.eclipse.pde.emfforms.editor;
 
-import org.eclipse.pde.emfforms.internal.editor.SharedClipboardAdapterFactoryEditingDomain;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.*;
@@ -44,7 +42,6 @@
 import org.eclipse.emf.edit.ui.util.EditUIMarkerHelper;
 import org.eclipse.emf.edit.ui.util.EditUIUtil;
 import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage;
-import org.eclipse.jface.databinding.swt.SWTObservables;
 import org.eclipse.jface.dialogs.*;
 import org.eclipse.jface.viewers.*;
 import org.eclipse.jface.window.Window;
@@ -129,7 +126,7 @@
 
 	private EmfContentOutlinePage contentOutlinePage;
 
-	private ResourceDeltaVisitor _visitor;
+	private ResourceDeltaVisitor<O> _visitor;
 
 	public EmfFormEditor() {
 		this._editorConfig = getFormEditorConfig();
@@ -452,7 +449,7 @@
 		ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
 	}
 
-	protected void setMainResource(Resource resource) {
+	public void setMainResource(Resource resource) {
 		if (_currentEObject != null)
 			_currentEObject.eAdapters().remove(_validator);
 
@@ -511,6 +508,10 @@
 		return editorSelection;
 	}
 
+	public boolean isSaving() {
+		return isSaving;
+	}
+
 	public void removeSelectionChangedListener(ISelectionChangedListener listener) {
 		selectionChangedListeners.remove(listener);
 	}
@@ -534,9 +535,7 @@
 	protected void handleCommandStackChanged(final EventObject event) {
 		// the edited object has been changed
 		firePropertyChange(IWorkbenchPartConstants.PROP_DIRTY);
-		// since the title of the editor is, most of the time,
-		// computed using some object attribute, ask the editor
-		// to refresh it!
+		// since the title of the editor is, most of the time, computed using some object attribute, ask the editor to refresh it!
 		firePropertyChange(IWorkbenchPartConstants.PROP_TITLE);
 
 		IFormPage activePage = getActivePageInstance();
@@ -555,75 +554,6 @@
 		}
 	}
 
-	private class ResourceDeltaVisitor implements IResourceDeltaVisitor {
-		public boolean visit(IResourceDelta delta) throws CoreException {
-
-			if (delta.getResource().getType() == IResource.FILE) {
-				if (delta.getKind() == IResourceDelta.REMOVED) {
-					String fullPath = delta.getFullPath().toString();
-					final URI changedURI = URI.createPlatformResourceURI(fullPath, false);
-
-					Resource currentResource = getCurrentEObject().eResource();
-					if (currentResource.getURI().equals(changedURI)) {
-						Display.getDefault().asyncExec(new Runnable() {
-							public void run() {
-								getSite().getPage().closeEditor(getCurrentInstance(), false);
-							}
-						});
-					}
-				} else if (delta.getKind() == IResourceDelta.CHANGED) {
-					// filter events related to changes on markers
-					if ((delta.getFlags() & IResourceDelta.MARKERS) == IResourceDelta.MARKERS) {
-						return false;
-					}
-					String fullPath = delta.getFullPath().toString();
-					final URI changedURI = URI.createPlatformResourceURI(fullPath, false);
-
-					SWTObservables.getRealm(Display.getDefault()).asyncExec(new Runnable() {
-
-						public void run() {
-							EObject currentEObject = (EObject) getInputObservable().getValue();
-							Resource currentResource = currentEObject.eResource();
-							boolean isMainResource = currentResource.getURI().equals(changedURI);
-							Resource changedResource = currentResource.getResourceSet().getResource(changedURI, false);
-
-							// The changed resource is contained in the
-							// resourceset, it must be reloaded
-							if (changedResource != null && changedResource.isLoaded() && !isSaving) {
-
-								// The editor has pending changes, we
-								// must
-								// inform the user, the content is going
-								// to be
-								// reloaded
-								if (isMainResource && isDirty()) {
-									getEditingDomain().getCommandStack().flush();
-								}
-
-								try {
-									changedResource.unload();
-									changedResource.load(Collections.EMPTY_MAP);
-
-									// If the modified resource is the
-									// main resource, we update the
-									// current object
-									if (isMainResource) {
-										setMainResource(changedResource);
-									}
-								} catch (IOException ioe) {
-									Activator.log(ioe);
-								}
-							}
-						}
-					});
-				}
-
-			}
-
-			return true;
-		}
-	}
-
 	/**
 	 * This accesses a cached version of the content outliner.
 	 */
@@ -675,14 +605,10 @@
 		}
 	}
 
-	private EmfFormEditor<O> getCurrentInstance() {
-		return this;
-	}
-
 	public void resourceChanged(IResourceChangeEvent event) {
 		IResourceDelta delta = event.getDelta();
 		try {
-			_visitor = new ResourceDeltaVisitor();
+			_visitor = new ResourceDeltaVisitor<O>(this);
 			delta.accept(_visitor);
 		} catch (CoreException ce) {
 			Activator.log(ce);
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/editor/ResourceDeltaVisitor.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/editor/ResourceDeltaVisitor.java
new file mode 100644
index 0000000..b1dd13b
--- /dev/null
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/editor/ResourceDeltaVisitor.java
@@ -0,0 +1,86 @@
+package org.eclipse.pde.emfforms.internal.editor;
+
+import java.io.IOException;
+import java.util.Collections;
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jface.databinding.swt.SWTObservables;
+import org.eclipse.pde.emfforms.editor.EmfFormEditor;
+import org.eclipse.pde.emfforms.internal.Activator;
+import org.eclipse.swt.widgets.Display;
+
+public class ResourceDeltaVisitor<O extends EObject> implements IResourceDeltaVisitor {
+	/**
+	 * 
+	 */
+	private final EmfFormEditor<O> _emfFormEditor;
+
+	/**
+	 * @param emfFormEditor
+	 */
+	public ResourceDeltaVisitor(EmfFormEditor<O> emfFormEditor) {
+		_emfFormEditor = emfFormEditor;
+	}
+
+	public boolean visit(IResourceDelta delta) throws CoreException {
+
+		if (delta.getResource().getType() == IResource.FILE) {
+			if (delta.getKind() == IResourceDelta.REMOVED) {
+				String fullPath = delta.getFullPath().toString();
+				final URI changedURI = URI.createPlatformResourceURI(fullPath, false);
+
+				Resource currentResource = _emfFormEditor.getCurrentEObject().eResource();
+				if (currentResource.getURI().equals(changedURI)) {
+					Display.getDefault().asyncExec(new Runnable() {
+						public void run() {
+							ResourceDeltaVisitor.this._emfFormEditor.getSite().getPage().closeEditor(_emfFormEditor, false);
+						}
+					});
+				}
+			} else if (delta.getKind() == IResourceDelta.CHANGED) {
+				// filter events related to changes on markers
+				if ((delta.getFlags() & IResourceDelta.MARKERS) == IResourceDelta.MARKERS) {
+					return false;
+				}
+				String fullPath = delta.getFullPath().toString();
+				final URI changedURI = URI.createPlatformResourceURI(fullPath, false);
+
+				SWTObservables.getRealm(Display.getDefault()).asyncExec(new Runnable() {
+
+					public void run() {
+						Resource currentResource = _emfFormEditor.getCurrentEObject().eResource();
+						boolean isMainResource = currentResource.getURI().equals(changedURI);
+						Resource changedResource = currentResource.getResourceSet().getResource(changedURI, false);
+
+						// The changed resource is contained in the resourceset, it must be reloaded
+						if (changedResource != null && changedResource.isLoaded() && !_emfFormEditor.isSaving()) {
+
+							// The editor has pending changes, we must inform the user, the content is going to be reloaded
+							if (isMainResource && _emfFormEditor.isDirty()) {
+								_emfFormEditor.getEditingDomain().getCommandStack().flush();
+							}
+
+							try {
+								changedResource.unload();
+								changedResource.load(Collections.EMPTY_MAP);
+
+								// If the modified resource is the main resource, we update the current object
+								if (isMainResource) {
+									_emfFormEditor.setMainResource(changedResource);
+								}
+							} catch (IOException ioe) {
+								Activator.log(ioe);
+							}
+						}
+					}
+				});
+			}
+
+		}
+
+		return true;
+	}
+}
\ No newline at end of file