/**
* $RCSfile: ,v $
* $Revision: $
* $Date: $
*
* Copyright (C) 2004-2011 Jive Software. All rights reserved.
*
* 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 org.jivesoftware.sparkimpl.preference.sounds;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JTextField;
import org.jivesoftware.Spark;
import org.jivesoftware.resource.Res;
import org.jivesoftware.resource.SparkRes;
import org.jivesoftware.spark.preference.Preference;
import org.jivesoftware.spark.util.ResourceUtils;
import org.jivesoftware.spark.util.SwingWorker;
import org.jivesoftware.spark.util.WindowsFileSystemView;
import org.jivesoftware.spark.util.log.Log;
import com.thoughtworks.xstream.XStream;
/**
* Preferences to handle Sounds played within Spark.
*
* @author Derek DeMoro
*/
public class SoundPreference implements Preference {
private XStream xstream;
private SoundPreferences preferences;
private SoundPanel soundPanel;
public static String NAMESPACE = "Sounds";
public SoundPreference() {
}
public String getTitle() {
return Res.getString("title.sound.preferences");
}
public Icon getIcon() {
return SparkRes.getImageIcon(SparkRes.SOUND_PREFERENCES_IMAGE);
}
public String getTooltip() {
return Res.getString("title.sounds");
}
public String getListName() {
return Res.getString("title.sounds");
}
public String getNamespace() {
return NAMESPACE;
}
public JComponent getGUI() {
if (soundPanel == null) {
try {
EventQueue.invokeAndWait(new Runnable() {
public void run()
{
soundPanel = new SoundPanel();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
return soundPanel;
}
public void loadFromFile() {
if (preferences != null) {
return;
}
if (!getSoundSettingsFile().exists()) {
preferences = new SoundPreferences();
}
else {
// Do Initial Load from FileSystem.
File settingsFile = getSoundSettingsFile();
try {
FileReader reader = new FileReader(settingsFile);
preferences = (SoundPreferences)getXStream().fromXML(reader);
}
catch (Exception e) {
Log.error("Error loading Sound Preferences.", e);
preferences = new SoundPreferences();
}
}
}
public void load() {
if (soundPanel == null) {
soundPanel = new SoundPanel();
}
SwingWorker worker = new SwingWorker() {
public Object construct() {
loadFromFile();
return preferences;
}
public void finished() {
// Set default settings
soundPanel.setIncomingMessageSound(preferences.getIncomingSound());
soundPanel.playIncomingSound(preferences.isPlayIncomingSound());
soundPanel.setOutgoingMessageSound(preferences.getOutgoingSound());
soundPanel.playOutgoingSound(preferences.isPlayOutgoingSound());
soundPanel.setOfflineSound(preferences.getOfflineSound());
soundPanel.playOfflineSound(preferences.isPlayOfflineSound());
soundPanel.setInvitationSound(preferences.getIncomingInvitationSoundFile());
soundPanel.setPlayInvitationSound(preferences.playIncomingInvitationSound());
}
};
worker.start();
}
public void commit() {
preferences.setIncomingSound(soundPanel.getIncomingSound());
preferences.setOutgoingSound(soundPanel.getOutgoingSound());
preferences.setOfflineSound(soundPanel.getOfflineSound());
preferences.setPlayOfflineSound(soundPanel.playOfflineSound());
preferences.setPlayIncomingSound(soundPanel.playIncomingSound());
preferences.setPlayOutgoingSound(soundPanel.playOutgoingSound());
preferences.setIncomingInvitationSoundFile(soundPanel.getInvitationSound());
preferences.setPlayIncomingInvitationSound(soundPanel.playInvitationSound());
saveSoundsFile();
}
public boolean isDataValid() {
return true;
}
public String getErrorMessage() {
return null;
}
public Object getData() {
return null;
}
private class SoundPanel extends JPanel {
private static final long serialVersionUID = 4332294589601051699L;
private final JCheckBox incomingMessageBox = new JCheckBox();
private final JTextField incomingMessageSound = new JTextField();
private final JButton incomingBrowseButton = new JButton("..");
private final JCheckBox outgoingMessageBox = new JCheckBox();
private final JTextField outgoingMessageSound = new JTextField();
private final JButton outgoingBrowseButton = new JButton("..");
private final JCheckBox userOfflineCheckbox = new JCheckBox();
private final JTextField userOfflineField = new JTextField();
private final JButton offlineBrowseButton = new JButton("..");
private final JCheckBox incomingInvitationBox = new JCheckBox();
private final JTextField incomingInvitationField = new JTextField();
private final JButton incomingInvitationBrowseButton = new JButton("..");
private JFileChooser fc;
public SoundPanel() {
setLayout(new GridBagLayout());
setBorder(BorderFactory.createTitledBorder(Res.getString("title.sound.preferences")));
// Add ResourceUtils
ResourceUtils.resButton(incomingMessageBox, Res.getString("checkbox.play.sound.on.new.message"));
ResourceUtils.resButton(outgoingMessageBox, Res.getString("checkbox.play.sound.on.outgoing.message"));
ResourceUtils.resButton(userOfflineCheckbox, Res.getString("checkbox.play.sound.when.offline"));
ResourceUtils.resButton(incomingInvitationBox, Res.getString("checkbox.play.sound.on.invitation"));
// Handle incoming sounds
add(incomingMessageBox, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
add(incomingMessageSound, new GridBagConstraints(0, 1, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
add(incomingBrowseButton, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
// Handle sending sounds
add(outgoingMessageBox, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
add(outgoingMessageSound, new GridBagConstraints(0, 3, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
add(outgoingBrowseButton, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
// Handle User Online Sound
add(userOfflineCheckbox, new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
add(userOfflineField, new GridBagConstraints(0, 5, 1, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
add(offlineBrowseButton, new GridBagConstraints(1, 5, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
// Handle Invitation Sound
add(incomingInvitationBox, new GridBagConstraints(0, 6, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
add(incomingInvitationField, new GridBagConstraints(0, 7, 1, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
add(incomingInvitationBrowseButton, new GridBagConstraints(1, 7, 1, 1, 0.0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
incomingBrowseButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
pickFile(Res.getString("title.choose.incoming.sound"), incomingMessageSound);
}
});
outgoingBrowseButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
pickFile(Res.getString("title.choose.outgoing.sound"), outgoingMessageSound);
}
});
offlineBrowseButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
pickFile(Res.getString("title.choose.offline.sound"), userOfflineField);
}
});
incomingInvitationBrowseButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
pickFile(Res.getString("title.choose.incoming.sound"), incomingInvitationField);
}
});
}
public void setIncomingMessageSound(String path) {
incomingMessageSound.setText(path);
}
public void setOutgoingMessageSound(String path) {
outgoingMessageSound.setText(path);
}
public void setOfflineSound(String path) {
userOfflineField.setText(path);
}
public void playIncomingSound(boolean play) {
incomingMessageBox.setSelected(play);
}
public void playOutgoingSound(boolean play) {
outgoingMessageBox.setSelected(play);
}
public void playOfflineSound(boolean play) {
userOfflineCheckbox.setSelected(play);
}
public String getIncomingSound() {
return incomingMessageSound.getText();
}
public boolean playIncomingSound() {
return incomingMessageBox.isSelected();
}
public boolean playOutgoingSound() {
return outgoingMessageBox.isSelected();
}
public String getOutgoingSound() {
return outgoingMessageSound.getText();
}
public boolean playOfflineSound() {
return userOfflineCheckbox.isSelected();
}
public String getOfflineSound() {
return userOfflineField.getText();
}
public void setInvitationSound(String invitationSound) {
incomingInvitationField.setText(invitationSound);
}
public String getInvitationSound() {
return incomingInvitationField.getText();
}
public void setPlayInvitationSound(boolean play) {
incomingInvitationBox.setSelected(play);
}
public boolean playInvitationSound() {
return incomingInvitationBox.isSelected();
}
private void pickFile(String title, JTextField field) {
if (fc == null) {
fc = new JFileChooser();
if (Spark.isWindows()) {
fc.setFileSystemView(new WindowsFileSystemView());
}
}
fc.setDialogTitle(title);
int returnVal = fc.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
try {
field.setText(file.getCanonicalPath());
}
catch (IOException e) {
Log.error(e);
}
}
else {
}
}
}
private File getSoundSettingsFile() {
File file = new File(Spark.getSparkUserHome());
if (!file.exists()) {
file.mkdirs();
}
return new File(file, "sound-settings.xml");
}
private void saveSoundsFile() {
try {
FileWriter writer = new FileWriter(getSoundSettingsFile());
getXStream().toXML(preferences, writer);
}
catch (Exception e) {
Log.error("Error saving sound settings.", e);
}
}
public SoundPreferences getPreferences() {
if (preferences == null) {
load();
}
return preferences;
}
public void shutdown() {
}
private XStream getXStream() {
if (xstream == null) {
xstream = new XStream();
xstream.alias("sounds", SoundPreferences.class);
}
return xstream;
}
}