package org.asciidoc.intellij.toolbar;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.components.ProjectComponent;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileEditor.FileEditorManagerAdapter;
import com.intellij.openapi.fileEditor.FileEditorManagerListener;
import com.intellij.openapi.fileEditor.TextEditor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.vfs.VirtualFile;
import org.asciidoc.intellij.AsciiDocLanguage;
import org.jetbrains.annotations.NotNull;
public class AsciiDocToolbarLoaderComponent implements ProjectComponent {
public static final Key<AsciiDocToolbarPanel> ASCII_DOC_TOOLBAR = Key.create("AsciiDocToolbar");
private Project myProject;
public AsciiDocToolbarLoaderComponent(Project project) {
this.myProject = project;
}
@Override
public void initComponent() {
myProject.getMessageBus().connect().subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new AsciiDocFileEditorManagerListener());
}
@Override
public void disposeComponent() {
}
@Override
@NotNull
public String getComponentName() {
return "AsciiDocToolbarLoaderComponent";
}
@Override
public void projectOpened() {
// called when project is opened
}
@Override
public void projectClosed() {
// called when project is being closed
}
/** inspired by {@link com.intellij.xml.breadcrumbs.BreadcrumbsLoaderComponent.MyFileEditorManagerListener} */
private static class AsciiDocFileEditorManagerListener extends FileEditorManagerAdapter {
@Override
/** called on EDT */
public void fileOpened(@NotNull final FileEditorManager manager, @NotNull final VirtualFile file) {
if (AsciiDocLanguage.isAsciiDocFile(manager.getProject(), file)) {
final FileEditor[] fileEditors = manager.getAllEditors(file);
for (final FileEditor fileEditor : fileEditors) {
if (fileEditor instanceof TextEditor) {
Editor editor = ((TextEditor)fileEditor).getEditor();
if (editor.getUserData(ASCII_DOC_TOOLBAR) != null) {
continue;
}
final AsciiDocToolbarPanel toolbarPanel = new AsciiDocToolbarPanel(editor);
manager.addTopComponent(fileEditor, toolbarPanel);
Disposer.register(fileEditor, toolbarPanel);
Disposer.register(fileEditor, new Disposable() {
@Override
public void dispose() {
manager.removeTopComponent(fileEditor, toolbarPanel);
}
});
}
}
}
}
}
}