/* * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Oracle or the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package components; import javax.swing.event.TreeModelEvent; import javax.swing.event.TreeModelListener; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; import java.util.Vector; public class GenealogyModel implements TreeModel { private boolean showAncestors; private Vector treeModelListeners = new Vector(); private Person rootPerson; public GenealogyModel(Person root) { showAncestors = false; rootPerson = root; } /** * Used to toggle between show ancestors/show descendant and * to change the root of the tree. */ public void showAncestor(boolean b, Object newRoot) { showAncestors = b; Person oldRoot = rootPerson; if (newRoot != null) { rootPerson = (Person)newRoot; } fireTreeStructureChanged(oldRoot); } //////////////// Fire events ////////////////////////////////////////////// /** * The only event raised by this model is TreeStructureChanged with the * root as path, i.e. the whole tree has changed. */ protected void fireTreeStructureChanged(Person oldRoot) { int len = treeModelListeners.size(); TreeModelEvent e = new TreeModelEvent(this, new Object[] {oldRoot}); for (TreeModelListener tml : treeModelListeners) { tml.treeStructureChanged(e); } } //////////////// TreeModel interface implementation /////////////////////// /** * Adds a listener for the TreeModelEvent posted after the tree changes. */ public void addTreeModelListener(TreeModelListener l) { treeModelListeners.addElement(l); } /** * Returns the child of parent at index index in the parent's child array. */ public Object getChild(Object parent, int index) { Person p = (Person)parent; if (showAncestors) { if ((index > 0) && (p.getFather() != null)) { return p.getMother(); } return p.getFather(); } return p.getChildAt(index); } /** * Returns the number of children of parent. */ public int getChildCount(Object parent) { Person p = (Person)parent; if (showAncestors) { int count = 0; if (p.getFather() != null) { count++; } if (p.getMother() != null) { count++; } return count; } return p.getChildCount(); } /** * Returns the index of child in parent. */ public int getIndexOfChild(Object parent, Object child) { Person p = (Person)parent; if (showAncestors) { int count = 0; Person father = p.getFather(); if (father != null) { count++; if (father == child) { return 0; } } if (p.getMother() != child) { return count; } return -1; } return p.getIndexOfChild((Person)child); } /** * Returns the root of the tree. */ public Object getRoot() { return rootPerson; } /** * Returns true if node is a leaf. */ public boolean isLeaf(Object node) { Person p = (Person)node; if (showAncestors) { return ((p.getFather() == null) && (p.getMother() == null)); } return p.getChildCount() == 0; } /** * Removes a listener previously added with addTreeModelListener(). */ public void removeTreeModelListener(TreeModelListener l) { treeModelListeners.removeElement(l); } /** * Messaged when the user has altered the value for the item * identified by path to newValue. Not used by this model. */ public void valueForPathChanged(TreePath path, Object newValue) { System.out.println("*** valueForPathChanged : " + path + " --> " + newValue); } }