001 package sale;
002
003 import java.awt.event.ActionListener;
004 import java.awt.event.ActionEvent;
005
006 /**
007 * A special ActionListener that allows to associate Actions with buttons that are not
008 * in a FormSheet's button bar or a MenuSheet.
009 *
010 * <p>You can use subclasses of this class as ActionListeners on any button in a FormSheet
011 * that is not in the button bar. You can then think of it as of an {@link Action}
012 * associated with that button. The {@link #doAction} method will be called with the same
013 * parameters as for an Action associated with a button in the FormSheet's button bar.</p>
014 *
015 * <p>If you do not override {@link #doAction} in subclasses, it will defer event handling
016 * to the Action object handed in on creation. Thus, you can create chains of responsibility
017 * which allow for, e.g., a {@link users.Capability capability} to be associated with any
018 * {@link java.awt.event.ActionEvent} in the FormSheet.</p>
019 *
020 * @see FormSheet
021 *
022 * @author Steffen Zschaler
023 * @version 2.0 07/06/1999
024 * @since v2.0
025 */
026 public class ActionActionListener extends Object implements Action, ActionListener {
027
028 /**
029 * ID for serialization.
030 */
031 private static final long serialVersionUID = -8348113432791736610L;
032
033 /**
034 * The FormSheet that contains this Action's button.
035 *
036 * @serial
037 */
038 protected FormSheet m_fsOwner;
039
040 /**
041 * The action to be performed, when the listener is triggered.
042 *
043 * @serial
044 */
045 protected Action m_aAction;
046
047 /**
048 * Create a new ActionActionListener. You must override {@link #doAction} when using this constructor.
049 *
050 * @param fsOwner the FormSheet that contains this Action's button.
051 */
052 public ActionActionListener(FormSheet fsOwner) {
053 this(fsOwner, null);
054 }
055
056 /**
057 * Create a new ActionActionListener. You should not override {@link #doAction} when using this constructor.
058 *
059 * @param fsOwner the FormSheet that contains this Action's button.
060 * @param aAction the Action to perform when the listener is triggered.
061 */
062 public ActionActionListener(FormSheet fsOwner, Action aAction) {
063 super();
064
065 m_fsOwner = fsOwner;
066 m_aAction = aAction;
067 }
068
069 /**
070 * ActionListener interface method. Will redirect the event to the {@link #doAction}
071 * method.
072 *
073 * @override Never
074 */
075 public final void actionPerformed(ActionEvent e) {
076 new Thread("ActionActionListener event handler") {
077 public void run() {
078 try {
079 doAction(m_fsOwner.getProcess(), m_fsOwner.getSalesPoint());
080 }
081 catch (ThreadDeath td) {
082 throw td;
083 }
084 catch (Throwable t) {
085 System.err.println("Exception occured during event handling:");
086 t.printStackTrace();
087 }
088 }
089 }
090
091 .start();
092 }
093
094 /**
095 * Action interface method. Unless you override it, it will redirect the event to the
096 * {@link Action#doAction doAction()} method of the Action that is associated with this
097 * listener.
098 *
099 * @override Sometimes Override this method when you used
100 * {@link #ActionActionListener(sale.FormSheet)} as a constructor and want the listener to be the
101 *{@link Action Action object} at the same time.
102 *
103 * @exception Throwable on any error that shall be reported and lead to cancellation of
104 * the action.
105 *
106 * @see #ActionActionListener(sale.FormSheet, sale.Action)
107 */
108 public void doAction(SaleProcess p, SalesPoint sp) throws Throwable {
109 m_aAction.doAction(p, sp);
110 }
111 }