mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
completely rewrite AutoScrollFromSourceHandler to reduce code duplicates
This commit is contained in:
@@ -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();
|
||||
|
||||
+7
-3
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+20
-37
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user