01: import java.util.*;
02: import javax.swing.event.*;
03:
04: /**
05: An invoice for a sale, consisting of line items.
06: */
07: public class Invoice
08: {
09: /**
10: Constructs a blank invoice.
11: */
12: public Invoice()
13: {
14: items = new ArrayList();
15: listeners = new ArrayList();
16: }
17:
18: /**
19: Adds an item to the invoice.
20: @param item the item to add
21: */
22: public void addItem(LineItem item)
23: {
24: items.add(item);
25: // notify all observers of the change to the invoice
26: ChangeEvent event = new ChangeEvent(this);
27: for (int i = 0; i < listeners.size(); i++)
28: {
29: ChangeListener listener
30: = (ChangeListener) listeners.get(i);
31: listener.stateChanged(event);
32: }
33: }
34:
35: /**
36: Adds a change listener to the invoice.
37: @param listener the change listener to add
38: */
39: public void addChangeListener(ChangeListener listener)
40: {
41: listeners.add(listener);
42: }
43:
44: /**
45: Gets an iterator that iterates through the items.
46: @return an iterator for the items
47: */
48: public Iterator getItems()
49: {
50: return new
51: Iterator()
52: {
53: public boolean hasNext()
54: {
55: return current < items.size();
56: }
57: public Object next()
58: {
59: Object r = items.get(current);
60: current++;
61: return r;
62: }
63: public void remove()
64: {
65: throw new UnsupportedOperationException();
66: }
67: private int current = 0;
68: };
69: }
70:
71: public String format(InvoiceFormatter formatter)
72: {
73: String r = formatter.formatHeader();
74: Iterator iter = getItems();
75: while (iter.hasNext())
76: {
77: LineItem item = (LineItem) iter.next();
78: r += formatter.formatLineItem(item);
79: }
80: return r + formatter.formatFooter();
81: }
82:
83: private ArrayList items;
84: private ArrayList listeners;
85: }