brxmltree.java

来自「java调用ie浏览器demo源码,可以用在windows或者linux」· Java 代码 · 共 327 行

JAVA
327
字号
/*

 * Copyright (C) 2008 Sun Microsystems, Inc. All rights reserved. Use is

 * subject to license terms.

 *

 * This program is free software; you can redistribute it and/or modify

 * it under the terms of the Lesser GNU General Public License as

 * published by the Free Software Foundation; either version 2 of the

 * License, or (at your option) any later version.

 *

 * This program is distributed in the hope that it will be useful, but

 * WITHOUT ANY WARRANTY; without even the implied warranty of

 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU

 * General Public License for more details.

 *

 * You should have received a copy of the GNU General Public License

 * along with this program; if not, write to the Free Software

 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307

 * USA.

 */



package org.jdic.web;



import org.w3c.dom.*;

import javax.swing.*;

import javax.swing.event.CellEditorListener;

import javax.swing.tree.TreeCellEditor;

import javax.swing.tree.TreeCellRenderer;

import javax.swing.tree.TreePath;

import java.awt.*;

import java.awt.event.MouseEvent;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.EventObject;



/**

 * The node button for XML tree document/node view.

 * @author uta

 */    

class BrXMLButton extends JPanel {

    protected static ImageIcon ico_element = new ImageIcon(BrXMLButton.class.getResource("images/img_element.png"));

    protected static ImageIcon ico_attribute = new ImageIcon(BrXMLButton.class.getResource("images/img_attribute.png"));

    protected static ImageIcon ico_text = new ImageIcon(BrXMLButton.class.getResource("images/img_cdata.png"));

    protected static ImageIcon ico_pi = new ImageIcon(BrXMLButton.class.getResource("images/img_pi.png"));

    protected static ImageIcon ico_document = new ImageIcon(BrXMLButton.class.getResource("images/img_root.png"));

    protected static ImageIcon ico_unknown = new ImageIcon(BrXMLButton.class.getResource("images/img_unknown.png"));

    protected static ImageIcon ico_comment = new ImageIcon(BrXMLButton.class.getResource("images/img_comment.png"));

    protected static ImageIcon ico_entity = new ImageIcon(BrXMLButton.class.getResource("images/img_entity.png"));





    public static Icon getIconForNodeType(Node n) {

        if (n instanceof Document)

            return ico_document;

        else if (n instanceof Element)

            return ico_element;

        else if (n instanceof Attr)

            return ico_attribute;

        else if (n instanceof Text)

            return ico_text;

        else if (n instanceof ProcessingInstruction)

            return ico_element;

        else if (n instanceof Comment)

            return ico_comment;

        else if (n instanceof Entity)

            return ico_entity;

        else if (n instanceof EntityReference)

            return ico_entity;

        else 

            return ico_unknown;

    }





    protected Node masterNode;

    JLabel lbNode = new JLabel();

    JButton bnNode = new JButton();



    public BrXMLButton(Node masterNode) {

        super(new BorderLayout());

        String fullText = masterNode.getNodeName();

        NamedNodeMap attrs = masterNode.getAttributes();

        if (attrs != null && attrs.getLength() > 0) {

            String as = "";            

            final int length = attrs.getLength();                    

            for( int i = 0; i < length; i++ ){

                Node attr = attrs.item(i);

                if( attr.getNodeName().equals("_uniqueID") ){

                    continue;

                }

                if( 0!=as.length() ){

                    as += ", ";

                }

                as += (attr.getNodeName() + "=\"" + attr.getNodeValue() + "\"");

            }

            if( 0!=as.length() ){

                fullText += " {" + as + "}";

            }    

        }

        //fullText += " path:" + BrXMLTree.getNodePath("", masterNode);

        int w = SwingUtilities.computeStringWidth(getFontMetrics(getFont()), fullText + " ");

        w = (120 * w) / 100;

        this.masterNode = masterNode;

        add(lbNode, BorderLayout.CENTER);

        add(bnNode, BorderLayout.WEST);



        bnNode.setPreferredSize(new Dimension(18, 18));

        lbNode.setPreferredSize(new Dimension(w, 18));

        bnNode.setIcon(getIconForNodeType(masterNode));

        lbNode.setText(fullText);



        short t = masterNode.getNodeType();

        String st = "";



        st = BrXMLTree.getNodeTypeName(t, st);



        bnNode.setToolTipText("<HTML>" + masterNode.getNodeName() + "<BR>" + st);



        bnNode.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                new BrXMLInfoNodeDialog(BrXMLButton.this.masterNode).setVisible(true);

            }

        });

    }

}



/**

 * The XML tree control in propery dialog for HTML document/node view.

 * @author uta

 */    

public class BrXMLTree extends JTree {



    public static String getNodeTypeName(short t, String st) {

        //TODO: make it localizable

        if(t == Node.ATTRIBUTE_NODE)

            st = "The node is an Attr.";

        else if(t == Node.CDATA_SECTION_NODE)

            st = "The node is a CDATASection";

        else if(t == Node.COMMENT_NODE)

            st = "The node is a Comment";

        else if(t == Node.DOCUMENT_FRAGMENT_NODE)

            st = "The node is a DocumentFragment";

        else if(t == Node.DOCUMENT_NODE)

            st = "The node is a Document.";

        else if(t == Node.DOCUMENT_POSITION_CONTAINED_BY)

            st = "The node is contained by the reference node.";

        else if(t == Node.DOCUMENT_POSITION_CONTAINS)

            st = "The node contains the reference node.";

        else if(t == Node.DOCUMENT_POSITION_DISCONNECTED)

            st = "The two nodes are disconnected.";

        else if(t == Node.DOCUMENT_POSITION_FOLLOWING)

            st = "The node follows the reference node";

        else if(t == Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC)

            st = "The determination of preceding versus following is implementation-specific.";

        else if(t == Node.DOCUMENT_POSITION_PRECEDING)

            st = "The node precedes the reference node.";

        else if(t == Node.DOCUMENT_TYPE_NODE)

            st = "The node is a DocumentType.";

        else if(t == Node.ELEMENT_NODE)

            st = "The node is an Element";

        else if(t == Node.ENTITY_NODE)

            st = "The node is an Entity.";

        else if(t == Node.ENTITY_REFERENCE_NODE)

            st = "The node is an EntityReference.";

        else if(t == Node.PROCESSING_INSTRUCTION_NODE)

            st = "The node is a ProcessingInstruction.";

        else if(t == Node.TEXT_NODE)

            st = "The node is a Text node.";

        return st;

    }

    

    public final static BrXMLTreeModel emptyTree = new BrXMLTreeModel(

            "<?xml version='1.0'?><empty_DOM_model></empty_DOM_model>"

    );

    

    public void empty()

    {

        setModel(emptyTree);  

    } 



    public BrXMLTree(BrXMLTreeModel newModel) {

        super(newModel);

        init();

    }





    public BrXMLTree(String  stXML) {

        this(new BrXMLTreeModel(stXML));

    }



    public BrXMLTree() {

        this(emptyTree);

    }



    public void setXMLSource(String  stXML){

        setModel(new BrXMLTreeModel(stXML));

    }

    

    void init(){

        setCellEditor( new TreeCellEditor() {

            public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row) {

                if (!(value instanceof Node)) return new JLabel(value.toString());

                return new BrXMLButton((Node) value);

            }



            public Object getCellEditorValue() {

                return null;

            }



            public boolean isCellEditable(EventObject anEvent) {

                if (anEvent instanceof MouseEvent) {

                    MouseEvent ev = (MouseEvent) anEvent;

                    return ev.getClickCount() == 2;

                }

                return false;

            }



            public boolean shouldSelectCell(EventObject anEvent) {

                return false;

            }



            public boolean stopCellEditing() {

                return false;

            }



            public void cancelCellEditing() {

            }



            public void addCellEditorListener(CellEditorListener l) {

            }



            public void removeCellEditorListener(CellEditorListener l) {

            }

        });



        setCellRenderer(new TreeCellRenderer() {

            public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {

                if (!(value instanceof Node)) {

                    JLabel jLabel = new JLabel(value.toString());

                    if (hasFocus || selected)

                        jLabel.setBorder(BorderFactory.createLineBorder(Color.RED, 1));

                    else

                        jLabel.setBorder(BorderFactory.createLineBorder(Color.WHITE, 1));

                    return jLabel;

                }



                BrXMLButton brXMLButton = new BrXMLButton((Node) value);



                if (hasFocus || selected)

                    brXMLButton.setBorder(BorderFactory.createLineBorder(Color.RED, 1));

                else

                    brXMLButton.setBorder(BorderFactory.createLineBorder(Color.WHITE, 1));

                return brXMLButton;

            }

        });

        setEditable(true);

    }





    @Override

    public String getToolTipText(MouseEvent e) {

        int selRow = getRowForLocation(e.getX(), e.getY());

        TreePath selPath = getPathForLocation(e.getX(), e.getY());

        if (selRow != -1) {

            Node org_node = (Node) selPath.getLastPathComponent();

            short t = org_node.getNodeType();

            String st = "";

            st = getNodeTypeName(t, st);

            st = "<HTML>" + org_node.getNodeName() + "<BR>" + st + "<BR>";

            if (org_node instanceof Text)

                return st + "\"" + createWrap(((Text) org_node).getTextContent()) + "\"";



            if (org_node instanceof Comment)

                return st + "<!--" + createWrap(((Comment) org_node).getNodeValue()) + "-->";



            if (org_node instanceof Element) {

                String h = "";

                Element element = (Element) org_node;

                NamedNodeMap atrs = element.getAttributes();

                for (int i = 0; i < atrs.getLength(); i++)

                    h += atrs.item(i).getNodeName() + " = \"" + createWrap(atrs.item(i).getNodeValue()) + "\"<BR>";

                h += "<TABLE BORDER=\"1\"><TR><TD align=\"CENTER\"><B>Value:</B></TD></TR><TR><TD>" + element.getTextContent() + "</TD></TR></TABLE>";

                return st + h;

            }

        }

        return null;

    }





    private String createWrap(String what) {

        StringBuffer buf = new StringBuffer();

        for (int i = 0; i < what.length(); i++) {

            if (i > 0 && i % 60 == 0)

                buf.append("<BR>");

            buf.append(what.charAt(i));

        }

        return buf.toString();

    }



    public static String getNodeTypeName(Node l_attr, String st) {

        return getNodeTypeName(l_attr.getNodeType(), st);

    }



    public static String getNodePath(String downPath, Node nd) {

        Node pr = nd.getParentNode();

        if(null==pr){

            return downPath;

        }

        int index = 0;

        for( 

            Node cld = pr.getFirstChild(); 

            null!=cld && !cld.equals(nd);

            cld = cld.getNextSibling()

        ){

            ++index;

        }

        if( 0!=downPath.length() ){

            downPath = "/" + downPath;

        }

        return getNodePath( index + downPath, pr);

    }

    

    public static String getNodePath(Node nd) {

        return getNodePath("", nd);

    }

    

    public static String getNodeTypeName(Node l_attr) {

        return getNodeTypeName(l_attr.getNodeType(), "");

    }

}

⌨️ 快捷键说明

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