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)); + } +}