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);
}
}
}