Source of Invoice.java


  1: import java.util.*;
  2: import javax.swing.event.*;

  4: /**
  5:    An invoice for a sale, consisting of line items.
  6: */
  7: public class Invoice
  8: {
  9:    /**
 10:       Constructs a blank invoice.
 11:    */
 12:    public Invoice()
 13:    {
 14:       items = new ArrayList<LineItem>();
 15:       listeners = new ArrayList<ChangeListener>();
 16:    }

 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 (ChangeListener listener : listeners)
 28:          listener.stateChanged(event);
 29:    }

 31:    /**
 32:       Adds a change listener to the invoice.
 33:       @param listener the change listener to add
 34:    */
 35:    public void addChangeListener(ChangeListener listener)
 36:    {
 37:       listeners.add(listener);
 38:    }

 40:    /**
 41:       Gets an iterator that iterates through the items.
 42:       @return an iterator for the items
 43:    */
 44:    public Iterator<LineItem> getItems()
 45:    {
 46:       return new
 47:          Iterator<LineItem>()
 48:          {
 49:             public boolean hasNext()
 50:             {
 51:                return current < items.size();
 52:             }

 54:             public LineItem next()
 55:             {
 56:                return items.get(current++);
 57:             }

 59:             public void remove()
 60:             {
 61:                throw new UnsupportedOperationException();
 62:             }

 64:             private int current = 0;
 65:          };
 66:    }

 68:    public String format(InvoiceFormatter formatter)
 69:    {
 70:       String r = formatter.formatHeader();
 71:       Iterator<LineItem>iter = getItems();
 72:       while (iter.hasNext())
 73:          r += formatter.formatLineItem(iter.next());
 74:       return r + formatter.formatFooter();
 75:    }

 77:    private ArrayList<LineItem> items;
 78:    private ArrayList<ChangeListener> listeners;
 79: }