[jbosstools-commits] JBoss Tools SVN: r39903 - trunk/common/plugins/org.jboss.tools.common/src/org/jboss/tools/common/util.

jbosstools-commits at lists.jboss.org jbosstools-commits at lists.jboss.org
Wed Mar 28 17:42:59 EDT 2012


Author: scabanovich
Date: 2012-03-28 17:42:58 -0400 (Wed, 28 Mar 2012)
New Revision: 39903

Modified:
   trunk/common/plugins/org.jboss.tools.common/src/org/jboss/tools/common/util/DirtyEditorTracker.java
Log:
JBIDE-11385
https://issues.jboss.org/browse/JBIDE-11385
Improvement of getDirtyFiles().


Modified: trunk/common/plugins/org.jboss.tools.common/src/org/jboss/tools/common/util/DirtyEditorTracker.java
===================================================================
--- trunk/common/plugins/org.jboss.tools.common/src/org/jboss/tools/common/util/DirtyEditorTracker.java	2012-03-28 21:28:22 UTC (rev 39902)
+++ trunk/common/plugins/org.jboss.tools.common/src/org/jboss/tools/common/util/DirtyEditorTracker.java	2012-03-28 21:42:58 UTC (rev 39903)
@@ -10,7 +10,9 @@
   ******************************************************************************/
 package org.jboss.tools.common.util;
 
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 
 import org.eclipse.core.resources.IFile;
@@ -37,6 +39,7 @@
 	static DirtyEditorTracker INSTANCE;
 
 	private Set<IFile> dirtyFiles = new HashSet<IFile>();
+	private Map<IFile, Integer> openEditors = new HashMap<IFile, Integer>();
 
 	private DirtyEditorTracker() {
 		init();
@@ -54,21 +57,7 @@
 		if(workbench != null) {
 			IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
 			for (IWorkbenchWindow window: windows) {
-				if(window.getShell() != null) {
-					IWorkbenchPage[] pages = window.getPages();
-					for (IWorkbenchPage page: pages) {
-						IEditorReference[] rs = page.getEditorReferences();
-						for (IEditorReference r: rs) {
-							IEditorPart part = r.getEditor(false);
-							if(part != null) {
-								update(part);
-								part.addPropertyListener(this);
-							}							
-						}
-						page.addPartListener(this);
-					}
-					window.addPageListener(this);
-				}
+				windowOpened(window);
 			}
 			CommonPlugin.getDefault().getWorkbench().addWindowListener(this);
 		}
@@ -87,28 +76,30 @@
 	}
 
 	@Override
-	public void partActivated(IWorkbenchPart part) {
+	public void windowActivated(IWorkbenchWindow window) {
 	}
 
 	@Override
-	public void partBroughtToTop(IWorkbenchPart part) {
+	public void windowDeactivated(IWorkbenchWindow window) {
 	}
 
 	@Override
-	public void partClosed(IWorkbenchPart part) {
-		if (part instanceof IEditorPart) {
-			editorClosed((IEditorPart)part);
+	public void windowClosed(IWorkbenchWindow window) {
+		IWorkbenchPage[] pages = window.getPages();
+		for (IWorkbenchPage page: pages) {
+			pageClosed(page);
 		}
+		window.removePageListener(this);
 	}
 
 	@Override
-	public void partDeactivated(IWorkbenchPart part) {
-	}
-
-	@Override
-	public void partOpened(IWorkbenchPart part) {
-		if (part instanceof IEditorPart) {
-			editorOpened((IEditorPart)part);
+	public void windowOpened(IWorkbenchWindow window) {
+		if(window.getShell() != null) {
+			IWorkbenchPage[] pages = window.getPages();
+			for (IWorkbenchPage page: pages) {
+				pageOpened(page);
+			}
+			window.addPageListener(this);
 		}
 	}
 
@@ -118,56 +109,100 @@
 
 	@Override
 	public void pageClosed(IWorkbenchPage page) {
+		IEditorReference[] rs = page.getEditorReferences();
+		for (IEditorReference r: rs) {
+			IEditorPart part = r.getEditor(false);
+			if(part != null) {
+				editorClosed(part);
+			}
+		}
 		page.removePartListener(this);
 	}
 
 	@Override
 	public void pageOpened(IWorkbenchPage page) {
+		IEditorReference[] rs = page.getEditorReferences();
+		for (IEditorReference r: rs) {
+			IEditorPart part = r.getEditor(false);
+			if(part != null) {
+				editorOpened(part);
+			}							
+		}
 		page.addPartListener(this);
 	}
 
 	@Override
-	public void windowActivated(IWorkbenchWindow window) {
+	public void partActivated(IWorkbenchPart part) {
 	}
 
 	@Override
-	public void windowDeactivated(IWorkbenchWindow window) {
+	public void partBroughtToTop(IWorkbenchPart part) {
 	}
 
 	@Override
-	public void windowClosed(IWorkbenchWindow window) {
-		window.removePageListener(this);
+	public void partClosed(IWorkbenchPart part) {
+		if (part instanceof IEditorPart) {
+			editorClosed((IEditorPart)part);
+		}
 	}
 
 	@Override
-	public void windowOpened(IWorkbenchWindow window) {
-		window.addPageListener(this);
+	public void partDeactivated(IWorkbenchPart part) {
 	}
 
-	public void editorOpened(IEditorPart part) {
-		IEditorInput input = part.getEditorInput();
-		if(input instanceof IFileEditorInput) {
+	@Override
+	public void partOpened(IWorkbenchPart part) {
+		if (part instanceof IEditorPart) {
+			editorOpened((IEditorPart)part);
+		}
+	}
+
+	private void editorOpened(IEditorPart part) {
+		IFile file = getFile(part);
+		if(file != null) {
 			part.addPropertyListener(this);
+			synchronized (this) {
+				Integer i = openEditors.get(file);
+				int k = i == null ? 1 : i.intValue() + 1;
+				openEditors.put(file, k);
+			}
+			update(part);
 		}
 	}
 
-	public void editorClosed(IEditorPart part) {
+	private void editorClosed(IEditorPart part) {
 		part.removePropertyListener(this);
+		IFile file = getFile(part);
+		if(file != null) {
+			synchronized (this) {
+				Integer i = openEditors.get(file);
+				if(i != null) {
+					if(i < 2) {
+						openEditors.remove(file);
+						update(file, false);
+					} else {
+						openEditors.put(file, i.intValue() - 1);
+					}
+				}
+			}
+		}
 	}
 
 	@Override
 	public void propertyChanged(Object source, int propId) {
 		if(propId == IEditorPart.PROP_DIRTY && source instanceof IEditorPart) {
-			IEditorPart part = (IEditorPart)source;
-			update(part);
+			update((IEditorPart)source);
 		}
-		
 	}
 
+	private IFile getFile(IEditorPart part) {
+		IEditorInput input = part.getEditorInput();
+		return (input instanceof IFileEditorInput) ? ((IFileEditorInput)input).getFile() : null;
+	}
+
 	private void update(IEditorPart part) {
-		IEditorInput input = part.getEditorInput();
-		if(input instanceof IFileEditorInput) {
-			IFile f = ((IFileEditorInput)input).getFile();
+		IFile f = getFile(part);
+		if(f != null) {
 			update(f, part.isDirty());
 		}
 	}
@@ -177,10 +212,8 @@
 			if(!dirtyFiles.contains(file)) {
 				dirtyFiles.add(file);
 			}
-		} else {
-			if(dirtyFiles.contains(file)) {
-				dirtyFiles.remove(file);
-			}
+		} else if(dirtyFiles.contains(file)) {
+			dirtyFiles.remove(file);
 		}
 	}
 }



More information about the jbosstools-commits mailing list