merge fixing
authorplaa <plaa@180e2498-e6e9-4542-8430-84ac67f01cd8>
Sun, 9 Jan 2011 09:03:38 +0000 (09:03 +0000)
committerplaa <plaa@180e2498-e6e9-4542-8430-84ac67f01cd8>
Sun, 9 Jan 2011 09:03:38 +0000 (09:03 +0000)
git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@98 180e2498-e6e9-4542-8430-84ac67f01cd8

src/net/sf/openrocket/gui/print/visitor/BaseVisitorStrategy.java
src/net/sf/openrocket/gui/print/visitor/PartsDetailVisitorStrategy.java
src/net/sf/openrocket/gui/print/visitor/PartsListVisitorStrategy.java
src/net/sf/openrocket/gui/print/visitor/StageVisitorStrategy.java

index c6a30e001fe2cdb22201bddddc1b1bbc31c01765..8998a830c03bb28e2de53f3bb55f0fac1d3b4431 100644 (file)
@@ -3,8 +3,10 @@
  */
 package net.sf.openrocket.gui.print.visitor;
 
-import com.itextpdf.text.Document;
-import com.itextpdf.text.pdf.PdfWriter;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
 import net.sf.openrocket.rocketcomponent.BodyComponent;
 import net.sf.openrocket.rocketcomponent.BodyTube;
 import net.sf.openrocket.rocketcomponent.ComponentVisitor;
@@ -24,321 +26,321 @@ import net.sf.openrocket.rocketcomponent.Stage;
 import net.sf.openrocket.rocketcomponent.Transition;
 import net.sf.openrocket.rocketcomponent.TrapezoidFinSet;
 
-import java.util.HashSet;
-import java.util.Set;
+import com.itextpdf.text.Document;
+import com.itextpdf.text.pdf.PdfWriter;
 
 /**
  * This abstract class contains boilerplate functionality to support visiting the components of a rocket. It is a
  * visitor strategy, not a visitor per se.
  */
 public abstract class BaseVisitorStrategy implements ComponentVisitorStrategy {
-
-    /**
-     * The owning visitor.
-     */
-    protected ComponentVisitor parent;
-
-    /**
-     * The iText document.
-     */
-    protected Document document;
-
-    /**
-     * The direct iText writer.
-     */
-    protected PdfWriter writer;
-
-    /**
-     * The stages selected.
-     */
-    protected Set<Integer> stages;
-
-    /**
-     * State variable to track the level of hierarchy.
-     */
-    protected int level = 0;
-
-    /**
-     * Default no-arg constructor.
-     */
-    public BaseVisitorStrategy () {
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param doc the iText document
-     */
-    public BaseVisitorStrategy (Document doc) {
-        this(doc, null);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param doc       the iText document
-     * @param theWriter an iText byte writer
-     */
-    public BaseVisitorStrategy (Document doc, PdfWriter theWriter) {
-        this(doc, theWriter, new HashSet<Integer>());
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param doc       the iText document
-     * @param theWriter an iText byte writer
-     * @param theStages a set of stage numbers
-     */
-    public BaseVisitorStrategy (Document doc, PdfWriter theWriter, Set<Integer> theStages) {
-        document = doc;
-        writer = theWriter;
-        stages = theStages;
-    }
-
-    /**
-     * Determine if the visitor strategy's set of stage numbers (to print) contains the specified stage.
-     *
-     * @param stageNumber a stage number
-     *
-     * @return true if the visitor strategy contains the stage number provided
-     */
-    public boolean shouldVisitStage (int stageNumber) {
-        if (stages == null || stages.isEmpty()) {
-            return false;
-        }
-
-        for (final Integer stage : stages) {
-            if (stage == stageNumber) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Recurse through the given rocket component.
-     *
-     * @param root the root component; all children will be visited recursively
-     */
-    protected void goDeep (final RocketComponent root) {
-        RocketComponent[] rc = root.getChildren();
-        goDeep(rc);
-    }
-
-
-    /**
-     * Recurse through the given rocket component.
-     *
-     * @param theRc an array of rocket components; all children will be visited recursively
-     */
-    protected void goDeep (final RocketComponent[] theRc) {
-        level++;
-        for (RocketComponent rocketComponent : theRc) {
-            rocketComponent.accept(parent);
-        }
-        level--;
-    }
-
-    /**
-     * Get the dimensions of the paper page.
-     *
-     * @return an internal Dimension
-     */
-    protected Dimension getPageSize () {
-        return new Dimension(document.getPageSize().getWidth(),
-                             document.getPageSize().getHeight());
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final Rocket visitable) {
-        goDeep(visitable);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final RocketComponent visitable) {
-        if (shouldVisitStage(visitable.getStageNumber())) {
-            goDeep(visitable);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final Stage visitable) {
-        if (shouldVisitStage(visitable.getStageNumber())) {
-            goDeep(visitable);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final ExternalComponent visitable) {
-        if (shouldVisitStage(visitable.getStageNumber())) {
-            goDeep(visitable);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final BodyComponent visitable) {
-        if (shouldVisitStage(visitable.getStageNumber())) {
-            goDeep(visitable);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final RingComponent visitable) {
-        if (shouldVisitStage(visitable.getStageNumber())) {
-            goDeep(visitable);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final InnerTube visitable) {
-        if (shouldVisitStage(visitable.getStageNumber())) {
-            goDeep(visitable);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final LaunchLug visitable) {
-        if (shouldVisitStage(visitable.getStageNumber())) {
-            goDeep(visitable);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final Transition visitable) {
-        if (shouldVisitStage(visitable.getStageNumber())) {
-            goDeep(visitable);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final RadiusRingComponent visitable) {
-        if (shouldVisitStage(visitable.getStageNumber())) {
-            goDeep(visitable);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final MassObject visitable) {
-        if (shouldVisitStage(visitable.getStageNumber())) {
-            goDeep(visitable);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final NoseCone visitable) {
-        if (shouldVisitStage(visitable.getStageNumber())) {
-            goDeep(visitable);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final BodyTube visitable) {
-        if (shouldVisitStage(visitable.getStageNumber())) {
-            goDeep(visitable);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final TrapezoidFinSet visitable) {
-        if (shouldVisitStage(visitable.getStageNumber())) {
-            goDeep(visitable);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final EllipticalFinSet visitable) {
-        if (shouldVisitStage(visitable.getStageNumber())) {
-            goDeep(visitable);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final FreeformFinSet visitable) {
-        if (shouldVisitStage(visitable.getStageNumber())) {
-            goDeep(visitable);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setParent (final ComponentVisitor theParent) {
-        parent = theParent;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void close () {
-    }
+       
+       /**
+        * The owning visitor.
+        */
+       protected ComponentVisitor parent;
+       
+       /**
+        * The iText document.
+        */
+       protected Document document;
+       
+       /**
+        * The direct iText writer.
+        */
+       protected PdfWriter writer;
+       
+       /**
+        * The stages selected.
+        */
+       protected Set<Integer> stages;
+       
+       /**
+        * State variable to track the level of hierarchy.
+        */
+       protected int level = 0;
+       
+       /**
+        * Default no-arg constructor.
+        */
+       public BaseVisitorStrategy() {
+       }
+       
+       /**
+        * Constructor.
+        *
+        * @param doc the iText document
+        */
+       public BaseVisitorStrategy(Document doc) {
+               this(doc, null);
+       }
+       
+       /**
+        * Constructor.
+        *
+        * @param doc       the iText document
+        * @param theWriter an iText byte writer
+        */
+       public BaseVisitorStrategy(Document doc, PdfWriter theWriter) {
+               this(doc, theWriter, new HashSet<Integer>());
+       }
+       
+       /**
+        * Constructor.
+        *
+        * @param doc       the iText document
+        * @param theWriter an iText byte writer
+        * @param theStages a set of stage numbers
+        */
+       public BaseVisitorStrategy(Document doc, PdfWriter theWriter, Set<Integer> theStages) {
+               document = doc;
+               writer = theWriter;
+               stages = theStages;
+       }
+       
+       /**
+        * Determine if the visitor strategy's set of stage numbers (to print) contains the specified stage.
+        *
+        * @param stageNumber a stage number
+        *
+        * @return true if the visitor strategy contains the stage number provided
+        */
+       public boolean shouldVisitStage(int stageNumber) {
+               if (stages == null || stages.isEmpty()) {
+                       return false;
+               }
+               
+               for (final Integer stage : stages) {
+                       if (stage == stageNumber) {
+                               return true;
+                       }
+               }
+               
+               return false;
+       }
+       
+       /**
+        * Recurse through the given rocket component.
+        *
+        * @param root the root component; all children will be visited recursively
+        */
+       protected void goDeep(final RocketComponent root) {
+               List<RocketComponent> rc = root.getChildren();
+               goDeep(rc);
+       }
+       
+       
+       /**
+        * Recurse through the given rocket component.
+        *
+        * @param theRc an array of rocket components; all children will be visited recursively
+        */
+       protected void goDeep(final List<RocketComponent> theRc) {
+               level++;
+               for (RocketComponent rocketComponent : theRc) {
+                       rocketComponent.accept(parent);
+               }
+               level--;
+       }
+       
+       /**
+        * Get the dimensions of the paper page.
+        *
+        * @return an internal Dimension
+        */
+       protected Dimension getPageSize() {
+               return new Dimension(document.getPageSize().getWidth(),
+                                                               document.getPageSize().getHeight());
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final Rocket visitable) {
+               goDeep(visitable);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final RocketComponent visitable) {
+               if (shouldVisitStage(visitable.getStageNumber())) {
+                       goDeep(visitable);
+               }
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final Stage visitable) {
+               if (shouldVisitStage(visitable.getStageNumber())) {
+                       goDeep(visitable);
+               }
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final ExternalComponent visitable) {
+               if (shouldVisitStage(visitable.getStageNumber())) {
+                       goDeep(visitable);
+               }
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final BodyComponent visitable) {
+               if (shouldVisitStage(visitable.getStageNumber())) {
+                       goDeep(visitable);
+               }
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final RingComponent visitable) {
+               if (shouldVisitStage(visitable.getStageNumber())) {
+                       goDeep(visitable);
+               }
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final InnerTube visitable) {
+               if (shouldVisitStage(visitable.getStageNumber())) {
+                       goDeep(visitable);
+               }
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final LaunchLug visitable) {
+               if (shouldVisitStage(visitable.getStageNumber())) {
+                       goDeep(visitable);
+               }
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final Transition visitable) {
+               if (shouldVisitStage(visitable.getStageNumber())) {
+                       goDeep(visitable);
+               }
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final RadiusRingComponent visitable) {
+               if (shouldVisitStage(visitable.getStageNumber())) {
+                       goDeep(visitable);
+               }
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final MassObject visitable) {
+               if (shouldVisitStage(visitable.getStageNumber())) {
+                       goDeep(visitable);
+               }
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final NoseCone visitable) {
+               if (shouldVisitStage(visitable.getStageNumber())) {
+                       goDeep(visitable);
+               }
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final BodyTube visitable) {
+               if (shouldVisitStage(visitable.getStageNumber())) {
+                       goDeep(visitable);
+               }
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final TrapezoidFinSet visitable) {
+               if (shouldVisitStage(visitable.getStageNumber())) {
+                       goDeep(visitable);
+               }
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final EllipticalFinSet visitable) {
+               if (shouldVisitStage(visitable.getStageNumber())) {
+                       goDeep(visitable);
+               }
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final FreeformFinSet visitable) {
+               if (shouldVisitStage(visitable.getStageNumber())) {
+                       goDeep(visitable);
+               }
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void setParent(final ComponentVisitor theParent) {
+               parent = theParent;
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void close() {
+       }
 }
 
 class Dimension {
-    public float width;
-    public float height;
-
-    public Dimension (float w, float h) {
-        width = w;
-        height = h;
-    }
-
-    public float getWidth () {
-        return width;
-    }
-
-    public float getHeight () {
-        return height;
-    }
+       public float width;
+       public float height;
+       
+       public Dimension(float w, float h) {
+               width = w;
+               height = h;
+       }
+       
+       public float getWidth() {
+               return width;
+       }
+       
+       public float getHeight() {
+               return height;
+       }
 }
\ No newline at end of file
index 8cbfb6975259b4f7e30ad6fdf5e1edf2298ce340..6151149cfd187bfa96eee46ffa2d95f9aa754965 100644 (file)
@@ -3,18 +3,14 @@
  */
 package net.sf.openrocket.gui.print.visitor;
 
-import com.itextpdf.text.BadElementException;
-import com.itextpdf.text.Chunk;
-import com.itextpdf.text.Document;
-import com.itextpdf.text.DocumentException;
-import com.itextpdf.text.Element;
-import com.itextpdf.text.Font;
-import com.itextpdf.text.Image;
-import com.itextpdf.text.Phrase;
-import com.itextpdf.text.Rectangle;
-import com.itextpdf.text.pdf.PdfPCell;
-import com.itextpdf.text.pdf.PdfPTable;
-import com.itextpdf.text.pdf.PdfWriter;
+import java.io.IOException;
+import java.text.NumberFormat;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+import javax.swing.ImageIcon;
+
 import net.sf.openrocket.gui.main.ComponentIcons;
 import net.sf.openrocket.gui.print.ITextHelper;
 import net.sf.openrocket.gui.print.PrintUtilities;
@@ -41,417 +37,418 @@ import net.sf.openrocket.unit.Unit;
 import net.sf.openrocket.unit.UnitGroup;
 import net.sf.openrocket.util.Coordinate;
 
-import javax.swing.ImageIcon;
-import java.io.IOException;
-import java.text.NumberFormat;
-import java.util.Collection;
-import java.util.Set;
+import com.itextpdf.text.BadElementException;
+import com.itextpdf.text.Chunk;
+import com.itextpdf.text.Document;
+import com.itextpdf.text.DocumentException;
+import com.itextpdf.text.Element;
+import com.itextpdf.text.Font;
+import com.itextpdf.text.Image;
+import com.itextpdf.text.Phrase;
+import com.itextpdf.text.Rectangle;
+import com.itextpdf.text.pdf.PdfPCell;
+import com.itextpdf.text.pdf.PdfPTable;
+import com.itextpdf.text.pdf.PdfWriter;
 
 /**
  * A visitor strategy for creating documentation about parts details.
  */
 public class PartsDetailVisitorStrategy extends BaseVisitorStrategy {
-
-    /**
-     * The number of columns in the table.
-     */
-    private static final int TABLE_COLUMNS = 7;
-
-    /**
-     * The parts detail is represented as an iText table.
-     */
-    PdfPTable grid;
-
-    /**
-     * Construct a strategy for visiting a parts hierarchy for the purposes of collecting details on those parts.
-     *
-     * @param doc              The iText document
-     * @param theWriter        The direct iText writer
-     * @param theStagesToVisit The stages to be visited by this strategy
-     */
-    public PartsDetailVisitorStrategy (Document doc, PdfWriter theWriter, Set<Integer> theStagesToVisit) {
-        super(doc, theWriter, theStagesToVisit);
-        PrintUtilities.addText(doc, PrintUtilities.BIG_BOLD, "Parts Detail");
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final Stage visitable) {
-        try {
-            if (grid != null) {
-                document.add(grid);
-            }
-            document.add(ITextHelper.createPhrase(visitable.getName()));
-            grid = new PdfPTable(TABLE_COLUMNS);
-            grid.setWidthPercentage(100);
-            grid.setHorizontalAlignment(Element.ALIGN_LEFT);
-        }
-        catch (DocumentException e) {
-        }
-
-        RocketComponent[] rc = visitable.getChildren();
-        goDeep(rc);
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final ExternalComponent visitable) {
-        grid.addCell(iconToImage(visitable));
-        grid.addCell(createNameCell(visitable.getName(), true));
-
-        grid.addCell(createMaterialCell(visitable.getMaterial()));
-        grid.addCell(ITextHelper.createCell());
-        grid.addCell(createLengthCell(visitable.getLength()));
-        grid.addCell(createMassCell(visitable.getMass()));
-
-        RocketComponent[] rc = visitable.getChildren();
-        goDeep(rc);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final BodyComponent visitable) {
-        grid.addCell(visitable.getName());
-        grid.completeRow();
-        RocketComponent[] rc = visitable.getChildren();
-        goDeep(rc);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final RingComponent visitable) {
-        grid.addCell(iconToImage(visitable));
-        grid.addCell(createNameCell(visitable.getName(), true));
-        grid.addCell(createMaterialCell(visitable.getMaterial()));
-        grid.addCell(createOuterDiaCell(visitable));
-        grid.addCell(createLengthCell(visitable.getLength()));
-        grid.addCell(createMassCell(visitable.getMass()));
-
-        RocketComponent[] rc = visitable.getChildren();
-        goDeep(rc);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final InnerTube visitable) {
-        grid.addCell(iconToImage(visitable));
-        final PdfPCell pCell = createNameCell(visitable.getName(), true);
-        grid.addCell(pCell);
-        grid.addCell(createMaterialCell(visitable.getMaterial()));
-        grid.addCell(createOuterDiaCell(visitable));
-        grid.addCell(createLengthCell(visitable.getLength()));
-        grid.addCell(createMassCell(visitable.getMass()));
-
-        RocketComponent[] rc = visitable.getChildren();
-        goDeep(rc);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final LaunchLug visitable) {
-        grid.addCell(iconToImage(visitable));
-        grid.addCell(createNameCell(visitable.getName(), true));
-
-        grid.addCell(createMaterialCell(visitable.getMaterial()));
-        grid.addCell(createOuterDiaCell(visitable));
-        grid.addCell(createLengthCell(visitable.getLength()));
-        grid.addCell(createMassCell(visitable.getMass()));
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final Transition visitable) {
-        grid.addCell(iconToImage(visitable));
-        grid.addCell(createNameCell(visitable.getName(), true));
-        grid.addCell(createMaterialCell(visitable.getMaterial()));
-
-        Chunk fore = new Chunk("Fore Dia: " + appendLength(visitable.getForeRadius() * 2));
-        fore.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.NORMAL_FONT_SIZE));
-        Chunk aft = new Chunk("Aft Dia: " + appendLength(visitable.getAftRadius() * 2));
-        aft.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.NORMAL_FONT_SIZE));
-        final PdfPCell cell = ITextHelper.createCell();
-        cell.addElement(fore);
-        cell.addElement(aft);
-        grid.addCell(cell);
-        grid.addCell(createLengthCell(visitable.getLength()));
-        grid.addCell(createMassCell(visitable.getMass()));
-
-        RocketComponent[] rc = visitable.getChildren();
-        goDeep(rc);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final RadiusRingComponent visitable) {
-        grid.addCell(iconToImage(visitable));
-        grid.addCell(createNameCell(visitable.getName(), true));
-        grid.addCell(createMaterialCell(visitable.getMaterial()));
-        grid.addCell(createOuterDiaCell(visitable));
-        grid.addCell(createLengthCell(visitable.getLength()));
-        grid.addCell(createMassCell(visitable.getMass()));
-        RocketComponent[] rc = visitable.getChildren();
-        goDeep(rc);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final MassObject visitable) {
-        PdfPCell cell = ITextHelper.createCell();
-        cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
-        cell.setPaddingBottom(12f);
-
-        grid.addCell(iconToImage(visitable));
-        final PdfPCell nameCell = createNameCell(visitable.getName(), true);
-        nameCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
-        nameCell.setPaddingBottom(12f);
-        grid.addCell(nameCell);
-        grid.addCell(cell);
-        grid.addCell(cell);
-        grid.addCell(cell);
-        grid.addCell(createMassCell(visitable.getMass()));
-        RocketComponent[] rc = visitable.getChildren();
-        goDeep(rc);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final NoseCone visitable) {
-        grid.addCell(iconToImage(visitable));
-        grid.addCell(createNameCell(visitable.getName(), true));
-        grid.addCell(createMaterialCell(visitable.getMaterial()));
-        grid.addCell(ITextHelper.createCell(visitable.getType().getName(), PdfPCell.BOTTOM));
-        grid.addCell(createLengthCell(visitable.getLength()));
-        grid.addCell(createMassCell(visitable.getMass()));
-        RocketComponent[] rc = visitable.getChildren();
-        goDeep(rc);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final BodyTube visitable) {
-        grid.addCell(iconToImage(visitable));
-        grid.addCell(createNameCell(visitable.getName(), true));
-        grid.addCell(createMaterialCell(visitable.getMaterial()));
-        grid.addCell(createOuterDiaCell(visitable));
-        grid.addCell(createLengthCell(visitable.getLength()));
-        grid.addCell(createMassCell(visitable.getMass()));
-        RocketComponent[] rc = visitable.getChildren();
-        goDeep(rc);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final TrapezoidFinSet visitable) {
-        visitFins(visitable);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final EllipticalFinSet visitable) {
-        visitFins(visitable);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final FreeformFinSet visitable) {
-        visitFins(visitable);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void close () {
-        try {
-            if (grid != null) {
-                document.add(grid);
-            }
-        }
-        catch (DocumentException e) {
-            e.printStackTrace();
-        }
-    }
-
-    private PdfPCell createOuterDiaCell (final Coaxial visitable) {
-        PdfPCell result = new PdfPCell();
-        Phrase p = new Phrase();
-        p.setLeading(12f);
-        result.setVerticalAlignment(Element.ALIGN_TOP);
-        result.setBorder(Rectangle.BOTTOM);
-        Chunk c = new Chunk();
-        c.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.NORMAL_FONT_SIZE));
-        c.append("Dia");
-        p.add(c);
-
-        c = new Chunk();
-        c.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.SMALL_FONT_SIZE));
-        c.append("out");
-        p.add(c);
-
-        c = new Chunk();
-        c.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.NORMAL_FONT_SIZE));
-        c.append(" " + appendLength(visitable.getOuterRadius() * 2));
-        p.add(c);
-        createInnerDiaCell(visitable, result);
-        result.addElement(p);
-        return result;
-    }
-
-    private void createInnerDiaCell (final Coaxial visitable, PdfPCell cell) {
-        Phrase p = new Phrase();
-        p.setLeading(14f);
-        Chunk c = new Chunk();
-        c.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.NORMAL_FONT_SIZE));
-        c.append("Dia");
-        p.add(c);
-
-        c = new Chunk();
-        c.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.SMALL_FONT_SIZE));
-        c.append("in ");
-        p.add(c);
-
-        c = new Chunk();
-        c.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.NORMAL_FONT_SIZE));
-        c.append("  " + appendLength(visitable.getInnerRadius() * 2));
-        p.add(c);
-        cell.addElement(p);
-    }
-
-    private void visitFins (FinSet visitable) {
-
-        Image img = null;
-        java.awt.Image awtImage = new PrintableFinSet(visitable).createImage();
-
-        Collection<Coordinate> x = visitable.getComponentBounds();
-
-        try {
-            img = Image.getInstance(writer, awtImage, 0.25f);
-        }
-        catch (BadElementException e) {
-            e.printStackTrace();
-        }
-        catch (IOException e) {
-            e.printStackTrace();
-        }
-
-        grid.addCell(iconToImage(visitable));
-        grid.addCell(createNameCell(visitable.getName() + " (" + visitable.getFinCount() + ")", true));
-        grid.addCell(createMaterialCell(visitable.getMaterial()));
-        grid.addCell(ITextHelper.createCell("Thick: " + appendLength(visitable.getThickness()), PdfPCell.BOTTOM));
-        final PdfPCell pCell = new PdfPCell();
-        pCell.setBorder(Rectangle.BOTTOM);
-        pCell.addElement(img);
-
-        grid.addCell(ITextHelper.createCell());
-        grid.addCell(createMassCell(visitable.getMass()));
-
-        RocketComponent[] rc = visitable.getChildren();
-        goDeep(rc);
-    }
-
-    protected PdfPCell createLengthCell (double length) {
-        return ITextHelper.createCell("Len: " + appendLength(length), PdfPCell.BOTTOM);
-    }
-
-    protected PdfPCell createMassCell (double mass) {
-        return ITextHelper.createCell("Mass: " + appendMass(mass), PdfPCell.BOTTOM);
-    }
-
-    protected PdfPCell createNameCell (String v, boolean withIndent) {
-        PdfPCell result = new PdfPCell();
-        result.setBorder(Rectangle.BOTTOM);
-        Chunk c = new Chunk();
-        c.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.NORMAL_FONT_SIZE));
-        if (withIndent) {
-            for (int x = 0; x < (level - 2) * 10; x++) {
-                c.append(" ");
-            }
-        }
-        c.append(v);
-        result.setColspan(2);
-        result.addElement(c);
-        return result;
-    }
-
-    protected PdfPCell createMaterialCell (Material material) {
-        PdfPCell cell = ITextHelper.createCell();
-        cell.setLeading(13f, 0);
-
-        Chunk c = new Chunk();
-        c.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.NORMAL_FONT_SIZE));
-        c.append(appendMaterial(material));
-        cell.addElement(c);
-        Chunk density = new Chunk();
-        density.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.SMALL_FONT_SIZE));
-        density.append(appendMaterialDensity(material));
-        cell.addElement(density);
-        return cell;
-    }
-
-    protected PdfPCell iconToImage (final RocketComponent visitable) {
-        final ImageIcon icon = (ImageIcon) ComponentIcons.getLargeIcon(visitable.getClass());
-        try {
-            Image im = Image.getInstance(icon.getImage(), null);
-            im.scaleToFit(icon.getIconWidth() * 0.6f, icon.getIconHeight() * 0.6f);
-            PdfPCell cell = new PdfPCell(im);
-            cell.setFixedHeight(icon.getIconHeight() * 0.6f);
-            cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
-            cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
-            cell.setBorder(PdfPCell.NO_BORDER);
-            return cell;
-        }
-        catch (BadElementException e) {
-        }
-        catch (IOException e) {
-        }
-        return null;
-    }
-
-    protected String appendLength (double length) {
-        final Unit defaultUnit = UnitGroup.UNITS_LENGTH.getDefaultUnit();
-        return NumberFormat.getNumberInstance().format(defaultUnit.toUnit(length)) + defaultUnit.toString();
-    }
-
-    protected String appendMass (double mass) {
-        final Unit defaultUnit = UnitGroup.UNITS_MASS.getDefaultUnit();
-        return NumberFormat.getNumberInstance().format(defaultUnit.toUnit(mass)) + defaultUnit.toString();
-    }
-
-    protected String appendMaterial (Material material) {
-        return material.getName();
-    }
-
-    protected String appendMaterialDensity (Material material) {
-        return " (" + material.getType().getUnitGroup().getDefaultUnit().toStringUnit(material.getDensity()) + ")";
-    }
-
+       
+       /**
+        * The number of columns in the table.
+        */
+       private static final int TABLE_COLUMNS = 7;
+       
+       /**
+        * The parts detail is represented as an iText table.
+        */
+       PdfPTable grid;
+       
+       /**
+        * Construct a strategy for visiting a parts hierarchy for the purposes of collecting details on those parts.
+        *
+        * @param doc              The iText document
+        * @param theWriter        The direct iText writer
+        * @param theStagesToVisit The stages to be visited by this strategy
+        */
+       public PartsDetailVisitorStrategy(Document doc, PdfWriter theWriter, Set<Integer> theStagesToVisit) {
+               super(doc, theWriter, theStagesToVisit);
+               PrintUtilities.addText(doc, PrintUtilities.BIG_BOLD, "Parts Detail");
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final Stage visitable) {
+               try {
+                       if (grid != null) {
+                               document.add(grid);
+                       }
+                       document.add(ITextHelper.createPhrase(visitable.getName()));
+                       grid = new PdfPTable(TABLE_COLUMNS);
+                       grid.setWidthPercentage(100);
+                       grid.setHorizontalAlignment(Element.ALIGN_LEFT);
+               } catch (DocumentException e) {
+               }
+               
+               List<RocketComponent> rc = visitable.getChildren();
+               goDeep(rc);
+       }
+       
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final ExternalComponent visitable) {
+               grid.addCell(iconToImage(visitable));
+               grid.addCell(createNameCell(visitable.getName(), true));
+               
+               grid.addCell(createMaterialCell(visitable.getMaterial()));
+               grid.addCell(ITextHelper.createCell());
+               grid.addCell(createLengthCell(visitable.getLength()));
+               grid.addCell(createMassCell(visitable.getMass()));
+               
+               List<RocketComponent> rc = visitable.getChildren();
+               goDeep(rc);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final BodyComponent visitable) {
+               grid.addCell(visitable.getName());
+               grid.completeRow();
+               List<RocketComponent> rc = visitable.getChildren();
+               goDeep(rc);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final RingComponent visitable) {
+               grid.addCell(iconToImage(visitable));
+               grid.addCell(createNameCell(visitable.getName(), true));
+               grid.addCell(createMaterialCell(visitable.getMaterial()));
+               grid.addCell(createOuterDiaCell(visitable));
+               grid.addCell(createLengthCell(visitable.getLength()));
+               grid.addCell(createMassCell(visitable.getMass()));
+               
+               List<RocketComponent> rc = visitable.getChildren();
+               goDeep(rc);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final InnerTube visitable) {
+               grid.addCell(iconToImage(visitable));
+               final PdfPCell pCell = createNameCell(visitable.getName(), true);
+               grid.addCell(pCell);
+               grid.addCell(createMaterialCell(visitable.getMaterial()));
+               grid.addCell(createOuterDiaCell(visitable));
+               grid.addCell(createLengthCell(visitable.getLength()));
+               grid.addCell(createMassCell(visitable.getMass()));
+               
+               List<RocketComponent> rc = visitable.getChildren();
+               goDeep(rc);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final LaunchLug visitable) {
+               grid.addCell(iconToImage(visitable));
+               grid.addCell(createNameCell(visitable.getName(), true));
+               
+               grid.addCell(createMaterialCell(visitable.getMaterial()));
+               grid.addCell(createOuterDiaCell(visitable));
+               grid.addCell(createLengthCell(visitable.getLength()));
+               grid.addCell(createMassCell(visitable.getMass()));
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final Transition visitable) {
+               grid.addCell(iconToImage(visitable));
+               grid.addCell(createNameCell(visitable.getName(), true));
+               grid.addCell(createMaterialCell(visitable.getMaterial()));
+               
+               Chunk fore = new Chunk("Fore Dia: " + appendLength(visitable.getForeRadius() * 2));
+               fore.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.NORMAL_FONT_SIZE));
+               Chunk aft = new Chunk("Aft Dia: " + appendLength(visitable.getAftRadius() * 2));
+               aft.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.NORMAL_FONT_SIZE));
+               final PdfPCell cell = ITextHelper.createCell();
+               cell.addElement(fore);
+               cell.addElement(aft);
+               grid.addCell(cell);
+               grid.addCell(createLengthCell(visitable.getLength()));
+               grid.addCell(createMassCell(visitable.getMass()));
+               
+               List<RocketComponent> rc = visitable.getChildren();
+               goDeep(rc);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final RadiusRingComponent visitable) {
+               grid.addCell(iconToImage(visitable));
+               grid.addCell(createNameCell(visitable.getName(), true));
+               grid.addCell(createMaterialCell(visitable.getMaterial()));
+               grid.addCell(createOuterDiaCell(visitable));
+               grid.addCell(createLengthCell(visitable.getLength()));
+               grid.addCell(createMassCell(visitable.getMass()));
+               List<RocketComponent> rc = visitable.getChildren();
+               goDeep(rc);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final MassObject visitable) {
+               PdfPCell cell = ITextHelper.createCell();
+               cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
+               cell.setPaddingBottom(12f);
+               
+               grid.addCell(iconToImage(visitable));
+               final PdfPCell nameCell = createNameCell(visitable.getName(), true);
+               nameCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
+               nameCell.setPaddingBottom(12f);
+               grid.addCell(nameCell);
+               grid.addCell(cell);
+               grid.addCell(cell);
+               grid.addCell(cell);
+               grid.addCell(createMassCell(visitable.getMass()));
+               List<RocketComponent> rc = visitable.getChildren();
+               goDeep(rc);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final NoseCone visitable) {
+               grid.addCell(iconToImage(visitable));
+               grid.addCell(createNameCell(visitable.getName(), true));
+               grid.addCell(createMaterialCell(visitable.getMaterial()));
+               grid.addCell(ITextHelper.createCell(visitable.getType().getName(), PdfPCell.BOTTOM));
+               grid.addCell(createLengthCell(visitable.getLength()));
+               grid.addCell(createMassCell(visitable.getMass()));
+               List<RocketComponent> rc = visitable.getChildren();
+               goDeep(rc);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final BodyTube visitable) {
+               grid.addCell(iconToImage(visitable));
+               grid.addCell(createNameCell(visitable.getName(), true));
+               grid.addCell(createMaterialCell(visitable.getMaterial()));
+               grid.addCell(createOuterDiaCell(visitable));
+               grid.addCell(createLengthCell(visitable.getLength()));
+               grid.addCell(createMassCell(visitable.getMass()));
+               List<RocketComponent> rc = visitable.getChildren();
+               goDeep(rc);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final TrapezoidFinSet visitable) {
+               visitFins(visitable);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final EllipticalFinSet visitable) {
+               visitFins(visitable);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final FreeformFinSet visitable) {
+               visitFins(visitable);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void close() {
+               try {
+                       if (grid != null) {
+                               document.add(grid);
+                       }
+               } catch (DocumentException e) {
+                       e.printStackTrace();
+               }
+       }
+       
+       private PdfPCell createOuterDiaCell(final Coaxial visitable) {
+               PdfPCell result = new PdfPCell();
+               Phrase p = new Phrase();
+               p.setLeading(12f);
+               result.setVerticalAlignment(Element.ALIGN_TOP);
+               result.setBorder(Rectangle.BOTTOM);
+               Chunk c = new Chunk();
+               c.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.NORMAL_FONT_SIZE));
+               c.append("Dia");
+               p.add(c);
+               
+               c = new Chunk();
+               c.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.SMALL_FONT_SIZE));
+               c.append("out");
+               p.add(c);
+               
+               c = new Chunk();
+               c.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.NORMAL_FONT_SIZE));
+               c.append(" " + appendLength(visitable.getOuterRadius() * 2));
+               p.add(c);
+               createInnerDiaCell(visitable, result);
+               result.addElement(p);
+               return result;
+       }
+       
+       private void createInnerDiaCell(final Coaxial visitable, PdfPCell cell) {
+               Phrase p = new Phrase();
+               p.setLeading(14f);
+               Chunk c = new Chunk();
+               c.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.NORMAL_FONT_SIZE));
+               c.append("Dia");
+               p.add(c);
+               
+               c = new Chunk();
+               c.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.SMALL_FONT_SIZE));
+               c.append("in ");
+               p.add(c);
+               
+               c = new Chunk();
+               c.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.NORMAL_FONT_SIZE));
+               c.append("  " + appendLength(visitable.getInnerRadius() * 2));
+               p.add(c);
+               cell.addElement(p);
+       }
+       
+       private void visitFins(FinSet visitable) {
+               
+               Image img = null;
+               java.awt.Image awtImage = new PrintableFinSet(visitable).createImage();
+               
+               Collection<Coordinate> x = visitable.getComponentBounds();
+               
+               try {
+                       img = Image.getInstance(writer, awtImage, 0.25f);
+               } catch (BadElementException e) {
+                       e.printStackTrace();
+               } catch (IOException e) {
+                       e.printStackTrace();
+               }
+               
+               grid.addCell(iconToImage(visitable));
+               grid.addCell(createNameCell(visitable.getName() + " (" + visitable.getFinCount() + ")", true));
+               grid.addCell(createMaterialCell(visitable.getMaterial()));
+               grid.addCell(ITextHelper.createCell("Thick: " + appendLength(visitable.getThickness()), PdfPCell.BOTTOM));
+               final PdfPCell pCell = new PdfPCell();
+               pCell.setBorder(Rectangle.BOTTOM);
+               pCell.addElement(img);
+               
+               grid.addCell(ITextHelper.createCell());
+               grid.addCell(createMassCell(visitable.getMass()));
+               
+               List<RocketComponent> rc = visitable.getChildren();
+               goDeep(rc);
+       }
+       
+       protected PdfPCell createLengthCell(double length) {
+               return ITextHelper.createCell("Len: " + appendLength(length), PdfPCell.BOTTOM);
+       }
+       
+       protected PdfPCell createMassCell(double mass) {
+               return ITextHelper.createCell("Mass: " + appendMass(mass), PdfPCell.BOTTOM);
+       }
+       
+       protected PdfPCell createNameCell(String v, boolean withIndent) {
+               PdfPCell result = new PdfPCell();
+               result.setBorder(Rectangle.BOTTOM);
+               Chunk c = new Chunk();
+               c.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.NORMAL_FONT_SIZE));
+               if (withIndent) {
+                       for (int x = 0; x < (level - 2) * 10; x++) {
+                               c.append(" ");
+                       }
+               }
+               c.append(v);
+               result.setColspan(2);
+               result.addElement(c);
+               return result;
+       }
+       
+       protected PdfPCell createMaterialCell(Material material) {
+               PdfPCell cell = ITextHelper.createCell();
+               cell.setLeading(13f, 0);
+               
+               Chunk c = new Chunk();
+               c.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.NORMAL_FONT_SIZE));
+               c.append(appendMaterial(material));
+               cell.addElement(c);
+               Chunk density = new Chunk();
+               density.setFont(new Font(Font.FontFamily.HELVETICA, PrintUtilities.SMALL_FONT_SIZE));
+               density.append(appendMaterialDensity(material));
+               cell.addElement(density);
+               return cell;
+       }
+       
+       protected PdfPCell iconToImage(final RocketComponent visitable) {
+               final ImageIcon icon = (ImageIcon) ComponentIcons.getLargeIcon(visitable.getClass());
+               try {
+                       Image im = Image.getInstance(icon.getImage(), null);
+                       im.scaleToFit(icon.getIconWidth() * 0.6f, icon.getIconHeight() * 0.6f);
+                       PdfPCell cell = new PdfPCell(im);
+                       cell.setFixedHeight(icon.getIconHeight() * 0.6f);
+                       cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
+                       cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
+                       cell.setBorder(PdfPCell.NO_BORDER);
+                       return cell;
+               } catch (BadElementException e) {
+               } catch (IOException e) {
+               }
+               return null;
+       }
+       
+       protected String appendLength(double length) {
+               final Unit defaultUnit = UnitGroup.UNITS_LENGTH.getDefaultUnit();
+               return NumberFormat.getNumberInstance().format(defaultUnit.toUnit(length)) + defaultUnit.toString();
+       }
+       
+       protected String appendMass(double mass) {
+               final Unit defaultUnit = UnitGroup.UNITS_MASS.getDefaultUnit();
+               return NumberFormat.getNumberInstance().format(defaultUnit.toUnit(mass)) + defaultUnit.toString();
+       }
+       
+       protected String appendMaterial(Material material) {
+               return material.getName();
+       }
+       
+       protected String appendMaterialDensity(Material material) {
+               return " (" + material.getType().getUnitGroup().getDefaultUnit().toStringUnit(material.getDensity()) + ")";
+       }
+       
 }
index f6ebab8f9ecce993e6f5bee06ab032667df756fd..699a4263fd8a66cad3183cde5434925aad63865b 100644 (file)
@@ -3,8 +3,11 @@
  */
 package net.sf.openrocket.gui.print.visitor;
 
-import com.itextpdf.text.Document;
-import com.itextpdf.text.pdf.PdfWriter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 import net.sf.openrocket.rocketcomponent.BodyTube;
 import net.sf.openrocket.rocketcomponent.Coaxial;
 import net.sf.openrocket.rocketcomponent.ComponentVisitor;
@@ -19,238 +22,237 @@ import net.sf.openrocket.rocketcomponent.RocketComponent;
 import net.sf.openrocket.rocketcomponent.Transition;
 import net.sf.openrocket.rocketcomponent.TrapezoidFinSet;
 
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
+import com.itextpdf.text.Document;
+import com.itextpdf.text.pdf.PdfWriter;
 
 /**
  * A visitor strategy for creating documentation about a parts list.
  */
 public class PartsListVisitorStrategy extends BaseVisitorStrategy {
-
-    /**
-     * Accumulator for parts data.
-     */
-    private Map<PartsAccumulator, PartsAccumulator> crap = new HashMap<PartsAccumulator, PartsAccumulator>();
-    
-    /**
-     * Construct a strategy for visiting a parts hierarchy for the purposes of collecting details on those parts.
-     *
-     * @param doc              The iText document
-     * @param theWriter        The direct iText writer
-     * @param theStagesToVisit The stages to be visited by this strategy
-     */    
-    public PartsListVisitorStrategy (Document doc, PdfWriter theWriter, Set<Integer> theStagesToVisit) {
-        super(doc, theWriter, theStagesToVisit);
-    }
-    
-    /**
-     * {@inheritDoc}
-     */
-    @Override 
-    public void visit (final RingComponent visitable) {
-        final PartsAccumulator key = new PartsAccumulator(visitable);
-            PartsAccumulator pa = crap.get(key);
-        if (pa == null) {
-            pa = key;
-            crap.put(pa, pa);
-        }
-        pa.increment();
-        RocketComponent[] rc = visitable.getChildren();
-        goDeep(rc);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override 
-    public void visit (final InnerTube visitable) {
-        final PartsAccumulator key = new PartsAccumulator(visitable);
-            PartsAccumulator pa = crap.get(key);
-        if (pa == null) {
-            pa = key;
-            crap.put(pa, pa);
-        }
-        pa.increment();
-        RocketComponent[] rc = visitable.getChildren();
-        goDeep(rc);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override 
-    public void visit (final LaunchLug visitable) {
-        final PartsAccumulator key = new PartsAccumulator(visitable);
-            PartsAccumulator pa = crap.get(key);
-        if (pa == null) {
-            pa = key;
-            crap.put(pa, pa);
-        }
-        pa.increment();
-    }
-    
-    /**
-     * {@inheritDoc}
-     */
-    @Override 
-    public void visit (final Transition visitable) {
-        final PartsAccumulator key = new PartsAccumulator(visitable);
-            PartsAccumulator pa = crap.get(key);
-        if (pa == null) {
-            pa = key;
-            crap.put(pa, pa);
-        }
-        pa.increment();
-        RocketComponent[] rc = visitable.getChildren();
-        goDeep(rc);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override 
-    public void visit (final RadiusRingComponent visitable) {
-        final PartsAccumulator key = new PartsAccumulator(visitable);
-            PartsAccumulator pa = crap.get(key);
-        if (pa == null) {
-            pa = key;
-            crap.put(pa, pa);
-        }
-        pa.increment();
-        RocketComponent[] rc = visitable.getChildren();
-        goDeep(rc);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override 
-    public void visit (final NoseCone visitable) {
-        final PartsAccumulator key = new PartsAccumulator(visitable);
-            PartsAccumulator pa = crap.get(key);
-        if (pa == null) {
-            pa = key;
-            crap.put(pa, pa);
-        }
-        pa.increment();
-        RocketComponent[] rc = visitable.getChildren();
-        goDeep(rc);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override 
-    public void visit (final BodyTube visitable) {
-        final PartsAccumulator key = new PartsAccumulator(visitable);
-            PartsAccumulator pa = crap.get(key);
-        if (pa == null) {
-            pa = key;
-            crap.put(pa, pa);
-        }
-        pa.increment();
-        RocketComponent[] rc = visitable.getChildren();
-        goDeep(rc);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override 
-    public void visit (final TrapezoidFinSet visitable) {
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override 
-    public void visit (final EllipticalFinSet visitable) {
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override 
-    public void visit (final FreeformFinSet visitable) {
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override 
-    public void setParent (final ComponentVisitor theParent) {
-        parent = theParent;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override 
-    public void close () {
-        for (PartsAccumulator partsAccumulator : crap.keySet()) {
-            System.err.println(partsAccumulator.component.getComponentName() + " " + partsAccumulator.quantity);
-        }
-    }
-    
+       
+       /**
+        * Accumulator for parts data.
+        */
+       private Map<PartsAccumulator, PartsAccumulator> crap = new HashMap<PartsAccumulator, PartsAccumulator>();
+       
+       /**
+        * Construct a strategy for visiting a parts hierarchy for the purposes of collecting details on those parts.
+        *
+        * @param doc              The iText document
+        * @param theWriter        The direct iText writer
+        * @param theStagesToVisit The stages to be visited by this strategy
+        */
+       public PartsListVisitorStrategy(Document doc, PdfWriter theWriter, Set<Integer> theStagesToVisit) {
+               super(doc, theWriter, theStagesToVisit);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final RingComponent visitable) {
+               final PartsAccumulator key = new PartsAccumulator(visitable);
+               PartsAccumulator pa = crap.get(key);
+               if (pa == null) {
+                       pa = key;
+                       crap.put(pa, pa);
+               }
+               pa.increment();
+               List<RocketComponent> rc = visitable.getChildren();
+               goDeep(rc);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final InnerTube visitable) {
+               final PartsAccumulator key = new PartsAccumulator(visitable);
+               PartsAccumulator pa = crap.get(key);
+               if (pa == null) {
+                       pa = key;
+                       crap.put(pa, pa);
+               }
+               pa.increment();
+               List<RocketComponent> rc = visitable.getChildren();
+               goDeep(rc);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final LaunchLug visitable) {
+               final PartsAccumulator key = new PartsAccumulator(visitable);
+               PartsAccumulator pa = crap.get(key);
+               if (pa == null) {
+                       pa = key;
+                       crap.put(pa, pa);
+               }
+               pa.increment();
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final Transition visitable) {
+               final PartsAccumulator key = new PartsAccumulator(visitable);
+               PartsAccumulator pa = crap.get(key);
+               if (pa == null) {
+                       pa = key;
+                       crap.put(pa, pa);
+               }
+               pa.increment();
+               List<RocketComponent> rc = visitable.getChildren();
+               goDeep(rc);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final RadiusRingComponent visitable) {
+               final PartsAccumulator key = new PartsAccumulator(visitable);
+               PartsAccumulator pa = crap.get(key);
+               if (pa == null) {
+                       pa = key;
+                       crap.put(pa, pa);
+               }
+               pa.increment();
+               List<RocketComponent> rc = visitable.getChildren();
+               goDeep(rc);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final NoseCone visitable) {
+               final PartsAccumulator key = new PartsAccumulator(visitable);
+               PartsAccumulator pa = crap.get(key);
+               if (pa == null) {
+                       pa = key;
+                       crap.put(pa, pa);
+               }
+               pa.increment();
+               List<RocketComponent> rc = visitable.getChildren();
+               goDeep(rc);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final BodyTube visitable) {
+               final PartsAccumulator key = new PartsAccumulator(visitable);
+               PartsAccumulator pa = crap.get(key);
+               if (pa == null) {
+                       pa = key;
+                       crap.put(pa, pa);
+               }
+               pa.increment();
+               List<RocketComponent> rc = visitable.getChildren();
+               goDeep(rc);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final TrapezoidFinSet visitable) {
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final EllipticalFinSet visitable) {
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final FreeformFinSet visitable) {
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void setParent(final ComponentVisitor theParent) {
+               parent = theParent;
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void close() {
+               for (PartsAccumulator partsAccumulator : crap.keySet()) {
+                       System.err.println(partsAccumulator.component.getComponentName() + " " + partsAccumulator.quantity);
+               }
+       }
+       
 }
 
 class PartsAccumulator {
-    
-    int quantity = 0;
-    
-    RocketComponent component;
-    
-    PartsAccumulator (RocketComponent theComponent) {
-        component = theComponent;
-    }
-
-    void increment() {
-        quantity++;
-    }
-    
-    int quantity() {
-        return quantity;
-    }
-    
-    public boolean equals (final Object o1) {
-        if (this == o1) {
-            return true;
-        }
-        
-        RocketComponent that;
-        if (o1 instanceof net.sf.openrocket.gui.print.visitor.PartsAccumulator) {
-            that = ((net.sf.openrocket.gui.print.visitor.PartsAccumulator)o1).component;
-        }
-        else if (o1 instanceof RocketComponent) {
-            that = (RocketComponent)o1;
-        }
-        else {
-            return false;
-        }
-        
-        if (this.component.getClass().equals(that.getClass())) {
-            //If 
-            if (that.getLength() == this.component.getLength()) {
-                if (that.getMass() == this.component.getMass()) {
-                    return true;
-                }
-            }
-            if (this.component instanceof Coaxial &&
-                that instanceof Coaxial) {
-                Coaxial cThis = (Coaxial)this.component;
-                Coaxial cThat = (Coaxial)that;
-                if (cThis.getInnerRadius() == cThat.getInnerRadius() &&
-                        cThis.getOuterRadius() == cThat.getOuterRadius()) {
-                    return true;
-                }
-            }
-            return false;
-        }
-        return false;
-    }
-    
-    public int hashCode() {
-        return component.getComponentName().hashCode();
-    }
+       
+       int quantity = 0;
+       
+       RocketComponent component;
+       
+       PartsAccumulator(RocketComponent theComponent) {
+               component = theComponent;
+       }
+       
+       void increment() {
+               quantity++;
+       }
+       
+       int quantity() {
+               return quantity;
+       }
+       
+       @Override
+       public boolean equals(final Object o1) {
+               if (this == o1) {
+                       return true;
+               }
+               
+               RocketComponent that;
+               if (o1 instanceof net.sf.openrocket.gui.print.visitor.PartsAccumulator) {
+                       that = ((net.sf.openrocket.gui.print.visitor.PartsAccumulator) o1).component;
+               } else if (o1 instanceof RocketComponent) {
+                       that = (RocketComponent) o1;
+               } else {
+                       return false;
+               }
+               
+               if (this.component.getClass().equals(that.getClass())) {
+                       //If 
+                       if (that.getLength() == this.component.getLength()) {
+                               if (that.getMass() == this.component.getMass()) {
+                                       return true;
+                               }
+                       }
+                       if (this.component instanceof Coaxial &&
+                                       that instanceof Coaxial) {
+                               Coaxial cThis = (Coaxial) this.component;
+                               Coaxial cThat = (Coaxial) that;
+                               if (cThis.getInnerRadius() == cThat.getInnerRadius() &&
+                                               cThis.getOuterRadius() == cThat.getOuterRadius()) {
+                                       return true;
+                               }
+                       }
+                       return false;
+               }
+               return false;
+       }
+       
+       @Override
+       public int hashCode() {
+               return component.getComponentName().hashCode();
+       }
 }
\ No newline at end of file
index f0aeb1b857730a70e8c652d48b43060c9ab52a54..00931b11f40a35e8225f297ab25c3a6c6ae37cdf 100644 (file)
@@ -3,6 +3,9 @@
  */
 package net.sf.openrocket.gui.print.visitor;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import net.sf.openrocket.rocketcomponent.BodyComponent;
 import net.sf.openrocket.rocketcomponent.BodyTube;
 import net.sf.openrocket.rocketcomponent.ComponentVisitor;
@@ -22,238 +25,236 @@ import net.sf.openrocket.rocketcomponent.Stage;
 import net.sf.openrocket.rocketcomponent.Transition;
 import net.sf.openrocket.rocketcomponent.TrapezoidFinSet;
 
-import java.util.ArrayList;
-import java.util.List;
-
 /**
  * This visitor strategy accumulates Stage references in a Rocket hierarchy.
  */
 public class StageVisitorStrategy implements ComponentVisitorStrategy {
-
-    /**
-     * The collection of stages, accumulated during a visitation.
-     */
-    private List<Double> stageComponents = new ArrayList<Double>();
-
-    private Double mass = 0d;
-
-    /**
-     * The owning visitor.
-     */
-    protected ComponentVisitor parent;
-
-    /**
-     * Constructor.
-     */
-    public StageVisitorStrategy () {
-    }
-
-    /**
-     * Override the method that determines if the visiting should be going deep.
-     *
-     * @param stageNumber a stage number
-     *
-     * @return true, always
-     */
-    public boolean shouldVisitStage (int stageNumber) {
-        return true;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setParent (final ComponentVisitor theParent) {
-        parent = theParent;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final Rocket visitable) {
-        goDeep(visitable);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final Stage visitable) {
-
-        if (mass > 0d) {
-            stageComponents.add(mass);
-        }
-        mass = 0d;
-        RocketComponent[] rc = visitable.getChildren();
-        goDeep(rc);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final RocketComponent visitable) {
-        mass += visitable.getMass();
-        goDeep(visitable);
-    }
-
-    /**
-     * Recurse through the given rocket component.
-     *
-     * @param root the root component; all children will be visited recursively
-     */
-    protected void goDeep (final RocketComponent root) {
-        RocketComponent[] rc = root.getChildren();
-        goDeep(rc);
-    }
-
-
-    /**
-     * Recurse through the given rocket component.
-     *
-     * @param theRc an array of rocket components; all children will be visited recursively
-     */
-    protected void goDeep (final RocketComponent[] theRc) {
-        for (RocketComponent rocketComponent : theRc) {
-            rocketComponent.accept(parent);
-        }
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final ExternalComponent visitable) {
-        mass += visitable.getMass();
-        goDeep(visitable);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final BodyComponent visitable) {
-        mass += visitable.getMass();
-        goDeep(visitable);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final RingComponent visitable) {
-        mass += visitable.getMass();
-        goDeep(visitable);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final InnerTube visitable) {
-        mass += visitable.getMass();
-        goDeep(visitable);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final LaunchLug visitable) {
-        mass += visitable.getMass();
-        goDeep(visitable);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final Transition visitable) {
-        mass += visitable.getMass();
-        goDeep(visitable);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final RadiusRingComponent visitable) {
-        mass += visitable.getMass();
-        goDeep(visitable);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final MassObject visitable) {
-        mass += visitable.getMass();
-        goDeep(visitable);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final NoseCone visitable) {
-        mass += visitable.getMass();
-        goDeep(visitable);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final BodyTube visitable) {
-        mass += visitable.getMass();
-        goDeep(visitable);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final TrapezoidFinSet visitable) {
-        mass += visitable.getMass();
-        goDeep(visitable);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final EllipticalFinSet visitable) {
-        mass += visitable.getMass();
-        goDeep(visitable);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void visit (final FreeformFinSet visitable) {
-        mass += visitable.getMass();
-        goDeep(visitable);
-    }
-
-    /**
-     * Get the list of stages, sort from Stage 1 .. Stage N.
-     *
-     * @return a sorted list of stages
-     */
-    public List<Double> getStages () {
-        return stageComponents;
-    }
-
-    /**
-     * Close by setting the last stage.
-     */
-    public void close () {
-        if (mass > 0d) {
-            stageComponents.add(mass);
-        }
-    }
-
+       
+       /**
+        * The collection of stages, accumulated during a visitation.
+        */
+       private List<Double> stageComponents = new ArrayList<Double>();
+       
+       private Double mass = 0d;
+       
+       /**
+        * The owning visitor.
+        */
+       protected ComponentVisitor parent;
+       
+       /**
+        * Constructor.
+        */
+       public StageVisitorStrategy() {
+       }
+       
+       /**
+        * Override the method that determines if the visiting should be going deep.
+        *
+        * @param stageNumber a stage number
+        *
+        * @return true, always
+        */
+       public boolean shouldVisitStage(int stageNumber) {
+               return true;
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void setParent(final ComponentVisitor theParent) {
+               parent = theParent;
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final Rocket visitable) {
+               goDeep(visitable);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final Stage visitable) {
+               
+               if (mass > 0d) {
+                       stageComponents.add(mass);
+               }
+               mass = 0d;
+               List<RocketComponent> rc = visitable.getChildren();
+               goDeep(rc);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final RocketComponent visitable) {
+               mass += visitable.getMass();
+               goDeep(visitable);
+       }
+       
+       /**
+        * Recurse through the given rocket component.
+        *
+        * @param root the root component; all children will be visited recursively
+        */
+       protected void goDeep(final RocketComponent root) {
+               List<RocketComponent> rc = root.getChildren();
+               goDeep(rc);
+       }
+       
+       
+       /**
+        * Recurse through the given rocket component.
+        *
+        * @param theRc an array of rocket components; all children will be visited recursively
+        */
+       protected void goDeep(final List<RocketComponent> theRc) {
+               for (RocketComponent rocketComponent : theRc) {
+                       rocketComponent.accept(parent);
+               }
+       }
+       
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final ExternalComponent visitable) {
+               mass += visitable.getMass();
+               goDeep(visitable);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final BodyComponent visitable) {
+               mass += visitable.getMass();
+               goDeep(visitable);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final RingComponent visitable) {
+               mass += visitable.getMass();
+               goDeep(visitable);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final InnerTube visitable) {
+               mass += visitable.getMass();
+               goDeep(visitable);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final LaunchLug visitable) {
+               mass += visitable.getMass();
+               goDeep(visitable);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final Transition visitable) {
+               mass += visitable.getMass();
+               goDeep(visitable);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final RadiusRingComponent visitable) {
+               mass += visitable.getMass();
+               goDeep(visitable);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final MassObject visitable) {
+               mass += visitable.getMass();
+               goDeep(visitable);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final NoseCone visitable) {
+               mass += visitable.getMass();
+               goDeep(visitable);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final BodyTube visitable) {
+               mass += visitable.getMass();
+               goDeep(visitable);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final TrapezoidFinSet visitable) {
+               mass += visitable.getMass();
+               goDeep(visitable);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final EllipticalFinSet visitable) {
+               mass += visitable.getMass();
+               goDeep(visitable);
+       }
+       
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void visit(final FreeformFinSet visitable) {
+               mass += visitable.getMass();
+               goDeep(visitable);
+       }
+       
+       /**
+        * Get the list of stages, sort from Stage 1 .. Stage N.
+        *
+        * @return a sorted list of stages
+        */
+       public List<Double> getStages() {
+               return stageComponents;
+       }
+       
+       /**
+        * Close by setting the last stage.
+        */
+       @Override
+       public void close() {
+               if (mass > 0d) {
+                       stageComponents.add(mass);
+               }
+       }
+       
 }