content: /*
   * @(#)AbstractNavigatorModel.java
   *
   * Copyright 2002 EGANTT LLP. All rights reserved.
   * PROPRIETARY/QPL. Use is subject to license terms.
   */
  
  package com.egantt.swing.table.model.row.navigator;
  
  import com.egantt.data.Navigator;
  import com.egantt.swing.table.model.RowModel;
  
  /**
   * <code>NavigatorRowModel</code> is a Navigator expressed as a table
   * rather than a linked-list. It attempts to provide an interface to
   * a parse tree that has very little overhead.
   */
  public abstract class AbstractNavigatorModel implements RowModel
  {
  	protected Navigator navigator;
  	protected transient Object[] rows = new Object[0];
  	
  	// _________________________________________________________________________
  	
  	public void setNavigator(Navigator navigator)
  	{
  		this.navigator = navigator;
  	}
  	
  	// _________________________________________________________________________
  		
  	public int size()
  	{
  		rebuild();
  		return rows.length;
  	}
  	
  	// _________________________________________________________________________
  	
  	public final Object getValueAt(int row, int column)
  	{
  		return getValue(rows[row], column);
  	}
  	
  	public final void setValueAt(Object value, int row, int column)
  	{
  		setValue(rows[row], column, value);
  	}
  	
  	// _________________________________________________________________________
  	
  	protected final void rebuild()
  	{
  		ensureCapacity();
  		
  		int size = 0;
  		for (Object o = navigator.first(); o!= null; o = navigator.next())
  			rows[size++] = o;
  	}
  	
  	// _________________________________________________________________________
  	
  	protected abstract Object getValue(Object o, int col);
  	
  	protected abstract void setValue(Object o, int col, Object value);
  	
  	// _________________________________________________________________________
  	
  	/**
  	 *  note: this has the unfortunate effect of clearing the array under some
  	 *  circumstances therefore this method is private.
  	 */
  	private void ensureCapacity()
  	{
  		int size = 0;
  		for (Object o = navigator.first(); o != null; o = navigator.next())
  			size++;
  		
  		rows = size != rows.length ? new Object[size] : rows;
  	}
  }
  