transfergroupui.java

来自「开源项目openfire的完整源程序」· Java 代码 · 共 278 行

JAVA
278
字号
/**
 * $Revision: $
 * $Date: $
 *
 * Copyright (C) 2007 Jive Software. All rights reserved.
 *
 * This software is published under the terms of the GNU Lesser Public License (LGPL),
 * a copy of which is included in this distribution.
 */

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 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 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);
                        }
                    }
                });
            }


        }

        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 String number;

        public NumberAction(String label, String number, Icon icon) {
            this.number = number;
            putValue(Action.NAME, "<html><b>" + label + "</b>&nbsp;&nbsp;" + 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 entryComparator = new Comparator() {
        public int compare(Object one, Object two) {
            final RosterEntry entryOne = (RosterEntry)one;
            final RosterEntry entryTwo = (RosterEntry)two;
            return entryOne.getName().toLowerCase().compareTo(entryTwo.getName().toLowerCase());

        }
    };

    public boolean hasTelephoneContacts(){
        return containsNumbers;
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?