/*
* @(#)ListDrawingPart.java
*
* Copyright 2002 EGANTT LLP. All rights reserved.
* PROPRIETARY/QPL. Use is subject to license terms.
*/
package com.egantt.model.drawing.part;
import com.egantt.model.drawing.axis.AxisInterval;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* VectorModel is the default implementation of the DrawingModel and is
* designed to be used by as a default implementation in most situation.
*
* ToDo: needs support for Fake 3D + Graphics3D (4D)
*/
public class ListDrawingPart extends AbstractDrawingPart implements MutableDrawingPart
{
protected final Object painter;
protected final List <Object>keys;
protected final boolean summaryPart;
protected Map <Object, AxisInterval[]>intervals = new HashMap<Object, AxisInterval[]>();
protected Map <Object, Object>contexts = new HashMap<Object, Object>(); // EntryKey -- proxyKey
protected Map <Object, Object>painters = new HashMap<Object, Object>(); // EntryKey --> plotterKey
protected Map <Object, Object>states = new HashMap<Object, Object>(); // EntryKey -- proxyKey
public ListDrawingPart(Object keyValues[], Object painter) {
this (keyValues, painter, false);
}
public ListDrawingPart(Object keyValues[], Object painter, boolean summaryPart)
{
List <Object>keys = new ArrayList<Object>();
{
if (keyValues != null)
for (int i=0; i < keyValues.length; i++)
keys.add(i, keyValues[i]);
}
this.keys = keys;
this.painter = painter;
this.summaryPart = summaryPart;
}
// _________________________________________________________________________
public boolean isSummaryPart() {
return summaryPart;
}
// _________________________________________________________________________
public void add(Object key, AxisInterval intervals[], Object painter, Object state, Object context)
{
this.intervals.put(key, intervals);
// register the plotter & proxy
contexts.put(key, context);
painters.put(key, painter);
states.put(key, state);
}
// _________________________________________________________________________
public List <Object>keys()
{
return keys;
}
public Iterator values(AxisInterval intervals [])
{
List<Object> values = new ArrayList<Object>(this.intervals.size());
for (Iterator iter = this.intervals.entrySet().iterator(); iter.hasNext();)
{
Map.Entry entry = (Map.Entry) iter.next();
if (contains(intervals, (AxisInterval []) entry.getValue()))
values.add(entry.getKey());
}
return this.intervals.keySet().iterator();
}
// __________________________________________________________________________
public AxisInterval [] getInterval() {
AxisInterval[] results = null;
for (Iterator iter = intervals.values().iterator(); iter.hasNext();) {
AxisInterval values [] = (AxisInterval []) iter.next();
if (values == null)
continue;
// lazy load
if (results == null)
results = new AxisInterval[values.length];
for (int i=0; i < values.length; i++)
if (values[i] != null)
results[i] = values[i].union(results[i]);
}
return results;
}
public AxisInterval [] getInterval(Object o, AxisInterval intervals[])
{
AxisInterval values [] = (AxisInterval []) this.intervals.get(o);
if (values == null)
return null;
AxisInterval results [] = new AxisInterval[values.length];
for (int i=0; i < results.length; i++)
results[i] = values[i] != null || intervals.length <= i
? values[i] : intervals[i];
return results;
}
// __________________________________________________________________________
public Object getPainter()
{
return painter;
}
// __________________________________________________________________________
public Object getContext(Object key)
{
return contexts.get(key);
}
public Object getPainter(Object key)
{
return painters.get(key);
}
public Object getState(Object key)
{
return states.get(key);
}
// __________________________________________________________________________
public void setContext(Object key, Object value)
{
contexts.put(key, value);
}
public void setPainter(Object key, Object value)
{
painters.put(key, value);
}
public void setState(Object key, Object value)
{
states.put(key, value);
}
// ________________________________________________________________________
protected boolean contains(AxisInterval a [], AxisInterval b[])
{
for (int i=0; i < Math.min(a.length, b.length); i++)
if (b[i] != null && !a[i].contains(b[i]))
return false;
return true;
}
}