⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bsbuddyfinderwindow.java

📁 一款即时通讯软件
💻 JAVA
字号:
package edu.ou.kmi.buddyspace.plugins.buddyfinder.gui;

/*
 * BSBuddyFinderWindow.java
 *
 * Project: BuddySpace
 * (C) Copyright Knowledge Media Institute 2005
 *
 */

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
import java.net.*;

import org.jabber.jabberbeans.*;
import org.jabber.jabberbeans.Extension.*;
import org.jabber.jabberbeans.util.*;

import edu.ou.kmi.buddyspace.core.*;
import edu.ou.kmi.buddyspace.gui.*;
import edu.ou.kmi.buddyspace.utils.*;
import edu.ou.kmi.buddyspace.plugins.buddyfinder.core.*;

/**
 *
 * @author  Chris Denham, Knowledge Media Institute, Open University, United Kingdom
 */
public class BSBuddyFinderWindow extends DockableWindow implements ActionListener, MouseListener {

    private BSBuddyFinderWinManager buddyFinderWinManager = null;
    private String jidStr;
    private String userid;

    private JPanel mainPanel;

    private BSBuddyFinderPanel finderPanel = new BSBuddyFinderPanel();

    private JPopupMenu jidPopupMenu = new JPopupMenu();
    private BSJIDActionMenuItem chatMenuItem = new BSJIDActionMenuItem("Chat");
    private BSJIDActionMenuItem msgMenuItem = new BSJIDActionMenuItem("Send Message");
    private JMenuItem presenceMenuItem = new JMenuItem();

    JPanel buttonPanel;
    JButton closeButton;
    JButton dockButton;

    /** Constructor */
    BSBuddyFinderWindow(Window parent, BSBuddyFinderWinManager winMan, String ID,
                   String title, String jidStr, Image icon, boolean docked) {

        super(ID, title, icon, new Dimension(450, 400), docked, winMan);

        this.jidStr = jidStr;
        userid = ((BSMainFrame)parent).username + "@" + ((BSMainFrame)parent).server;
        this.buddyFinderWinManager = winMan;
        finderPanel.setBuddyFinderWindow(this);
        finderPanel.results.addMouseListener(this);
        initComponents();

    }

    /** Returns icon for given presence (with emphasis as required) */
    protected Icon getIconForPresence(JID jid) {
        // *** what about people who are not in roster !!!
        BSPresenceInfo pi = getPresenceBean().getResourcePresence(jid);
        if (pi == null) pi = new BSPresenceInfo(jid, false, null, null);
        Icon icon = BSJIDLabel.getIconForPresence(pi);
        return icon;
    }

    public void buddyFinderResponse(Collection users)
    {

        // This is a very kludgy approach to directing results based on
        // first user record containing a particular string. Baaad!
        // (awaiting implementation of new XML packet type)
        Iterator i = users.iterator();
        if (i.hasNext())
        {
            String header = (String) i.next();
            String keysig = "keywords = ";
            if (header.startsWith(keysig)) {
                finderPanel.keywords.setText(header.substring(keysig.length()));
                return;
            }

            String querysig = "query = ";
            if (header.startsWith(querysig)) {
                String query = header.substring(querysig.length()).trim();
                if (!query.equals("null"))
                {
                    finderPanel.autogenQuery.setText(query);
                    finderPanel.testQuery.setText(query);
                }
                return;
            }

            if (header.equals("mode = automatic")) {
                finderPanel.autogenCheckBox.setSelected(true);
                return;
            }

            if (header.equals("mode = manual")) {
                finderPanel.autogenCheckBox.setSelected(false);
                return;
            }

            String urlsig = "URLs";
            if (header.startsWith(urlsig))
            {
                String urllist = header.substring(urlsig.length() + 1);
                finderPanel.URLs.setText(urllist);
                return;
            }

            if (header.startsWith("automatic url publishing")) return;

        }

        Vector jidList = new Vector();
        Iterator it = users.iterator();
        while (it.hasNext())
        {
            String user = (String)it.next();
            if (user.indexOf("@") == -1) continue;
            String nick = null;
            JID jid = new JID(user);
            if (getRosterBean() != null) nick = getRosterBean().getFriendlyName(jid);
            if (nick == null) nick = new StringTokenizer(jid.toString(), "@").nextToken();
            //System.out.println("{\"" + jid + "\",\"" + nick + "\"},");
            JLabel label = new BSJIDLabel(jid, nick, getIconForPresence(jid));
            label.setText(nick);
            label.setHorizontalAlignment(SwingConstants.LEFT);
            jidList.add(label);
        }

        finderPanel.results.setListData(jidList);

        if (jidList.size() == 0)
        {
            JOptionPane.showMessageDialog(this,
                "Sorry, no records matched the query.",
                "BuddyFinder",
                JOptionPane.INFORMATION_MESSAGE);
        }
    }

    /** Shows popup menu if supposed to */
    private void maybeShowPopup(MouseEvent e) {
        // if that was context popup event
        if (e.isPopupTrigger()) {
            Object src = e.getSource();
            JList list = (JList)src;
            Object item = list.getSelectedValue();
            if (item instanceof BSJIDLabel) {
                BSJIDLabel label = (BSJIDLabel)item;
                JID jid = label.getJID();

                chatMenuItem.setJID(jid);
                msgMenuItem.setJID(jid);

                BSPresenceInfo pi = getPresenceBean().getResourcePresence(jid);
                if (pi == null) pi = new BSPresenceInfo(jid, false, null, null);
                String status = pi.getStatus();
                if (status == null) status = "";
                presenceMenuItem.setText(pi.getFriendlyShow() + " - " + status);
                presenceMenuItem.setIcon(label.getIcon());

                jidPopupMenu.show(e.getComponent(), e.getX(), e.getY());
            }

        } //if(popup)
    }

    private void maybeOpenChatWindow(MouseEvent e) {
        JList list = (JList)e.getSource();
        Object o = list.getSelectedValue();
        if (o instanceof BSJIDLabel)
        {
            BSJIDLabel label = (BSJIDLabel)o;
            buddyFinderWinManager.openChat(label.getJID());
        }
    }

    /** <code>MouseListener</code> method - catches double-clicks */
    public void mouseClicked(MouseEvent e) {
        // handles only double clicks on JID nodes
        if ( e.getClickCount() == 2 ) {
             maybeOpenChatWindow(e);
        }
    }

    /** <code>MouseListener</code> method - catches popup-menu clicks */
    public void mousePressed(MouseEvent e) {
        if (!(e.getSource() instanceof JList)) return;
        JList list = (JList)e.getSource();
        int index = list.locationToIndex(e.getPoint());
        list.setSelectedIndex(index); // just making sure right-click selects too.
        maybeShowPopup(e);
    }

    /** <code>MouseListener</code> method - catches popup-menu clicks */
    public void mouseReleased(MouseEvent e) {
        maybeShowPopup(e);
    }

    /** <code>MouseListener</code> method - empty implementation */
    public void mouseEntered(MouseEvent e) { }
    /** <code>MouseListener</code> method - empty implementation */
    public void mouseExited(MouseEvent e) { }

    public BSBuddyFinderBean getBuddyFinderBean() {
        return buddyFinderWinManager.buddyFinderBean;
    }

    public BSRosterBean getRosterBean() {
        return buddyFinderWinManager.rosterBean;
    }

    public BSPresenceBean getPresenceBean() {
        return buddyFinderWinManager.presenceBean;
    }

    /** Inits GUI components */
    private void initComponents() {
        mainPanel = new JPanel(new BorderLayout());

        //*** button panel ***
        buttonPanel = new JPanel();

        closeButton = new JButton();
        closeButton.setText("Close");
        closeButton.addActionListener(this);
        buttonPanel.add(closeButton);

        JPanel checkBoxesPanel = new JPanel();

        Icon icon = new ImageIcon(ClassLoader.getSystemResource(!docked?
                                "images/dock.gif" : "images/float.gif"));
        dockButton = new JButton(icon);
        dockButton.setToolTipText(docked? "Float" : "Dock");
        dockButton.addActionListener(this);
        checkBoxesPanel.add(dockButton);
        if (!OSVersion.isJava1Point4orHigher())
            dockButton.setEnabled(false);

        finderPanel.JID.setText(userid);
        mainPanel.add(checkBoxesPanel, BorderLayout.NORTH);
        mainPanel.add(finderPanel, BorderLayout.CENTER);
        mainPanel.add(buttonPanel, BorderLayout.SOUTH);

        setLayout(new BorderLayout());
        add(mainPanel, BorderLayout.CENTER);

        jidPopupMenu.add(chatMenuItem);
        chatMenuItem.addActionListener(this);
        jidPopupMenu.add(msgMenuItem);
        msgMenuItem.addActionListener(this);
        jidPopupMenu.add(new JSeparator());
        jidPopupMenu.add(presenceMenuItem);

    }

    public boolean getSearchNames() {
        return 1 == this.finderPanel.searchoption.getSelectedIndex();
    }

    public boolean getShowOffline() {
        return this.finderPanel.showOffline.isSelected();
    }

    public String getKeywordSearch() {
        return this.finderPanel.keysearch.getText();
    }

    public void close()
    {
        super.close();
    }

    /** Handles actions from GUI controls */
    public void actionPerformed(ActionEvent evt) {
        Object source = evt.getSource();
        // close
        if (source == closeButton) {
            winMan.closeWindow(this);
        }
        else if (source == dockButton) {
            if (winMan != null) {
                winMan.setWindowDocked(this, !docked, true);
                Icon icon = new ImageIcon(ClassLoader.getSystemResource(!docked?
                                "images/dock.gif" : "images/float.gif"));
                dockButton.setIcon(icon);
                dockButton.setToolTipText(docked? "Float" : "Dock");
                winMan.selectWindow(this);
            }
        }
        else if (source == chatMenuItem) {
            buddyFinderWinManager.openChat(chatMenuItem.getJID());
        }
        else if (source == msgMenuItem) {
            buddyFinderWinManager.sendMessage(msgMenuItem.getJID());
        }

    }

    public void cancelListening() {
    }

}

⌨️ 快捷键说明

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