package org.rr.jeborker.gui.model;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.logging.Level;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import org.rr.commons.log.LoggerFactory;
import org.rr.commons.mufs.IResourceHandler;
import org.rr.commons.mufs.ResourceHandlerFactory;
import org.rr.commons.swing.components.tree.NamedNode;
import org.rr.commons.swing.components.tree.TreeUtil;
import org.rr.commons.utils.ListUtils;
import org.rr.jeborker.app.preferences.APreferenceStore;
import org.rr.jeborker.app.preferences.PreferenceStoreFactory;
public class BasePathTreeModel extends AbstractFileTreeModel {
private static final long serialVersionUID = 1442592632931949573L;
private static final UniqueAllEntryNode singletonUniqueAllEntryNode = new UniqueAllEntryNode();
private DefaultMutableTreeNode root;
private TreePath filterTreePath;
public BasePathTreeModel() {
super(new DefaultMutableTreeNode("root"));
this.root = (DefaultMutableTreeNode) getRoot();
this.init();
}
public TreePath getFilterTreePath() {
return filterTreePath;
}
public void setFilterTreePath(TreePath filterTreePath) {
this.filterTreePath = filterTreePath;
}
private void init() {
final APreferenceStore preferenceStore = PreferenceStoreFactory.getPreferenceStore(PreferenceStoreFactory.DB_STORE);
final List<String> basePath = new ArrayList<>(preferenceStore.getBasePath());
for(String path : basePath) {
IResourceHandler resourceHandler = ResourceHandlerFactory.getResourceHandler(path);
FileSystemNode basePathNode = new FileSystemNode(resourceHandler, null, false);
root.add(basePathNode);
}
root.add(singletonUniqueAllEntryNode);
}
/**
* Reloads the model. Changes will be taken under account.
*/
public void reload() {
root.removeAllChildren();
init();
try {
super.reload();
} catch(Exception e) {
//happens for example if the tree is in edit mode.
LoggerFactory.getLogger().log(Level.WARNING, "Reloading nodes has failed", e);
}
}
public TreePath restoreExpansionState(JTree tree, IResourceHandler resourceHandler, List<String> fullPathSegments) {
final APreferenceStore preferenceStore = PreferenceStoreFactory.getPreferenceStore(PreferenceStoreFactory.DB_STORE);
final String basePathFor = preferenceStore.getBasePathFor(resourceHandler);
final int segments = ResourceHandlerFactory.getResourceHandler(basePathFor).getPathSegments().size() - 1;
final List<String> basePathSegements = ListUtils.extract(fullPathSegments, segments, fullPathSegments.size());
final String treeExpansionPathString = ListUtils.join(basePathSegements, TreeUtil.PATH_SEPARATOR);
final TreePath lastExpandedRow = TreeUtil.restoreExpanstionState(tree, treeExpansionPathString);
return lastExpandedRow;
}
/**
* This is a special node and did not represents a base path. It's the "All Entries" node
* that allows to toggle the visibility of all base path nodes.
*/
private static class UniqueAllEntryNode implements MutableTreeNode, NamedNode, Comparable<UniqueAllEntryNode> {
private static final int HASH_CODE = UniqueAllEntryNode.class.getName().hashCode();
private String localizedName;
private TreeNode parent;
UniqueAllEntryNode() {
localizedName = Bundle.getString("BasePathTreeModel.nodeName.all");
}
@Override
public TreeNode getChildAt(int childIndex) {
return null;
}
@Override
public int getChildCount() {
return 0;
}
@Override
public TreeNode getParent() {
return this.parent;
}
@Override
public int getIndex(TreeNode node) {
return 0;
}
@Override
public boolean getAllowsChildren() {
return false;
}
@Override
public boolean isLeaf() {
return true;
}
@Override
public Enumeration<?> children() {
return null;
}
@Override
public String getName() {
return this.localizedName;
}
public String toString() {
return this.localizedName;
}
@Override
public void insert(MutableTreeNode child, int index) {
}
@Override
public void remove(int index) {
}
@Override
public void remove(MutableTreeNode node) {
}
@Override
public void setUserObject(Object object) {
}
@Override
public void removeFromParent() {
}
@Override
public void setParent(MutableTreeNode newParent) {
this.parent = newParent;
}
@Override
public int compareTo(UniqueAllEntryNode o) {
return 0;
}
public boolean equals(Object o) {
if(o instanceof UniqueAllEntryNode) {
return true;
}
return false;
}
@Override
public int hashCode() {
return HASH_CODE;
}
}
}