DGP - merged printing support from branch
[debian/openrocket] / 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     private final Map<OpenRocketPrintable, Set<Integer>> previous = new TreeMap<OpenRocketPrintable, Set<Integer>>();
29
30     
31     public PrintableContext () {
32     }
33
34     /**
35      * Constructor.
36      *
37      * @param theStageNumber the stage number of the printable; may be null if not applicable
38      * @param thePrintable   the type of the thing to be printed
39      *
40      * @throws IllegalArgumentException thrown if thePrintable.isStageSpecific
41      */
42     private PrintableContext (final Set<Integer> theStageNumber, final OpenRocketPrintable thePrintable)
43             throws IllegalArgumentException {
44         if (thePrintable.isStageSpecific() && theStageNumber == null) {
45             throw new IllegalArgumentException("A stage number must be provided when a printable is stage specific.");
46         }
47         stageNumber = theStageNumber;
48         printable = thePrintable;
49     }
50
51     public void add (final Integer theStageNumber, final OpenRocketPrintable thePrintable)
52             throws IllegalArgumentException {
53         Set<Integer> stages = previous.get(thePrintable);
54         if (stages == null) {
55             stages = new TreeSet<Integer>();
56             previous.put(thePrintable, stages);
57         }
58         if (theStageNumber != null) {
59             stages.add(theStageNumber);
60         }
61     }
62
63
64     public Iterator<PrintableContext> iterator () {
65         return new Iterator<PrintableContext>() {
66
67             Iterator<OpenRocketPrintable> keyIter = previous.keySet().iterator();
68
69             @Override
70             public boolean hasNext () {
71                 return keyIter.hasNext();
72             }
73
74             @Override
75             public PrintableContext next () {
76                 final OpenRocketPrintable key = keyIter.next();
77                 return new PrintableContext(previous.get(key), key);
78             }
79
80             @Override
81             public void remove () {
82             }
83         };
84
85     }
86
87     /**
88      * Get the stage number, if it's applicable to the printable.
89      *
90      * @return the stage number
91      */
92     public Set<Integer> getStageNumber () {
93         return stageNumber;
94     }
95
96     /**
97      * Get the printable.
98      *
99      * @return the printable
100      */
101     public OpenRocketPrintable getPrintable () {
102         return printable;
103     }
104
105     @Override
106     public int compareTo (final PrintableContext other) {
107         return this.printable.getPrintOrder() - other.printable.getPrintOrder();
108     }
109
110 }