/* * PS3 Media Server, for streaming any medias to your PS3. * Copyright (C) 2008 A.Brochard * * 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; version 2 * of the License only. * * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package net.pms.newgui; import com.jgoodies.forms.builder.PanelBuilder; import com.jgoodies.forms.factories.Borders; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; import com.sun.jna.Platform; import net.pms.Messages; import net.pms.PMS; import net.pms.configuration.PmsConfiguration; import net.pms.encoders.Player; import net.pms.encoders.PlayerFactory; import net.pms.encoders.PlayerPurpose; import net.pms.util.FormLayoutUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.swing.*; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; import java.awt.*; import java.awt.event.*; import java.util.ArrayList; import java.util.HashMap; import java.util.Locale; import java.util.Map; import static net.pms.encoders.PlayerPurpose.*; public class TranscodingTab { private static final Logger logger = LoggerFactory.getLogger(TranscodingTab.class); private static final String COMMON_COL_SPEC = "left:pref, 3dlu, pref:grow"; private static final String COMMON_ROW_SPEC = "4*(pref, 3dlu), pref, 9dlu, pref, 9dlu:grow, pref"; private static final String EMPTY_COL_SPEC = "left:pref, 3dlu, pref:grow"; private static final String EMPTY_ROW_SPEC = "p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p , 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 20dlu, p, 3dlu, p, 3dlu, p"; private static final String LEFT_COL_SPEC = "left:pref, pref, pref, pref, 0:grow"; private static final String LEFT_ROW_SPEC = "fill:10:grow, 3dlu, p, 3dlu, p, 3dlu, p"; private static final String MAIN_COL_SPEC = "left:pref, pref, 7dlu, pref, pref, fill:10:grow"; private static final String MAIN_ROW_SPEC = "fill:10:grow"; private final PmsConfiguration configuration; private ComponentOrientation orientation; TranscodingTab(PmsConfiguration configuration) { this.configuration = configuration; // Apply the orientation for the locale Locale locale = new Locale(configuration.getLanguage()); orientation = ComponentOrientation.getOrientation(locale); } private JCheckBox disableSubs; private JTextField forcetranscode; private JTextField notranscode; private JTextField maxbuffer; private JComboBox nbcores; private Map<PlayerPurpose, DefaultMutableTreeNode> engineTreeNodes; private JPanel tabbedPanel; private CardLayout cl; private JTextField abitrate; private JTree tree; private JCheckBox forcePCM; private JCheckBox forceDTSinPCM; private JComboBox channels; private JComboBox vq; private JCheckBox ac3remux; private JCheckBox mpeg2remux; private JCheckBox chapter_support; private JTextField chapter_interval; private JCheckBox videoHWacceleration; private JTextField langs; private JTextField defaultsubs; private JTextField forcedsub; private JTextField forcedtags; private JTextField alternateSubFolder; private JButton folderSelectButton; private JCheckBox subs; private JTextField defaultaudiosubs; private JComboBox subtitleCodePage; private JTextField defaultfont; private JButton fontselect; private JCheckBox fribidi; private JTextField ass_scale; private JTextField ass_outline; private JTextField ass_shadow; private JTextField ass_margin; private JButton subColor; /* * 16 cores is the maximum allowed by MEncoder as of MPlayer r34863. * Revisions before that allowed only 8. */ private static final int MAX_CORES = 16; private void updateEngineModel() { ArrayList<String> engines = new ArrayList<String>(); Object root = tree.getModel().getRoot(); for (int i = 0; i < tree.getModel().getChildCount(root); i++) { Object firstChild = tree.getModel().getChild(root, i); if (!tree.getModel().isLeaf(firstChild)) { for (int j = 0; j < tree.getModel().getChildCount(firstChild); j++) { Object secondChild = tree.getModel().getChild(firstChild, j); if (secondChild instanceof TreeNodeSettings) { TreeNodeSettings tns = (TreeNodeSettings) secondChild; if (tns.isEnable() && tns.getPlayer() != null) { engines.add(tns.getPlayer().id()); } } } } } configuration.setEnginesAsList(engines); } private void handleCardComponentChange(Component component) { tabbedPanel.setPreferredSize(component.getPreferredSize()); tabbedPanel.getParent().invalidate(); tabbedPanel.getParent().validate(); tabbedPanel.getParent().repaint(); } public JComponent build() { String colSpec = FormLayoutUtil.getColSpec(MAIN_COL_SPEC, orientation); FormLayout mainlayout = new FormLayout(colSpec, MAIN_ROW_SPEC); PanelBuilder builder = new PanelBuilder(mainlayout); builder.border(Borders.DLU4); builder.opaque(true); CellConstraints cc = new CellConstraints(); builder.add(buildRightTabbedPanel(), FormLayoutUtil.flip(cc.xyw(4, 1, 3), colSpec, orientation)); builder.add(buildLeft(), FormLayoutUtil.flip(cc.xy(2, 1), colSpec, orientation)); JPanel panel = builder.getPanel(); // Apply the orientation to the panel and all components in it panel.applyComponentOrientation(orientation); return panel; } private JComponent buildRightTabbedPanel() { cl = new CardLayout(); tabbedPanel = new JPanel(cl); tabbedPanel.setBorder(BorderFactory.createEmptyBorder()); JScrollPane scrollPane = new JScrollPane(tabbedPanel); scrollPane.setBorder(BorderFactory.createEmptyBorder()); return scrollPane; } public JComponent buildLeft() { String colSpec = FormLayoutUtil.getColSpec(LEFT_COL_SPEC, orientation); FormLayout layout = new FormLayout(colSpec, LEFT_ROW_SPEC); PanelBuilder builder = new PanelBuilder(layout); CellConstraints cc = new CellConstraints(); JButton but = new JButton(LooksFrame.readImageIcon("kdevelop_down-32.png")); but.setToolTipText(Messages.getString("TrTab2.6")); but.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { TreePath path = tree.getSelectionModel().getSelectionPath(); if (path != null && path.getLastPathComponent() instanceof TreeNodeSettings) { TreeNodeSettings node = ((TreeNodeSettings) path.getLastPathComponent()); if (node.getPlayer() != null) { DefaultTreeModel dtm = (DefaultTreeModel) tree.getModel(); // get the tree model //now get the index of the selected node in the DefaultTreeModel int index = dtm.getIndexOfChild(node.getParent(), node); // if selected node is first, return (can't move it up) if (index < node.getParent().getChildCount() - 1) { dtm.insertNodeInto(node, (DefaultMutableTreeNode) node.getParent(), index + 1); // move the node dtm.reload(); for (int i = 0; i < tree.getRowCount(); i++) { tree.expandRow(i); } tree.getSelectionModel().setSelectionPath(new TreePath(node.getPath())); updateEngineModel(); } } } } }); builder.add(but, FormLayoutUtil.flip(cc.xy(2, 3), colSpec, orientation)); JButton but2 = new JButton(LooksFrame.readImageIcon("up-32.png")); but2.setToolTipText(Messages.getString("TrTab2.6")); but2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { TreePath path = tree.getSelectionModel().getSelectionPath(); if (path != null && path.getLastPathComponent() instanceof TreeNodeSettings) { TreeNodeSettings node = ((TreeNodeSettings) path.getLastPathComponent()); if (node.getPlayer() != null) { DefaultTreeModel dtm = (DefaultTreeModel) tree.getModel(); // get the tree model //now get the index of the selected node in the DefaultTreeModel int index = dtm.getIndexOfChild(node.getParent(), node); // if selected node is first, return (can't move it up) if (index != 0) { dtm.insertNodeInto(node, (DefaultMutableTreeNode) node.getParent(), index - 1); // move the node dtm.reload(); for (int i = 0; i < tree.getRowCount(); i++) { tree.expandRow(i); } tree.getSelectionModel().setSelectionPath(new TreePath(node.getPath())); updateEngineModel(); } } } } }); builder.add(but2, FormLayoutUtil.flip(cc.xy(3, 3), colSpec, orientation)); JButton but3 = new JButton(LooksFrame.readImageIcon("connect_no-32.png")); but3.setToolTipText(Messages.getString("TrTab2.0")); but3.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { TreePath path = tree.getSelectionModel().getSelectionPath(); if (path != null && path.getLastPathComponent() instanceof TreeNodeSettings && ((TreeNodeSettings) path.getLastPathComponent()).getPlayer() != null) { ((TreeNodeSettings) path.getLastPathComponent()).setEnable(!((TreeNodeSettings) path.getLastPathComponent()).isEnable()); updateEngineModel(); tree.updateUI(); } } }); builder.add(but3, FormLayoutUtil.flip(cc.xy(4, 3), colSpec, orientation)); DefaultMutableTreeNode root = new DefaultMutableTreeNode(Messages.getString("TrTab2.11")); TreeNodeSettings commonEnc = new TreeNodeSettings(Messages.getString("TrTab2.5"), null, buildCommon()); commonEnc.getConfigPanel().addComponentListener(new ComponentAdapter() { @Override public void componentShown(ComponentEvent e) { handleCardComponentChange(e.getComponent()); } }); tabbedPanel.add(commonEnc.id(), commonEnc.getConfigPanel()); root.add(commonEnc); engineTreeNodes = new HashMap<PlayerPurpose, DefaultMutableTreeNode>(5); engineTreeNodes.put(VIDEO_FILE_PLAYER, new DefaultMutableTreeNode(Messages.getString("TrTab2.14"))); engineTreeNodes.put(AUDIO_FILE_PLAYER, new DefaultMutableTreeNode(Messages.getString("TrTab2.15"))); engineTreeNodes.put(VIDEO_WEB_STREAM_PLAYER, new DefaultMutableTreeNode(Messages.getString("TrTab2.16"))); engineTreeNodes.put(AUDIO_WEB_STREAM_PLAYER, new DefaultMutableTreeNode(Messages.getString("TrTab2.17"))); engineTreeNodes.put(MISC_PLAYER, new DefaultMutableTreeNode(Messages.getString("TrTab2.18"))); root.add(engineTreeNodes.get(VIDEO_FILE_PLAYER)); root.add(engineTreeNodes.get(AUDIO_FILE_PLAYER)); root.add(engineTreeNodes.get(VIDEO_WEB_STREAM_PLAYER)); root.add(engineTreeNodes.get(AUDIO_WEB_STREAM_PLAYER)); root.add(engineTreeNodes.get(MISC_PLAYER)); tree = new JTree(new DefaultTreeModel(root)) { private static final long serialVersionUID = -6703434752606636290L; }; tree.setRootVisible(false); tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); tree.addTreeSelectionListener(new TreeSelectionListener() { @Override public void valueChanged(TreeSelectionEvent e) { if (e.getNewLeadSelectionPath() != null && e.getNewLeadSelectionPath().getLastPathComponent() instanceof TreeNodeSettings) { TreeNodeSettings tns = (TreeNodeSettings) e.getNewLeadSelectionPath().getLastPathComponent(); cl.show(tabbedPanel, tns.id()); } } }); tree.setRequestFocusEnabled(false); tree.setCellRenderer(new TreeRenderer()); JScrollPane pane = new JScrollPane(tree, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); builder.add(pane, FormLayoutUtil.flip(cc.xyw(2, 1, 4), colSpec, orientation)); builder.addLabel(Messages.getString("TrTab2.19"), FormLayoutUtil.flip(cc.xyw(2, 5, 4), colSpec, orientation)); builder.addLabel(Messages.getString("TrTab2.20"), FormLayoutUtil.flip(cc.xyw(2, 7, 4), colSpec, orientation)); JPanel panel = builder.getPanel(); // Apply the orientation to the panel and all components in it panel.applyComponentOrientation(orientation); return panel; } public void addEngines() { ArrayList<Player> disPlayers = new ArrayList<Player>(); ArrayList<Player> ordPlayers = new ArrayList<Player>(); for (String id : configuration.getEnginesAsList()) { // boolean matched = false; for (Player p : PlayerFactory.getAllPlayers()) { if (p.id().equals(id)) { ordPlayers.add(p); if (p.isVideoHardwareAccelerationReady()) { videoHWacceleration.setEnabled(true); videoHWacceleration.setSelected(configuration.isVideoHardwareAcceleration()); } // matched = true; } } } for (Player p : PlayerFactory.getAllPlayers()) { if (!ordPlayers.contains(p)) { ordPlayers.add(p); disPlayers.add(p); } } for (Player p : ordPlayers) { TreeNodeSettings engine = new TreeNodeSettings(p.name(), p, null); if (disPlayers.contains(p)) { engine.setEnable(false); } JComponent jc = engine.getConfigPanel(); if (jc == null) { jc = buildEmpty(); } jc.addComponentListener(new ComponentAdapter() { @Override public void componentShown(ComponentEvent e) { handleCardComponentChange(e.getComponent()); } }); tabbedPanel.add(engine.id(), jc); engineTreeNodes.get(p.getPurpose()).add(engine); } for (int i = 0; i < tree.getRowCount(); i++) { tree.expandRow(i); } tree.setSelectionRow(0); } public JComponent buildEmpty() { String colSpec = FormLayoutUtil.getColSpec(EMPTY_COL_SPEC, orientation); FormLayout layout = new FormLayout(colSpec, EMPTY_ROW_SPEC); PanelBuilder builder = new PanelBuilder(layout); CellConstraints cc = new CellConstraints(); builder.addSeparator(Messages.getString("TrTab2.1"), FormLayoutUtil.flip(cc.xyw(1, 1, 3), colSpec, orientation)); JPanel panel = builder.getPanel(); // Apply the orientation to the panel and all components in it panel.applyComponentOrientation(orientation); return panel; } public JComponent buildCommon() { String colSpec = FormLayoutUtil.getColSpec(COMMON_COL_SPEC, orientation); FormLayout layout = new FormLayout(colSpec, COMMON_ROW_SPEC); PanelBuilder builder = new PanelBuilder(layout); CellConstraints cc = new CellConstraints(); JComponent cmp = builder.addSeparator(Messages.getString("NetworkTab.5"), FormLayoutUtil.flip(cc.xyw(1, 1, 3), colSpec, orientation)); cmp = (JComponent) cmp.getComponent(0); cmp.setFont(cmp.getFont().deriveFont(Font.BOLD)); disableSubs = new JCheckBox(Messages.getString("TrTab2.51"),configuration.isDisableSubtitles()); disableSubs.setContentAreaFilled(false); disableSubs.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { configuration.setDisableSubtitles((e.getStateChange() == ItemEvent.SELECTED)); } }); builder.addLabel(Messages.getString("TrTab2.23"), FormLayoutUtil.flip(cc.xy(1, 3), colSpec, orientation)); maxbuffer = new JTextField("" + configuration.getMaxMemoryBufferSize()); maxbuffer.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { try { int ab = Integer.parseInt(maxbuffer.getText()); configuration.setMaxMemoryBufferSize(ab); } catch (NumberFormatException nfe) { logger.debug("Could not parse max memory buffer size from \"" + maxbuffer.getText() + "\""); } } }); builder.add(maxbuffer, FormLayoutUtil.flip(cc.xy(3, 3), colSpec, orientation)); String nCpusLabel = String.format(Messages.getString("TrTab2.24"), Runtime.getRuntime().availableProcessors()); builder.addLabel(nCpusLabel, FormLayoutUtil.flip(cc.xy(1, 5), colSpec, orientation)); String[] guiCores = new String[MAX_CORES]; for (int i = 0; i < MAX_CORES; i++) { guiCores[i] = Integer.toString(i + 1); } nbcores = new JComboBox(guiCores); nbcores.setEditable(false); int nbConfCores = configuration.getNumberOfCpuCores(); if (nbConfCores > 0 && nbConfCores <= MAX_CORES) { nbcores.setSelectedItem(Integer.toString(nbConfCores)); } else { nbcores.setSelectedIndex(0); } nbcores.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { configuration.setNumberOfCpuCores(Integer.parseInt(e.getItem().toString())); } }); builder.add(nbcores, FormLayoutUtil.flip(cc.xy(3, 5), colSpec, orientation)); chapter_support = new JCheckBox(Messages.getString("TrTab2.52"), configuration.isChapterSupport()); chapter_support.setContentAreaFilled(false); chapter_support.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { configuration.setChapterSupport((e.getStateChange() == ItemEvent.SELECTED)); chapter_interval.setEnabled(configuration.isChapterSupport()); } }); builder.add(chapter_support, FormLayoutUtil.flip(cc.xy(1, 7), colSpec, orientation)); chapter_interval = new JTextField("" + configuration.getChapterInterval()); chapter_interval.setEnabled(configuration.isChapterSupport()); chapter_interval.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { try { int ab = Integer.parseInt(chapter_interval.getText()); configuration.setChapterInterval(ab); } catch (NumberFormatException nfe) { logger.debug("Could not parse chapter interval from \"" + chapter_interval.getText() + "\""); } } }); builder.add(chapter_interval, FormLayoutUtil.flip(cc.xy(3, 7), colSpec, orientation)); builder.add(disableSubs, FormLayoutUtil.flip(cc.xy(1, 9), colSpec, orientation)); JTabbedPane setupTabbedPanel = new JTabbedPane(); setupTabbedPanel.addTab(Messages.getString("TrTab2.67"), buildVideoSetupPanel()); setupTabbedPanel.addTab(Messages.getString("TrTab2.68"), buildAudioSetupPanel()); setupTabbedPanel.addTab(Messages.getString("MEncoderVideo.8"), buildSubtitlesSetupPanel()); builder.add(setupTabbedPanel, FormLayoutUtil.flip(cc.xywh(1, 11, 3, 3), colSpec, orientation)); JPanel panel = builder.getPanel(); panel.applyComponentOrientation(orientation); return panel; } private JComponent buildVideoSetupPanel() { String colSpec = FormLayoutUtil.getColSpec("left:pref, 2dlu, pref:grow", orientation); FormLayout layout = new FormLayout(colSpec, "$lgap, 2*(pref, 2dlu), 10dlu, 10dlu, 3*(pref, 2dlu), pref"); PanelBuilder builder = new PanelBuilder(layout); builder.border(Borders.DLU4); CellConstraints cc = new CellConstraints(); videoHWacceleration = new JCheckBox(Messages.getString("TrTab2.70"), configuration.isVideoHardwareAcceleration()); videoHWacceleration.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { configuration.setVideoHardwareAcceleration((e.getStateChange() == ItemEvent.SELECTED)); } }); builder.add(videoHWacceleration, FormLayoutUtil.flip(cc.xy(1, 2), colSpec, orientation)); videoHWacceleration.setEnabled(false); mpeg2remux = new JCheckBox(Messages.getString("MEncoderVideo.39") + (Platform.isWindows() ? " " + Messages.getString("TrTab2.21") : ""), configuration.isMencoderRemuxMPEG2()); mpeg2remux.setContentAreaFilled(false); mpeg2remux.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { configuration.setMencoderRemuxMPEG2((e.getStateChange() == ItemEvent.SELECTED)); } }); builder.add(mpeg2remux, FormLayoutUtil.flip(cc.xyw(1, 6, 3), colSpec, orientation)); JComponent cmp = builder.addSeparator(Messages.getString("TrTab2.7"), FormLayoutUtil.flip(cc.xyw(1, 8, 3), colSpec, orientation)); cmp = (JComponent) cmp.getComponent(0); cmp.setFont(cmp.getFont().deriveFont(Font.BOLD)); builder.add(new JLabel(Messages.getString("TrTab2.32")), FormLayoutUtil.flip(cc.xy(1, 10), colSpec, orientation)); Object data[] = new Object[] { configuration.getMPEG2MainSettings(), /* current setting */ String.format("Automatic (Wired) /* %s */", Messages.getString("TrTab2.71")), String.format("Automatic (Wireless) /* %s */", Messages.getString("TrTab2.72")), String.format("keyint=5:vqscale=1:vqmin=2 /* %s */", Messages.getString("TrTab2.60")), /* great */ String.format("keyint=5:vqscale=1:vqmin=1 /* %s */", Messages.getString("TrTab2.61")), /* lossless */ String.format("keyint=5:vqscale=2:vqmin=3 /* %s */", Messages.getString("TrTab2.62")), /* good (wired) */ String.format("keyint=25:vqmax=5:vqmin=2 /* %s */", Messages.getString("TrTab2.63")), /* good (wireless) */ String.format("keyint=25:vqmax=7:vqmin=2 /* %s */", Messages.getString("TrTab2.64")), /* medium (wireless) */ String.format("keyint=25:vqmax=8:vqmin=3 /* %s */", Messages.getString("TrTab2.65")) /* low */ }; MyComboBoxModel cbm = new MyComboBoxModel(data); vq = new JComboBox(cbm); vq.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { String s = (String) e.getItem(); if (s.indexOf("/*") > -1) { s = s.substring(0, s.indexOf("/*")).trim(); } configuration.setMPEG2MainSettings(s); } } }); vq.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { vq.getItemListeners()[0].itemStateChanged(new ItemEvent(vq, 0, vq.getEditor().getItem(), ItemEvent.SELECTED)); } }); vq.setEditable(true); builder.add(vq, FormLayoutUtil.flip(cc.xy(3, 10), colSpec, orientation)); builder.add(new JLabel(Messages.getString("TrTab2.8")), FormLayoutUtil.flip(cc.xy(1, 12), colSpec, orientation)); notranscode = new JTextField(configuration.getDisableTranscodeForExtensions()); notranscode.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { configuration.setDisableTranscodeForExtensions(notranscode.getText()); } }); builder.add(notranscode, FormLayoutUtil.flip(cc.xy(3, 12), colSpec, orientation)); builder.addLabel(Messages.getString("TrTab2.9"), FormLayoutUtil.flip(cc.xy(1, 14), colSpec, orientation)); forcetranscode = new JTextField(configuration.getForceTranscodeForExtensions()); forcetranscode.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { configuration.setForceTranscodeForEtensions(forcetranscode.getText()); } }); builder.add(forcetranscode, FormLayoutUtil.flip(cc.xy(3, 14), colSpec, orientation)); JPanel panel = builder.getPanel(); panel.applyComponentOrientation(orientation); return panel; } private JComponent buildAudioSetupPanel() { String colSpec = FormLayoutUtil.getColSpec("left:pref, 2dlu, pref:grow", orientation); FormLayout layout = new FormLayout(colSpec, "$lgap, pref, 2dlu, 4*(pref, 2dlu), pref, 12dlu, 3*(pref, 2dlu), pref:grow"); PanelBuilder builder = new PanelBuilder(layout); builder.border(Borders.DLU4); CellConstraints cc = new CellConstraints(); builder.addLabel(Messages.getString("TrTab2.50"), FormLayoutUtil.flip(cc.xy(1, 2), colSpec, orientation)); channels = new JComboBox(new Object[]{Messages.getString("TrTab2.55"), Messages.getString("TrTab2.56") /*, "8 channels 7.1" */}); // 7.1 not supported by Mplayer :\ channels.setEditable(false); if (configuration.getAudioChannelCount() == 2) { channels.setSelectedIndex(0); } else { channels.setSelectedIndex(1); } channels.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { configuration.setAudioChannelCount(Integer.parseInt(e.getItem().toString().substring(0, 1))); } }); builder.add(channels, FormLayoutUtil.flip(cc.xy(3, 2), colSpec, orientation)); forcePCM = new JCheckBox(Messages.getString("TrTab2.27"), configuration.isAudioUsePCM()); forcePCM.setContentAreaFilled(false); forcePCM.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { configuration.setAudioUsePCM(e.getStateChange() == ItemEvent.SELECTED); } }); builder.add(forcePCM, FormLayoutUtil.flip(cc.xy(1, 4), colSpec, orientation)); ac3remux = new JCheckBox(Messages.getString("TrTab2.26") + " " + (Platform.isWindows() ? Messages.getString("TrTab2.21") : "")); if (configuration.isAudioRemuxAC3()) { ac3remux.setSelected(true); } ac3remux.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { configuration.setAudioRemuxAC3((e.getStateChange() == ItemEvent.SELECTED)); } }); builder.add(ac3remux, FormLayoutUtil.flip(cc.xyw(1, 6, 3), colSpec, orientation)); forceDTSinPCM = new JCheckBox(Messages.getString("TrTab2.28") + (Platform.isWindows() ? " " + Messages.getString("TrTab2.21") : ""), configuration.isAudioEmbedDtsInPcm()); forceDTSinPCM.setContentAreaFilled(false); forceDTSinPCM.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { configuration.setAudioEmbedDtsInPcm(forceDTSinPCM.isSelected()); if (configuration.isAudioEmbedDtsInPcm()) { JOptionPane.showMessageDialog( (JFrame) (SwingUtilities.getWindowAncestor((Component) PMS.get().getFrame())), Messages.getString("TrTab2.10"), Messages.getString("Dialog.Information"), JOptionPane.INFORMATION_MESSAGE); } } }); builder.add(forceDTSinPCM, FormLayoutUtil.flip(cc.xyw(1, 8, 3), colSpec, orientation)); builder.addLabel(Messages.getString("TrTab2.29"), FormLayoutUtil.flip(cc.xy(1, 10), colSpec, orientation)); abitrate = new JTextField("" + configuration.getAudioBitrate()); abitrate.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { try { int ab = Integer.parseInt(abitrate.getText()); configuration.setAudioBitrate(ab); } catch (NumberFormatException nfe) { logger.debug("Could not parse audio bitrate from \"" + abitrate.getText() + "\""); } } }); builder.add(abitrate, FormLayoutUtil.flip(cc.xy(3, 10), colSpec, orientation)); builder.addLabel(Messages.getString("MEncoderVideo.7"), FormLayoutUtil.flip(cc.xy(1, 12), colSpec, orientation)); langs = new JTextField(configuration.getAudioLanguages()); langs.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { configuration.setAudioLanguages(langs.getText()); } }); builder.add(langs, FormLayoutUtil.flip(cc.xy(3, 12), colSpec, orientation)); JPanel panel = builder.getPanel(); panel.applyComponentOrientation(orientation); return panel; } private JComponent buildSubtitlesSetupPanel() { String colSpec = FormLayoutUtil.getColSpec("left:pref, 3dlu, p:grow, 3dlu, right:p:grow, 3dlu, p:grow, 3dlu, right:p:grow,3dlu, p:grow, 3dlu, right:p:grow,3dlu, pref:grow", orientation); FormLayout layout = new FormLayout(colSpec, "$lgap, 7*(pref, 3dlu), pref"); final PanelBuilder builder = new PanelBuilder(layout); builder.border(Borders.DLU4); CellConstraints cc = new CellConstraints(); builder.addLabel(Messages.getString("MEncoderVideo.9"), FormLayoutUtil.flip(cc.xy(1, 2), colSpec, orientation)); defaultsubs = new JTextField(configuration.getSubtitlesLanguages()); defaultsubs.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { configuration.setSubtitlesLanguages(defaultsubs.getText()); } }); builder.add(defaultsubs, FormLayoutUtil.flip(cc.xyw(3, 2, 5), colSpec, orientation)); builder.addLabel(Messages.getString("MEncoderVideo.94"), FormLayoutUtil.flip(cc.xyw(8, 2, 2, CellConstraints.RIGHT, CellConstraints.CENTER), colSpec, orientation)); forcedsub = new JTextField(configuration.getForcedSubtitleLanguage()); forcedsub.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { configuration.setForcedSubtitleLanguage(forcedsub.getText()); } }); builder.add(forcedsub, FormLayoutUtil.flip(cc.xyw(11, 2, 2), colSpec, orientation)); builder.addLabel(Messages.getString("MEncoderVideo.95"), FormLayoutUtil.flip(cc.xyw(12, 2, 2, CellConstraints.RIGHT, CellConstraints.CENTER), colSpec, orientation)); forcedtags = new JTextField(configuration.getForcedSubtitleTags()); forcedtags.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { configuration.setForcedSubtitleTags(forcedtags.getText()); } }); builder.add(forcedtags, FormLayoutUtil.flip(cc.xyw(14, 2, 2), colSpec, orientation)); builder.addLabel(Messages.getString("MEncoderVideo.10"), FormLayoutUtil.flip(cc.xy(1, 4), colSpec, orientation)); defaultaudiosubs = new JTextField(configuration.getAudioSubLanguages()); defaultaudiosubs.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { configuration.setAudioSubLanguages(defaultaudiosubs.getText()); } }); builder.add(defaultaudiosubs, FormLayoutUtil.flip(cc.xyw(3, 4, 8), colSpec, orientation)); builder.addLabel(Messages.getString("MEncoderVideo.37"), FormLayoutUtil.flip(cc.xyw(1, 6, 2), colSpec, orientation)); alternateSubFolder = new JTextField(configuration.getAlternateSubtitlesFolder()); alternateSubFolder.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { configuration.setAlternateSubtitlesFolder(alternateSubFolder.getText()); } }); builder.add(alternateSubFolder, FormLayoutUtil.flip(cc.xyw(3, 6, 8), colSpec, orientation)); folderSelectButton = new JButton("..."); folderSelectButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JFileChooser chooser; try { chooser = new JFileChooser(); } catch (Exception ee) { chooser = new JFileChooser(new RestrictedFileSystemView()); } chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); int returnVal = chooser.showDialog((Component) e.getSource(), Messages.getString("FoldTab.28")); if (returnVal == JFileChooser.APPROVE_OPTION) { alternateSubFolder.setText(chooser.getSelectedFile().getAbsolutePath()); configuration.setAlternateSubtitlesFolder(chooser.getSelectedFile().getAbsolutePath()); } } }); builder.add(folderSelectButton, FormLayoutUtil.flip(cc.xyw(11, 6, 2), colSpec, orientation)); builder.addLabel(Messages.getString("MEncoderVideo.11"), FormLayoutUtil.flip(cc.xy(1, 8), colSpec, orientation)); Object data[] = new Object[]{ configuration.getSubtitlesCodepage(), Messages.getString("MEncoderVideo.96"), Messages.getString("MEncoderVideo.97"), Messages.getString("MEncoderVideo.98"), Messages.getString("MEncoderVideo.99"), Messages.getString("MEncoderVideo.100"), Messages.getString("MEncoderVideo.101"), Messages.getString("MEncoderVideo.102"), Messages.getString("MEncoderVideo.103"), Messages.getString("MEncoderVideo.104"), Messages.getString("MEncoderVideo.105"), Messages.getString("MEncoderVideo.106"), Messages.getString("MEncoderVideo.107"), Messages.getString("MEncoderVideo.108"), Messages.getString("MEncoderVideo.109"), Messages.getString("MEncoderVideo.110"), Messages.getString("MEncoderVideo.111"), Messages.getString("MEncoderVideo.112"), Messages.getString("MEncoderVideo.113"), Messages.getString("MEncoderVideo.114"), Messages.getString("MEncoderVideo.115"), Messages.getString("MEncoderVideo.116"), Messages.getString("MEncoderVideo.117"), Messages.getString("MEncoderVideo.118"), Messages.getString("MEncoderVideo.119"), Messages.getString("MEncoderVideo.120"), Messages.getString("MEncoderVideo.121"), Messages.getString("MEncoderVideo.122"), Messages.getString("MEncoderVideo.123"), Messages.getString("MEncoderVideo.124") }; MyComboBoxModel cbm = new MyComboBoxModel(data); subtitleCodePage = new JComboBox(cbm); subtitleCodePage.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { String s = (String) e.getItem(); int offset = s.indexOf("/*"); if (offset > -1) { s = s.substring(0, offset).trim(); } configuration.setSubtitlesCodepage(s); } } }); subtitleCodePage.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { subtitleCodePage.getItemListeners()[0].itemStateChanged(new ItemEvent(subtitleCodePage, 0, subtitleCodePage.getEditor().getItem(), ItemEvent.SELECTED)); } }); subtitleCodePage.setEditable(true); builder.add(subtitleCodePage, FormLayoutUtil.flip(cc.xyw(3, 8, 7), colSpec, orientation)); fribidi = new JCheckBox(Messages.getString("MEncoderVideo.23")); fribidi.setContentAreaFilled(false); if (configuration.isMencoderSubFribidi()) { fribidi.setSelected(true); } fribidi.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { configuration.setMencoderSubFribidi(e.getStateChange() == ItemEvent.SELECTED); } }); builder.add(fribidi, FormLayoutUtil.flip(cc.xyw(11, 8, 4), colSpec, orientation)); builder.addLabel(Messages.getString("MEncoderVideo.24"), FormLayoutUtil.flip(cc.xy(1, 10), colSpec, orientation)); defaultfont = new JTextField(configuration.getFont()); defaultfont.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { configuration.setFont(defaultfont.getText()); } }); builder.add(defaultfont, FormLayoutUtil.flip(cc.xyw(3, 10, 8), colSpec, orientation)); fontselect = new JButton("..."); fontselect.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JFileChooser chooser = new JFileChooser(); chooser.setFileFilter(new FontFileFilter()); int returnVal = chooser.showDialog((Component) e.getSource(), Messages.getString("MEncoderVideo.25")); if (returnVal == JFileChooser.APPROVE_OPTION) { defaultfont.setText(chooser.getSelectedFile().getAbsolutePath()); configuration.setFont(chooser.getSelectedFile().getAbsolutePath()); } } }); builder.add(fontselect, FormLayoutUtil.flip(cc.xyw(11, 10, 2), colSpec, orientation)); builder.addLabel(Messages.getString("MEncoderVideo.12"), FormLayoutUtil.flip(cc.xy(1, 12), colSpec, orientation)); builder.addLabel(Messages.getString("MEncoderVideo.133"), FormLayoutUtil.flip(cc.xy(1, 14), colSpec, orientation)); ass_scale = new JTextField(configuration.getAssScale()); ass_scale.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { configuration.setAssScale(ass_scale.getText()); } }); builder.addLabel(Messages.getString("MEncoderVideo.13"), FormLayoutUtil.flip(cc.xy(5, 12), colSpec, orientation)); ass_outline = new JTextField(configuration.getAssOutline()); ass_outline.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { configuration.setAssOutline(ass_outline.getText()); } }); builder.addLabel(Messages.getString("MEncoderVideo.14"), FormLayoutUtil.flip(cc.xy(9, 12), colSpec, orientation)); ass_shadow = new JTextField(configuration.getAssShadow()); ass_shadow.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { configuration.setAssShadow(ass_shadow.getText()); } }); builder.addLabel(Messages.getString("MEncoderVideo.15"), FormLayoutUtil.flip(cc.xy(13, 12), colSpec, orientation)); ass_margin = new JTextField(configuration.getAssMargin()); ass_margin.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { configuration.setAssMargin(ass_margin.getText()); } }); builder.add(ass_scale, FormLayoutUtil.flip(cc.xy(3, 12), colSpec, orientation)); builder.add(ass_outline, FormLayoutUtil.flip(cc.xy(7, 12), colSpec, orientation)); builder.add(ass_shadow, FormLayoutUtil.flip(cc.xy(11, 12), colSpec, orientation)); builder.add(ass_margin, FormLayoutUtil.flip(cc.xy(15, 12), colSpec, orientation)); subs = new JCheckBox(Messages.getString("MEncoderVideo.22"), configuration.isAutoloadExternalSubtitles()); subs.setContentAreaFilled(false); subs.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { configuration.setAutoloadExternalSubtitles((e.getStateChange() == ItemEvent.SELECTED)); } }); builder.add(subs, FormLayoutUtil.flip(cc.xyw(1, 16, 13), colSpec, orientation)); subColor = new JButton(); subColor.setText(Messages.getString("MEncoderVideo.31")); subColor.setBackground(new Color(configuration.getSubsColor())); subColor.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Color newColor = JColorChooser.showDialog( SwingUtilities.getWindowAncestor((Component) PMS.get().getFrame()), Messages.getString("MEncoderVideo.125"), subColor.getBackground() ); if (newColor != null) { subColor.setBackground(newColor); configuration.setSubsColor(newColor.getRGB()); } } }); builder.add(subColor, FormLayoutUtil.flip(cc.xyw(13, 16, 3), colSpec, orientation)); final JPanel panel = builder.getPanel(); boolean enable = !configuration.isDisableSubtitles(); for (Component component : panel.getComponents()) { component.setEnabled(enable); } disableSubs.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { // If "Disable Subtitles" is not selected, subtitles are enabled boolean enabled = e.getStateChange() != ItemEvent.SELECTED; for (Component component : panel.getComponents()) { component.setEnabled(enabled); } } }); panel.applyComponentOrientation(orientation); return panel; } }