00001 package edu.stanford.hci.r3.events.replay;
00002
00003 import java.awt.BorderLayout;
00004 import java.awt.Color;
00005 import java.awt.Component;
00006 import java.awt.Container;
00007 import java.awt.Font;
00008 import java.awt.event.ActionEvent;
00009 import java.awt.event.ActionListener;
00010 import java.awt.event.MouseAdapter;
00011 import java.awt.event.MouseEvent;
00012 import java.io.File;
00013
00014 import javax.swing.BorderFactory;
00015 import javax.swing.BoundedRangeModel;
00016 import javax.swing.JButton;
00017 import javax.swing.JFileChooser;
00018 import javax.swing.JFrame;
00019 import javax.swing.JPanel;
00020 import javax.swing.JTextArea;
00021
00022 import prefuse.Display;
00023 import prefuse.data.query.NumberRangeModel;
00024 import edu.stanford.hci.r3.PaperToolkit;
00025 import edu.stanford.hci.r3.pattern.calibrate.CalibrationEngine;
00026 import edu.stanford.hci.r3.pen.ink.Ink;
00027 import edu.stanford.hci.r3.util.DebugUtils;
00028 import edu.stanford.hci.r3.util.WindowUtils;
00029 import edu.stanford.hci.r3.util.components.JRangeSlider;
00030 import edu.stanford.hci.r3.util.files.FileUtils;
00031
00043 public class EventBrowserView extends JFrame {
00044
00048 private EventBrowser browser;
00049
00050 private JPanel commandsPanel;
00051
00052 private Display display;
00053
00054 private JPanel eventSliderPanel;
00055
00056 private JPanel eventVizView;
00057
00058 private JButton playButton;
00059
00060 private BoundedRangeModel rangeModel;
00061
00062 private JRangeSlider rangeSlider;
00063
00064 private JTextArea infoArea;
00065
00066 private JPanel bottomPanel;
00067
00068 private JButton importButton;
00069
00070 private JButton clearButton;
00071
00072 private JButton playFastButton;
00073
00078 public EventBrowserView(EventBrowser brows, Display disp) {
00079 browser = brows;
00080 display = disp;
00081 setTitle("Event Browser");
00082 setSize(800, 320);
00083 setupComponents();
00084
00085
00086
00087
00088
00089 setLocation(WindowUtils.getWindowOrigin(this, WindowUtils.DESKTOP_CENTER));
00090 }
00091
00095 private JButton getClearButton() {
00096 if (clearButton == null) {
00097 clearButton = new JButton("Clear");
00098 clearButton.addActionListener(new ActionListener() {
00099 public void actionPerformed(ActionEvent e) {
00100 browser.clearLoadedEvents();
00101 }
00102 });
00103 }
00104 return clearButton;
00105 }
00106
00110 private Component getCommandsPanel() {
00111 if (commandsPanel == null) {
00112 commandsPanel = new JPanel();
00113 commandsPanel.add(getClearButton());
00114 commandsPanel.add(getImportButton());
00115 commandsPanel.add(getExportButton());
00116 commandsPanel.add(getPlayButton());
00117 }
00118 return commandsPanel;
00119 }
00120
00121 private Component getInfoArea() {
00122 if (infoArea == null) {
00123 infoArea = new JTextArea();
00124 infoArea.setEditable(false);
00125 infoArea.setFont(new Font("Tahoma", Font.PLAIN, 14));
00126 infoArea.setBorder(BorderFactory.createEmptyBorder(7, 5, 7, 5));
00127 infoArea.setForeground(Color.WHITE);
00128 infoArea.setText("Ready...");
00129 }
00130 return infoArea;
00131 }
00132
00136 private Component getEventSliderPanel() {
00137 if (eventSliderPanel == null) {
00138 eventSliderPanel = new JPanel();
00139 eventSliderPanel.setLayout(new BorderLayout());
00140 eventSliderPanel.add(getEventVizView(), BorderLayout.SOUTH);
00141 eventSliderPanel.add(getRangeSlider(), BorderLayout.SOUTH);
00142 }
00143 return eventSliderPanel;
00144 }
00145
00149 private Component getEventVizView() {
00150 if (eventVizView == null) {
00151 eventVizView = new JPanel();
00152 eventVizView.setLayout(new BorderLayout());
00153 eventVizView.add(display, BorderLayout.CENTER);
00154 }
00155 return eventVizView;
00156 }
00157
00161 private JButton getExportButton() {
00162 return new JButton("Export");
00163 }
00164
00168 private JButton getImportButton() {
00169 if (importButton == null) {
00170 importButton = new JButton("Import");
00171 importButton.addActionListener(new ActionListener() {
00172 public void actionPerformed(ActionEvent e) {
00173 JFileChooser chooser = FileUtils.createNewFileChooser(EventReplayManager.FILE_EXTENSION);
00174 chooser.setCurrentDirectory(new File(PaperToolkit.getToolkitRootPath(), "eventData/"));
00175 chooser.setMultiSelectionEnabled(true);
00176 int result = chooser.showDialog(null, "Import Event Data");
00177 if (result == JFileChooser.APPROVE_OPTION) {
00178 File[] selectedFiles = chooser.getSelectedFiles();
00179 for (File f : selectedFiles) {
00180 DebugUtils.println("Loading " + f);
00181 browser.loadEventData(f);
00182 }
00183 }
00184
00185 }
00186 });
00187 }
00188 return importButton;
00189 }
00190
00194 private JButton getPlayButton() {
00195 if (playButton == null) {
00196 playButton = new JButton("Play");
00197 playButton.addActionListener(new ActionListener() {
00198 public void actionPerformed(ActionEvent e) {
00199 try {
00200 DebugUtils.println("Waiting 1.5 seconds...");
00201 Thread.sleep(1500);
00202 DebugUtils.println("Play Events Now...");
00203 } catch (InterruptedException ex) {
00204 ex.printStackTrace();
00205 }
00206 browser.replayLoadedEvents();
00207 }
00208 });
00209 }
00210 return playButton;
00211 }
00212
00213 private JButton getPlayFastButton() {
00214 if (playFastButton == null) {
00215 playFastButton = new JButton("Play Fast");
00216 playFastButton.addActionListener(new ActionListener() {
00217 public void actionPerformed(ActionEvent e) {
00218 try {
00219 DebugUtils.println("Waiting 1.5 seconds...");
00220 Thread.sleep(1500);
00221 DebugUtils.println("Play Events Now...");
00222 } catch (InterruptedException ex) {
00223 ex.printStackTrace();
00224 }
00225 browser.replayLoadedEvents();
00226 }
00227 });
00228 }
00229 return playFastButton;
00230 }
00231
00235 private BoundedRangeModel getRangeModel() {
00236 if (rangeModel == null) {
00237 rangeModel = new NumberRangeModel(0, 1000, 0, 1000);
00238 }
00239 return rangeModel;
00240 }
00241
00245 private Component getRangeSlider() {
00246 if (rangeSlider == null) {
00247 rangeSlider = new EventSlider(getRangeModel(), JRangeSlider.HORIZONTAL,
00248 JRangeSlider.LEFTRIGHT_TOPBOTTOM);
00249 rangeSlider.setBackground(Color.DARK_GRAY);
00250 rangeSlider.setForeground(new Color(202, 217, 253));
00251 rangeSlider.setThumbColor(new Color(249, 248, 244));
00252 rangeSlider.setMinExtent(1);
00253 rangeSlider.addMouseListener(new MouseAdapter() {
00254 public void mousePressed(MouseEvent e) {
00255 DebugUtils.println("Pressed");
00256 }
00257
00258 public void mouseReleased(MouseEvent e) {
00259 DebugUtils.println("Released");
00260 }
00261 });
00262
00263 }
00264 return rangeSlider;
00265 }
00266
00270 private void setupComponents() {
00271 final Container contentPane = getContentPane();
00272 contentPane.add(getEventSliderPanel(), BorderLayout.CENTER);
00273 contentPane.add(getBottomPanel(), BorderLayout.SOUTH);
00274 }
00275
00276 private Component getBottomPanel() {
00277 if (bottomPanel == null) {
00278 bottomPanel = new JPanel();
00279 bottomPanel.setLayout(new BorderLayout());
00280 bottomPanel.add(getInfoArea(), BorderLayout.CENTER);
00281 bottomPanel.add(getCommandsPanel(), BorderLayout.EAST);
00282
00283 }
00284 return bottomPanel;
00285 }
00286 }