package jas.plot;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.LayoutManager2;
public class ChartLayout implements LayoutManager2
{
public void addLayoutComponent(Component c, Object constraints)
{
if (c instanceof Title) title = (Title) c;
if (c instanceof DataArea) data = (DataArea) c;
if (c instanceof Legend) legend = (Legend) c;
if (c instanceof TextBlock) stats = (TextBlock) c;
}
public void addLayoutComponent(String s, Component c)
{
addLayoutComponent(c,s);
}
public void removeLayoutComponent(Component c)
{
if (c == title) title = null;
if (c == data ) data = null;
if (c == legend) legend = null;
if (c == stats) stats = null;
}
public void layoutContainer(Container parent)
{
Dimension parentSize = parent.getSize();
int titleOffset = 0;
if (title != null && title.isVisible())
{
Dimension size = title.getPreferredSize();
if ( ! title.hasBeenResized() )
title.setSize(parentSize.width-pad-pad,size.height);
if ( ! title.hasBeenMoved() )
title.setLocation(pad,pad);
titleOffset += size.height;
}
if (data != null )
{
if ( ! data.hasBeenResized() )
data.setSize(parentSize.width-pad-pad,parentSize.height-pad-pad-titleOffset);
if ( ! data.hasBeenMoved() )
data.setLocation(pad,pad+titleOffset);
}
if (legend != null && legend.isVisible())
{
// Position legend at top, right corner of data area by default
Dimension ls = legend.getPreferredSize();
if ( ! legend.hasBeenMoved() )
legend.setLocation(parentSize.width - pad - ls.width , pad+titleOffset);
if ( ! legend.hasBeenResized() )
legend.setSize(ls);
titleOffset += ls.height + pad;
}
if (stats != null && stats.isVisible())
{
// Position stats at top, right corner of data area, below legend
Dimension ss = stats.getPreferredSize();
if ( ! stats.hasBeenMoved() )
stats.setLocation(parentSize.width - pad - ss.width , pad+titleOffset);
if ( ! stats.hasBeenResized() )
stats.setSize(ss);
}
}
public Dimension minimumLayoutSize(Container parent)
{
return preferredLayoutSize(parent);
}
public Dimension maximumLayoutSize(Container parent)
{
return preferredLayoutSize(parent);
}
public Dimension preferredLayoutSize(Container parent)
{
return title != null ? title.getPreferredSize() : new Dimension(10,10);
}
/**
* Returns the alignment along the x axis. This specifies how
* the component would like to be aligned relative to other
* components. The value should be a number between 0 and 1
* where 0 represents alignment along the origin, 1 is aligned
* the furthest away from the origin, 0.5 is centered, etc.
*/
public float getLayoutAlignmentX(Container parent)
{
return 0.5f;
}
/**
* Returns the alignment along the y axis. This specifies how
* the component would like to be aligned relative to other
* components. The value should be a number between 0 and 1
* where 0 represents alignment along the origin, 1 is aligned
* the furthest away from the origin, 0.5 is centered, etc.
*/
public float getLayoutAlignmentY(Container parent)
{
return 0.5f;
}
/**
* Invalidates the layout, indicating that if the layout manager
* has cached information it should be discarded.
*/
public void invalidateLayout(Container target)
{
}
void restoreDefaultLayout()
{
if (legend != null) legend.restoreDefaultLayout();
if (title != null) title.restoreDefaultLayout();
if (stats != null) stats.restoreDefaultLayout();
if (data != null) data.restoreDefaultLayout();
}
boolean hasDefaultLayout()
{
boolean result = true;
if (legend != null) result &= legend.hasDefaultLayout();
if (title != null) result &= title.hasDefaultLayout();
if (stats != null) result &= stats.hasDefaultLayout();
if (data != null) result &= data.hasDefaultLayout();
return result;
}
private Legend legend;
private DataArea data;
private Title title;
private TextBlock stats;
private static final int pad = 5;
}