/*
* Copyright 2000-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* 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.intellij.diff.tools.holders;
import com.intellij.diff.DiffContext;
import com.intellij.diff.contents.DiffContent;
import com.intellij.diff.contents.DocumentContent;
import com.intellij.diff.contents.FileContent;
import com.intellij.diff.util.DiffUtil;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorFactory;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.FileEditorProvider;
import com.intellij.openapi.fileEditor.TextEditor;
import com.intellij.openapi.fileEditor.ex.FileEditorProviderManager;
import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider;
import com.intellij.openapi.fileTypes.UIBasedFileType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.event.FocusListener;
public class BinaryEditorHolder extends EditorHolder {
@NotNull protected final FileEditor myEditor;
@NotNull protected final FileEditorProvider myEditorProvider;
public BinaryEditorHolder(@NotNull FileEditor editor, @NotNull FileEditorProvider editorProvider) {
myEditor = editor;
myEditorProvider = editorProvider;
}
@NotNull
public FileEditor getEditor() {
return myEditor;
}
@Override
public void dispose() {
myEditorProvider.disposeEditor(myEditor);
}
@NotNull
@Override
public JComponent getComponent() {
return myEditor.getComponent();
}
@Override
public void installFocusListener(@NotNull FocusListener listener) {
myEditor.getComponent().addFocusListener(listener);
}
@Nullable
@Override
public JComponent getPreferredFocusedComponent() {
return myEditor.getPreferredFocusedComponent();
}
//
// Build
//
public static class BinaryEditorHolderFactory extends EditorHolderFactory<BinaryEditorHolder> {
public static BinaryEditorHolderFactory INSTANCE = new BinaryEditorHolderFactory();
@Override
@NotNull
public BinaryEditorHolder create(@NotNull DiffContent content, @NotNull DiffContext context) {
Project project = context.getProject();
if (content instanceof FileContent) {
if (project == null) project = ProjectManager.getInstance().getDefaultProject();
VirtualFile file = ((FileContent)content).getFile();
FileEditorProvider[] providers = FileEditorProviderManager.getInstance().getProviders(project, file);
if (providers.length == 0) throw new IllegalStateException("Can't find FileEditorProvider: " + file.getFileType());
FileEditorProvider provider = providers[0];
FileEditor editor = provider.createEditor(project, file);
UIUtil.removeScrollBorder(editor.getComponent());
return new BinaryEditorHolder(editor, provider);
}
if (content instanceof DocumentContent) {
Document document = ((DocumentContent)content).getDocument();
final Editor editor = DiffUtil.createEditor(document, project, true);
TextEditorProvider provider = TextEditorProvider.getInstance();
TextEditor fileEditor = provider.getTextEditor(editor);
Disposer.register(fileEditor, new Disposable() {
@Override
public void dispose() {
EditorFactory.getInstance().releaseEditor(editor);
}
});
return new BinaryEditorHolder(fileEditor, provider);
}
throw new IllegalArgumentException(content.getClass() + " - " + content.toString());
}
@Override
public boolean canShowContent(@NotNull DiffContent content, @NotNull DiffContext context) {
if (content instanceof DocumentContent) return true;
if (content instanceof FileContent) {
Project project = context.getProject();
if (project == null) project = ProjectManager.getInstance().getDefaultProject();
VirtualFile file = ((FileContent)content).getFile();
return FileEditorProviderManager.getInstance().getProviders(project, file).length != 0;
}
return false;
}
@Override
public boolean wantShowContent(@NotNull DiffContent content, @NotNull DiffContext context) {
if (content instanceof FileContent) {
if (content.getContentType() == null) return false;
if (content.getContentType().isBinary()) return true;
if (content.getContentType() instanceof UIBasedFileType) return true;
return false;
}
return false;
}
}
}