/** * $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.sparkplugin.ui.transfer; import org.jivesoftware.spark.plugin.phone.resource.PhoneRes; import org.jivesoftware.sparkplugin.callhistory.TelephoneUtils; import org.jivesoftware.resource.Res; import org.jivesoftware.smack.Roster; import org.jivesoftware.smack.RosterEntry; import org.jivesoftware.smack.RosterGroup; import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smackx.packet.VCard; import org.jivesoftware.spark.PresenceManager; import org.jivesoftware.spark.SparkManager; import org.jivesoftware.spark.component.RolloverButton; import org.jivesoftware.spark.component.VerticalFlowLayout; import org.jivesoftware.spark.util.ModelUtil; import java.awt.Color; 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.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.Icon; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.UIManager; /** * The UI that represents one group within the users Roster. */ public class TransferGroupUI extends JPanel { private static final long serialVersionUID = 1L; private List<TransferListener> listeners = new ArrayList<TransferListener>(); private List<UserEntry> userEntries = new ArrayList<UserEntry>(); private boolean containsNumbers; public TransferGroupUI(String groupName) { setLayout(new VerticalFlowLayout(VerticalFlowLayout.TOP, 0, 0, true, false)); setBackground(Color.white); final Roster roster = SparkManager.getConnection().getRoster(); final RosterGroup rosterGroup = roster.getGroup(groupName); final List<RosterEntry> entries = new ArrayList<RosterEntry>(rosterGroup.getEntries()); Collections.sort(entries, entryComparator); for (RosterEntry entry : entries) { final UserEntry userEntry = new UserEntry(entry); userEntries.add(userEntry); add(userEntry); } } /** * Individual UI for one single user. */ private class UserEntry extends JPanel { /** * */ private static final long serialVersionUID = 1L; private String name; private String workNumber; private String homeNumber; private String mobileNumber; public UserEntry(RosterEntry entry) { setLayout(new GridBagLayout()); final Roster roster = SparkManager.getConnection().getRoster(); Presence presence = roster.getPresence(entry.getUser()); Icon icon = PresenceManager.getIconFromPresence(presence); String status = presence.getStatus() != null ? presence.getStatus() : ""; if ("Online".equals(status) || Res.getString("available").equalsIgnoreCase(status)) { status = ""; } String nickname = entry.getName(); this.name = nickname; setOpaque(false); final JLabel contactLabel = new JLabel(nickname, icon, JLabel.LEFT); final JLabel descriptionLabel = new JLabel(); descriptionLabel.setFont(new Font("Dialog", Font.PLAIN, 11)); descriptionLabel.setForeground((Color)UIManager.get("ContactItemDescription.foreground")); descriptionLabel.setHorizontalTextPosition(JLabel.LEFT); descriptionLabel.setHorizontalAlignment(JLabel.LEFT); if (ModelUtil.hasLength(status)) { descriptionLabel.setText(" - " + status); } final RolloverButton transferButton = new RolloverButton(PhoneRes.getImageIcon("TRANSFER_IMAGE")); transferButton.setMargin(new Insets(0, 0, 0, 0)); VCard vcard = SparkManager.getVCardManager().getVCardFromMemory(entry.getUser()); homeNumber = vcard.getPhoneHome("VOICE"); workNumber = vcard.getPhoneWork("VOICE"); mobileNumber = vcard.getPhoneWork("CELL"); final List<Action> actions = new ArrayList<Action>(); if (ModelUtil.hasLength(homeNumber)) { Action homeAction = new NumberAction("Home:", homeNumber, PhoneRes.getImageIcon("HOME_IMAGE")); actions.add(homeAction); } if (ModelUtil.hasLength(workNumber)) { Action workAction = new NumberAction("Work:", workNumber, PhoneRes.getImageIcon("WORK_IMAGE")); actions.add(workAction); } if (ModelUtil.hasLength(mobileNumber)) { Action mobileAction = new NumberAction("Cell: ", mobileNumber, PhoneRes.getImageIcon("MOBILE_IMAGE")); actions.add(mobileAction); } if (actions.size() > 0) { containsNumbers = true; add(contactLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 0), 0, 0)); add(descriptionLabel, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); add(transferButton, new GridBagConstraints(2, 0, 1, 1, 1.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 0), 0, 0)); transferButton.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent mouseEvent) { if (actions.size() > 1) { JPopupMenu popupMenu = new JPopupMenu(); for (Action action : actions) { popupMenu.add(action); } popupMenu.show(transferButton, mouseEvent.getX(), mouseEvent.getY()); } else { Action action = actions.get(0); action.actionPerformed(null); } } }); } } @SuppressWarnings("unused") public String getNickname() { return name; } public String getWorkNumber() { return workNumber; } public String getHomeNumber() { return homeNumber; } public String getMobileNumber() { return mobileNumber; } } /** * Simple Action to handle selection of numbers. */ private class NumberAction extends AbstractAction { private static final long serialVersionUID = 1L; private String number; public NumberAction(String label, String number, Icon icon) { this.number = number; putValue(Action.NAME, "<html><b>" + label + "</b>  " + number + "</html>"); putValue(Action.SMALL_ICON, icon); } public void actionPerformed(ActionEvent e) { fireTransferListeners(number); } } public void sort(String text) { text = TelephoneUtils.removeInvalidChars(text); for (UserEntry entry : userEntries) { String home = TelephoneUtils.removeInvalidChars(entry.getHomeNumber()); if (home == null) { home = ""; } String work = TelephoneUtils.removeInvalidChars(entry.getWorkNumber()); if (work == null) { work = ""; } String mobileNumber = TelephoneUtils.removeInvalidChars(entry.getMobileNumber()); if (mobileNumber == null) { mobileNumber = ""; } boolean match = false; if (home.startsWith(text) || work.startsWith(text) || mobileNumber.startsWith(text)) { match = true; } entry.setVisible(match); } invalidate(); validate(); repaint(); } /** * Add a TransferListener. * * @param listener the listener. */ public void addTransferListener(TransferListener listener) { listeners.add(listener); } /** * Removes a TransferListener. * * @param listener the listener. */ public void removeTransferListener(TransferListener listener) { listeners.remove(listener); } /** * Notifies all TransferListeners that a number has been selected. */ public void fireTransferListeners(String number) { for (TransferListener listener : listeners) { listener.numberSelected(number); } } /** * Sorts RosterEntries */ final Comparator<RosterEntry> entryComparator = new Comparator<RosterEntry>() { public int compare(RosterEntry one, RosterEntry two) { final RosterEntry entryOne = one; final RosterEntry entryTwo = two; return entryOne.getName().toLowerCase().compareTo(entryTwo.getName().toLowerCase()); } }; public boolean hasTelephoneContacts(){ return containsNumbers; } }