summaryrefslogtreecommitdiff
path: root/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/PreviewPanel.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/PreviewPanel.java')
-rw-r--r--platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/PreviewPanel.java244
1 files changed, 244 insertions, 0 deletions
diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/PreviewPanel.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/PreviewPanel.java
new file mode 100644
index 000000000000..a9634d5a335a
--- /dev/null
+++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/PreviewPanel.java
@@ -0,0 +1,244 @@
+/*
+ * Copyright 2000-2014 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.icons.AllIcons;
+import com.intellij.ide.ui.UISettings;
+import com.intellij.openapi.actionSystem.AnAction;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.editor.Document;
+import com.intellij.openapi.editor.event.DocumentEvent;
+import com.intellij.openapi.editor.event.DocumentListener;
+import com.intellij.openapi.fileEditor.FileDocumentManager;
+import com.intellij.openapi.fileEditor.FileEditorManager;
+import com.intellij.openapi.fileEditor.FileEditorManagerListener;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.openapi.wm.ToolWindowAnchor;
+import com.intellij.openapi.wm.ToolWindowId;
+import com.intellij.openapi.wm.ToolWindowManager;
+import com.intellij.openapi.wm.impl.ToolWindowImpl;
+import com.intellij.ui.JBColor;
+import com.intellij.ui.docking.DockManager;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.ArrayList;
+
+class PreviewPanel extends JPanel implements DocumentListener, FileEditorManagerListener.Before {
+ private static final int HISTORY_LIMIT = 10;
+
+ private final Project myProject;
+ private final FileEditorManagerImpl myManager;
+ private final DockManager myDockManager;
+ private EditorWindow myWindow;
+ private boolean myInitialized = false;
+ private EditorsSplitters myEditorsSplitters;
+ private ArrayList<VirtualFile> myHistory = new ArrayList<VirtualFile>();
+ private VirtualFile myModifiedFile = null;
+ private ToolWindowImpl myToolWindow;
+ private VirtualFile myAwaitingForOpen = null;
+
+ public PreviewPanel(Project project, FileEditorManagerImpl manager, DockManager dockManager) {
+ myProject = project;
+ myManager = manager;
+ myDockManager = dockManager;
+ setOpaque(true);
+ setBackground(JBColor.DARK_GRAY);
+ }
+
+ private void initToolWindowIfNeed() {
+ if (myInitialized) return;
+
+ myToolWindow = (ToolWindowImpl)ToolWindowManager.getInstance(myProject)
+ .registerToolWindow(ToolWindowId.PREVIEW, this, ToolWindowAnchor.RIGHT, myProject, false);
+ myToolWindow.setIcon(AllIcons.Actions.PreviewDetails);
+
+ myEditorsSplitters = new EditorsSplitters(myManager, myDockManager, false) {
+ @Override
+ public void updateFileName(VirtualFile updatedFile) {
+ super.updateFileName(updatedFile);
+ if (updatedFile != null && updatedFile.equals(getCurrentFile())) {
+ updateWindowTitle(updatedFile);
+ }
+ }
+
+ @Override
+ protected void afterFileOpen(VirtualFile file) {
+ if (file.equals(myAwaitingForOpen)) {
+ updateWindowTitle(file);
+ Document document = FileDocumentManager.getInstance().getDocument(file);
+ if (document != null) {
+ myModifiedFile = null;
+ document.addDocumentListener(PreviewPanel.this, myProject);
+ }
+ }
+ myAwaitingForOpen = null;
+ }
+
+ @Override
+ public void setTabsPlacement(int tabPlacement) {
+ super.setTabsPlacement(UISettings.TABS_NONE);
+ }
+
+ @Override
+ protected boolean showEmptyText() {
+ return false;
+ }
+ };
+
+ myProject.getMessageBus().connect().subscribe(FileEditorManagerListener.Before.FILE_EDITOR_MANAGER, this);
+ myEditorsSplitters.createCurrentWindow();
+
+ myWindow = myEditorsSplitters.getCurrentWindow();
+ myWindow.setTabsPlacement(UISettings.TABS_NONE);
+
+ setLayout(new GridLayout(1, 1));
+ add(myEditorsSplitters);
+
+ myToolWindow.setTitleActions(new MoveToEditorTabsAction(), new CloseFileAction());
+
+ myInitialized = true;
+ }
+
+ private void updateWindowTitle(VirtualFile file) {
+ if (myToolWindow == null) return;
+ if (file == null) {
+ myToolWindow.setTitle(": (empty)");
+ }
+ else {
+ myToolWindow.setTitle(": " +
+ StringUtil.getShortened(EditorTabbedContainer.calcTabTitle(myProject, file),
+ UISettings.getInstance().EDITOR_TAB_TITLE_LIMIT));
+ }
+ }
+
+ @Override
+ public void beforeFileOpened(@NotNull FileEditorManager source, @NotNull VirtualFile file) {
+ myAwaitingForOpen = file;
+ }
+
+ @Override
+ public void beforeFileClosed(@NotNull FileEditorManager source, @NotNull VirtualFile file) {
+ if (file.equals(getCurrentFile())) {
+ updateWindowTitle(null);
+ Document document = FileDocumentManager.getInstance().getDocument(file);
+ if (document != null) {
+ document.removeDocumentListener(this);
+ }
+ }
+ }
+
+
+ @Override
+ public void beforeDocumentChange(DocumentEvent event) {
+
+ }
+
+ @Override
+ public void documentChanged(DocumentEvent event) {
+ VirtualFile file = FileDocumentManager.getInstance().getFile(event.getDocument());
+ if (file != null) {
+ myModifiedFile = file;
+ }
+ }
+
+ EditorWindow getWindow() {
+ initToolWindowIfNeed();
+ return myWindow;
+ }
+
+ @Nullable
+ VirtualFile getCurrentFile() {
+ VirtualFile[] files = myWindow.getFiles();
+ return files.length == 1 ? files[0] : null;
+ }
+
+ private class MoveToEditorTabsAction extends AnAction {
+ public MoveToEditorTabsAction() {
+ super(null, "Move to main tabs", AllIcons.Duplicates.SendToTheLeftGrayed);
+ }
+
+ @Override
+ public void actionPerformed(AnActionEvent e) {
+ VirtualFile virtualFile = getCurrentFile();
+ if (virtualFile == null) {
+ return;
+ }
+
+ myManager.openFileWithProviders(virtualFile, false, myManager.getCurrentWindow());
+ closeCurrentFile();
+ }
+
+ @Override
+ public void update(AnActionEvent e) {
+ super.update(e);
+ VirtualFile currentFile = getCurrentFile();
+ e.getPresentation().setEnabled(currentFile != null);
+ if (currentFile == null) return;
+
+ if (isModified(currentFile)) {
+ e.getPresentation().setIcon(AllIcons.Duplicates.SendToTheLeft);
+ }
+ else {
+ e.getPresentation().setIcon(AllIcons.Duplicates.SendToTheLeftGrayed);
+ }
+ }
+ }
+
+ private boolean isModified(@NotNull VirtualFile file) {
+ return file.equals(myModifiedFile);
+ }
+
+ //returns last open file if it has "modified" status
+ @Nullable
+ VirtualFile closeCurrentFile() {
+ VirtualFile virtualFile = getCurrentFile();
+ if (virtualFile == null) return null;
+ if (!myHistory.contains(virtualFile)) {
+ myHistory.add(virtualFile);
+ while (myHistory.size() > HISTORY_LIMIT) {
+ myHistory.remove(0);
+ }
+ }
+ myWindow.closeFile(virtualFile);
+ this.revalidate();
+ this.repaint();
+ return isModified(virtualFile) ? virtualFile : null;
+ }
+
+ private class CloseFileAction extends AnAction {
+ public CloseFileAction() {
+ super(null, "Close", AllIcons.Actions.Close);
+ }
+
+ @Override
+ public void actionPerformed(AnActionEvent e) {
+ if (getCurrentFile() == null) return;
+ closeCurrentFile();
+ ToolWindowManager.getInstance(myProject).getToolWindow(ToolWindowId.PREVIEW).hide(null);
+ }
+
+ @Override
+ public void update(AnActionEvent e) {
+ super.update(e);
+ e.getPresentation().setEnabled(getCurrentFile() != null);
+ }
+ }
+}