/*
* Copyright (c) 2012, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.eclipse.org/legal/epl-v10.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.dart.tools.search.internal.ui.text;
import com.google.dart.tools.search.internal.ui.SearchMessages;
import com.google.dart.tools.search.internal.ui.SearchPlugin;
import com.google.dart.tools.search.ui.NewSearchUI;
import com.google.dart.tools.search.ui.text.Match;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.ErrorDialog;
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.IReusableEditor;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.texteditor.ITextEditor;
import java.io.File;
import java.util.HashMap;
public class EditorOpener {
private IEditorReference fReusedEditor;
public IEditorPart open(IWorkbenchPage wbPage, IFile file, boolean activate)
throws PartInitException {
if (NewSearchUI.reuseEditor()) {
return showWithReuse(file, wbPage, getEditorID(file), activate);
}
return showWithoutReuse(file, wbPage, getEditorID(file), activate);
}
public IEditorPart openAndSelect(IWorkbenchPage wbPage, IFile file, int offset, int length,
boolean activate) throws PartInitException {
String editorId = null;
IEditorDescriptor desc = IDE.getEditorDescriptor(file);
if (desc == null || !desc.isInternal()) {
editorId = "org.eclipse.ui.DefaultTextEditor"; //$NON-NLS-1$
} else {
editorId = desc.getId();
}
IEditorPart editor;
if (NewSearchUI.reuseEditor()) {
editor = showWithReuse(file, wbPage, editorId, activate);
} else {
editor = showWithoutReuse(file, wbPage, editorId, activate);
}
if (editor instanceof ITextEditor) {
ITextEditor textEditor = (ITextEditor) editor;
textEditor.selectAndReveal(offset, length);
} else if (editor != null) {
showWithMarker(editor, file, offset, length);
}
return editor;
}
public void openAndSelect(IWorkbenchPage page, Match match, int offset, int length,
boolean activate) throws PartInitException {
Object resource = match.getElement();
if (resource instanceof IFile) {
IFile file = (IFile) resource;
if (offset >= 0 && length != 0) {
openAndSelect(page, file, offset, length, activate);
} else {
open(page, file, activate);
}
} else if (resource instanceof File) {
IFileStore file = EFS.getLocalFileSystem().fromLocalFile((File) resource);
try {
IEditorPart editor = IDE.openEditorOnFileStore(page, file);
if (editor instanceof ITextEditor) {
ITextEditor textEditor = (ITextEditor) editor;
textEditor.selectAndReveal(offset, length);
}
} catch (PartInitException e) {
ErrorDialog.openError(
page.getWorkbenchWindow().getShell(),
SearchMessages.FileSearchPage_open_file_dialog_title,
SearchMessages.FileSearchPage_open_file_failed,
e.getStatus());
}
}
}
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();
}
return desc.getId();
}
private void showWithMarker(IEditorPart editor, IFile file, int offset, int length)
throws PartInitException {
IMarker marker = null;
try {
marker = file.createMarker(NewSearchUI.SEARCH_MARKER);
HashMap<String, Integer> attributes = new HashMap<String, Integer>(4);
attributes.put(IMarker.CHAR_START, new Integer(offset));
attributes.put(IMarker.CHAR_END, new Integer(offset + length));
marker.setAttributes(attributes);
IDE.gotoMarker(editor, marker);
} catch (CoreException e) {
throw new PartInitException(SearchMessages.FileSearchPage_error_marker, e);
} finally {
if (marker != null) {
try {
marker.delete();
} catch (CoreException e) {
// ignore
}
}
}
}
private IEditorPart showWithoutReuse(IFile file, IWorkbenchPage wbPage, String editorID,
boolean activate) throws PartInitException {
return IDE.openEditor(wbPage, file, editorID, activate);
}
private IEditorPart showWithReuse(IFile file, IWorkbenchPage page, String editorId,
boolean activate) throws PartInitException {
IEditorInput input = new FileEditorInput(file);
IEditorPart editor = page.findEditor(input);
if (editor != null) {
page.bringToTop(editor);
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;
}
}
}
}
editor = page.openEditor(input, editorId, activate);
if (editor instanceof IReusableEditor) {
IEditorReference reference = (IEditorReference) page.getReference(editor);
fReusedEditor = reference;
} else {
fReusedEditor = null;
}
return editor;
}
}