package org.chartsy.chatsy.chat.ui; import org.jivesoftware.smack.Roster; import org.jivesoftware.smack.RosterEntry; import org.jivesoftware.smack.packet.Presence; import org.chartsy.chatsy.chat.PresenceManager; import org.chartsy.chatsy.chat.ChatsyManager; import org.chartsy.chatsy.chat.component.TitlePanel; import org.chartsy.chatsy.chat.component.renderer.JPanelRenderer; import org.chartsy.chatsy.chat.util.log.Log; import javax.swing.*; import java.awt.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.*; import java.util.List; public class RosterPickList extends JPanel { private DefaultListModel model = new DefaultListModel(); private JList rosterList = new JList(model); public RosterPickList() { setLayout(new GridBagLayout()); rosterList.setCellRenderer(new JPanelRenderer()); JLabel rosterLabel = new JLabel("Available Users"); this.add(rosterLabel, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0)); this.add(new JScrollPane(rosterList), new GridBagConstraints(0, 1, 1, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0)); } public Collection<String> showRoster(JDialog parent) { final List<ContactItem> userList = new ArrayList<ContactItem>(); final Roster roster = ChatsyManager.getConnection().getRoster(); for (RosterEntry entry : roster.getEntries()) { Presence presence = PresenceManager.getPresence(entry.getUser()); if (presence.isAvailable()) { ContactItem item = new ContactItem(entry.getName(), null, entry.getUser()); item.setPresence(presence); userList.add(item); } } Collections.sort(userList, itemComparator); for (ContactItem item : userList) model.addElement(item); final JOptionPane pane; TitlePanel titlePanel; titlePanel = new TitlePanel("Roster", "Select one or more users in your roster", null, true); final JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BorderLayout()); mainPanel.add(titlePanel, BorderLayout.NORTH); Object[] options = {"Ok", "Cancel"}; pane = new JOptionPane( this, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION, ChatsyManager.getApplicationImage(), options, options[0]); mainPanel.add(pane, BorderLayout.CENTER); final JOptionPane p = new JOptionPane(); final JDialog dlg = p.createDialog(parent, "Roster"); dlg.setModal(true); dlg.pack(); dlg.setSize(350, 450); dlg.setResizable(true); dlg.setContentPane(mainPanel); dlg.setLocationRelativeTo(parent); PropertyChangeListener changeListener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { String value = (String)pane.getValue(); if ("Cancel".equals(value)) { rosterList.clearSelection(); pane.setValue(JOptionPane.UNINITIALIZED_VALUE); dlg.dispose(); } else if ("Ok".equals(value)) { pane.setValue(JOptionPane.UNINITIALIZED_VALUE); dlg.dispose(); } } }; pane.addPropertyChangeListener(changeListener); dlg.setVisible(true); dlg.toFront(); dlg.requestFocus(); List<String> selectedContacts = new ArrayList<String>(); Object[] values = rosterList.getSelectedValues(); final int no = values != null ? values.length : 0; for (int i = 0; i < no; i++) { try { ContactItem item = (ContactItem)values[i]; selectedContacts.add(item.getJID()); } catch (NullPointerException e) { Log.error(e); } } return selectedContacts; } final Comparator<ContactItem> itemComparator = new Comparator<ContactItem>() { public int compare(ContactItem item1, ContactItem item2) { String nickname1 = item1.getDisplayName(); String nickname2 = item2.getDisplayName(); if (nickname1 == null || nickname2 == null) return 0; return nickname1.toLowerCase().compareTo(nickname2.toLowerCase()); } }; }