/**
* $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 org.jivesoftware.resource.Res;
import org.jivesoftware.resource.SparkRes;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smackx.ServiceDiscoveryManager;
import org.jivesoftware.smackx.muc.MultiUserChat;
import org.jivesoftware.smackx.muc.RoomInfo;
import org.jivesoftware.smackx.packet.DiscoverItems;
import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.component.JiveTreeCellRenderer;
import org.jivesoftware.spark.component.JiveTreeNode;
import org.jivesoftware.spark.component.TitlePanel;
import org.jivesoftware.spark.component.Tree;
import org.jivesoftware.spark.util.SwingWorker;
import org.jivesoftware.spark.util.log.Log;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Iterator;
public class RoomBrowser extends JPanel {
private static final long serialVersionUID = 8820670697089268423L;
private JLabel descriptionLabel = new JLabel();
private JLabel subjectLabel = new JLabel();
private JLabel occupantsLabel = new JLabel();
private JLabel roomNameLabel = new JLabel();
private JLabel descriptionValue = new JLabel();
private JLabel subjectValue = new JLabel();
private JLabel occupantsValue = new JLabel();
private JLabel roomNameValue = new JLabel();
private JiveTreeNode rootNode;
private Tree tree;
public RoomBrowser() {
descriptionLabel.setText(Res.getString("description") + ":");
subjectLabel.setText(Res.getString("subject") + ":");
occupantsLabel.setText(Res.getString("occupants") + ":");
roomNameLabel.setText(Res.getString("room.name") + ":");
// Add labels to UI
setLayout(new GridBagLayout());
add(descriptionLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
add(descriptionValue, new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
add(subjectLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
add(subjectValue, new GridBagConstraints(1, 1, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
add(occupantsLabel, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
add(occupantsValue, new GridBagConstraints(1, 2, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
add(roomNameLabel, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
add(roomNameValue, new GridBagConstraints(1, 3, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
rootNode = new JiveTreeNode(Res.getString("tree.users.in.room"), true);
tree = new Tree(rootNode);
add(tree, new GridBagConstraints(0, 4, 2, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));
setBackground(Color.white);
tree.setCellRenderer(new JiveTreeCellRenderer());
}
public void displayRoomInformation(final String roomJID) {
SwingWorker worker = new SwingWorker() {
RoomInfo roomInfo = null;
DiscoverItems items = null;
public Object construct() {
try {
roomInfo = MultiUserChat.getRoomInfo(SparkManager.getConnection(), roomJID);
ServiceDiscoveryManager manager = ServiceDiscoveryManager.getInstanceFor(SparkManager.getConnection());
items = manager.discoverItems(roomJID);
}
catch (XMPPException e) {
Log.error(e);
}
return "ok";
}
public void finished() {
setupRoomInformationUI(roomJID, roomInfo, items);
}
};
worker.start();
}
private void setupRoomInformationUI(String roomJID, final RoomInfo roomInfo, final DiscoverItems items) {
descriptionValue.setText(Res.getString("message.no.description.available"));
subjectValue.setText(Res.getString("message.no.subject.available"));
occupantsValue.setText("n/a");
roomNameValue.setText("n/a");
try {
descriptionValue.setText(roomInfo.getDescription());
subjectValue.setText(roomInfo.getSubject());
if (roomInfo.getOccupantsCount() == -1) {
occupantsValue.setText("n/a");
}
else {
occupantsValue.setText(Integer.toString(roomInfo.getOccupantsCount()));
}
roomNameValue.setText(roomInfo.getRoom());
Iterator<DiscoverItems.Item> iter = items.getItems();
while (iter.hasNext()) {
DiscoverItems.Item item = iter.next();
String jid = item.getEntityID();
rootNode.add(new JiveTreeNode(jid, false, SparkRes.getImageIcon(SparkRes.SMALL_USER1_INFORMATION)));
}
tree.expandRow(0);
}
catch (Exception e) {
Log.error(e);
}
final JOptionPane pane;
// Create the title panel for this dialog
TitlePanel titlePanel = new TitlePanel(Res.getString("title.view.room.information"), Res.getString("message.room.information.for", roomJID), SparkRes.getImageIcon(SparkRes.BLANK_IMAGE), true);
// Construct main panel w/ layout.
final JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BorderLayout());
mainPanel.add(titlePanel, BorderLayout.NORTH);
// The user should only be able to close this dialog.
Object[] options = {Res.getString("close")};
pane = new JOptionPane(this, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION, null, options, options[0]);
mainPanel.add(pane, BorderLayout.CENTER);
final JOptionPane p = new JOptionPane();
final JDialog dlg = p.createDialog(SparkManager.getMainWindow(), Res.getString("title.view.room.information"));
dlg.setModal(false);
dlg.pack();
dlg.setSize(450, 400);
dlg.setResizable(true);
dlg.setContentPane(mainPanel);
dlg.setLocationRelativeTo(SparkManager.getMainWindow());
PropertyChangeListener changeListener = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
String value = (String)pane.getValue();
if (Res.getString("close").equals(value)) {
pane.setValue(JOptionPane.UNINITIALIZED_VALUE);
dlg.dispose();
}
}
};
pane.addPropertyChangeListener(changeListener);
dlg.setVisible(true);
dlg.toFront();
dlg.requestFocus();
}
}