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 }