/*
* 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;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.event.*;
import net.java.sip.communicator.plugin.desktoputil.*;
import net.java.sip.communicator.util.Logger;
import org.jitsi.impl.neomedia.recording.*;
import org.jitsi.service.configuration.*;
import org.jitsi.service.neomedia.recording.*;
import org.jitsi.service.resources.*;
import org.jitsi.util.*;
/**
* The saved calls management and configuration form.
*
* @author Dmitri Melnikov
*/
public class CallRecordingConfigForm
extends TransparentPanel
implements ActionListener,
DocumentListener
{
/**
* The Logger used by the CallRecordingConfigForm class
* and its instances for logging output.
*/
private static final Logger logger
= Logger.getLogger(CallRecordingConfigForm.class);
/**
* The resource service.
*/
private static final ResourceManagementService resources
= NeomediaActivator.getResources();
/**
* Serial version UID.
*/
private static final long serialVersionUID = 0L;
/**
* UI components.
*/
private JButton callDirChooseButton;
private JTextField callDirTextField;
/**
* Directory choose dialog.
*/
private final SipCommFileChooser dirChooser;
private JComboBox formatsComboBox;
private JCheckBox saveCallsToCheckBox;
/**
* Directory where calls are stored. Default is SC_HOME/calls.
*/
private String savedCallsDir;
/**
* Creates an instance of the CallConfigurationPanel.
* Checks for the SAVED_CALLS_PATH and sets it if it does not
* exist.
*/
public CallRecordingConfigForm()
{
super(new BorderLayout());
initComponents();
loadValues();
dirChooser
= GenericFileDialog.create(
null,
resources.getI18NString(
"plugin.callrecordingconfig.CHOOSE_DIR"),
SipCommFileChooser.LOAD_FILE_OPERATION);
dirChooser.setSelectionMode(SipCommFileChooser.DIRECTORIES_ONLY);
}
/**
* Indicates that one of the contained in this panel components has
* performed an action.
*
* @param e the ActionEvent that notified us
*/
public void actionPerformed(ActionEvent e)
{
Object source = e.getSource();
if (source == saveCallsToCheckBox)
{
boolean selected = saveCallsToCheckBox.isSelected();
callDirTextField.setEnabled(selected);
callDirChooseButton.setEnabled(selected);
if (selected)
{
// set default directory
try
{
changeCallsDir(
NeomediaActivator
.getFileAccessService()
.getDefaultDownloadDirectory(),
true);
}
catch (IOException ioex)
{
}
}
else
{
// remove default directory prop
NeomediaActivator
.getConfigurationService()
.setProperty(Recorder.SAVED_CALLS_PATH, null);
callDirTextField.setText(null);
}
}
else if (source == callDirChooseButton)
{
File newDir = dirChooser.getFileFromDialog();
changeCallsDir(newDir, true);
}
else if (source == callDirTextField)
{
File newDir = new File(callDirTextField.getText());
changeCallsDir(newDir, true);
}
}
/**
* Sets the new directory for the saved calls to dir.
*
* @param dir the new chosen directory
* @param changeCallDirTextField whether we will set the directory
* path in callDirTextField.
* @return true if directory was changed successfully,
* false otherwise
*/
private boolean changeCallsDir(File dir, boolean changeCallDirTextField)
{
if (dir != null && dir.isDirectory())
{
savedCallsDir = dir.getAbsolutePath();
if(changeCallDirTextField)
callDirTextField.setText(savedCallsDir);
NeomediaActivator
.getConfigurationService()
.setProperty(Recorder.SAVED_CALLS_PATH, savedCallsDir);
if (logger.isDebugEnabled())
logger.debug("Calls directory changed to " + savedCallsDir);
return true;
}
else
{
if (logger.isDebugEnabled())
logger.debug("Calls directory not changed.");
return false;
}
}
/**
* Not used.
*
* @param e the document event
*/
public void changedUpdate(DocumentEvent e){}
/**
* Creates a combo box with supported audio formats.
*
* @return a combo box with supported audio formats
*/
private Component createFormatsComboBox()
{
ComboBoxModel formatsComboBoxModel
= new DefaultComboBoxModel(RecorderImpl.SUPPORTED_FORMATS);
formatsComboBox = new JComboBox();
formatsComboBox.setPreferredSize(new Dimension(200, 30));
formatsComboBox.setModel(formatsComboBoxModel);
formatsComboBox.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent event)
{
if (event.getStateChange() == ItemEvent.SELECTED)
{
NeomediaActivator
.getConfigurationService()
.setProperty(Recorder.FORMAT, event.getItem());
}
}
});
return formatsComboBox;
}
/**
* Creates a panel with call management components.
*/
private void initComponents()
{
// labels panel
JPanel labelsPanel = new TransparentPanel(new GridLayout(2, 1));
JLabel formatsLabel
= new JLabel(
resources.getI18NString(
"plugin.callrecordingconfig.SUPPORTED_FORMATS"));
saveCallsToCheckBox
= new SIPCommCheckBox(
resources.getI18NString(
"plugin.callrecordingconfig.SAVE_CALLS"));
saveCallsToCheckBox.addActionListener(this);
labelsPanel.add(formatsLabel);
labelsPanel.add(saveCallsToCheckBox);
// saved calls directory panel
JPanel callDirPanel = new TransparentPanel(new BorderLayout());
callDirTextField = new JTextField();
callDirTextField.addActionListener(this);
callDirPanel.add(callDirTextField);
callDirChooseButton
= new JButton(
new ImageIcon(
resources.getImageInBytes(
"plugin.notificationconfig.FOLDER_ICON")));
callDirChooseButton.addActionListener(this);
callDirPanel.add(callDirChooseButton, BorderLayout.EAST);
// values panel
JPanel valuesPanel = new TransparentPanel(new GridLayout(2, 1));
valuesPanel.add(createFormatsComboBox());
valuesPanel.add(callDirPanel);
// main panel
JPanel mainPanel = new TransparentPanel(new BorderLayout());
mainPanel.add(labelsPanel, BorderLayout.WEST);
mainPanel.add(valuesPanel, BorderLayout.CENTER);
this.add(mainPanel, BorderLayout.NORTH);
}
/**
* Gives notification that there was an insert into the document. The
* range given by the DocumentEvent bounds the freshly inserted region.
*
* @param e the document event
*/
public void insertUpdate(DocumentEvent e)
{
File insertedFile = new File(callDirTextField.getText());
if(insertedFile.exists())
changeCallsDir(insertedFile, false);
}
/**
* Loads values from the configuration and sets the UI components to these
* values.
*/
private void loadValues()
{
ConfigurationService configuration
= NeomediaActivator.getConfigurationService();
String format = configuration.getString(Recorder.FORMAT);
formatsComboBox.setSelectedItem(
(format == null)
? SoundFileUtils.DEFAULT_CALL_RECORDING_FORMAT
: format);
savedCallsDir = configuration.getString(Recorder.SAVED_CALLS_PATH);
saveCallsToCheckBox.setSelected(savedCallsDir != null);
callDirTextField.setText(savedCallsDir);
callDirTextField.setEnabled(saveCallsToCheckBox.isSelected());
callDirTextField.getDocument().addDocumentListener(this);
callDirChooseButton.setEnabled(saveCallsToCheckBox.isSelected());
}
/**
* Gives notification that a portion of the document has been
* removed. The range is given in terms of what the view last
* saw (that is, before updating sticky positions).
*
* @param e the document event
*/
public void removeUpdate(DocumentEvent e)
{
File insertedFile = new File(callDirTextField.getText());
if(insertedFile.exists())
changeCallsDir(insertedFile, false);
}
}