src/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java

Sun, 11 Apr 2010 23:24:24 -0700

author
yhuang
date
Sun, 11 Apr 2010 23:24:24 -0700
changeset 539
06e06ec0d6f2
parent 233
5240b1120530
child 554
9d9f26857129
permissions
-rw-r--r--

6875904: Java 7 message synchronization 1
Reviewed-by: ogino, faryad

duke@1 1 /*
duke@1 2 * Copyright 1997-2005 Sun Microsystems, Inc. All Rights Reserved.
duke@1 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@1 4 *
duke@1 5 * This code is free software; you can redistribute it and/or modify it
duke@1 6 * under the terms of the GNU General Public License version 2 only, as
duke@1 7 * published by the Free Software Foundation. Sun designates this
duke@1 8 * particular file as subject to the "Classpath" exception as provided
duke@1 9 * by Sun in the LICENSE file that accompanied this code.
duke@1 10 *
duke@1 11 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@1 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@1 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@1 14 * version 2 for more details (a copy is included in the LICENSE file that
duke@1 15 * accompanied this code).
duke@1 16 *
duke@1 17 * You should have received a copy of the GNU General Public License version
duke@1 18 * 2 along with this work; if not, write to the Free Software Foundation,
duke@1 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@1 20 *
duke@1 21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
duke@1 22 * CA 95054 USA or visit www.sun.com if you need additional information or
duke@1 23 * have any questions.
duke@1 24 */
duke@1 25
duke@1 26 package com.sun.tools.doclets.formats.html;
duke@1 27
bpatel@233 28 import java.util.*;
bpatel@233 29
bpatel@233 30 import com.sun.javadoc.*;
duke@1 31 import com.sun.tools.doclets.internal.toolkit.*;
duke@1 32 import com.sun.tools.doclets.internal.toolkit.util.*;
duke@1 33 import com.sun.tools.doclets.internal.toolkit.builders.*;
duke@1 34 import com.sun.tools.doclets.internal.toolkit.taglets.*;
duke@1 35
duke@1 36 /**
duke@1 37 * Generate the Class Information Page.
duke@1 38 * @see com.sun.javadoc.ClassDoc
duke@1 39 * @see java.util.Collections
duke@1 40 * @see java.util.List
duke@1 41 * @see java.util.ArrayList
duke@1 42 * @see java.util.HashMap
duke@1 43 *
duke@1 44 * @author Atul M Dambalkar
duke@1 45 * @author Robert Field
duke@1 46 */
duke@1 47 public class ClassWriterImpl extends SubWriterHolderWriter
duke@1 48 implements ClassWriter {
duke@1 49
duke@1 50 protected ClassDoc classDoc;
duke@1 51
duke@1 52 protected ClassTree classtree;
duke@1 53
duke@1 54 protected ClassDoc prev;
duke@1 55
duke@1 56 protected ClassDoc next;
duke@1 57
duke@1 58 /**
duke@1 59 * @param classDoc the class being documented.
duke@1 60 * @param prevClass the previous class that was documented.
duke@1 61 * @param nextClass the next class being documented.
duke@1 62 * @param classTree the class tree for the given class.
duke@1 63 */
duke@1 64 public ClassWriterImpl (ClassDoc classDoc,
duke@1 65 ClassDoc prevClass, ClassDoc nextClass, ClassTree classTree)
duke@1 66 throws Exception {
duke@1 67 super(ConfigurationImpl.getInstance(),
duke@1 68 DirectoryManager.getDirectoryPath(classDoc.containingPackage()),
duke@1 69 classDoc.name() + ".html",
duke@1 70 DirectoryManager.getRelativePath(classDoc.containingPackage().name()));
duke@1 71 this.classDoc = classDoc;
duke@1 72 configuration.currentcd = classDoc;
duke@1 73 this.classtree = classTree;
duke@1 74 this.prev = prevClass;
duke@1 75 this.next = nextClass;
duke@1 76 }
duke@1 77
duke@1 78 /**
duke@1 79 * Print this package link
duke@1 80 */
duke@1 81 protected void navLinkPackage() {
duke@1 82 navCellStart();
duke@1 83 printHyperLink("package-summary.html", "",
duke@1 84 configuration.getText("doclet.Package"), true, "NavBarFont1");
duke@1 85 navCellEnd();
duke@1 86 }
duke@1 87
duke@1 88 /**
duke@1 89 * Print class page indicator
duke@1 90 */
duke@1 91 protected void navLinkClass() {
duke@1 92 navCellRevStart();
duke@1 93 fontStyle("NavBarFont1Rev");
bpatel@182 94 strongText("doclet.Class");
duke@1 95 fontEnd();
duke@1 96 navCellEnd();
duke@1 97 }
duke@1 98
duke@1 99 /**
duke@1 100 * Print class use link
duke@1 101 */
duke@1 102 protected void navLinkClassUse() {
duke@1 103 navCellStart();
duke@1 104 printHyperLink("class-use/" + filename, "",
duke@1 105 configuration.getText("doclet.navClassUse"), true, "NavBarFont1");
duke@1 106 navCellEnd();
duke@1 107 }
duke@1 108
duke@1 109 /**
duke@1 110 * Print previous package link
duke@1 111 */
duke@1 112 protected void navLinkPrevious() {
duke@1 113 if (prev == null) {
duke@1 114 printText("doclet.Prev_Class");
duke@1 115 } else {
duke@1 116 printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS, prev, "",
duke@1 117 configuration.getText("doclet.Prev_Class"), true));
duke@1 118 }
duke@1 119 }
duke@1 120
duke@1 121 /**
duke@1 122 * Print next package link
duke@1 123 */
duke@1 124 protected void navLinkNext() {
duke@1 125 if (next == null) {
duke@1 126 printText("doclet.Next_Class");
duke@1 127 } else {
duke@1 128 printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS, next, "",
duke@1 129 configuration.getText("doclet.Next_Class"), true));
duke@1 130 }
duke@1 131 }
duke@1 132
duke@1 133 /**
duke@1 134 * {@inheritDoc}
duke@1 135 */
duke@1 136 public void writeHeader(String header) {
duke@1 137 String pkgname = (classDoc.containingPackage() != null)?
duke@1 138 classDoc.containingPackage().name(): "";
duke@1 139 String clname = classDoc.name();
duke@1 140 printHtmlHeader(clname,
duke@1 141 configuration.metakeywords.getMetaKeywords(classDoc), true);
duke@1 142 printTop();
duke@1 143 navLinks(true);
duke@1 144 hr();
duke@1 145 println("<!-- ======== START OF CLASS DATA ======== -->");
duke@1 146 h2();
duke@1 147 if (pkgname.length() > 0) {
duke@1 148 font("-1"); print(pkgname); fontEnd(); br();
duke@1 149 }
duke@1 150 LinkInfoImpl linkInfo = new LinkInfoImpl( LinkInfoImpl.CONTEXT_CLASS_HEADER,
duke@1 151 classDoc, false);
duke@1 152 //Let's not link to ourselves in the header.
duke@1 153 linkInfo.linkToSelf = false;
duke@1 154 print(header + getTypeParameterLinks(linkInfo));
duke@1 155 h2End();
duke@1 156 }
duke@1 157
duke@1 158 /**
duke@1 159 * {@inheritDoc}
duke@1 160 */
duke@1 161 public void writeFooter() {
duke@1 162 println("<!-- ========= END OF CLASS DATA ========= -->");
duke@1 163 hr();
duke@1 164 navLinks(false);
duke@1 165 printBottom();
duke@1 166 printBodyHtmlEnd();
duke@1 167 }
duke@1 168
duke@1 169 /**
duke@1 170 * {@inheritDoc}
duke@1 171 */
duke@1 172 public void writeClassSignature(String modifiers) {
duke@1 173 boolean isInterface = classDoc.isInterface();
duke@1 174 preNoNewLine();
duke@1 175 writeAnnotationInfo(classDoc);
duke@1 176 print(modifiers);
duke@1 177 LinkInfoImpl linkInfo = new LinkInfoImpl(
duke@1 178 LinkInfoImpl.CONTEXT_CLASS_SIGNATURE, classDoc, false);
duke@1 179 //Let's not link to ourselves in the signature.
duke@1 180 linkInfo.linkToSelf = false;
duke@1 181 String name = classDoc.name() +
duke@1 182 getTypeParameterLinks(linkInfo);
duke@1 183 if (configuration().linksource) {
duke@1 184 printSrcLink(classDoc, name);
duke@1 185 } else {
bpatel@182 186 strong(name);
duke@1 187 }
duke@1 188 if (!isInterface) {
duke@1 189 Type superclass = Util.getFirstVisibleSuperClass(classDoc,
duke@1 190 configuration());
duke@1 191 if (superclass != null) {
bpatel@233 192 println();
duke@1 193 print("extends ");
duke@1 194 printLink(new LinkInfoImpl(
duke@1 195 LinkInfoImpl.CONTEXT_CLASS_SIGNATURE_PARENT_NAME,
duke@1 196 superclass));
duke@1 197 }
duke@1 198 }
duke@1 199 Type[] implIntfacs = classDoc.interfaceTypes();
duke@1 200 if (implIntfacs != null && implIntfacs.length > 0) {
duke@1 201 int counter = 0;
duke@1 202 for (int i = 0; i < implIntfacs.length; i++) {
duke@1 203 ClassDoc classDoc = implIntfacs[i].asClassDoc();
duke@1 204 if (! (classDoc.isPublic() ||
duke@1 205 Util.isLinkable(classDoc, configuration()))) {
duke@1 206 continue;
duke@1 207 }
duke@1 208 if (counter == 0) {
bpatel@233 209 println();
duke@1 210 print(isInterface? "extends " : "implements ");
duke@1 211 } else {
duke@1 212 print(", ");
duke@1 213 }
duke@1 214 printLink(new LinkInfoImpl(
duke@1 215 LinkInfoImpl.CONTEXT_CLASS_SIGNATURE_PARENT_NAME,
duke@1 216 implIntfacs[i]));
duke@1 217 counter++;
duke@1 218 }
duke@1 219 }
duke@1 220 preEnd();
duke@1 221 p();
duke@1 222 }
duke@1 223
duke@1 224 /**
duke@1 225 * {@inheritDoc}
duke@1 226 */
duke@1 227 public void writeClassDescription() {
duke@1 228 if(!configuration.nocomment) {
duke@1 229 // generate documentation for the class.
duke@1 230 if (classDoc.inlineTags().length > 0) {
duke@1 231 printInlineComment(classDoc);
duke@1 232 p();
duke@1 233 }
duke@1 234 }
duke@1 235 }
duke@1 236
duke@1 237 /**
duke@1 238 * {@inheritDoc}
duke@1 239 */
duke@1 240 public void writeClassTagInfo() {
duke@1 241 if(!configuration.nocomment) {
duke@1 242 // Print Information about all the tags here
duke@1 243 printTags(classDoc);
duke@1 244 hr();
duke@1 245 p();
duke@1 246 } else {
duke@1 247 hr();
duke@1 248 }
duke@1 249 }
duke@1 250
duke@1 251 /**
duke@1 252 * {@inheritDoc}
duke@1 253 */
duke@1 254 public void writeClassDeprecationInfo() {
duke@1 255 hr();
duke@1 256 Tag[] deprs = classDoc.tags("deprecated");
duke@1 257 if (Util.isDeprecated(classDoc)) {
bpatel@182 258 strongText("doclet.Deprecated");
duke@1 259 if (deprs.length > 0) {
duke@1 260 Tag[] commentTags = deprs[0].inlineTags();
duke@1 261 if (commentTags.length > 0) {
duke@1 262 space();
duke@1 263 printInlineDeprecatedComment(classDoc, deprs[0]);
duke@1 264 }
duke@1 265 }
duke@1 266 p();
duke@1 267 }
duke@1 268 }
duke@1 269
duke@1 270 /**
duke@1 271 * Generate the indent and get the line image for the class tree.
duke@1 272 * For user accessibility, the image includes the alt attribute
duke@1 273 * "extended by". (This method is not intended for a class
duke@1 274 * implementing an interface, where "implemented by" would be required.)
duke@1 275 *
duke@1 276 * indent integer indicating the number of spaces to indent
duke@1 277 */
duke@1 278 private void writeStep(int indent) {
duke@1 279 print(spaces(4 * indent - 2));
duke@1 280 print("<IMG SRC=\"" + relativepathNoSlash + "/resources/inherit.gif\" " +
duke@1 281 "ALT=\"" + configuration.getText("doclet.extended_by") + " \">");
duke@1 282 }
duke@1 283
duke@1 284 /**
duke@1 285 * Print the class hierarchy tree for the given class.
duke@1 286 * @param type the class to print the hierarchy for.
duke@1 287 * @return return the amount that should be indented in
duke@1 288 * the next level of the tree.
duke@1 289 */
duke@1 290 private int writeTreeForClassHelper(Type type) {
duke@1 291 Type sup = Util.getFirstVisibleSuperClass(
duke@1 292 type instanceof ClassDoc ? (ClassDoc) type : type.asClassDoc(),
duke@1 293 configuration());
duke@1 294 int indent = 0;
duke@1 295 if (sup != null) {
duke@1 296 indent = writeTreeForClassHelper(sup);
duke@1 297 writeStep(indent);
duke@1 298 }
duke@1 299
duke@1 300 if (type.equals(classDoc)) {
duke@1 301 String typeParameters = getTypeParameterLinks(
duke@1 302 new LinkInfoImpl(
duke@1 303 LinkInfoImpl.CONTEXT_TREE,
duke@1 304 classDoc, false));
duke@1 305 if (configuration.shouldExcludeQualifier(
duke@1 306 classDoc.containingPackage().name())) {
bpatel@182 307 strong(type.asClassDoc().name() + typeParameters);
duke@1 308 } else {
bpatel@182 309 strong(type.asClassDoc().qualifiedName() + typeParameters);
duke@1 310 }
duke@1 311 } else {
duke@1 312 print(getLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS_TREE_PARENT,
duke@1 313 type instanceof ClassDoc ? (ClassDoc) type : type,
duke@1 314 configuration.getClassName(type.asClassDoc()), false)));
duke@1 315 }
duke@1 316 println();
duke@1 317 return indent + 1;
duke@1 318 }
duke@1 319
duke@1 320 /**
duke@1 321 * Print the class hierarchy tree for this class only.
duke@1 322 */
duke@1 323 public void writeClassTree() {
duke@1 324 if (! classDoc.isClass()) {
duke@1 325 return;
duke@1 326 }
duke@1 327 pre();
duke@1 328 writeTreeForClassHelper(classDoc);
duke@1 329 preEnd();
duke@1 330 }
duke@1 331
duke@1 332 /**
duke@1 333 * Write the type parameter information.
duke@1 334 */
duke@1 335 public void writeTypeParamInfo() {
duke@1 336 if (classDoc.typeParamTags().length > 0) {
duke@1 337 dl();
duke@1 338 dt();
duke@1 339 TagletOutput output = (new ParamTaglet()).getTagletOutput(classDoc,
duke@1 340 getTagletWriterInstance(false));
duke@1 341 print(output.toString());
bpatel@233 342 dtEnd();
duke@1 343 dlEnd();
duke@1 344 }
duke@1 345 }
duke@1 346
duke@1 347 /**
duke@1 348 * {@inheritDoc}
duke@1 349 */
duke@1 350 public void writeSubClassInfo() {
duke@1 351 if (classDoc.isClass()) {
duke@1 352 if (classDoc.qualifiedName().equals("java.lang.Object") ||
duke@1 353 classDoc.qualifiedName().equals("org.omg.CORBA.Object")) {
duke@1 354 return; // Don't generate the list, too huge
duke@1 355 }
mcimadamore@184 356 List<ClassDoc> subclasses = classtree.subs(classDoc, false);
duke@1 357 if (subclasses.size() > 0) {
duke@1 358 dl();
duke@1 359 dt();
bpatel@182 360 strongText("doclet.Subclasses");
bpatel@233 361 dtEnd();
duke@1 362 writeClassLinks(LinkInfoImpl.CONTEXT_SUBCLASSES,
duke@1 363 subclasses);
bpatel@233 364 dlEnd();
duke@1 365 }
duke@1 366 }
duke@1 367 }
duke@1 368
duke@1 369 /**
duke@1 370 * {@inheritDoc}
duke@1 371 */
duke@1 372 public void writeSubInterfacesInfo() {
duke@1 373 if (classDoc.isInterface()) {
mcimadamore@184 374 List<ClassDoc> subInterfaces = classtree.allSubs(classDoc, false);
duke@1 375 if (subInterfaces.size() > 0) {
duke@1 376 dl();
duke@1 377 dt();
bpatel@182 378 strongText("doclet.Subinterfaces");
bpatel@233 379 dtEnd();
duke@1 380 writeClassLinks(LinkInfoImpl.CONTEXT_SUBINTERFACES,
duke@1 381 subInterfaces);
bpatel@233 382 dlEnd();
duke@1 383 }
duke@1 384 }
duke@1 385 }
duke@1 386
duke@1 387 /**
duke@1 388 * If this is the interface which are the classes, that implement this?
duke@1 389 */
duke@1 390 public void writeInterfaceUsageInfo () {
duke@1 391 if (! classDoc.isInterface()) {
duke@1 392 return;
duke@1 393 }
duke@1 394 if (classDoc.qualifiedName().equals("java.lang.Cloneable") ||
duke@1 395 classDoc.qualifiedName().equals("java.io.Serializable")) {
duke@1 396 return; // Don't generate the list, too big
duke@1 397 }
mcimadamore@184 398 List<ClassDoc> implcl = classtree.implementingclasses(classDoc);
duke@1 399 if (implcl.size() > 0) {
duke@1 400 dl();
duke@1 401 dt();
bpatel@182 402 strongText("doclet.Implementing_Classes");
bpatel@233 403 dtEnd();
duke@1 404 writeClassLinks(LinkInfoImpl.CONTEXT_IMPLEMENTED_CLASSES,
duke@1 405 implcl);
bpatel@233 406 dlEnd();
duke@1 407 }
duke@1 408 }
duke@1 409
duke@1 410 /**
duke@1 411 * {@inheritDoc}
duke@1 412 */
duke@1 413 public void writeImplementedInterfacesInfo() {
duke@1 414 //NOTE: we really should be using ClassDoc.interfaceTypes() here, but
duke@1 415 // it doesn't walk up the tree like we want it to.
mcimadamore@184 416 List<Type> interfaceArray = Util.getAllInterfaces(classDoc, configuration);
duke@1 417 if (classDoc.isClass() && interfaceArray.size() > 0) {
duke@1 418 dl();
duke@1 419 dt();
bpatel@182 420 strongText("doclet.All_Implemented_Interfaces");
bpatel@233 421 dtEnd();
duke@1 422 writeClassLinks(LinkInfoImpl.CONTEXT_IMPLEMENTED_INTERFACES,
duke@1 423 interfaceArray);
bpatel@233 424 dlEnd();
duke@1 425 }
duke@1 426 }
duke@1 427
duke@1 428 /**
duke@1 429 * {@inheritDoc}
duke@1 430 */
duke@1 431 public void writeSuperInterfacesInfo() {
duke@1 432 //NOTE: we really should be using ClassDoc.interfaceTypes() here, but
duke@1 433 // it doesn't walk up the tree like we want it to.
mcimadamore@184 434 List<Type> interfaceArray = Util.getAllInterfaces(classDoc, configuration);
duke@1 435 if (classDoc.isInterface() && interfaceArray.size() > 0) {
duke@1 436 dl();
duke@1 437 dt();
bpatel@182 438 strongText("doclet.All_Superinterfaces");
bpatel@233 439 dtEnd();
duke@1 440 writeClassLinks(LinkInfoImpl.CONTEXT_SUPER_INTERFACES,
duke@1 441 interfaceArray);
bpatel@233 442 dlEnd();
duke@1 443 }
duke@1 444 }
duke@1 445
duke@1 446 /**
duke@1 447 * Generate links to the given classes.
duke@1 448 */
mcimadamore@184 449 private void writeClassLinks(int context, List<?> list) {
duke@1 450 Object[] typeList = list.toArray();
duke@1 451 //Sort the list to be printed.
duke@1 452 print(' ');
duke@1 453 dd();
duke@1 454 for (int i = 0; i < list.size(); i++) {
duke@1 455 if (i > 0) {
duke@1 456 print(", ");
duke@1 457 }
duke@1 458 if (typeList[i] instanceof ClassDoc) {
duke@1 459 printLink(new LinkInfoImpl(context, (ClassDoc)(typeList[i])));
duke@1 460
duke@1 461 } else {
duke@1 462 printLink(new LinkInfoImpl(context, (Type)(typeList[i])));
duke@1 463 }
duke@1 464 }
duke@1 465 ddEnd();
duke@1 466 }
duke@1 467
duke@1 468 protected void navLinkTree() {
duke@1 469 navCellStart();
duke@1 470 printHyperLink("package-tree.html", "",
duke@1 471 configuration.getText("doclet.Tree"), true, "NavBarFont1");
duke@1 472 navCellEnd();
duke@1 473 }
duke@1 474
duke@1 475 protected void printSummaryDetailLinks() {
duke@1 476 try {
duke@1 477 tr();
duke@1 478 tdVAlignClass("top", "NavBarCell3");
duke@1 479 font("-2");
duke@1 480 print(" ");
duke@1 481 navSummaryLinks();
duke@1 482 fontEnd();
duke@1 483 tdEnd();
duke@1 484 tdVAlignClass("top", "NavBarCell3");
duke@1 485 font("-2");
duke@1 486 navDetailLinks();
duke@1 487 fontEnd();
duke@1 488 tdEnd();
duke@1 489 trEnd();
duke@1 490 } catch (Exception e) {
duke@1 491 e.printStackTrace();
duke@1 492 throw new DocletAbortException();
duke@1 493 }
duke@1 494 }
duke@1 495
duke@1 496 protected void navSummaryLinks() throws Exception {
duke@1 497 printText("doclet.Summary");
duke@1 498 space();
duke@1 499 MemberSummaryBuilder memberSummaryBuilder = (MemberSummaryBuilder)
duke@1 500 configuration.getBuilderFactory().getMemberSummaryBuilder(this);
duke@1 501 String[] navLinkLabels = new String[] {
duke@1 502 "doclet.navNested", "doclet.navEnum", "doclet.navField", "doclet.navConstructor",
duke@1 503 "doclet.navMethod"
duke@1 504 };
duke@1 505 for (int i = 0; i < navLinkLabels.length; i++ ) {
duke@1 506 if (i == VisibleMemberMap.ENUM_CONSTANTS && ! classDoc.isEnum()) {
duke@1 507 continue;
duke@1 508 }
duke@1 509 if (i == VisibleMemberMap.CONSTRUCTORS && classDoc.isEnum()) {
duke@1 510 continue;
duke@1 511 }
duke@1 512 AbstractMemberWriter writer =
duke@1 513 ((AbstractMemberWriter) memberSummaryBuilder.
duke@1 514 getMemberSummaryWriter(i));
duke@1 515 if (writer == null) {
duke@1 516 printText(navLinkLabels[i]);
duke@1 517 } else {
duke@1 518 writer.navSummaryLink(
duke@1 519 memberSummaryBuilder.members(i),
duke@1 520 memberSummaryBuilder.getVisibleMemberMap(i));
duke@1 521 }
duke@1 522 if (i < navLinkLabels.length-1) {
duke@1 523 navGap();
duke@1 524 }
duke@1 525 }
duke@1 526 }
duke@1 527
duke@1 528 /**
duke@1 529 * Method navDetailLinks
duke@1 530 *
duke@1 531 * @throws Exception
duke@1 532 *
duke@1 533 */
duke@1 534 protected void navDetailLinks() throws Exception {
duke@1 535 printText("doclet.Detail");
duke@1 536 space();
duke@1 537 MemberSummaryBuilder memberSummaryBuilder = (MemberSummaryBuilder)
duke@1 538 configuration.getBuilderFactory().getMemberSummaryBuilder(this);
duke@1 539 String[] navLinkLabels = new String[] {
duke@1 540 "doclet.navNested", "doclet.navEnum", "doclet.navField", "doclet.navConstructor",
duke@1 541 "doclet.navMethod"
duke@1 542 };
duke@1 543 for (int i = 1; i < navLinkLabels.length; i++ ) {
duke@1 544 AbstractMemberWriter writer =
duke@1 545 ((AbstractMemberWriter) memberSummaryBuilder.
duke@1 546 getMemberSummaryWriter(i));
duke@1 547 if (i == VisibleMemberMap.ENUM_CONSTANTS && ! classDoc.isEnum()) {
duke@1 548 continue;
duke@1 549 }
duke@1 550 if (i == VisibleMemberMap.CONSTRUCTORS && classDoc.isEnum()) {
duke@1 551 continue;
duke@1 552 }
duke@1 553 if (writer == null) {
duke@1 554 printText(navLinkLabels[i]);
duke@1 555 } else {
duke@1 556 writer.navDetailLink(memberSummaryBuilder.members(i));
duke@1 557 }
duke@1 558 if (i < navLinkLabels.length - 1) {
duke@1 559 navGap();
duke@1 560 }
duke@1 561 }
duke@1 562 }
duke@1 563
duke@1 564 protected void navGap() {
duke@1 565 space();
duke@1 566 print('|');
duke@1 567 space();
duke@1 568 }
duke@1 569
duke@1 570 /**
duke@1 571 * If this is an inner class or interface, write the enclosing class or
duke@1 572 * interface.
duke@1 573 */
duke@1 574 public void writeNestedClassInfo() {
duke@1 575 ClassDoc outerClass = classDoc.containingClass();
duke@1 576 if (outerClass != null) {
duke@1 577 dl();
duke@1 578 dt();
duke@1 579 if (outerClass.isInterface()) {
bpatel@182 580 strongText("doclet.Enclosing_Interface");
duke@1 581 } else {
bpatel@182 582 strongText("doclet.Enclosing_Class");
duke@1 583 }
bpatel@233 584 dtEnd();
duke@1 585 dd();
duke@1 586 printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS, outerClass,
duke@1 587 false));
duke@1 588 ddEnd();
duke@1 589 dlEnd();
duke@1 590 }
duke@1 591 }
duke@1 592
duke@1 593 /**
duke@1 594 * Return the classDoc being documented.
duke@1 595 *
duke@1 596 * @return the classDoc being documented.
duke@1 597 */
duke@1 598 public ClassDoc getClassDoc() {
duke@1 599 return classDoc;
duke@1 600 }
duke@1 601
duke@1 602 /**
duke@1 603 * {@inheritDoc}
duke@1 604 */
duke@1 605 public void completeMemberSummaryBuild() {
duke@1 606 p();
duke@1 607 }
duke@1 608 }

mercurial