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