<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDesign_Pattern%2FState_Pattern</id>
		<title>Java/Design Pattern/State Pattern - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDesign_Pattern%2FState_Pattern"/>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/Design_Pattern/State_Pattern&amp;action=history"/>
		<updated>2026-04-17T02:18:10Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://jexp.ru/index.php?title=Java/Design_Pattern/State_Pattern&amp;diff=7819&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/Design_Pattern/State_Pattern&amp;diff=7819&amp;oldid=prev"/>
				<updated>2010-06-01T06:50:54Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:50, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://jexp.ru/index.php?title=Java/Design_Pattern/State_Pattern&amp;diff=7818&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/Design_Pattern/State_Pattern&amp;diff=7818&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:45Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Dynamically changing the behavior of an object via composition (the State design pattern) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// : c07:Transmogrify.java&lt;br /&gt;
// Dynamically changing the behavior of an object via composition (the State design pattern).&lt;br /&gt;
// From &amp;quot;Thinking in Java, 3rd ed.&amp;quot; (c) Bruce Eckel 2002&lt;br /&gt;
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.&lt;br /&gt;
abstract class Actor {&lt;br /&gt;
  public abstract void act();&lt;br /&gt;
}&lt;br /&gt;
class HappyActor extends Actor {&lt;br /&gt;
  public void act() {&lt;br /&gt;
    System.out.println(&amp;quot;HappyActor&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class SadActor extends Actor {&lt;br /&gt;
  public void act() {&lt;br /&gt;
    System.out.println(&amp;quot;SadActor&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class Stage {&lt;br /&gt;
  private Actor actor = new HappyActor();&lt;br /&gt;
  public void change() {&lt;br /&gt;
    actor = new SadActor();&lt;br /&gt;
  }&lt;br /&gt;
  public void performPlay() {&lt;br /&gt;
    actor.act();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
public class Transmogrify {&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    Stage stage = new Stage();&lt;br /&gt;
    stage.performPlay();&lt;br /&gt;
    stage.change();&lt;br /&gt;
    stage.performPlay();&lt;br /&gt;
  }&lt;br /&gt;
} ///:~&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== State Pattern in Java ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//[C] 2002 Sun Microsystems, Inc.---&lt;br /&gt;
import java.awt.BorderLayout;&lt;br /&gt;
import java.awt.Container;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&lt;br /&gt;
import java.awt.event.WindowAdapter;&lt;br /&gt;
import java.awt.event.WindowEvent;&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import java.io.FileInputStream;&lt;br /&gt;
import java.io.FileOutputStream;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.ObjectInputStream;&lt;br /&gt;
import java.io.ObjectOutputStream;&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.Calendar;&lt;br /&gt;
import java.util.Date;&lt;br /&gt;
import javax.swing.BoxLayout;&lt;br /&gt;
import javax.swing.JButton;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
import javax.swing.JScrollPane;&lt;br /&gt;
import javax.swing.JTable;&lt;br /&gt;
import javax.swing.table.AbstractTableModel;&lt;br /&gt;
public class RunStatePattern {&lt;br /&gt;
  public static void main(String[] arguments) {&lt;br /&gt;
    System.out.println(&amp;quot;Example for the State pattern&amp;quot;);&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    if (!(new File(&amp;quot;appointments.ser&amp;quot;).exists())) {&lt;br /&gt;
      DataCreator.serialize(&amp;quot;appointments.ser&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    System.out.println(&amp;quot;Creating CalendarEditor&amp;quot;);&lt;br /&gt;
    CalendarEditor appointmentBook = new CalendarEditor();&lt;br /&gt;
    System.out.println(&amp;quot;&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot;Created. Appointments:&amp;quot;);&lt;br /&gt;
    System.out.println(appointmentBook.getAppointments());&lt;br /&gt;
    System.out.println(&amp;quot;Created. Creating GUI:&amp;quot;);&lt;br /&gt;
    StateGui application = new StateGui(appointmentBook);&lt;br /&gt;
    application.createGui();&lt;br /&gt;
    System.out.println(&amp;quot;&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
interface State {&lt;br /&gt;
  public void save();&lt;br /&gt;
  public void edit();&lt;br /&gt;
}&lt;br /&gt;
interface Contact extends Serializable {&lt;br /&gt;
  public static final String SPACE = &amp;quot; &amp;quot;;&lt;br /&gt;
  public String getFirstName();&lt;br /&gt;
  public String getLastName();&lt;br /&gt;
  public String getTitle();&lt;br /&gt;
  public String getOrganization();&lt;br /&gt;
  public void setFirstName(String newFirstName);&lt;br /&gt;
  public void setLastName(String newLastName);&lt;br /&gt;
  public void setTitle(String newTitle);&lt;br /&gt;
  public void setOrganization(String newOrganization);&lt;br /&gt;
}&lt;br /&gt;
class ContactImpl implements Contact {&lt;br /&gt;
  private String firstName;&lt;br /&gt;
  private String lastName;&lt;br /&gt;
  private String title;&lt;br /&gt;
  private String organization;&lt;br /&gt;
  public ContactImpl() {&lt;br /&gt;
  }&lt;br /&gt;
  public ContactImpl(String newFirstName, String newLastName,&lt;br /&gt;
      String newTitle, String newOrganization) {&lt;br /&gt;
    firstName = newFirstName;&lt;br /&gt;
    lastName = newLastName;&lt;br /&gt;
    title = newTitle;&lt;br /&gt;
    organization = newOrganization;&lt;br /&gt;
  }&lt;br /&gt;
  public String getFirstName() {&lt;br /&gt;
    return firstName;&lt;br /&gt;
  }&lt;br /&gt;
  public String getLastName() {&lt;br /&gt;
    return lastName;&lt;br /&gt;
  }&lt;br /&gt;
  public String getTitle() {&lt;br /&gt;
    return title;&lt;br /&gt;
  }&lt;br /&gt;
  public String getOrganization() {&lt;br /&gt;
    return organization;&lt;br /&gt;
  }&lt;br /&gt;
  public void setFirstName(String newFirstName) {&lt;br /&gt;
    firstName = newFirstName;&lt;br /&gt;
  }&lt;br /&gt;
  public void setLastName(String newLastName) {&lt;br /&gt;
    lastName = newLastName;&lt;br /&gt;
  }&lt;br /&gt;
  public void setTitle(String newTitle) {&lt;br /&gt;
    title = newTitle;&lt;br /&gt;
  }&lt;br /&gt;
  public void setOrganization(String newOrganization) {&lt;br /&gt;
    organization = newOrganization;&lt;br /&gt;
  }&lt;br /&gt;
  public String toString() {&lt;br /&gt;
    return firstName + SPACE + lastName;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
interface Location extends Serializable {&lt;br /&gt;
  public String getLocation();&lt;br /&gt;
  public void setLocation(String newLocation);&lt;br /&gt;
}&lt;br /&gt;
class LocationImpl implements Location {&lt;br /&gt;
  private String location;&lt;br /&gt;
  public LocationImpl() {&lt;br /&gt;
  }&lt;br /&gt;
  public LocationImpl(String newLocation) {&lt;br /&gt;
    location = newLocation;&lt;br /&gt;
  }&lt;br /&gt;
  public String getLocation() {&lt;br /&gt;
    return location;&lt;br /&gt;
  }&lt;br /&gt;
  public void setLocation(String newLocation) {&lt;br /&gt;
    location = newLocation;&lt;br /&gt;
  }&lt;br /&gt;
  public String toString() {&lt;br /&gt;
    return location;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class FileLoader {&lt;br /&gt;
  public static Object loadData(File inputFile) {&lt;br /&gt;
    Object returnValue = null;&lt;br /&gt;
    try {&lt;br /&gt;
      if (inputFile.exists()) {&lt;br /&gt;
        if (inputFile.isFile()) {&lt;br /&gt;
          ObjectInputStream readIn = new ObjectInputStream(&lt;br /&gt;
              new FileInputStream(inputFile));&lt;br /&gt;
          returnValue = readIn.readObject();&lt;br /&gt;
          readIn.close();&lt;br /&gt;
        } else {&lt;br /&gt;
          System.err.println(inputFile + &amp;quot; is a directory.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
      } else {&lt;br /&gt;
        System.err.println(&amp;quot;File &amp;quot; + inputFile + &amp;quot; does not exist.&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
    } catch (ClassNotFoundException exc) {&lt;br /&gt;
      exc.printStackTrace();&lt;br /&gt;
    } catch (IOException exc) {&lt;br /&gt;
      exc.printStackTrace();&lt;br /&gt;
    }&lt;br /&gt;
    return returnValue;&lt;br /&gt;
  }&lt;br /&gt;
  public static void storeData(File outputFile, Serializable data) {&lt;br /&gt;
    try {&lt;br /&gt;
      ObjectOutputStream writeOut = new ObjectOutputStream(&lt;br /&gt;
          new FileOutputStream(outputFile));&lt;br /&gt;
      writeOut.writeObject(data);&lt;br /&gt;
      writeOut.close();&lt;br /&gt;
    } catch (IOException exc) {&lt;br /&gt;
      exc.printStackTrace();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class DataCreator {&lt;br /&gt;
  private static final String DEFAULT_FILE = &amp;quot;data.ser&amp;quot;;&lt;br /&gt;
  private static Calendar dateCreator = Calendar.getInstance();&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    String fileName;&lt;br /&gt;
    if (args.length == 1) {&lt;br /&gt;
      fileName = args[0];&lt;br /&gt;
    } else {&lt;br /&gt;
      fileName = DEFAULT_FILE;&lt;br /&gt;
    }&lt;br /&gt;
    serialize(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  public static void serialize(String fileName) {&lt;br /&gt;
    try {&lt;br /&gt;
      serializeToFile(createData(), fileName);&lt;br /&gt;
    } catch (IOException exc) {&lt;br /&gt;
      exc.printStackTrace();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  private static Serializable createData() {&lt;br /&gt;
    ArrayList appointments = new ArrayList();&lt;br /&gt;
    ArrayList contacts = new ArrayList();&lt;br /&gt;
    contacts.add(new ContactImpl(&amp;quot;Test&amp;quot;, &amp;quot;Subject&amp;quot;, &amp;quot;Volunteer&amp;quot;,&lt;br /&gt;
        &amp;quot;United Patterns Consortium&amp;quot;));&lt;br /&gt;
    Location location1 = new LocationImpl(&amp;quot;Punxsutawney, PA&amp;quot;);&lt;br /&gt;
    appointments.add(new Appointment(&amp;quot;Slowpokes anonymous&amp;quot;, contacts,&lt;br /&gt;
        location1, createDate(2001, 1, 1, 12, 01), createDate(2001, 1,&lt;br /&gt;
            1, 12, 02)));&lt;br /&gt;
    appointments.add(new Appointment(&amp;quot;Java focus group&amp;quot;, contacts,&lt;br /&gt;
        location1, createDate(2001, 1, 1, 12, 30), createDate(2001, 1,&lt;br /&gt;
            1, 14, 30)));&lt;br /&gt;
    appointments&lt;br /&gt;
        .add(new Appointment(&amp;quot;Something else&amp;quot;, contacts, location1,&lt;br /&gt;
            createDate(2001, 1, 1, 12, 01), createDate(2001, 1, 1,&lt;br /&gt;
                12, 02)));&lt;br /&gt;
    appointments.add(new Appointment(&amp;quot;Yet another thingie&amp;quot;, contacts,&lt;br /&gt;
        location1, createDate(2001, 1, 1, 12, 01), createDate(2001, 1,&lt;br /&gt;
            1, 12, 02)));&lt;br /&gt;
    return appointments;&lt;br /&gt;
  }&lt;br /&gt;
  private static void serializeToFile(Serializable content, String fileName)&lt;br /&gt;
      throws IOException {&lt;br /&gt;
    ObjectOutputStream serOut = new ObjectOutputStream(&lt;br /&gt;
        new FileOutputStream(fileName));&lt;br /&gt;
    serOut.writeObject(content);&lt;br /&gt;
    serOut.close();&lt;br /&gt;
  }&lt;br /&gt;
  public static Date createDate(int year, int month, int day, int hour,&lt;br /&gt;
      int minute) {&lt;br /&gt;
    dateCreator.set(year, month, day, hour, minute);&lt;br /&gt;
    return dateCreator.getTime();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class Appointment implements Serializable {&lt;br /&gt;
  private String reason;&lt;br /&gt;
  private ArrayList contacts;&lt;br /&gt;
  private Location location;&lt;br /&gt;
  private Date startDate;&lt;br /&gt;
  private Date endDate;&lt;br /&gt;
  public Appointment(String reason, ArrayList contacts, Location location,&lt;br /&gt;
      Date startDate, Date endDate) {&lt;br /&gt;
    this.reason = reason;&lt;br /&gt;
    this.contacts = contacts;&lt;br /&gt;
    this.location = location;&lt;br /&gt;
    this.startDate = startDate;&lt;br /&gt;
    this.endDate = endDate;&lt;br /&gt;
  }&lt;br /&gt;
  public String getReason() {&lt;br /&gt;
    return reason;&lt;br /&gt;
  }&lt;br /&gt;
  public ArrayList getContacts() {&lt;br /&gt;
    return contacts;&lt;br /&gt;
  }&lt;br /&gt;
  public Location getLocation() {&lt;br /&gt;
    return location;&lt;br /&gt;
  }&lt;br /&gt;
  public Date getStartDate() {&lt;br /&gt;
    return startDate;&lt;br /&gt;
  }&lt;br /&gt;
  public Date getEndDate() {&lt;br /&gt;
    return endDate;&lt;br /&gt;
  }&lt;br /&gt;
  public void setReason(String reason) {&lt;br /&gt;
    this.reason = reason;&lt;br /&gt;
  }&lt;br /&gt;
  public void setContacts(ArrayList contacts) {&lt;br /&gt;
    this.contacts = contacts;&lt;br /&gt;
  }&lt;br /&gt;
  public void setLocation(Location location) {&lt;br /&gt;
    this.location = location;&lt;br /&gt;
  }&lt;br /&gt;
  public void setStartDate(Date startDate) {&lt;br /&gt;
    this.startDate = startDate;&lt;br /&gt;
  }&lt;br /&gt;
  public void setEndDate(Date endDate) {&lt;br /&gt;
    this.endDate = endDate;&lt;br /&gt;
  }&lt;br /&gt;
  public String toString() {&lt;br /&gt;
    return &amp;quot;Appointment:&amp;quot; + &amp;quot;\n    Reason: &amp;quot; + reason + &amp;quot;\n    Location: &amp;quot;&lt;br /&gt;
        + location + &amp;quot;\n    Start: &amp;quot; + startDate + &amp;quot;\n    End: &amp;quot;&lt;br /&gt;
        + endDate + &amp;quot;\n&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class CalendarEditor {&lt;br /&gt;
  private State currentState;&lt;br /&gt;
  private File appointmentFile;&lt;br /&gt;
  private ArrayList appointments = new ArrayList();&lt;br /&gt;
  private static final String DEFAULT_APPOINTMENT_FILE = &amp;quot;appointments.ser&amp;quot;;&lt;br /&gt;
  public CalendarEditor() {&lt;br /&gt;
    this(DEFAULT_APPOINTMENT_FILE);&lt;br /&gt;
  }&lt;br /&gt;
  public CalendarEditor(String appointmentFileName) {&lt;br /&gt;
    appointmentFile = new File(appointmentFileName);&lt;br /&gt;
    try {&lt;br /&gt;
      appointments = (ArrayList) FileLoader.loadData(appointmentFile);&lt;br /&gt;
    } catch (ClassCastException exc) {&lt;br /&gt;
      System.err&lt;br /&gt;
          .println(&amp;quot;Unable to load information. The file does not contain a list of appointments.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    currentState = new CleanState();&lt;br /&gt;
  }&lt;br /&gt;
  public void save() {&lt;br /&gt;
    currentState.save();&lt;br /&gt;
  }&lt;br /&gt;
  public void edit() {&lt;br /&gt;
    currentState.edit();&lt;br /&gt;
  }&lt;br /&gt;
  private class DirtyState implements State {&lt;br /&gt;
    private State nextState;&lt;br /&gt;
    public DirtyState(State nextState) {&lt;br /&gt;
      this.nextState = nextState;&lt;br /&gt;
    }&lt;br /&gt;
    public void save() {&lt;br /&gt;
      FileLoader.storeData(appointmentFile, appointments);&lt;br /&gt;
      currentState = nextState;&lt;br /&gt;
    }&lt;br /&gt;
    public void edit() {&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  private class CleanState implements State {&lt;br /&gt;
    private State nextState = new DirtyState(this);&lt;br /&gt;
    public void save() {&lt;br /&gt;
    }&lt;br /&gt;
    public void edit() {&lt;br /&gt;
      currentState = nextState;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public ArrayList getAppointments() {&lt;br /&gt;
    return appointments;&lt;br /&gt;
  }&lt;br /&gt;
  public void addAppointment(Appointment appointment) {&lt;br /&gt;
    if (!appointments.contains(appointment)) {&lt;br /&gt;
      appointments.add(appointment);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public void removeAppointment(Appointment appointment) {&lt;br /&gt;
    appointments.remove(appointment);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class StateGui implements ActionListener {&lt;br /&gt;
  private JFrame mainFrame;&lt;br /&gt;
  private JPanel controlPanel, editPanel;&lt;br /&gt;
  private CalendarEditor editor;&lt;br /&gt;
  private JButton save, exit;&lt;br /&gt;
  public StateGui(CalendarEditor edit) {&lt;br /&gt;
    editor = edit;&lt;br /&gt;
  }&lt;br /&gt;
  public void createGui() {&lt;br /&gt;
    mainFrame = new JFrame(&amp;quot;State Pattern Example&amp;quot;);&lt;br /&gt;
    Container content = mainFrame.getContentPane();&lt;br /&gt;
    content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));&lt;br /&gt;
    editPanel = new JPanel();&lt;br /&gt;
    editPanel.setLayout(new BorderLayout());&lt;br /&gt;
    JTable appointmentTable = new JTable(new StateTableModel(&lt;br /&gt;
        (Appointment[]) editor.getAppointments().toArray(&lt;br /&gt;
            new Appointment[1])));&lt;br /&gt;
    editPanel.add(new JScrollPane(appointmentTable));&lt;br /&gt;
    content.add(editPanel);&lt;br /&gt;
    controlPanel = new JPanel();&lt;br /&gt;
    save = new JButton(&amp;quot;Save Appointments&amp;quot;);&lt;br /&gt;
    exit = new JButton(&amp;quot;Exit&amp;quot;);&lt;br /&gt;
    controlPanel.add(save);&lt;br /&gt;
    controlPanel.add(exit);&lt;br /&gt;
    content.add(controlPanel);&lt;br /&gt;
    save.addActionListener(this);&lt;br /&gt;
    exit.addActionListener(this);&lt;br /&gt;
    mainFrame.addWindowListener(new WindowCloseManager());&lt;br /&gt;
    mainFrame.pack();&lt;br /&gt;
    mainFrame.setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
  public void actionPerformed(ActionEvent evt) {&lt;br /&gt;
    Object originator = evt.getSource();&lt;br /&gt;
    if (originator == save) {&lt;br /&gt;
      saveAppointments();&lt;br /&gt;
    } else if (originator == exit) {&lt;br /&gt;
      exitApplication();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  private class WindowCloseManager extends WindowAdapter {&lt;br /&gt;
    public void windowClosing(WindowEvent evt) {&lt;br /&gt;
      exitApplication();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  private void saveAppointments() {&lt;br /&gt;
    editor.save();&lt;br /&gt;
  }&lt;br /&gt;
  private void exitApplication() {&lt;br /&gt;
    System.exit(0);&lt;br /&gt;
  }&lt;br /&gt;
  private class StateTableModel extends AbstractTableModel {&lt;br /&gt;
    private final String[] columnNames = { &amp;quot;Appointment&amp;quot;, &amp;quot;Contacts&amp;quot;,&lt;br /&gt;
        &amp;quot;Location&amp;quot;, &amp;quot;Start Date&amp;quot;, &amp;quot;End Date&amp;quot; };&lt;br /&gt;
    private Appointment[] data;&lt;br /&gt;
    public StateTableModel(Appointment[] appointments) {&lt;br /&gt;
      data = appointments;&lt;br /&gt;
    }&lt;br /&gt;
    public String getColumnName(int column) {&lt;br /&gt;
      return columnNames[column];&lt;br /&gt;
    }&lt;br /&gt;
    public int getRowCount() {&lt;br /&gt;
      return data.length;&lt;br /&gt;
    }&lt;br /&gt;
    public int getColumnCount() {&lt;br /&gt;
      return columnNames.length;&lt;br /&gt;
    }&lt;br /&gt;
    public Object getValueAt(int row, int column) {&lt;br /&gt;
      Object value = null;&lt;br /&gt;
      switch (column) {&lt;br /&gt;
      case 0:&lt;br /&gt;
        value = data[row].getReason();&lt;br /&gt;
        break;&lt;br /&gt;
      case 1:&lt;br /&gt;
        value = data[row].getContacts();&lt;br /&gt;
        break;&lt;br /&gt;
      case 2:&lt;br /&gt;
        value = data[row].getLocation();&lt;br /&gt;
        break;&lt;br /&gt;
      case 3:&lt;br /&gt;
        value = data[row].getStartDate();&lt;br /&gt;
        break;&lt;br /&gt;
      case 4:&lt;br /&gt;
        value = data[row].getEndDate();&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
      return value;&lt;br /&gt;
    }&lt;br /&gt;
    public boolean isCellEditable(int row, int column) {&lt;br /&gt;
      return ((column == 0) || (column == 2)) ? true : false;&lt;br /&gt;
    }&lt;br /&gt;
    public void setValueAt(Object value, int row, int column) {&lt;br /&gt;
      switch (column) {&lt;br /&gt;
      case 0:&lt;br /&gt;
        data[row].setReason((String) value);&lt;br /&gt;
        editor.edit();&lt;br /&gt;
        break;&lt;br /&gt;
      case 1:&lt;br /&gt;
        break;&lt;br /&gt;
      case 2:&lt;br /&gt;
        data[row].setLocation(new LocationImpl((String) value));&lt;br /&gt;
        editor.edit();&lt;br /&gt;
        break;&lt;br /&gt;
      case 3:&lt;br /&gt;
        break;&lt;br /&gt;
      case 4:&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== State pattern in Java 2 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
The Design Patterns Java Companion&lt;br /&gt;
Copyright (C) 1998, by James W. Cooper&lt;br /&gt;
IBM Thomas J. Watson Research Center&lt;br /&gt;
*/&lt;br /&gt;
import java.awt.BorderLayout;&lt;br /&gt;
import java.awt.Color;&lt;br /&gt;
import java.awt.Dimension;&lt;br /&gt;
import java.awt.Graphics;&lt;br /&gt;
import java.awt.Insets;&lt;br /&gt;
import java.awt.Rectangle;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&lt;br /&gt;
import java.awt.event.MouseAdapter;&lt;br /&gt;
import java.awt.event.MouseEvent;&lt;br /&gt;
import java.awt.event.MouseMotionAdapter;&lt;br /&gt;
import java.awt.event.WindowAdapter;&lt;br /&gt;
import java.awt.event.WindowEvent;&lt;br /&gt;
import java.util.Vector;&lt;br /&gt;
import javax.swing.ImageIcon;&lt;br /&gt;
import javax.swing.JButton;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
import javax.swing.JToggleButton;&lt;br /&gt;
import javax.swing.JToolBar;&lt;br /&gt;
public class StateDraw extends JFrame implements ActionListener {&lt;br /&gt;
  JToolBar tbar;&lt;br /&gt;
  Mediator med;&lt;br /&gt;
  public StateDraw() {&lt;br /&gt;
    super(&amp;quot;State Drawing&amp;quot;);&lt;br /&gt;
    addWindowListener(new WindowAdapter() {&lt;br /&gt;
      public void windowClosing(WindowEvent e) {&lt;br /&gt;
        System.exit(0);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
    JPanel jp = new JPanel();&lt;br /&gt;
    getContentPane().add(jp);&lt;br /&gt;
    med = new Mediator();&lt;br /&gt;
    jp.setLayout(new BorderLayout());&lt;br /&gt;
    tbar = new JToolBar();&lt;br /&gt;
    tbar.setFloatable(false);&lt;br /&gt;
    jp.add(&amp;quot;North&amp;quot;, tbar);&lt;br /&gt;
    PickButton pick = new PickButton(this, med);&lt;br /&gt;
    tbar.add(pick);&lt;br /&gt;
    tbar.addSeparator();&lt;br /&gt;
    RectButton rect = new RectButton(this, med);&lt;br /&gt;
    tbar.add(rect);&lt;br /&gt;
    FillButton fill = new FillButton(this, med);&lt;br /&gt;
    tbar.add(fill);&lt;br /&gt;
    CircleButton circ = new CircleButton(this, med);&lt;br /&gt;
    tbar.add(circ);&lt;br /&gt;
    tbar.addSeparator();&lt;br /&gt;
    ClearButton clr = new ClearButton(this, med);&lt;br /&gt;
    tbar.add(clr);&lt;br /&gt;
    JCanvas canvas = new JCanvas(med);&lt;br /&gt;
    jp.add(&amp;quot;Center&amp;quot;, canvas);&lt;br /&gt;
    MouseApp map = new MouseApp(med);&lt;br /&gt;
    canvas.addMouseListener(map);&lt;br /&gt;
    MouseMoveApp mvap = new MouseMoveApp(med);&lt;br /&gt;
    canvas.addMouseMotionListener(mvap);&lt;br /&gt;
    setSize(new Dimension(400, 300));&lt;br /&gt;
    setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
  public void actionPerformed(ActionEvent e) {&lt;br /&gt;
    Command comd = (Command) e.getSource();&lt;br /&gt;
    comd.Execute();&lt;br /&gt;
  }&lt;br /&gt;
  static public void main(String[] argv) {&lt;br /&gt;
    new StateDraw();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class MouseApp extends MouseAdapter {&lt;br /&gt;
  Mediator med;&lt;br /&gt;
  public MouseApp(Mediator md) {&lt;br /&gt;
    super();&lt;br /&gt;
    med = md;&lt;br /&gt;
  }&lt;br /&gt;
  public void mousePressed(MouseEvent e) {&lt;br /&gt;
    med.mouseDown(e.getX(), e.getY());&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseReleased(MouseEvent e) {&lt;br /&gt;
    med.mouseUp(e.getX(), e.getY());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class MouseMoveApp extends MouseMotionAdapter {&lt;br /&gt;
  Mediator med;&lt;br /&gt;
  public MouseMoveApp(Mediator md) {&lt;br /&gt;
    super();&lt;br /&gt;
    med = md;&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseDragged(MouseEvent e) {&lt;br /&gt;
    med.mouseDrag(e.getX(), e.getY());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class ArrowState extends State {&lt;br /&gt;
  private Mediator med;&lt;br /&gt;
  public ArrowState(Mediator md) {&lt;br /&gt;
    med = md;&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseDown(int x, int y) {&lt;br /&gt;
    Vector drawings = med.getDrawings();&lt;br /&gt;
    for (int i = 0; i &amp;lt; drawings.size(); i++) {&lt;br /&gt;
      Drawing d = (Drawing) drawings.elementAt(i);&lt;br /&gt;
      if (d.contains(x, y))&lt;br /&gt;
        med.setSelected(d);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class CircleState extends State {&lt;br /&gt;
  private Mediator med; //save Mediator&lt;br /&gt;
  public CircleState(Mediator md) {&lt;br /&gt;
    med = md;&lt;br /&gt;
  }&lt;br /&gt;
  //Draw circle where mouse clicks&lt;br /&gt;
  public void mouseDown(int x, int y) {&lt;br /&gt;
    med.addDrawing(new visCircle(x, y));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class ClearButton extends JButton implements Command {&lt;br /&gt;
  Mediator med;&lt;br /&gt;
  public ClearButton(ActionListener act, Mediator md) {&lt;br /&gt;
    super(&amp;quot;C&amp;quot;);&lt;br /&gt;
    setToolTipText(&amp;quot;Clear&amp;quot;);&lt;br /&gt;
    addActionListener(act);&lt;br /&gt;
    med = md;&lt;br /&gt;
  }&lt;br /&gt;
  public void Execute() {&lt;br /&gt;
    med.clear();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class CircleButton extends JToggleButton implements Command {&lt;br /&gt;
  Mediator med;&lt;br /&gt;
  public CircleButton(ActionListener act, Mediator md) {&lt;br /&gt;
    super(&amp;quot; &amp;quot;);&lt;br /&gt;
    setSize(new Dimension(35, 35));&lt;br /&gt;
    setBorderPainted(true);&lt;br /&gt;
    setMargin(new Insets(5, 12, 5, 12));&lt;br /&gt;
    setToolTipText(&amp;quot;Draw circle&amp;quot;);&lt;br /&gt;
    addActionListener(act);&lt;br /&gt;
    med = md;&lt;br /&gt;
    med.registerCircleButton(this);&lt;br /&gt;
  }&lt;br /&gt;
  public Dimension getPreferredSize() {&lt;br /&gt;
    return new Dimension(35, 35);&lt;br /&gt;
  }&lt;br /&gt;
  public void paint(Graphics g) {&lt;br /&gt;
    super.paint(g);&lt;br /&gt;
    int h = getHeight();&lt;br /&gt;
    int w = getWidth();&lt;br /&gt;
    g.setColor(Color.black);&lt;br /&gt;
    g.drawArc(2, 2, h - 4, h - 4, 0, 360);&lt;br /&gt;
  }&lt;br /&gt;
  public void Execute() {&lt;br /&gt;
    med.startCircle();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class State {&lt;br /&gt;
  public void mouseDown(int x, int y) {&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseUp(int x, int y) {&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseDrag(int x, int y) {&lt;br /&gt;
  }&lt;br /&gt;
  public void select(Drawing d, Color c) {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
interface Command {&lt;br /&gt;
  public void Execute();&lt;br /&gt;
}&lt;br /&gt;
class FillState extends State {&lt;br /&gt;
  private Mediator med; //save Mediator&lt;br /&gt;
  private Color color; //save current color&lt;br /&gt;
  public FillState(Mediator md) {&lt;br /&gt;
    med = md;&lt;br /&gt;
  }&lt;br /&gt;
  //Fill drawing if selected&lt;br /&gt;
  public void select(Drawing d, Color c) {&lt;br /&gt;
    color = c;&lt;br /&gt;
    if (d != null) {&lt;br /&gt;
      d.setFill(c); //fill that drawing&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  //Fill drawing if you click inside one&lt;br /&gt;
  public void mouseDown(int x, int y) {&lt;br /&gt;
    Vector drawings = med.getDrawings();&lt;br /&gt;
    for (int i = 0; i &amp;lt; drawings.size(); i++) {&lt;br /&gt;
      Drawing d = (Drawing) drawings.elementAt(i);&lt;br /&gt;
      if (d.contains(x, y))&lt;br /&gt;
        d.setFill(color); //fill drawing&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class JCanvas extends JPanel {&lt;br /&gt;
  Mediator med;&lt;br /&gt;
  public JCanvas(Mediator md) {&lt;br /&gt;
    med = md;&lt;br /&gt;
    med.registerCanvas(this);&lt;br /&gt;
    setBackground(Color.white);&lt;br /&gt;
  }&lt;br /&gt;
  public void paint(Graphics g) {&lt;br /&gt;
    super.paint(g);&lt;br /&gt;
    med.reDraw(g);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class Mediator {&lt;br /&gt;
  boolean startRect;&lt;br /&gt;
  boolean dSelected;&lt;br /&gt;
  Vector drawings;&lt;br /&gt;
  Vector undoList;&lt;br /&gt;
  RectButton rectButton;&lt;br /&gt;
  FillButton fillButton;&lt;br /&gt;
  CircleButton circButton;&lt;br /&gt;
  PickButton arrowButton;&lt;br /&gt;
  JPanel canvas;&lt;br /&gt;
  Drawing selectedDrawing;&lt;br /&gt;
  StateManager stMgr;&lt;br /&gt;
  public Mediator() {&lt;br /&gt;
    startRect = false;&lt;br /&gt;
    dSelected = false;&lt;br /&gt;
    drawings = new Vector();&lt;br /&gt;
    undoList = new Vector();&lt;br /&gt;
    stMgr = new StateManager(this);&lt;br /&gt;
  }&lt;br /&gt;
  public void startRectangle() {&lt;br /&gt;
    stMgr.setRect();&lt;br /&gt;
    arrowButton.setSelected(false);&lt;br /&gt;
    circButton.setSelected(false);&lt;br /&gt;
    fillButton.setSelected(false);&lt;br /&gt;
  }&lt;br /&gt;
  public void startCircle() {&lt;br /&gt;
    stMgr.setCircle();&lt;br /&gt;
    rectButton.setSelected(false);&lt;br /&gt;
    arrowButton.setSelected(false);&lt;br /&gt;
    fillButton.setSelected(false);&lt;br /&gt;
  }&lt;br /&gt;
  public void startFill() {&lt;br /&gt;
    stMgr.setFill();&lt;br /&gt;
    rectButton.setSelected(false);&lt;br /&gt;
    circButton.setSelected(false);&lt;br /&gt;
    arrowButton.setSelected(false);&lt;br /&gt;
    stMgr.select(selectedDrawing, Color.red);&lt;br /&gt;
    repaint();&lt;br /&gt;
  }&lt;br /&gt;
  public void startArrow() {&lt;br /&gt;
    stMgr.setArrow();&lt;br /&gt;
    rectButton.setSelected(false);&lt;br /&gt;
    circButton.setSelected(false);&lt;br /&gt;
    fillButton.setSelected(false);&lt;br /&gt;
  }&lt;br /&gt;
  public Drawing getSelected() {&lt;br /&gt;
    return selectedDrawing;&lt;br /&gt;
  }&lt;br /&gt;
  public void fillSelected() {&lt;br /&gt;
    if (dSelected) {&lt;br /&gt;
      selectedDrawing.setFill(Color.red);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public Vector getDrawings() {&lt;br /&gt;
    return drawings;&lt;br /&gt;
  }&lt;br /&gt;
  public void addDrawing(Drawing d) {&lt;br /&gt;
    drawings.addElement(d);&lt;br /&gt;
  }&lt;br /&gt;
  public void registerRectButton(RectButton rb) {&lt;br /&gt;
    rectButton = rb;&lt;br /&gt;
  }&lt;br /&gt;
  public void registerCircleButton(CircleButton cb) {&lt;br /&gt;
    circButton = cb;&lt;br /&gt;
  }&lt;br /&gt;
  public void registerArrowButton(PickButton ab) {&lt;br /&gt;
    arrowButton = ab;&lt;br /&gt;
  }&lt;br /&gt;
  public void registerFillButton(FillButton fb) {&lt;br /&gt;
    fillButton = fb;&lt;br /&gt;
  }&lt;br /&gt;
  public void registerCanvas(JPanel p) {&lt;br /&gt;
    canvas = p;&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseDown(int x, int y) {&lt;br /&gt;
    stMgr.mouseDown(x, y);&lt;br /&gt;
    repaint();&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseUp(int x, int y) {&lt;br /&gt;
    stMgr.mouseUp(x, y);&lt;br /&gt;
  }&lt;br /&gt;
  public void unpick() {&lt;br /&gt;
    dSelected = false;&lt;br /&gt;
    if (selectedDrawing != null) {&lt;br /&gt;
      selectedDrawing.setSelected(false);&lt;br /&gt;
      selectedDrawing = null;&lt;br /&gt;
      repaint();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public void rememberPosition() {&lt;br /&gt;
    if (dSelected) {&lt;br /&gt;
      //Memento m = new Memento(d);&lt;br /&gt;
      //undoList.addElement(m);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public void setSelected(Drawing d) {&lt;br /&gt;
    if (d != null) {&lt;br /&gt;
      dSelected = true;&lt;br /&gt;
      selectedDrawing = d;&lt;br /&gt;
      d.setSelected(true);&lt;br /&gt;
      repaint();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public void pickRect(int x, int y) {&lt;br /&gt;
  }&lt;br /&gt;
  public void clear() {&lt;br /&gt;
    drawings = new Vector();&lt;br /&gt;
    undoList = new Vector();&lt;br /&gt;
    dSelected = false;&lt;br /&gt;
    selectedDrawing = null;&lt;br /&gt;
    repaint();&lt;br /&gt;
  }&lt;br /&gt;
  private void repaint() {&lt;br /&gt;
    canvas.repaint();&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseDrag(int x, int y) {&lt;br /&gt;
    stMgr.mouseDrag(x, y);&lt;br /&gt;
  }&lt;br /&gt;
  public void reDraw(Graphics g) {&lt;br /&gt;
    g.setColor(Color.black);&lt;br /&gt;
    for (int i = 0; i &amp;lt; drawings.size(); i++) {&lt;br /&gt;
      Drawing v = (Drawing) drawings.elementAt(i);&lt;br /&gt;
      v.draw(g);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public void undo() {&lt;br /&gt;
    if (undoList.size() &amp;gt; 0) {&lt;br /&gt;
      //get last element in undo list&lt;br /&gt;
      Object obj = undoList.lastElement();&lt;br /&gt;
      undoList.removeElement(obj); //and remove it&lt;br /&gt;
      //if this is an Integer, the last action was a new rectangle&lt;br /&gt;
      if (obj instanceof Integer) {&lt;br /&gt;
        //remove last created rectangle&lt;br /&gt;
        Object drawObj = drawings.lastElement();&lt;br /&gt;
        drawings.removeElement(drawObj);&lt;br /&gt;
      }&lt;br /&gt;
      //if this is a Memento, the last action was a move&lt;br /&gt;
      if (obj instanceof Memento) {&lt;br /&gt;
        //get the Memento&lt;br /&gt;
        Memento m = (Memento) obj;&lt;br /&gt;
        m.restore(); //and restore the old position&lt;br /&gt;
      }&lt;br /&gt;
      repaint();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class RectButton extends JToggleButton implements Command {&lt;br /&gt;
  Mediator med;&lt;br /&gt;
  public RectButton(ActionListener act, Mediator md) {&lt;br /&gt;
    super(&amp;quot; &amp;quot;);&lt;br /&gt;
    setSize(new Dimension(35, 35));&lt;br /&gt;
    setBorderPainted(true);&lt;br /&gt;
    setMargin(new Insets(5, 12, 5, 12));&lt;br /&gt;
    setToolTipText(&amp;quot;Draw rectangle&amp;quot;);&lt;br /&gt;
    addActionListener(act);&lt;br /&gt;
    med = md;&lt;br /&gt;
    med.registerRectButton(this);&lt;br /&gt;
  }&lt;br /&gt;
  public Dimension getPreferredSize() {&lt;br /&gt;
    return new Dimension(35, 35);&lt;br /&gt;
  }&lt;br /&gt;
  public void paint(Graphics g) {&lt;br /&gt;
    super.paint(g);&lt;br /&gt;
    int h = getHeight();&lt;br /&gt;
    int w = getWidth();&lt;br /&gt;
    g.setColor(Color.black);&lt;br /&gt;
    g.drawRect(4, 4, w - 8, h - 8);&lt;br /&gt;
  }&lt;br /&gt;
  public void Execute() {&lt;br /&gt;
    med.startRectangle();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class UndoButton extends JButton implements Command {&lt;br /&gt;
  Mediator med;&lt;br /&gt;
  public UndoButton(ActionListener act, Mediator md) {&lt;br /&gt;
    super(&amp;quot;U&amp;quot;);&lt;br /&gt;
    //setSize(new Dimension(25,25));&lt;br /&gt;
    setMargin(new Insets(5, 12, 5, 12));&lt;br /&gt;
    setToolTipText(&amp;quot;Undo&amp;quot;);&lt;br /&gt;
    addActionListener(act);&lt;br /&gt;
    med = md;&lt;br /&gt;
  }&lt;br /&gt;
  public void Execute() {&lt;br /&gt;
    med.undo();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class FillButton extends JToggleButton implements Command {&lt;br /&gt;
  Mediator med;&lt;br /&gt;
  public FillButton(ActionListener act, Mediator md) {&lt;br /&gt;
    super(&amp;quot; &amp;quot;);&lt;br /&gt;
    setSize(new Dimension(35, 35));&lt;br /&gt;
    setBorderPainted(true);&lt;br /&gt;
    setMargin(new Insets(5, 12, 5, 12));&lt;br /&gt;
    setToolTipText(&amp;quot;Fill rectangle&amp;quot;);&lt;br /&gt;
    addActionListener(act);&lt;br /&gt;
    med = md;&lt;br /&gt;
    med.registerFillButton(this);&lt;br /&gt;
  }&lt;br /&gt;
  public Dimension getPreferredSize() {&lt;br /&gt;
    return new Dimension(35, 35);&lt;br /&gt;
  }&lt;br /&gt;
  public void paint(Graphics g) {&lt;br /&gt;
    super.paint(g);&lt;br /&gt;
    int h = getHeight();&lt;br /&gt;
    int w = getWidth();&lt;br /&gt;
    g.setColor(Color.black);&lt;br /&gt;
    g.drawRect(4, 4, w - 8, h - 8);&lt;br /&gt;
    g.setColor(Color.red);&lt;br /&gt;
    g.fillRect(4, 10, w - 8, h - 14);&lt;br /&gt;
  }&lt;br /&gt;
  public void Execute() {&lt;br /&gt;
    if (isSelected()) {&lt;br /&gt;
      med.startFill();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class Memento {&lt;br /&gt;
  public Memento(Drawing d) {&lt;br /&gt;
  }&lt;br /&gt;
  public void restore() {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class RectState extends State {&lt;br /&gt;
  private Mediator med; //save the Mediator here&lt;br /&gt;
  public RectState(Mediator md) {&lt;br /&gt;
    med = md;&lt;br /&gt;
  }&lt;br /&gt;
  //create a new Rectangle where mode clicks&lt;br /&gt;
  public void mouseDown(int x, int y) {&lt;br /&gt;
    med.addDrawing(new visRectangle(x, y));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class StateManager {&lt;br /&gt;
  private State currentState;&lt;br /&gt;
  RectState rState;&lt;br /&gt;
  ArrowState aState;&lt;br /&gt;
  CircleState cState;&lt;br /&gt;
  FillState fState;&lt;br /&gt;
  public StateManager(Mediator med) {&lt;br /&gt;
    rState = new RectState(med);&lt;br /&gt;
    cState = new CircleState(med);&lt;br /&gt;
    aState = new ArrowState(med);&lt;br /&gt;
    fState = new FillState(med);&lt;br /&gt;
    currentState = aState;&lt;br /&gt;
  }&lt;br /&gt;
  public void setRect() {&lt;br /&gt;
    currentState = rState;&lt;br /&gt;
  }&lt;br /&gt;
  public void setCircle() {&lt;br /&gt;
    currentState = cState;&lt;br /&gt;
  }&lt;br /&gt;
  public void setFill() {&lt;br /&gt;
    currentState = fState;&lt;br /&gt;
  }&lt;br /&gt;
  public void setArrow() {&lt;br /&gt;
    currentState = aState;&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseDown(int x, int y) {&lt;br /&gt;
    currentState.mouseDown(x, y);&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseUp(int x, int y) {&lt;br /&gt;
    currentState.mouseUp(x, y);&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseDrag(int x, int y) {&lt;br /&gt;
    currentState.mouseDrag(x, y);&lt;br /&gt;
  }&lt;br /&gt;
  public void select(Drawing d, Color c) {&lt;br /&gt;
    currentState.select(d, c);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class Drawing {&lt;br /&gt;
  protected int x, y, w, h;&lt;br /&gt;
  protected Rectangle rect;&lt;br /&gt;
  protected boolean selected;&lt;br /&gt;
  protected boolean filled;&lt;br /&gt;
  protected Color fillColor;&lt;br /&gt;
  //-------------------------------------------&lt;br /&gt;
  public void setSelected(boolean b) {&lt;br /&gt;
    selected = b;&lt;br /&gt;
  }&lt;br /&gt;
  public void draw(Graphics g) {&lt;br /&gt;
  }&lt;br /&gt;
  public void move(int xpt, int ypt) {&lt;br /&gt;
    x = xpt;&lt;br /&gt;
    y = ypt;&lt;br /&gt;
  }&lt;br /&gt;
  public boolean contains(int x, int y) {&lt;br /&gt;
    return rect.contains(x, y);&lt;br /&gt;
  }&lt;br /&gt;
  protected void saveAsRect() {&lt;br /&gt;
    rect = new Rectangle(x - w / 2, y - h / 2, w, h);&lt;br /&gt;
  }&lt;br /&gt;
  protected void setFill(Color c) {&lt;br /&gt;
    filled = true;&lt;br /&gt;
    fillColor = c;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class visCircle extends Drawing {&lt;br /&gt;
  public visCircle(int xpt, int ypt) {&lt;br /&gt;
    x = xpt;&lt;br /&gt;
    y = ypt;&lt;br /&gt;
    w = 40;&lt;br /&gt;
    h = 30;&lt;br /&gt;
    saveAsRect();&lt;br /&gt;
  }&lt;br /&gt;
  //-------------------------------------------&lt;br /&gt;
  public void draw(Graphics g) {&lt;br /&gt;
    g.drawArc(x, y, w, h, 0, 360);&lt;br /&gt;
    if (filled) {&lt;br /&gt;
      g.setColor(fillColor);&lt;br /&gt;
      g.fillArc(x, y, w, h, 0, 360);&lt;br /&gt;
    }&lt;br /&gt;
    if (selected) {&lt;br /&gt;
      g.setColor(Color.black);&lt;br /&gt;
      g.fillRect(x + w / 2, y - 2, 4, 4);&lt;br /&gt;
      g.fillRect(x - 2, y + h / 2, 4, 4);&lt;br /&gt;
      g.fillRect(x + w / 2, y + h - 2, 4, 4);&lt;br /&gt;
      g.fillRect(x + w - 2, y + h / 2, 4, 4);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
//===============================================&lt;br /&gt;
class circleMemento extends Memento {&lt;br /&gt;
  visCircle circ;&lt;br /&gt;
  //saved fields- remember internal fields&lt;br /&gt;
  //of the specified visual rectangle&lt;br /&gt;
  int x, y, w, h;&lt;br /&gt;
  public circleMemento(visCircle r) {&lt;br /&gt;
    super(r);&lt;br /&gt;
    circ = r;&lt;br /&gt;
    x = circ.x;&lt;br /&gt;
    y = circ.y;&lt;br /&gt;
    w = circ.w;&lt;br /&gt;
    h = circ.h;&lt;br /&gt;
  }&lt;br /&gt;
  //-------------------------------------------&lt;br /&gt;
  public void restore() {&lt;br /&gt;
    //restore the internal state of&lt;br /&gt;
    //the specified rectangle&lt;br /&gt;
    circ.x = x;&lt;br /&gt;
    circ.y = y;&lt;br /&gt;
    circ.h = h;&lt;br /&gt;
    circ.w = w;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class visRectangle extends Drawing {&lt;br /&gt;
  public visRectangle(int xpt, int ypt) {&lt;br /&gt;
    x = xpt;&lt;br /&gt;
    y = ypt;&lt;br /&gt;
    w = 40;&lt;br /&gt;
    h = 30;&lt;br /&gt;
    saveAsRect();&lt;br /&gt;
  }&lt;br /&gt;
  //-------------------------------------------&lt;br /&gt;
  public void draw(Graphics g) {&lt;br /&gt;
    g.drawRect(x, y, w, h);&lt;br /&gt;
    if (filled) {&lt;br /&gt;
      g.setColor(fillColor);&lt;br /&gt;
      g.fillRect(x, y, w, h);&lt;br /&gt;
    }&lt;br /&gt;
    if (selected) {&lt;br /&gt;
      g.setColor(Color.black);&lt;br /&gt;
      g.fillRect(x + w / 2, y - 2, 4, 4);&lt;br /&gt;
      g.fillRect(x - 2, y + h / 2, 4, 4);&lt;br /&gt;
      g.fillRect(x + w / 2, y + h - 2, 4, 4);&lt;br /&gt;
      g.fillRect(x + w - 2, y + h / 2, 4, 4);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class rectMemento extends Memento {&lt;br /&gt;
  visRectangle rect;&lt;br /&gt;
  //saved fields- remember internal fields&lt;br /&gt;
  //of the specified visual rectangle&lt;br /&gt;
  int x, y, w, h;&lt;br /&gt;
  public rectMemento(visRectangle r) {&lt;br /&gt;
    super(r);&lt;br /&gt;
    rect = r;&lt;br /&gt;
    x = rect.x;&lt;br /&gt;
    y = rect.y;&lt;br /&gt;
    w = rect.w;&lt;br /&gt;
    h = rect.h;&lt;br /&gt;
  }&lt;br /&gt;
  //-------------------------------------------&lt;br /&gt;
  public void restore() {&lt;br /&gt;
    //restore the internal state of&lt;br /&gt;
    //the specified rectangle&lt;br /&gt;
    rect.x = x;&lt;br /&gt;
    rect.y = y;&lt;br /&gt;
    rect.h = h;&lt;br /&gt;
    rect.w = w;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class PickButton extends JToggleButton implements Command {&lt;br /&gt;
  Mediator med;&lt;br /&gt;
  public PickButton(ActionListener act, Mediator md) {&lt;br /&gt;
    super(new ImageIcon(&amp;quot;arrow.gif&amp;quot;));&lt;br /&gt;
    setSize(new Dimension(35, 35));&lt;br /&gt;
    setBorderPainted(true);&lt;br /&gt;
    setMargin(new Insets(0, 0, 0, 0));&lt;br /&gt;
    setToolTipText(&amp;quot;Select drawing element&amp;quot;);&lt;br /&gt;
    addActionListener(act);&lt;br /&gt;
    med = md;&lt;br /&gt;
    med.registerArrowButton(this);&lt;br /&gt;
  }&lt;br /&gt;
  //-------------------------------------------&lt;br /&gt;
  public void Execute() {&lt;br /&gt;
    med.startArrow();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>