diff --git a/java/.classpath b/java/.classpath
index e387117..10efc83 100644
--- a/java/.classpath
+++ b/java/.classpath
@@ -11,5 +11,6 @@
+
diff --git a/java/resource/icons/camera.png b/java/resource/icons/camera.png
new file mode 100644
index 0000000..e8608c2
Binary files /dev/null and b/java/resource/icons/camera.png differ
diff --git a/java/resource/icons/comment.png b/java/resource/icons/comment.png
new file mode 100644
index 0000000..30968ff
Binary files /dev/null and b/java/resource/icons/comment.png differ
diff --git a/java/resource/icons/connect.png b/java/resource/icons/connect.png
new file mode 100644
index 0000000..203b5e2
Binary files /dev/null and b/java/resource/icons/connect.png differ
diff --git a/java/resource/icons/control_eject_blue.png b/java/resource/icons/control_eject_blue.png
new file mode 100644
index 0000000..3a528af
Binary files /dev/null and b/java/resource/icons/control_eject_blue.png differ
diff --git a/java/resource/icons/control_end_blue.png b/java/resource/icons/control_end_blue.png
new file mode 100644
index 0000000..7b8a6ed
Binary files /dev/null and b/java/resource/icons/control_end_blue.png differ
diff --git a/java/resource/icons/control_fastforward_blue.png b/java/resource/icons/control_fastforward_blue.png
new file mode 100644
index 0000000..e348959
Binary files /dev/null and b/java/resource/icons/control_fastforward_blue.png differ
diff --git a/java/resource/icons/control_pause_blue.png b/java/resource/icons/control_pause_blue.png
new file mode 100644
index 0000000..3ab8b69
Binary files /dev/null and b/java/resource/icons/control_pause_blue.png differ
diff --git a/java/resource/icons/control_play_blue.png b/java/resource/icons/control_play_blue.png
new file mode 100644
index 0000000..a1f7345
Binary files /dev/null and b/java/resource/icons/control_play_blue.png differ
diff --git a/java/resource/icons/control_rewind_blue.png b/java/resource/icons/control_rewind_blue.png
new file mode 100644
index 0000000..de9fc07
Binary files /dev/null and b/java/resource/icons/control_rewind_blue.png differ
diff --git a/java/resource/icons/control_start_blue.png b/java/resource/icons/control_start_blue.png
new file mode 100644
index 0000000..b60086c
Binary files /dev/null and b/java/resource/icons/control_start_blue.png differ
diff --git a/java/resource/icons/control_stop_blue.png b/java/resource/icons/control_stop_blue.png
new file mode 100644
index 0000000..f15bf69
Binary files /dev/null and b/java/resource/icons/control_stop_blue.png differ
diff --git a/java/resource/icons/image.png b/java/resource/icons/image.png
new file mode 100644
index 0000000..00c0978
Binary files /dev/null and b/java/resource/icons/image.png differ
diff --git a/java/resource/icons/sound_mute.png b/java/resource/icons/sound_mute.png
new file mode 100644
index 0000000..c683bc6
Binary files /dev/null and b/java/resource/icons/sound_mute.png differ
diff --git a/java/src/pm/Main.java b/java/src/pm/Main.java
index 2d141ca..b797f58 100644
--- a/java/src/pm/Main.java
+++ b/java/src/pm/Main.java
@@ -17,6 +17,7 @@ import pm.device.gui.GUIDevice;
import pm.device.javainput.extreme3d.Extreme3DDevice;
import pm.device.javainput.rumblepad.RumblepadDevice;
import pm.device.jintellitype.JIntellitypeDevice;
+import pm.device.panel.PanelDevice;
import pm.device.player.PlayerDevice;
import pm.device.text.TextDevice;
import pm.device.text.lan.LanTextDevice;
@@ -51,22 +52,23 @@ public class Main extends EventListener {
}
public void initialise() throws DeviceInitialiseException {
- //add(new JIntellitypeDevice());
+ add(new JIntellitypeDevice());
//add(new PlayerDevice());
//add(new RumblepadDevice());
//add(new WiimoteDevice());
//add(new GUIDevice());
//add(new TextDevice());
+ add(new PanelDevice());
//add(new LanTextDevice());
//add(new Extreme3DDevice());
startDevices();
//add(new ExampleApplication());
//add(new WMPApplication());
- add(new GomPlayerApplication());
+ //add(new GomPlayerApplication());
//add(new WinampApplication());
- //add(new iTunesApplication());
- add(new VLCApplication());
+ add(new iTunesApplication());
+ //add(new VLCApplication());
//add(new MPCApplication());
startApplications();
}
diff --git a/java/src/pm/device/panel/HoldButton.java b/java/src/pm/device/panel/HoldButton.java
new file mode 100644
index 0000000..8abc9ce
--- /dev/null
+++ b/java/src/pm/device/panel/HoldButton.java
@@ -0,0 +1,33 @@
+package pm.device.panel;
+
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+
+import javax.swing.JButton;
+
+public class HoldButton extends JButton implements MouseListener {
+ protected static final long serialVersionUID = 1L;
+
+ protected HoldButtonListener holdButtonListener;
+
+ public HoldButton(HoldButtonListener holdButtonListener) {
+ this.holdButtonListener = holdButtonListener;
+ addMouseListener(this);
+ }
+
+ public void mousePressed(MouseEvent event) {
+ if (event.getButton() == MouseEvent.BUTTON1) {
+ holdButtonListener.buttonPressed(this);
+ }
+ }
+
+ public void mouseReleased(MouseEvent event) {
+ if (event.getButton() == MouseEvent.BUTTON1) {
+ holdButtonListener.buttonReleased(this);
+ }
+ }
+
+ public void mouseClicked(MouseEvent event) {}
+ public void mouseEntered(MouseEvent event) {}
+ public void mouseExited(MouseEvent event) {}
+}
diff --git a/java/src/pm/device/panel/HoldButtonListener.java b/java/src/pm/device/panel/HoldButtonListener.java
new file mode 100644
index 0000000..fe21235
--- /dev/null
+++ b/java/src/pm/device/panel/HoldButtonListener.java
@@ -0,0 +1,6 @@
+package pm.device.panel;
+
+public interface HoldButtonListener {
+ public void buttonPressed(HoldButton button);
+ public void buttonReleased(HoldButton button);
+}
diff --git a/java/src/pm/device/panel/Panel.java b/java/src/pm/device/panel/Panel.java
new file mode 100644
index 0000000..2f97ecc
--- /dev/null
+++ b/java/src/pm/device/panel/Panel.java
@@ -0,0 +1,216 @@
+package pm.device.panel;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.net.URL;
+import java.util.concurrent.TimeUnit;
+
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JProgressBar;
+import javax.swing.JSlider;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import pm.Device;
+import pm.macro.state.Press;
+
+public class Panel extends JFrame implements ChangeListener, HoldButtonListener {
+ protected static final long serialVersionUID = 1L;
+ protected final static String TITLE = "MIMIS Panel Device";
+
+ protected PanelButtonListener panelButtonListener;
+ protected ClassLoader classLoader;
+
+ protected JLabel timeLabel;
+ protected JLabel chapterLabel;
+
+ protected JProgressBar positionProgressBar;
+ protected JSlider positionSlider;
+ protected JSlider volumeSlider;
+
+ protected JButton previousChapterButton;
+ protected JButton rewindButton;
+ protected JButton stopButton;
+ protected JButton pauseButton;
+ protected JButton playButton;
+ protected JButton fastForwardButton;
+ protected JButton nextChapterButton;
+ protected JButton toggleMuteButton;
+ protected boolean setPositionValue;
+
+ Panel(PanelButtonListener panelButtonListener) {
+ super(TITLE);
+ this.panelButtonListener = panelButtonListener;
+ classLoader = getClass().getClassLoader();
+ createControls();
+ layoutControls();
+ pack();
+ setResizable(false);
+ setVisible(true);
+ }
+
+ protected URL getResource(String name) {
+ return classLoader.getResource(name);
+ }
+
+ protected ImageIcon getImageIcon(String name) {
+ return new ImageIcon(getResource(name));
+ }
+
+ protected JButton getButton(String name, String text) {
+ JButton button = (JButton) new HoldButton(this);
+ button.setIcon(getImageIcon(name));
+ button.setToolTipText(text);
+ return button;
+ }
+
+ protected void createControls() {
+ timeLabel = new JLabel("hh:mm:ss");
+ chapterLabel = new JLabel("00/00");
+
+ positionProgressBar = new JProgressBar();
+ positionProgressBar.setToolTipText("Time");
+
+ positionSlider = new JSlider();
+ positionSlider.setToolTipText("Position");
+
+ volumeSlider = new JSlider();
+ volumeSlider.setOrientation(JSlider.HORIZONTAL);
+ volumeSlider.setPreferredSize(new Dimension(100, 40));
+ volumeSlider.setToolTipText("Change volume");
+
+ previousChapterButton = getButton("icons/control_start_blue.png", "Go to previous chapter");
+ rewindButton = getButton("icons/control_rewind_blue.png", "Skip back");
+ stopButton = getButton("icons/control_stop_blue.png", "Stop");
+ pauseButton = getButton("icons/control_pause_blue.png", "Play/pause");
+ playButton = getButton("icons/control_play_blue.png", "Play");
+ fastForwardButton = getButton("icons/control_fastforward_blue.png", "Skip forward");
+ nextChapterButton = getButton("icons/control_end_blue.png", "Go to next chapter");
+ toggleMuteButton = getButton("icons/sound_mute.png", "Toggle Mute");
+ }
+
+ protected void layoutControls() {
+ setLayout(new BorderLayout());
+
+ JPanel positionPanel = new JPanel();
+ positionPanel.setLayout(new GridLayout(2, 1));
+ positionPanel.add(positionProgressBar);
+ positionPanel.add(positionSlider);
+
+ JPanel topPanel = new JPanel();
+ topPanel.setLayout(new BorderLayout(8, 0));
+
+ topPanel.add(timeLabel, BorderLayout.WEST);
+ topPanel.add(positionPanel, BorderLayout.CENTER);
+ topPanel.add(chapterLabel, BorderLayout.EAST);
+ add(topPanel, BorderLayout.NORTH);
+
+ JPanel bottomPanel = new JPanel();
+ bottomPanel.setLayout(new FlowLayout());
+
+ bottomPanel.add(previousChapterButton);
+ bottomPanel.add(rewindButton);
+ bottomPanel.add(stopButton);
+ bottomPanel.add(pauseButton);
+ bottomPanel.add(playButton);
+ bottomPanel.add(fastForwardButton);
+ bottomPanel.add(nextChapterButton);
+ bottomPanel.add(volumeSlider);
+ bottomPanel.add(toggleMuteButton);
+
+ add(bottomPanel, BorderLayout.SOUTH);
+
+ positionSlider.addChangeListener(this);
+ volumeSlider.addChangeListener(this);
+ }
+
+ /* Listeners */
+ public void stateChanged(ChangeEvent event) {
+ Object source = event.getSource();
+ if (positionSlider.equals(source)) {
+ if (!setPositionValue) {
+ float positionValue = (float) positionSlider.getValue() / 100.0f;
+ System.out.println(positionValue);
+ }
+ } else if (volumeSlider.equals(source)) {
+
+ }
+ }
+
+ public void buttonPressed(HoldButton button) {
+ if (button.equals(previousChapterButton)) {
+ panelButtonListener.buttonPressed(PanelButton.PREVIOUS_CHAPTER);
+ } else if (button.equals(rewindButton)) {
+ panelButtonListener.buttonPressed(PanelButton.REWIND);
+ } else if (button.equals(stopButton)) {
+ panelButtonListener.buttonPressed(PanelButton.STOP);
+ } else if (button.equals(pauseButton)) {
+ panelButtonListener.buttonPressed(PanelButton.PAUSE);
+ } else if (button.equals(playButton)) {
+ panelButtonListener.buttonPressed(PanelButton.PLAY);
+ } else if (button.equals(fastForwardButton)) {
+ panelButtonListener.buttonPressed(PanelButton.FAST_FORWARD);
+ } else if (button.equals(nextChapterButton)) {
+ panelButtonListener.buttonPressed(PanelButton.NEXT_CHAPTER);
+ } else if (button.equals(toggleMuteButton)) {
+ panelButtonListener.buttonPressed(PanelButton.TOGGLE_MUTE);
+ }
+ }
+
+ public void buttonReleased(HoldButton button) {
+ if (button.equals(previousChapterButton)) {
+ panelButtonListener.buttonReleased(PanelButton.PREVIOUS_CHAPTER);
+ } else if (button.equals(rewindButton)) {
+ panelButtonListener.buttonReleased(PanelButton.REWIND);
+ } else if (button.equals(stopButton)) {
+ panelButtonListener.buttonReleased(PanelButton.STOP);
+ } else if (button.equals(pauseButton)) {
+ panelButtonListener.buttonReleased(PanelButton.PAUSE);
+ } else if (button.equals(playButton)) {
+ panelButtonListener.buttonReleased(PanelButton.PLAY);
+ } else if (button.equals(fastForwardButton)) {
+ panelButtonListener.buttonReleased(PanelButton.FAST_FORWARD);
+ } else if (button.equals(nextChapterButton)) {
+ panelButtonListener.buttonReleased(PanelButton.NEXT_CHAPTER);
+ } else if (button.equals(toggleMuteButton)) {
+ panelButtonListener.buttonReleased(PanelButton.TOGGLE_MUTE);
+ }
+ }
+
+ /* Update */
+ public void updateTime(long millis) {
+ String s = String.format(
+ "%02d:%02d:%02d",
+ TimeUnit.MILLISECONDS.toHours(millis),
+ TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
+ TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
+ timeLabel.setText(s);
+ }
+
+ public void updatePosition(int value) {
+ positionProgressBar.setValue(value);
+ setPositionValue = true;
+ positionSlider.setValue(value);
+ setPositionValue = false;
+ }
+
+ public void updateChapter(int chapter, int chapterCount) {
+ String s = chapterCount != -1 ? (chapter + 1) + "/" + chapterCount
+ : "-";
+ chapterLabel.setText(s);
+ chapterLabel.invalidate();
+ validate();
+ }
+
+ public void updateVolume(int value) {
+ volumeSlider.setValue(value);
+ }
+}
diff --git a/java/src/pm/device/panel/PanelButton.java b/java/src/pm/device/panel/PanelButton.java
new file mode 100644
index 0000000..2484e36
--- /dev/null
+++ b/java/src/pm/device/panel/PanelButton.java
@@ -0,0 +1,14 @@
+package pm.device.panel;
+
+import pm.Button;
+
+public enum PanelButton implements Button {
+ PREVIOUS_CHAPTER,
+ REWIND,
+ STOP,
+ PAUSE,
+ PLAY,
+ FAST_FORWARD,
+ NEXT_CHAPTER,
+ TOGGLE_MUTE;
+}
diff --git a/java/src/pm/device/panel/PanelButtonListener.java b/java/src/pm/device/panel/PanelButtonListener.java
new file mode 100644
index 0000000..9b44472
--- /dev/null
+++ b/java/src/pm/device/panel/PanelButtonListener.java
@@ -0,0 +1,6 @@
+package pm.device.panel;
+
+public interface PanelButtonListener {
+ public void buttonPressed(PanelButton panelButton);
+ public void buttonReleased(PanelButton panelButton);
+}
diff --git a/java/src/pm/device/panel/PanelDevice.java b/java/src/pm/device/panel/PanelDevice.java
new file mode 100644
index 0000000..5e9737f
--- /dev/null
+++ b/java/src/pm/device/panel/PanelDevice.java
@@ -0,0 +1,32 @@
+package pm.device.panel;
+
+import pm.Device;
+import pm.event.Task;
+import pm.macro.state.Press;
+import pm.macro.state.Release;
+import pm.value.Action;
+import pm.value.Target;
+
+public class PanelDevice extends Device implements PanelButtonListener {
+
+ protected Panel panel;
+
+ public void initialise() {
+ panel = new Panel(this);
+ panel.updateTime(12342398);
+ panel.updatePosition(43);
+ add(new Press(PanelButton.PLAY), new Task(Action.PLAY, Target.APPLICATION));
+ }
+
+ public void exit() {
+ panel.dispose();
+ }
+
+ public void buttonPressed(PanelButton panelButton) {
+ add(new Press(panelButton));
+ }
+
+ public void buttonReleased(PanelButton panelButton) {
+ add(new Release(panelButton));
+ }
+}