Package nodebox.client.devicehandler

Source Code of nodebox.client.devicehandler.AudioPlayerDeviceHandler$AudioPlayerDeviceControl

package nodebox.client.devicehandler;

import nodebox.client.FileUtils;
import nodebox.client.MinimApplet;
import nodebox.client.NodeBoxDocument;
import nodebox.node.Device;
import nodebox.node.NodeLibrary;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.util.Map;

public class AudioPlayerDeviceHandler implements DeviceHandler {
    private String name;
    private String fileName;
    private boolean syncWithTimeline;
    private JFrame frame = null;

    private MinimApplet applet = null;

    public AudioPlayerDeviceHandler(String name) {
        this(name, "", false);
    }

    public AudioPlayerDeviceHandler(String name, String fileName, boolean syncWithTimeline) {
        this.name = name;
        this.fileName = fileName;
        this.syncWithTimeline = syncWithTimeline;
    }

    @Override
    public String getName() {
        return name;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    @Override
    public boolean isSyncedWithTimeline() {
        return syncWithTimeline;
    }

    @Override
    public void start() {
        if (frame != null) stop();
        frame = new JFrame();
        NodeLibrary nodeLibrary = NodeBoxDocument.getCurrentDocument().getNodeLibrary();
        String fileName = getFileName();
        if (! fileName.startsWith("/") && nodeLibrary.getFile() != null) {
            File f = new File(nodeLibrary.getFile().getParentFile(), fileName);
            fileName = f.getAbsolutePath();
        }
        applet = new MinimApplet(fileName, true);
        applet.init();
        frame.add(applet);
    }

    @Override
    public void resume() {
        if (frame == null) {
            start();
        } else {
            applet.play();
        }
    }

    @Override
    public void pause() {
        if (frame != null) {
            applet.pause();
        }
    }

    @Override
    public void stop() {
        if (frame != null) {
            applet.stop();
            applet.dispose();
            frame.dispose();
            frame = null;
            applet = null;
        }
    }

    public void toggleMute() {
        if (frame != null) {
            if (applet.isMuted()) {
                applet.unmute();
            } else {
                applet.mute();
            }
        }
    }

    @Override
    public void addData(Map<String, Object> map) {
        if (applet != null && applet.getPlayer() != null) {
            map.put(getName() + ".source", applet.getPlayer());
            map.put(getName() + ".beat", applet.getBeatDetect());
        }
    }

    public AbstractDeviceControl createControl() {
        return new AudioPlayerDeviceControl(this);
    }

    private class AudioPlayerDeviceControl extends AbstractDeviceControl {

        private JLabel deviceNameLabel;
        private JTextField fileNameField;
        private JCheckBox syncWithTimelineCheck;
        private JButton fileButton;
        private JButton startButton;
        private JButton stopButton;
        private JButton muteButton;

        public AudioPlayerDeviceControl(AudioPlayerDeviceHandler deviceHandler) {
            super(deviceHandler);
            setLayout(new BoxLayout(this, BoxLayout.X_AXIS));

            Dimension d = new Dimension(500, 60);
            setPreferredSize(d);
            setMaximumSize(d);
            setSize(d);

            deviceNameLabel = new JLabel(deviceHandler.getName());

            add(Box.createHorizontalStrut(10));
            add(deviceNameLabel);
            add(Box.createHorizontalStrut(5));

            JPanel filePanel = new JPanel();
            filePanel.setLayout(new BoxLayout(filePanel, BoxLayout.X_AXIS));

            fileNameField = new JTextField(100);
            fileNameField.setText(new File(getFileName()).getName());
            fileNameField.setEditable(false);
            fileNameField.setPreferredSize(new Dimension(100, fileNameField.getHeight()));

            fileButton = new JButton("File...");
            fileButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent actionEvent) {
                    File f = FileUtils.showOpenDialog(null, getFileName(), "mp3,wav", "Music files");
                    if (f != null) {
                        File libraryFile = NodeBoxDocument.getCurrentDocument().getDocumentFile();
                        String fileName;
                        if (libraryFile != null) {
                            fileName = nodebox.util.FileUtils.getRelativePath(f, libraryFile.getParentFile());
                        } else {
                            fileName = f.getAbsolutePath();
                        }
                        setFileName(fileName);
                        fileNameField.setText(f.getName());
                        setPropertyValue("filename", fileName);
                    }
                }
            });

            syncWithTimelineCheck = new JCheckBox("Sync with Timeline");
            syncWithTimelineCheck.setSelected(isSyncedWithTimeline());
            syncWithTimelineCheck.addItemListener(new ItemListener() {
                @Override
                public void itemStateChanged(ItemEvent itemEvent) {
                    syncWithTimeline = syncWithTimelineCheck.isSelected();
                    setPropertyValue(Device.TIMELINE_SYNC, String.valueOf(syncWithTimeline));
                }
            });

            filePanel.add(fileNameField);
            add(Box.createVerticalStrut(5));
            filePanel.add(fileButton);
            add(Box.createHorizontalGlue());

            startButton = new JButton("Play");
            startButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent actionEvent) {
                    if (frame == null) {
                        start();
                    } else if (applet.isPaused()) {
                        resume();
                    } else {
                        pause();
                    }
                    setButtons();
                }
            });
            stopButton = new JButton("Stop");
            stopButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent actionEvent) {
                    stop();
                    setButtons();
                }
            });

            muteButton = new JButton("Mute");
            muteButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent actionEvent) {
                    if (frame != null) {
                        toggleMute();
                        setMuteButtonLabel();
                    }
                }
            });
            setMuteButtonLabel();

            setButtons();

            JPanel startStopPanel = new JPanel();
            startStopPanel.setLayout(new BoxLayout(startStopPanel, BoxLayout.X_AXIS));
            startStopPanel.add(syncWithTimelineCheck);
            startStopPanel.add(Box.createHorizontalStrut(5));
            startStopPanel.add(startButton);
            startStopPanel.add(Box.createHorizontalStrut(5));
            startStopPanel.add(stopButton);
            startStopPanel.add(Box.createHorizontalGlue());
            startStopPanel.add(muteButton);
            startStopPanel.add(Box.createHorizontalGlue());

            JPanel mainPanel = new JPanel();
            mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
            mainPanel.add(filePanel);
            mainPanel.add(startStopPanel);

            add(mainPanel);
            add(Box.createHorizontalGlue());
        }

        private void setButtons() {
            startButton.setText(frame == null ? "Play" : applet.isPaused() ? "Resume" : "Pause");
            stopButton.setEnabled(frame != null);
            setMuteButtonLabel();
            muteButton.setEnabled(frame != null);
        }

        private void setMuteButtonLabel() {
            if (frame != null) {
                muteButton.setText(applet.isMuted() ? "Unmute" : "Mute");
            } else {
                muteButton.setText("Mute");
            }
        }
    }
}
TOP

Related Classes of nodebox.client.devicehandler.AudioPlayerDeviceHandler$AudioPlayerDeviceControl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.