diff --git a/java/typeMigration/test/com/intellij/refactoring/TypeMigrationTest.java b/java/typeMigration/test/com/intellij/refactoring/TypeMigrationTest.java index b3c36dca19f2..7cf1de7b16bc 100644 --- a/java/typeMigration/test/com/intellij/refactoring/TypeMigrationTest.java +++ b/java/typeMigration/test/com/intellij/refactoring/TypeMigrationTest.java @@ -28,6 +28,13 @@ public class TypeMigrationTest extends TypeMigrationTestBase { myFactory = myJavaFacade.getElementFactory(); } + @Override + public void tearDown() throws Exception { + myFactory = null; + + super.tearDown(); + } + public void testT07() { doTestFieldType("f", PsiType.INT.createArrayType(), diff --git a/platform/platform-impl/src/com/intellij/ide/customize/CustomizeFeaturedPluginsStepPanel.java b/platform/platform-impl/src/com/intellij/ide/customize/CustomizeFeaturedPluginsStepPanel.java index c4bb120bce09..498391b8e971 100644 --- a/platform/platform-impl/src/com/intellij/ide/customize/CustomizeFeaturedPluginsStepPanel.java +++ b/platform/platform-impl/src/com/intellij/ide/customize/CustomizeFeaturedPluginsStepPanel.java @@ -20,6 +20,7 @@ import com.intellij.icons.AllIcons; import com.intellij.ide.plugins.IdeaPluginDescriptor; import com.intellij.ide.plugins.PluginManagerCore; import com.intellij.ide.plugins.PluginNode; +import com.intellij.openapi.options.OptionsBundle; import com.intellij.openapi.progress.util.ProgressIndicatorBase; import com.intellij.openapi.ui.VerticalFlowLayout; import com.intellij.openapi.updateSettings.impl.PluginDownloader; @@ -261,7 +262,10 @@ public class CustomizeFeaturedPluginsStepPanel extends AbstractCustomizeWizardSt @Override public String getHTMLFooter() { - return "New plugins can also be downloaded in " + CommonBundle.settingsTitle() + " | Plugins"; + return "New plugins can also be downloaded in " + + CommonBundle.settingsTitle() + + " | " + OptionsBundle.message("configurable.group.appearance.settings.display.name") + + " | " + "Plugins"; } public static class OfflineException extends Exception {}; diff --git a/platform/platform-impl/src/com/intellij/ide/customize/CustomizeUIThemeStepPanel.java b/platform/platform-impl/src/com/intellij/ide/customize/CustomizeUIThemeStepPanel.java index 4f0b78a0332f..c7b29ef53827 100644 --- a/platform/platform-impl/src/com/intellij/ide/customize/CustomizeUIThemeStepPanel.java +++ b/platform/platform-impl/src/com/intellij/ide/customize/CustomizeUIThemeStepPanel.java @@ -22,6 +22,7 @@ import com.intellij.ide.ui.laf.darcula.DarculaLaf; import com.intellij.ide.ui.laf.darcula.DarculaLookAndFeelInfo; import com.intellij.idea.StartupUtil; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.options.OptionsBundle; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.SystemInfo; import com.intellij.util.IconUtil; @@ -139,7 +140,10 @@ public class CustomizeUIThemeStepPanel extends AbstractCustomizeWizardStep { @Override public String getHTMLFooter() { - return "UI theme can be changed later in " + CommonBundle.settingsTitle() + " | Appearance"; + return "UI theme can be changed later in " + + CommonBundle.settingsTitle() + + " | " + OptionsBundle.message("configurable.group.appearance.settings.display.name") + + " | " + "Appearance"; } private void applyLaf(String lafName, Component component) { diff --git a/platform/platform-impl/src/com/intellij/ide/util/TipUIUtil.java b/platform/platform-impl/src/com/intellij/ide/util/TipUIUtil.java index bbd52139bd51..7ebf2a57a998 100644 --- a/platform/platform-impl/src/com/intellij/ide/util/TipUIUtil.java +++ b/platform/platform-impl/src/com/intellij/ide/util/TipUIUtil.java @@ -15,6 +15,7 @@ */ package com.intellij.ide.util; +import com.intellij.CommonBundle; import com.intellij.ide.BrowserUtil; import com.intellij.ide.IdeBundle; import com.intellij.ide.plugins.IdeaPluginDescriptor; @@ -97,6 +98,7 @@ public class TipUIUtil { String minor = ApplicationInfo.getInstance().getMinorVersion(); replaced = replaced.replace("&minorVersion;", minor); replaced = replaced.replace("&majorMinorVersion;", major + ("0".equals(minor) ? "" : ("." + minor))); + replaced = replaced.replace("&settingsPath;", CommonBundle.settingsActionPath()); if (UIUtil.isUnderDarcula()) { replaced = replaced.replace("css/tips.css", "css/tips_darcula.css"); } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java index 39706f016adc..18cc8aaa3e14 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java @@ -1447,8 +1447,8 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse public void process(int x, int y, GutterMark renderer) { final int ex = convertX((int)p.getX()); Icon icon = renderer.getIcon(); - if (x <= ex && ex <= x + icon.getIconWidth() && - y <= p.getY() && p.getY() <= y + icon.getIconHeight()) { + // Do not check y to extend the area where users could click + if (x <= ex && ex <= x + icon.getIconWidth()) { result[0] = renderer; } } diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java index ce0024403ef4..65adf52041b9 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java @@ -181,7 +181,7 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec HashSet all = new LinkedHashSet(); if (Registry.is("editor.use.preview")) { initUI(); - all.add(myPreviewPanel.getSplitters()); + all.add(myPreviewPanel.getWindow().getOwner()); } all.add(getMainSplitters()); Set 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; } } 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 index 987341daeaa2..a9634d5a335a 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/PreviewPanel.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/PreviewPanel.java @@ -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 myHistory = new ArrayList(); + 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)); + } } - EditorsSplitters getSplitters() { + @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 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 diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeader.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeader.java index a89410c7fe35..e84028ead618 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeader.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeader.java @@ -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); } diff --git a/resources/src/idea/JavaActions.xml b/resources/src/idea/JavaActions.xml index bcfa7f37dda1..a54f7da9eec4 100644 --- a/resources/src/idea/JavaActions.xml +++ b/resources/src/idea/JavaActions.xml @@ -162,7 +162,7 @@ - +