blob: 48f80193db3aabf6107baba989397898ed6202e2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.search.internal.ui.text;
import org.eclipse.core.resources.IFile;
import org.eclipse.search.internal.ui.SearchPlugin;
import org.eclipse.search.ui.NewSearchUI;
import org.eclipse.search.ui.text.Match;
import org.eclipse.ui.IEditorDescriptor;
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;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.FileEditorInput;
public class EditorOpener {
private IEditorPart fEditor;
IEditorPart open(Match match) throws PartInitException {
IWorkbenchPage wbPage= SearchPlugin.getActivePage();
if (NewSearchUI.reuseEditor())
return showWithReuse(match, wbPage);
else
return showWithoutReuse(match, wbPage);
}
private IEditorPart showWithoutReuse(Match match, IWorkbenchPage wbPage) throws PartInitException {
return IDE.openEditor(wbPage, (IFile) match.getElement(), false);
}
private IEditorPart showWithReuse(Match match, IWorkbenchPage wbPage) throws PartInitException {
IFile file= (IFile) match.getElement();
String editorID= getEditorID(file);
return showInEditor(wbPage, file, editorID);
}
private String getEditorID(IFile file) throws PartInitException {
IEditorDescriptor desc= IDE.getEditorDescriptor(file);
if (desc == null)
return SearchPlugin.getDefault().getWorkbench().getEditorRegistry().findEditor(IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID).getId();
else
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) throws PartInitException {
IFileEditorInput input= new FileEditorInput(file);
IEditorPart editor= page.findEditor(input);
if (editor != null)
page.bringToTop(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;
} else {
editor= IDE.openEditor(page, file, false);
if (editor instanceof IReusableEditor)
fEditor= editor;
else
fEditor= null;
}
}
return editor;
}
}