package com.link_intersystems.gitdirstat.ui.treeobjects; import java.util.Collections; import java.util.Comparator; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.tree.DefaultMutableTreeNode; import org.apache.commons.beanutils.BeanToPropertyValueTransformer; import org.apache.commons.collections.comparators.TransformingComparator; import org.apache.commons.collections4.EnumerationUtils; import org.apache.commons.collections4.comparators.ReverseComparator; import com.link_intersystems.gitdirstat.domain.TreeObject; import com.link_intersystems.gitdirstat.domain.TreeObjectPath; import com.link_intersystems.gitdirstat.domain.TreeObjectSortBy; import com.link_intersystems.util.SortOrder; public class GitRepositoryTreeNode extends DefaultMutableTreeNode { private static final long serialVersionUID = -5276518794046807282L; private Map<TreeObject, DefaultMutableTreeNode> treeObject2Nodes = new HashMap<TreeObject, DefaultMutableTreeNode>(); public void deepSort(TreeObjectSortBy treeObjectSortOrder) { deepSort(this, treeObjectSortOrder, SortOrder.DESC); } public void deepSort(TreeObjectSortBy treeObjectSortOrder, SortOrder sortOrder) { deepSort(this, treeObjectSortOrder, sortOrder); } @SuppressWarnings("unchecked") private void deepSort(DefaultMutableTreeNode parent, TreeObjectSortBy sortBy, SortOrder order) { Enumeration<DefaultMutableTreeNode> treeObjectNodes = parent.children(); List<DefaultMutableTreeNode> treeNodes = EnumerationUtils .toList(treeObjectNodes); BeanToPropertyValueTransformer sortProperty = getSortByTransformer(sortBy); Comparator<DefaultMutableTreeNode> comparator = new TransformingComparator( sortProperty); if (SortOrder.DESC.equals(order)) { comparator = new ReverseComparator<DefaultMutableTreeNode>( comparator); } Collections.sort(treeNodes, comparator); parent.removeAllChildren(); for (DefaultMutableTreeNode childNode : treeNodes) { parent.add(childNode); deepSort(childNode, sortBy, order); } } @Override public void setUserObject(Object userObject) { treeObject2Nodes.clear(); super.setUserObject(userObject); treeObject2Nodes.put((TreeObject) userObject, this); } private BeanToPropertyValueTransformer getSortByTransformer( TreeObjectSortBy sortBy) { String sortProperty = null; switch (sortBy) { case NAME: sortProperty = "userObject.path.pathname"; break; case SIZE: sortProperty = "userObject.size"; break; default: sortProperty = "userObject"; break; } BeanToPropertyValueTransformer beanValueTransformer = new BeanToPropertyValueTransformer( sortProperty); return beanValueTransformer; } public DefaultMutableTreeNode addTreeObject(TreeObject treeObject) { TreeObjectPath treeObjectPath = treeObject.getPath(); Enumeration<TreeObject> treePathEnumeration = treeObjectPath .enumerate(); DefaultMutableTreeNode previousNode = null; while (treePathEnumeration.hasMoreElements()) { TreeObject pathSegment = treePathEnumeration.nextElement(); DefaultMutableTreeNode treeNode = treeObject2Nodes.get(pathSegment); if (treeNode == null) { treeNode = new DefaultMutableTreeNode(pathSegment); if (previousNode != null) { previousNode.add(treeNode); } treeObject2Nodes.put(pathSegment, treeNode); } previousNode = treeNode; } return previousNode; } public DefaultMutableTreeNode findTreeNode(TreeObject treeObject) { return treeObject2Nodes.get(treeObject); } }