/* * 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.openapi.fileEditor.impl; import com.intellij.ide.ui.UISettings; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileEditor.FileEditorProvider; import com.intellij.openapi.preview.PreviewManager; import com.intellij.openapi.preview.PreviewPanelProvider; import com.intellij.openapi.preview.PreviewProviderId; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.ui.docking.DockManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; public class FilePreviewPanelProvider extends PreviewPanelProvider<VirtualFile, Pair<FileEditor[], FileEditorProvider[]>> { public static final PreviewProviderId<VirtualFile, Pair<FileEditor[], FileEditorProvider[]>> ID = PreviewProviderId.create("Files"); private final FileEditorManagerImpl myManager; private final Project myProject; private final EditorWindow myWindow; private final EditorsSplitters myEditorsSplitters; public FilePreviewPanelProvider(@NotNull Project project, @NotNull FileEditorManagerImpl manager, @NotNull DockManager dockManager) { super(ID); myProject = project; myManager = manager; myEditorsSplitters = new MyEditorsSplitters(manager, dockManager, false); Disposer.register(this, myEditorsSplitters); myEditorsSplitters.createCurrentWindow(); myWindow = myEditorsSplitters.getCurrentWindow(); myWindow.setTabsPlacement(UISettings.TABS_NONE); } @Override public void dispose() { } @NotNull @Override protected JComponent getComponent() { return myEditorsSplitters; } @Override protected Pair<FileEditor[], FileEditorProvider[]> initComponent(VirtualFile file, boolean requestFocus) { Pair<FileEditor[], FileEditorProvider[]> result = myManager.openFileWithProviders(file, requestFocus, myWindow); IdeFocusManager.findInstance().doWhenFocusSettlesDown(() -> myWindow.requestFocus(true)); return result; } @NotNull @Override protected String getTitle(@NotNull VirtualFile file) { return EditorTabbedContainer.calcTabTitle(myProject, file); } @Nullable @Override protected Icon getIcon(@NotNull VirtualFile file) { return file.getFileType().getIcon(); } @Override public float getMenuOrder() { return 0; } @Override public void showInStandardPlace(@NotNull VirtualFile file) { EditorWindow window = myManager.getCurrentWindow(); if (window == null) { //main tab set is still not created, rare situation myManager.getMainSplitters().createCurrentWindow(); window = myManager.getCurrentWindow(); } myManager.openFileWithProviders(file, true, window); } @Override public boolean isModified(VirtualFile content, boolean beforeReuse) { for (EditorWithProviderComposite composite : myEditorsSplitters.getEditorsComposites()) { if (composite.isModified() && Comparing.equal(composite.getFile(), content)) return true; } return false; } @Override public void release(@NotNull VirtualFile content) { myEditorsSplitters.closeFile(content, false); } @Override public boolean contentsAreEqual(@NotNull VirtualFile content1, @NotNull VirtualFile content2) { return Comparing.equal(content1, content2); } private class MyEditorsSplitters extends EditorsSplitters { private MyEditorsSplitters(final FileEditorManagerImpl manager, DockManager dockManager, boolean createOwnDockableContainer) { super(manager, dockManager, createOwnDockableContainer); } @Override protected void afterFileClosed(VirtualFile file) { PreviewManager.SERVICE.close(myProject, getId(), file); } @Override protected EditorWindow createEditorWindow() { return new EditorWindow(this) { @Override protected void onBeforeSetEditor(VirtualFile file) { for (EditorWithProviderComposite composite : getEditorsComposites()) { if (composite.isModified()) { //Estimation: no more than one file is modified at the same time PreviewManager.SERVICE.moveToStandardPlaceImpl(myProject, getId(), composite.getFile()); return; } } } }; } @Override public void setTabsPlacement(int tabPlacement) { super.setTabsPlacement(UISettings.TABS_NONE); } @Override public boolean isPreview() { return true; } } }