networkaddressselector.java

来自「java 开发的sip软电话 源码 jain sip」· Java 代码 · 共 233 行

JAVA
233
字号
package net.java.mais.plugin.addressselector;

import java.awt.Component;
import java.io.IOException;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;

import javax.swing.ImageIcon;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;

import net.java.mais.common.NetworkAddressManager;
import net.java.mais.common.Utils;

/**
 * <p>Title: SIP Communicator</p>
 * <p>Description: A SIP UA</p>
 * <p>Copyright: Copyright (c) 2004</p>
 * <p>Company: Network Research Team, Louis Pasteur University</p>
 * @author Emil Ivov
 * @version 1.0
 */

public class NetworkAddressSelector
{

    public NetworkAddressSelector()
    {
    }

    private static class TRenderer
        extends DefaultTreeCellRenderer
        implements TreeCellRenderer
    {

        /**
         * Sets the value of the current tree cell to <code>value</code>.
         *
         * @return the <code>Component</code> that the renderer uses to draw the
         *   value
         * @param tree JTree
         * @param value Object
         * @param selected boolean
         * @param expanded boolean
         * @param leaf boolean
         * @param row int
         * @param hasFocus boolean
         * @todo Implement this javax.swing.tree.TreeCellRenderer method
         */
        public Component getTreeCellRendererComponent(JTree tree, Object value,
            boolean selected, boolean expanded, boolean leaf, int row,
            boolean hasFocus)
        {
           try{

                DefaultTreeCellRenderer r = (DefaultTreeCellRenderer)super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);

                r.setIcon(
                    leaf
                    ? new ImageIcon(Utils.getResource("@.gif"))
                    : new ImageIcon(Utils.getResource("card.gif")));
                return r;
            }
            finally
            {
            }

        }

    }

    /**
     * The class is used to prevent the user from selecting anything else than
     * a network address.
     */
    private static class TsListener implements TreeSelectionListener
    {
        JTree tree = null;
        public TsListener(JTree tree)
        {
            this.tree = tree;
            tree.addTreeSelectionListener(this);
        }
        /**
         * valueChanged
         *
         * @param e TreeSelectionEvent
         */
        public void valueChanged(TreeSelectionEvent e)
        {
           try{
                TreePath path = e.getNewLeadSelectionPath();
                if(path != null
                   && path.getPathCount() > 0
                   && !((TreeNode)path.getLastPathComponent()).isLeaf())
                {
                    tree.removeTreeSelectionListener(this);
                    tree.setSelectionPath(e.getOldLeadSelectionPath());
                    tree.addTreeSelectionListener(this);
                }
            }
            finally
            {
            }
        }
    }


    /**
     * Creates a JTree containing local network interfaces as folders
     * and network addresses as leafs.
     * @throws IOException if we fail to extrace network addresses
     * @return JTree a JTree containing local network interfaces as folders
     * and network addresses as leafs.
     */
    public static JTree createAddressTree()
        throws IOException
    {
        return createAddressTree(true);
    }

    /**
     * Creates a JTree containing local network interfaces as folders
     * and network addresses as leafs.
     * @param includeOnlyRoutableAddresses indicates whether non-routable (localhost)
     * addresses should be included in the tree.
     * @throws IOException if we fail to extrace network addresses
     * @return JTree a JTree containing local network interfaces as folders
     * and network addresses as leafs.
     */
    public static JTree createAddressTree(boolean includeOnlyRoutableAddresses)
        throws IOException
    {
        try{
            Enumeration interfaces = NetworkInterface.getNetworkInterfaces();
            DefaultMutableTreeNode root = new DefaultMutableTreeNode();

            while (interfaces.hasMoreElements()) {
                NetworkInterface iface = (NetworkInterface) interfaces.
                    nextElement();

                NetworkInterfaceTreeNode ifaceNode = new NetworkInterfaceTreeNode(
                    iface, includeOnlyRoutableAddresses);
                if(ifaceNode.getChildCount() > 0)
                    root.add(ifaceNode);
            }

            JTree addressTree = new JTree(root);
            addressTree.setRootVisible(false);
            addressTree.setShowsRootHandles(true);

            for (int i = root.getChildCount() - 1; i >= 0; i--) {
                addressTree.expandRow(i);
            }

            TRenderer r = new TRenderer();
            new TsListener(addressTree);
            addressTree.setCellRenderer(r);
            addressTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);

            if(root.getChildCount() > 0 && root.getChildAt(0).getChildCount() > 0)
            {
                TreePath selection = new TreePath(new Object[]{root, root.getChildAt(0), root.getChildAt(0).getChildAt(0)});
                addressTree.setSelectionPath(selection);
            }


            return addressTree;
        }
        finally
        {
        }

    }

    /**
     *
     */
    public static void preselectAddress(JTree tree)
    {
        try {

            DefaultMutableTreeNode rootNode = (DefaultMutableTreeNode)
                                                    (tree.getModel().getRoot());

            NetworkAddressManager.start();
            InetAddress localhost = NetworkAddressManager.getLocalHost(false);
            NetworkAddressManager.shutDown();

            for(int i = 0; i < rootNode.getChildCount(); i++)
            {
                DefaultMutableTreeNode ifaceNode =
                    ((DefaultMutableTreeNode)rootNode.getChildAt(i));

                for (int j = 0; j < ifaceNode.getChildCount(); j++)
                {
                    DefaultMutableTreeNode addrNode = (DefaultMutableTreeNode)ifaceNode.getChildAt(j);
                    InetAddress addr = (InetAddress)addrNode.getUserObject();
                    if(localhost.equals(addr))
                    {
                        tree.setSelectionPath(new TreePath(new Object[] {
                            rootNode, ifaceNode, addrNode}));
                        break;
                    }
                }
            }

        }
        finally {
        }
    }

    public static void discoverUsableNetworkAddress(JTree tree)
    {
        try {

            /** @todo  implement */
        }
        finally {
        }
    }


}

⌨️ 快捷键说明

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