package com.horstmann.violet.framework.graphics.content;
import com.horstmann.violet.framework.graphics.Separator;
import java.awt.*;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* This class groups together elements of type Content
*
* @author Adrian Bobrowski <adrian071993@gmail.com>
* @date 21.12.2015
*/
public abstract class Layout extends Content
{
/**
* @param beforeOffset
* @param content
* @return point offset relation to the previous point
*/
protected abstract Point2D getNextOffset(Point2D beforeOffset, Content content);
/**
* @param offset
* @return the starting point for the separator
*/
protected abstract Point2D getStartPointSeparator(Point2D offset);
/**
* @param offset
* @return the ending point for the separator
*/
protected abstract Point2D getEndPointSeparator(Point2D offset);
/**
* add a content to layout
* @param content
*/
public void add(Content content)
{
if(null == content)
{
throw new NullPointerException("Content can't be null");
}
content.addParent(this);
contents.add(content);
refresh();
}
/**
* removes a content from layout
* @param content
*/
public void remove(Content content)
{
if(null == content)
{
throw new NullPointerException("Content can't be null");
}
content.removeParent(this);
contents.remove(content);
refresh();
}
/**
* @return separator which separates the components in layout
*/
public final Separator getSeparator()
{
return separator;
}
/**
* sets a separator which separates the components in layout
* @param separator
*/
public final void setSeparator(Separator separator) {
if(null==separator)
{
separator = Separator.EMPTY;
}
this.separator = separator;
}
/**
* @return a list of elements in layout
*/
protected final List<Content> getContents()
{
return contents;
}
/**
* Refresh all the elements in layout
*
* @see Content#refreshDown()
*/
@Override
protected void refreshDown()
{
for (Content content: getContents())
{
content.refreshDown();
}
super.refreshDown();
}
/**
* @see Content#draw(Graphics2D)
*/
@Override
public final void draw(Graphics2D graphics)
{
Content content = null;
Point2D offset = new Point2D.Double(0,0);
Iterator<Content> iterator = contents.iterator();
if(iterator.hasNext())
{
content = iterator.next();
content.draw(graphics, offset);
}
while(iterator.hasNext())
{
offset = getNextOffset(offset, content);
content = iterator.next();
content.draw(graphics, offset);
separator.draw(graphics, getStartPointSeparator(offset), getEndPointSeparator(offset));
}
}
/**
* @param content
* @return locations of the content relative to the inside layout
*/
public Point2D getLocation(Content content)
{
int index = contents.indexOf(content);
Point2D offset = new Point2D.Double(0,0);
for(int i = 0; i < index; ++i)
{
offset = getNextOffset(offset, contents.get(i));
}
return offset;
}
private Separator separator = Separator.EMPTY;
private List<Content> contents = new ArrayList<Content>();
}