This commit is contained in:
Anna Kozlova
2005-03-28 21:39:24 +04:00
parent cbedf4e3a1
commit 045778686c
3 changed files with 88 additions and 16 deletions
@@ -66,14 +66,14 @@ public class FavoritesTreeStructure extends ProjectAbstractTreeStructureBase imp
ourAbstractUrlProviders.add(new MethodUrl(null, null));
}
private final AbstractTreeNode myRoot;
private final AbstractTreeNode<String> myRoot;
private Set<AbstractTreeNode> myFavorites = new HashSet<AbstractTreeNode>();
private HashMap<AbstractUrl, String> myAbstractUrls = new HashMap<AbstractUrl, String>();
private FavoritesTreeViewConfiguration myFavoritesConfiguration = new FavoritesTreeViewConfiguration();
public FavoritesTreeStructure(Project project) {
super(project);
myRoot = new AbstractTreeNode(myProject, "") {
myRoot = new AbstractTreeNode<String>(myProject, "") {
public Collection<AbstractTreeNode> getChildren() {
return myFavorites;
}
@@ -103,18 +103,18 @@ public class FavoritesTreeStructure extends ProjectAbstractTreeStructureBase imp
final AbstractTreeNode favoritesTreeElement = (AbstractTreeNode)element;
try {
if (element == myRoot) {
if (myFavorites.isEmpty()){
return new Object [] {new AbstractTreeNode<String>(myProject, "There is nothing to display. Add node to favorites list."){
public Collection<AbstractTreeNode> getChildren() {
return null;
}
public void update(final PresentationData presentation) {
presentation.setPresentableText(getValue());
}
}
};
//todo
Set<AbstractTreeNode> result = new HashSet<AbstractTreeNode>();
for (Iterator<AbstractTreeNode> iterator = myFavorites.iterator(); iterator.hasNext();) {
AbstractTreeNode abstractTreeNode = iterator.next();
final Object val = abstractTreeNode.getValue();
if (val != null && (!(val instanceof PsiElement) || ((PsiElement)val).isValid())){
result.add(abstractTreeNode);
}
}
myFavorites = result;
if (myFavorites.isEmpty()) {
return new Object[]{getEmptyScreen()};
}
return myFavorites.toArray(new Object[myFavorites.size()]);
}
@@ -126,6 +126,18 @@ public class FavoritesTreeStructure extends ProjectAbstractTreeStructureBase imp
return ArrayUtil.EMPTY_OBJECT_ARRAY;
}
private AbstractTreeNode<String> getEmptyScreen() {
return new AbstractTreeNode<String>(myProject, "There is nothing to display. Add node to favorites list."){
public Collection<AbstractTreeNode> getChildren() {
return null;
}
public void update(final PresentationData presentation) {
presentation.setPresentableText(getValue());
}
};
}
public Object getParentElement(Object element) {
AbstractTreeNode parent = null;
if (element instanceof AbstractTreeNode) {
@@ -223,6 +235,9 @@ public class FavoritesTreeStructure extends ProjectAbstractTreeStructureBase imp
for (Iterator<AbstractUrl> iterator = myAbstractUrls.keySet().iterator(); iterator.hasNext();) {
AbstractUrl abstractUrl = iterator.next();
final Object[] path = abstractUrl.createPath(myProject);
if (path == null || path.length < 1){
continue;
}
try {
if (abstractUrl instanceof FormUrl){
final PsiManager psiManager = PsiManager.getInstance(myProject);
@@ -268,9 +283,10 @@ public class FavoritesTreeStructure extends ProjectAbstractTreeStructureBase imp
for (Iterator<Element> iterator = element.getChildren("favorite_root").iterator(); iterator.hasNext();) {
Element favorite = iterator.next();
final String klass = favorite.getAttributeValue("klass");
final AbstractUrl abstractUrl = readUrlFromElement(favorite);
myAbstractUrls.put(abstractUrl, klass);
if (abstractUrl != null) {
myAbstractUrls.put(abstractUrl, klass);
}
}
myFavoritesConfiguration.readExternal(element);
}
@@ -24,12 +24,14 @@ import com.intellij.openapi.vfs.JarFileSystem;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.pom.Navigatable;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.ui.*;
import com.intellij.util.EditSourceOnDoubleClickHandler;
import com.intellij.util.OpenSourceUtil;
import com.intellij.util.ui.Tree;
import com.intellij.util.ui.tree.TreeUtil;
@@ -40,6 +42,10 @@ import javax.swing.tree.TreePath;
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.dnd.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.*;
import java.util.List;
@@ -191,6 +197,21 @@ public class FavoritesTreeViewPanel extends JPanel implements DataProvider {
add(createActionsToolbar(), BorderLayout.NORTH);
EditSourceOnDoubleClickHandler.install(myTree);
myTree.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (!e.isPopupTrigger() && e.getClickCount() == 2) {
OpenSourceUtil.openSourcesFrom(DataManager.getInstance().getDataContext(FavoritesTreeViewPanel.this), true);
}
}
});
myTree.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
OpenSourceUtil.openSourcesFrom(DataManager.getInstance().getDataContext(FavoritesTreeViewPanel.this), false);
}
}
});
myCopyPasteDelegator = new CopyPasteManagerEx.CopyPasteDelegator(myProject, this) {
protected PsiElement[] getSelectedElements() {
return getSelectedPsiElements();
@@ -251,6 +272,11 @@ public class FavoritesTreeViewPanel extends JPanel implements DataProvider {
final FavoritesTreeNodeDescriptor[] selectedNodeDescriptors = getSelectedNodeDescriptors();
return selectedNodeDescriptors != null && selectedNodeDescriptors.length == 1 ? selectedNodeDescriptors[0].getElement() : null;
}
if (DataConstants.NAVIGATABLE_ARRAY.equals(dataId)) {
final List<Navigatable> selectedElements = getSelectedElements(Navigatable.class);
return selectedElements.toArray(new Navigatable[selectedElements.size()]);
}
if (DataConstantsEx.CUT_PROVIDER.equals(dataId)) {
return myCopyPasteDelegator.getCutProvider();
}
@@ -32,6 +32,7 @@ import javax.swing.tree.DefaultTreeModel;
public class FavoritesViewTreeBuilder extends BaseProjectTreeBuilder {
private ProjectViewPsiTreeChangeListener myPsiTreeChangeListener;
private final PsiTreeChangeListener myPsiTreeChangeAdapter;
private ModuleRootListener myModuleRootListener;
private FileStatusListener myFileStatusListener;
private MyCopyPasteListener myCopyPasteListener;
@@ -94,6 +95,8 @@ public class FavoritesViewTreeBuilder extends BaseProjectTreeBuilder {
}
};
PsiManager.getInstance(myProject).addPsiTreeChangeListener(myPsiTreeChangeListener);
myPsiTreeChangeAdapter = new MyPsiTreeChangeListener();
PsiManager.getInstance(myProject).addPsiTreeChangeListener(myPsiTreeChangeAdapter);
ProjectRootManager.getInstance(myProject).addModuleRootListener(myModuleRootListener);
myFileStatusListener = new MyFileStatusListener();
FileStatusManager.getInstance(myProject).addFileStatusListener(myFileStatusListener);
@@ -120,6 +123,7 @@ public class FavoritesViewTreeBuilder extends BaseProjectTreeBuilder {
public final void dispose() {
super.dispose();
PsiManager.getInstance(myProject).removePsiTreeChangeListener(myPsiTreeChangeListener);
PsiManager.getInstance(myProject).removePsiTreeChangeListener(myPsiTreeChangeAdapter);
ProjectRootManager.getInstance(myProject).removeModuleRootListener(myModuleRootListener);
FileStatusManager.getInstance(myProject).removeFileStatusListener(myFileStatusListener);
CopyPasteManager.getInstance().removeContentChangedListener(myCopyPasteListener);
@@ -155,6 +159,32 @@ public class FavoritesViewTreeBuilder extends BaseProjectTreeBuilder {
}
}
private final class MyPsiTreeChangeListener extends PsiTreeChangeAdapter {
public final void childAdded(final PsiTreeChangeEvent event) {
myUpdater.addSubtreeToUpdate(myRootNode);
}
public final void childRemoved(final PsiTreeChangeEvent event) {
myUpdater.addSubtreeToUpdate(myRootNode);
}
public final void childReplaced(final PsiTreeChangeEvent event) {
myUpdater.addSubtreeToUpdate(myRootNode);
}
public final void childMoved(final PsiTreeChangeEvent event) {
myUpdater.addSubtreeToUpdate(myRootNode);
}
public final void childrenChanged(final PsiTreeChangeEvent event) {
myUpdater.addSubtreeToUpdate(myRootNode);
}
public final void propertyChanged(final PsiTreeChangeEvent event) {
myUpdater.addSubtreeToUpdate(myRootNode);
}
}
private final class MyCopyPasteListener implements CopyPasteManager.ContentChangedListener {
public void contentChanged() {
myUpdater.addSubtreeToUpdate(myRootNode);