IDEA-127739 Navigation Tab
authorVassiliy.Kudryashov <Vassiliy.Kudryashov@jetbrains.com>
Thu, 28 Aug 2014 15:13:15 +0000 (19:13 +0400)
committerVassiliy.Kudryashov <Vassiliy.Kudryashov@jetbrains.com>
Thu, 28 Aug 2014 15:14:23 +0000 (19:14 +0400)
Stage 2

platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java
platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/PreviewPanel.java
platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeader.java

index ce0024403ef4e79821fa0fccfefdba8522fe1e26..65adf52041b97707365bcfc7b39c2d9b5e93ee60 100644 (file)
@@ -181,7 +181,7 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec
     HashSet<EditorsSplitters> all = new LinkedHashSet<EditorsSplitters>();
     if (Registry.is("editor.use.preview")) {
       initUI();
-      all.add(myPreviewPanel.getSplitters());
+      all.add(myPreviewPanel.getWindow().getOwner());
     }
     all.add(getMainSplitters());
     Set<DockContainer> dockContainers = myDockManager.getContainers();
@@ -639,11 +639,12 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec
     }
     else {
       wndToOpenIn = getSplitters().getCurrentWindow();
-      if (wndToOpenIn == null || !wndToOpenIn.isFileOpen(file)) {
-        EditorWindow previewWindow = getPreviewWindow(file, focusEditor, searchForSplitter);
-        if (previewWindow != null) {
-          wndToOpenIn = previewWindow;
-        }
+    }
+
+    if (wndToOpenIn == null || !wndToOpenIn.isFileOpen(file)) {
+      EditorWindow previewWindow = getPreviewWindow(file, focusEditor, searchForSplitter);
+      if (previewWindow != null) {
+        wndToOpenIn = previewWindow;
       }
     }
 
index 987341daeaa280fd41e75d80c5ae68b59dfc9633..a9634d5a335acf0d8372a9cd29f78fbf6398bec4 100644 (file)
@@ -19,10 +19,14 @@ 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.vcs.FileStatus;
-import com.intellij.openapi.vcs.FileStatusManager;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.openapi.wm.ToolWindowAnchor;
 import com.intellij.openapi.wm.ToolWindowId;
@@ -30,13 +34,14 @@ 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 {
+class PreviewPanel extends JPanel implements DocumentListener, FileEditorManagerListener.Before {
   private static final int HISTORY_LIMIT = 10;
 
   private final Project myProject;
@@ -46,6 +51,9 @@ class PreviewPanel extends JPanel {
   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;
@@ -58,21 +66,30 @@ class PreviewPanel extends JPanel {
   private void initToolWindowIfNeed() {
     if (myInitialized) return;
 
-    final ToolWindowImpl window = (ToolWindowImpl)ToolWindowManager.getInstance(myProject)
+    myToolWindow = (ToolWindowImpl)ToolWindowManager.getInstance(myProject)
       .registerToolWindow(ToolWindowId.PREVIEW, this, ToolWindowAnchor.RIGHT, myProject, false);
-    window.setIcon(AllIcons.Actions.PreviewDetails);
+    myToolWindow.setIcon(AllIcons.Actions.PreviewDetails);
 
     myEditorsSplitters = new EditorsSplitters(myManager, myDockManager, false) {
       @Override
-      protected void afterFileClosed(VirtualFile file) {
-        window.setTitle(": (empty)");
+      public void updateFileName(VirtualFile updatedFile) {
+        super.updateFileName(updatedFile);
+        if (updatedFile != null && updatedFile.equals(getCurrentFile())) {
+          updateWindowTitle(updatedFile);
+        }
       }
 
       @Override
       protected void afterFileOpen(VirtualFile file) {
-        window.setTitle(": " +
-                        StringUtil.getShortened(EditorTabbedContainer.calcTabTitle(myProject, file),
-                                                UISettings.getInstance().EDITOR_TAB_TITLE_LIMIT));
+        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
@@ -85,25 +102,66 @@ class PreviewPanel extends JPanel {
         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);
 
-    window.setTitleActions(new MoveToEditorTabsAction(), new CloseFileAction());
+    myToolWindow.setTitleActions(new MoveToEditorTabsAction(), new CloseFileAction());
 
     myInitialized = true;
   }
 
-  EditorWindow getWindow() {
-    return myWindow;
+  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) {
+
   }
 
-  EditorsSplitters getSplitters() {
+  @Override
+  public void documentChanged(DocumentEvent event) {
+    VirtualFile file = FileDocumentManager.getInstance().getFile(event.getDocument());
+    if (file != null) {
+      myModifiedFile = file;
+    }
+  }
+
+  EditorWindow getWindow() {
     initToolWindowIfNeed();
-    return myEditorsSplitters;
+    return myWindow;
   }
 
   @Nullable
@@ -144,8 +202,8 @@ class PreviewPanel extends JPanel {
     }
   }
 
-  private boolean isModified(VirtualFile currentFile) {
-    return FileStatus.MODIFIED == FileStatusManager.getInstance(myProject).getStatus(currentFile);
+  private boolean isModified(@NotNull VirtualFile file) {
+    return file.equals(myModifiedFile);
   }
 
   //returns last open file if it has "modified" status
index a89410c7fe35b9f4ee6f5da6f94fc9d527f7aff7..e84028ead618c3c1eeff43400bd75fb72d985d4c 100644 (file)
@@ -24,7 +24,6 @@ import com.intellij.openapi.actionSystem.*;
 import com.intellij.openapi.actionSystem.ex.ActionManagerEx;
 import com.intellij.openapi.actionSystem.impl.ActionManagerImpl;
 import com.intellij.openapi.actionSystem.impl.MenuItemPresentationFactory;
-import com.intellij.openapi.application.ModalityState;
 import com.intellij.openapi.keymap.KeymapUtil;
 import com.intellij.openapi.project.DumbAware;
 import com.intellij.openapi.util.SystemInfo;
@@ -54,7 +53,7 @@ import java.beans.PropertyChangeListener;
 /**
  * @author pegov
  */
-public abstract class ToolWindowHeader extends JPanel implements Disposable, UISettingsListener, TimerListener {
+public abstract class ToolWindowHeader extends JPanel implements Disposable, UISettingsListener {
   @NonNls private static final String HIDE_ACTIVE_WINDOW_ACTION_ID = "HideActiveWindow";
   @NonNls private static final String HIDE_ACTIVE_SIDE_WINDOW_ACTION_ID = "HideSideWindows";
 
@@ -191,7 +190,6 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable, UIS
     setBorder(BorderFactory.createEmptyBorder(TabsUtil.TABS_BORDER, 1, TabsUtil.TABS_BORDER, 1));
 
     UISettings.getInstance().addUISettingsListener(this, toolWindow.getContentUI());
-    ActionManager.getInstance().addTimerListener(500, this);
   }
 
   @Override
@@ -206,41 +204,6 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable, UIS
     eastPanel.add(Box.createHorizontalStrut(1));
   }
 
-  @Override
-  public void addNotify() {
-    super.addNotify();
-    ActionManager.getInstance().addTimerListener(500, this);
-  }
-
-  @Override
-  public void removeNotify() {
-    super.removeNotify();
-    ActionManager.getInstance().removeTimerListener(this);
-  }
-
-  @Override
-  public ModalityState getModalityState() {
-    if (myToolWindow == null) return null;
-    return ModalityState.stateForComponent(myToolWindow.getComponent());
-  }
-
-  @Override
-  public void run() {
-    for (Component c : myButtonPanel.getComponents()) {
-      if (c instanceof ActionButton) {
-        ActionButton actionButton = (ActionButton) c;
-        Presentation presentation = actionButton.myAction.getTemplatePresentation().clone();
-        DataContext context = DataManager.getInstance().getDataContext(actionButton);
-        AnActionEvent event = new AnActionEvent(null, context, ActionPlaces.UNKNOWN, presentation, ActionManager.getInstance(), 0);
-        actionButton.myAction.update(event);
-        actionButton.setEnabled(event.getPresentation().isEnabled());
-        actionButton.setIcon(event.getPresentation().getIcon(), event.getPresentation().getDisabledIcon(), event.getPresentation().getHoveredIcon());
-      }
-    }
-    myButtonPanel.revalidate();
-    myButtonPanel.repaint();
-  }
-
   @Override
   public void dispose() {
     removeAll();
@@ -529,6 +492,7 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable, UIS
       if (component != null && !component.isShowing()) {
         return;
       }
+
       action.actionPerformed(event);
     }