package edu.byu.cs.roots.opg.model;
import java.io.Serializable;
import java.util.ArrayList;
import edu.byu.cs.roots.opg.chart.ChartDrawInfo;
import edu.byu.cs.roots.opg.chart.ChartMaker;
import edu.byu.cs.roots.opg.chart.ChartOptions;
import edu.byu.cs.roots.opg.chart.ChartType;
import edu.byu.cs.roots.opg.chart.cmds.DrawCommand;
import edu.byu.cs.roots.opg.chart.multisheet.MultisheetChartMaker;
public class OpgPage implements Serializable
{
private static final long serialVersionUID = 1L;
private ArrayList<ChartOptions> pageOptions;
private ArrayList<ChartMaker> pageMakers;
private ArrayList<ImageFile> pageImages;
private ArrayList<Integer> pageOffsets;
private ArrayList<ChartDrawInfo> charts;
private double remainingHeight;
private double pageHeight;
private double pageWidth;
private double pageMinimumHeight;
public OpgPage(){
pageOptions = new ArrayList<ChartOptions>();
ChartOptions options = new ChartOptions();
pageOptions.add(options);
pageMakers = new ArrayList<ChartMaker>();
pageOffsets = new ArrayList<Integer>();
pageImages = new ArrayList<ImageFile>();
charts = new ArrayList<ChartDrawInfo>();
remainingHeight = 0d;
pageHeight = 0;
pageWidth = 0;
}
/**
* Used when the chart type is changed
*/
public OpgPage(ChartOptions options, ChartType type, OpgSession session){
pageMakers = new ArrayList<ChartMaker>();
ChartMaker toAdd = type.getMaker();
toAdd.setIsPrimaryMaker(true);
pageMakers.add(toAdd);
pageOptions = new ArrayList<ChartOptions>();
pageOptions.add(pageMakers.get(0).convertToSpecificOptions(options));
pageOffsets = new ArrayList<Integer>();
pageOffsets.add(0);
pageImages = new ArrayList<ImageFile>();
charts = new ArrayList<ChartDrawInfo>();
remainingHeight = session.getOpgOptions().getPreferredLength();
}
/**
* Used when adding a new maker
*/
public OpgPage(ChartOptions options, ChartType type, Individual root, OpgSession session){
pageMakers = new ArrayList<ChartMaker>();
pageOptions = new ArrayList<ChartOptions>();
pageOffsets = new ArrayList<Integer>();
pageOffsets.add(0);
pageImages = new ArrayList<ImageFile>();
charts = new ArrayList<ChartDrawInfo>();
ChartMaker temp = type.getMaker();
temp.setIsPrimaryMaker(false);
pageMakers.add(temp);
ChartOptions tempOptions = temp.convertToSpecificOptions(new ChartOptions(options));
tempOptions.setRoot(root, session);
pageOptions.add(tempOptions);
int size = pageMakers.size()-1;
double addedHeight = session.getChartHeight(pageMakers.get(size), pageOptions.get(size));
remainingHeight = session.getOpgOptions().getPreferredLength();
remainingHeight -= addedHeight;
}
public ChartMaker addMaker(ChartType type, Individual root, int genOffset, OpgSession session){
ChartMaker temp = type.getMaker();
temp.setIsPrimaryMaker(false);
if (type == ChartType.MULTISHEET){
((MultisheetChartMaker) temp).setGenOffset(genOffset);
}
if(pageMakers.size() == 1)
{
Individual firstRoot = pageOptions.get(0).getRoot();
firstRoot.pageId.setItem(firstRoot.pageId.getItem()+":1");
}
pageMakers.add(temp);
ChartOptions tempOptions = temp.convertToSpecificOptions(new ChartOptions(getFirstOptions()));
tempOptions.setRoot(root, session);
pageOptions.add(tempOptions);
int size = pageMakers.size()-2;
// if(pageMakers.size() == 1)
// pageOffsets.add(0);
// else
// pageOffsets.add(pageOffsets.get(pageOffsets.size()-2)+(int)session.getChartHeight(pageMakers.get(size), pageOptions.get(size)));
pageOffsets.add(0);
size = pageMakers.size()-1;
double addedHeight = session.getChartHeight(pageMakers.get(size), pageOptions.get(size));
remainingHeight -= addedHeight;
return temp;
}
private ArrayList<ChartDrawInfo> getCharts(OpgSession session){
charts = new ArrayList<ChartDrawInfo>();
boolean landscape = getFirstOptions().isLandscape();
if(pageMakers.get(0) != null){
pageHeight = 0;
pageWidth = 0;
pageMinimumHeight = 0;
for (int i = 0; i < pageMakers.size(); i++){
ChartDrawInfo toAdd = pageMakers.get(i).getChart(pageOptions.get(i), session);
toAdd.setYOffset(pageOffsets.get(i));
charts.add(toAdd);
if(landscape){
pageHeight += toAdd.getXExtent();
pageWidth = toAdd.getYExtent();
}else{
pageHeight += toAdd.getYExtent();
pageWidth = toAdd.getXExtent();
}
// if (pageWidth == 0)
// pageWidth = getFirstOptions().isLandscape()?toAdd.getYExtent():toAdd.getXExtent();
// pageHeight += getFirstOptions().isLandscape()?toAdd.getXExtent():toAdd.getYExtent();
pageMinimumHeight+=pageOptions.get(i).getMinPaperLength();
}
}
return charts;
}
public ArrayList<ChartDrawInfo> processCharts(OpgSession session){
charts = new ArrayList<ChartDrawInfo>();
try{
if(session.state == SessionState.edit){
}
if (session.state == SessionState.view)
charts.add(session.hollowchart);
else{
if (session.record != null){
charts = getCharts(session);
}
else{
charts.add(session.hollowchart);
}
}
}
catch(Exception e){
}
return charts;
}
public ChartOptions getOptions(int n){
if (n >= pageOptions.size())
return null;
else
return pageOptions.get(n);
}
public ChartOptions getFirstOptions(){
if (pageOptions != null && pageOptions.size() > 0)
return pageOptions.get(0);
return null;
}
public ArrayList<ChartOptions> getOptionsList(){
return pageOptions;
}
public ChartMaker getMaker(int n){
if (n >= pageOptions.size())
return null;
else
return pageMakers.get(n);
}
public ChartMaker getFirstMaker(){
if (pageMakers != null && pageMakers.size() > 0)
return pageMakers.get(0);
return null;
}
public ArrayList<ChartMaker> getMakerList(){
return pageMakers;
}
public int getChartCount(){
if (pageMakers == null)
return -1;
return pageMakers.size();
}
public ArrayList<ImageFile> getImages(){return pageImages;}
public double getRemainingHeight(){return remainingHeight;}
public double getPageHeight(){return pageHeight;}
public double getPageWidth(){return pageWidth;}
public double getPageMinimumHeight(){return pageMinimumHeight;}
public ChartMaker getMakerByRoot(String id){
for (int i = 0; i < pageOptions.size(); i++){
if(pageOptions.get(i).getRoot().id.contentEquals(id))
return pageMakers.get(i);
}
return null;
}
public ChartOptions getOptionsByRoot(String id){
for (int i = 0; i < pageOptions.size(); i++){
if(pageOptions.get(i).getRoot().id.contentEquals(id))
return pageOptions.get(i);
}
return null;
}
public boolean containsRoot(String id){
for(ChartOptions o : pageOptions)
if(o.getRoot().id.contentEquals(id))
return true;
return false;
}
}