completely rewrite AutoScrollFromSourceHandler to reduce code duplicates

This commit is contained in:
Konstantin Bulenkov
2012-05-03 11:23:26 +02:00
parent e5e576a6a9
commit 4a1f48bea0
5 changed files with 132 additions and 99 deletions
@@ -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;
}
@@ -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();
@@ -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();
@@ -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);
}
}
}
@@ -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();
}
}