package hep.aida.web.taglib;
import hep.aida.web.taglib.util.AidaTLDUtils;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
/**
* The implementation class for plotSetBar tag.
*
* @author The AIDA Team @ SLAC
*
*/
public class PlotSetBarTagSupport implements PlotSetBarTag {
private String url = null;
private String var = "href";
/**
* Format the links and create the PlotSetBarStatus object
* with information about links.
*/
public void doStartTag(PageContext pageContext, PlotSetStatus status) throws JspException, IOException {
String offsetVariable = status.getOffsetvariable();
int start = status.getStartindex();
int end = start + status.getPlotsinpage();
int totalPlots = status.getNplots();
int maxPagePlots = status.getMaxplots();
String sep = (url.indexOf("?") >= 0) ? "&" : "?";
int nPages = (int) (totalPlots/maxPagePlots + 1);
String[] pages = null;
String first = "";
String previous = "";
String next = "";
String last = "";
if ( totalPlots > maxPagePlots ) {
pages = new String[nPages];
int maxOffset = totalPlots - (totalPlots%maxPagePlots);
if (start > 0) first = url+sep+offsetVariable+"=0";
int prev = start - maxPagePlots;
if (start >= maxPagePlots) previous = url+sep+offsetVariable+"="+prev;
int page = 1;
for ( int i = 0; i < totalPlots; i=i+maxPagePlots ) {
if ( start != i ) pages[page-1] = url+sep+offsetVariable+"="+i;
else pages[page-1] = "";
page++;
}
if (end <= maxOffset) next = url+sep+offsetVariable+"="+end;
if (start < maxOffset) last = url+sep+offsetVariable+"="+maxOffset;
}
// Setup the Status object
PlotSetBarStatus barStatus = (PlotSetBarStatus) AidaTLDUtils.findObject(var, pageContext);
if (barStatus == null) {
barStatus = new PlotSetBarStatus();
pageContext.setAttribute(var, barStatus, PageContext.REQUEST_SCOPE);
}
barStatus.setPages(pages);
barStatus.setFirst(first);
barStatus.setPrevious(previous);
barStatus.setNext(next);
barStatus.setLast(last);
String barString = createDefaultBar(pageContext, status);
barStatus.setDefaultbar(barString);
}
/**
* Write out HTML code for the Navigation Bar
*/
public void doTag(PageContext pageContext, PlotSetStatus status) throws JspException, IOException {
PlotSetBarStatus barStatus = (PlotSetBarStatus) AidaTLDUtils.findObject(var, pageContext);
Writer writer = pageContext.getOut();
writer.write(barStatus.getDefaultbar());
}
/**
* Create HTML code for the Navigation Bar
*/
public String createDefaultBar(PageContext pageContext, PlotSetStatus status) throws JspException, IOException {
String bar = "";
PlotSetBarStatus barStatus = (PlotSetBarStatus) AidaTLDUtils.findObject(var, pageContext);
int start = status.getStartindex();
int end = start + status.getPlotsinpage();
int totalPlots = status.getNplots();
if ( barStatus.getNpages() > 0 ) {
StringWriter writer = new StringWriter(300);
writer.write(totalPlots+" plots selected. Showing "+(start+1)+" to "+end+". [ ");
if (!AidaTLDUtils.isEmpty(barStatus.getFirst()))
writer.write("<a href=\""+barStatus.getFirst()+"\">");
writer.write("First");
if (!AidaTLDUtils.isEmpty(barStatus.getFirst()))
writer.write("</a> ");
writer.write("/ ");
if (!AidaTLDUtils.isEmpty(barStatus.getPrevious()))
writer.write("<a href=\""+barStatus.getPrevious()+"\">");
writer.write("Previous ");
if (!AidaTLDUtils.isEmpty(barStatus.getPrevious()))
writer.write("</a>");
writer.write("] ");
for ( int i = 0; i < barStatus.getNpages(); i++ ) {
String pageHref = barStatus.getPages()[i];
if (!AidaTLDUtils.isEmpty(pageHref))
writer.write("<a href=\""+pageHref+"\">"+(i+1)+" </a>");
else
writer.write("<font size=+1><b>"+(i+1)+" </b></font>");
if (i+1 < barStatus.getNpages())
writer.write(", ");
else
writer.write(" ");
}
writer.write("[ ");
if (!AidaTLDUtils.isEmpty(barStatus.getNext()))
writer.write("<a href=\""+barStatus.getNext()+"\">");
writer.write("Next ");
if (!AidaTLDUtils.isEmpty(barStatus.getNext()))
writer.write("</a>");
writer.write("/ ");
if (!AidaTLDUtils.isEmpty(barStatus.getLast()))
writer.write("<a href=\""+barStatus.getLast()+"\">");
writer.write("Last ");
if (!AidaTLDUtils.isEmpty(barStatus.getLast()))
writer.write("</a>");
writer.write("] \n");
bar = writer.toString();
writer.close();
}
return bar;
}
public void setUrl(String url) {
this.url = url;
}
public void setVar(String var) {
this.var = var;
}
}