| //[C] 2002 Sun Microsystems, Inc.---
 import java.awt.Container;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.io.Serializable;
 import java.util.Calendar;
 import java.util.Date;
 
 import javax.swing.BoxLayout;
 import javax.swing.JButton;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JTextArea;
 import javax.swing.JTextField;
 
 
 public class RunCommandPattern {
 private static Calendar dateCreator = Calendar.getInstance();
 
 public static void main(String [] arguments){
 System.out.println("Example for the Command pattern");
 System.out.println();
 System.out.println("This sample will use a command class called");
 System.out.println(" ChangeLocationCommand to update the location");
 System.out.println(" of an Appointment object.");
 System.out.println("The ChangeLocationCommand has the additional");
 System.out.println(" ability to undo and redo commands, so it can");
 System.out.println(" set the locaition back to its original value,");
 System.out.println(" if desired.");
 System.out.println();
 
 System.out.println("Creating an Appointment for use in the demo");
 Contact [] people = { new ContactImpl(), new ContactImpl() };
 Appointment appointment = new Appointment("Java Twister Semi-Finals",
 people, new LocationImpl(""), createDate(2001, 10, 31, 14, 30),
 createDate(2001, 10, 31, 14, 31));
 
 System.out.println("Creating the ChangeLocationCommand");
 ChangeLocationCommand cmd = new ChangeLocationCommand();
 cmd.setAppointment(appointment);
 
 System.out.println("Creating the GUI");
 CommandGui application = new CommandGui(cmd);
 application.setAppointment(appointment);
 cmd.setLocationEditor(application);
 application.createGui();
 
 }
 public static Date createDate(int year, int month, int day, int hour, int minute){
 dateCreator.set(year, month, day, hour, minute);
 return dateCreator.getTime();
 }
 }
 class CommandGui implements ActionListener, LocationEditor{
 private JFrame mainFrame;
 private JTextArea display;
 private JTextField updatedLocation;
 private JButton update, undo, redo, exit;
 private JPanel controlPanel, displayPanel, editorPanel;
 private UndoableCommand command;
 private Appointment appointment;
 
 public CommandGui(UndoableCommand newCommand){
 command = newCommand;
 }
 
 public void setAppointment(Appointment newAppointment){
 appointment = newAppointment;
 }
 
 public void createGui(){
 mainFrame = new JFrame("Command Pattern Example");
 Container content = mainFrame.getContentPane();
 content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
 
 editorPanel = new JPanel();
 editorPanel.add(new JLabel("Location"));
 updatedLocation = new JTextField(20);
 editorPanel.add(updatedLocation);
 content.add(editorPanel);
 
 displayPanel = new JPanel();
 display = new JTextArea(10, 40);
 display.setEditable(false);
 displayPanel.add(display);
 content.add(displayPanel);
 
 controlPanel = new JPanel();
 update = new JButton("Update Location");
 undo = new JButton("Undo Location");
 redo = new JButton("Redo Location");
 exit = new JButton("Exit");
 controlPanel.add(update);
 controlPanel.add(undo);
 controlPanel.add(redo);
 controlPanel.add(exit);
 content.add(controlPanel);
 
 update.addActionListener(this);
 undo.addActionListener(this);
 redo.addActionListener(this);
 exit.addActionListener(this);
 
 refreshDisplay();
 mainFrame.addWindowListener(new WindowCloseManager());
 mainFrame.pack();
 mainFrame.setVisible(true);
 }
 
 public void actionPerformed(ActionEvent evt){
 Object originator = evt.getSource();
 if (originator == update){
 executeCommand();
 }
 if (originator == undo){
 undoCommand();
 }
 if (originator == redo){
 redoCommand();
 }
 else if (originator == exit){
 exitApplication();
 }
 }
 
 private class WindowCloseManager extends WindowAdapter{
 public void windowClosing(WindowEvent evt){
 exitApplication();
 }
 }
 
 public Location getNewLocation(){
 return new LocationImpl(updatedLocation.getText());
 }
 
 private void executeCommand(){
 command.execute();
 refreshDisplay();
 }
 
 private void undoCommand(){
 command.undo();
 refreshDisplay();
 }
 
 private void redoCommand(){
 command.redo();
 refreshDisplay();
 }
 
 private void refreshDisplay(){
 display.setText(appointment.toString());
 }
 
 private void exitApplication(){
 System.exit(0);
 }
 }
 interface Command{
 public void execute();
 }
 interface Contact extends Serializable{
 public static final String SPACE = " ";
 public String getFirstName();
 public String getLastName();
 public String getTitle();
 public String getOrganization();
 
 public void setFirstName(String newFirstName);
 public void setLastName(String newLastName);
 public void setTitle(String newTitle);
 public void setOrganization(String newOrganization);
 }
 
 class ContactImpl implements Contact{
 private String firstName;
 private String lastName;
 private String title;
 private String organization;
 public static final String EOL_STRING =
 System.getProperty("line.separator");
 
 public ContactImpl(){ }
 public ContactImpl(String newFirstName, String newLastName,
 String newTitle, String newOrganization){
 firstName = newFirstName;
 lastName = newLastName;
 title = newTitle;
 organization = newOrganization;
 }
 
 public String getFirstName(){ return firstName; }
 public String getLastName(){ return lastName; }
 public String getTitle(){ return title; }
 public String getOrganization(){ return organization; }
 
 public void setFirstName(String newFirstName){ firstName = newFirstName; }
 public void setLastName(String newLastName){ lastName = newLastName; }
 public void setTitle(String newTitle){ title = newTitle; }
 public void setOrganization(String newOrganization){ organization = newOrganization; }
 
 public String toString(){
 return firstName + " " + lastName;
 }
 }
 
 class Appointment{
 private String reason;
 private Contact[] contacts;
 private Location location;
 private Date startDate;
 private Date endDate;
 
 public Appointment(String reason, Contact[] contacts, Location location, Date startDate, Date endDate){
 this.reason = reason;
 this.contacts = contacts;
 this.location = location;
 this.startDate = startDate;
 this.endDate = endDate;
 }
 
 public String getReason(){ return reason; }
 public Contact[] getContacts(){ return contacts; }
 public Location getLocation(){ return location; }
 public Date getStartDate(){ return startDate; }
 public Date getEndDate(){ return endDate; }
 
 public void setLocation(Location location){ this.location = location; }
 
 public String toString(){
 return "Appointment:" + "\n    Reason: " + reason +
 "\n    Location: " + location + "\n    Start: " +
 startDate + "\n    End: " + endDate + "\n";
 }
 }
 
 interface Location extends Serializable{
 public String getLocation();
 public void setLocation(String newLocation);
 }
 
 class ChangeLocationCommand implements UndoableCommand{
 private Appointment appointment;
 private Location oldLocation;
 private Location newLocation;
 private LocationEditor editor;
 
 public Appointment getAppointment(){ return appointment; }
 
 public void setAppointment(Appointment appointment){ this.appointment = appointment; }
 public void setLocationEditor(LocationEditor locationEditor){ editor = locationEditor; }
 
 public void execute(){
 oldLocation = appointment.getLocation();
 newLocation = editor.getNewLocation();
 appointment.setLocation(newLocation);
 }
 public void undo(){
 appointment.setLocation(oldLocation);
 }
 public void redo(){
 appointment.setLocation(newLocation);
 }
 }
 
 interface LocationEditor{
 public Location getNewLocation();
 }
 
 class LocationImpl implements Location{
 private String location;
 
 public LocationImpl(){ }
 public LocationImpl(String newLocation){
 location = newLocation;
 }
 
 public String getLocation(){ return location; }
 
 public void setLocation(String newLocation){ location = newLocation; }
 
 public String toString(){ return location; }
 }
 
 interface UndoableCommand extends Command{
 public void undo();
 public void redo();
 }
 
 
 
 
 |