/* * Copyright (c) 2008, 2009, 2010, 2011 Denis Tulskiy * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * version 3 along with this work. If not, see <http://www.gnu.org/licenses/>. */ package com.tulskiy.musique.library; import javax.swing.tree.TreeNode; import java.util.*; /** * Author: Denis Tulskiy * Date: 3/27/11 */ public class MappedTreeNode implements TreeNode, Comparable<MappedTreeNode> { private TreeMap<String, MappedTreeNode> children; private MappedTreeNode parent; private String name; MappedTreeNode(String name) { this.name = name; } @Override public int compareTo(MappedTreeNode o) { return toString().compareTo(o.toString()); } @Override public TreeNode getChildAt(int childIndex) { Iterator<MappedTreeNode> it = children.values().iterator(); for (int i = 0; i < childIndex; i++) { it.next(); } return it.next(); } public String getName() { return name; } public MappedTreeNode get(String object) { MappedTreeNode node = null; if (children != null) node = children.get(object); if (node == null) { node = new MappedTreeNode(new String(object)); add(node); } return node; } public void add(MappedTreeNode node) { if (children == null) { children = new TreeMap<String, MappedTreeNode>(); } children.put(node.getName(), node); node.setParent(this); } @Override public int getChildCount() { if (children == null) return 0; else return children.size(); } public void setParent(MappedTreeNode parent) { this.parent = parent; } @Override public TreeNode getParent() { return parent; } @Override public int getIndex(TreeNode node) { int i = 0; for (MappedTreeNode child : children.values()) { if (child.equals(node)) { return i; } i++; } return -1; } @Override public boolean getAllowsChildren() { return true; } @Override public boolean isLeaf() { return getChildCount() == 0; } @Override public Enumeration<MappedTreeNode> children() { return new Enumeration<MappedTreeNode>() { Iterator<MappedTreeNode> itr = children.values().iterator(); @Override public boolean hasMoreElements() { return itr.hasNext(); } @Override public MappedTreeNode nextElement() { return itr.next(); } }; } public List<MappedTreeNode> iterate() { List<MappedTreeNode> list = new ArrayList<MappedTreeNode>(); if (isLeaf()) { list.add(this); } if (children != null) { for (MappedTreeNode node : children.values()) { if (node.isLeaf()) { list.add(node); } else { list.addAll(node.iterate()); } } } return list; } @Override public String toString() { return name; } public void removeAllChildren() { if (children != null) { for (MappedTreeNode child : children.values()) { child.removeAllChildren(); } children.clear(); } } }