diff --git a/platform/lang-impl/src/com/intellij/ide/actions/SelectInContextImpl.java b/platform/lang-impl/src/com/intellij/ide/actions/SelectInContextImpl.java index f4febc1df8bd..0802c3d90027 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/SelectInContextImpl.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/SelectInContextImpl.java @@ -40,7 +40,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.event.InputEvent; -abstract class SelectInContextImpl implements SelectInContext { +public abstract class SelectInContextImpl implements SelectInContext { protected final PsiFile myPsiFile; protected SelectInContextImpl(PsiFile psiFile) { @@ -109,6 +109,10 @@ abstract class SelectInContextImpl implements SelectInContext { private static SelectInContext createEditorContext(DataContext dataContext) { final Project project = PlatformDataKeys.PROJECT.getData(dataContext); final FileEditor editor = PlatformDataKeys.FILE_EDITOR.getData(dataContext); + return createEditorContext(project, editor); + } + + public static SelectInContext createEditorContext(Project project, FileEditor editor) { if (project == null || editor == null) { return null; } diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewImpl.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewImpl.java index 0ce42d0431ee..e05ac18fb730 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewImpl.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewImpl.java @@ -20,7 +20,6 @@ import com.intellij.ProjectTopics; import com.intellij.history.LocalHistory; import com.intellij.history.LocalHistoryAction; import com.intellij.ide.*; -import com.intellij.ide.FileEditorProvider; import com.intellij.ide.actions.CollapseAllToolbarAction; import com.intellij.ide.impl.ProjectViewSelectInTarget; import com.intellij.ide.projectView.HelpID; @@ -38,7 +37,6 @@ import com.intellij.ide.util.treeView.NodeDescriptor; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.components.PersistentStateComponent; import com.intellij.openapi.components.ServiceManager; @@ -47,7 +45,9 @@ import com.intellij.openapi.components.Storage; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.extensions.Extensions; -import com.intellij.openapi.fileEditor.*; +import com.intellij.openapi.fileEditor.FileEditor; +import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.fileEditor.TextEditor; import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; @@ -241,7 +241,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo myAutoScrollToSourceHandler.onMouseClicked(getCurrentProjectViewPane().getTree()); } if (isAutoscrollFromSource(id)) { - myAutoScrollFromSourceHandler.setAutoScrollMode(true); + myAutoScrollFromSourceHandler.setAutoScrollEnabled(true); } } toolWindowVisible = window.isVisible(); @@ -664,7 +664,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo myActionGroup.addAction(myAutoScrollFromSourceHandler.createToggleAction()).setAsSecondary(true); myActionGroup.addAction(new SortByTypeAction()).setAsSecondary(true); - if (!myAutoScrollFromSourceHandler.isAutoScrollMode()) { + if (!myAutoScrollFromSourceHandler.isAutoScrollEnabled()) { myActionGroup.addAction(new ScrollFromSourceAction()); } AnAction collapseAllAction = CommonActionsManager.getInstance().createCollapseAllAction(new TreeExpander() { @@ -1522,51 +1522,39 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo } private class MyAutoScrollFromSourceHandler extends AutoScrollFromSourceHandler { - private final Alarm myAlarm = new Alarm(myProject); - private MyAutoScrollFromSourceHandler() { - super(ProjectViewImpl.this.myProject, ProjectViewImpl.this); + super(ProjectViewImpl.this.myProject,ProjectViewImpl.this.myViewContentPanel, ProjectViewImpl.this); } - public void install() { - FileEditorManagerAdapter myEditorManagerListener = new FileEditorManagerAdapter() { - public void selectionChanged(final FileEditorManagerEvent event) { - final FileEditor newEditor = event.getNewEditor(); - myAlarm.cancelAllRequests(); - myAlarm.addRequest(new Runnable() { - public void run() { - if (myProject.isDisposed() || !myViewContentPanel.isShowing()) return; - if (isAutoscrollFromSource(getCurrentViewId())) { - if (newEditor instanceof TextEditor) { - Editor editor = ((TextEditor)newEditor).getEditor(); - selectElementAtCaretNotLosingFocus(editor); - } else if (newEditor != null) { - final VirtualFile file = FileEditorManagerEx.getInstanceEx(myProject).getFile(newEditor); - if (file != null) { - final PsiFile psiFile = PsiManager.getInstance(myProject).findFile(file); - if (psiFile != null) { - final SelectInTarget target = mySelectInTargets.get(getCurrentViewId()); - if (target != null) { - final MySelectInContext selectInContext = new MySelectInContext(psiFile, null) { - @Override - public Object getSelectorInFile() { - return psiFile; - } - }; - - if (target.canSelect(selectInContext)) { - target.selectIn(selectInContext, false); - } - } - } + @Override + protected void selectElementFromEditor(@NotNull FileEditor fileEditor) { + if (myProject.isDisposed() || !myViewContentPanel.isShowing()) return; + if (isAutoscrollFromSource(getCurrentViewId())) { + if (fileEditor instanceof TextEditor) { + Editor editor = ((TextEditor)fileEditor).getEditor(); + selectElementAtCaretNotLosingFocus(editor); + } else { + final VirtualFile file = FileEditorManagerEx.getInstanceEx(myProject).getFile(fileEditor); + if (file != null) { + final PsiFile psiFile = PsiManager.getInstance(myProject).findFile(file); + if (psiFile != null) { + final SelectInTarget target = mySelectInTargets.get(getCurrentViewId()); + if (target != null) { + final MySelectInContext selectInContext = new MySelectInContext(psiFile, null) { + @Override + public Object getSelectorInFile() { + return psiFile; } + }; + + if (target.canSelect(selectInContext)) { + target.selectIn(selectInContext, false); } } } - }, 300, ModalityState.NON_MODAL); + } } - }; - myFileEditorManager.addFileEditorManagerListener(myEditorManagerListener, this); + } } public void scrollFromSource() { @@ -1614,14 +1602,11 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo } } - public void dispose() { - } - - protected boolean isAutoScrollMode() { + protected boolean isAutoScrollEnabled() { return isAutoscrollFromSource(myCurrentViewId); } - protected void setAutoScrollMode(boolean state) { + protected void setAutoScrollEnabled(boolean state) { setAutoscrollFromSource(state, myCurrentViewId); if (state) { final Editor editor = myFileEditorManager.getSelectedTextEditor(); diff --git a/platform/lang-impl/src/com/intellij/ide/structureView/newStructureView/StructureViewComponent.java b/platform/lang-impl/src/com/intellij/ide/structureView/newStructureView/StructureViewComponent.java index ce609a0c88c8..bec58161986b 100644 --- a/platform/lang-impl/src/com/intellij/ide/structureView/newStructureView/StructureViewComponent.java +++ b/platform/lang-impl/src/com/intellij/ide/structureView/newStructureView/StructureViewComponent.java @@ -620,7 +620,11 @@ public class StructureViewComponent extends SimpleToolWindowPanel implements Tre private FileEditorPositionListener myFileEditorPositionListener; private MyAutoScrollFromSourceHandler(Project project, Disposable parentDisposable) { - super(project, parentDisposable); + super(project, getTree(), parentDisposable); + } + + @Override + protected void selectElementFromEditor(@NotNull FileEditor editor) { } public void install() { @@ -640,12 +644,12 @@ public class StructureViewComponent extends SimpleToolWindowPanel implements Tre myTreeModel.addEditorPositionListener(myFileEditorPositionListener); } - protected boolean isAutoScrollMode() { + protected boolean isAutoScrollEnabled() { StructureViewFactoryImpl structureViewFactory = (StructureViewFactoryImpl)StructureViewFactory.getInstance(myProject); return structureViewFactory.getState().AUTOSCROLL_FROM_SOURCE; } - protected void setAutoScrollMode(boolean state) { + protected void setAutoScrollEnabled(boolean state) { StructureViewFactoryImpl structureViewFactory = (StructureViewFactoryImpl)StructureViewFactory.getInstance(myProject); structureViewFactory.getState().AUTOSCROLL_FROM_SOURCE = state; final FileEditor[] selectedEditors = FileEditorManager.getInstance(myProject).getSelectedEditors(); diff --git a/platform/platform-api/src/com/intellij/ui/AutoScrollFromSourceHandler.java b/platform/platform-api/src/com/intellij/ui/AutoScrollFromSourceHandler.java index e479c489ad3f..08fbaa882979 100644 --- a/platform/platform-api/src/com/intellij/ui/AutoScrollFromSourceHandler.java +++ b/platform/platform-api/src/com/intellij/ui/AutoScrollFromSourceHandler.java @@ -19,28 +19,84 @@ package com.intellij.ui; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.ToggleAction; +import com.intellij.openapi.application.ModalityState; +import com.intellij.openapi.fileEditor.FileEditor; +import com.intellij.openapi.fileEditor.FileEditorManagerAdapter; +import com.intellij.openapi.fileEditor.FileEditorManagerEvent; +import com.intellij.openapi.fileEditor.FileEditorManagerListener; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.IconLoader; +import com.intellij.util.Alarm; +import com.intellij.util.messages.MessageBusConnection; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import javax.swing.*; + +/** + * @author Konstantin Bulenkov + */ +@SuppressWarnings("MethodMayBeStatic") public abstract class AutoScrollFromSourceHandler implements Disposable { protected final Project myProject; + protected final Alarm myAlarm; + private JComponent myComponent; - protected AutoScrollFromSourceHandler(Project project) { - this(project, null); + public AutoScrollFromSourceHandler(@NotNull Project project, @NotNull JComponent view) { + this(project, view, null); } - protected AutoScrollFromSourceHandler(Project project, Disposable parentDisposable) { + public AutoScrollFromSourceHandler(@NotNull Project project, @NotNull JComponent view, @Nullable Disposable parentDisposable) { myProject = project; + if (parentDisposable != null) { Disposer.register(parentDisposable, this); } + myComponent = view; + myAlarm = new Alarm(this); } - protected abstract boolean isAutoScrollMode(); - protected abstract void setAutoScrollMode(boolean state); - public abstract void install(); + protected abstract boolean isAutoScrollEnabled(); + + protected abstract void setAutoScrollEnabled(boolean enabled); + + protected abstract void selectElementFromEditor(@NotNull FileEditor editor); + + protected ModalityState getModalityState() { + return ModalityState.current(); + } + + protected long getAlarmDelay() { + return 500; + } + + public void install() { + final MessageBusConnection connection = myProject.getMessageBus().connect(myProject); + connection.subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new FileEditorManagerAdapter() { + @Override + public void selectionChanged(FileEditorManagerEvent event) { + final FileEditor editor = event.getNewEditor(); + if (editor != null && myComponent.isShowing() && isAutoScrollEnabled()) { + myAlarm.cancelAllRequests(); + myAlarm.addRequest(new Runnable() { + @Override + public void run() { + selectElementFromEditor(editor); + } + }, getAlarmDelay(), getModalityState()); + } + } + }); + } + + @Override + public void dispose() { + if (!myAlarm.isDisposed()) { + myAlarm.cancelAllRequests(); + } + } public ToggleAction createToggleAction() { return new AutoScrollFromSourceAction(); @@ -48,16 +104,17 @@ public abstract class AutoScrollFromSourceHandler implements Disposable { private class AutoScrollFromSourceAction extends ToggleAction implements DumbAware { public AutoScrollFromSourceAction() { - super(UIBundle.message("autoscroll.from.source.action.name"), UIBundle.message("autoscroll.from.source.action.description"), + super(UIBundle.message("autoscroll.from.source.action.name"), + UIBundle.message("autoscroll.from.source.action.description"), IconLoader.getIcon("/general/autoscrollFromSource.png")); } - public boolean isSelected(AnActionEvent event) { - return isAutoScrollMode(); + public boolean isSelected(final AnActionEvent event) { + return isAutoScrollEnabled(); } - public void setSelected(AnActionEvent event, boolean flag) { - setAutoScrollMode(flag); + public void setSelected(final AnActionEvent event, final boolean flag) { + setAutoScrollEnabled(flag); } } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/projectView/MvcProjectViewPane.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/projectView/MvcProjectViewPane.java index 9f82fa0129bf..871ec1048af0 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/projectView/MvcProjectViewPane.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/projectView/MvcProjectViewPane.java @@ -16,29 +16,21 @@ package org.jetbrains.plugins.groovy.mvc.projectView; -import com.intellij.ide.util.EditorHelper; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.application.ModalityState; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.fileEditor.*; -import com.intellij.openapi.wm.ex.ToolWindowEx; -import com.intellij.psi.*; -import com.intellij.ui.AutoScrollFromSourceHandler; -import com.intellij.ui.AutoScrollToSourceHandler; -import com.intellij.ui.content.ContentManager; -import com.intellij.util.Alarm; -import com.intellij.util.IJSwingUtilities; -import com.intellij.util.containers.ContainerUtil; import com.intellij.ide.*; import com.intellij.ide.projectView.BaseProjectTreeBuilder; import com.intellij.ide.projectView.ViewSettings; import com.intellij.ide.projectView.impl.*; import com.intellij.ide.util.DeleteHandler; import com.intellij.ide.util.DirectoryChooserUtil; +import com.intellij.ide.util.EditorHelper; import com.intellij.ide.util.treeView.AbstractTreeBuilder; import com.intellij.ide.util.treeView.AbstractTreeNode; import com.intellij.ide.util.treeView.AbstractTreeUpdater; import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.fileEditor.FileEditor; +import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.project.DumbAware; @@ -49,8 +41,18 @@ import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowManager; +import com.intellij.openapi.wm.ex.ToolWindowEx; +import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiFileSystemItem; import com.intellij.psi.util.PsiModificationTracker; +import com.intellij.ui.AutoScrollFromSourceHandler; +import com.intellij.ui.AutoScrollToSourceHandler; import com.intellij.ui.content.Content; +import com.intellij.ui.content.ContentManager; +import com.intellij.util.IJSwingUtilities; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.tree.TreeUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -459,19 +461,17 @@ public class MvcProjectViewPane extends AbstractProjectViewPSIPane implements Id } private class MyAutoScrollFromSourceHandler extends AutoScrollFromSourceHandler { - private final Alarm myAlarm = new Alarm(myProject); - protected MyAutoScrollFromSourceHandler() { - super(MvcProjectViewPane.this.myProject, MvcProjectViewPane.this); + super(MvcProjectViewPane.this.myProject, getTree(), MvcProjectViewPane.this); } @Override - protected boolean isAutoScrollMode() { + protected boolean isAutoScrollEnabled() { return myAutoScrollFromSource; } @Override - protected void setAutoScrollMode(boolean state) { + protected void setAutoScrollEnabled(boolean state) { myAutoScrollFromSource = state; if (state) { selectElementAtCaretNotLosingFocus(); @@ -479,25 +479,8 @@ public class MvcProjectViewPane extends AbstractProjectViewPSIPane implements Id } @Override - public void install() { - FileEditorManagerAdapter myEditorManagerListener = new FileEditorManagerAdapter() { - public void selectionChanged(final FileEditorManagerEvent event) { - myAlarm.cancelAllRequests(); - myAlarm.addRequest(new Runnable() { - public void run() { - if (myProject.isDisposed() || !myComponent.isShowing()) return; - if (myAutoScrollFromSource) { - selectElementAtCaretNotLosingFocus(); - } - } - }, 300, ModalityState.NON_MODAL); - } - }; - FileEditorManager.getInstance(myProject).addFileEditorManagerListener(myEditorManagerListener, this); - } - - @Override - public void dispose() { + protected void selectElementFromEditor(@NotNull FileEditor editor) { + selectElementAtCaretNotLosingFocus(); } }