001/* 002 * Copyright (c) 2005 Einar Pehrson, Malin Johansson and Sofia Nilsson 003 * 004 * This file is part of 005 * CleanSheets Extension for Dependency Trees 006 * 007 * CleanSheets Extension for Dependency Trees is free software; you can 008 * redistribute it and/or modify it under the terms of the GNU General Public 009 * License as published by the Free Software Foundation; either version 2 of 010 * the License, or (at your option) any later version. 011 * 012 * CleanSheets Extension for Dependency Trees is distributed in the hope that 013 * it will be useful, but WITHOUT ANY WARRANTY; without even the implied 014 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 015 * See the GNU General Public License for more details. 016 * 017 * You should have received a copy of the GNU General Public License 018 * along with CleanSheets Extension for Dependency Trees; if not, write to the 019 * Free Software Foundation, Inc., 59 Temple Place, Suite 330, 020 * Boston, MA 02111-1307 USA 021 */ 022package csheets.ext.deptree; 023 024import javax.swing.tree.DefaultMutableTreeNode; 025import javax.swing.tree.DefaultTreeModel; 026 027import csheets.core.Cell; 028 029/** 030 * A tree node for a cell, to which child nodes are added dynamically 031 * when the node is expanded. 032 * @author Einar Pehrson 033 */ 034public abstract class CellNode extends DefaultMutableTreeNode { 035 036 /** The cell of the node. */ 037 private Cell cell; 038 039 /** If child nodes for the node's references have been added. */ 040 private boolean populated = false; 041 042 /** The data model to which the node belongs */ 043 protected DefaultTreeModel treeModel; 044 045 /** 046 * Creates a new cell node. 047 * @param cell the cell of the node 048 * @param treeModel the data model to which the node belongs 049 */ 050 public CellNode(Cell cell, DefaultTreeModel treeModel) { 051 super(cell); 052 053 // Stores members 054 this.cell = cell; 055 this.treeModel = treeModel; 056 } 057 058 /** 059 * Returns the cell of the node. 060 * @return the cell of the node. 061 */ 062 public Cell getCell() { 063 return cell; 064 } 065 066 /** 067 * Populates the cell node by adding child nodes for all its references. 068 */ 069 public void populate() { 070 if (!populated) { 071 populated = true; 072 addChildren(); 073 treeModel.nodeStructureChanged(this); 074 } 075 } 076 077 /** 078 * Adds children to the node. Invoked once, when the node is populated. 079 */ 080 protected abstract void addChildren(); 081}