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 * The FormSheet that contains this Action's button. 030 * 031 * @serial 032 */ 033 protected FormSheet m_fsOwner; 034 035 /** 036 * The action to be performed, when the listener is triggered. 037 * 038 * @serial 039 */ 040 protected Action m_aAction; 041 042 /** 043 * Create a new ActionActionListener. You must override {@link #doAction} when using this constructor. 044 * 045 * @param fsOwner the FormSheet that contains this Action's button. 046 */ 047 public ActionActionListener(FormSheet fsOwner) { 048 this(fsOwner, null); 049 } 050 051 /** 052 * Create a new ActionActionListener. You should not override {@link #doAction} when using this constructor. 053 * 054 * @param fsOwner the FormSheet that contains this Action's button. 055 * @param aAction the Action to perform when the listener is triggered. 056 */ 057 public ActionActionListener(FormSheet fsOwner, Action aAction) { 058 super(); 059 060 m_fsOwner = fsOwner; 061 m_aAction = aAction; 062 } 063 064 /** 065 * ActionListener interface method. Will redirect the event to the {@link #doAction} 066 * method. 067 * 068 * @override Never 069 */ 070 public final void actionPerformed(ActionEvent e) { 071 new Thread("ActionActionListener event handler") { 072 public void run() { 073 try { 074 doAction(m_fsOwner.getProcess(), m_fsOwner.getSalesPoint()); 075 } 076 catch (ThreadDeath td) { 077 throw td; 078 } 079 catch (Throwable t) { 080 System.err.println("Exception occured during event handling:"); 081 t.printStackTrace(); 082 } 083 } 084 } 085 086 .start(); 087 } 088 089 /** 090 * Action interface method. Unless you override it, it will redirect the event to the 091 * {@link Action#doAction doAction()} method of the Action that is associated with this 092 * listener. 093 * 094 * @override Sometimes Override this method when you used 095 * {@link #ActionActionListener(sale.FormSheet)} as a constructor and want the listener to be the 096 *{@link Action Action object} at the same time. 097 * 098 * @exception Throwable on any error that shall be reported and lead to cancellation of 099 * the action. 100 * 101 * @see #ActionActionListener(sale.FormSheet, sale.Action) 102 */ 103 public void doAction(SaleProcess p, SalesPoint sp) throws Throwable { 104 m_aAction.doAction(p, sp); 105 } 106 }