package jadex.rules.test.rulesystem;
import jadex.commons.SUtil;
import java.awt.Color;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* A table in the blocks-world.
* In contrast to a block, a table may have multiple blocks on top.
*/
public class Table extends Block
{
//-------- attributes --------
/** The name of the table. */
protected String name;
/** The blocks located on top of the table. */
protected List blocks;
//-------- constructors --------
/**
* Create a new table.
*/
public Table()
{
this("Table", new Color(64, 32, 32));
}
/**
* Create a new table.
* @param name The name of the table.
* @param color The color of the table.
*/
public Table(String name, Color color)
{
super(-1, color, null);
this.name = name;
this.blocks = new ArrayList();
}
//-------- methods --------
/**
* The table is always clear.
*/
public boolean isClear()
{
return true;
}
/**
* Create a string representation of this block.
*/
public String toString()
{
return name;
}
/**
* Get all blocks on the table.
* Also returns blocks which are located on other blocks on the table.
*/
public Block[] getAllBlocks()
{
List ret = new ArrayList(blocks);
for(int i=0; i<ret.size(); i++)
{
Block b = (Block)ret.get(i);
if(b.upper!=null)
ret.add(b.upper);
}
return (Block[])ret.toArray(new Block[ret.size()]);
}
/**
* Get the stacks on the table.
*/
public Block[][] getStacks()
{
Block[][] stacks = new Block[blocks.size()][];
for(int i=0; i<stacks.length; i++)
{
List ret = new ArrayList();
Block b = (Block)blocks.get(i);
while(b!=null)
{
ret.add(b);
b = b.upper;
}
stacks[i] = (Block[])ret.toArray(new Block[ret.size()]);
}
return stacks;
}
/**
* clear all blocks from the table.
*/
public void clear()
{
Block[] all = getAllBlocks();
for(int i=all.length-1; i>=0; i--)
all[i].stackOn(null);
}
/**
* Check if two configurations are equal.
*/
public boolean configurationEquals(Table table)
{
boolean ret = false;
if(blocks.size()==table.blocks.size())
{
// Iterate through base blocks.
ret = true;
for(Iterator i=blocks.iterator(); ret && i.hasNext(); )
{
Block block = (Block)i.next();
int index = table.blocks.indexOf(block);
if(index!=-1)
{
// Traverse and compare corresponding stacks.
Block block2 = (Block)table.blocks.get(index);
while((block!=null || block2!=null)
&& (ret=SUtil.equals(block, block2)))
{
block = block.upper;
block2 = block2.upper;
}
}
else
{
ret = false;
}
}
}
return ret;
}
/**
* Add a block to this block.
*/
protected void addBlock(Block block)
{
blocks.add(block);
this.pcs.firePropertyChange("blocks", null, block);
}
/**
* Remove a block from this block.
*/
protected void removeBlock(Block block)
{
blocks.remove(block);
this.pcs.firePropertyChange("blocks", block, null);
}
/**
* Get the blocks.
* @return The blocks.
*/
public List getBlocks()
{
return blocks;
}
}