mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-08 15:09:39 +07:00
add some ways for reuse in DB part & cleanup
This commit is contained in:
@@ -15,7 +15,6 @@
|
||||
*/
|
||||
package com.intellij.projectView;
|
||||
|
||||
import com.intellij.ide.actions.ViewStructureAction;
|
||||
import com.intellij.ide.commander.CommanderPanel;
|
||||
import com.intellij.ide.structureView.StructureViewBuilder;
|
||||
import com.intellij.ide.structureView.StructureViewModel;
|
||||
@@ -53,12 +52,12 @@ public class FileStructureDialogTest extends BaseProjectViewTestCase {
|
||||
final Editor editor = factory.createEditor(document);
|
||||
try {
|
||||
final FileStructureDialog dialog =
|
||||
ViewStructureAction.createStructureViewBasedDialog(structureViewModel, editor, myProject, psiClass, new Disposable() {
|
||||
new FileStructureDialog(structureViewModel, editor, myProject, psiClass, new Disposable() {
|
||||
@Override
|
||||
public void dispose() {
|
||||
structureViewModel.dispose();
|
||||
}
|
||||
});
|
||||
}, true);
|
||||
try {
|
||||
final CommanderPanel panel = dialog.getPanel();
|
||||
assertListsEqual((ListModel)panel.getModel(), "Inner1\n" + "Inner2\n" + "__method(): void\n" + "_myField1: int\n" + "_myField2: String\n");
|
||||
|
||||
@@ -23,7 +23,10 @@ import com.intellij.ide.structureView.StructureViewModel;
|
||||
import com.intellij.ide.util.FileStructureDialog;
|
||||
import com.intellij.ide.util.FileStructurePopup;
|
||||
import com.intellij.openapi.Disposable;
|
||||
import com.intellij.openapi.actionSystem.*;
|
||||
import com.intellij.openapi.actionSystem.AnAction;
|
||||
import com.intellij.openapi.actionSystem.AnActionEvent;
|
||||
import com.intellij.openapi.actionSystem.CommonDataKeys;
|
||||
import com.intellij.openapi.actionSystem.PlatformDataKeys;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.fileEditor.FileEditor;
|
||||
import com.intellij.openapi.project.Project;
|
||||
@@ -94,34 +97,34 @@ public class ViewStructureAction extends AnAction {
|
||||
|
||||
@Nullable
|
||||
public static FileStructurePopup createPopup(@Nullable Editor editor, @NotNull Project project, @Nullable Navigatable navigatable, @NotNull FileEditor fileEditor) {
|
||||
final StructureViewBuilder structureViewBuilder = fileEditor.getStructureViewBuilder();
|
||||
StructureViewBuilder structureViewBuilder = fileEditor.getStructureViewBuilder();
|
||||
if (structureViewBuilder == null) return null;
|
||||
StructureView structureView = structureViewBuilder.createStructureView(fileEditor, project);
|
||||
final StructureViewModel model = structureView.getTreeModel();
|
||||
StructureViewModel model = structureView.getTreeModel();
|
||||
if (model instanceof PlaceHolder) {
|
||||
//noinspection unchecked
|
||||
((PlaceHolder)model).setPlace(PLACE);
|
||||
}
|
||||
return createStructureViewPopup(model, editor, project, navigatable, structureView);
|
||||
return createStructureViewPopup(project, editor, fileEditor, structureView);
|
||||
}
|
||||
|
||||
public static boolean isInStructureViewPopup(@NotNull PlaceHolder<String> model) {
|
||||
return PLACE.equals(model.getPlace());
|
||||
}
|
||||
|
||||
public static FileStructureDialog createStructureViewBasedDialog(final StructureViewModel structureViewModel,
|
||||
final Editor editor,
|
||||
final Project project,
|
||||
final Navigatable navigatable,
|
||||
final @NotNull Disposable alternativeDisposable) {
|
||||
private static FileStructureDialog createStructureViewBasedDialog(StructureViewModel structureViewModel,
|
||||
Editor editor,
|
||||
Project project,
|
||||
Navigatable navigatable,
|
||||
@NotNull Disposable alternativeDisposable) {
|
||||
return new FileStructureDialog(structureViewModel, editor, project, navigatable, alternativeDisposable, true);
|
||||
}
|
||||
public static FileStructurePopup createStructureViewPopup(final StructureViewModel structureViewModel,
|
||||
final Editor editor,
|
||||
final Project project,
|
||||
final Navigatable navigatable,
|
||||
final @NotNull Disposable alternativeDisposable) {
|
||||
return new FileStructurePopup(structureViewModel, editor, project, alternativeDisposable, true);
|
||||
|
||||
private static FileStructurePopup createStructureViewPopup(Project project,
|
||||
Editor editor,
|
||||
FileEditor fileEditor,
|
||||
StructureView structureView) {
|
||||
return new FileStructurePopup(project, editor, fileEditor, structureView, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -26,10 +26,7 @@ import com.intellij.ide.structureView.impl.StructureViewState;
|
||||
import com.intellij.ide.structureView.impl.common.PsiTreeElementBase;
|
||||
import com.intellij.ide.ui.customization.CustomizationUtil;
|
||||
import com.intellij.ide.util.FileStructurePopup;
|
||||
import com.intellij.ide.util.treeView.AbstractTreeNode;
|
||||
import com.intellij.ide.util.treeView.AbstractTreeStructure;
|
||||
import com.intellij.ide.util.treeView.NodeDescriptorProvidingKey;
|
||||
import com.intellij.ide.util.treeView.NodeRenderer;
|
||||
import com.intellij.ide.util.treeView.*;
|
||||
import com.intellij.ide.util.treeView.smartTree.*;
|
||||
import com.intellij.ide.util.treeView.smartTree.TreeModel;
|
||||
import com.intellij.openapi.Disposable;
|
||||
@@ -51,13 +48,14 @@ import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.impl.source.tree.CompositeElement;
|
||||
import com.intellij.psi.util.PsiUtilCore;
|
||||
import com.intellij.ui.*;
|
||||
import com.intellij.ui.treeStructure.Tree;
|
||||
import com.intellij.ui.treeStructure.actions.CollapseAllAction;
|
||||
import com.intellij.ui.treeStructure.actions.ExpandAllAction;
|
||||
import com.intellij.ui.treeStructure.filtered.FilteringTreeStructure;
|
||||
import com.intellij.util.Alarm;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.EditSourceOnDoubleClickHandler;
|
||||
import com.intellij.util.OpenSourceUtil;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.Convertor;
|
||||
import com.intellij.util.ui.tree.TreeUtil;
|
||||
import gnu.trove.THashSet;
|
||||
@@ -79,7 +77,7 @@ public class StructureViewComponent extends SimpleToolWindowPanel implements Tre
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.ide.structureView.newStructureView.StructureViewComponent");
|
||||
@NonNls private static final String ourHelpID = "viewingStructure.fileStructureView";
|
||||
|
||||
private StructureTreeBuilder myAbstractTreeBuilder;
|
||||
private AbstractTreeBuilder myAbstractTreeBuilder;
|
||||
|
||||
private FileEditor myFileEditor;
|
||||
private final TreeModelWrapper myTreeModelWrapper;
|
||||
@@ -97,7 +95,6 @@ public class StructureViewComponent extends SimpleToolWindowPanel implements Tre
|
||||
private final Project myProject;
|
||||
private final StructureViewModel myTreeModel;
|
||||
private static int ourSettingsModificationCount;
|
||||
private Tree myTree;
|
||||
|
||||
public StructureViewComponent(FileEditor editor, StructureViewModel structureViewModel, Project project) {
|
||||
this(editor, structureViewModel, project, true);
|
||||
@@ -139,12 +136,12 @@ public class StructureViewComponent extends SimpleToolWindowPanel implements Tre
|
||||
};
|
||||
|
||||
final DefaultTreeModel model = new DefaultTreeModel(new DefaultMutableTreeNode(treeStructure.getRootElement()));
|
||||
myTree = new JBTreeWithHintProvider(model);
|
||||
myTree.setRootVisible(showRootNode);
|
||||
myTree.setShowsRootHandles(true);
|
||||
JTree tree = new JBTreeWithHintProvider(model);
|
||||
tree.setRootVisible(showRootNode);
|
||||
tree.setShowsRootHandles(true);
|
||||
|
||||
myAbstractTreeBuilder = new StructureTreeBuilder(project, myTree,
|
||||
(DefaultTreeModel)myTree.getModel(),treeStructure,myTreeModelWrapper) {
|
||||
myAbstractTreeBuilder = new StructureTreeBuilder(project, tree,
|
||||
(DefaultTreeModel)tree.getModel(),treeStructure,myTreeModelWrapper) {
|
||||
@Override
|
||||
protected boolean validateNode(Object child) {
|
||||
return isValid(child);
|
||||
@@ -244,41 +241,37 @@ public class StructureViewComponent extends SimpleToolWindowPanel implements Tre
|
||||
|
||||
|
||||
private static Object[] convertPathsToValues(TreePath[] selectionPaths) {
|
||||
if (selectionPaths != null) {
|
||||
List<Object> result = new ArrayList<Object>();
|
||||
|
||||
for (TreePath selectionPath : selectionPaths) {
|
||||
final Object userObject = ((DefaultMutableTreeNode)selectionPath.getLastPathComponent()).getUserObject();
|
||||
if (userObject instanceof AbstractTreeNode) {
|
||||
Object value = ((AbstractTreeNode)userObject).getValue();
|
||||
if (value instanceof StructureViewTreeElement) {
|
||||
value = ((StructureViewTreeElement)value).getValue();
|
||||
}
|
||||
result.add(value);
|
||||
}
|
||||
}
|
||||
return ArrayUtil.toObjectArray(result);
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
if (selectionPaths == null) return null;
|
||||
List<Object> result = new ArrayList<Object>();
|
||||
for (TreePath selectionPath : selectionPaths) {
|
||||
ContainerUtil.addIfNotNull(result, getNodeTreeValue((DefaultMutableTreeNode)selectionPath.getLastPathComponent()));
|
||||
}
|
||||
return ArrayUtil.toObjectArray(result);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static Object[] convertPathsToTreeElements(TreePath[] selectionPaths) {
|
||||
if (selectionPaths != null) {
|
||||
Object[] result = new Object[selectionPaths.length];
|
||||
if (selectionPaths == null) return null;
|
||||
List<Object> result = new ArrayList<Object>();
|
||||
for (TreePath selectionPath : selectionPaths) {
|
||||
ContainerUtil.addIfNotNull(result, getNodeValue((DefaultMutableTreeNode)selectionPath.getLastPathComponent()));
|
||||
}
|
||||
return ArrayUtil.toObjectArray(result);
|
||||
}
|
||||
|
||||
for (int i = 0; i < selectionPaths.length; i++) {
|
||||
Object userObject = ((DefaultMutableTreeNode)selectionPaths[i].getLastPathComponent()).getUserObject();
|
||||
if (!(userObject instanceof AbstractTreeNode)) return null;
|
||||
result[i] = ((AbstractTreeNode)userObject).getValue();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
@Nullable
|
||||
private static Object getNodeValue(DefaultMutableTreeNode mutableTreeNode) {
|
||||
Object userObject = mutableTreeNode.getUserObject();
|
||||
if (userObject instanceof FilteringTreeStructure.FilteringNode) {
|
||||
userObject = ((FilteringTreeStructure.FilteringNode)userObject).getDelegate();
|
||||
}
|
||||
return userObject instanceof AbstractTreeNode ? ((AbstractTreeNode)userObject).getValue() : null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static Object getNodeTreeValue(DefaultMutableTreeNode mutableTreeNode) {
|
||||
Object value = getNodeValue(mutableTreeNode);
|
||||
return value instanceof StructureViewTreeElement ? ((StructureViewTreeElement)value).getValue() : null;
|
||||
}
|
||||
|
||||
private void addTreeMouseListeners() {
|
||||
@@ -634,10 +627,8 @@ public class StructureViewComponent extends SimpleToolWindowPanel implements Tre
|
||||
@Override
|
||||
public void centerSelectedRow() {
|
||||
TreePath path = getTree().getSelectionPath();
|
||||
if (path == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (path == null) return;
|
||||
|
||||
myAutoScrollToSourceHandler.setShouldAutoScroll(false);
|
||||
TreeUtil.showRowCentered(getTree(), getTree().getRowForPath(path), false);
|
||||
myAutoScrollToSourceHandler.setShouldAutoScroll(true);
|
||||
@@ -667,10 +658,18 @@ public class StructureViewComponent extends SimpleToolWindowPanel implements Tre
|
||||
return myAbstractTreeBuilder.getTreeStructure();
|
||||
}
|
||||
|
||||
public Tree getTree() {
|
||||
return myTree;
|
||||
public JTree getTree() {
|
||||
return myAbstractTreeBuilder.getTree();
|
||||
}
|
||||
|
||||
public AbstractTreeBuilder getTreeBuilder() {
|
||||
return myAbstractTreeBuilder;
|
||||
}
|
||||
|
||||
//public void setTreeBuilder(AbstractTreeBuilder treeBuilder) {
|
||||
// myAbstractTreeBuilder = treeBuilder;
|
||||
//}
|
||||
|
||||
private final class MyAutoScrollToSourceHandler extends AutoScrollToSourceHandler {
|
||||
private boolean myShouldAutoScroll = true;
|
||||
|
||||
@@ -753,10 +752,7 @@ public class StructureViewComponent extends SimpleToolWindowPanel implements Tre
|
||||
TreePath path = getSelectedUniquePath();
|
||||
if (path == null) return null;
|
||||
DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
|
||||
Object userObject = node.getUserObject();
|
||||
if (!(userObject instanceof AbstractTreeNode)) return null;
|
||||
AbstractTreeNode descriptor = (AbstractTreeNode)userObject;
|
||||
Object element = descriptor.getValue();
|
||||
Object element = getNodeValue(node);
|
||||
if (element instanceof StructureViewTreeElement) {
|
||||
element = ((StructureViewTreeElement)element).getValue();
|
||||
}
|
||||
@@ -831,7 +827,7 @@ public class StructureViewComponent extends SimpleToolWindowPanel implements Tre
|
||||
|
||||
public void doUpdate() {
|
||||
assert ApplicationManager.getApplication().isUnitTestMode();
|
||||
myAbstractTreeBuilder.addRootToUpdate();
|
||||
myAbstractTreeBuilder.queueUpdate(true);
|
||||
}
|
||||
|
||||
//todo [kirillk] dirty hack for discovering invalid psi elements, to delegate it to a proper place after 8.1
|
||||
@@ -994,7 +990,7 @@ public class StructureViewComponent extends SimpleToolWindowPanel implements Tre
|
||||
|
||||
@Override
|
||||
public Dimension getCurrentSize() {
|
||||
return myTree.getSize();
|
||||
return getTree().getSize();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1012,11 +1008,12 @@ public class StructureViewComponent extends SimpleToolWindowPanel implements Tre
|
||||
}
|
||||
|
||||
private void _setRefSize(Dimension size) {
|
||||
myTree.setPreferredSize(size);
|
||||
myTree.setMinimumSize(size);
|
||||
myTree.setMaximumSize(size);
|
||||
JTree tree = getTree();
|
||||
tree.setPreferredSize(size);
|
||||
tree.setMinimumSize(size);
|
||||
tree.setMaximumSize(size);
|
||||
|
||||
myTree.revalidate();
|
||||
myTree.repaint();
|
||||
tree.revalidate();
|
||||
tree.repaint();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,6 @@ import com.intellij.ide.DefaultTreeExpander;
|
||||
import com.intellij.ide.IdeBundle;
|
||||
import com.intellij.ide.TreeExpander;
|
||||
import com.intellij.ide.structureView.StructureView;
|
||||
import com.intellij.ide.structureView.StructureViewBuilder;
|
||||
import com.intellij.ide.structureView.StructureViewModel;
|
||||
import com.intellij.ide.structureView.StructureViewTreeElement;
|
||||
import com.intellij.ide.structureView.impl.StructureViewComposite;
|
||||
@@ -42,7 +41,6 @@ import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.editor.impl.EditorImpl;
|
||||
import com.intellij.openapi.fileEditor.FileEditor;
|
||||
import com.intellij.openapi.fileEditor.FileEditorManager;
|
||||
import com.intellij.openapi.fileEditor.ex.IdeDocumentHistory;
|
||||
import com.intellij.openapi.keymap.KeymapUtil;
|
||||
import com.intellij.openapi.project.Project;
|
||||
@@ -121,50 +119,48 @@ public class FileStructurePopup implements Disposable {
|
||||
private boolean myInitialNodeIsLeaf;
|
||||
private final List<Pair<String, JCheckBox>> myTriggeredCheckboxes = new ArrayList<Pair<String, JCheckBox>>();
|
||||
private final TreeExpander myTreeExpander;
|
||||
private StructureView myStructureView;
|
||||
@NotNull private final FileEditor myFileEditor;
|
||||
private final StructureView myStructureViewDelegate;
|
||||
|
||||
|
||||
public FileStructurePopup(StructureViewModel structureViewModel,
|
||||
public FileStructurePopup(@NotNull Project project,
|
||||
@Nullable Editor editor,
|
||||
Project project,
|
||||
@NotNull final Disposable auxDisposable,
|
||||
@NotNull FileEditor fileEditor,
|
||||
@NotNull StructureView structureView,
|
||||
final boolean applySortAndFilter) {
|
||||
myProject = project;
|
||||
myEditor = editor;
|
||||
myFileEditor = fileEditor;
|
||||
myStructureViewDelegate = structureView;
|
||||
|
||||
//Stop code analyzer to speedup EDT
|
||||
DaemonCodeAnalyzer.getInstance(myProject).disableUpdateByTimer(this);
|
||||
IdeFocusManager.getInstance(myProject).typeAheadUntil(myTreeHasBuilt);
|
||||
Disposer.register(this, myStructureViewDelegate);
|
||||
|
||||
//long l = System.currentTimeMillis();
|
||||
if (editor instanceof EditorImpl) {
|
||||
VirtualFile file = ((EditorImpl)editor).getVirtualFile();
|
||||
FileEditor fileEditor = FileEditorManager.getInstance(myProject).getSelectedEditor(file);
|
||||
if (fileEditor != null) {
|
||||
StructureViewBuilder builder = fileEditor.getStructureViewBuilder();
|
||||
myPsiFile = PsiManager.getInstance(project).findFile(file);
|
||||
if (builder != null && myPsiFile != null) {
|
||||
myStructureView = builder.createStructureView(fileEditor, project);
|
||||
Disposer.register(this, myStructureView);
|
||||
}
|
||||
}
|
||||
myPsiFile = PsiManager.getInstance(project).findFile(file);
|
||||
}
|
||||
|
||||
//System.out.println(System.currentTimeMillis() - l);
|
||||
if (myStructureView instanceof StructureViewComposite) {
|
||||
StructureViewComposite.StructureViewDescriptor[] views = ((StructureViewComposite)myStructureView).getStructureViews();
|
||||
if (myStructureViewDelegate instanceof StructureViewComposite) {
|
||||
StructureViewComposite.StructureViewDescriptor[] views = ((StructureViewComposite)myStructureViewDelegate).getStructureViews();
|
||||
myBaseTreeModel = new StructureViewCompositeModel(myPsiFile, views);
|
||||
Disposer.register(this, (Disposable)myBaseTreeModel);
|
||||
} else {
|
||||
myBaseTreeModel = structureViewModel;
|
||||
}
|
||||
Disposer.register(this, auxDisposable);
|
||||
else {
|
||||
myBaseTreeModel = myStructureViewDelegate.getTreeModel();
|
||||
}
|
||||
|
||||
if (applySortAndFilter) {
|
||||
myTreeActionsOwner = new TreeStructureActionsOwner(myBaseTreeModel);
|
||||
myTreeModel = new TreeModelWrapper(myBaseTreeModel, myTreeActionsOwner);
|
||||
}
|
||||
else {
|
||||
myTreeActionsOwner = null;
|
||||
myTreeModel = structureViewModel;
|
||||
myTreeModel = myStructureViewDelegate.getTreeModel();
|
||||
}
|
||||
|
||||
myTreeStructure = new SmartTreeStructure(project, myTreeModel){
|
||||
@@ -436,7 +432,7 @@ public class FileStructurePopup implements Disposable {
|
||||
Set<PsiElement> parents = getAllParents(element);
|
||||
|
||||
FilteringTreeStructure.FilteringNode node = (FilteringTreeStructure.FilteringNode)myAbstractTreeBuilder.getRootElement();
|
||||
if (element != null && node != null && myStructureView instanceof StructureViewComposite) {
|
||||
if (element != null && node != null && myStructureViewDelegate instanceof StructureViewComposite) {
|
||||
parents.remove(element.getContainingFile());
|
||||
final List<FilteringTreeStructure.FilteringNode> fileNodes = node.children();
|
||||
|
||||
@@ -610,14 +606,27 @@ public class FileStructurePopup implements Disposable {
|
||||
DataManager.registerDataProvider(panel, new DataProvider() {
|
||||
@Override
|
||||
public Object getData(@NonNls String dataId) {
|
||||
if (PlatformDataKeys.PROJECT.is(dataId)) {
|
||||
if (CommonDataKeys.PROJECT.is(dataId)) {
|
||||
return myProject;
|
||||
}
|
||||
if (PlatformDataKeys.FILE_EDITOR.is(dataId)) {
|
||||
return myFileEditor;
|
||||
}
|
||||
if (CommonDataKeys.PSI_ELEMENT.is(dataId)) {
|
||||
final Object node = ContainerUtil.getFirstItem(myAbstractTreeBuilder.getSelectedElements());
|
||||
Object node = ContainerUtil.getFirstItem(myAbstractTreeBuilder.getSelectedElements());
|
||||
if (!(node instanceof FilteringTreeStructure.FilteringNode)) return null;
|
||||
return getPsi((FilteringTreeStructure.FilteringNode)node);
|
||||
}
|
||||
if (LangDataKeys.PSI_ELEMENT_ARRAY.is(dataId)) {
|
||||
Set<Object> nodes = myAbstractTreeBuilder.getSelectedElements();
|
||||
if (nodes.isEmpty()) return PsiElement.EMPTY_ARRAY;
|
||||
ArrayList<PsiElement> result = new ArrayList<PsiElement>();
|
||||
for (Object o : nodes) {
|
||||
if (!(o instanceof FilteringTreeStructure.FilteringNode)) continue;
|
||||
ContainerUtil.addIfNotNull(result, getPsi((FilteringTreeStructure.FilteringNode)o));
|
||||
}
|
||||
return ContainerUtil.toArray(result, PsiElement.ARRAY_FACTORY);
|
||||
}
|
||||
if (LangDataKeys.POSITION_ADJUSTER_POPUP.is(dataId)) {
|
||||
return myPopup;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user