view src/main/resources/org/ssdt_ohio/gradle/userdoc/templates/classDocName.html @ 23:e2d02e8742be

usasr-1307: for render tables for properties and reportable properties with label and group names
author smith@nwoca.org
date Wed, 16 Mar 2016 23:24:26 +0100
parents e8e14d5d6be2
children
line wrap: on
line source
<!--

     Licensed to the Apache Software Foundation (ASF) under one
     or more contributor license agreements.  See the NOTICE file
     distributed with this work for additional information
     regarding copyright ownership.  The ASF licenses this file
     to you under the Apache License, Version 2.0 (the
     "License"); you may not use this file except in compliance
     with the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing,
     software distributed under the License is distributed on an
     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
     KIND, either express or implied.  See the License for the
     specific language governing permissions and limitations
     under the License.

-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- **************************************************************** -->
<!-- *  PLEASE KEEP COMPLICATED EXPRESSIONS OUT OF THESE TEMPLATES, * -->
<!-- *  i.e. only iterate & print data where possible. Thanks, Jez. * -->
<!-- **************************************************************** -->
<%

    classDoc = props.get('userdocHelper').wrap(classDoc)

    def title = classDoc.name() + (props.docTitle ? " (${props.docTitle})" : "")
    def isVisible = { it.isPublic() || (it.isProtected() && props.protectedScope == 'true') || (!it.isProtected() && !it.isPrivate() && props.packageScope == 'true') || props.privateScope == 'true' }
    def isVisibleExt = { t -> java.lang.reflect.Modifier.isPublic(t.modifiers) || java.lang.reflect.Modifier.isProtected(t.modifiers) }
    def visibleFields = classDoc.fields().findAll(isVisible)
    def visibleProperties = classDoc.properties() // props visible be def
    def visibleMethods = classDoc.methods().findAll(isVisible)
    def getterMethods = visibleMethods.findAll { it.name().startsWith('get') }
    def nonGetterMethods = visibleMethods - getterMethods

    def visibleConstructors = classDoc.constructors().findAll(isVisible)
    def visibleNested = classDoc.innerClasses().findAll(isVisible)
    boolean hasFields = !classDoc.isAnnotationType() && visibleFields
    boolean hasProperties = !classDoc.isAnnotationType() && visibleProperties
    boolean hasElements = classDoc.isAnnotationType() && visibleFields
    boolean methodSummaryShown = visibleMethods
    boolean fieldSummaryShown = hasFields
    boolean hasEnumConstants = classDoc.enumConstants()
    def dolink = { t, boolean b ->
        boolean isArray = false
        if (!t || t instanceof String) {
            return classDoc.getDocUrl(t, b)
        }
        if (t instanceof org.codehaus.groovy.tools.groovydoc.ArrayClassDocWrapper) {
            t = t.delegate
            isArray = true
        }
        if (t instanceof org.codehaus.groovy.tools.groovydoc.SimpleGroovyClassDoc) {
            if (t.fullPathName == 'def') return classDoc.getDocUrl("java.lang.Object def", b)
            if (!t.qualifiedTypeName().contains("<") && t.name().size() > 1)
                return "<a href='" + classDoc.relativeRootPath + t.fullPathName + ".html'>" + (b ? t.qualifiedTypeName() : t.name()) + "</a>" + (isArray ? "[]" : "")
        }
        return classDoc.getDocUrl(t.qualifiedTypeName(), b) + (isArray ? "[]" : "")
    }
    def linkfull = { t -> dolink(t, true) - "java.lang." - "java.util." }
    def linkable = { t -> dolink(t, false) - "java.lang." - "java.util." }
    def modifiersWithIgnore = { t, boolean ignorePublic ->
        (t.isPrivate()?"private&nbsp;":"") +
        (t.isPublic() && !ignorePublic?"public&nbsp;":"") +
        (t.isProtected()?"protected&nbsp;":"") +
        (t.isStatic()?"static&nbsp;":"") +
        (t.isFinal()?"final&nbsp;":"") +
        (t.respondsTo('isAbstract') && t.isAbstract()?"abstract&nbsp;":"")
    }
    def modifiers = { t -> modifiersWithIgnore(t, classDoc.isGroovy()) }
    def modifiersBrief = { t ->
        (t.isPrivate()?"private&nbsp;":"") +
        (t.isProtected()?"protected&nbsp;":"") +
        (t.isStatic()?"static&nbsp;":"")
    }
    def annotations = { t, sepChar ->
        t.annotations() ? t.annotations().collect{it.isTypeAvailable()?'@'+linkable(it.type().name())+(it.description()-('@'+it.type().name())):it.description()}.join(sepChar) + sepChar : ''
    }
    def elementTypes = [
        "required":"true",
        "optional":"false"
    ]
    def isRequired = { f, v -> def req = f.constantValueExpression() == null; req.toString() == v }
    def upcase = { n -> n[0].toUpperCase() + n[1..-1] }
    def lowcase = { n -> n ? n[0].toLowerCase() + n[1..-1] : "" }
    def paramsOf = { n, boolean brief -> n.parameters().collect{ param -> (brief?'':annotations(param, ' ')) + linkable(param.isTypeAvailable()?param.type():param.typeName()) + (param.vararg()?'... ':' ') + param.name() + (param.defaultValue() ? " = " + param.defaultValue():"") }.join(", ") }
    def nameFromParams = { n -> n.name() + '(' + n.parameters().collect{ param -> param.isTypeAvailable()?param.type().qualifiedTypeName():param.typeName() }.join(', ') + ')' }
    def nameFromJavaParams = { n -> n.name + '(' + n.parameterTypes.collect{ param -> param.name }.join(', ') + ')' }
    def asPropertyName = { lowcase(it - 'get') }
%>
<html>
<head>
    <!-- Generated by groovydoc (${GroovySystem.version}) on ${new Date()} -->
    <title>${title}</title>
    <meta name="date" content="${new Date().format('yyyy-MM-dd')}">
    <meta http-equiv="Content-Type" content="text/html; charset=${props.charset}">
    <link href="${classDoc.relativeRootPath}groovy.ico" type="image/x-icon" rel="shortcut icon">
    <link href="${classDoc.relativeRootPath}groovy.ico" type="image/x-icon" rel="icon">
    <link rel="stylesheet" type="text/css" href="${classDoc.relativeRootPath}stylesheet.css" title="Style">

<body class="center">
<script type="text/javascript"><!--
if (location.href.indexOf('is-external=true') == -1) {
    parent.document.title="${title}";
}
//-->
</script>
<noscript>
    <div>JavaScript is disabled on your browser.</div>
</noscript>
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar_top">
    <!--   -->
</a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
    <!--   -->
</a>
    <ul class="navList" title="Navigation">
        <li><a href="${classDoc.relativeRootPath}overview-summary.html">Overview</a></li>
        <li><a href="package-summary.html">Package</a></li>
        <li class="navBarCell1Rev">Class</li>
        <li><a href="${classDoc.relativeRootPath}deprecated-list.html">Deprecated</a></li>
        <li><a href="${classDoc.relativeRootPath}index-all.html">Index</a></li>
        <li><a href="${classDoc.relativeRootPath}help-doc.html">Help</a></li>
    </ul>
</div>

<div class="subNav">
    <div>
        <ul class="navList">
            <li><a href="${classDoc.relativeRootPath}index.html?${classDoc.fullPathName}" target="_top">Frames</a></li>
            <li><a href="${classDoc.name()}.html" target="_top">No Frames</a></li>
        </ul>
    </div>
    <div>
        <ul class="subNavList">
            <li>Summary:&nbsp;</li>
            <%
    if (classDoc.isAnnotationType()) {
        def hasReq = classDoc.fields().any{ isRequired(it, "true") }
        def hasOpt = classDoc.fields().any{ isRequired(it, "false") }
        if (hasReq) { %><li><a href="#required_element_summary"><% } %>Required<% if (hasReq) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
        if (hasOpt) { %><li><a href="#optional_element_summary"><% } %>Optional<% if (hasOpt) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
    } else {
        if (visibleNested) { %><li><a href="#nested_summary"><% } %>Nested<% if (visibleNested) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
        if (classDoc.isEnum()) {
            if (hasEnumConstants) { %><li><a href="#enum_constant_summary"><% } %>Enum constants<% if (hasEnumConstants) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
        }
        if (hasFields) { %><li><a href="#field_summary"><% } %>Field<% if (hasFields) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
        if (hasProperties) { %><li><a href="#property_summary">Property</a></li><% } %>&nbsp;&nbsp;&nbsp;<%
        if (classDoc.isClass()) {
            if (visibleConstructors) { %><li><a href="#constructor_summary"><% } %>Constructor<% if (visibleConstructors) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
        }
        if (visibleMethods) { %><li><a href="#method_summary"><% } %>Method<% if (visibleMethods) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
    }
    %>
        </ul>
        <ul class="subNavList">
            <li>&nbsp;|&nbsp;Detail:&nbsp;</li>
            <%
            if (classDoc.isAnnotationType()) {
                if (hasElements) { %><li><a href="#element_detail"><% } %>Element<% if (hasElements) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
            } else {
                if (classDoc.isEnum()) {
                    if (hasEnumConstants) { %><li><a href="#enum_constant_detail"><% } %>Enum constants<% if (hasEnumConstants) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
                }
                if (hasFields) { %><li><a href="#field_detail"><% } %>Field<% if (hasFields) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
                if (hasProperties) { %><li><a href="#prop_detail">Property</a></li><% } %>&nbsp;&nbsp;&nbsp;<%
                if (classDoc.isClass()) {
                    if (visibleConstructors) { %><li><a href="#constructor_detail"><% } %>Constructor<% if (visibleConstructors) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
                }
                if (visibleMethods) { %><li><a href="#method_detail"><% } %>Method<% if (visibleMethods) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
            }
            %>
        </ul>
    </div>
    <a name="skip-navbar_top">
        <!--   -->
    </a></div>
<!-- ========= END OF TOP NAVBAR ========= -->

<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<%
def pkg = classDoc.containingPackage().nameWithDots()
String classDesc = "${classDoc.typeDescription} ${org.codehaus.groovy.tools.groovydoc.SimpleGroovyClassDoc.encodeAngleBrackets(classDoc.getNameWithTypeArgs())}"
if (pkg != "DefaultPackage") {
%>
    <div class="subTitle">Package: <strong>${pkg}</strong></div>
<%}%>
    <h2 title="${classDesc}" class="title">${classDesc}
    <% if (classDoc.superclass()) { %>  extends ${linkable(classDoc.superclass())} <% } %>
    </h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<%
def parents = classDoc.isInterface() ? classDoc.parentInterfaces : classDoc.parentClasses
if (parents.size() >= 2) {
    parents.eachWithIndex { p, i ->
        %><li><%
        if ( i == parents.size() - 1) {
            out << p.qualifiedTypeName()
        } else {
            %><ul class="inheritance"><% linkfull(p) %></ul></li><%
        }
    }
}
%>
</ul>
<div class="description">
    <ul class="blockList">
        <li class="blockList">
<%
if (classDoc.isInterface()) {
    Set interfaces = classDoc.parentInterfaces
    interfaces -= classDoc
    if (interfaces) {
        %>
            <dl>
                <dt>All Superinterfaces:</dt>
                <dd>${interfaces.collect{ linkable(it) }.join(', ')}</dd>
            </dl><%
    }
} else {
    // TODO follow up the tree collecting interfaces seen?
    def interfaces = classDoc.interfaces()
    if (interfaces) {
        %>
            <dl>
                <dt>All Implemented Interfaces and Traits:</dt>
                <dd>${interfaces.collect{ linkable(it) }.join(', ')}</dd>
            </dl>
            <!-- todo: direct known subclasses -->
            <hr>
            <br>
<div>
${ annotations(classDoc, '<br/>')}
</div>
<pre>${modifiers(classDoc) + classDoc.typeSourceDescription + ' ' + classDoc.name()}
<% if (classDoc.isInterface() && classDoc.interfaces()) {%>extends ${classDoc.interfaces().collect{ linkable(it) }.join(', ')}
<% } else if (classDoc.superclass()) { %>extends ${linkable(classDoc.superclass())}
<% } %>
</pre>
<% } %>
<% } %>
<% if (classDoc.commentText()) { %>
    <p>${classDoc.commentText()}</p>
<% } %>
      </li>
    </ul>
</div>

<div class="summary">
    <ul class="blockList">
        <li class="blockList">
        <!-- =========== NESTED CLASS SUMMARY =========== -->
        <% if (visibleNested) { %>
            <ul class="blockList">
                <li class="blockList"><a name="nested_summary"><!--   --></a>
                    <h3>Nested Class Summary</h3>
                    <ul class="blockList">
                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Nested Class Summary table, listing nested classes, and an explanation">
                        <caption><span>Nested classes</span><span class="tabEnd">&nbsp;</span></caption>
                        <tr>
                            <th class="colFirst" scope="col">Modifiers</th>
                            <th class="colLast" scope="col">Name</th>
                            <th class="colLast" scope="col">Description</th>
                        </tr>
                        <% visibleNested.eachWithIndex { c, i -> %>
                        <tr class="${i%2==0?'altColor':'rowColor'}">
                            <td class="colFirst"><code><strong>${modifiersBrief(c) + c.typeSourceDescription}</strong></code>&nbsp;</td>
                            <td class="colLast"><code>${linkable(c)}</code></td>
                            <td class="colLast">${c.firstSentenceCommentText()}</code></td>
                        </tr>
                        <% } %>
                    </table>
                   </ul>
                </li>
            </ul>
        <% } %>

        <!-- =========== ENUM CONSTANT SUMMARY =========== -->
        <% if (hasEnumConstants) { %>
            <ul class="blockList">
                <li class="blockList"><a name="enum_constant_summary"><!--   --></a>
                    <h3>Enum Constants Summary</h3>
                    <ul class="blockList">
                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Enum constants summary table">
                        <caption><span>Enum constants classes</span><span class="tabEnd">&nbsp;</span></caption>
                        <tr>
                            <th class="colFirst" scope="col">Enum constant</th>
                            <th class="colLast" scope="col">Description</th>
                        </tr>
                        <% classDoc.enumConstants().eachWithIndex { ec, i -> %>
                        <tr class="${i%2==0?'altColor':'rowColor'}">
                            <td class="colFirst"><code><strong><a href="#${ec.name()}">${ec.name()}</a></strong></code></td>
                            <td class="colLast">${ec.firstSentenceCommentText()}</td>
                        </tr>
                        <% } %>
                    </table>
                   </ul>
                </li>
            </ul>
        <% } %>
        <!-- =========== FIELD SUMMARY =========== -->
        <%
        def buffer = new StringBuilder()
        classes = []
        if (classDoc.isInterface()) {
            classes.addAll(classDoc.interfaces().toList())
        } else {
            if (classDoc.superclass()) classes += classDoc.superclass()
            else classes += new org.codehaus.groovy.tools.groovydoc.ExternalGroovyClassDoc(Object.class)
        }
        visited = [classDoc] as Set
        while (classes) {
            Set nextLevel = []
            classes.eachWithIndex { c,i ->
                if (c.isInterface()) nextLevel.addAll(c.interfaces().toList())
                else if (c.superclass() && c.qualifiedTypeName() != 'java.lang.Object') nextLevel += c.superclass()
                nextLevel -= visited
                visited += nextLevel
                def list = []
                if (c instanceof org.codehaus.groovy.tools.groovydoc.SimpleGroovyClassDoc) {
                    list = c.fields().findAll(isVisible).collect { field ->
                        "<a href='${classDoc.relativeRootPath}${c.fullPathName}.html#${field.name()}'>${field.name()}</a>"
                    }
                } else {
                    list = c.externalClass().fields.findAll{ isVisibleExt(it) }.collect { field ->
                        // "<a href='${classDoc.relativeRootPath}${c.fullPathName}.html#${field.name()}'>${field.name()}</a>"
                        field.name
                    }
                }
                if (list) {
                    buffer << """                        <tr class="${i%2==0?'altColor':'rowColor'}">
                            <td class="colFirst"><strong><code>${c.typeSourceDescription} ${linkable(c)}</code></strong></td>
                            <td class="colLast"><code>${list.join(', ')}</code></td>
                        </tr>
"""
                }
            }
            classes = nextLevel
        }


        if (hasFields || buffer.length()>0) { %>
            <ul class="blockList"><%
                if (hasFields) { %>
                <li class="blockList"><a name="field_summary"><!--   --></a>
                    <h3>Field Summary</h3>
                    <ul class="blockList">
                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Enum constants summary table">
                        <caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
                        <tr>
                            <th class="colFirst" scope="col">Modifiers</th>
                            <th class="colLast" scope="col">Name</th>
                            <th class="colLast" scope="col">Description</th>
                        </tr>
                        <% visibleFields.eachWithIndex { field, i -> %>
                        <tr class="${i%2==0?'altColor':'rowColor'}">
                            <td class="colFirst"><code><strong>${modifiersBrief(field) + linkable(field.type())}</strong></code>&nbsp;</td>
                            <td class="colLast"><code><a href="#${field.name()}">${field.name()}</a></code></td>
                            <td class="colLast">${field.firstSentenceCommentText()}</code></td>
                        </tr>
                        <% } %>
                    </table>
                   </ul>
                </li>
                <% } // if (hasFields)
                if ((buffer.length())>0) { %>
                <li class="blockList"><a name="field_summary"><!--   --></a>
                    <ul class="blockList">
                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Inherited fields summary table">
                        <caption><span>Inherited fields</span><span class="tabEnd">&nbsp;</span></caption>
                        <tr>
                            <th class="colFirst" scope="col">Fields inherited from class</th>
                            <th class="colLast" scope="col">Fields</th>
                        </tr>
                        ${buffer}
                    </table>
                    </ul>
                </li>
                <% } // if buffer %>
            </ul>
        <% } // if hasFields or buffer %>

        <!-- =========== PROPERTY SUMMARY =========== -->
        <% if (hasProperties) { %>
         <ul class="blockList">
                <li class="blockList"><a name="property_summary"><!--   --></a>
                    <h3>Properties Summary</h3>
                    <ul class="blockList">
                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Properties Summary table, listing nested classes, and an explanation">
                        <caption><span>Properties</span><span class="tabEnd">&nbsp;</span></caption>
                        <tr>
                            <th class="colFirst" scope="col">Name</th>
                            <th class="col" scope="col">Type</th>
                            <th class="col" scope="col">Label</th>
                            <th class="col" scope="col">Group</th>
                            <th class="colLast" scope="col">Description</th>
                        </tr>
                        <% visibleProperties.eachWithIndex { prop, i -> %>
                        <tr class="${i%2==0?'altColor':'rowColor'}">
                            <td class="colFirst"><code><a href="#${prop.name()}">${prop.name()}</a></code></td>
                            <td class="col"><code><strong>${modifiersBrief(prop) + linkable(prop.type())}</strong></code>&nbsp;</td>
                            <td class="col"> ${classDoc.getLabel(prop)} </td>
                            <td class="col"> ${classDoc.getGroup(prop)} </td>
                            <td class="colLast">${prop.firstSentenceCommentText()}</td>
                        </tr>
                        <% } %>
                    </table>
                   </ul>
                </li>
            </ul>
        <% } %>

        <!-- =========== ELEMENT SUMMARY =========== -->
        <% if (hasElements) { %>
        <ul class="blockList"><a name="element_summary"><!--   --></a>
                <li class="blockList">
                    <h3>Element Summary</h3>
                    <% elementTypes.each { k, v ->
                    %><a name="${k}_element_summary"><!--   --></a><%
                        if (visibleFields.any{ isRequired(it, v) }) {  %>
                    <ul class="blockList">
                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="${upcase(k)} Element Summary table">
                        <caption><span>${upcase(k)} Element Summary</span><span class="tabEnd">&nbsp;</span></caption>
                        <tr>
                            <th class="colFirst" scope="col">Type</th>
                            <th class="colLast" scope="col">Name and Description</th>
                        </tr>
                        <% visibleFields.findAll {isRequired(it, v)}.eachWithIndex { element, i -> %>
                        <tr class="${i%2==0?'altColor':'rowColor'}">
                            <td class="colFirst"><code><strong>${modifiersBrief(element) + linkable(element.type())}</strong></code>&nbsp;</td>
                            <td class="colLast"><code><a href="#${element.name()}">${element.name()}</a></code><br>${element.firstSentenceCommentText()}</td>
                        </tr>
                        <% } %>
                    </table>
                   </ul>
                   <% }
                   } //elementTypes.each %>
                </li>
        </ul>
        <% } %>

        <% if (visibleConstructors) { %>
        <!-- ======== CONSTRUCTOR SUMMARY ======== -->
        <ul class="blockList">
                <li class="blockList"><a name="constructor_summary"><!--   --></a>
                    <h3>Constructor Summary</h3>
                    <ul class="blockList">
                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructors Summary table">
                        <caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
                        <tr>
                            <th class="colFirst" scope="col">Constructor and description</th>
                        </tr>
                        <% visibleConstructors.eachWithIndex { constructor, i -> %>
                        <tr class="${i%2==0?'altColor':'rowColor'}">
                            <td class="colFirst">
                                <code>${modifiersBrief(constructor)}<a href="#${nameFromParams(constructor)}">${constructor.name()}</a></strong>
                                (${paramsOf(constructor, true)})</code><br>${constructor.firstSentenceCommentText()}</td>
                        </tr>
                        <% } %>
                    </table>
                   </ul>
              </li>
        </ul>
        <% } %>

        <%
        buffer = new StringBuilder()
        Set classes = []
        if (classDoc.isInterface()) {
            classes.addAll(classDoc.interfaces().toList())
        } else {
            if (classDoc.superclass()) classes += classDoc.superclass()
            else if (!classDoc.isTrait()) classes += new org.codehaus.groovy.tools.groovydoc.ExternalGroovyClassDoc(Object.class)
        }
        Set visited = [classDoc] as Set
        while (classes) {
            Set nextLevel = []
            classes.eachWithIndex { c,i ->
                if (c.isInterface()) nextLevel.addAll(c.interfaces().toList())
                else if (c.superclass() && c.qualifiedTypeName() != 'java.lang.Object') nextLevel += c.superclass()
                nextLevel -= visited
                visited += nextLevel
                def list = []
                if (c instanceof org.codehaus.groovy.tools.groovydoc.SimpleGroovyClassDoc) {
                    list = c.methods().findAll(isVisible).collect { method ->
                        "<a href='${classDoc.relativeRootPath}${c.fullPathName}.html#${nameFromParams(method)}'>${method.name()}</a>"
                    }
                } else {
                    list = c.externalClass().methods.findAll{ isVisibleExt(it) }.collect { method ->
                        linkable(c.externalClass().name + "#" + nameFromJavaParams(method) + " " + method.name)
                    }
                }
                if (list) {
                    buffer << """
                        <tr class="${i%2==0?'altColor':'rowColor'}">
                            <td class="colFirst"><code>${c.typeSourceDescription} ${linkable(c)}</strong></code></td>
                            <td class="colLast"><code>${list.join(', ')}</code></td>
                        </tr>"""
                }
            }
            classes = nextLevel
        }

        if (visibleMethods || buffer.length()>0) { %>
        <!-- ========== METHOD SUMMARY =========== -->
        <ul class="blockList">
            <% if (getterMethods) { %>
            <li class="blockList"><a name="method_summary"><!--   --></a>
                <h3>Reportable Properties Summary</h3>
                <ul class="blockList">
                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Reportable Properties Summary table">
                        <caption><span>Reportable Properties</span><span class="tabEnd">&nbsp;</span></caption>
                        <tr>
                            <th class="colFirst" scope="col">Name</th>
                            <th class="col" scope="col">Type</th>
                            <th class="col" scope="col">Label</th>
                            <th class="col" scope="col">Group</th>
                            <th class="colLast" scope="col">Description</th>
                        </tr>
                        <% getterMethods.eachWithIndex { method, i -> %>
                        <tr class="${i%2==0?'altColor':'rowColor'}">
                            <td class="colFirst"><code><strong><a href="#${nameFromParams(method)}">${asPropertyName(method.name())}</a></strong></code></td>
                            <td class="col"><code>${modifiersBrief(method)}${linkable(method.returnType())}</strong></code></td>
                            <td class="col">${classDoc.getLabel(method)}</td>
                            <td class="col">${classDoc.getGroup(method)}</td>
                            <td class="colLast">${method.firstSentenceCommentText()}</td>
                        </tr>
                        <% } %>
                    </table>
                </ul>
            </li>
            <% } // if (getterMethods) %>

            <% if (nonGetterMethods) { %>
            <li class="blockList"><a name="method_summary"><!--   --></a>
                    <h3>Methods Summary</h3>
                    <ul class="blockList">
                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Methods Summary table">
                        <caption><span>Methods</span><span class="tabEnd">&nbsp;</span></caption>
                        <tr>
                            <th class="colFirst" scope="col">Type</th>
                            <th class="colLast" scope="col">Name and description</th>
                        </tr>
                        <% nonGetterMethods.eachWithIndex { method, i -> %>
                        <tr class="${i%2==0?'altColor':'rowColor'}">
                            <td class="colFirst"><code>${modifiersBrief(method)}${linkable(method.returnType())}</strong></code></td>
                            <td class="colLast"><code><strong><a href="#${nameFromParams(method)}">${method.name()}</a></strong>(${paramsOf(method, true)})</code><br>${method.firstSentenceCommentText()}</td>
                        </tr>
                        <% } %>
                    </table>
                   </ul>
              </li>
            <% } // if (nonGetterMethods)
            if (buffer.length()>0) {
            %>
            <li class="blockList"><a name="method_summary"><!--   --></a>
                    <h3>Inherited Methods Summary</h3>
                    <ul class="blockList">
                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Inherited Methods Summary table">
                        <caption><span>Inherited Methods</span><span class="tabEnd">&nbsp;</span></caption>
                        <tr>
                            <th class="colFirst" scope="col">Methods inherited from class</th>
                            <th class="colLast" scope="col">Name</th>
                        </tr>
                        ${buffer}
                    </table>
                   </ul>
              </li>
                <%
            } // if buffer.length%>
        </ul>
        <% } %>
    </li>
    </ul>
</div>

<div class="details">
    <ul class="blockList">
        <li class="blockList">
           <% if (hasEnumConstants) { %>
            <!-- ============ ENUM CONSTANT DETAIL ========== -->
            <ul class="blockList">
                <li class="blockList"><a name="enum_constant_detail">
                    <!--   -->
                </a>
                    <h3>Enum Constant Detail</h3>
                    <% for (ec in classDoc.enumConstants()) { %>
                        <a name="${ec.name()}"><!-- --></a>
                        <ul class="blockListLast">
                            <li class="blockList">
                                <h4>${modifiers(ec) + '<a href="' + classDoc.relativeRootPath + classDoc.fullPathName + '.html">' + classDoc.name() + '</a>'} <strong>${ec.name()}</strong></h4>
                                <p>${ec.commentText()}</p>
                            </li>
                        </ul>
                    <% } %>
                </li>
            </ul>
            <% } %>

            <% if (hasFields) { %>
            <!-- =========== FIELD DETAIL =========== -->
            <ul class="blockList">
                <li class="blockList"><a name="field_detail">
                    <!--   -->
                </a>
                    <h3>Field Detail</h3>
                    <% visibleFields.each { field -> %>
                        <a name="${field.name()}"><!-- --></a>
                        <ul class="blockListLast">
                            <li class="blockList">
                                <pre>${annotations(field, '\n')}</pre> ${modifiersWithIgnore(field, false) + linkable(field.type())} <h4>${field.name()}</h4>
                                <p>${field.commentText()}</p>
                            </li>
                        </ul>
                    <% } %>
                </li>
            </ul>
            <% } %>

            <% if (hasProperties) { %>
            <!-- =========== PROPERTY DETAIL =========== -->
            <ul class="blockList">
                <li class="blockList"><a name="prop_detail">
                    <!--   -->
                </a>
                    <h3>Property Detail</h3>
                    <% visibleProperties.each { prop -> %>
                        <a name="${prop.name()}"><!-- --></a>
                        <ul class="blockListLast">
                            <li class="blockList">
                                <h4>${prop.name()}</h4>
                                <h5>Type: ${ modifiers(prop) + linkable(prop.type()) }</h5>
                                <div>${annotations(prop, '<br/>') } </div>
                                <p>${prop.commentText()}</p>
                            </li>
                        </ul>
                    <% } %>
                </li>
            </ul>
            <% } %>

            <% if (hasElements) { %>
            <!-- =========== ELEMENT DETAIL =========== -->
            <ul class="blockList">
                <li class="blockList"><a name="element_detail">
                    <!--   -->
                </a>
                    <h3>Element Detail</h3>
                    <% visibleFields.each { element -> %>
                        <a name="${element.name()}"><!-- --></a>
                        <ul class="blockListLast">
                            <li class="blockList">
                                <h4>${modifiers(element) + linkable(element.type())} <strong>${element.name()}</strong></h4>
                                <p>${element.commentText()}</p>
                            </li>
                        </ul>
                    <% } %>
                </li>
            </ul>
            <% } %>

            <% if (visibleConstructors) { %>
            <!-- =========== CONSTRUCTOR DETAIL =========== -->
            <ul class="blockList">
                <li class="blockList"><a name="constructor_detail">
                    <!--   -->
                </a>
                    <h3>Constructor Detail</h3>
                    <% visibleConstructors.each { constructor -> %>
                        <a name="${nameFromParams(constructor)}"><!-- --></a>
                        <ul class="blockListLast">
                            <li class="blockList">
                                <h4>${annotations(constructor, '\n') + modifiers(constructor)}<strong>${constructor.name()}</strong>(${paramsOf(constructor, false)})</h4>
                                <p>${constructor.commentText()}</p>
                            </li>
                        </ul>
                    <% } %>
                </li>
            </ul>
            <% } %>


            <% if (visibleMethods) { %>
            <!-- =========== METHOD DETAIL =========== -->
            <ul class="blockList">
                <li class="blockList"><a name="method_detail">
                    <!--   -->
                </a>
                    <h3>Method Detail</h3>
                    <% visibleMethods.each { method -> %>
                        <a name="${nameFromParams(method)}"><!-- --></a>
                        <ul class="blockListLast">
                            <li class="blockList">
                                <h4>${method.name()}(${paramsOf(method, false)}) </h4>
                                <h5>Type: ${ modifiers(method) + linkable(method.returnType()) }</h5>
                                <div>${annotations(method, '<br/>') } </div>
                                <p>${method.commentText()}</p>
                            </li>
                        </ul>
                    <% } %>
                </li>
            </ul>
            <% } %>
        </li>
    </ul>
</div>

<!-- ========= END OF CLASS DATA ========= -->
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar_bottom">
    <!--   -->
</a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
    <!--   -->
</a>
    <ul class="navList" title="Navigation">
        <li><a href="${classDoc.relativeRootPath}overview-summary.html">Overview</a></li>
        <li><a href="package-summary.html">Package</a></li>
        <li class="navBarCell1Rev">Class</li>
        <li><a href="${classDoc.relativeRootPath}deprecated-list.html">Deprecated</a></li>
        <li><a href="${classDoc.relativeRootPath}index-all.html">Index</a></li>
        <li><a href="${classDoc.relativeRootPath}help-doc.html">Help</a></li>
    </ul>
</div>

<div class="subNav">
    <div>
        <ul class="navList">
            <li><a href="${classDoc.relativeRootPath}index.html?${classDoc.fullPathName}" target="_top">Frames</a></li>
            <li><a href="${classDoc.name()}.html" target="_top">No Frames</a></li>
        </ul>
    </div>
    <div>
        <ul class="subNavList">
            <li>Summary:&nbsp;</li>
            <%
    if (classDoc.isAnnotationType()) {
        def hasReq = classDoc.fields().any{ isRequired(it, "true") }
        def hasOpt = classDoc.fields().any{ isRequired(it, "false") }
        if (hasReq) { %><li><a href="#required_element_summary"><% } %>Required<% if (hasReq) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
        if (hasOpt) { %><li><a href="#optional_element_summary"><% } %>Optional<% if (hasOpt) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
    } else {
        if (visibleNested) { %><li><a href="#nested_summary"><% } %>Nested<% if (visibleNested) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
        if (classDoc.isEnum()) {
            if (hasEnumConstants) { %><li><a href="#enum_constant_summary"><% } %>Enum constants<% if (hasEnumConstants) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
        }
        if (hasFields) { %><li><a href="#field_summary"><% } %>Field<% if (hasFields) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
        if (hasProperties) { %><li><a href="#property_summary">Property</a></li><% } %>&nbsp;&nbsp;&nbsp;<%
        if (classDoc.isClass()) {
            if (visibleConstructors) { %><li><a href="#constructor_summary"><% } %>Constructor<% if (visibleConstructors) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
        }
        if (visibleMethods) { %><li><a href="#method_summary"><% } %>Method<% if (visibleMethods) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
    }
    %>
        </ul>
        <ul class="subNavList">
            <li>&nbsp;|&nbsp;Detail:&nbsp;</li>
            <%
            if (classDoc.isAnnotationType()) {
                if (hasElements) { %><li><a href="#element_detail"><% } %>Element<% if (hasElements) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
            } else {
                if (classDoc.isEnum()) {
                    if (hasEnumConstants) { %><li><a href="#enum_constant_detail"><% } %>Enum constants<% if (hasEnumConstants) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
                }
                if (hasFields) { %><li><a href="#field_detail"><% } %>Field<% if (hasFields) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
                if (hasProperties) { %><li><a href="#prop_detail">Property</a></li><% } %>&nbsp;&nbsp;&nbsp;<%
                if (classDoc.isClass()) {
                    if (visibleConstructors) { %><li><a href="#constructor_detail"><% } %>Constructor<% if (visibleConstructors) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
                }
                if (visibleMethods) { %><li><a href="#method_detail"><% } %>Method<% if (visibleMethods) { %></a></li><% } %>&nbsp;&nbsp;&nbsp;<%
            }
            %>
        </ul>
    </div>
    <% if (props.footer) { %><p>${props.footer}</p><% } %>
    <a name="skip-navbar_bottom">
        <!--   -->
    </a>
    </div>
</div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
</html>