package com.link_intersystems.gitdirstat.ui.treeobjects;
import java.util.Iterator;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import org.apache.commons.collections4.IteratorUtils;
import org.apache.commons.collections4.Transformer;
import org.apache.commons.collections4.iterators.EnumerationIterator;
import com.link_intersystems.gitdirstat.domain.TreeObject;
import com.link_intersystems.gitdirstat.domain.TreeObjectSortBy;
import com.link_intersystems.util.SortOrder;
public class TreeObjectsTreeModel extends DefaultTreeModel {
private static final long serialVersionUID = 1L;
private TreeObjectSortBy treeObjectSortBy = TreeObjectSortBy.SIZE;
private SortOrder sortOrder = SortOrder.DESC;
public TreeObjectsTreeModel() {
super(new GitRepositoryTreeNode());
}
public void setSorting(TreeObjectSortBy treeObjectSortBy,
SortOrder sortOrder) {
this.treeObjectSortBy = treeObjectSortBy;
this.sortOrder = sortOrder;
GitRepositoryTreeNode workdirTreeNode = (GitRepositoryTreeNode) getRoot();
workdirTreeNode.deepSort(treeObjectSortBy, sortOrder);
fireTreeStructureChanged();
}
private void fireTreeStructureChanged() {
GitRepositoryTreeNode workdirTreeNode = (GitRepositoryTreeNode) getRoot();
fireTreeStructureChanged(this, new Object[] { workdirTreeNode },
new int[0], new Object[0]);
}
public void setCommitRangeTree(TreeObject commitRangeTree) {
GitRepositoryTreeNode gitRepositoryTreeNode = (GitRepositoryTreeNode) getRoot();
gitRepositoryTreeNode.removeAllChildren();
if (commitRangeTree == null) {
return;
}
gitRepositoryTreeNode.setUserObject(commitRangeTree);
createTreeObjectNodes(gitRepositoryTreeNode, commitRangeTree);
gitRepositoryTreeNode.deepSort(treeObjectSortBy, sortOrder);
fireTreeStructureChanged();
}
private void createTreeObjectNodes(
GitRepositoryTreeNode gitRepositoryTreeNode,
TreeObject commitRangeTree) {
Iterator<Object> leafNodeIterator = createLeafNodeIterator(commitRangeTree);
while (leafNodeIterator.hasNext()) {
TreeObject treeObject = (TreeObject) leafNodeIterator.next();
gitRepositoryTreeNode.addTreeObject(treeObject);
}
}
private Iterator<Object> createLeafNodeIterator(TreeObject commitRangeTree) {
Iterator<Object> objectGraphIterator = IteratorUtils
.objectGraphIterator(commitRangeTree,
new TreeObjectLeafNodeTransformer());
return objectGraphIterator;
}
private class TreeObjectLeafNodeTransformer implements
Transformer<Object, Object> {
@Override
public Object transform(Object input) {
fireTreeStructureChanged();
if (input instanceof TreeObject) {
TreeObject treeObject = (TreeObject) input;
if (treeObject.isFile()) {
return treeObject;
} else {
return new EnumerationIterator<TreeObject>(
treeObject.children());
}
}
Class<?> clazz = null;
if (input != null) {
clazz = input.getClass();
}
throw new ClassCastException("Can only handle TreeObjects but was "
+ clazz);
}
}
public TreePath getTreePath(TreeObject treeObject) {
GitRepositoryTreeNode gitRepositoryTreeNode = (GitRepositoryTreeNode) getRoot();
DefaultMutableTreeNode treeNode = gitRepositoryTreeNode
.findTreeNode(treeObject);
TreePath treePath = null;
if (treeNode != null) {
treePath = new TreePath(treeNode.getPath());
}
return treePath;
}
}