178859 EditorOpener leaks last opened editor
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/text/EditorOpener.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/text/EditorOpener.java
index cfa384c..a391963 100644
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/text/EditorOpener.java
+++ b/org.eclipse.search/search/org/eclipse/search/internal/ui/text/EditorOpener.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * Copyright (c) 2000, 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
@@ -13,10 +13,10 @@
 import org.eclipse.core.resources.IFile;
 
 import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.IEditorReference;
 import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.IFileEditorInput;
 import org.eclipse.ui.IReusableEditor;
 import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.PartInitException;
@@ -29,7 +29,7 @@
 
 public class EditorOpener {
 
-	private IEditorPart fEditor;
+	private IEditorReference fReusedEditor;
 	
 	public IEditorPart open(IFile file, boolean activate) throws PartInitException {
 		IWorkbenchPage wbPage= SearchPlugin.getActivePage();
@@ -54,62 +54,48 @@
 			return SearchPlugin.getDefault().getWorkbench().getEditorRegistry().findEditor(IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID).getId();
 		return desc.getId();
 	}
-
-
-	private boolean isPinned(IEditorPart editor) {
-		if (editor == null)
-			return false;
-		
-		IEditorReference[] editorRefs= editor.getEditorSite().getPage().getEditorReferences();
-		int i= 0;
-		while (i < editorRefs.length) {
-			if (editor.equals(editorRefs[i].getEditor(false)))
-				return editorRefs[i].isPinned();
-			i++;
-		}
-		return false;
-	}
 	
 	private IEditorPart showInEditor(IWorkbenchPage page, IFile file, String editorId, boolean activate) throws PartInitException {
-		IFileEditorInput input= new FileEditorInput(file);
+		IEditorInput input= new FileEditorInput(file);
 		IEditorPart editor= page.findEditor(input);
 		if (editor != null) {
 			page.bringToTop(editor);
 			if (activate) {
 				page.activate(editor);
 			}
-		} else {
-			boolean isOpen= false;
-			if (fEditor != null) {
-				IEditorReference[] parts= page.getEditorReferences();
-				int i= 0;
-				while (!isOpen && i < parts.length)
-					isOpen= fEditor == parts[i++].getEditor(false);
-			}
-				
-			boolean canBeReused= isOpen && !fEditor.isDirty() && !isPinned(fEditor);
-			boolean showsSameInputType= fEditor != null && fEditor.getSite().getId().equals(editorId);
-			if (canBeReused && !showsSameInputType) {
-				page.closeEditor(fEditor, false);
-				fEditor= null;
-			}
-			
-			if (canBeReused && showsSameInputType) {
-				((IReusableEditor)fEditor).setInput(input);
-				page.bringToTop(fEditor);
-				editor= fEditor;
-				if (activate) {
-					page.activate(editor);
+			return editor;
+		}
+		IEditorReference reusedEditorRef= fReusedEditor;
+		if (reusedEditorRef !=  null) {
+			boolean isOpen= reusedEditorRef.getEditor(false) != null;
+			boolean canBeReused= isOpen && !reusedEditorRef.isDirty() && !reusedEditorRef.isPinned();
+			if (canBeReused) {
+				boolean showsSameInputType= reusedEditorRef.getId().equals(editorId);
+				if (!showsSameInputType) {
+					page.closeEditors(new IEditorReference[] { reusedEditorRef }, false);
+					fReusedEditor= null;
+				} else {
+					editor= reusedEditorRef.getEditor(true);
+					if (editor instanceof IReusableEditor) {
+						((IReusableEditor) editor).setInput(input);
+						page.bringToTop(editor);
+						if (activate) {
+							page.activate(editor);
+						}
+						return editor;
+					}
 				}
-			} else {
-					editor= IDE.openEditor(page, file, activate);
-					if (editor instanceof IReusableEditor)
-						fEditor= editor;
-					else
-						fEditor= null;
 			}
 		}
+		editor= page.openEditor(input, editorId, activate);
+		if (editor instanceof IReusableEditor) {
+			IEditorReference reference= (IEditorReference) page.getReference(editor);
+			fReusedEditor= reference;
+		} else {
+			fReusedEditor= null;
+		}
 		return editor;
 	}
+
 	
 }