/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.java.sip.communicator.impl.neomedia.codec.video.h264; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import net.java.sip.communicator.impl.neomedia.*; import net.java.sip.communicator.plugin.desktoputil.*; import org.jitsi.impl.neomedia.codec.video.h264.*; import org.jitsi.service.configuration.*; import org.jitsi.service.neomedia.control.*; import org.jitsi.service.resources.*; /** * Implements the H.264 configuration form/panel. * * @author Lyubomir Marinov * @author Damian Minkov */ public class ConfigurationPanel extends TransparentPanel { /** * Serial version UID. */ private final static long serialVersionUID = 0L; /** * Initializer a new <tt>ConfigurationPanel</tt> instance. */ public ConfigurationPanel() { // Create the UI components. super(new BorderLayout()); TransparentPanel contentPanel = new TransparentPanel(new GridBagLayout()); add(contentPanel, BorderLayout.NORTH); ResourceManagementService r = NeomediaActivator.getResources(); GridBagConstraints cnstrnts = new GridBagConstraints(); cnstrnts.anchor = GridBagConstraints.FIRST_LINE_START; cnstrnts.fill = GridBagConstraints.HORIZONTAL; Component defaultProfileLabel = createLineWrapLabel( r.getI18NString( "impl.neomedia.configform.H264.defaultProfile")); cnstrnts.gridx = 0; cnstrnts.gridy = 0; cnstrnts.weightx = 1; contentPanel.add(defaultProfileLabel, cnstrnts); JComboBox defaultProfileComboBox = new JComboBox(); defaultProfileComboBox.setEditable(false); defaultProfileComboBox.addItem( new NameValuePair( r.getI18NString( "impl.neomedia.configform.H264.defaultProfile." + JNIEncoder.BASELINE_PROFILE), JNIEncoder.BASELINE_PROFILE)); defaultProfileComboBox.addItem( new NameValuePair( r.getI18NString( "impl.neomedia.configform.H264.defaultProfile." + JNIEncoder.MAIN_PROFILE), JNIEncoder.MAIN_PROFILE)); defaultProfileComboBox.addItem( new NameValuePair( r.getI18NString( "impl.neomedia.configform.H264.defaultProfile." + JNIEncoder.HIGH_PROFILE), JNIEncoder.HIGH_PROFILE)); cnstrnts.gridx = 1; cnstrnts.gridy = 0; cnstrnts.weightx = 0; contentPanel.add(defaultProfileComboBox, cnstrnts); Component preferredKeyFrameRequesterLabel = createLineWrapLabel( r.getI18NString( "impl.neomedia.configform.H264" + ".preferredKeyFrameRequester")); cnstrnts.gridx = 0; cnstrnts.gridy = 1; cnstrnts.weightx = 1; contentPanel.add(preferredKeyFrameRequesterLabel, cnstrnts); JComboBox preferredKeyFrameRequesterComboBox = new JComboBox(); preferredKeyFrameRequesterComboBox.setEditable(false); preferredKeyFrameRequesterComboBox.addItem( new NameValuePair( r.getI18NString( "impl.neomedia.configform.H264" + ".preferredKeyFrameRequester." + KeyFrameControl.KeyFrameRequester.RTCP), KeyFrameControl.KeyFrameRequester.RTCP)); preferredKeyFrameRequesterComboBox.addItem( new NameValuePair( r.getI18NString( "impl.neomedia.configform.H264" + ".preferredKeyFrameRequester." + KeyFrameControl.KeyFrameRequester.SIGNALING), KeyFrameControl.KeyFrameRequester.SIGNALING)); cnstrnts.gridx = 1; cnstrnts.gridy = 1; cnstrnts.weightx = 0; contentPanel.add( preferredKeyFrameRequesterComboBox, cnstrnts); Component presetLabel = createLineWrapLabel( r.getI18NString("impl.neomedia.configform.H264.preset")); cnstrnts.gridx = 0; cnstrnts.gridy = 2; cnstrnts.weightx = 1; contentPanel.add(presetLabel, cnstrnts); JComboBox presetComboBox = new JComboBox(); presetComboBox.setEditable(false); for (String preset : JNIEncoder.AVAILABLE_PRESETS) presetComboBox.addItem(new NameValuePair(preset, preset)); cnstrnts.gridx = 1; cnstrnts.gridy = 2; cnstrnts.weightx = 0; contentPanel.add(presetComboBox, cnstrnts); JCheckBox defaultIntraRefreshCheckBox = new SIPCommCheckBox( r.getI18NString( "impl.neomedia.configform.H264.defaultIntraRefresh")); cnstrnts.gridwidth = GridBagConstraints.REMAINDER; cnstrnts.gridx = 0; cnstrnts.gridy = 3; cnstrnts.weightx = 1; contentPanel.add(defaultIntraRefreshCheckBox, cnstrnts); cnstrnts.gridwidth = 1; Component keyintLabel = createLineWrapLabel( r.getI18NString("impl.neomedia.configform.H264.keyint")); cnstrnts.gridx = 0; cnstrnts.gridy = 4; cnstrnts.weightx = 1; contentPanel.add(keyintLabel, cnstrnts); JSpinner keyintSpinner = new JSpinner( new SpinnerNumberModel( JNIEncoder.DEFAULT_KEYINT, 1, JNIEncoder.X264_KEYINT_MAX_INFINITE, JNIEncoder.DEFAULT_FRAME_RATE)); cnstrnts.gridx = 1; cnstrnts.gridy = 4; cnstrnts.weightx = 0; contentPanel.add(keyintSpinner, cnstrnts); // Load the values from the ConfigurationService into the UI components. ConfigurationService cfg = NeomediaActivator.getConfigurationService(); setSelectedNameValuePair( defaultProfileComboBox, cfg.getString( JNIEncoder.DEFAULT_PROFILE_PNAME, JNIEncoder.DEFAULT_DEFAULT_PROFILE)); addActionListener( defaultProfileComboBox, JNIEncoder.DEFAULT_PROFILE_PNAME); setSelectedNameValuePair( preferredKeyFrameRequesterComboBox, cfg.getString( KeyFrameControl.KeyFrameRequester.PREFERRED_PNAME, KeyFrameControl.KeyFrameRequester.DEFAULT_PREFERRED)); addActionListener( preferredKeyFrameRequesterComboBox, KeyFrameControl.KeyFrameRequester.PREFERRED_PNAME); setSelectedNameValuePair( presetComboBox, cfg.getString( JNIEncoder.PRESET_PNAME, JNIEncoder.DEFAULT_PRESET)); addActionListener(presetComboBox, JNIEncoder.PRESET_PNAME); defaultIntraRefreshCheckBox.setSelected( cfg.getBoolean( JNIEncoder.DEFAULT_INTRA_REFRESH_PNAME, JNIEncoder.DEFAULT_DEFAULT_INTRA_REFRESH)); defaultIntraRefreshCheckBox.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { JCheckBox checkBox = (JCheckBox) e.getSource(); NeomediaActivator .getConfigurationService() .setProperty( JNIEncoder.DEFAULT_INTRA_REFRESH_PNAME, Boolean.toString( checkBox.isSelected())); } }); keyintSpinner.setValue( cfg.getInt(JNIEncoder.KEYINT_PNAME, JNIEncoder.DEFAULT_KEYINT)); keyintSpinner.addChangeListener( new ChangeListener() { public void stateChanged(ChangeEvent e) { JSpinner spinner = (JSpinner) e.getSource(); SpinnerNumberModel model = (SpinnerNumberModel) spinner.getModel(); int value = model.getNumber().intValue(); NeomediaActivator .getConfigurationService() .setProperty( JNIEncoder.KEYINT_PNAME, Integer.toString(value)); } }); } /** * Adds an <tt>ActionListener</tt> to a specific <tt>JComboBox</tt> * populated with <tt>NameValuePair</tt>s which sets the value of a specific * <tt>ConfigurationService</tt> property to the <tt>value</tt> of the * selected <tt>NameValuePair</tt> of the <tt>comboBox</tt>. * * @param comboBox the <tt>JComboBox</tt> to add an <tt>ActionListener</tt> * to * @param property the name of the <tt>ConfigurationService</tt> property * to set the value of */ private void addActionListener( final JComboBox comboBox, final String property) { comboBox.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { NameValuePair nameValuePair = (NameValuePair) comboBox.getSelectedItem(); if (nameValuePair != null) { NeomediaActivator.getConfigurationService() .setProperty(property, nameValuePair.value); } } }); } /** * Initializes a new <tt>Component</tt> instance which is to display a * specific text in the fashion of <tt>JLabel</tt> and with line wrapping. * * @param text the text to be displayed by the new instance * @return a new <tt>Component</tt> instance which displays the specified * <tt>text</tt> in the fashion of <tt>JLabel</tt> and with line wrapping */ private Component createLineWrapLabel(String text) { JTextArea textArea = new JTextArea(); textArea.setEditable(false); textArea.setFocusable(false); textArea.setLineWrap(true); textArea.setOpaque(false); textArea.setWrapStyleWord(true); textArea.setText(text); return textArea; } /** * Sets the selected item in a specific <tt>JComboBox</tt> populated with * <tt>NameValuePair</tt>s to the one which has a specific <tt>value</tt>. * * @param comboBox the <tt>JComboBox</tt> to set the selected item of * @param value the value of the <tt>NameValuePair</tt> to set as the * selected item of <tt>comboBox</tt> */ private void setSelectedNameValuePair(JComboBox comboBox, String value) { for (int i = 0, count = comboBox.getItemCount(); i < count; i++) { NameValuePair nameValuePair = (NameValuePair) comboBox.getItemAt(i); if (nameValuePair.value.equals(value)) { comboBox.setSelectedIndex(i); break; } } } /** * Represents a <tt>String</tt> value which has a human-readable name * associated with it for display purposes. */ private static class NameValuePair { /** * The human-readable name of this <tt>NameValuePair</tt>. */ public final String name; /** * The <tt>String</tt> value represented by this <tt>NameValuePair</tt>. */ public final String value; /** * Initializes a new <tt>NameValuePair</tt> which is to represent a * specific <tt>String</tt> <tt>value</tt> which is to be displayed to * the user as <tt>name</tt>. * * @param name the human-readable name of the new instance * @param value the <tt>String</tt> value to be represented by the new * instance */ public NameValuePair(String name, String value) { this.name = name; this.value = value; } /** * Returns a human-readable representation of this <tt>Object</tt> i.e. * the name of this <tt>NameValuePair</tt>. * * @return a human-readable representation of this <tt>Object</tt> i.e. * the name of this <tt>NameValuePair</tt> */ @Override public String toString() { return name; } } }