/*
* @(#)FileProperties.java
*
* Copyright (c) 2006-2008 by dvb.matt, All Rights Reserved.
*
* This file is part of ProjectX, a free Java based demux utility.
* By the authors, ProjectX is intended for educational purposes only,
* as a non-commercial test project.
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package net.sourceforge.dvb.projectx.gui;
import java.awt.Image;
import java.awt.image.MemoryImageSource;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.KeyEvent;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.event.*;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.SwingConstants;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import javax.swing.JSlider;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
import java.io.IOException;
import java.util.Arrays;
import net.sourceforge.dvb.projectx.gui.UISwitchListener;
import net.sourceforge.dvb.projectx.gui.CommonGui;
import net.sourceforge.dvb.projectx.gui.ColumnLayout;
import net.sourceforge.dvb.projectx.gui.ComboBoxIndexListener;
import net.sourceforge.dvb.projectx.gui.ComboBoxItemListener;
import net.sourceforge.dvb.projectx.gui.CheckBoxListener;
import net.sourceforge.dvb.projectx.gui.TextFieldListener;
import net.sourceforge.dvb.projectx.gui.TextFieldKeyListener;
import net.sourceforge.dvb.projectx.common.Keys;
import net.sourceforge.dvb.projectx.common.Common;
import net.sourceforge.dvb.projectx.common.Resource;
import net.sourceforge.dvb.projectx.common.JobCollection;
import net.sourceforge.dvb.projectx.xinput.XInputFile;
import net.sourceforge.dvb.projectx.video.Preview;
import net.sourceforge.dvb.projectx.parser.HpFix;
import net.sourceforge.dvb.projectx.parser.StripAudio;
import net.sourceforge.dvb.projectx.parser.StripRelook;
import net.sourceforge.dvb.projectx.parser.StripMedion;
import net.sourceforge.dvb.projectx.parser.CommonParsing;
/**
*
*/
public class FileProperties extends JFrame {
private String title = Resource.getString("General.FileProperties");
private ComboBoxIndexListener _ComboBoxIndexListener = new ComboBoxIndexListener();
private ComboBoxItemListener _ComboBoxItemListener = new ComboBoxItemListener();
private CheckBoxListener _CheckBoxListener = new CheckBoxListener();
private TextFieldListener _TextFieldListener = new TextFieldListener();
private TextFieldKeyListener _TextFieldKeyListener = new TextFieldKeyListener();
private XInputFile inputfile = null;
private JTextArea area = null;
private JLabel length = null;
private JSlider slider = null;
private View view;
private Color bg_color = new Color(0, 150, 0);
private int loadSizeForward = 1024000;
private int collection_number = 0;
private int collection_index = 0;
private int tmp_value = 0;
private boolean silent = false;
private Preview Preview = new Preview(loadSizeForward);
/**
* Constructor
*/
public FileProperties()
{
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
close();
}
});
JPanel container = new JPanel();
container.setLayout(new BorderLayout());
buildMenu();
container.add(buildMainPanel());
getContentPane().add(container);
setTitle(title);
setBounds(200, 100, 660, 360);
setResizable(false);
UIManager.addPropertyChangeListener(new UISwitchListener(getRootPane()));
}
/**
*
*/
protected void buildMenu()
{
JMenuBar menuBar = new JMenuBar();
menuBar.add(buildFileMenu());
menuBar.add(buildEditMenu());
menuBar.add(buildPreprocessMenu());
menuBar.add(buildStreamMenu());
setJMenuBar(menuBar);
}
/**
*
*/
protected JMenu buildFileMenu()
{
JMenu menu = new JMenu();
CommonGui.localize(menu, "Common.File");
menu.addSeparator();
JMenuItem close = new JMenuItem();
CommonGui.localize(close, "Common.Close");
close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK));
close.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
close();
}
});
JMenuItem item_2 = new JMenuItem(Resource.getString("popup.rename"));
item_2.setActionCommand("rename");
JMenuItem item_3 = new JMenuItem(Resource.getString("popup.openhex"));
item_3.setActionCommand("viewAsHex");
menu.add(item_2);
menu.addSeparator();
menu.add(item_3);
menu.addSeparator();
menu.add(close);
item_2.addActionListener(_MenuListener);
item_3.addActionListener(_MenuListener);
return menu;
}
/**
*
*/
protected JMenu buildEditMenu()
{
JMenu menu = new JMenu();
CommonGui.localize(menu, "Common.Edit");
JMenuItem item_1 = new JMenuItem(Resource.getString("popup.changeTimestamp"));
item_1.setActionCommand("changeTimestamp");
JMenuItem item_2 = new JMenuItem(Resource.getString("popup.patchbasics"));
item_2.setActionCommand("editBasics");
menu.add(item_1);
menu.addSeparator();
menu.add(item_2);
item_1.addActionListener(_MenuListener);
item_2.addActionListener(_MenuListener);
return menu;
}
/**
*
*/
protected JMenu buildPreprocessMenu()
{
JMenu menu = new JMenu();
CommonGui.localize(menu, "Common.Preprocess");
JMenuItem item_1 = new JMenuItem(Resource.getString("popup.fixHpAc3"));
item_1.setActionCommand("fixHpAc3");
JMenuItem item_2 = new JMenuItem(Resource.getString("popup.stripAudio"));
item_2.setActionCommand("stripAudio");
JMenuItem item_3 = new JMenuItem("strip Relook� type 0 to separate pes..");
item_3.setActionCommand("stripRelook");
JMenuItem item_4 = new JMenuItem("strip Relook� type 1 to separate pes..");
item_4.setActionCommand("stripRelook1");
JMenuItem item_5 = new JMenuItem("strip Medion� to separate pes..");
item_5.setActionCommand("stripMedion");
menu.add(item_1);
menu.addSeparator();
menu.add(item_2);
menu.addSeparator();
menu.add(item_3);
menu.add(item_4);
menu.addSeparator();
menu.add(item_5);
item_1.addActionListener(_MenuListener);
item_2.addActionListener(_MenuListener);
item_3.addActionListener(_MenuListener);
item_4.addActionListener(_MenuListener);
item_5.addActionListener(_MenuListener);
return menu;
}
/**
*
*/
protected JMenu buildStreamMenu()
{
JMenu menu = new JMenu(Resource.getString("popup.assignStreamType"));
Object[] objects = Keys.ITEMS_FileTypes;
for (int i = 0; i <= objects.length; i++)
{
JMenuItem item = new JMenuItem(i == objects.length ? Resource.getString("popup.automatic") : objects[i].toString());
item.setActionCommand("assignStreamtype");
item.addActionListener(_MenuListener);
if (i == objects.length)
menu.addSeparator();
menu.add(item);
}
return menu;
}
/**
*
*/
protected JPanel buildMainPanel()
{
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
JPanel panel_1 = new JPanel();
panel_1.setLayout( new ColumnLayout() );
panel_1.setBorder( BorderFactory.createTitledBorder("Preview") );
panel_1.add(view = new View());
panel_1.add(Box.createRigidArea(new Dimension(1, 5)));
slider = new JSlider();
slider.setPreferredSize(new Dimension(160, 30));
slider.setMaximumSize(new Dimension(160, 30));
slider.setMinimumSize(new Dimension(160, 30));
slider.setMaximum(100);
slider.setValue(0);
slider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e)
{
if (!silent)
scanFile(32L * slider.getValue());
}
});
panel_1.add(slider);
panel_1.add(Box.createRigidArea(new Dimension(1, 5)));
length = new JLabel("ScanPos: ");
panel_1.add(length);
//file info
JPanel panel_2 = new JPanel();
panel_2.setLayout( new ColumnLayout() );
panel_2.setBorder( BorderFactory.createTitledBorder("File Info") );
area = new JTextArea();
area.setEditable(true);
JScrollPane scroll = new JScrollPane();
scroll.setPreferredSize(new Dimension(460, 280));
scroll.setMaximumSize(new Dimension(460, 280));
scroll.setMinimumSize(new Dimension(460, 280));
scroll.setViewportView(area);
JViewport viewport = scroll.getViewport();
panel_2.add(scroll);
panel.add(panel_1);
panel.add(panel_2);
return panel;
}
/**
*
*/
public void close()
{
inputfile = null;
Common.getGuiInterface().showActiveCollection(collection_number);
dispose();
}
/**
*
*/
public void open(XInputFile xInputFile, int value_1, int value_2)
{
collection_number = value_1;
collection_index = value_2;
inputfile = xInputFile;
silent = true;
slider.setMaximum((int)(inputfile.length() / 32L));
silent = false;
tmp_value = (int)(inputfile.getStreamInfo().getScanPosition() / 32L);
if (tmp_value != slider.getValue())
slider.setValue(tmp_value);
else
scanFile();
show();
}
/**
*
*/
private void setPanelTitle()
{
setTitle(title + ": ID " + inputfile.getFileID() + " - '" + inputfile.getName() + "'");
}
/**
*
*/
private void scanFile()
{
setPanelTitle();
scanFile(inputfile.getStreamInfo().getScanPosition());
}
/**
*
*/
private void scanFile(long value)
{
setPosInfo(value);
Common.getScanClass().getStreamInfo(inputfile, value);
setFileInfo();
previewFile(value);
}
/**
*
*/
private void scanSpecFileType(int type)
{
long value = inputfile.getStreamInfo().getScanPosition();
setPosInfo(value);
Common.getScanClass().getStreamInfo(inputfile, value, type);
setFileInfo();
previewFile(value);
}
/**
*
*/
private void setPosInfo(long value)
{
inputfile.getStreamInfo().setScanPosition(value);
length.setText("ScanPos: " + Common.formatNumber(value));
}
/**
*
*/
private void setFileInfo()
{
area.setText(inputfile.getStreamInfo().getFullInfo());
}
/**
*
*/
private void previewFile(long value)
{
switch (inputfile.getStreamInfo().getStreamType())
{
case CommonParsing.PES_AV_TYPE:
case CommonParsing.MPEG1PS_TYPE:
case CommonParsing.MPEG2PS_TYPE:
case CommonParsing.PVA_TYPE:
case CommonParsing.TS_TYPE:
case CommonParsing.ES_MPV_TYPE:
long position = Preview.previewFile(inputfile, value, loadSizeForward, Common.getSettings().getBooleanProperty(Keys.KEY_Preview_AllGops), Common.getSettings().getBooleanProperty(Keys.KEY_Preview_fastDecode), Common.getSettings().getIntProperty(Keys.KEY_Preview_YGain));
view.setImage(Common.getMpvDecoderClass().getScaledCutImage());
break;
case CommonParsing.PES_MPA_TYPE:
case CommonParsing.PES_PS1_TYPE:
view.setImage("PES Audio");
break;
case CommonParsing.ES_MPA_TYPE:
case CommonParsing.ES_AC3_TYPE:
case CommonParsing.ES_AC3_A_TYPE:
case CommonParsing.ES_DTS_TYPE:
case CommonParsing.ES_DTS_A_TYPE:
case CommonParsing.ES_RIFF_TYPE:
case CommonParsing.ES_cRIFF_TYPE:
view.setImage("RAW Audio");
break;
case CommonParsing.ES_SUP_TYPE:
view.setImage("RAW Subpicture");
break;
case CommonParsing.Unsupported:
default:
view.setImage("Unknown");
break;
}
}
/**
*
*/
private ActionListener _MenuListener = new ActionListener() {
public void actionPerformed(ActionEvent e)
{
String actName = e.getActionCommand();
/**
*
*/
if (actName.equals("rename"))
{
try {
if (inputfile.rename())
{
scanFile();
Common.getGuiInterface().showActiveCollection(collection_number);
}
//if (((XInputFile) collection.getInputFile(index)).rename())
// reloadInputDirectories();
toFront();
} catch (IOException ioe) {}
//updateCollectionTable(collection.getCollectionAsTable());
//updateCollectionPanel(collection_number);
}
/**
*
*/
else if (actName.equals("changeTimestamp"))
{
if (CommonGui.getUserConfirmation("really update the timestamp of '" + inputfile.getName() + "' ?"))
{
inputfile.setLastModified();
scanFile();
Common.getGuiInterface().showActiveCollection(collection_number);
}
//updateCollectionTable(collection.getCollectionAsTable());
//updateCollectionPanel(collection_number);
toFront();
}
/**
*
*/
else if (actName.equals("viewAsHex"))
{
if (inputfile.exists())
new HexViewer().view(inputfile.getNewInstance());
}
/**
*
*/
else if (actName.equals("editBasics"))
{
if (CommonGui.getPatchDialog().entry(inputfile))
{
scanFile();
Common.getGuiInterface().showActiveCollection(collection_number);
// getScanInfo(xInputFile, xInputFile.getStreamInfo().getStreamType());
}
toFront();
}
/**
*
*/
else if (actName.equals("assignStreamtype"))
{
Object[] items = Keys.ITEMS_FileTypes;
String str = ((JMenuItem) e.getSource()).getText();
for (int i = 0; i < items.length; i++)
{
if (str.equals(items[i].toString()))
{
inputfile.getStreamInfo().setStreamType(i);
scanSpecFileType(i);
Common.getGuiInterface().showActiveCollection(collection_number);
return;
}
}
scanFile();
Common.getGuiInterface().showActiveCollection(collection_number);
}
/**
*
*/
else if (actName.equals("stripRelook"))
{
stripRelook(0);
}
/**
*
*/
else if (actName.equals("stripRelook1"))
{
stripRelook(1);
}
/**
*
*/
else if (actName.equals("stripMedion"))
{
stripMedion();
}
/**
*
*/
else if (actName.equals("stripAudio"))
{
if (inputfile.exists() && inputfile.getStreamInfo().getStreamType() == CommonParsing.ES_RIFF_TYPE && CommonGui.getUserConfirmation("really process '" + inputfile.getName() + "' ?"))
{
StripAudio stripAudio = new StripAudio();
Common.setOSDMessage("strip audio data...");
XInputFile xInputFile = stripAudio.process(inputfile);
JobCollection collection = Common.getCollection(collection_number);
if (xInputFile != null)
{
collection.removeInputFile(collection_index);
collection.addInputFile(collection_index, xInputFile);
Common.getGuiInterface().showActiveCollection(collection_number);
}
}
toFront();
}
}
/**
*
*/
private void stripRelook(int type)
{
if (inputfile.exists() && inputfile.getStreamInfo().getStreamType() == CommonParsing.PES_AV_TYPE && CommonGui.getUserConfirmation("really process '" + inputfile.getName() + "' ?"))
{
StripRelook stripRelook = new StripRelook(type);
Common.setOSDMessage("strip Relook� data, type " + type + "...");
JobCollection collection = Common.getCollection(collection_number);
XInputFile[] xif = stripRelook.process(inputfile.getNewInstance(), collection.getOutputDirectory());
if (xif != null)
{
collection.removeInputFile(collection_index);
for (int i = 0, j = collection_index; i < xif.length; i++)
{
if (xif[i] != null)
collection.addInputFile(j++, xif[i]);
}
Common.getGuiInterface().showActiveCollection(collection_number);
}
}
toFront();
}
/**
*
*/
private void stripMedion()
{
if (inputfile.exists() && inputfile.getStreamInfo().getStreamType() == CommonParsing.PES_AV_TYPE && CommonGui.getUserConfirmation("really process '" + inputfile.getName() + "' ?"))
{
StripMedion stripMedion = new StripMedion();
Common.setOSDMessage("strip Medion� data...");
JobCollection collection = Common.getCollection(collection_number);
XInputFile[] xif = stripMedion.process(inputfile.getNewInstance(), collection.getOutputDirectory());
if (xif != null)
{
collection.removeInputFile(collection_index);
for (int i = 0, j = collection_index; i < xif.length; i++)
{
if (xif[i] != null)
collection.addInputFile(j++, xif[i]);
}
Common.getGuiInterface().showActiveCollection(collection_number);
}
}
toFront();
}
};
/**
*
*/
private class View extends JPanel {
private int width = 160;
private int height = 90;
private Image image;
private MemoryImageSource source;
private int[] image_data;
private String alternative = "";
public View()
{
image_data = new int[width * height];
source = new MemoryImageSource(width, height, image_data, 0, width);
source.setAnimated(true);
image = createImage(source);
setPreferredSize(new Dimension(160, 90));
setMaximumSize(new Dimension(160, 90));
setMinimumSize(new Dimension(160, 90));
setBackground(Color.black);
}
public void setImage(int[] new_image_data)
{
alternative = "";
System.arraycopy(new_image_data, 0, image_data, 0, new_image_data.length);
inputfile.getStreamInfo().setThumbnail(image_data);
source.newPixels();
repaint();
}
public void setImage(String str)
{
alternative = str;
Arrays.fill(image_data, 0);
source.newPixels();
repaint();
}
public void paint(Graphics g)
{
g.setColor(bg_color);
g.fillRect(0, 0, 160, 90);
g.drawImage(image, 0, 0, this);
g.setColor(Color.white);
g.drawString(alternative, 10, 30);
}
}
}