/**
* $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.spark.ui.conferences;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import org.jivesoftware.resource.Res;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smackx.Form;
import org.jivesoftware.smackx.FormField;
import org.jivesoftware.smackx.FormField.Option;
import org.jivesoftware.smackx.bookmark.BookmarkManager;
import org.jivesoftware.smackx.muc.MultiUserChat;
import org.jivesoftware.smackx.muc.RoomInfo;
import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.component.CheckBoxList;
import org.jivesoftware.spark.util.GraphicUtils;
import org.jivesoftware.spark.util.ModelUtil;
import org.jivesoftware.spark.util.ResourceUtils;
import org.jivesoftware.spark.util.log.Log;
public class DataFormDialog extends JPanel {
private static final long serialVersionUID = -1536217028590811636L;
private final Map<String,JComponent> valueMap = new HashMap<String,JComponent>();
private int row = 0;
JDialog dialog = null;
public DataFormDialog(JFrame parent, final MultiUserChat chat, final Form submitForm) {
dialog = new JDialog(parent, true);
dialog.setTitle(Res.getString("title.configure.chat.room"));
this.setLayout(new GridBagLayout());
Form form = null;
// Create the room
try {
form = chat.getConfigurationForm();
}
catch (XMPPException e) {
Log.error(e);
}
// Create a new form to submit based on the original form
try {
Iterator<FormField> fields = form.getFields();
// Add default answers to the form to submit
while (fields.hasNext()) {
FormField field = fields.next();
submitForm.addField(field);
String variable = field.getVariable();
String label = field.getLabel();
String type = field.getType();
Iterator<?> iter = field.getValues();
List<Object> valueList = new ArrayList<Object>();
while (iter.hasNext()) {
valueList.add(iter.next());
}
if (type.equals(FormField.TYPE_BOOLEAN)) {
String o = (String)valueList.get(0);
boolean isSelected = o.equals("1");
JCheckBox box = new JCheckBox(label);
box.setSelected(isSelected);
addField(label, box, variable);
}
else if (type.equals(FormField.TYPE_TEXT_SINGLE) ||
type.equals(FormField.TYPE_JID_SINGLE)) {
String value = (String)valueList.get(0);
addField(label, new JTextField(value), variable);
}
else if (type.equals(FormField.TYPE_TEXT_MULTI) ||
type.equals(FormField.TYPE_JID_MULTI)) {
StringBuffer buf = new StringBuffer();
iter = field.getValues();
while (iter.hasNext()) {
buf.append((String)iter.next());
if (iter.hasNext()) {
buf.append(",");
}
}
addField(label, new JTextArea(buf.toString()), variable);
}
else if (type.equals(FormField.TYPE_TEXT_PRIVATE)) {
addField(label, new JPasswordField(), variable);
}
else if (type.equals(FormField.TYPE_LIST_SINGLE)) {
JComboBox box = new JComboBox();
iter = field.getOptions();
while (iter.hasNext()) {
FormField.Option option = (FormField.Option)iter.next();
String value = option.getValue();
box.addItem(value);
}
if (valueList.size() > 0) {
String defaultValue = (String)valueList.get(0);
box.setSelectedItem(defaultValue);
}
addField(label, box, variable);
}
else if (type.equals(FormField.TYPE_LIST_MULTI)) {
CheckBoxList checkBoxList = new CheckBoxList();
Iterator<Option> options = field.getOptions();
Option option = null;
String optionLabel = null;
String optionValue = null;
Iterator<?> i = field.getValues();
List<String> values = new ArrayList<String>();
while (i.hasNext()) {
values.add((String)i.next());
}
while (options.hasNext()) {
option = options.next();
optionLabel = option.getLabel();
optionValue = option.getValue();
checkBoxList.addCheckBox(new JCheckBox(optionLabel, values.contains(optionValue)), optionValue);
}
addField(label, checkBoxList, variable);
}
}
}
catch (NullPointerException e) {
Log.error(e);
}
JButton button = new JButton();
ResourceUtils.resButton(button, Res.getString("button.update"));
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dialog.dispose();
// Now submit all information
updateRoomConfiguration(submitForm, chat);
}
});
final JScrollPane pane = new JScrollPane(this);
pane.getVerticalScrollBar().setBlockIncrement(200);
pane.getVerticalScrollBar().setUnitIncrement(20);
dialog.getContentPane().setLayout(new BorderLayout());
dialog.getContentPane().add(pane, BorderLayout.CENTER);
JPanel bottomPanel = new JPanel();
bottomPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
bottomPanel.add(button);
JButton cancelButton = new JButton();
ResourceUtils.resButton(cancelButton, Res.getString("button.cancel"));
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
dialog.dispose();
}
});
bottomPanel.add(cancelButton);
dialog.getContentPane().add(bottomPanel, BorderLayout.SOUTH);
dialog.pack();
dialog.setSize(600, 400);
GraphicUtils.centerWindowOnScreen(dialog);
dialog.setVisible(true);
}
private void updateRoomConfiguration(Form submitForm, MultiUserChat chat) {
for (Object o1 : valueMap.keySet()) {
String answer = (String) o1;
Object o = valueMap.get(answer);
if (o instanceof JCheckBox) {
boolean isSelected = ((JCheckBox) o).isSelected();
submitForm.setAnswer(answer, isSelected);
} else if (o instanceof JTextArea) {
List<String> list = new ArrayList<String>();
String value = ((JTextArea) o).getText();
StringTokenizer tokenizer = new StringTokenizer(value, ", ", false);
while (tokenizer.hasMoreTokens()) {
list.add(tokenizer.nextToken());
}
if (list.size() > 0) {
submitForm.setAnswer(answer, list);
}
} else if (o instanceof JTextField) {
String value = ((JTextField) o).getText();
if (ModelUtil.hasLength(value)) {
submitForm.setAnswer(answer, value);
}
} else if (o instanceof JComboBox) {
String value = (String) ((JComboBox) o).getSelectedItem();
List<String> list = new ArrayList<String>();
list.add(value);
if (list.size() > 0) {
submitForm.setAnswer(answer, list);
}
} else if (o instanceof CheckBoxList) {
List<String> list = ((CheckBoxList) o).getSelectedValues();
if (list.size() > 0) {
submitForm.setAnswer(answer, list);
}
}
}
try {
chat.sendConfigurationForm(submitForm);
RoomInfo info = MultiUserChat.getRoomInfo(SparkManager.getConnection(), chat.getRoom());
//remove bookmark if any for non persistent room
if (!info.isPersistent()) {
BookmarkManager.getBookmarkManager(SparkManager.getConnection()).removeBookmarkedConference(info.getRoom());
}
}
catch (XMPPException e) {
Log.error(e);
}
}
private void addField(String label, JComponent comp, String variable) {
if (!(comp instanceof JCheckBox)) {
JLabel formLabel = new JLabel(label);
formLabel.setFont(new Font("dialog", Font.BOLD, 10));
this.add(formLabel, new GridBagConstraints(0, row, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
}
if (comp instanceof JTextArea) {
JScrollPane pane = new JScrollPane(comp);
pane.setBorder(BorderFactory.createTitledBorder(Res.getString("group.comma.delimited")));
this.add(pane, new GridBagConstraints(1, row, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 75, 50));
}
else if (comp instanceof JCheckBox) {
this.add(comp, new GridBagConstraints(0, row, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
}
else if (comp instanceof CheckBoxList) {
this.add(comp, new GridBagConstraints(1, row, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 75, 50));
}
else {
this.add(comp, new GridBagConstraints(1, row, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 75, 0));
}
valueMap.put(variable, comp);
row++;
}
public String getValue(String label) {
Component comp = valueMap.get(label);
if (comp instanceof JCheckBox) {
return "" + ((JCheckBox)comp).isSelected();
}
if (comp instanceof JTextField) {
return ((JTextField)comp).getText();
}
return null;
}
}