alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

/*
 *                 Sun Public License Notice
 * 
 * The contents of this file are subject to the Sun Public License
 * Version 1.0 (the "License"). You may not use this file except in
 * compliance with the License. A copy of the License is available at
 * http://www.sun.com/
 * 
 * The Original Code is NetBeans. The Initial Developer of the Original
 * Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
 * Microsystems, Inc. All Rights Reserved.
 */

package org.netbeans.modules.web.core.syntax;


import java.util.*;
import javax.swing.JList;
import javax.swing.JLabel;
import javax.swing.text.*;
import java.awt.Color;
import java.awt.Component;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

import javax.servlet.jsp.tagext.*;

import org.netbeans.editor.*;
import org.netbeans.editor.ext.CompletionQuery;
import org.openide.util.NbBundle;

/**
 *
 * @author  Petr Jiricka, Petr Nejedly
 */

/* ------------------------------------------------------------------------ */
/** An interface used as a generic value returned in CompletionQuery.Result
* as an data item
*/
class CompletionItem {
    
    public static class DelegatingResult implements CompletionQuery.Result {
        
        /** The List of the ResultItem instances - the content of the result */
        private List data;

        /** The title of the result */
        private String title;

        public DelegatingResult(String title) {
            data = new ArrayList();
            this.title = title;
        }
        
        public void addResult(CompletionQuery.Result result) {
            if (result == null)
                return;
            List newData = result.getData();
            for (int i = 0; i < newData.size(); i++) {
                data.add(new DelegatingResultItem(result, i));
            }
        }

        public List getData() {
            return data;
        }

        public String getTitle() {
            return title;
        }

        public boolean substituteText(int dataIndex, boolean shift) {
            DelegatingResultItem item = (DelegatingResultItem)getData().get(dataIndex);
            return item.getResult().substituteText(item.getIndex(), shift);
        }

        public boolean substituteCommonText(int dataIndex) {
            DelegatingResultItem item = (DelegatingResultItem)getData().get(dataIndex);
            return item.getResult().substituteCommonText(item.getIndex());
        }
    }
    
    static class DelegatingResultItem implements CompletionQuery.ResultItem {
        
        CompletionQuery.Result result;
        int index;
        CompletionQuery.ResultItem resultItem;
        
        public DelegatingResultItem(CompletionQuery.Result result, int index) {
            this.result = result;
            this.index = index;
            this.resultItem = (CompletionQuery.ResultItem)result.getData().get(index);
        }
        
        public CompletionQuery.Result getResult() {
            return result;
        }
        
        public int getIndex() {
            return index;
        }
        
        public boolean substituteCommonText( JTextComponent c, int offset, int len, int subLen ) {
            return resultItem.substituteCommonText(c, offset, len, subLen);
        }

        public boolean substituteText( JTextComponent c, int offset, int len, boolean shift ) {
            return resultItem.substituteText(c, offset, len, shift);
        }

        public String getItemText() {
            return resultItem.getItemText();
        }

        public Component getPaintComponent( JList list, boolean isSelected, boolean cellHasFocus) {
            return resultItem.getPaintComponent(list, isSelected, cellHasFocus);
        }
        
        public String toString() {
            if (resultItem instanceof JspResultItem)
                return resultItem.toString();
            else
                return resultItem.getItemText();
        }
        
    }
    
    
    static class JspResultItem extends CompletionQuery.DefaultResultItem {
        /** Contains a help for the item. It can be a url for a file. 
         */
        private String help;
            
        public JspResultItem( String text, Color foreColor ) {
            super( text, foreColor );
            help = null;
        }
        
        public JspResultItem( String text, Color foreColor, String help ) {
            super( text, foreColor );
            this.help = help;
        }
        
        /** Returns a url or null, if the help is not URL or the help is not defined.
         */
        public URL getHelpURL(){
            if (help == null || help.equals(""))
                return null;
            try{
                return new URL(help);
            }
            catch (java.io.IOException e){
            }
            return null;
        }
        
        /** Returns help for the item. It can be only url. If the item doesn't have a help
         *  than returns null. The class can overwrite this method and compounds the help realtime.
         */
        public String getHelp(){
            return help;
        }
        
        /** Returns whether the item has a help. 
         */
        public boolean hasHelp(){
            return (help != null && help.length() > 0);
        }
        
        public void setHelp(String help){
            this.help = help;
        }
        
        static JLabel rubberStamp1 = new JLabel();

        static {
            rubberStamp1.setOpaque( true );
        }
        
        private boolean isUrl(String text){
            try{
                new URL(text);
                return true;
            }
            catch (java.io.IOException e){
            }
            return false;
        }
        
        protected boolean substituteText( JTextComponent c, int offset, int len, String fill, int moveBack) {
            BaseDocument doc = (BaseDocument)c.getDocument();
            try {
                doc.atomicLock();
                try {
                    doc.remove( offset, len );
                    doc.insertString( offset, fill, null);
                } finally {
                    doc.atomicUnlock();
                }
                if (moveBack != 0) {
                    Caret caret = c.getCaret();
                    int dot = caret.getDot();
                    caret.setDot(dot - moveBack);
                }
            } catch( BadLocationException exc ) {
                return false;    //not sucessfull
            }
            return true;
        }
        
        
        public Component getPaintComponent( JList list, boolean isSelected, boolean cellHasFocus ) {
            rubberStamp1.setIcon(null);
            rubberStamp1.setText( " " + getPaintText() );   // NOI18N
            if (isSelected) {
                rubberStamp1.setBackground(list.getSelectionBackground());
                rubberStamp1.setForeground(list.getSelectionForeground());
            } else {
                rubberStamp1.setBackground(list.getBackground());
                rubberStamp1.setForeground( foreColor );
            }
            return rubberStamp1;
        }
        
        public String getPaintText() {
            return getItemText();
        }

        /*public String toString() {
            return getItemText();
        }*/
        
        
        
    }
    
    /** Item representing a JSP tag including its prefix. */
    static class PrefixTag extends JspResultItem {
        
        private TagInfo tagInfo;
        private boolean isEmpty = false;
        
        private boolean hasAttributes = false;
        
        PrefixTag( String text ) {
            super(text, Color.blue);
        }
        
        PrefixTag (String prefix, TagInfo ti, SyntaxElement.Tag set) {
            super(prefix + ":" + ti.getTagName (), Color.blue); // NOI18N
            tagInfo = ti;
            if ((tagInfo != null) &&
                (tagInfo.getBodyContent ().equalsIgnoreCase (TagInfo.BODY_CONTENT_EMPTY)))
                isEmpty = true;
            if (tagInfo != null)
                setHelp(tagInfo.getInfoString());
            
            //test whether this tag has some attributes
            if (set != null) hasAttributes = !(set.getAttributes().size() == 0);
        }
        
        PrefixTag (String prefix, TagInfo ti) {
            this(prefix, ti, (SyntaxElement.Tag)null);
        }
        
        public boolean hasHelp(){
            return true;
        }
        
        public TagInfo getTagInfo () {
            return tagInfo;
        }
        
        public String getHelp(){
            URL url = super.getHelpURL();
            if (url != null){
                String surl = url.toString();
                int first = surl.indexOf('#') + 1;
                String help = constructHelp(url);
                if (first > 0){
                    int last = surl.lastIndexOf('#') + 1;
                    String from = surl.substring( first , last - 1 );
                    String to = surl.substring(last); 
                    first = help.indexOf(from);
                    if (first > 0){
                        first = first + from.length() + 2;
                        if (first < help.length())
                            help = help.substring(first);
                    }
                    last = help.indexOf(to);
                    if (last > 0)
                        help = help.substring(0, last);
                    return help;
                }
                
                help = help.substring(help.indexOf("

")); //NOI18N help = help.substring(0, help.lastIndexOf("

"));//NOI18N return help; } return constructHelp(tagInfo); } public String getPaintText() { return "<" + getItemText() + (isEmpty? "/>": ">"); // NOI18N } public boolean substituteText( JTextComponent c, int offset, int len, boolean shift ) { String suffix = isEmpty? "/>": ">"; // NOI18N if(hasAttributes) suffix = ""; if (!getItemText ().startsWith ("/")) { // NOI18N if (!shift) return substituteText(c, offset, len, getItemText(), 0); // NOI18N boolean hasAttrs = true; if (tagInfo != null) { TagAttributeInfo[] tAttrs = tagInfo.getAttributes (); hasAttrs = (tAttrs != null)? (tAttrs.length > 0): true; } if (hasAttrs) return substituteText(c, offset, len, getItemText() + ( hasAttributes ? "" : " ") + suffix , suffix.length ()); // NOI18N else return substituteText(c, offset, len, getItemText() + suffix, 0); } else // closing tag return substituteText(c, offset, len, getItemText().substring (1) + ">", 0); // NOI18N } } /** Item representing a JSP tag (without prefix) or JSP directive. */ abstract static class TagDirective extends JspResultItem { TagDirective( String text ) { super(text, Color.blue); } public boolean substituteText( JTextComponent c, int offset, int len, boolean shift ) { return substituteText(c, offset, len, getItemText() + " ", 0); // NOI18N } } /** Item representing a JSP tag (without prefix). */ static class Tag extends TagDirective { Tag( String text ) { super(text); } public String getPaintText() { return "<" + getItemText() + ">"; // NOI18N } public boolean substituteText( JTextComponent c, int offset, int len, boolean shift ) { if (!getItemText ().startsWith ("/")) // NOI18N return substituteText(c, offset, len, getItemText() + " ", 0); // NOI18N else return substituteText(c, offset, len, getItemText().substring (1) + ">", 0); // NOI18N } public boolean substituteCommonText( JTextComponent c, int offset, int len, int subLen ) { if (!getItemText ().startsWith ("/")) { // NOI18N return substituteText(c, offset, len, getItemText().substring (subLen), 0); // NOI18N } else { return substituteText(c, offset, len, getItemText().substring (1, subLen), 0); // NOI18N } } } /** Item representing a JSP tag (without prefix). */ static class Directive extends TagDirective { TagInfo tagInfo; Directive (String text){ super(text); tagInfo = null; } Directive(String text, TagInfo tagInfo ) { super(text); this.tagInfo = tagInfo; if (tagInfo != null) setHelp(tagInfo.getInfoString()); } public String getHelp(){ if (getHelpURL() != null){ String text = constructHelp(getHelpURL()); text = text.substring(text.indexOf("

")); //NOI18N text = text.substring(0, text.lastIndexOf("

"));//NOI18N return text; } return constructHelp(tagInfo); } public TagInfo getTagInfo(){ return tagInfo; } public String getPaintText() { return "<%@" + getItemText()+"%>"; // NOI18N } public boolean substituteText( JTextComponent c, int offset, int len, boolean shift ) { return substituteText(c, offset, len, "%@" + getItemText() + " %>", 2); // NOI18N } public boolean substituteCommonText( JTextComponent c, int offset, int len, int subLen ) { len = len - 2; offset = offset + 2; return super.substituteCommonText(c, offset, len, subLen); } } static class Scriptlet extends TagDirective{ Scriptlet( String text ) { super(text); } public String getPaintText() { return "<%" + getItemText()+"%>"; // NOI18N } } /** Item representing an attribute of a JSP tag or directive. */ static class Attribute extends JspResultItem { Attribute( String text ) { super(text, Color.green.darker()); } Attribute (TagAttributeInfo tai) { super(tai.getName (), (tai.isRequired ())? Color.red: Color.green.darker()); setHelp(tai.getTypeName()); } public boolean substituteText( JTextComponent c, int offset, int len, boolean shift ) { if (shift) return substituteText(c, offset, len, getItemText() + "=\"\"", 1); // NOI18N else return substituteText(c, offset, len, getItemText() + "=\"\"", 0); // NOI18N } public String getHelp() { URL url = super.getHelpURL(); if (url != null){ String surl = url.toString(); int first = surl.indexOf('#') + 1; int last = surl.lastIndexOf('#') + 1; String from = surl.substring( first , last - 1 ); String to = surl.substring(last); String text = constructHelp(getHelpURL()); first = text.indexOf(from); if (first > 0){ first = first + from.length() + 2; if (first < text.length()) text = text.substring(first); } last = text.indexOf(to); if (last > 0) text = text.substring(0, last); return text; } return super.getHelp(); } public URL getHelpURL(){ URL url = super.getHelpURL(); if (url != null){ String surl = url.toString(); int index = surl.lastIndexOf('#'); // NOI18N if (index > 0) surl = surl.substring(0, index); try { url = new URL(surl); } catch (MalformedURLException e){ } } return url; } } /** Item representing a JSP attribute value. */ static class AttributeValue extends JspResultItem { AttributeValue( String text ) { super(text, Color.red); } public boolean substituteText( JTextComponent c, int offset, int len, boolean shift ) { return substituteText(c, offset, len, getItemText(), 0); } } /** Item representing a File attribute */ static class FileAttributeValue extends JspResultItem { private javax.swing.ImageIcon icon; FileAttributeValue(String text, Color color){ super (text, color); icon = null; } FileAttributeValue(String text, Color color, javax.swing.ImageIcon icon){ super (text, color); this.icon = icon; } public boolean substituteText( JTextComponent c, int offset, int len, boolean shift ) { return substituteText(c, offset, len, getItemText(), 0); } public Component getPaintComponent( JList list, boolean isSelected, boolean cellHasFocus ) { if (icon != null) rubberStamp1.setIcon(icon); rubberStamp1.setText( " " + getPaintText() ); // NOI18N if (isSelected) { rubberStamp1.setBackground(list.getSelectionBackground()); rubberStamp1.setForeground(list.getSelectionForeground()); } else { rubberStamp1.setBackground(list.getBackground()); rubberStamp1.setForeground( foreColor ); } return rubberStamp1; } } private static String constructHelp (URL url){ if (url == null ) return null; try{ InputStream is = url.openStream(); byte buffer[] = new byte[1000]; ByteArrayOutputStream baos = new ByteArrayOutputStream(); int count = 0; do { count = is.read(buffer); if (count > 0) baos.write(buffer, 0, count); } while (count > 0); is.close(); String text = baos.toString(); baos.close(); return text; } catch (java.io.IOException e){ return null; } } private static String constructHelp (TagInfo tagInfo){ if (tagInfo == null) return null; StringBuffer sb = new StringBuffer (); sb.append ("

").append(getString("LBL_TagName")).append(" "); //NOI18N sb.append (tagInfo.getTagName()).append("

"); // NOI18N String val = tagInfo.getDisplayName (); if (val != null) { sb.append ("

").append(getString("LBL_DisplayName")); //NOI18N sb.append("").append (val).append(""); // NOI18N } val = tagInfo.getInfoString(); if (val != null) sb.append ("


").append (val).append("
"); // NOI18N sb.append("");// NOI18N sb.append("");// NOI18N sb.append("
");// NOI18N sb.append("Tag Information
Tag Class");// NOI18N if (tagInfo.getTagClassName() != null && !tagInfo.getClass().equals("") ) sb.append(tagInfo.getTagClassName()); else sb.append("None");// NOI18N sb.append("
Body Content");// NOI18N sb.append(tagInfo.getBodyContent()); sb.append("
Display Name");// NOI18N if (tagInfo.getDisplayName() != null && !tagInfo.getDisplayName().equals("")){ sb.append(tagInfo.getDisplayName()); } else sb.append("None");// NOI18N sb.append("

");// NOI18N sb.append("");// NOI18N sb.append("");// NOI18N TagAttributeInfo [] attrs = tagInfo.getAttributes(); if (attrs != null && attrs.length > 0){ sb.append("");// NOI18N for (int i = 0; i < attrs.length; i++){ sb.append(""); // NOI18N } } else { sb.append("");// NOI18N } sb.append("
Attributes
NameRequiredRequest-time
"); // NOI18N sb.append(attrs[i].getName()); sb.append(""); // NOI18N sb.append(attrs[i].isRequired()); sb.append(""); // NOI18N sb.append(attrs[i].canBeRequestTime()); sb.append("
No Attributes Defined.

");// NOI18N sb.append("");// NOI18N sb.append("");// NOI18N TagVariableInfo [] variables = tagInfo.getTagVariableInfos(); if (variables != null && variables.length > 0){ sb.append("");// NOI18N for (int i = 0; i < variables.length; i++){ sb.append(""); // NOI18N sb.append(""); // NOI18N sb.append(""); // NOI18N } } else { sb.append("");// NOI18N } sb.append("
Variables
NameTypeDeclareScope
"); // NOI18N if (variables[i].getNameGiven() != null && !variables[i].getNameGiven().equals("")){// NOI18N sb.append(variables[i].getNameGiven()); } else { if(variables[i].getNameFromAttribute() != null && !variables[i].getNameFromAttribute().equals("")) // NOI18N sb.append("From attribute '").append(variables[i].getNameFromAttribute()).append("'");// NOI18N else sb.append("Unknown"); // NOI18N } sb.append(""); // NOI18N if (variables[i].getClassName() == null || variables[i].getClassName().equals("") ) sb.append("java.lang.String");// NOI18N else sb.append(variables[i].getClassName()); sb.append("
"); // NOI18N sb.append(variables[i].getDeclare()); sb.append("
"); // NOI18N switch (variables[i].getScope()){ case VariableInfo.AT_BEGIN: sb.append("AT_BEGIN"); break;// NOI18N case VariableInfo.AT_END: sb.append("AT_END"); break;// NOI18N default: sb.append("NESTED");// NOI18N } sb.append("
No Variables Defined.

");// NOI18N return sb.toString(); } private static String getString(String key){ return NbBundle.getMessage(CompletionItem.class, key); } }
... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.