mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
DnD to Favorites
This commit is contained in:
@@ -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) { }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user