package reportgen.ren.report.extendedformat.range;
import java.util.List;
import reportgen.ren.report.extendedformat.range.generic.ColRowRangeGeneric;
import reportgen.ren.report.extendedformat.range.group.ColRowRangeGroup;
import reportgen.ren.report.extendedformat.cell.CellContainer;
import java.util.ArrayList;
import java.util.LinkedList;
import org.jdom.Element;
import reportgen.prototype.context.Context;
import reportgen.utils.ReportException;
import reportgen.ren.report.extendedformat.range.cross.ColRowRangeCrossReport;
import reportgen.prototype.utils.ItemListSingle;
/**
* Список диапазонов расширенного форматирования.
* Обычный список который умеет сохранять/загружать себя из ХМЛ
*/
public class ColRowRangeList
extends ItemListSingle<ColRowRange, Context> {
private CellContainer cellContainer;
private final ColRowRange parent;
private final Context context;
public ColRowRangeList(ColRowRange parent, Context context) {
this.parent = parent;
this.context = context;
}
public ColRowRangeList(Element element, Context context, ColRowRange parent) throws ReportException {
super(element, context);
this.context = context;
this.parent = parent;
}
/**
* VERY UGLY
* @param root
* @param context
* @throws ReportException
*/
@Override
protected void loadChildren(Element root, Context context) throws ReportException {
//prepare range context
RangeContext localContext = new RangeContext(context) {
@Override
public List<ColRowRange> getRanges() {
List<ColRowRange> ranges = new LinkedList<ColRowRange>();
ranges.addAll(getList());
return ranges;
}
};
//load children
super.loadChildren(root, localContext);
//load cross-refrences
for(ColRowRange item : getList()) {
Element el = localContext.get(item);
if(el != null) {
item.initExtraLinks(el, localContext);
}
}
}
@Override
protected ColRowRange loadChild(Element el, Context prototype) throws ReportException {
if(el.getName().equals(ColRowRangeGeneric.TAG)) {
return new ColRowRangeGeneric(el, (RangeContext)prototype);
} else if(el.getName().equals(ColRowRangeGroup.TAG)) {
return new ColRowRangeGroup(el, (RangeContext)prototype);
} else if(el.getName().equals(ColRowRangeCrossReport.TAG)) {
//грязный хак
return new ColRowRangeCrossReport(el, (RangeContext)prototype);
}
return null;
}
@Override
protected String getRootTag() {
return "inner";
}
@Override
protected boolean isItemContains(ColRowRange item, Object obj) {
return item.isContain(obj);
}
@Override
protected void validateItem(ColRowRange item) throws ReportException {
item.validate();
}
public void setCellContainer(CellContainer cellContainer) {
this.cellContainer = cellContainer;
for (ColRowRange r: getList()) {
r.setCellContainer(cellContainer);
}
}
protected CellContainer getCellContainer() {
return cellContainer;
}
public ArrayList<ColRowRange> getFlat(ArrayList<ColRowRange> range) {
for (ColRowRange r: getList()) {
r.getFlat(range);
}
return range;
}
@Override
protected void onAdd(ColRowRange value) {
super.onAdd(value);
value.setCellContainer(cellContainer);
CellContainer cells = getCellContainer();
if(cells != null) {
cells.onAddCol(parent, value);
}
}
@Override
protected void onRemove(ColRowRange value) throws ReportException {
super.onRemove(value);
if(value.getInner().size() > 0) {
throw new ReportException("Сначала нужно удалить все дочерние диапазоны");
}
for (ColRowRange c : getList()) {
if (c == value) {
continue;
}
c.onRemoveAtom(value.getAtom());
}
getCellContainer().removedRange(parent, value);
}
public RangeContext getContext() {
return new RangeContext(context) {
@Override
public List<ColRowRange> getRanges() {
List<ColRowRange> ranges = new LinkedList<ColRowRange>();
ranges.addAll(getList());
return ranges;
}
};
}
}