/platform/lang-impl/src/com/intellij/ide/favoritesTreeView/FavoritesPanel.java

https://bitbucket.org/nbargnesi/idea · Java · 201 lines · 166 code · 16 blank · 19 comment · 40 complexity · 0515345f91efcf911509d62c2f423433 MD5 · raw file

  1. /*
  2. * Copyright 2000-2011 JetBrains s.r.o.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.intellij.ide.favoritesTreeView;
  17. import com.intellij.ide.dnd.*;
  18. import com.intellij.ide.dnd.aware.DnDAwareTree;
  19. import com.intellij.ide.favoritesTreeView.actions.AddToFavoritesAction;
  20. import com.intellij.ide.projectView.impl.TransferableWrapper;
  21. import com.intellij.ide.util.treeView.AbstractTreeBuilder;
  22. import com.intellij.ide.util.treeView.AbstractTreeNode;
  23. import com.intellij.openapi.project.Project;
  24. import com.intellij.openapi.util.Disposer;
  25. import com.intellij.psi.PsiElement;
  26. import com.intellij.ui.awt.RelativeRectangle;
  27. import com.intellij.util.Function;
  28. import org.jetbrains.annotations.Nullable;
  29. import javax.swing.tree.DefaultMutableTreeNode;
  30. import javax.swing.tree.TreeNode;
  31. import javax.swing.tree.TreePath;
  32. import java.awt.*;
  33. import java.util.ArrayList;
  34. import java.util.Collection;
  35. import java.util.Collections;
  36. /**
  37. * @author Konstantin Bulenkov
  38. */
  39. public class FavoritesPanel {
  40. private Project myProject;
  41. private FavoritesTreeViewPanel myViewPanel;
  42. private DnDAwareTree myTree;
  43. private AbstractTreeBuilder myTreeBuilder;
  44. private FavoritesTreeStructure myTreeStructure;
  45. public FavoritesPanel(Project project) {
  46. myProject = project;
  47. myViewPanel = new FavoritesTreeViewPanel(myProject);
  48. myTree = myViewPanel.getTree();
  49. myTreeBuilder = myViewPanel.getBuilder();
  50. if (myTreeBuilder != null) {
  51. Disposer.register(myProject, myTreeBuilder);
  52. }
  53. myTreeStructure = myViewPanel.getFavoritesTreeStructure();
  54. setupDnD();
  55. }
  56. public FavoritesTreeViewPanel getPanel() {
  57. return myViewPanel;
  58. }
  59. private void setupDnD() {
  60. DnDSupport.createBuilder(myTree)
  61. .setBeanProvider(new Function<DnDActionInfo, DnDDragStartBean>() {
  62. @Override
  63. public DnDDragStartBean fun(DnDActionInfo info) {
  64. final TreePath path = myTree.getPathForLocation(info.getPoint().x, info.getPoint().y);
  65. if (path != null) {
  66. return new DnDDragStartBean(path);
  67. }
  68. return new DnDDragStartBean("");
  69. }
  70. })
  71. // todo process drag-and-drop here for tasks
  72. .setTargetChecker(new DnDTargetChecker() {
  73. @Override
  74. public boolean update(DnDEvent event) {
  75. final Object obj = event.getAttachedObject();
  76. if (obj instanceof TreePath) {
  77. event.setDropPossible(((TreePath)obj).getPathCount() > 2);
  78. return true;
  79. }
  80. if ("".equals(obj)) {
  81. event.setDropPossible(false);
  82. return false;
  83. }
  84. final Point p = event.getPoint();
  85. FavoritesListNode node = findFavoritesListNode(p);
  86. if (node != null) {
  87. TreePath pathToList = myTree.getPath(node);
  88. while (pathToList != null) {
  89. final Object pathObj = pathToList.getLastPathComponent();
  90. if (pathObj instanceof DefaultMutableTreeNode) {
  91. final Object userObject = ((DefaultMutableTreeNode)pathObj).getUserObject();
  92. if (userObject instanceof FavoritesTreeNodeDescriptor) {
  93. if (((FavoritesTreeNodeDescriptor)userObject).getElement() == node) {
  94. break;
  95. }
  96. }
  97. }
  98. pathToList = pathToList.getParentPath();
  99. }
  100. if (pathToList != null) {
  101. Rectangle bounds = myTree.getPathBounds(pathToList);
  102. if (bounds != null) {
  103. event.setHighlighting(new RelativeRectangle(myTree, bounds), DnDEvent.DropTargetHighlightingType.RECTANGLE);
  104. }
  105. }
  106. event.setDropPossible(true);
  107. return true;
  108. }
  109. event.setDropPossible(false);
  110. return false;
  111. }
  112. })
  113. .setDropHandler(new DnDDropHandler() {
  114. @Override
  115. public void drop(DnDEvent event) {
  116. final FavoritesListNode node = findFavoritesListNode(event.getPoint());
  117. final FavoritesManager mgr = FavoritesManager.getInstance(myProject);
  118. if (node == null) return;
  119. final String listTo = node.getValue();
  120. final Object obj = event.getAttachedObject();
  121. if (obj instanceof TreePath) {
  122. final TreePath path = (TreePath)obj;
  123. final String listFrom = getListNodeFromPath(path).getValue();
  124. if (listTo.equals(listFrom)) return;
  125. if (path.getPathCount() == 3) {
  126. final Object element = ((FavoritesTreeNodeDescriptor)((DefaultMutableTreeNode)path.getLastPathComponent()).getUserObject()).getElement().getValue();
  127. mgr.removeRootByElements(listFrom, Collections.singletonList(element));
  128. mgr.addRoots(listTo, null, element);
  129. }
  130. }
  131. else if (obj instanceof TransferableWrapper) {
  132. final PsiElement[] elements = ((TransferableWrapper)obj).getPsiElements();
  133. if (elements != null && elements.length > 0) {
  134. ArrayList<AbstractTreeNode> nodes = new ArrayList<AbstractTreeNode>();
  135. for (PsiElement element : elements) {
  136. final Collection<AbstractTreeNode> tmp = AddToFavoritesAction
  137. .createNodes(myProject, null, element, true, FavoritesManager.getInstance(myProject).getViewSettings());
  138. nodes.addAll(tmp);
  139. mgr.addRoots(listTo, nodes);
  140. }
  141. myTreeBuilder.select(nodes.toArray(), null);
  142. }
  143. }
  144. }
  145. })
  146. .setDisposableParent(myProject)
  147. .install();
  148. }
  149. @Nullable
  150. private TreeNode findListNode(String listName) {
  151. final Object root = myTree.getModel().getRoot();
  152. if (root instanceof DefaultMutableTreeNode) {
  153. final DefaultMutableTreeNode node = (DefaultMutableTreeNode)root;
  154. for (int i = 0; i < node.getChildCount(); i++) {
  155. final TreeNode listNode = node.getChildAt(i);
  156. if (listName.equals(listNode.toString())) {
  157. return listNode;
  158. }
  159. }
  160. }
  161. return null;
  162. }
  163. @Nullable
  164. private FavoritesListNode findFavoritesListNode(Point point) {
  165. final TreePath path = myTree.getPathForLocation(point.x, point.y);
  166. final FavoritesListNode node = getListNodeFromPath(path);
  167. return node == null ? (FavoritesListNode)((FavoritesRootNode)myTreeStructure.getRootElement()).getChildren().iterator().next()
  168. : node;
  169. }
  170. private static FavoritesListNode getListNodeFromPath(TreePath path) {
  171. if (path != null && path.getPathCount() > 1) {
  172. final Object o = path.getPath()[1];
  173. if (o instanceof DefaultMutableTreeNode) {
  174. final Object obj = ((DefaultMutableTreeNode)o).getUserObject();
  175. if (obj instanceof FavoritesTreeNodeDescriptor) {
  176. final AbstractTreeNode node = ((FavoritesTreeNodeDescriptor)obj).getElement();
  177. if (node instanceof FavoritesListNode) {
  178. return (FavoritesListNode)node;
  179. }
  180. }
  181. }
  182. }
  183. return null;
  184. }
  185. }