package aluvisa.applications.mjpegviewer.GUI;
|
|
import art.library.gui.flat.FlatPanel;
|
import art.library.gui.flat.FlatTabbedPane;
|
import aluvisa.applications.mjpegviewer.Shared;
|
import aluvisa.applications.mjpegviewer.mjpeg.Decoder;
|
import aluvisa.applications.mjpegviewer.mjpeg.EncoderImage;
|
import art.library.gui.flat.FlatButton;
|
import art.library.gui.flat.FlatDialog;
|
import art.library.gui.flat.FlatFileChooser;
|
import art.library.gui.flat.FlatProgressBar;
|
import art.library.gui.flat.FlatSlider;
|
import art.library.gui.flat.FlatToggleButton;
|
import art.library.gui.flat.FlatWindow;
|
import art.library.utils.resources.Resources;
|
import java.awt.BorderLayout;
|
import java.awt.Color;
|
import java.awt.Dimension;
|
import java.awt.Graphics;
|
import java.awt.Graphics2D;
|
import java.awt.KeyEventDispatcher;
|
import java.awt.KeyboardFocusManager;
|
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionListener;
|
import java.awt.event.KeyEvent;
|
import java.io.File;
|
import javax.media.MediaLocator;
|
import javax.swing.JFileChooser;
|
import javax.swing.JFrame;
|
import javax.swing.JToolBar;
|
import javax.swing.SwingUtilities;
|
import javax.swing.Timer;
|
import javax.swing.filechooser.FileNameExtensionFilter;
|
|
|
public class ViewerPanel extends PanelGeneric
|
{
|
private FlatButton buttonLoad = null;
|
private FlatButton buttonSave = null;
|
private FlatButton buttonPrevious = null;
|
private FlatButton buttonNext = null;
|
private FlatToggleButton buttonPlay = null;
|
private FlatTabbedPane flatTabbedPane = null;
|
private PanelMovie panel1 = null;
|
private FlatPanel panel2 = null;
|
private FlatPanel panel3 = null;
|
private FlatPanel panel4 = null;
|
private FlatProgressBar flatProgressBar = null;
|
private Decoder decoder = null;
|
private boolean selected = false;
|
private Timer timer = null;
|
private File file = null;
|
private boolean showButtonsInside = false;
|
private FlatSlider flatSlider = null;
|
|
public ViewerPanel viewer = null;
|
|
public ViewerPanel()
|
{
|
initialise();
|
reload();
|
viewer = this;
|
}
|
|
public ViewerPanel(boolean showButtonsInside)
|
{
|
this.showButtonsInside = showButtonsInside;
|
initialise();
|
reload();
|
viewer = this;
|
}
|
|
|
|
public Decoder getDecoder ()
|
{
|
return(decoder);
|
}
|
|
|
public void editable(boolean value)
|
{
|
super.editable(value);
|
}
|
|
public void setSelected (boolean value)
|
{
|
if (value == true)
|
{
|
selection();
|
}
|
else
|
{
|
deselection();
|
}
|
}
|
|
|
|
public void selection()
|
{
|
selected = true;
|
|
try
|
{
|
if (showButtonsInside == false)
|
{
|
FlatWindow window = (FlatWindow)SwingUtilities.getRoot(this);
|
window.addButtonSeparator();
|
window.addButtonMenu(buttonLoad);
|
window.addButtonMenu(buttonSave);
|
window.addButtonMenu(buttonPlay);
|
window.addButtonMenu(buttonPrevious);
|
window.addButtonMenu(buttonNext);
|
}
|
}
|
catch (Exception e)
|
{
|
}
|
}
|
|
|
public void deselection()
|
{
|
selected = false;
|
|
try
|
{
|
if (showButtonsInside == false)
|
{
|
FlatWindow window = (FlatWindow)SwingUtilities.getRoot(this);
|
window.removeComponentMenu(buttonLoad);
|
window.removeComponentMenu(buttonSave);
|
window.removeComponentMenu(buttonPrevious);
|
window.removeComponentMenu(buttonPlay);
|
window.removeComponentMenu(buttonNext);
|
}
|
}
|
catch (Exception e)
|
{
|
}
|
}
|
|
|
|
public void grants()
|
{
|
}
|
|
|
public void timer()
|
{
|
}
|
|
|
private void reload()
|
{
|
}
|
|
|
|
private void initialise()
|
{
|
try
|
{
|
new ThreadSlider().start();
|
|
buttonLoad = new FlatButton(Shared.getMessage("&Load"));
|
buttonLoad.setIcon(Resources.getResourceURL("data/aluvisa.applications.mjpegviewer/icons/24x24/import-archive.png"));
|
buttonLoad.setPreferredSize(new Dimension(buttonLoad.getStringWidth(), 0));
|
buttonLoad.addActionListener(new java.awt.event.ActionListener()
|
{
|
public void actionPerformed(java.awt.event.ActionEvent evt)
|
{
|
load();
|
}
|
});
|
|
|
buttonSave = new FlatButton(Shared.getMessage("&Export"));
|
buttonSave.setIcon(Resources.getResourceURL("data/aluvisa.applications.mjpegviewer/icons/24x24/export-archive.png"));
|
buttonSave.setPreferredSize(new Dimension(buttonSave.getStringWidth(), 0));
|
buttonSave.addActionListener(new java.awt.event.ActionListener()
|
{
|
public void actionPerformed(java.awt.event.ActionEvent evt)
|
{
|
save();
|
}
|
});
|
|
|
buttonPlay = new FlatToggleButton(Shared.getMessage("&Play"));
|
buttonPlay.setIcon(Resources.getResourceURL("data/aluvisa.applications.mjpegviewer/icons/24x24/play39.png"));
|
buttonPlay.setPreferredSize(new Dimension(buttonPlay.getStringWidth(), 0));
|
buttonPlay.addActionListener(new java.awt.event.ActionListener()
|
{
|
public void actionPerformed(java.awt.event.ActionEvent evt)
|
{
|
play();
|
}
|
});
|
|
buttonPrevious = new FlatButton(Shared.getMessage("&Previous picture"));
|
buttonPrevious.setIcon(Resources.getResourceURL("data/aluvisa.applications.mjpegviewer/icons/24x24/previous-track.png"));
|
buttonPrevious.setPreferredSize(new Dimension(buttonPrevious.getStringWidth(), 0));
|
buttonPrevious.addActionListener(new java.awt.event.ActionListener()
|
{
|
public void actionPerformed(java.awt.event.ActionEvent evt)
|
{
|
buttonPlay.setSelected(false);
|
play();
|
previous();
|
}
|
});
|
|
buttonNext = new FlatButton(Shared.getMessage("&Next picture"));
|
buttonNext.setIcon(Resources.getResourceURL("data/aluvisa.applications.mjpegviewer/icons/24x24/next-track.png"));
|
buttonNext.setPreferredSize(new Dimension(buttonNext.getStringWidth(), 0));
|
buttonNext.addActionListener(new java.awt.event.ActionListener()
|
{
|
public void actionPerformed(java.awt.event.ActionEvent evt)
|
{
|
buttonPlay.setSelected(false);
|
play();
|
next();
|
}
|
});
|
|
|
panel1 = new PanelMovie();
|
|
panel2 = new FlatPanel();
|
{
|
flatProgressBar = new FlatProgressBar();
|
flatProgressBar.setStringPainted(true);
|
panel2.setLayout(new BorderLayout());
|
panel2.add(flatProgressBar, BorderLayout.CENTER);
|
panel2.setPreferredSize(new Dimension(16,16));
|
}
|
|
|
buttonPrevious.setVisible(false);
|
buttonPlay.setVisible(false);
|
buttonNext.setVisible(false);
|
buttonSave.setVisible(false);
|
|
this.setLayout(new BorderLayout());
|
flatSlider = new FlatSlider();
|
{
|
flatSlider.getLook().colorBackground = Color.white;
|
flatSlider.revalidate();
|
flatSlider.setMinimum((int)0);
|
flatSlider.setMaximum((int)100);
|
flatSlider.setPaintTrack(false);
|
flatSlider.setValue((int)0);
|
flatSlider.setVisible(true);
|
}
|
|
flatSlider.addMouseListener(new java.awt.event.MouseAdapter() {
|
public void mousePressed(java.awt.event.MouseEvent evt) {
|
jSlider1MousePressed(evt);
|
}
|
public void mouseReleased(java.awt.event.MouseEvent evt) {
|
jSlider1MouseReleased(evt);
|
}
|
});
|
|
panel4 = new FlatPanel();
|
panel4.setPreferredSize(new Dimension(16,16));
|
panel4.setMinimumSize(new Dimension(16,16));
|
panel4.setLayout(new BorderLayout());
|
panel4.setRaisedBorder(0,0,1,0);
|
panel4.setLayout(new BorderLayout());
|
panel4.add(flatSlider, BorderLayout.CENTER);
|
panel4.setLineBorder(1,1,1,1);
|
|
if (showButtonsInside == true)
|
{
|
panel3 = new FlatPanel();
|
JToolBar toolbar = new JToolBar();
|
toolbar.setFloatable(false);
|
toolbar.setBorder(null);
|
addButtonMenu(toolbar, buttonSave);
|
addButtonMenu(toolbar, buttonPrevious);
|
addButtonMenu(toolbar, buttonPlay);
|
addButtonMenu(toolbar, buttonNext);
|
panel3.setPreferredSize(new Dimension(24,24));
|
panel3.setMinimumSize(new Dimension(24,24));
|
panel3.setLayout(new BorderLayout());
|
panel3.add(toolbar, BorderLayout.CENTER);
|
panel3.setRaisedBorder(0,0,1,0);
|
this.add(panel3, BorderLayout.NORTH);
|
}
|
|
|
this.add(panel1, BorderLayout.CENTER);
|
this.add(panel2, BorderLayout.SOUTH);
|
panel2.setVisible(false);
|
|
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher()
|
{
|
public boolean dispatchKeyEvent(KeyEvent e)
|
{
|
if ((e.paramString().contains("KEY_PRESSED")))
|
{
|
int keycode = e.getKeyCode();
|
if (keycode == KeyEvent.VK_SPACE)
|
{
|
try
|
{
|
if (buttonPlay.isSelected() == true)
|
{
|
buttonPlay.setSelected(false);
|
}
|
else
|
{
|
buttonPlay.setSelected(true);
|
}
|
|
play();
|
}
|
catch (Exception exception)
|
{
|
|
}
|
}
|
else if (keycode == 39)
|
{
|
try
|
{
|
if (buttonNext.isSelected() == true)
|
{
|
buttonNext.setSelected(false);
|
}
|
else
|
{
|
buttonNext.setSelected(true);
|
}
|
|
buttonPlay.setSelected(false);
|
play();
|
next();
|
}
|
catch (Exception exception)
|
{
|
|
}
|
}
|
else if (keycode == 37)
|
{
|
try
|
{
|
if (buttonPrevious.isSelected() == true)
|
{
|
buttonPrevious.setSelected(false);
|
}
|
else
|
{
|
buttonPrevious.setSelected(true);
|
}
|
|
buttonPlay.setSelected(false);
|
play();
|
previous();
|
}
|
catch (Exception exception)
|
{
|
|
}
|
}
|
}
|
|
// No consumimos el evento
|
KeyboardFocusManager.getCurrentKeyboardFocusManager().dispatchKeyEvent(e);
|
return false;
|
}
|
});
|
}
|
catch (Exception e)
|
{
|
}
|
}
|
|
|
boolean sliderPulsado = false;
|
|
private void jSlider1MousePressed(java.awt.event.MouseEvent evt) {
|
try
|
{
|
int valor = flatSlider.getValue();
|
setCurrentPicture(valor);
|
sliderPulsado = true;
|
}
|
catch (Exception e)
|
{
|
e.printStackTrace();
|
sliderPulsado = true;
|
}
|
}
|
|
private void jSlider1MouseReleased(java.awt.event.MouseEvent evt) {
|
try
|
{
|
int valor = flatSlider.getValue();
|
setCurrentPicture(valor);
|
sliderPulsado = false;
|
}
|
catch (Exception e)
|
{
|
e.printStackTrace();
|
sliderPulsado = false;
|
}
|
}
|
|
|
|
public void unload()
|
{
|
panel3.setVisible(false);
|
decoder.interrupt();
|
decoder = null;
|
}
|
|
|
|
public void load(byte[] data)
|
{
|
try
|
{
|
if (data == null) { unload(); return; };
|
if (data.length == 0) { unload(); return; };
|
|
buttonLoad.setVisible(false);
|
|
if (timer != null)
|
{
|
timer.stop();
|
timer = null;
|
}
|
buttonLoad.setEnabled(false);
|
buttonSave.setVisible(true);
|
buttonPlay.setVisible(true);
|
buttonPrevious.setVisible(true);
|
buttonNext.setVisible(true);
|
|
ViewerPanel.this.remove(panel2);
|
ViewerPanel.this.remove(panel4);
|
ViewerPanel.this.add(panel2, BorderLayout.SOUTH);
|
panel2.setVisible(true);
|
decoder = new Decoder(data, flatProgressBar, flatSlider);
|
decoder.addActionListener(new ActionListener()
|
{
|
public void actionPerformed(ActionEvent e)
|
{
|
buttonLoad.setEnabled(true);
|
buttonSave.setVisible(true);
|
buttonPrevious.setVisible(true);
|
buttonPlay.setVisible(true);
|
buttonNext.setVisible(true);
|
panel2.setVisible(false);
|
ViewerPanel.this.remove(panel2);
|
ViewerPanel.this.add(panel4, BorderLayout.SOUTH);
|
ViewerPanel.this.repaint();
|
buttonPlay.setSelected(true);
|
play();
|
}
|
});
|
panel3.setVisible(true);
|
decoder.start();
|
|
}
|
catch (Exception e)
|
{
|
panel3.setVisible(false);
|
buttonLoad.setEnabled(true);
|
buttonSave.setVisible(true);
|
buttonPrevious.setVisible(false);
|
buttonPlay.setVisible(false);
|
buttonNext.setVisible(false);
|
if (data.length > 0)
|
{
|
FlatDialog.showDialog((JFrame)SwingUtilities.getRoot(this), Shared.getMessage("Error"), Shared.getMessage("Invalid or wrong file"), true, FlatDialog.DIALOG_INFORMATION);
|
}
|
}
|
}
|
|
|
private void load()
|
{
|
try
|
{
|
buttonLoad.setVisible(true);
|
|
FlatFileChooser filechooser = new FlatFileChooser(System.getProperty("user.dir", "."));
|
filechooser.setDialogTitle(Shared.getMessage("Open file"));
|
filechooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
|
FileNameExtensionFilter filter = new FileNameExtensionFilter(Shared.getMessage("MJPG files"), "mjpg", "mjpg");
|
filechooser.addChoosableFileFilter(filter);
|
filechooser.setFileFilter(filter);
|
int returnValue = filechooser.showDialog((JFrame)SwingUtilities.getRoot(this), Shared.getMessage("Open file"));
|
|
if (returnValue == JFileChooser.APPROVE_OPTION)
|
{
|
try
|
{
|
if (timer != null)
|
{
|
timer.stop();
|
timer = null;
|
}
|
|
file = filechooser.getSelectedFile();
|
buttonLoad.setEnabled(false);
|
buttonSave.setVisible(false);
|
buttonPlay.setVisible(false);
|
buttonPrevious.setVisible(false);
|
buttonNext.setVisible(false);
|
|
if (panel2 != null) ViewerPanel.this.remove(panel2);
|
if (panel4 != null) ViewerPanel.this.remove(panel4);
|
ViewerPanel.this.add(panel2, BorderLayout.SOUTH);
|
panel2.setVisible(true);
|
decoder = new Decoder(file, flatProgressBar, flatSlider);
|
decoder.addActionListener(new ActionListener()
|
{
|
public void actionPerformed(ActionEvent e)
|
{
|
buttonLoad.setEnabled(true);
|
buttonSave.setVisible(true);
|
buttonPrevious.setVisible(true);
|
buttonPlay.setVisible(true);
|
buttonNext.setVisible(true);
|
panel2.setVisible(false);
|
ViewerPanel.this.remove(panel2);
|
ViewerPanel.this.add(panel4, BorderLayout.SOUTH);
|
ViewerPanel.this.repaint();
|
}
|
});
|
decoder.start();
|
}
|
catch (Exception e)
|
{
|
buttonLoad.setEnabled(true);
|
buttonSave.setVisible(true);
|
buttonPrevious.setVisible(false);
|
buttonPlay.setVisible(false);
|
buttonNext.setVisible(false);
|
FlatDialog.showDialog((JFrame)SwingUtilities.getRoot(this), Shared.getMessage("Error"), Shared.getMessage("Invalid or wrong file"), true, FlatDialog.DIALOG_INFORMATION);
|
}
|
}
|
}
|
catch (Exception e)
|
{
|
}
|
}
|
|
|
|
|
|
|
private void save()
|
{
|
try
|
{
|
FlatFileChooser filechooser = new FlatFileChooser(System.getProperty("user.dir", "."));
|
if (file != null) filechooser.setSelectedFile(new File(file.getAbsolutePath().replace(".mjpg", ".mp4")));
|
filechooser.setDialogTitle(Shared.getMessage("Save file"));
|
filechooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
|
FileNameExtensionFilter filter = new FileNameExtensionFilter(Shared.getMessage("MP4 files"), "mp4", "mp4");
|
|
filechooser.addChoosableFileFilter(filter);
|
filechooser.setFileFilter(filter);
|
int returnValue = filechooser.showSaveDialog(SwingUtilities.getRoot(this));
|
if (returnValue == JFileChooser.APPROVE_OPTION)
|
{
|
try
|
{
|
buttonLoad.setEnabled(false);
|
buttonSave.setEnabled(false);
|
|
File file = filechooser.getSelectedFile();
|
String filename = file.toURI().toURL().toString();
|
if (filename.endsWith(".mp4") == false) filename = filename + ".mp4";
|
MediaLocator oml = EncoderImage.createMediaLocator(filename.replaceAll("%20", " "));
|
EncoderImage encoder = new EncoderImage(720, 360, decoder.fps, decoder.getImages(), oml);
|
encoder.addActionListener(new ActionListener()
|
{
|
public void actionPerformed(ActionEvent e)
|
{
|
buttonLoad.setEnabled(true);
|
buttonSave.setEnabled(true);
|
FlatDialog.showDialog((JFrame)SwingUtilities.getWindowAncestor(ViewerPanel.this), Shared.getMessage("Information"), Shared.getMessage("Export finished correctly"), true, FlatDialog.DIALOG_INFORMATION);
|
}
|
});
|
encoder.start();
|
|
}
|
catch (Exception e)
|
{
|
e.printStackTrace();
|
buttonLoad.setEnabled(true);
|
buttonSave.setEnabled(true);
|
FlatDialog.showDialog((FlatWindow)SwingUtilities.getRoot(this), Shared.getMessage("Error"), Shared.getMessage("Error exporting file"), true, FlatDialog.DIALOG_INFORMATION);
|
}
|
}
|
}
|
catch (Exception e)
|
{
|
e.printStackTrace();
|
}
|
}
|
|
|
|
|
|
|
public void saveFile(File file)
|
{
|
try
|
{
|
String filename = file.toURI().toURL().toString();
|
if (filename.endsWith(".mp4") == false) filename = filename + ".mp4";
|
MediaLocator oml = EncoderImage.createMediaLocator(filename.replaceAll("%20", " "));
|
EncoderImage encoder = new EncoderImage(720, 360, decoder.fps, decoder.getImages(), oml);
|
encoder.addActionListener(new ActionListener()
|
{
|
public void actionPerformed(ActionEvent e)
|
{
|
}
|
});
|
encoder.start();
|
}
|
catch (Exception e)
|
{
|
e.printStackTrace();
|
}
|
}
|
|
|
|
private void play()
|
{
|
if (timer != null)
|
{
|
timer.stop();
|
timer = null;
|
}
|
|
if (buttonPlay.isSelected() == true)
|
{
|
if (decoder.timexframe > 0)
|
{
|
timer = new Timer((int)decoder.timexframe, new ActionListener()
|
{
|
public void actionPerformed(ActionEvent e)
|
{
|
next();
|
}
|
});
|
|
timer.start();
|
}
|
}
|
}
|
|
|
private void previous()
|
{
|
try
|
{
|
currentpicture = currentpicture - 1;
|
if (currentpicture < 0) currentpicture = 0;
|
flatSlider.setValue(currentpicture);
|
repaint();
|
}
|
catch (Exception e)
|
{
|
}
|
}
|
|
|
|
private void next()
|
{
|
try
|
{
|
currentpicture = currentpicture + 1;
|
if (currentpicture >= decoder.lsnapshot.size()) currentpicture = 0;
|
flatSlider.setValue(currentpicture);
|
repaint();
|
}
|
catch (Exception e)
|
{
|
}
|
}
|
|
|
|
private void setCurrentPicture(int value)
|
{
|
try
|
{
|
currentpicture = value;
|
if (currentpicture >= decoder.lsnapshot.size()) currentpicture = 0;
|
if (currentpicture < 0) currentpicture = 0;
|
flatSlider.setValue(currentpicture);
|
repaint();
|
}
|
catch (Exception e)
|
{
|
}
|
}
|
|
|
|
|
|
public void addButtonMenu(JToolBar panel, FlatButton button)
|
{
|
button.getLook().border = false;
|
button.getLook().borderRollover = true;
|
button.getLook().borderSelected = true;
|
button.getLook().colorBackground = panel.getBackground();
|
button.getLook().opaque = true;
|
button.getLook().focus = false;
|
button.setPreferredSize(new Dimension(button.getPreferredSize().width, 32));
|
button.setMaximumSize(new Dimension(button.getPreferredSize().width + 8, 32));
|
button.revalidate();
|
panel.add(button);
|
}
|
|
|
|
|
public void addButtonMenu(JToolBar panel, FlatToggleButton button)
|
{
|
button.getLook().border = false;
|
button.getLook().borderRollover = true;
|
button.getLook().borderSelected = true;
|
button.getLook().colorBackground = panel.getBackground();
|
button.getLook().opaque = true;
|
button.getLook().focus = false;
|
button.setPreferredSize(new Dimension(button.getPreferredSize().width, 32));
|
button.setMaximumSize(new Dimension(button.getPreferredSize().width + 8, 32));
|
button.revalidate();
|
panel.add(button);
|
}
|
|
|
|
public int currentpicture = 0;
|
|
|
private class PanelMovie extends FlatPanel
|
{
|
public void paint(Graphics g)
|
{
|
try
|
{
|
Graphics2D g2 = (Graphics2D)g;
|
g2.setBackground(Color.black);
|
g2.clearRect(0, 0, getWidth(), getHeight());
|
if (decoder == null) return;
|
double w = decoder.lsnapshot.get(currentpicture).image.getWidth();
|
double h = decoder.lsnapshot.get(currentpicture).image.getHeight();
|
double rx = (double)getWidth()/w;
|
double ry = (double)getHeight()/h;
|
double scale = Math.min(rx, ry);
|
double dx = Math.abs((getWidth() - (w * scale))/2);
|
double dy = Math.abs((getHeight() - (h * scale))/2);
|
g2.translate(dx, dy);
|
g2.scale(scale, scale);
|
g2.drawImage(decoder.lsnapshot.get(currentpicture).image, 0, 0, null);
|
}
|
catch (Exception e)
|
{
|
}
|
}
|
}
|
|
|
private class ThreadSlider extends Thread
|
{
|
public void run ()
|
{
|
while (true)
|
{
|
try
|
{
|
if (sliderPulsado == true)
|
{
|
setCurrentPicture(flatSlider.getValue());
|
}
|
}
|
catch (Exception e)
|
{
|
|
}
|
|
try{sleep(150);} catch (Exception e){};
|
}
|
}
|
}
|
|
}
|