carfield.com.hk Button.java 2004-03-24T16:00:00Z 2004-03-24T16:00:00Z <br/><TEXTAREA name="code" class="java" rows="16" cols="100">package examples.chainOfResponsibility.aspectj; /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * This file is part of the design patterns project at UBC * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the &quot;License&quot;); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/. * * Software distributed under the License is distributed on an &quot;AS IS&quot; basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is ca.ubc.cs.spl.patterns. * * Contributor(s): */ import javax.swing.*; import java.awt.event.*; /** * A simple GUI button that implemetns its own ActionListener. * * @author Jan Hannemann * @author Gregor Kiczales * @version 1.0, 05/13/02 * */ public class Button extends JButton { /** * Creates a Button widget. An ActionListener is also added that calls * the &lt;code&gt;doClick(ActionEvent)&lt;/code&gt; method when the button is pressed * * @param s the button label */ public Button(String s) { super(s); this.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { doClick(e); } }); } /** * An empty method that is called when the button is clicked. * * @param e the actionEvent that was created when the button was clicked. */ public void doClick(ActionEvent e) {} }</TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> 2004-03-24T16:00:00Z Frame.java 2004-03-24T16:00:00Z 2004-03-24T16:00:00Z <br/><TEXTAREA name="code" class="java" rows="16" cols="100">package examples.chainOfResponsibility.aspectj; /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * This file is part of the design patterns project at UBC * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the &quot;License&quot;); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/. * * Software distributed under the License is distributed on an &quot;AS IS&quot; basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is ca.ubc.cs.spl.patterns. * * Contributor(s): */ import javax.swing.JFrame; import java.awt.event.WindowEvent; import java.awt.event.WindowAdapter; /** * Represents a regular GUI frame. No pattern-specific modifications are * needed here. A WindowListener is added. * * @author Jan Hannemann * @author Gregor Kiczales * @version 1.0, 05/13/02 * */ public class Frame extends JFrame { /** * Creates a &lt;code&gt;Frame&lt;/code&gt; with a given title. * * @param s the frame title */ public Frame(String s) { super(s); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } } </TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> 2004-03-24T16:00:00Z Main.java 2004-03-24T16:00:00Z 2004-03-24T16:00:00Z <br/><TEXTAREA name="code" class="java" rows="16" cols="100">package examples.chainOfResponsibility.aspectj; /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * This file is part of the design patterns project at UBC * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the &quot;License&quot;); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/. * * Software distributed under the License is distributed on an &quot;AS IS&quot; basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is ca.ubc.cs.spl.patterns. * * Contributor(s): */ /** * Implements a GUI-motivated example for the Chain Of Rspsonsibility design * pattern.&lt;p&gt; * * Intent: &lt;i&gt;Avoid coupling the sender of a request to its receiver by giving * more than one object a chance to handle the request. Chain the receiving * objects and pass the request along the chain until an object handles it. * &lt;/i&gt;&lt;p&gt; * * Participatng objects are a &lt;code&gt;Frame&lt;/code&gt;, a &lt;code&gt;Panel&lt;/code&gt;, and * &lt;code&gt;Button&lt;/code&gt; * * A click on the button triggers an event (request) that gets passed along * the widget hierarchy (button -&gt; panel -&gt; frame). * * The &lt;code&gt;Handler&lt;/code&gt; interface defines the &lt;code&gt;handleRequest()&lt;/code&gt; * method for asking an object if it is willing to handle the request. * * &lt;p&gt;&lt;i&gt;This is the AspectJ version.&lt;/i&gt;&lt;p&gt; * * In this implementation, the request is handled by the panel if the * CTRL mask is active (i.e., if the CTRL key was pressed while the button * was clicked). If the SHIFT mask is active, the frame handles the request. * Otherwise, the request is unhandled. * * @author Jan Hannemann * @author Gregor Kiczales * @version 1.0, 06/13/02 * * @see Button * @see Panel * @see Frame * @see MyChain */ public class Main { /** * Implements a GUI-motivated example for the Chain Of Rspsonsibility design * pattern.&lt;p&gt; * * In this implementation, the request is handled by the panel if the * CTRL mask is active (i.e., if the CTRL key was pressed while the button * was clicked). If the SHIFT mask is active, the frame handles the request. * Otherwise, the request is unhandled. * * @param args command line parameters, unused */ public static void main(String[] args) { Frame frame = new Frame(&quot;Chain of Responsibility&quot;); Panel panel = new Panel(); Button button = new Button(&quot;Click me to see the Chain Of Responsibility pattern in action! Use &lt;SHIFT&gt; and &lt;CTRL&gt; during clicks to see different behavior&quot;); MyChain.aspectOf().setSuccessor(button, panel); MyChain.aspectOf().setSuccessor(panel, frame); MyChain.aspectOf().setNotification(true); frame.getContentPane().add(panel); panel.add(button); frame.pack(); frame.setVisible(true); } }</TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> 2004-03-24T16:00:00Z MyChain.java 2004-03-24T16:00:00Z 2004-03-24T16:00:00Z <br/><TEXTAREA name="code" class="java" rows="16" cols="100">package examples.chainOfResponsibility.aspectj; /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * This file is part of the design patterns project at UBC * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the &quot;License&quot;); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/. * * Software distributed under the License is distributed on an &quot;AS IS&quot; basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is ca.ubc.cs.spl.patterns. * * Contributor(s): */ import java.awt.event.ActionEvent; import ca.ubc.cs.spl.pattern.library.ChainOfResponsibilityProtocol; /** * Implements an instance of the abstracted ChainOfResponsibility design * pattern. Here, the a click on the button triggers an event (request) * that gets passed along the widget hierarchy (button -&gt; panel -&gt; frame). * * In this implementation, the request is handled by the panel if the * CTRL mask is active (i.e., if the CTRL key was pressed while the button * was clicked). If the SHIFT mask is active, the frame handles the request. * Otherwise, the request is unhandled. * * @author Jan Hannemann * @author Gregor Kiczales * @version 1.0, 05/13/02 * */ public aspect MyChain extends ChainOfResponsibilityProtocol { /** * Frame, Panel and Button are all Handlers */ declare parents: Frame implements Handler; declare parents: Panel implements Handler; declare parents: Button implements Handler; // declare parents: ActionEvent implements Object; // this would be nice! doesn't work on classes where AJ does not control the source protected pointcut eventTrigger(Handler handler, Object event): call(void Button.doClick(ActionEvent)) &amp;&amp; target(handler) &amp;&amp; args(event); public boolean Frame.acceptRequest(Object event) { if (event instanceof ActionEvent) { ActionEvent ae = (ActionEvent) event; return ((ae.getModifiers() &amp; ActionEvent.SHIFT_MASK) != 0 ); } return false; } public void Frame.handleRequest(Object event) { MyChain.aspectOf().note(&quot;Class &quot;+this.getClass().getName() + &quot; is handling the event&quot;); } public boolean Panel.acceptRequest(Object event) { if (event instanceof ActionEvent) { ActionEvent ae = (ActionEvent) event; return ((ae.getModifiers() &amp; ActionEvent.CTRL_MASK) != 0 ); } return false; } public void Panel.handleRequest(Object event) { MyChain.aspectOf().note(&quot;Class &quot;+this.getClass().getName() + &quot; is handling the event&quot;); } } </TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> 2004-03-24T16:00:00Z Panel.java 2004-03-24T16:00:00Z 2004-03-24T16:00:00Z <br/><TEXTAREA name="code" class="java" rows="16" cols="100">package examples.chainOfResponsibility.aspectj; /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * This file is part of the design patterns project at UBC * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the &quot;License&quot;); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/. * * Software distributed under the License is distributed on an &quot;AS IS&quot; basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is ca.ubc.cs.spl.patterns. * * Contributor(s): */ import javax.swing.*; /** * A regular GUI JPanel with no modifications * * @author Jan Hannemann * @author Gregor Kiczales * @version 1.0, 05/13/02 * */ public class Panel extends JPanel {} </TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> 2004-03-24T16:00:00Z files.lst 2004-03-24T16:00:00Z 2004-03-24T16:00:00Z <br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> 2004-03-24T16:00:00Z