FieldWriterImpl.java revision 3692:87b48a8fb3cf
128021Sjoerg/*
272406Sphantom * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
328021Sjoerg * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
428021Sjoerg *
528021Sjoerg * This code is free software; you can redistribute it and/or modify it
628021Sjoerg * under the terms of the GNU General Public License version 2 only, as
728021Sjoerg * published by the Free Software Foundation.  Oracle designates this
828021Sjoerg * particular file as subject to the "Classpath" exception as provided
928021Sjoerg * by Oracle in the LICENSE file that accompanied this code.
1028021Sjoerg *
1128021Sjoerg * This code is distributed in the hope that it will be useful, but WITHOUT
1228021Sjoerg * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1328021Sjoerg * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1428021Sjoerg * version 2 for more details (a copy is included in the LICENSE file that
1528021Sjoerg * accompanied this code).
1628021Sjoerg *
1728021Sjoerg * You should have received a copy of the GNU General Public License version
1828021Sjoerg * 2 along with this work; if not, write to the Free Software Foundation,
1928021Sjoerg * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2028021Sjoerg *
2128021Sjoerg * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2228021Sjoerg * or visit www.oracle.com if you need additional information or have any
2328021Sjoerg * questions.
2428021Sjoerg */
2528021Sjoerg
2628021Sjoergpackage jdk.javadoc.internal.doclets.formats.html;
2750476Speter
2828021Sjoergimport java.util.Arrays;
2928021Sjoergimport java.util.List;
3073359Sache
3173359Sacheimport javax.lang.model.element.Element;
3272406Sphantomimport javax.lang.model.element.TypeElement;
3328021Sjoergimport javax.lang.model.element.VariableElement;
3428021Sjoerg
3572406Sphantomimport jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
3672167Sphantomimport jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
3772406Sphantomimport jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
3828021Sjoergimport jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
3974412Sacheimport jdk.javadoc.internal.doclets.formats.html.markup.StringContent;
4051186Sdtimport jdk.javadoc.internal.doclets.toolkit.Content;
4172167Sphantomimport jdk.javadoc.internal.doclets.toolkit.FieldWriter;
4228021Sjoergimport jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter;
4328021Sjoerg
4428021Sjoerg/**
4528021Sjoerg * Writes field documentation in HTML format.
4628021Sjoerg *
4728021Sjoerg *  <p><b>This is NOT part of any supported API.
4828021Sjoerg *  If you write code that depends on this, you do so at your own risk.
4928021Sjoerg *  This code and its internal interfaces are subject to change or
5028021Sjoerg *  deletion without notice.</b>
5128021Sjoerg *
5228021Sjoerg * @author Robert Field
5328021Sjoerg * @author Atul M Dambalkar
5428021Sjoerg * @author Jamie Ho (rewrite)
5528021Sjoerg * @author Bhavesh Patel (Modified)
5628021Sjoerg */
5728021Sjoergpublic class FieldWriterImpl extends AbstractMemberWriter
5828021Sjoerg    implements FieldWriter, MemberSummaryWriter {
5928021Sjoerg
6028021Sjoerg    public FieldWriterImpl(SubWriterHolderWriter writer, TypeElement typeElement) {
6128021Sjoerg        super(writer, typeElement);
6228021Sjoerg    }
6328021Sjoerg
6428021Sjoerg    public FieldWriterImpl(SubWriterHolderWriter writer) {
6528021Sjoerg        super(writer);
6628021Sjoerg    }
6728021Sjoerg
6828021Sjoerg    /**
6928021Sjoerg     * {@inheritDoc}
7028021Sjoerg     */
7174412Sache    @Override
7228021Sjoerg    public Content getMemberSummaryHeader(TypeElement typeElement,
7328021Sjoerg            Content memberSummaryTree) {
7428021Sjoerg        memberSummaryTree.addContent(HtmlConstants.START_OF_FIELD_SUMMARY);
7528021Sjoerg        Content memberTree = writer.getMemberTreeHeader();
7628021Sjoerg        writer.addSummaryHeader(this, typeElement, memberTree);
7728021Sjoerg        return memberTree;
7828021Sjoerg    }
7928021Sjoerg
8074412Sache    /**
8151186Sdt     * {@inheritDoc}
8274412Sache     */
8374412Sache    public void addMemberTree(Content memberSummaryTree, Content memberTree) {
8474412Sache        writer.addMemberTree(memberSummaryTree, memberTree);
8551186Sdt    }
8651186Sdt
8751186Sdt    /**
8853940Sache     * {@inheritDoc}
8953940Sache     */
9074412Sache    @Override
9174412Sache    public Content getFieldDetailsTreeHeader(TypeElement typeElement, Content memberDetailsTree) {
9253940Sache        memberDetailsTree.addContent(HtmlConstants.START_OF_FIELD_DETAILS);
9374412Sache        Content fieldDetailsTree = writer.getMemberTreeHeader();
9453960Sache        fieldDetailsTree.addContent(writer.getMarkerAnchor(
9573359Sache                SectionName.FIELD_DETAIL));
9673359Sache        Content heading = HtmlTree.HEADING(HtmlConstants.DETAILS_HEADING,
9773359Sache                contents.fieldDetailsLabel);
9873359Sache        fieldDetailsTree.addContent(heading);
9928021Sjoerg        return fieldDetailsTree;
10028021Sjoerg    }
10172167Sphantom
10272167Sphantom    /**
10372167Sphantom     * {@inheritDoc}
10472406Sphantom     */
10572167Sphantom    @Override
10672167Sphantom    public Content getFieldDocTreeHeader(VariableElement field, Content fieldDetailsTree) {
10728021Sjoerg        fieldDetailsTree.addContent(writer.getMarkerAnchor(name(field)));
10828021Sjoerg        Content fieldTree = writer.getMemberTreeHeader();
10972406Sphantom        Content heading = new HtmlTree(HtmlConstants.MEMBER_HEADING);
11028021Sjoerg        heading.addContent(name(field));
11172406Sphantom        fieldTree.addContent(heading);
11228021Sjoerg        return fieldTree;
11372406Sphantom    }
11473359Sache
11574412Sache    /**
11672406Sphantom     * {@inheritDoc}
11728021Sjoerg     */
11872406Sphantom    @Override
11951186Sdt    public Content getSignature(VariableElement field) {
120        Content pre = new HtmlTree(HtmlTag.PRE);
121        writer.addAnnotationInfo(field, pre);
122        addModifiers(field, pre);
123        Content fieldlink = writer.getLink(new LinkInfoImpl(
124                configuration, LinkInfoImpl.Kind.MEMBER, field.asType()));
125        pre.addContent(fieldlink);
126        pre.addContent(" ");
127        if (configuration.linksource) {
128            Content fieldName = new StringContent(name(field));
129            writer.addSrcLink(field, fieldName, pre);
130        } else {
131            addName(name(field), pre);
132        }
133        return pre;
134    }
135
136    /**
137     * {@inheritDoc}
138     */
139    @Override
140    public void addDeprecated(VariableElement field, Content fieldTree) {
141        addDeprecatedInfo(field, fieldTree);
142    }
143
144    /**
145     * {@inheritDoc}
146     */
147    @Override
148    public void addComments(VariableElement field, Content fieldTree) {
149        if (!utils.getFullBody(field).isEmpty()) {
150            writer.addInlineComment(field, fieldTree);
151        }
152    }
153
154    /**
155     * {@inheritDoc}
156     */
157    @Override
158    public void addTags(VariableElement field, Content fieldTree) {
159        writer.addTagsInfo(field, fieldTree);
160    }
161
162    /**
163     * {@inheritDoc}
164     */
165    @Override
166    public Content getFieldDetails(Content fieldDetailsTree) {
167        if (configuration.allowTag(HtmlTag.SECTION)) {
168            HtmlTree htmlTree = HtmlTree.SECTION(getMemberTree(fieldDetailsTree));
169            return htmlTree;
170        }
171        return getMemberTree(fieldDetailsTree);
172    }
173
174    /**
175     * {@inheritDoc}
176     */
177    @Override
178    public Content getFieldDoc(Content fieldTree,
179            boolean isLastContent) {
180        return getMemberTree(fieldTree, isLastContent);
181    }
182
183    /**
184     * {@inheritDoc}
185     */
186    @Override
187    public void addSummaryLabel(Content memberTree) {
188        Content label = HtmlTree.HEADING(HtmlConstants.SUMMARY_HEADING,
189                contents.fieldSummaryLabel);
190        memberTree.addContent(label);
191    }
192
193    /**
194     * {@inheritDoc}
195     */
196    @Override
197    public String getTableSummary() {
198        return resources.getText("doclet.Member_Table_Summary",
199                resources.getText("doclet.Field_Summary"),
200                resources.getText("doclet.fields"));
201    }
202
203    /**
204     * {@inheritDoc}
205     */
206    @Override
207    public Content getCaption() {
208        return contents.fields;
209    }
210
211    /**
212     * {@inheritDoc}
213     */
214    @Override
215    public List<String> getSummaryTableHeader(Element member) {
216        List<String> header = Arrays.asList(writer.getModifierTypeHeader(),
217                resources.getText("doclet.Field"), resources.getText("doclet.Description"));
218        return header;
219    }
220
221    /**
222     * {@inheritDoc}
223     */
224    @Override
225    public void addSummaryAnchor(TypeElement typeElement, Content memberTree) {
226        memberTree.addContent(writer.getMarkerAnchor(
227                SectionName.FIELD_SUMMARY));
228    }
229
230    /**
231     * {@inheritDoc}
232     */
233    @Override
234    public void addInheritedSummaryAnchor(TypeElement typeElement, Content inheritedTree) {
235        inheritedTree.addContent(writer.getMarkerAnchor(
236                SectionName.FIELDS_INHERITANCE, configuration.getClassName(typeElement)));
237    }
238
239    /**
240     * {@inheritDoc}
241     */
242    @Override
243    public void addInheritedSummaryLabel(TypeElement typeElement, Content inheritedTree) {
244        Content classLink = writer.getPreQualifiedClassLink(
245                LinkInfoImpl.Kind.MEMBER, typeElement, false);
246        Content label = new StringContent(utils.isClass(typeElement)
247                ? configuration.getText("doclet.Fields_Inherited_From_Class")
248                : configuration.getText("doclet.Fields_Inherited_From_Interface"));
249        Content labelHeading = HtmlTree.HEADING(HtmlConstants.INHERITED_SUMMARY_HEADING,
250                label);
251        labelHeading.addContent(Contents.SPACE);
252        labelHeading.addContent(classLink);
253        inheritedTree.addContent(labelHeading);
254    }
255
256    /**
257     * {@inheritDoc}
258     */
259    @Override
260    protected void addSummaryLink(LinkInfoImpl.Kind context, TypeElement typeElement, Element member,
261            Content tdSummary) {
262        Content memberLink = HtmlTree.SPAN(HtmlStyle.memberNameLink,
263                writer.getDocLink(context, typeElement , member, name(member), false));
264        Content code = HtmlTree.CODE(memberLink);
265        tdSummary.addContent(code);
266    }
267
268    /**
269     * {@inheritDoc}
270     */
271    @Override
272    protected void addInheritedSummaryLink(TypeElement typeElement, Element member, Content linksTree) {
273        linksTree.addContent(
274                writer.getDocLink(LinkInfoImpl.Kind.MEMBER, typeElement, member,
275                name(member), false));
276    }
277
278    /**
279     * {@inheritDoc}
280     */
281    @Override
282    protected void addSummaryType(Element member, Content tdSummaryType) {
283        addModifierAndType(member, member.asType(), tdSummaryType);
284    }
285
286    /**
287     * {@inheritDoc}
288     */
289    @Override
290    protected Content getDeprecatedLink(Element member) {
291        String name = utils.getFullyQualifiedName(member) + "." + member.getSimpleName();
292        return writer.getDocLink(LinkInfoImpl.Kind.MEMBER, member, name);
293    }
294
295    /**
296     * {@inheritDoc}
297     */
298    @Override
299    protected Content getNavSummaryLink(TypeElement typeElement, boolean link) {
300        if (link) {
301            if (typeElement == null) {
302                return writer.getHyperLink(
303                        SectionName.FIELD_SUMMARY,
304                        contents.navField);
305            } else {
306                return writer.getHyperLink(
307                        SectionName.FIELDS_INHERITANCE,
308                        configuration.getClassName(typeElement), contents.navField);
309            }
310        } else {
311            return contents.navField;
312        }
313    }
314
315    /**
316     * {@inheritDoc}
317     */
318    @Override
319    protected void addNavDetailLink(boolean link, Content liNav) {
320        if (link) {
321            liNav.addContent(writer.getHyperLink(
322                    SectionName.FIELD_DETAIL,
323                    contents.navField));
324        } else {
325            liNav.addContent(contents.navField);
326        }
327    }
328}
329