create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / gui / print / PrintableContext.java
1 /*
2  * PrintableContext.java
3  *
4  */
5 package net.sf.openrocket.gui.print;
6
7 import java.util.Iterator;
8 import java.util.Map;
9 import java.util.Set;
10 import java.util.TreeMap;
11 import java.util.TreeSet;
12
13 /**
14  * Instances of this class are meant to keep track of what the user has selected to be printed.
15  */
16 public class PrintableContext implements Comparable<PrintableContext>, Iterable<PrintableContext> {
17         
18         /**
19          * The stage number.  May be null for printables that have no stage meaning.
20          */
21         private Set<Integer> stageNumber;
22         
23         /**
24          * The type of thing to be printed.
25          */
26         private OpenRocketPrintable printable;
27         
28         /**
29          * Sort of a reverse map that tracks each type of printable item and the stages for which that item is to be printed.
30          */
31         private final Map<OpenRocketPrintable, Set<Integer>> previous = new TreeMap<OpenRocketPrintable, Set<Integer>>();
32         
33         /**
34          * Constructor.
35          */
36         public PrintableContext() {
37         }
38         
39         /**
40          * Constructor.
41          *
42          * @param theStageNumber the stage number of the printable; may be null if not applicable
43          * @param thePrintable   the type of the thing to be printed
44          *
45          * @throws IllegalArgumentException thrown if thePrintable.isStageSpecific
46          */
47         private PrintableContext(final Set<Integer> theStageNumber, final OpenRocketPrintable thePrintable)
48                         throws IllegalArgumentException {
49                 if (thePrintable.isStageSpecific() && theStageNumber == null) {
50                         throw new IllegalArgumentException("A stage number must be provided when a printable is stage specific.");
51                 }
52                 stageNumber = theStageNumber;
53                 printable = thePrintable;
54         }
55         
56         /**
57          * Add a type of printable to a stage (number).
58          *
59          * @param theStageNumber  the stage number
60          * @param thePrintable    the printable to associate with the stage
61          */
62         public void add(final Integer theStageNumber, final OpenRocketPrintable thePrintable) {
63                 Set<Integer> stages = previous.get(thePrintable);
64                 if (stages == null) {
65                         stages = new TreeSet<Integer>();
66                         previous.put(thePrintable, stages);
67                 }
68                 if (theStageNumber != null) {
69                         stages.add(theStageNumber);
70                 }
71         }
72         
73         /** PrintableContext iterator. */
74         @Override
75         public Iterator<PrintableContext> iterator() {
76                 return new Iterator<PrintableContext>() {
77                         
78                         Iterator<OpenRocketPrintable> keyIter = previous.keySet().iterator();
79                         
80                         @Override
81                         public boolean hasNext() {
82                                 return keyIter.hasNext();
83                         }
84                         
85                         @Override
86                         public PrintableContext next() {
87                                 final OpenRocketPrintable key = keyIter.next();
88                                 return new PrintableContext(previous.get(key), key);
89                         }
90                         
91                         @Override
92                         public void remove() {
93                         }
94                 };
95                 
96         }
97         
98         /**
99          * Get the stage number, if it's applicable to the printable.
100          *
101          * @return the stage number
102          */
103         public Set<Integer> getStageNumber() {
104                 return stageNumber;
105         }
106         
107         /**
108          * Get the printable.
109          *
110          * @return the printable
111          */
112         public OpenRocketPrintable getPrintable() {
113                 return printable;
114         }
115         
116         @Override
117         public int compareTo(final PrintableContext other) {
118                 return this.printable.getPrintOrder() - other.printable.getPrintOrder();
119         }
120         
121 }