add some ways for reuse in DB part & cleanup

This commit is contained in:
Gregory.Shrago
2013-10-08 02:09:17 +04:00
parent 8dae62f250
commit b15784ff22
4 changed files with 107 additions and 99 deletions

View File

@@ -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");

View File

@@ -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

View File

@@ -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();
}
}

View File

@@ -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;
}