/*
 * @(#)Main.java  
 * 
 * Copyright (c) 2011 Werner Randelshofer, Immensee, Switzerland.
 * All rights reserved.
 * 
 * You may not use, copy or modify this file, except in compliance with the
 * license agreement you entered into with Werner Randelshofer.
 * For details see accompanying license terms.
 */
package org.monte.jmftsccdemo;

import java.awt.BorderLayout;
import java.io.File;
import javax.media.Controller;
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.Manager;
import javax.media.Player;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;

/**
 * Main.
 *
 * @author Werner Randelshofer
 * @version $Id: Main.java 134 2011-12-02 16:23:00Z werner $
 */
public class Main extends javax.swing.JFrame {

    private JFileChooser generateChooser;
    private JFileChooser openChooser;
    private Player player;

    /** Creates new form Main */
    public Main() {
        initComponents();
        setSize(400, 400);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        infoLabel = new javax.swing.JLabel();
        menuBar = new javax.swing.JMenuBar();
        fileMenu = new javax.swing.JMenu();
        generateVideoItem = new javax.swing.JMenuItem();
        openVideoItem = new javax.swing.JMenuItem();

        FormListener formListener = new FormListener();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("TSCC Codec for JMF - Demo");

        infoLabel.setText("<html><b>This is a demo for the TSCCCodec class.</b><br>\nThis class supports encoding and decoding of the Techsmith Screen Capture format with the Java Media Framework ( JMF).<br>\nCopyright © 2011 Werner Randelshofer.<br>\nThis software can be licensed under Creative Commons Attribution 3.0<br>");
        infoLabel.setBorder(javax.swing.BorderFactory.createEmptyBorder(8, 12, 12, 12));
        getContentPane().add(infoLabel, java.awt.BorderLayout.PAGE_START);

        fileMenu.setText("File");

        generateVideoItem.setText("Generate Sample Movies...");
        generateVideoItem.addActionListener(formListener);
        fileMenu.add(generateVideoItem);

        openVideoItem.setText("Open Movie...");
        openVideoItem.addActionListener(formListener);
        fileMenu.add(openVideoItem);

        menuBar.add(fileMenu);

        setJMenuBar(menuBar);

        pack();
    }

    // Code for dispatching events from components to event handlers.

    private class FormListener implements java.awt.event.ActionListener {
        FormListener() {}
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            if (evt.getSource() == generateVideoItem) {
                Main.this.generatePerformed(evt);
            }
            else if (evt.getSource() == openVideoItem) {
                Main.this.openPerformed(evt);
            }
        }
    }// </editor-fold>//GEN-END:initComponents

private void generatePerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_generatePerformed
    if (generateChooser == null) {
        generateChooser = new JFileChooser();
        generateChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    }
    if (JFileChooser.APPROVE_OPTION == generateChooser.showDialog(this, "Choose Output Folder")) {
        final File f = generateChooser.getSelectedFile();
        final JProgressBar pb = new JProgressBar();
        pb.setIndeterminate(true);
        getContentPane().add(pb, BorderLayout.SOUTH);
        ((JComponent) getContentPane()).revalidate();
        SwingWorker w = new SwingWorker() {

            @Override
            protected Object doInBackground() throws Exception {
                    org.monte.jmfavidemo.Main.main(new String[]{f.getPath()});
                return null;
            }

            @Override
            protected void done() {
                pb.setIndeterminate(false);
                getContentPane().remove(pb);
                ((JComponent) getContentPane()).revalidate();
                getContentPane().repaint();
            }
            
        };
        new Thread(w).start();
    }
}//GEN-LAST:event_generatePerformed

private void openPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openPerformed
    if (openChooser == null) {
        openChooser = new JFileChooser();
    }
    if (JFileChooser.APPROVE_OPTION == openChooser.showOpenDialog(this)) {
        final File f = openChooser.getSelectedFile();
        try {
            final Player newPlayer = Manager.createPlayer(Manager.createDataSource(f.toURI().toURL()));
            newPlayer.addControllerListener(new ControllerListener() {

                @Override
                public void controllerUpdate(ControllerEvent event) {
                    if (newPlayer.getState() == Controller.Realized) {
                        newPlayer.removeControllerListener(this);

                        getContentPane().removeAll();
                        JPanel panel = new JPanel(new BorderLayout());
                        panel.add(newPlayer.getVisualComponent(), BorderLayout.CENTER);
                        panel.add(newPlayer.getControlPanelComponent(), BorderLayout.SOUTH);
                        add(panel, BorderLayout.CENTER);
                        pack();

                        if (player != null) {
                            player.close();
                        }
                        player = newPlayer;
                        getRootPane().putClientProperty("Window.documentFile", f);
                        setTitle(f.getName());
                    }
                }
            });
            newPlayer.realize();
        } catch (Exception ex) {
            JLabel label = new JLabel(ex.toString());
            add(label, BorderLayout.CENTER);
            ((JComponent) getContentPane()).revalidate();
            getContentPane().repaint();
            ex.printStackTrace();
        }
    }

}//GEN-LAST:event_openPerformed

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        
        
        Manager.setHint(Manager.LIGHTWEIGHT_RENDERER, true);
        
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Main().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JMenu fileMenu;
    private javax.swing.JMenuItem generateVideoItem;
    private javax.swing.JLabel infoLabel;
    private javax.swing.JMenuBar menuBar;
    private javax.swing.JMenuItem openVideoItem;
    // End of variables declaration//GEN-END:variables
}
