DnD to Favorites

This commit is contained in:
Anna Kozlova
2005-03-11 23:53:03 +03:00
parent 695aeaf7e4
commit 976473d084
8 changed files with 259 additions and 59 deletions
@@ -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);
@@ -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<? extends AbstractTreeNode> getPsiElementNodeClass(PsiElement psiElement) {
private static Class<? extends AbstractTreeNode> getPsiElementNodeClass(PsiElement psiElement) {
Class<? extends AbstractTreeNode> 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();
@@ -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());
}
}
}
@@ -91,6 +91,11 @@ public class FavoritesTreeStructure extends ProjectAbstractTreeStructureBase imp
myFavorites.add(element);
}
//for tests only
public Set<AbstractTreeNode> 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<AbstractUrl> 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<Element> iterator = element.getChildren("favorite_root").iterator(); iterator.hasNext();) {
Element favorite = iterator.next();
final String klass = favorite.getAttributeValue("klass");
@@ -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<Object> result = new ArrayList<Object>();
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<AbstractTreeNode> children = ((AbstractTreeNode)myFavoritesTreeStructure.getRootElement()).getChildren();
for (Iterator<AbstractTreeNode> 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) {
}
}
}
@@ -23,17 +23,17 @@ import org.jdom.Element;
import java.util.*;
public class FavoritesViewImpl extends ContentManagerImpl implements ProjectComponent, JDOMExternalizable {
private Project myProject;
private Map<String, Content> myName2FavoritesListSet = new HashMap<String, Content>();
public String myCurrentFavoritesList;
private Map<String, AddToFavoritesAction> myActions = new HashMap<String, AddToFavoritesAction>();
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);
}
@@ -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;
}
@@ -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<AbstractTreeNode> 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) { }
}
}