/openFaces/source/org/openfaces/component/table/TreeTableSelection.java

https://github.com/chystoprudov-alex/OpenFaces · Java · 298 lines · 243 code · 37 blank · 18 comment · 89 complexity · a725945811b05c7ef9744c9f2d10be1d MD5 · raw file

  1. /*
  2. * OpenFaces - JSF Component Library 2.0
  3. * Copyright (C) 2007-2011, TeamDev Ltd.
  4. * licensing@openfaces.org
  5. * Unless agreed in writing the contents of this file are subject to
  6. * the GNU Lesser General Public License Version 2.1 (the "LGPL" License).
  7. * This library is distributed in the hope that it will be useful, but
  8. * WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. * Please visit http://openfaces.org/licensing/ for more details.
  11. */
  12. package org.openfaces.component.table;
  13. import javax.faces.FacesException;
  14. import javax.faces.component.UIComponent;
  15. import java.util.ArrayList;
  16. import java.util.List;
  17. /**
  18. * @author Dmitry Pikhulya
  19. */
  20. public abstract class TreeTableSelection extends AbstractTableSelection {
  21. protected TreeTable getTreeTable() {
  22. return (TreeTable) getTable();
  23. }
  24. @Override
  25. public void setParent(UIComponent parent) {
  26. if (parent != null && !(parent instanceof TreeTable))
  27. throw new FacesException(getClass().getName() + " component can only be placed in a TreeTable component, but it was placed into a component with class: " + parent.getClass().getName() + "; if you need to add selection support to a DataTable use SingleRowSelection or MultipleRowSelection component instead.");
  28. super.setParent(parent);
  29. }
  30. protected int getRowIndexByNodeKey(Object nodeKey) {
  31. TreeTable treeTable = getTreeTable();
  32. int rowCount = treeTable.getRowCount();
  33. for (int i = 0; i < rowCount; i++) {
  34. Object currentKey = treeTable.getNodeKey(i);
  35. if (currentKey != null && currentKey.equals(nodeKey))
  36. return i;
  37. }
  38. return -1;
  39. }
  40. protected int getRowIndexByNodeKeyPath(TreePath nodeKeyPath) {
  41. TreeTable treeTable = getTreeTable();
  42. int rowCount = treeTable.getRowCount();
  43. for (int i = 0; i < rowCount; i++) {
  44. TreePath currentKeyPath = treeTable.getNodeKeyPath(i);
  45. if (currentKeyPath.equals(nodeKeyPath))
  46. return i;
  47. }
  48. return -1;
  49. }
  50. protected int getRowIndexForPath(TreePath nodePath) {
  51. TreeTable treeTable = getTreeTable();
  52. int rowCount = treeTable.getRowCount();
  53. for (int i = 0; i < rowCount; i++) {
  54. TreePath currentPath = treeTable.getNodePath(i);
  55. if (currentPath.equals(nodePath))
  56. return i;
  57. }
  58. return -1;
  59. }
  60. protected Object getNodeKeyByData(Object nodeData) {
  61. TreePath keyPathByData = getKeyPathByData(nodeData);
  62. return (keyPathByData != null) ? keyPathByData.getValue() : null;
  63. }
  64. protected TreePath getNodePathByData(Object nodeData) {
  65. TreePath[] paths = new TreePath[2];
  66. getNodeAndKeyPathsByData(nodeData, paths);
  67. return paths[0];
  68. }
  69. protected TreePath getKeyPathByData(Object nodeData) {
  70. TreePath[] paths = new TreePath[2];
  71. getNodeAndKeyPathsByData(nodeData, paths);
  72. return paths[1];
  73. }
  74. protected void getNodeAndKeyPathsByData(Object nodeData, TreePath[] outputPaths) {
  75. TreeTable treeTable = getTreeTable();
  76. int rowCount = treeTable.getRowCount();
  77. for (int i = 0; i < rowCount; i++) {
  78. Object currentData = treeTable.getNodeData(i);
  79. if ((currentData == null && nodeData == null) || (currentData != null && currentData.equals(nodeData))) {
  80. TreePath nodePath = treeTable.getNodePath(i);
  81. TreePath keyPath = treeTable.getNodeKeyPath(i);
  82. outputPaths[0] = nodePath;
  83. outputPaths[1] = keyPath;
  84. return;
  85. }
  86. }
  87. TreeStructure treeStructure = treeTable.getTreeStructure();
  88. treeStructure.goToTopLevel();
  89. findKeyPathByData(treeStructure, nodeData, null, null, outputPaths);
  90. }
  91. private void findKeyPathByData(TreeStructure treeStructure, Object nodeData,
  92. TreePath parentPath, TreePath parentKeyPath, TreePath[] outputPaths) {
  93. int nodeCount = treeStructure.getNodeCount();
  94. for (int i = 0; i < nodeCount; i++) {
  95. treeStructure.setNodeIndex(i);
  96. if (!treeStructure.isNodeAvailable())
  97. break;
  98. Object currentNodeData = treeStructure.getNodeData();
  99. TreePath currentNodePath = new TreePath(currentNodeData, parentPath);
  100. TreePath currentKeyPath = new TreePath(treeStructure.getNodeKey(), parentKeyPath);
  101. if ((currentNodeData == null && nodeData == null) || (currentNodeData != null && currentNodeData.equals(nodeData))) {
  102. outputPaths[0] = currentNodePath;
  103. outputPaths[1] = currentKeyPath;
  104. return;
  105. }
  106. if (treeStructure.getNodeHasChildren() && !treeStructure.isEnteringInfiniteRecursion()) {
  107. treeStructure.goToChildLevel();
  108. findKeyPathByData(treeStructure, nodeData, currentNodePath, currentKeyPath, outputPaths);
  109. if (outputPaths[0] != null)
  110. return;
  111. treeStructure.goToParentLevel();
  112. }
  113. }
  114. }
  115. protected Object getNodeDataByKey(Object nodeKey) {
  116. TreePath nodePathByKey = getNodePathByKey(nodeKey);
  117. return nodePathByKey != null ? nodePathByKey.getValue() : null;
  118. }
  119. protected TreePath getNodePathByKey(Object nodeKey) {
  120. TreePath[] paths = new TreePath[2];
  121. getNodePathByKey(nodeKey, paths);
  122. return paths[0];
  123. }
  124. protected TreePath getKeyPathByKey(Object nodeKey) {
  125. TreePath[] paths = new TreePath[2];
  126. getNodePathByKey(nodeKey, paths);
  127. return paths[1];
  128. }
  129. private void getNodePathByKey(Object nodeKey, TreePath[] outputPaths) {
  130. TreeTable treeTable = getTreeTable();
  131. int rowCount = treeTable.getRowCount();
  132. for (int i = 0; i < rowCount; i++) {
  133. Object currentKey = treeTable.getNodeKey(i);
  134. if ((currentKey == null && nodeKey == null) || (currentKey != null && currentKey.equals(nodeKey))) {
  135. TreePath nodePath = treeTable.getNodePath(i);
  136. TreePath keyPath = treeTable.getNodeKeyPath(i);
  137. outputPaths[0] = nodePath;
  138. outputPaths[1] = keyPath;
  139. return;
  140. }
  141. }
  142. TreeStructure treeStructure = treeTable.getTreeStructure();
  143. treeStructure.goToTopLevel();
  144. findNodePathByKey(treeStructure, nodeKey, null, null, outputPaths);
  145. }
  146. private void findNodePathByKey(TreeStructure treeStructure, Object nodeKey,
  147. TreePath parentPath, TreePath parentKeyPath, TreePath[] outputPaths) {
  148. int nodeCount = treeStructure.getNodeCount();
  149. for (int i = 0; i < nodeCount; i++) {
  150. treeStructure.setNodeIndex(i);
  151. if (!treeStructure.isNodeAvailable())
  152. break;
  153. Object currentNodeKey = treeStructure.getNodeKey();
  154. TreePath nodePath = new TreePath(treeStructure.getNodeData(), parentPath);
  155. TreePath nodeKeyPath = new TreePath(treeStructure.getNodeKey(), parentKeyPath);
  156. if ((currentNodeKey == null && nodeKey == null) || (currentNodeKey != null && currentNodeKey.equals(nodeKey))) {
  157. outputPaths[0] = nodePath;
  158. outputPaths[1] = nodeKeyPath;
  159. return;
  160. }
  161. if (treeStructure.getNodeHasChildren() && !treeStructure.isEnteringInfiniteRecursion()) {
  162. treeStructure.goToChildLevel();
  163. findNodePathByKey(treeStructure, nodeKey, nodePath, nodeKeyPath, outputPaths);
  164. if (outputPaths[0] != null)
  165. return;
  166. treeStructure.goToParentLevel();
  167. }
  168. }
  169. }
  170. protected TreePath getNodePathByKeyPath(TreePath keyPath) {
  171. TreeTable treeTable = getTreeTable();
  172. int rowCount = treeTable.getRowCount();
  173. for (int i = 0; i < rowCount; i++) {
  174. TreePath currentKeyPath = treeTable.getNodeKeyPath(i);
  175. if (currentKeyPath.equals(keyPath))
  176. return treeTable.getNodePath(i);
  177. }
  178. List<Object> path = new ArrayList<Object>();
  179. for (TreePath p = keyPath; p != null; p = p.getParentPath())
  180. path.add(0, p.getValue());
  181. TreeStructure treeStructure = treeTable.getTreeStructure();
  182. treeStructure.goToTopLevel();
  183. return nodePathByKeyPath(treeStructure, path, null);
  184. }
  185. private TreePath nodePathByKeyPath(TreeStructure treeStructure, List<Object> path, TreePath parentNodePath) {
  186. while (true) {
  187. Object lookingForKey = path.remove(0);
  188. int i = 0;
  189. int count = treeStructure.getNodeCount();
  190. for (; i < count; i++) {
  191. treeStructure.setNodeIndex(i);
  192. Object currentKey = treeStructure.getNodeKey();
  193. if ((currentKey == null && lookingForKey == null) || (currentKey != null && currentKey.equals(lookingForKey))) {
  194. break;
  195. }
  196. }
  197. if (i == count) {
  198. return null;
  199. }
  200. TreePath foundNodePath = new TreePath(treeStructure.getNodeData(), parentNodePath);
  201. if (path.isEmpty()) {
  202. return foundNodePath;
  203. }
  204. if (!treeStructure.getNodeHasChildren()) {
  205. return null;
  206. }
  207. treeStructure.goToChildLevel();
  208. parentNodePath = foundNodePath;
  209. }
  210. }
  211. protected TreePath getKeyPathByNodePath(TreePath nodePath) {
  212. TreeTable treeTable = getTreeTable();
  213. int rowCount = treeTable.getRowCount();
  214. for (int i = 0; i < rowCount; i++) {
  215. TreePath currentNodePath = treeTable.getNodePath(i);
  216. if (currentNodePath.equals(nodePath))
  217. return treeTable.getNodeKeyPath(i);
  218. }
  219. List<Object> path = new ArrayList<Object>();
  220. for (TreePath p = nodePath; p != null; p = p.getParentPath())
  221. path.add(0, p.getValue());
  222. TreeStructure treeStructure = treeTable.getTreeStructure();
  223. treeStructure.goToTopLevel();
  224. return nodeKeyPathByPath(treeStructure, path, null);
  225. }
  226. private TreePath nodeKeyPathByPath(TreeStructure treeStructure, List<Object> path, TreePath parentKeyPath) {
  227. Object lookingForNode = path.remove(0);
  228. int i = 0;
  229. int count = treeStructure.getNodeCount();
  230. for (; i < count; i++) {
  231. treeStructure.setNodeIndex(i);
  232. Object currentNode = treeStructure.getNodeData();
  233. if ((currentNode == null && lookingForNode == null) || (currentNode != null && currentNode.equals(lookingForNode)))
  234. break;
  235. }
  236. if (i == count)
  237. return null;
  238. TreePath foundKeyPath = new TreePath(treeStructure.getNodeKey(), parentKeyPath);
  239. if (path.size() == 0)
  240. return foundKeyPath;
  241. if (!treeStructure.getNodeHasChildren())
  242. return null;
  243. treeStructure.goToChildLevel();
  244. return nodePathByKeyPath(treeStructure, path, foundKeyPath);
  245. }
  246. protected Object getNodeKeyByRowIndex(int index) {
  247. TreeTable treeTable = getTreeTable();
  248. Object nodeKey = treeTable.getNodeKey(index);
  249. return nodeKey;
  250. }
  251. protected TreePath getNodeKeyPathByRowIndex(int index) {
  252. TreeTable treeTable = getTreeTable();
  253. TreePath result = treeTable.getNodeKeyPath(index);
  254. return result;
  255. }
  256. /**
  257. * This method is only for internal usage from within the OpenFaces library. It shouldn't be used explicitly
  258. * by any application code.
  259. */
  260. public abstract List<TreePath> getSelectedNodeKeyPaths();
  261. }