/*
* 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.gui.main.chat.conference;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.text.*;
import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.impl.gui.customcontrols.*;
import net.java.sip.communicator.plugin.desktoputil.*;
import net.java.sip.communicator.service.protocol.*;
/**
* The configuration window for a chat room.
*
* @author Yana Stamcheva
* @author Valentin Martinet
* @author Damian Minkov
*/
@SuppressWarnings("serial")
public class ChatRoomConfigurationWindow
extends SIPCommFrame
implements ActionListener
{
/**
* The configuration form contained in this window.
*/
protected ChatRoomConfigurationForm configForm;
/**
* The scroll pane contained in the "General" tab.
*/
protected JScrollPane generalScrollPane = new JScrollPane();
/**
* The main panel.
*/
protected JPanel mainPanel = new TransparentPanel();
/**
* The button that stores the data.
*/
private JButton saveButton = new JButton(
GuiActivator.getResources().getI18NString("service.gui.APPLY"));
/**
* The cancel button.
*/
private JButton cancelButton = new JButton(
GuiActivator.getResources().getI18NString("service.gui.CANCEL"));
/**
* The panel containing all buttons.
*/
private JPanel buttonsPanel =
new TransparentPanel(new FlowLayout(FlowLayout.CENTER));
/**
* The panel containing the title.
*/
private TitlePanel titlePanel = new TitlePanel();
/**
* A map all configuration components.
*/
protected Hashtable<String, JComponent> uiFieldsTable
= new Hashtable<String, JComponent>();
/**
* Creates an instance of <tt>ChatRoomConfigurationWindow</tt> and
* initializes the configuration form.
*
* @param chatRoomName the name of the room
* @param configForm the configuration form to load in this configuration
* window
*/
public ChatRoomConfigurationWindow(String chatRoomName,
ChatRoomConfigurationForm configForm)
{
super(false);
this.configForm = configForm;
this.setTitle(GuiActivator.getResources().getI18NString(
"service.gui.CHAT_ROOM_CONFIGURATION",
new String[]{chatRoomName}));
titlePanel.setTitleText(GuiActivator.getResources().getI18NString(
"service.gui.CHAT_ROOM_OPTIONS"));
this.generalScrollPane.setPreferredSize(new Dimension(820, 520));
this.generalScrollPane.setHorizontalScrollBarPolicy(
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
this.generalScrollPane.setOpaque(false);
this.generalScrollPane.getViewport().setOpaque(false);
this.mainPanel.setBorder(
BorderFactory.createEmptyBorder(15, 15, 15, 15));
this.mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
this.saveButton.addActionListener(this);
this.cancelButton.addActionListener(this);
this.buttonsPanel.add(saveButton);
this.buttonsPanel.add(cancelButton);
this.generalScrollPane.getViewport().add(mainPanel);
this.getContentPane().add(titlePanel, BorderLayout.NORTH);
this.getContentPane().add(generalScrollPane, BorderLayout.CENTER);
this.getContentPane().add(buttonsPanel, BorderLayout.SOUTH);
titlePanel.setOpaque(false);
buttonsPanel.setOpaque(false);
mainPanel.setOpaque(false);
generalScrollPane.setOpaque(false);
this.loadConfigurationForm();
}
/**
* Loads the configuration form obtained from the chat room.
*/
protected void loadConfigurationForm()
{
Iterator<ChatRoomConfigurationFormField> configurationSet
= configForm.getConfigurationSet();
while(configurationSet.hasNext())
{
ChatRoomConfigurationFormField formField
= configurationSet.next();
Iterator<?> values = formField.getValues();
Iterator<String> options = formField.getOptions();
JComponent field;
JLabel label = new JLabel("", JLabel.RIGHT);
if(formField.getLabel() != null)
label.setText(formField.getLabel() + ": ");
String fieldType = formField.getType();
if(fieldType.equals(ChatRoomConfigurationFormField.TYPE_BOOLEAN))
{
// Create a check box when the field is of type boolean.
field = new SIPCommCheckBox(formField.getLabel());
label.setText("");
if(values.hasNext())
{
((JCheckBox)field)
.setSelected((Boolean)values.next());
}
}
else if(fieldType.equals(
ChatRoomConfigurationFormField.TYPE_TEXT_FIXED))
{
field = new JLabel();
if(values.hasNext())
{
String value = values.next().toString();
((JLabel) field).setText(value);
field.setFont(new Font(null, Font.ITALIC, 10));
field.setForeground(Color.GRAY);
}
}
else if(fieldType.equals(
ChatRoomConfigurationFormField.TYPE_LIST_MULTI))
{
field = new TransparentPanel(new GridLayout(0, 1));
field.setBorder(BorderFactory.createLineBorder(Color.GRAY));
Hashtable<Object, JCheckBox> optionCheckBoxes
= new Hashtable<Object, JCheckBox>();
while(options.hasNext())
{
Object option = options.next();
JCheckBox checkBox = new SIPCommCheckBox(option.toString());
field.add(checkBox);
optionCheckBoxes.put(option, checkBox);
}
while(values.hasNext())
{
Object value = values.next();
(optionCheckBoxes.get(value)).setSelected(true);
}
}
else if(fieldType.equals(
ChatRoomConfigurationFormField.TYPE_LIST_SINGLE))
{
field = new JComboBox();
while(options.hasNext())
{
((JComboBox) field).addItem(options.next());
}
if(values.hasNext())
{
((JComboBox)field).setSelectedItem(values.next());
}
}
else if(fieldType.equals(
ChatRoomConfigurationFormField.TYPE_TEXT_MULTI))
{
field = new JEditorPane();
if(values.hasNext())
{
String value = values.next().toString();
((JEditorPane) field).setText(value);
}
}
else if(fieldType.equals(
ChatRoomConfigurationFormField.TYPE_TEXT_SINGLE)
|| fieldType.equals(
ChatRoomConfigurationFormField.TYPE_ID_SINGLE))
{
field = new JTextField();
if(values.hasNext())
{
String value = values.next().toString();
((JTextField) field).setText(value);
}
}
else if(fieldType.equals(
ChatRoomConfigurationFormField.TYPE_TEXT_PRIVATE))
{
field = new JPasswordField();
if(values.hasNext())
{
String value = values.next().toString();
((JPasswordField) field).setText(value);
}
}
else if(fieldType.equals(
ChatRoomConfigurationFormField.TYPE_ID_MULTI))
{
StringBuffer buff = new StringBuffer();
while(values.hasNext())
{
String value = values.next().toString();
buff.append(value);
if(values.hasNext())
buff.append(System.getProperty("line.separator"));
}
field = new JTextArea(buff.toString());
}
else
{
if(label.getText() == null)
continue;
field = new JTextField();
if(values.hasNext())
{
String value = values.next().toString();
((JTextField) field).setText(value);
}
}
// If the field is not fixed (i.e. could be changed) we would like
// to save it in a list in order to use it later when user saves
// the configuration data.
if(!fieldType.equals(
ChatRoomConfigurationFormField.TYPE_TEXT_FIXED))
{
uiFieldsTable.put(formField.getName(), field);
}
JPanel fieldPanel = new TransparentPanel(new GridLayout(1,2));
fieldPanel.setOpaque(false);
if(!(field instanceof JLabel))
fieldPanel.setBorder(
BorderFactory.createEmptyBorder(0, 0, 8, 0));
else
fieldPanel.setBorder(
BorderFactory.createEmptyBorder(0, 0, 1, 0));
fieldPanel.add(label);
fieldPanel.add(field);
this.mainPanel.add(fieldPanel);
}
}
/**
* Computes the maximum width of a label in the configuration form.
*
* @param configForm the configuration form containing all labels.
* @return the maximum width of a label in the configuration form
*/
private int computeLabelWidth(ChatRoomConfigurationForm configForm)
{
int labelWidth = 0;
Iterator<ChatRoomConfigurationFormField> configurationSet
= configForm.getConfigurationSet();
while(configurationSet.hasNext())
{
ChatRoomConfigurationFormField formField
= configurationSet.next();
if(formField.getLabel() == null)
continue;
JLabel label = new JLabel(formField.getLabel());
int newLabelWidth = SwingUtilities.computeStringWidth(
label.getFontMetrics(label.getFont()), formField.getLabel());
if(newLabelWidth > labelWidth)
labelWidth = newLabelWidth;
}
// We add 10 pixels to be sure that even after adding the ':' char
// the label will rest visible.
return labelWidth + 10;
}
/**
* Saves all configuration settings when the "Save" button is pressed.
* @param e the <tt>ActionEvent</tt> that notified us of the button action
*/
public void actionPerformed(ActionEvent e)
{
JButton button = (JButton) e.getSource();
if(button.equals(saveButton))
{
Iterator<ChatRoomConfigurationFormField> configurationSet
= configForm.getConfigurationSet();
while(configurationSet.hasNext())
{
ChatRoomConfigurationFormField formField
= configurationSet.next();
// If the field is of type fixed the user could not change it,
// so we skip it.
if(formField.getType().equals(
ChatRoomConfigurationFormField.TYPE_TEXT_FIXED))
continue;
JComponent c
= uiFieldsTable.get(formField.getName());
if (c instanceof JTextComponent)
{
String newValue = ((JTextComponent)c).getText();
if(formField.getType().equals(
ChatRoomConfigurationFormField.TYPE_ID_MULTI))
{
// extract values
StringTokenizer idTokens = new StringTokenizer(
newValue, System.getProperty("line.separator"));
while(idTokens.hasMoreTokens())
{
formField.addValue(idTokens.nextToken());
}
}
else
formField.addValue(newValue);
}
else if (c instanceof AbstractButton)
{
boolean isSelected = ((AbstractButton)c).isSelected();
formField.addValue(isSelected);
}
else if (c instanceof JComboBox)
{
Object selectedObject = ((JComboBox)c).getSelectedItem();
formField.addValue(selectedObject);
}
else if (c instanceof JPanel)
{
Component[] components = c.getComponents();
for(Component comp : components)
{
if(!(comp instanceof JCheckBox))
continue;
JCheckBox checkBox = (JCheckBox) comp;
formField.addValue(checkBox.getText());
}
}
}
new Thread()
{
@Override
public void run()
{
try
{
configForm.submit();
}
catch (Exception e)
{
new ErrorDialog(
ChatRoomConfigurationWindow.this,
GuiActivator.getResources().getI18NString(
"service.gui.ERROR"),
GuiActivator.getResources().getI18NString(
"service.gui.CHAT_ROOM_CONFIGURATION_SUBMIT_FAILED")
, e).showDialog();
}
}
}.start();
}
this.dispose();
}
@Override
protected void close(boolean isEscaped)
{
this.dispose();
}
/**
* Overwrites the setVisible method in order to set the
* position of this window before showing it.
* @param isVisible indicates if this frame should be visible
*/
@Override
public void setVisible(boolean isVisible)
{
if(isVisible)
setLocationRelativeTo(null);
super.setVisible(isVisible);
}
}