//[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();
}