Bug 394002

[WPE] Need ability to listen for updates to a file in an open editor.
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/HTMLEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/HTMLEditor.java
index 143c156..2756820 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/HTMLEditor.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/HTMLEditor.java
@@ -43,6 +43,8 @@
 import org.eclipse.jst.pagedesigner.IJMTConstants;
 import org.eclipse.jst.pagedesigner.PDPlugin;
 import org.eclipse.jst.pagedesigner.dnd.internal.DesignerSourceMouseTrackAdapter;
+import org.eclipse.jst.pagedesigner.editors.IWPEPersistenceListener.IPersistenceEvent;
+import org.eclipse.jst.pagedesigner.editors.IWPEPersistenceListener.PersistenceEventType;
 import org.eclipse.jst.pagedesigner.editors.actions.DesignPageActionContributor;
 import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
 import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider;
@@ -175,6 +177,8 @@
 //		}
 //	}
 
+	private List<IWPEPersistenceListener> persistenceListeners;
+
 	/**
 	 * Default constructor
 	 */
@@ -476,7 +480,13 @@
 	 * @return StructuredTextEditor
 	 */
 	protected StructuredTextEditor createTextEditor() {
-		return new DesignerStructuredTextEditorJSP();
+		return new DesignerStructuredTextEditorJSP() {
+			@Override
+			protected void performRevert() {
+				super.performRevert();
+				firePersistenceEvent(PersistenceEventType.REVERTED);
+			}
+		};
 	}
 
 	private void disconnectDesignPage() {
@@ -524,12 +534,18 @@
 			_model = null;
 		}
 
+		if (persistenceListeners != null) {
+			persistenceListeners.clear();
+			persistenceListeners = null;
+		}
+
 		super.dispose();
 		
 	}
 
 	public void doSave(IProgressMonitor monitor) {
 		_textEditor.doSave(monitor);
+		firePersistenceEvent(PersistenceEventType.SAVED);
 	}
 
 	/*
@@ -542,6 +558,7 @@
 	 */
 	public void doSaveAs() {
 		_textEditor.doSaveAs();
+		firePersistenceEvent(PersistenceEventType.SAVED_AS);
 	}
 
 	private void editorInputIsAcceptable(IEditorInput input)
@@ -1228,4 +1245,57 @@
 		}
 	}
 
+	/**
+	 * Adds a {@link IWPEPersistenceListener persistence listener} to this editor.
+	 * 
+	 * <p>This type of listener is cleaned when the editor is disposed.</p>
+	 * 
+	 * @param listener
+	 */
+	public void addPersistenceListener(IWPEPersistenceListener listener) {
+		if (persistenceListeners == null) {
+			persistenceListeners = new ArrayList<IWPEPersistenceListener>(5);
+		}
+		persistenceListeners.add(listener);
+	}
+
+	/**
+	 * Removes a {@link IWPEPersistenceListener persistence listener} added to this 
+	 * editor.
+	 * 
+	 * <p>This type of listener is cleaned when the editor is disposed.</p>
+	 * 
+	 * @param listener
+	 */
+	public void removePersistenceListener(IWPEPersistenceListener listener) {
+		if (persistenceListeners != null) {
+			if (persistenceListeners.remove(listener) && persistenceListeners.isEmpty()) {
+				persistenceListeners = null;
+			}
+		}
+	}
+
+	private void firePersistenceEvent(final PersistenceEventType type) {
+		if (persistenceListeners != null) {
+			List<IWPEPersistenceListener> listeners = new ArrayList<IWPEPersistenceListener>(persistenceListeners);
+			IPersistenceEvent event = new IPersistenceEvent() {			
+				public HTMLEditor getWPEInstance() {
+					return HTMLEditor.this;
+				}
+				
+				public PersistenceEventType getEventType() {
+					return type;
+				}
+			};
+			
+			for (IWPEPersistenceListener listener : listeners) {
+				try {
+					listener.notify(event);
+				} catch (Exception e) {
+					PDPlugin.log("Exception thrown while notifying a persistence listener", e); //$NON-NLS-1$
+				}
+			}
+		}
+	}
+
 }
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/IWPEPersistenceListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/IWPEPersistenceListener.java
new file mode 100644
index 0000000..af319bc
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/IWPEPersistenceListener.java
@@ -0,0 +1,52 @@
+package org.eclipse.jst.pagedesigner.editors;

+

+/**

+ * Listens for persistence events fired from WPE instances, including

+ * save and revert.

+ */

+public interface IWPEPersistenceListener {

+	/**

+	 * The type of the persistence event.

+	 *

+	 */

+	public static enum PersistenceEventType {

+		/**

+		 * WPE was saved

+		 */

+		SAVED,

+

+		/**

+		 * WPE was saved as

+		 */

+		SAVED_AS,

+

+		/**

+		 * WPE was reverted.

+		 */

+		REVERTED;

+	}		

+

+	/**

+	 * A persistence event.

+	 * 

+	 * <p>Not intended to be implemented by clients.</p>

+	 */	

+	public static interface IPersistenceEvent {		

+		/**

+		 * @return editor

+		 */

+		public HTMLEditor getWPEInstance();

+

+		/**

+		 * @return EventType

+		 */

+		public PersistenceEventType getEventType();		

+	}

+

+	/**

+	 * A persistence event has occurred

+	 * @param event 

+	 */	

+	public void notify(IPersistenceEvent event);

+

+}