package net.sf.openrocket.gui.print.visitor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfWriter;
import net.sf.openrocket.gui.print.AbstractPrintable;
import net.sf.openrocket.gui.print.PrintableNoseCone;
import net.sf.openrocket.gui.print.PrintableTransition;
import net.sf.openrocket.rocketcomponent.NoseCone;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.rocketcomponent.Transition;
import java.util.List;
import java.util.Set;
/**
* A strategy for drawing transition/shroud/nose cone templates.
*/
public class TransitionStrategy extends AbstractPrintStrategy <Boolean> {
/**
* Print nose cones?
*/
private boolean printNoseCones = false;
/**
* Constructor.
*
* @param doc The iText document
* @param theWriter The direct iText writer
* @param theStagesToVisit The stages to be visited by this strategy
* @param pageFit the page fit strategy
* @param noseCones nose cones are a special form of a transition; if true, then print nose cones
*/
public TransitionStrategy(Document doc, PdfWriter theWriter, Set<Integer> theStagesToVisit, PageFitPrintStrategy pageFit, boolean noseCones) {
super(doc, pageFit, theWriter, theStagesToVisit);
document = doc;
writer = theWriter;
stages = theStagesToVisit;
pageFitPrint = pageFit;
printNoseCones = noseCones;
}
/**
* Recurse through the given rocket component.
*
* @param theRc an array of rocket components; all children will be visited recursively
*
* @return true if a transition/nosecone was rendered
*/
protected Boolean goDeep(final List<RocketComponent> theRc) {
boolean result = false;
for (RocketComponent rocketComponent : theRc) {
if (rocketComponent instanceof NoseCone) {
if (printNoseCones) {
result |= render((Transition) rocketComponent);
}
}
else if (rocketComponent instanceof Transition && !printNoseCones) {
result |= render((Transition) rocketComponent);
}
else if (rocketComponent.getChildCount() > 0) {
result |= goDeep(rocketComponent.getChildren());
}
}
return result;
}
/**
* The core behavior of this strategy.
*
* @param component the object to extract info about; a graphical image of the transition shape is drawn to the document
*
* @return true, always
*/
private boolean render(final Transition component) {
try {
AbstractPrintable pfs;
if (component instanceof NoseCone) {
pfs = new PrintableNoseCone((NoseCone) component);
}
else {
pfs = new PrintableTransition(component);
}
render(pfs);
}
catch (DocumentException e) {
log.error("Could not render the transition.", e);
}
return true;
}
}