/*
* @(#)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;
}
}