blob: 7ffdcb195b7699fc9818f0f4347174da25af98ea [file] [log] [blame]
package com.intellij.openapi.fileEditor.impl;
import com.intellij.codeHighlighting.BackgroundEditorHighlighter;
import com.intellij.ide.structureView.StructureViewBuilder;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorFactory;
import com.intellij.openapi.editor.impl.DocumentImpl;
import com.intellij.openapi.fileEditor.FileEditorLocation;
import com.intellij.openapi.fileEditor.FileEditorState;
import com.intellij.openapi.fileEditor.FileEditorStateLevel;
import com.intellij.openapi.fileEditor.TextEditor;
import com.intellij.openapi.fileEditor.impl.text.TextEditorState;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.UserDataHolderBase;
import com.intellij.pom.Navigatable;
import com.intellij.util.EventDispatcher;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
public abstract class BaseRemoteFileEditor implements TextEditor, PropertyChangeListener {
private Editor myMockTextEditor;
private Navigatable myPendingNavigatable;
protected final Project myProject;
private final UserDataHolderBase myUserDataHolder = new UserDataHolderBase();
private final EventDispatcher<PropertyChangeListener> myDispatcher = EventDispatcher.create(PropertyChangeListener.class);
protected BaseRemoteFileEditor(@NotNull Project project) {
myProject = project;
}
@Override
@Nullable
public StructureViewBuilder getStructureViewBuilder() {
TextEditor textEditor = getTextEditor();
return textEditor == null ? null : textEditor.getStructureViewBuilder();
}
@Override
@NotNull
public Editor getEditor() {
TextEditor fileEditor = getTextEditor();
if (fileEditor != null) {
return fileEditor.getEditor();
}
else if (myMockTextEditor == null) {
myMockTextEditor = EditorFactory.getInstance().createViewer(new DocumentImpl(""), myProject);
}
return myMockTextEditor;
}
@Nullable
protected abstract TextEditor getTextEditor();
@Override
public FileEditorLocation getCurrentLocation() {
TextEditor textEditor = getTextEditor();
return textEditor == null ? null : textEditor.getCurrentLocation();
}
@Override
public BackgroundEditorHighlighter getBackgroundHighlighter() {
TextEditor textEditor = getTextEditor();
return textEditor == null ? null : textEditor.getBackgroundHighlighter();
}
@Override
@NotNull
public FileEditorState getState(@NotNull FileEditorStateLevel level) {
TextEditor textEditor = getTextEditor();
return textEditor == null ? new TextEditorState() : textEditor.getState(level);
}
@Override
public void setState(@NotNull FileEditorState state) {
TextEditor textEditor = getTextEditor();
if (textEditor != null && state instanceof TextEditorState) {
textEditor.setState(state);
}
}
@Override
public <T> T getUserData(@NotNull Key<T> key) {
TextEditor textEditor = getTextEditor();
return textEditor == null ? myUserDataHolder.getUserData(key) : textEditor.getUserData(key);
}
@Override
public <T> void putUserData(@NotNull Key<T> key, @Nullable T value) {
TextEditor textEditor = getTextEditor();
if (textEditor == null) {
myUserDataHolder.putUserData(key, value);
}
else {
textEditor.putUserData(key, value);
}
}
@Override
public boolean isModified() {
return false;
}
@Override
public boolean isValid() {
return true;
}
@Override
public void dispose() {
if (myMockTextEditor != null) {
EditorFactory.getInstance().releaseEditor(myMockTextEditor);
}
}
@Override
public void addPropertyChangeListener(@NotNull PropertyChangeListener listener) {
myDispatcher.addListener(listener);
}
@Override
public void removePropertyChangeListener(@NotNull PropertyChangeListener listener) {
myDispatcher.removeListener(listener);
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
myDispatcher.getMulticaster().propertyChange(evt);
}
@Override
public boolean canNavigateTo(@NotNull Navigatable navigatable) {
TextEditor editor = getTextEditor();
return editor == null ? isValid() : editor.canNavigateTo(navigatable);
}
@Override
public final void navigateTo(@NotNull Navigatable navigatable) {
TextEditor editor = getTextEditor();
if (editor != null) {
editor.navigateTo(navigatable);
}
else if (isValid()) {
myPendingNavigatable = navigatable;
}
}
protected final void contentLoaded() {
ApplicationManager.getApplication().assertIsDispatchThread();
Navigatable navigatable = myPendingNavigatable;
if (navigatable != null) {
myPendingNavigatable = null;
TextEditor editor = getTextEditor();
assert editor != null;
editor.navigateTo(navigatable);
}
if (myMockTextEditor != null) {
EditorFactory.getInstance().releaseEditor(myMockTextEditor);
myMockTextEditor = null;
}
}
protected final void contentRejected() {
myPendingNavigatable = null;
}
}