View Javadoc

1   /*
2    * @(#)$Id: GestureActionManager.java 689 2009-07-22 00:10:27Z bsigner $
3    *
4    * Author       :   Ueli Kurmann, igesture@uelikurmann.ch
5    *
6    * Purpose      : 	The event manager holds a set of event handlers which
7    * 					are executed after an event has been fired. The event
8    *                  manager is registered by algorithms.
9    *
10   * -----------------------------------------------------------------------
11   *
12   * Revision Information:
13   *
14   * Date             Who         Reason
15   *
16   * Dec 26, 2006     ukurmann    Initial Release
17   * Mar 22, 2007     bsigner     Cleanup
18   *
19   * -----------------------------------------------------------------------
20   *
21   * Copyright 1999-2009 ETH Zurich. All Rights Reserved.
22   *
23   * This software is the proprietary information of ETH Zurich.
24   * Use is subject to license terms.
25   * 
26   */
27  
28  
29  package org.ximtec.igesture.event;
30  
31  import java.util.HashMap;
32  import java.util.concurrent.BlockingQueue;
33  import java.util.concurrent.Executors;
34  import java.util.concurrent.LinkedBlockingQueue;
35  
36  import org.ximtec.igesture.core.ResultSet;
37  
38  
39  /**
40   * The event manager holds a set of event handlers which are executed after an
41   * event has been fired. The event manager is registered by algorithms.
42   * 
43   * @version 1.0, Dec 2006
44   * @author Ueli Kurmann, igesture@uelikurmann.ch
45   * @author Beat Signer, signer@inf.ethz.ch
46   */
47  public class GestureActionManager implements GestureHandler {
48  
49     private BlockingQueue<ResultSet> gestureQueue;
50  
51     /**
52      * the list of registered events.
53      */
54     private HashMap<String, GestureAction> actions;
55  
56     /**
57      * the event fired if the resultSet is empty
58      */
59     private GestureAction rejectAction;
60  
61  
62     /**
63      * Constructs a new event manager.
64      */
65     public GestureActionManager() {
66        gestureQueue = new LinkedBlockingQueue<ResultSet>();
67        actions = new HashMap<String, GestureAction>();
68        Executors.newSingleThreadExecutor().execute(new Worker());
69     }
70  
71  
72     /**
73      * Registers an event.
74      * 
75      * @param className the classname for which the event handler has to be
76      *            registered.
77      * @param event the event to be registered.
78      */
79     public void registerEventHandler(String className, GestureAction event) {
80        actions.put(className, event);
81     } // registerEventHandler
82  
83  
84     /**
85      * UnRegisters an event.
86      * 
87      * @param className the classname for which the event handler has to be
88      *            registered.
89      */
90     public void unRegisterEventHandler(String className) {
91        actions.remove(className);
92     } // registerEventHandler
93  
94  
95     /**
96      * Register the reject event handler. This event handler is executed if no
97      * other handler is used.
98      * 
99      * @param rejectEventHandler the event handler to be registered.
100     */
101    public void registerRejectEvent(GestureAction rejectEventHandler) {
102       this.rejectAction = rejectEventHandler;
103    } // registerRejectEvent
104 
105 
106    /**
107     * Adds the result set to the queue and starts the handler in an asynchronous
108     * mode if it is not running.
109     * 
110     * @param resultSet the result set to be added to the queue.
111     */
112    public synchronized void handle(ResultSet resultSet) {
113       try {
114          gestureQueue.put(resultSet);
115       }
116       catch (InterruptedException e) {
117          e.getStackTrace();
118       }
119    } // fireEvent
120 
121    /**
122     * As long as elements are in the queue they are taken and the action is
123     * started. The handler works sequentially.
124     */
125    private class Worker implements Runnable {
126 
127       public void run() {
128          while (true) {
129             try {
130                final ResultSet resultSet = gestureQueue.take();
131 
132                if (resultSet.isEmpty()) {
133 
134                   if (rejectAction != null) {
135                      rejectAction.actionPerformed(resultSet);
136                   }
137 
138                }
139                else {
140                   GestureAction action;
141 
142                   if ((action = actions.get(resultSet.getResult()
143                         .getGestureClassName())) != null) {
144                      action.actionPerformed(resultSet);
145                   }
146                }
147             }
148             catch (Exception e) {
149                e.getMessage();
150             }
151          }
152 
153       } // handleEvents
154    }
155 
156 }