View Javadoc

1   /*
2    * @(#)$Id: Gesture3DToolUI.java
3    *
4    * Author		:	Arthur Vogels, arthur.vogels@gmail.com
5    *                  
6    *
7    * Purpose		:   User interface for the Gesture3DTool.
8    *
9    * -----------------------------------------------------------------------
10   *
11   * Revision Information:
12   *
13   * Date				Who			Reason
14   *
15   * 15.01.2009		vogelsar	Initial Release
16   *
17   * -----------------------------------------------------------------------
18   *
19   * Copyright 1999-2009 ETH Zurich. All Rights Reserved.
20   *
21   * This software is the proprietary information of ETH Zurich.
22   * Use is subject to license terms.
23   * 
24   */
25  
26  package org.ximtec.igesture.algorithm.rubine3d.tools;
27  
28  import java.awt.event.ActionEvent;
29  import java.awt.event.ActionListener;
30  import java.awt.event.WindowAdapter;
31  import java.awt.event.WindowEvent;
32  import java.util.Iterator;
33  import java.util.List;
34  
35  import javax.swing.JButton;
36  import javax.swing.JComboBox;
37  import javax.swing.JFrame;
38  import javax.swing.JLabel;
39  import javax.swing.JTextArea;
40  import javax.swing.JTextField;
41  
42  import org.ximtec.igesture.core.Gesture;
43  import org.ximtec.igesture.core.GestureClass;
44  import org.ximtec.igesture.core.GestureSample3D;
45  import org.ximtec.igesture.core.GestureSet;
46  import org.ximtec.igesture.util.additions3d.RecordedGesture3D;
47  
48  public class Gesture3DToolUI extends JFrame {
49  
50  	private String setName;
51  	private String className;
52  	private int currentSampleNumber;
53  	private List<Gesture<RecordedGesture3D>> samples;
54  
55  	private boolean started;
56  	
57  	private JLabel gestureSetLabel;
58  	private JLabel gestureClassLabel;
59  	private JLabel gestureSampleLabel;
60  
61  	private JComboBox gestureSetComboBox; // Combobox to pick the GestureSet
62  	private JComboBox gestureClassComboBox; // Combobox to pick the GestureClass
63  	// from
64  	// the GestureSet
65  
66  	private JButton removeSetButton; // Button to remove a gesture set
67  
68  	private JButton removeClassButton; // Button to remove a gesture class
69  
70  	private WiiReaderPanel samplePanel;// Panel that displays the current
71  	// GestureSample3d
72  	private JButton sampleBackButton; // Button to go one GestureSample3D
73  	// backward
74  	private JButton sampleForwardButton; // Button to go one GestureSample3D
75  	// backward
76  
77  	private JButton removeSampleButton; // Button to remove the current gesture
78  	// sample
79  
80  	private JTextField addGestureSetTextField; // Field to type the name of a
81  	// new gesture set
82  	private JButton addGestureSetButton; // Button to add a gesture set
83  
84  	private JTextField addGestureClassTextField; // Field to type the name of a
85  	// new gesture class
86  	private JButton addGestureClassButton; // Button to add a gesture class
87  
88  	private JButton addGestureSampleButton; // Button to add a gesture sample
89  
90  	private JButton startWiiMoteButton; // Button to start wiimote
91  
92  	private JButton stopWiiMoteButton; // Button to start wiimote
93  
94  	private JButton recogniseButton; // Button to start recognising
95  
96  	private JTextArea resultTextArea; // Textfield to display the result
97  
98  	private Gesture3DTool controller; // controller
99  
100 	public Gesture3DToolUI(final Gesture3DTool controller) {
101 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
102 
103 		setSize(1100, 500);
104 		setTitle("WiiMote Test Frame");
105 		setLayout(null);
106 
107 		this.controller = controller;
108 		
109 		started = false;
110 
111 		// UI ELEMENTS
112 		gestureSetLabel = new JLabel("Choose Gesture Set");
113 		gestureSetLabel.setBounds(15, 15, 150, 20);
114 		getContentPane().add(gestureSetLabel);
115 
116 		gestureClassLabel = new JLabel("Choose Gesture Class");
117 		gestureClassLabel.setBounds(190, 15, 150, 20);
118 		getContentPane().add(gestureClassLabel);
119 
120 		gestureSampleLabel = new JLabel("Gesture Sample");
121 		gestureSampleLabel.setBounds(125, 90, 150, 20);
122 		getContentPane().add(gestureSampleLabel);
123 
124 		gestureSetComboBox = new JComboBox();
125 		gestureSetComboBox.setBounds(15, 35, 150, 20);
126 		gestureSetComboBox.addActionListener(new gestureSetComboBoxListener());
127 		getContentPane().add(gestureSetComboBox);
128 
129 		gestureClassComboBox = new JComboBox();
130 		gestureClassComboBox.setBounds(190, 35, 150, 20);
131 		gestureClassComboBox
132 				.addActionListener(new gestureClassComboBoxListener());
133 		getContentPane().add(gestureClassComboBox);
134 
135 		removeSetButton = new JButton("Remove Set");
136 		removeSetButton.setBounds(15, 60, 150, 25);
137 		removeSetButton.addActionListener(new removeSetButtonListener());
138 		getContentPane().add(removeSetButton);
139 
140 		removeClassButton = new JButton("Remove Class");
141 		removeClassButton.setBounds(190, 60, 150, 25);
142 		removeClassButton.addActionListener(new removeClassButtonListener());
143 		getContentPane().add(removeClassButton);
144 
145 		samplePanel = new WiiReaderPanel(null);
146 		samplePanel.setBounds(80, 120, 200, 200);
147 		samplePanel.setVisible(true);
148 		getContentPane().add(samplePanel);
149 
150 		sampleBackButton = new JButton("<");
151 		sampleBackButton.setBounds(20, 125, 45, 190);
152 		sampleBackButton.addActionListener(new sampleBackwardButtonListener());
153 		getContentPane().add(sampleBackButton);
154 
155 		sampleForwardButton = new JButton(">");
156 		sampleForwardButton.setBounds(290, 125, 45, 190);
157 		sampleForwardButton
158 				.addActionListener(new sampleForwardButtonListener());
159 		getContentPane().add(sampleForwardButton);
160 
161 		removeSampleButton = new JButton("Remove Sample");
162 		removeSampleButton.setBounds(100, 330, 150, 50);
163 		removeSampleButton.addActionListener(new removeSampleButtonListener());
164 		getContentPane().add(removeSampleButton);
165 
166 		addGestureSetTextField = new JTextField("");
167 		addGestureSetTextField.setBounds(400, 35, 200, 20);
168 		getContentPane().add(addGestureSetTextField);
169 
170 		addGestureSetButton = new JButton("Add new GestureSet");
171 		addGestureSetButton.setBounds(620, 35, 400, 20);
172 		addGestureSetButton
173 				.addActionListener(new addGestureSetButtonListener());
174 		getContentPane().add(addGestureSetButton);
175 
176 		addGestureClassTextField = new JTextField("");
177 		addGestureClassTextField.setBounds(400, 70, 200, 20);
178 		getContentPane().add(addGestureClassTextField);
179 
180 		addGestureClassButton = new JButton(
181 				"Add new GestureClass to current GestureSet");
182 		addGestureClassButton.setBounds(620, 70, 400, 20);
183 		addGestureClassButton
184 				.addActionListener(new addGestureClassButtonListener());
185 		getContentPane().add(addGestureClassButton);
186 
187 		WiiReaderPanel wiiInputPanel = controller.getWiiReaderPanel();
188 		wiiInputPanel.setBounds(400, 120, 200, 200);
189 		getContentPane().add(wiiInputPanel);
190 
191 		addGestureSampleButton = new JButton(
192 				"Add this sample to the current GestureClass");
193 		addGestureSampleButton.setBounds(620, 200, 400, 50);
194 		addGestureSampleButton
195 				.addActionListener(new addGestureSampleButtonListener());
196 		getContentPane().add(addGestureSampleButton);
197 
198 		startWiiMoteButton = new JButton("Connect WiiMote");
199 		startWiiMoteButton.setBounds(620, 125, 200, 50);
200 		startWiiMoteButton.addActionListener(new startWiiMoteButtonListener());
201 		getContentPane().add(startWiiMoteButton);
202 
203 		stopWiiMoteButton = new JButton("Disconnect WiiMote");
204 		stopWiiMoteButton.setBounds(820, 125, 200, 50);
205 		stopWiiMoteButton.addActionListener(new stopWiiMoteButtonListener());
206 		getContentPane().add(stopWiiMoteButton);
207 
208 		recogniseButton = new JButton("Recognise this gesture");
209 		recogniseButton.setBounds(400, 330, 200, 50);
210 		recogniseButton.addActionListener(new recogniseButtonListener());
211 		getContentPane().add(recogniseButton);
212 
213 		resultTextArea = new JTextArea();
214 		resultTextArea.setBounds(620, 280, 400, 180);
215 		getContentPane().add(resultTextArea);
216 
217 		// Fill comboboxes
218 		setGestureSetsBox(controller.getGestureSets());
219 		setGestureClassesBox(controller
220 				.getGestureSet((String) gestureSetComboBox.getSelectedItem()));
221 
222 		// Get current names and numbers
223 		setName = (String) gestureSetComboBox.getSelectedItem();
224 		className = (String) gestureClassComboBox.getSelectedItem();
225 		currentSampleNumber = 0;
226 
227 		// Get samples
228 		samples = controller.getGestureSamples(setName, className);
229 
230 		// Set close operation
231 		this.addWindowListener(new WindowAdapter() {
232 			public void windowClosing(WindowEvent e) {
233 				System.out.println("Window Closing");
234 				controller.disconnectWiiMote();
235 			}
236 
237 		});
238 		
239 		// Set sample panel when window is made visible
240 		this.addWindowListener(new WindowAdapter() {
241 			public void windowOpened(WindowEvent e) {
242 				System.out.println("Window Opening, setting sample panel");
243 				started = true;
244 				setSamplePanel();
245 			}
246 
247 		});
248 	}
249 
250 	public void setNextSample() {
251 		System.err.print("setNextSample(): Samples size: " + samples.size());
252 		if (!(currentSampleNumber + 1 >= samples.size())) {
253 			currentSampleNumber = currentSampleNumber + 1;
254 			// sampleForwardButton.setEnabled(false);
255 		}
256 		if (samples.size() > 0) {
257 			samplePanel.setGesture((GestureSample3D) samples
258 					.get(currentSampleNumber));
259 			System.err.println(" Sample number displayed: "
260 					+ currentSampleNumber);
261 		}
262 	}
263 
264 	public void setPreviousSample() {
265 		System.err
266 				.print("setPreviousSample(): Samples size: " + samples.size());
267 		if (currentSampleNumber > 0) {
268 			currentSampleNumber = currentSampleNumber - 1;
269 		} else{
270 			// sampleBackButton.setEnabled(false);
271 		}
272 		if (samples.size() > 0) {
273 			samplePanel.setGesture((GestureSample3D) samples
274 					.get(currentSampleNumber));
275 			System.err.println(" Sample number displayed: "
276 					+ currentSampleNumber);
277 		}
278 	}
279 
280 	/**
281 	 * 
282 	 * 
283 	 * @param gestureSets
284 	 */
285 	public void setGestureSetsBox(List<GestureSet> gestureSets) {
286 		// Clear GestureSets combobox
287 		gestureSetComboBox.removeAllItems();
288 		// Fill GestureSets combobox
289 		if (gestureSets.size() > 0) {
290 			// Fill GestureSets combobox
291 			for (Iterator<GestureSet> gSetsIter = gestureSets.iterator(); gSetsIter
292 					.hasNext();) {
293 				GestureSet tempSet = gSetsIter.next();
294 				gestureSetComboBox.addItem(tempSet.getName());
295 			}
296 		}
297 	}
298 
299 	private void setGestureClassesBox(GestureSet gestureSet) {
300 		// Clear GestureClasses combobox
301 		gestureClassComboBox.removeAllItems();
302 		// Fill GestureClasses combobox
303 		if (gestureSet != null && gestureSet.getGestureClasses().size() > 0) {
304 			for (Iterator<GestureClass> gClassIter = gestureSet
305 					.getGestureClasses().iterator(); gClassIter.hasNext();) {
306 				GestureClass tempClass = gClassIter.next();
307 				gestureClassComboBox.addItem(tempClass.getName());
308 			}
309 		}
310 	}
311 
312 	public void selectGestureSet(String setName) {
313 		gestureSetComboBox.setSelectedItem(setName);
314 	}
315 
316 	public void selectGestureSet(int index) {
317 		gestureSetComboBox.setSelectedItem(index);
318 	}
319 
320 	public void selectGestureSet(GestureSet set) {
321 		gestureSetComboBox.setSelectedItem(set.getName());
322 	}
323 
324 	public void selectGestureClass(String className) {
325 		gestureClassComboBox.setSelectedItem(className);
326 	}
327 
328 	public void selectGestureClass(int index) {
329 		gestureClassComboBox.setSelectedItem(index);
330 	}
331 
332 	public void selectGestureClass(GestureClass gClass) {
333 		gestureClassComboBox.setSelectedItem(gClass.getName());
334 	}
335 
336 	public void setResultField(org.ximtec.igesture.core.ResultSet set) {
337 		String text = "Gesture Class:    ->    Accuracy:\n\n";
338 		for (int i = 0; i < set.getResults().size(); i++) {
339 			text = text + set.getResult(i).getGestureClass().getName() + " -> "
340 					+ set.getResult(i).getAccuracy() + "\n";
341 		}
342 		resultTextArea.setText(text);
343 	}
344 
345 	private void setSamplePanel() {
346 		if (controller.getGestureSamples(setName, className).size() > 0
347 				&& currentSampleNumber < controller.getGestureSamples(setName,
348 						className).size()) {
349 			samplePanel.setGesture((GestureSample3D) controller
350 					.getGestureSamples(setName, className).get(
351 							currentSampleNumber));
352 		} else {
353 			System.err
354 					.println("Gesture3DToolUI.setSamplePanel(): currentSampleNumber out of range");
355 			samplePanel.setGesture(null);
356 		}
357 	}
358 
359 	// ACTION LISTENERS
360 
361 	private class gestureSetComboBoxListener implements ActionListener {
362 		public void actionPerformed(ActionEvent e) {
363 			// Determine name of selected set
364 			setName = (String) gestureSetComboBox.getSelectedItem();
365 			// Fill gesture classes combobox with gesture class names from
366 			// selected set
367 			setGestureClassesBox(controller.getGestureSet(setName));
368 			currentSampleNumber = 0;
369 			if(started)
370 				setSamplePanel();
371 		}
372 	}
373 
374 	private class gestureClassComboBoxListener implements ActionListener {
375 		public void actionPerformed(ActionEvent e) {
376 			// Determine name of selected class
377 			className = (String) gestureClassComboBox.getSelectedItem();
378 			// Load gesture samples from this class
379 			samples = controller.getGestureSamples(setName, className);
380 			currentSampleNumber = 0;
381 			if(started)
382 				setSamplePanel();
383 		}
384 	}
385 
386 	private class addGestureSetButtonListener implements ActionListener {
387 		public void actionPerformed(ActionEvent e) {
388 			String newSetName = addGestureSetTextField.getText();
389 			controller.addGestureSet(newSetName);
390 			setGestureSetsBox(controller.getGestureSets());
391 			addGestureSetTextField.setText("");
392 			gestureClassComboBox.removeAllItems();
393 			gestureSetComboBox.setSelectedItem(newSetName);
394 			currentSampleNumber = 0;
395 			if(started)
396 				setSamplePanel();
397 		}
398 	}
399 
400 	private class addGestureClassButtonListener implements ActionListener {
401 		public void actionPerformed(ActionEvent e) {
402 			if (setName == null || setName.equals("")) {
403 				System.err.println("No Gesture Set selected.");
404 				return;
405 			}
406 			String newClassName = addGestureClassTextField.getText();
407 			controller.addGestureClass(setName, newClassName);
408 			setGestureClassesBox(controller.getGestureSet(setName));
409 			addGestureClassTextField.setText("");
410 			gestureClassComboBox.setSelectedItem(newClassName);
411 			currentSampleNumber = 0;
412 			if(started)
413 				setSamplePanel();
414 		}
415 	}
416 
417 	private class addGestureSampleButtonListener implements ActionListener {
418 		public void actionPerformed(ActionEvent e) {
419 			if (setName == null || setName.equals("")) {
420 				System.err.println("No Gesture Set selected.");
421 				return;
422 			}
423 			if (className == null || className.equals("")) {
424 				System.err.println("No Gesture Class selected.");
425 				return;
426 			}
427 			controller
428 					.addCurrentGestureSampleToGestureClass(setName, className);
429 			samples = controller.getGestureSamples(setName, className);
430 		}
431 	}
432 
433 	private class sampleForwardButtonListener implements ActionListener {
434 		public void actionPerformed(ActionEvent e) {
435 			// Fill samplePanel if applicable
436 			setNextSample();
437 		}
438 	}
439 
440 	private class sampleBackwardButtonListener implements ActionListener {
441 		public void actionPerformed(ActionEvent e) {
442 			// Fill samplePanel if applicable
443 			setPreviousSample();
444 		}
445 	}
446 
447 	private class startWiiMoteButtonListener implements ActionListener {
448 		public void actionPerformed(ActionEvent e) {
449 			// Start WiiMote
450 			controller.initWiiMote();
451 		}
452 	}
453 
454 	private class stopWiiMoteButtonListener implements ActionListener {
455 		public void actionPerformed(ActionEvent e) {
456 			// Disconnect WiiMote
457 			controller.disconnectWiiMote();
458 		}
459 	}
460 
461 	private class recogniseButtonListener implements ActionListener {
462 		public void actionPerformed(ActionEvent e) {
463 			// Start Recognising
464 			controller.recognise(setName);
465 		}
466 	}
467 
468 	private class removeSampleButtonListener implements ActionListener {
469 		public void actionPerformed(ActionEvent e) {
470 			// Remove Sample
471 			controller.removeSample(setName, className, currentSampleNumber);
472 			currentSampleNumber = 0;
473 			// Reset sample panel
474 			if(started)
475 				setSamplePanel();
476 		}
477 	}
478 
479 	private class removeSetButtonListener implements ActionListener {
480 		public void actionPerformed(ActionEvent e) {
481 			// Remove Sample
482 			controller.removeSet(setName);
483 			// Refill comboboxes
484 			setGestureSetsBox(controller.getGestureSets());
485 			setGestureClassesBox(controller
486 					.getGestureSet((String) gestureSetComboBox
487 							.getSelectedItem()));
488 			if(started)
489 				setSamplePanel();
490 		}
491 	}
492 
493 	private class removeClassButtonListener implements ActionListener {
494 		public void actionPerformed(ActionEvent e) {
495 			// Remove Sample
496 			controller.removeClass(setName, className);
497 			// Refill combobox
498 			setGestureClassesBox(controller
499 					.getGestureSet((String) gestureSetComboBox
500 							.getSelectedItem()));
501 			if(started)
502 				setSamplePanel();
503 		}
504 	}
505 
506 }