From 976473d0846422272102021d19a2f7f78ae034ea Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 11 Mar 2005 23:53:03 +0300 Subject: [PATCH] DnD to Favorites --- .../AddNewFavoritesListAction.java | 4 +- .../AddToFavoritesAction.java | 8 +- .../DeleteFromFavoritesAction.java | 5 +- .../FavoritesTreeStructure.java | 10 +- .../FavoritesTreeViewPanel.java | 124 ++++++++++++++---- .../favoritesTreeView/FavoritesViewImpl.java | 24 ++-- .../FavoritesViewTreeBuilder.java | 50 ++++++- .../impl/AbstractProjectViewPSIPane.java | 93 ++++++++++++- 8 files changed, 259 insertions(+), 59 deletions(-) diff --git a/source/com/intellij/ide/favoritesTreeView/AddNewFavoritesListAction.java b/source/com/intellij/ide/favoritesTreeView/AddNewFavoritesListAction.java index e826cc3b50b7..e0ee14fe19a3 100644 --- a/source/com/intellij/ide/favoritesTreeView/AddNewFavoritesListAction.java +++ b/source/com/intellij/ide/favoritesTreeView/AddNewFavoritesListAction.java @@ -27,7 +27,7 @@ public class AddNewFavoritesListAction extends AnAction{ } } - public FavoritesTreeViewPanel doAddNewFavoritesList(final Project project) { + public static FavoritesTreeViewPanel doAddNewFavoritesList(final Project project) { final String s = Messages.showInputDialog(project, "Input new favorites list name", "Add New Favorites List", Messages.getInformationIcon(), "new", new InputValidator() { @@ -37,7 +37,7 @@ public class AddNewFavoritesListAction extends AnAction{ public boolean canClose(String inputString) { final boolean alreadyContains = ArrayUtil.find(FavoritesViewImpl.getInstance(project).getAvailableFavoritesLists(), inputString.trim()) == -1; - return inputString != null && inputString.trim().length() > 0 && alreadyContains; + return inputString.trim().length() > 0 && alreadyContains; } }); final FavoritesViewImpl favoritesView = FavoritesViewImpl.getInstance(project); diff --git a/source/com/intellij/ide/favoritesTreeView/AddToFavoritesAction.java b/source/com/intellij/ide/favoritesTreeView/AddToFavoritesAction.java index 346e91a5d6e7..b234cc65773d 100644 --- a/source/com/intellij/ide/favoritesTreeView/AddToFavoritesAction.java +++ b/source/com/intellij/ide/favoritesTreeView/AddToFavoritesAction.java @@ -96,7 +96,7 @@ public class AddToFavoritesAction extends AnAction { abstractTreeNode = abstractTreeNode.getParent(); } if (abstractTreeNode != null){ - containingModule = (Module)((AbstractModuleNode)abstractTreeNode.getParent()).getValue(); + containingModule = ((AbstractModuleNode)abstractTreeNode.getParent()).getValue(); } } } @@ -164,7 +164,7 @@ public class AddToFavoritesAction extends AnAction { if (StdFileTypes.GUI_DESIGNER_FORM.equals(fileType)) { final PsiFile formFile = psiManager.findFile(vFile); String text = formFile.getText(); - LwRootContainer container = null; + LwRootContainer container; try { container = Utils.getRootContainer(text, null); } @@ -231,7 +231,7 @@ public class AddToFavoritesAction extends AnAction { } - private Class getPsiElementNodeClass(PsiElement psiElement) { + private static Class getPsiElementNodeClass(PsiElement psiElement) { Class klass = null; if (psiElement instanceof PsiClass) { klass = ClassTreeNode.class; @@ -253,7 +253,7 @@ public class AddToFavoritesAction extends AnAction { return klass; } - private Object getPsiElementNodeValue(PsiElement psiElement, Project project, Module module) { + private static Object getPsiElementNodeValue(PsiElement psiElement, Project project, Module module) { if (psiElement instanceof PsiPackage){ final PsiPackage psiPackage = (PsiPackage)psiElement; final PsiDirectory[] directories = psiPackage.getDirectories(); diff --git a/source/com/intellij/ide/favoritesTreeView/DeleteFromFavoritesAction.java b/source/com/intellij/ide/favoritesTreeView/DeleteFromFavoritesAction.java index 594ee5e4ea4f..81b417dd4124 100644 --- a/source/com/intellij/ide/favoritesTreeView/DeleteFromFavoritesAction.java +++ b/source/com/intellij/ide/favoritesTreeView/DeleteFromFavoritesAction.java @@ -1,6 +1,5 @@ package com.intellij.ide.favoritesTreeView; -import com.intellij.ide.util.treeView.AbstractTreeNode; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.IconLoader; @@ -28,13 +27,13 @@ public class DeleteFromFavoritesAction extends AnAction { } } - public void removeNodes(final FavoritesTreeNodeDescriptor[] selectedNodeDescriptors, final Project project, String favoritesViewPane) { + public static void removeNodes(final FavoritesTreeNodeDescriptor[] selectedNodeDescriptors, final Project project, String favoritesViewPane) { final FavoritesTreeViewPanel favoritesTreeViewPanel = FavoritesViewImpl.getInstance(project).getFavoritesTreeViewPanel(favoritesViewPane); for (int i = 0; selectedNodeDescriptors != null && i < selectedNodeDescriptors.length; i++) { FavoritesTreeNodeDescriptor selectedNodeDescriptor = selectedNodeDescriptors[i]; selectedNodeDescriptor = FavoritesTreeNodeDescriptor.getFavoritesRoot(selectedNodeDescriptor, project, favoritesViewPane); if (selectedNodeDescriptor != null) { - favoritesTreeViewPanel.removeFromFavorites((AbstractTreeNode)selectedNodeDescriptor.getElement()); + favoritesTreeViewPanel.removeFromFavorites(selectedNodeDescriptor.getElement()); } } } diff --git a/source/com/intellij/ide/favoritesTreeView/FavoritesTreeStructure.java b/source/com/intellij/ide/favoritesTreeView/FavoritesTreeStructure.java index 1ceaa1588e6f..daed792f99c1 100644 --- a/source/com/intellij/ide/favoritesTreeView/FavoritesTreeStructure.java +++ b/source/com/intellij/ide/favoritesTreeView/FavoritesTreeStructure.java @@ -91,6 +91,11 @@ public class FavoritesTreeStructure extends ProjectAbstractTreeStructureBase imp myFavorites.add(element); } + //for tests only + public Set getFavorites() { + return myFavorites; + } + public Object[] getChildElements(Object element) { if (!(element instanceof AbstractTreeNode)) { return ArrayUtil.EMPTY_OBJECT_ARRAY; @@ -236,7 +241,7 @@ public class FavoritesTreeStructure extends ProjectAbstractTreeStructureBase imp return myFavoritesConfiguration; } - private AbstractUrl createUrlByElement(Object element) { + private static AbstractUrl createUrlByElement(Object element) { for (Iterator iterator = ourAbstractUrlProviders.iterator(); iterator.hasNext();) { AbstractUrl urlProvider = iterator.next(); AbstractUrl url = urlProvider.createUrlByElement(element); @@ -245,7 +250,7 @@ public class FavoritesTreeStructure extends ProjectAbstractTreeStructureBase imp return null; } - private AbstractUrl readUrlFromElement(Element element) { + private static AbstractUrl readUrlFromElement(Element element) { final String type = element.getAttributeValue("type"); final String urlValue = element.getAttributeValue("url"); final String moduleName = element.getAttributeValue("module"); @@ -259,6 +264,7 @@ public class FavoritesTreeStructure extends ProjectAbstractTreeStructureBase imp public void readExternal(Element element) throws InvalidDataException { + myAbstractUrls.clear(); for (Iterator iterator = element.getChildren("favorite_root").iterator(); iterator.hasNext();) { Element favorite = iterator.next(); final String klass = favorite.getAttributeValue("klass"); diff --git a/source/com/intellij/ide/favoritesTreeView/FavoritesTreeViewPanel.java b/source/com/intellij/ide/favoritesTreeView/FavoritesTreeViewPanel.java index 2e0f5bb6820f..11f2aa51c7ca 100644 --- a/source/com/intellij/ide/favoritesTreeView/FavoritesTreeViewPanel.java +++ b/source/com/intellij/ide/favoritesTreeView/FavoritesTreeViewPanel.java @@ -40,10 +40,13 @@ import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import java.awt.*; +import java.awt.datatransfer.DataFlavor; +import java.awt.dnd.*; import java.util.*; import java.util.List; public class FavoritesTreeViewPanel extends JPanel implements DataProvider { + public static final String ABSTRACT_TREE_NODE_TRANSFERABLE = "AbstractTransferable"; private static final Icon COMPACT_EMPTY_MIDDLE_PACKAGES_ICON = IconLoader.getIcon("/objectBrowser/compactEmptyPackages.png"); private static final Icon HIDE_EMPTY_MIDDLE_PACKAGES_ICON = IconLoader.getIcon("/objectBrowser/hideEmptyPackages.png"); @@ -72,11 +75,12 @@ public class FavoritesTreeViewPanel extends JPanel implements DataProvider { private AutoScrollToSourceHandler myAutoScrollToSourceHandler; private String myName; private IdeView myIdeView = new MyIdeView(); + public FavoritesTreeViewPanel(Project project, String helpId, String name) { + super(new BorderLayout()); myProject = project; myHelpId = helpId; myName = name; - setLayout(new BorderLayout()); myAutoScrollToSourceHandler = new AutoScrollToSourceHandler() { protected boolean isAutoScrollMode() { @@ -122,7 +126,7 @@ public class FavoritesTreeViewPanel extends JPanel implements DataProvider { if (value instanceof DefaultMutableTreeNode) { DefaultMutableTreeNode node = (DefaultMutableTreeNode)value; //only favorites roots to explain - if (node.getParent() == null || node.getParent().getParent() != null){ + if (node.getParent() == null || node.getParent().getParent() != null) { return; } Object userObject = node.getUserObject(); @@ -133,9 +137,10 @@ public class FavoritesTreeViewPanel extends JPanel implements DataProvider { String locationString = treeNode.getPresentation().getLocationString(); if (locationString != null && locationString.length() > 0) { append(" (" + locationString + ")", SimpleTextAttributes.GRAY_ATTRIBUTES); - } else { + } + else { final String location = favoritesTreeNodeDescriptor.getLocation(); - if (location != null && location.length() > 0){ + if (location != null && location.length() > 0) { append(" (" + location + ")", SimpleTextAttributes.GRAY_ATTRIBUTES); } } @@ -165,9 +170,23 @@ public class FavoritesTreeViewPanel extends JPanel implements DataProvider { return getSelectedPsiElements(); } }; + myTree.setTransferHandler(new TransferHandler() { + public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) { + for (int i = 0; i < transferFlavors.length; i++) { + DataFlavor transferFlavor = transferFlavors[i]; + if (transferFlavor.getHumanPresentableName().equals(ABSTRACT_TREE_NODE_TRANSFERABLE)) { + return true; + } + } + return false; + } + }); + new DropTarget(myTree, new MyDropTargetListener()); + + //DragSource.getDefaultDragSource().createDefaultDragGestureRecognizer(myTree, DnDConstants.ACTION_COPY_OR_MOVE, new MyDragGestureListener()); } - public void selectElement(final Object selector, final VirtualFile file){ + public void selectElement(final Object selector, final VirtualFile file) { myBuilder.select(selector, file, true, myBuilder); } @@ -219,11 +238,11 @@ public class FavoritesTreeViewPanel extends JPanel implements DataProvider { return myHelpId; } if (DataConstants.PSI_ELEMENT.equals(dataId)) { - final PsiElement psiElement; Object[] elements = getSelectedNodeElements(); if (elements == null || elements.length != 1) { return null; } + final PsiElement psiElement; if (elements[0] instanceof PsiElement) { psiElement = (PsiElement)elements[0]; } @@ -231,7 +250,7 @@ public class FavoritesTreeViewPanel extends JPanel implements DataProvider { psiElement = ((PackageElement)elements[0]).getPackage(); } else { - psiElement = null; + return null; } return psiElement != null && psiElement.isValid() ? psiElement : null; } @@ -250,7 +269,7 @@ public class FavoritesTreeViewPanel extends JPanel implements DataProvider { return result.isEmpty() ? null : result.toArray(new PsiElement[result.size()]); } - if (DataConstantsEx.IDE_VIEW.equals(dataId) ){ + if (DataConstantsEx.IDE_VIEW.equals(dataId)) { return myIdeView; } @@ -269,8 +288,8 @@ public class FavoritesTreeViewPanel extends JPanel implements DataProvider { if (DataConstantsEx.DELETE_ELEMENT_PROVIDER.equals(dataId)) { final Object[] elements = getSelectedNodeElements(); return elements != null && elements.length >= 1 && elements[0] instanceof Module - ? (DeleteProvider)myDeleteModuleProvider - : myDeletePSIElementProvider; + ? (DeleteProvider)myDeleteModuleProvider + : myDeletePSIElementProvider; } if (DataConstantsEx.MODULE_GROUP_ARRAY.equals(dataId)) { @@ -328,7 +347,7 @@ public class FavoritesTreeViewPanel extends JPanel implements DataProvider { if (selectedNodeDescriptors == null) { return null; } - ArrayList result = new ArrayList(); + ArrayList result = new ArrayList(); for (int i = 0; i < selectedNodeDescriptors.length; i++) { FavoritesTreeNodeDescriptor selectedNodeDescriptor = selectedNodeDescriptors[i]; if (selectedNodeDescriptor != null) { @@ -411,7 +430,7 @@ public class FavoritesTreeViewPanel extends JPanel implements DataProvider { group.add(myAutoScrollToSourceHandler.createToggleAction()); //group.add(new ShowStructureAction()); group.add(ActionManager.getInstance().getAction(IdeActions.REMOVE_FROM_FAVORITES)); - + group.add(ActionManager.getInstance().getAction(IdeActions.REMOVE_FAVORITES_LIST)); return ActionManager.getInstance().createActionToolbar(ActionPlaces.FAVORITES_VIEW_TOOLBAR, group, true).getComponent(); } @@ -566,7 +585,7 @@ public class FavoritesTreeViewPanel extends JPanel implements DataProvider { final String path = virtualFile.getPath(); if (path.endsWith(JarFileSystem.JAR_SEPARATOR)) { // if is jar-file root final VirtualFile vFile = LocalFileSystem.getInstance().findFileByPath( - path.substring(0, path.length() - JarFileSystem.JAR_SEPARATOR.length())); + path.substring(0, path.length() - JarFileSystem.JAR_SEPARATOR.length())); if (vFile != null) { final PsiFile psiFile = PsiManager.getInstance(myProject).findFile(vFile); if (psiFile != null) { @@ -600,28 +619,81 @@ public class FavoritesTreeViewPanel extends JPanel implements DataProvider { final FavoritesTreeNodeDescriptor[] selectedNodeDescriptors = getSelectedNodeDescriptors(); if (selectedNodeDescriptors == null || selectedNodeDescriptors.length != 1) return null; final FavoritesTreeNodeDescriptor currentDescriptor = selectedNodeDescriptors[0]; - if (currentDescriptor != null && currentDescriptor.getElement() instanceof AbstractTreeNode){ - final AbstractTreeNode currentNode = ((AbstractTreeNode)currentDescriptor.getElement()); - if (currentNode.getValue() instanceof PsiDirectory){ - return (PsiDirectory)currentNode.getValue(); + if (currentDescriptor != null) { + if (currentDescriptor.getElement() != null) { + final AbstractTreeNode currentNode = currentDescriptor.getElement(); + if (currentNode.getValue() instanceof PsiDirectory) { + return (PsiDirectory)currentNode.getValue(); + } } - } - final NodeDescriptor parentDescriptor = currentDescriptor.getParentDescriptor(); - if (parentDescriptor != null) { - final Object parentElement = parentDescriptor.getElement(); - if (parentElement instanceof AbstractTreeNode) { - final AbstractTreeNode parentNode = ((AbstractTreeNode)parentElement); - if (parentNode.getValue() instanceof PsiDirectory){ - return (PsiDirectory)parentNode.getValue(); + final NodeDescriptor parentDescriptor = currentDescriptor.getParentDescriptor(); + if (parentDescriptor != null) { + final Object parentElement = parentDescriptor.getElement(); + if (parentElement instanceof AbstractTreeNode) { + final AbstractTreeNode parentNode = ((AbstractTreeNode)parentElement); + if (parentNode.getValue() instanceof PsiDirectory) { + return (PsiDirectory)parentNode.getValue(); + } } } } + return null; } public PsiDirectory[] getDirectories() { PsiDirectory directory = getDirectory(); - return directory == null ? PsiDirectory.EMPTY_ARRAY : new PsiDirectory[] {directory}; + return directory == null ? PsiDirectory.EMPTY_ARRAY : new PsiDirectory[]{directory}; + } + } + + //---------- DnD ------------- + private AbstractTreeNode myDraggableObject; + public void setDraggableObject(final AbstractTreeNode draggableObject) { + myDraggableObject = draggableObject; + } + private class MyDropTargetListener implements DropTargetListener { + public void dragEnter(DropTargetDragEvent dtde) { + DataFlavor[] flavors = dtde.getCurrentDataFlavors(); + JComponent c = (JComponent)dtde.getDropTargetContext().getComponent(); + TransferHandler importer = c.getTransferHandler(); + int dropAction = dtde.getDropAction(); + if (importer != null && importer.canImport(c, flavors)) { + dtde.acceptDrag(dropAction); + } + else { + dtde.rejectDrag(); + } + } + + public void dragOver(DropTargetDragEvent dtde) { + } + + public void dropActionChanged(DropTargetDragEvent dtde) { + } + + public void drop(DropTargetDropEvent dtde) { + if (myDraggableObject != null) { + int dropAction = dtde.getDropAction(); + if ((dropAction & DnDConstants.ACTION_MOVE) != 0) { + final Collection children = ((AbstractTreeNode)myFavoritesTreeStructure.getRootElement()).getChildren(); + for (Iterator iterator = children.iterator(); iterator.hasNext();) { + AbstractTreeNode abstractTreeNode = iterator.next(); + if (abstractTreeNode.getValue() == null + ? myDraggableObject.getValue() == null + : abstractTreeNode.getValue().equals(myDraggableObject.getValue())) { + return; + } + } + addToFavorites(myDraggableObject); + dtde.dropComplete(true); + return; + } + } + dtde.rejectDrop(); + } + + public void dragExit(DropTargetEvent dte) { } } } \ No newline at end of file diff --git a/source/com/intellij/ide/favoritesTreeView/FavoritesViewImpl.java b/source/com/intellij/ide/favoritesTreeView/FavoritesViewImpl.java index a5186c8a394d..04142cfe48ce 100644 --- a/source/com/intellij/ide/favoritesTreeView/FavoritesViewImpl.java +++ b/source/com/intellij/ide/favoritesTreeView/FavoritesViewImpl.java @@ -23,17 +23,17 @@ import org.jdom.Element; import java.util.*; public class FavoritesViewImpl extends ContentManagerImpl implements ProjectComponent, JDOMExternalizable { - private Project myProject; private Map myName2FavoritesListSet = new HashMap(); public String myCurrentFavoritesList; private Map myActions = new HashMap(); + private Project myCurrentProject; public static FavoritesViewImpl getInstance(Project project) { return project.getComponent(FavoritesViewImpl.class); } public FavoritesViewImpl(Project project, ProjectManager projectManager) { super(new TabbedPaneContentUI(), true, project, projectManager); - myProject = project; + myCurrentProject = project; addContentManagerListener(new ContentManagerListener() { public void contentAdded(ContentManagerEvent event) { } @@ -55,12 +55,12 @@ public class FavoritesViewImpl extends ContentManagerImpl implements ProjectComp } } }); - SelectInManager selectInManager = SelectInManager.getInstance(myProject); + SelectInManager selectInManager = SelectInManager.getInstance(myCurrentProject); selectInManager.addTarget(createSelectInTarget()); } private SelectInTarget createSelectInTarget() { - return new FavoritesViewSelectInTarget(myProject); + return new FavoritesViewSelectInTarget(myCurrentProject); } public void initComponent() { @@ -71,9 +71,9 @@ public class FavoritesViewImpl extends ContentManagerImpl implements ProjectComp } public void projectOpened() { - StartupManager.getInstance(myProject).registerPostStartupActivity(new Runnable() { + StartupManager.getInstance(myCurrentProject).registerPostStartupActivity(new Runnable() { public void run() { - ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(myProject); + ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(myCurrentProject); ToolWindow toolWindow = toolWindowManager.registerToolWindow(ToolWindowId.FAVORITES_VIEW, getComponent(), ToolWindowAnchor.RIGHT); toolWindow.setIcon(IconLoader.getIcon("/general/toolWindowFavorites.png")); new ContentManagerWatcher(toolWindow, FavoritesViewImpl.this); @@ -81,10 +81,10 @@ public class FavoritesViewImpl extends ContentManagerImpl implements ProjectComp final DefaultActionGroup favoritesActionsGroup = ((DefaultActionGroup)ActionManager.getInstance().getAction(IdeActions.ADD_TO_FAVORITES)); favoritesActionsGroup.removeAll(); if (myName2FavoritesListSet.isEmpty()){ - final FavoritesTreeViewPanel panel = new FavoritesTreeViewPanel(myProject, null, myProject.getName()); - final Content favoritesContent = contentFactory.createContent(panel, myProject.getName(), false); + final FavoritesTreeViewPanel panel = new FavoritesTreeViewPanel(myCurrentProject, null, myCurrentProject.getName()); + final Content favoritesContent = contentFactory.createContent(panel, myCurrentProject.getName(), false); addContent(favoritesContent); - final String key = myProject.getName(); + final String key = myCurrentProject.getName(); myName2FavoritesListSet.put(key, favoritesContent); myCurrentFavoritesList = key; panel.getFavoritesTreeStructure().initFavoritesList(); @@ -126,7 +126,7 @@ public class FavoritesViewImpl extends ContentManagerImpl implements ProjectComp public FavoritesTreeViewPanel addNewFavoritesList(String name){ final ContentFactory contentFactory = PeerFactory.getInstance().getContentFactory(); - final FavoritesTreeViewPanel panel = new FavoritesTreeViewPanel(myProject, null, name); + final FavoritesTreeViewPanel panel = new FavoritesTreeViewPanel(myCurrentProject, null, name); final Content favoritesContent = contentFactory.createContent(panel, name, false); addContent(favoritesContent); myName2FavoritesListSet.put(name, favoritesContent); @@ -153,7 +153,7 @@ public class FavoritesViewImpl extends ContentManagerImpl implements ProjectComp } public void projectClosed() { - ToolWindowManager.getInstance(myProject).unregisterToolWindow(ToolWindowId.FAVORITES_VIEW); + ToolWindowManager.getInstance(myCurrentProject).unregisterToolWindow(ToolWindowId.FAVORITES_VIEW); } private void dispose() { @@ -175,7 +175,7 @@ public class FavoritesViewImpl extends ContentManagerImpl implements ProjectComp Element el = iterator.next(); final String name = el.getAttributeValue("name"); final ContentFactory contentFactory = PeerFactory.getInstance().getContentFactory(); - final FavoritesTreeViewPanel favoritesPanel = new FavoritesTreeViewPanel(myProject, null, name); + final FavoritesTreeViewPanel favoritesPanel = new FavoritesTreeViewPanel(myCurrentProject, null, name); myName2FavoritesListSet.put(name, contentFactory.createContent(favoritesPanel, name, false)); favoritesPanel.getFavoritesTreeStructure().readExternal(el); } diff --git a/source/com/intellij/ide/favoritesTreeView/FavoritesViewTreeBuilder.java b/source/com/intellij/ide/favoritesTreeView/FavoritesViewTreeBuilder.java index b63b398abeee..00a67868270b 100644 --- a/source/com/intellij/ide/favoritesTreeView/FavoritesViewTreeBuilder.java +++ b/source/com/intellij/ide/favoritesTreeView/FavoritesViewTreeBuilder.java @@ -6,11 +6,17 @@ package com.intellij.ide.favoritesTreeView; import com.intellij.ide.projectView.BaseProjectTreeBuilder; import com.intellij.ide.projectView.ProjectViewPsiTreeChangeListener; +import com.intellij.ide.projectView.impl.ModuleGroup; import com.intellij.ide.projectView.impl.ProjectAbstractTreeStructureBase; +import com.intellij.ide.projectView.impl.nodes.Form; +import com.intellij.ide.projectView.impl.nodes.LibraryGroupElement; +import com.intellij.ide.projectView.impl.nodes.NamedLibraryElement; +import com.intellij.ide.projectView.impl.nodes.PackageElement; import com.intellij.ide.util.treeView.AbstractTreeUpdater; -import com.intellij.ide.util.treeView.IndexComparator; +import com.intellij.ide.util.treeView.AlphaComparator; import com.intellij.ide.util.treeView.NodeDescriptor; import com.intellij.openapi.ide.CopyPasteManager; +import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModuleRootEvent; import com.intellij.openapi.roots.ModuleRootListener; @@ -18,9 +24,7 @@ import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.vcs.FileStatusListener; import com.intellij.openapi.vcs.FileStatusManager; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiJavaFile; -import com.intellij.psi.PsiManager; +import com.intellij.psi.*; import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; @@ -33,7 +37,41 @@ public class FavoritesViewTreeBuilder extends BaseProjectTreeBuilder { private MyCopyPasteListener myCopyPasteListener; public FavoritesViewTreeBuilder(Project project, JTree tree, DefaultTreeModel treeModel, ProjectAbstractTreeStructureBase treeStructure) { - super(project, tree, treeModel, treeStructure, IndexComparator.INSTANCE); + super(project, tree, treeModel, treeStructure, null); + setNodeDescriptorComparator(new AlphaComparator(){ + protected int getWeight(NodeDescriptor descriptor) { + FavoritesTreeNodeDescriptor favoritesTreeNodeDescriptor = (FavoritesTreeNodeDescriptor)descriptor; + final Object value = favoritesTreeNodeDescriptor.getElement().getValue(); + if (value instanceof ModuleGroup){ + return 0; + } + if (value instanceof Module){ + return 1; + } + if (value instanceof PsiDirectory || value instanceof PackageElement){ + return 2; + } + if (value instanceof PsiClass){ + return 4; + } + if (value instanceof PsiFile){ + return 5; + } + if (value instanceof PsiElement){ + return 6; + } + if (value instanceof Form){ + return 7; + } + if (value instanceof LibraryGroupElement){ + return 8; + } + if (value instanceof NamedLibraryElement){ + return 9; + } + return 10; + } + }); myPsiTreeChangeListener = new ProjectViewPsiTreeChangeListener() { protected DefaultMutableTreeNode getRootNode() { return myRootNode; @@ -88,7 +126,7 @@ public class FavoritesViewTreeBuilder extends BaseProjectTreeBuilder { } protected boolean isAlwaysShowPlus(NodeDescriptor nodeDescriptor) { - final Object[] childElements = ((FavoritesTreeStructure)myTreeStructure).getChildElements(nodeDescriptor); + final Object[] childElements = myTreeStructure.getChildElements(nodeDescriptor); return childElements != null ? childElements.length > 0 : false; } diff --git a/source/com/intellij/ide/projectView/impl/AbstractProjectViewPSIPane.java b/source/com/intellij/ide/projectView/impl/AbstractProjectViewPSIPane.java index 70144018196e..06c9ceed0403 100644 --- a/source/com/intellij/ide/projectView/impl/AbstractProjectViewPSIPane.java +++ b/source/com/intellij/ide/projectView/impl/AbstractProjectViewPSIPane.java @@ -6,15 +6,15 @@ package com.intellij.ide.projectView.impl; import com.intellij.ide.CopyPasteManagerEx; import com.intellij.ide.DataManager; import com.intellij.ide.SelectInManager; +import com.intellij.ide.favoritesTreeView.FavoritesTreeViewPanel; +import com.intellij.ide.favoritesTreeView.FavoritesViewImpl; import com.intellij.ide.impl.ProjectViewSelectInTarget; import com.intellij.ide.projectView.BaseProjectTreeBuilder; import com.intellij.ide.projectView.ProjectView; import com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode; -import com.intellij.ide.util.treeView.AbstractTreeBuilder; -import com.intellij.ide.util.treeView.AbstractTreeUpdater; -import com.intellij.ide.util.treeView.AlphaComparator; -import com.intellij.ide.util.treeView.TreeBuilderUtil; +import com.intellij.ide.util.treeView.*; import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.ide.CopyPasteManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; @@ -38,6 +38,10 @@ import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; +import java.awt.*; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.awt.dnd.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.ArrayList; @@ -176,6 +180,7 @@ public abstract class AbstractProjectViewPSIPane extends AbstractProjectViewPane DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(null); DefaultTreeModel treeModel = new DefaultTreeModel(rootNode); myTree = createTree(treeModel); + DragSource.getDefaultDragSource().createDefaultDragGestureRecognizer(myTree, DnDConstants.ACTION_COPY_OR_MOVE, new MyDragGestureListener()); myComponent = new JScrollPane(myTree); myComponent.setBorder(BorderFactory.createEmptyBorder()); myTreeStructure = createStructure(); @@ -264,4 +269,84 @@ public abstract class AbstractProjectViewPSIPane extends AbstractProjectViewPane public JComponent getComponent() { return myComponent; } + + //------------- DnD for Favorites View ------------------- + + private static final DataFlavor[] FLAVORS; + private static final Logger LOG = Logger.getInstance("com.intellij.ide.projectView.ProjectViewImpl"); + + static { + DataFlavor[] flavors; + try { + final Class aClass = AbstractTreeNode.class; + flavors = new DataFlavor[]{new DataFlavor( + DataFlavor.javaJVMLocalObjectMimeType + ";class=" + aClass.getName(), FavoritesTreeViewPanel.ABSTRACT_TREE_NODE_TRANSFERABLE, + aClass.getClassLoader() + )}; + } + catch (ClassNotFoundException e) { + LOG.error(e); // should not happen + flavors = new DataFlavor[0]; + } + FLAVORS = flavors; + } + private class MyDragGestureListener implements DragGestureListener { + public void dragGestureRecognized(DragGestureEvent dge) { + if ((dge.getDragAction() & DnDConstants.ACTION_MOVE) == 0) return; + final Point dragOrigin = dge.getDragOrigin(); + final AbstractTreeNode draggableObject = findAbstractTreeNodeByLocation(dragOrigin); + if (draggableObject != null) { + try { + FavoritesViewImpl.getInstance(myProject).getCurrentTreeViewPanel().setDraggableObject(draggableObject); + final MyDragSourceListener dragSourceListener = new MyDragSourceListener(); + dge.startDrag(DragSource.DefaultMoveNoDrop, new Transferable() { + public DataFlavor[] getTransferDataFlavors() { + return FLAVORS; + } + + public boolean isDataFlavorSupported(DataFlavor flavor) { + DataFlavor[] flavors = getTransferDataFlavors(); + for (int i = 0; i < flavors.length; i++) { + if (flavor.equals(flavors[i])) { + return true; + } + } + return false; + } + + public Object getTransferData(DataFlavor flavor) { + return null; + } + }, dragSourceListener); + } + catch (InvalidDnDOperationException idoe) { + } + } + } + } + + private AbstractTreeNode findAbstractTreeNodeByLocation(final Point point) { + final int row = myTree.getRowForLocation(point.x, point.y); + final TreePath treePath = myTree.getPathForRow(row); + if (treePath.getLastPathComponent() instanceof DefaultMutableTreeNode){ + return (AbstractTreeNode)((DefaultMutableTreeNode)treePath.getLastPathComponent()).getUserObject(); + } + return null; + } + + private class MyDragSourceListener implements DragSourceListener { + public void dragEnter(DragSourceDragEvent dsde) { + dsde.getDragSourceContext().setCursor(null); + } + + public void dragOver(DragSourceDragEvent dsde) { + } + + public void dropActionChanged(DragSourceDragEvent dsde) { + dsde.getDragSourceContext().setCursor(null); + } + public void dragDropEnd(DragSourceDropEvent dsde) { } + + public void dragExit(DragSourceEvent dse) { } + } } \ No newline at end of file