diff --git a/java/compiler/openapi/resources/messages/JavaCompilerBundle.properties b/java/compiler/openapi/resources/messages/JavaCompilerBundle.properties index 814f3768bc5b..8630b2dc5032 100644 --- a/java/compiler/openapi/resources/messages/JavaCompilerBundle.properties +++ b/java/compiler/openapi/resources/messages/JavaCompilerBundle.properties @@ -268,3 +268,4 @@ popup.title.debug.recent.tests=Debug Recent Tests popup.title.run.recent.tests=Run Recent Tests shift.key=Shift popup.advertisement.debug.with.shift.navigate.with.f4=Debug with {0}, navigate with F4 +module.sources.set.display.name={0, choice, 0#|1#Tests of }''{1}'' module diff --git a/java/compiler/openapi/src/com/intellij/compiler/ModuleSourceSet.java b/java/compiler/openapi/src/com/intellij/compiler/ModuleSourceSet.java index 5b31c73038d5..08d2fc531d8e 100644 --- a/java/compiler/openapi/src/com/intellij/compiler/ModuleSourceSet.java +++ b/java/compiler/openapi/src/com/intellij/compiler/ModuleSourceSet.java @@ -15,7 +15,9 @@ */ package com.intellij.compiler; +import com.intellij.openapi.compiler.JavaCompilerBundle; import com.intellij.openapi.module.Module; +import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -63,8 +65,9 @@ public class ModuleSourceSet { } @NotNull - public String getDisplayName() { - return (myType == Type.PRODUCTION ? "" : "Tests of ") + "'" + myModule.getName() + "' module"; + public @Nls(capitalization = Nls.Capitalization.Sentence) String getDisplayName() { + final int choice = myType == Type.PRODUCTION ? 0 : 1; + return JavaCompilerBundle.message("module.sources.set.display.name", choice, myModule.getName()); } @NotNull diff --git a/java/idea-ui/resources/messages/JavaUiBundle.properties b/java/idea-ui/resources/messages/JavaUiBundle.properties index a7b865ee4a54..fdcf29ff0336 100644 --- a/java/idea-ui/resources/messages/JavaUiBundle.properties +++ b/java/idea-ui/resources/messages/JavaUiBundle.properties @@ -78,7 +78,7 @@ jdk.combo.box.none.item= error.resolve.generic=Resolve Error action.name.extract.artifact=Extract Artifact... prompt.overwrite.project.file=The {1} file \n''{0}''\nalready exists.\nWould you like to overwrite it? -module.circular.dependency.warning.description=There are circular dependencies between: {0} +module.circular.dependency.warning.description=There are circular dependencies between: action.text.0.disabled.if.elements.are.sorted={0} (Disabled if Elements Are Sorted) error.project.undefined=No external project config file is defined dialog.title.extract.artifact=Extract Artifact diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ConfigurationError.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ConfigurationError.java index 3361ec294b65..1d52e80eeffd 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ConfigurationError.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ConfigurationError.java @@ -16,24 +16,42 @@ package com.intellij.openapi.roots.ui.configuration; import com.intellij.openapi.util.NlsContexts.DetailedDescription; +import com.intellij.openapi.util.text.HtmlChunk; import com.intellij.ui.awt.RelativePoint; import org.jetbrains.annotations.NotNull; import javax.swing.*; +import java.util.Comparator; public abstract class ConfigurationError implements Comparable { private final String myPlainTextTitle; - private final @DetailedDescription String myDescription; + private final HtmlChunk myDescription; private boolean myIgnored; + protected ConfigurationError(final String plainTextTitle, final @NotNull HtmlChunk description) { + this(plainTextTitle, description, false); + } + + protected ConfigurationError(final String plainTextTitle, final @NotNull HtmlChunk description, final boolean ignored) { + myPlainTextTitle = plainTextTitle; + myDescription = description; + myIgnored = ignored; + } + + /** + * @deprecated Use the constructors with {@link HtmlChunk} for description + */ + @Deprecated protected ConfigurationError(final String plainTextTitle, final @DetailedDescription String description) { this(plainTextTitle, description, false); } + /** + * @deprecated Use the constructors with {@link HtmlChunk} for description + */ + @Deprecated protected ConfigurationError(final String plainTextTitle, final @DetailedDescription String description, final boolean ignored) { - myPlainTextTitle = plainTextTitle; - myDescription = description; - myIgnored = ignored; + this(plainTextTitle, HtmlChunk.raw(description), ignored); } @NotNull @@ -42,7 +60,7 @@ public abstract class ConfigurationError implements Comparable getDescription().toString()).compare(this, o); if (descriptionResult != 0) return descriptionResult; return 0; diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ErrorPaneConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ErrorPaneConfigurable.java index 43cef39375bf..66dfe0b01cda 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ErrorPaneConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ErrorPaneConfigurable.java @@ -22,7 +22,7 @@ import com.intellij.util.ui.StartupUiUtil; import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.update.MergingUpdateQueue; import com.intellij.util.ui.update.Update; -import com.intellij.xml.util.XmlStringUtil; +import one.util.streamex.StreamEx; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; @@ -36,6 +36,7 @@ import java.awt.event.MouseEvent; import java.net.URL; import java.util.ArrayList; import java.util.List; +import java.util.stream.IntStream; /** * @author Konstantin Bulenkov @@ -165,38 +166,63 @@ public class ErrorPaneConfigurable extends JPanel implements Configurable, Dispo @Contract(pure = true) private static HtmlChunk @NotNull[] getErrorDescriptions(final ConfigurationError @NotNull[] errors) { final int limit = Math.min(errors.length, 100); - final HtmlChunk[] liTags = new HtmlChunk[limit]; - for (int i = 0; i < limit; i++) { - final ConfigurationError error = errors[i]; - String description; - if (error instanceof ProjectConfigurationProblem) { - //todo[nik] pass ProjectStructureProblemDescription directly and get rid of ConfigurationError at all - ProjectStructureProblemDescription problemDescription = ((ProjectConfigurationProblem)error).getProblemDescription(); - description = problemDescription.getDescription(); - if (description == null) { - description = problemDescription.getMessage(false); - if (problemDescription.canShowPlace()) { - ProjectStructureElement place = problemDescription.getPlace().getContainingElement(); - final String link = HtmlChunk.link("http://navigate/" + i, place.getPresentableName()).toString(); - description = XmlStringUtil.convertToHtmlContent(description); - description = place.getTypeName() + " " + link + ": " + StringUtil.decapitalize(description); - } - } - } - else { - description = error.getDescription(); - } - if (XmlStringUtil.isWrappedInHtml(description)) { - description = XmlStringUtil.stripHtml(description); - } - if (error.canBeFixed()) { - final String text = "[" + JavaUiBundle.message("fix.link.text") + "]"; - description += " " + HtmlChunk.link("http://fix/" + i, text); - } - final HtmlChunk li = HtmlChunk.raw("
  • " + description + "
  • "); - liTags[i] = li; + + final Integer[] indices = IntStream.range(0, limit).boxed().toArray(Integer[]::new); + + return StreamEx.zip(indices, errors, ConfigurationErrorWithIndex::new) + .map(ErrorPaneConfigurable::getErrorDescriptionTag) + .toArray(HtmlChunk[]::new); + } + + private static final class ConfigurationErrorWithIndex { + private final int myIdx; + private final @NotNull ConfigurationError myError; + + private ConfigurationErrorWithIndex(final int idx, @NotNull final ConfigurationError error) { + myIdx = idx; + myError = error; } - return liTags; + } + + @Contract(pure = true) + @NotNull + private static HtmlChunk getErrorDescriptionTag(@NotNull final ConfigurationErrorWithIndex errorIndex) { + final int index = errorIndex.myIdx; + final ConfigurationError error = errorIndex.myError ; + + final HtmlChunk description = getErrorDescription(index, error); + + if (!error.canBeFixed()) return description.wrapWith("li"); + + final String text = "[" + JavaUiBundle.message("fix.link.text") + "]"; + + return new HtmlBuilder().append(description) + .append(HtmlChunk.link("http://fix/" + index, text)) + .wrapWith("li"); + } + + @Contract(pure = true) + @NotNull + private static HtmlChunk getErrorDescription(final int index, @NotNull final ConfigurationError error) { + //todo[nik] pass ProjectStructureProblemDescription directly and get rid of ConfigurationError at all + if (!(error instanceof ProjectConfigurationProblem)) return error.getDescription(); + + final ProjectStructureProblemDescription problemDescription = ((ProjectConfigurationProblem)error).getProblemDescription(); + if (problemDescription.getDescription() != null) return problemDescription.getDescription(); + + if (!problemDescription.canShowPlace()) return HtmlChunk.text(problemDescription.getMessage()); + + final String message = StringUtil.decapitalize(problemDescription.getMessage()); + + final ProjectStructureElement place = problemDescription.getPlace().getContainingElement(); + final HtmlChunk link = HtmlChunk.link("http://navigate/" + index, place.getPresentableName()); + + return new HtmlBuilder().append(place.getTypeName()) + .append(" ") + .append(link) + .append(": ") + .append(message) + .toFragment(); } @Nls diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/GeneralProjectSettingsElement.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/GeneralProjectSettingsElement.java index 7f889cd3991a..baa196ae3681 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/GeneralProjectSettingsElement.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/GeneralProjectSettingsElement.java @@ -30,11 +30,12 @@ import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel; import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext; import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.*; +import com.intellij.openapi.util.text.HtmlBuilder; +import com.intellij.openapi.util.text.HtmlChunk; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.Chunk; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.Nls; -import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -77,11 +78,11 @@ public class GeneralProjectSettingsElement extends ProjectStructureElement { List> sourceSetCycles = ModuleCompilerUtil.computeSourceSetCycles(myContext.getModulesConfigurator()); - List cycles = new ArrayList<>(); + List<@Nls String> cycles = new ArrayList<>(); for (Chunk chunk : sourceSetCycles) { final Set sourceSets = chunk.getNodes(); - List names = new ArrayList<>(); + List<@Nls String> names = new ArrayList<>(); for (ModuleSourceSet sourceSet : sourceSets) { String name = sourceSet.getDisplayName(); names.add(names.isEmpty() ? name : StringUtil.decapitalize(name)); @@ -92,15 +93,24 @@ public class GeneralProjectSettingsElement extends ProjectStructureElement { final PlaceInProjectStructureBase place = new PlaceInProjectStructureBase(project, ProjectStructureConfigurable.getInstance(project).createModulesPlace(), this); final String message; - final String description; + final HtmlChunk description; if (cycles.size() > 1) { message = JavaUiBundle.message("circular.dependencies.message"); - @NonNls final String br = "
        "; - StringBuilder cyclesString = new StringBuilder(); - for (int i = 0; i < cycles.size(); i++) { - cyclesString.append(br).append(i + 1).append(". ").append(cycles.get(i)); - } - description = JavaUiBundle.message("module.circular.dependency.warning.description", cyclesString); + + final String header = JavaUiBundle.message("module.circular.dependency.warning.description"); + + final HtmlChunk[] liTags = cycles.stream() + .map(c -> HtmlChunk.tag("li").addText(c)) + .toArray(HtmlChunk[]::new); + + final HtmlChunk.Element ol = HtmlChunk.tag("ol").style("padding-left: 30pt;") + .children(liTags); + + description = new HtmlBuilder() + .append(HtmlChunk.tag("b").addText(header)) + .append(ol) + .toFragment() + ; } else { message = JavaUiBundle.message("module.circular.dependency.warning.short", StringUtil.decapitalize(cycles.get(0))); diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactProblemDescription.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactProblemDescription.java index d38af7f90215..950452c12fd1 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactProblemDescription.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactProblemDescription.java @@ -18,6 +18,7 @@ package com.intellij.openapi.roots.ui.configuration.artifacts; import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ConfigurationErrorQuickFix; import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ProjectStructureProblemDescription; import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ProjectStructureProblemType; +import com.intellij.openapi.util.text.HtmlChunk; import com.intellij.packaging.elements.PackagingElement; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; @@ -31,7 +32,7 @@ public class ArtifactProblemDescription extends ProjectStructureProblemDescripti public ArtifactProblemDescription(@NotNull @Nls(capitalization = Nls.Capitalization.Sentence) String message, @NotNull ProjectStructureProblemType problemType, @Nullable List> pathToPlace, @NotNull PlaceInArtifact place, final List quickFixList) { - super(message, null, place, problemType, quickFixList); + super(message, (HtmlChunk) null, place, problemType, quickFixList); myPathToPlace = pathToPlace; } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactValidationManagerImpl.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactValidationManagerImpl.java index fc4236a7a11a..56666ea95666 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactValidationManagerImpl.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactValidationManagerImpl.java @@ -70,7 +70,7 @@ public class ArtifactValidationManagerImpl implements Disposable { final List problemDescriptions = holder.getProblemDescriptions(); if (problemDescriptions != null) { for (ProjectStructureProblemDescription description : problemDescriptions) { - final String message = description.getMessage(false); + final String message = description.getMessage(); List quickFixes = Collections.emptyList(); if (description instanceof ArtifactProblemDescription) { final ArtifactProblemDescription artifactProblem = (ArtifactProblemDescription)description; diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/LibraryProjectStructureElement.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/LibraryProjectStructureElement.java index 3ff20299dde7..e4d9dc8b0124 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/LibraryProjectStructureElement.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/LibraryProjectStructureElement.java @@ -19,7 +19,6 @@ import com.intellij.openapi.roots.ui.configuration.projectRoot.LibraryConfigurab import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext; import com.intellij.openapi.ui.NamedConfigurable; import com.intellij.openapi.util.ActionCallback; -import com.intellij.openapi.util.NlsContexts; import com.intellij.openapi.util.NlsSafe; import com.intellij.openapi.util.text.HtmlBuilder; import com.intellij.openapi.util.text.HtmlChunk; @@ -65,7 +64,7 @@ public class LibraryProjectStructureElement extends ProjectStructureElement { @NotNull OrderRootType type, String rootName, final ProjectStructureProblemType problemType) { final List invalidUrls = library.getInvalidRootUrls(type); if (!invalidUrls.isEmpty()) { - final String description = createInvalidRootsDescription(invalidUrls, rootName, library.getName()); + final HtmlChunk description = createInvalidRootsDescription(invalidUrls, rootName, library.getName()); final PlaceInProjectStructure place = createPlace(); final String message = JavaUiBundle.message("project.roots.error.message.invalid.roots", rootName, invalidUrls.size()); ProjectStructureProblemDescription.ProblemLevel level = library.getTable().getTableLevel().equals(LibraryTablesRegistrar.PROJECT_LEVEL) @@ -77,7 +76,7 @@ public class LibraryProjectStructureElement extends ProjectStructureElement { } } - private static @NlsContexts.DetailedDescription String createInvalidRootsDescription(List invalidClasses, String rootName, @NlsSafe String libraryName) { + private static HtmlChunk createInvalidRootsDescription(List invalidClasses, String rootName, @NlsSafe String libraryName) { HtmlBuilder buffer = new HtmlBuilder(); final String name = StringUtil.escapeXmlEntities(libraryName); final HtmlChunk.Element link = HtmlChunk.link("http://library/" + name, name); @@ -92,7 +91,7 @@ public class LibraryProjectStructureElement extends ProjectStructureElement { buffer.br().nbsp(2); buffer.append(PathUtil.toPresentableUrl(url)); } - return buffer.wrapWith("html").toString(); + return buffer.toFragment(); } @NotNull @@ -147,7 +146,7 @@ public class LibraryProjectStructureElement extends ProjectStructureElement { @Nls final String result = JavaUiBundle.message("library.0.is.not.used", libraryName); return new ProjectStructureProblemDescription(XmlStringUtil.wrapInHtml(result), - null, + (HtmlChunk) null, createPlace(), ProjectStructureProblemType.unused("unused-library"), ProjectStructureProblemDescription.ProblemLevel.PROJECT, diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectConfigurationProblem.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectConfigurationProblem.java index bacefc60c834..f4c78bdb9a50 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectConfigurationProblem.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectConfigurationProblem.java @@ -17,7 +17,7 @@ import com.intellij.openapi.roots.ui.configuration.ConfigurationError; import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.ui.popup.PopupStep; import com.intellij.openapi.ui.popup.util.BaseListPopupStep; -import com.intellij.openapi.util.NlsContexts; +import com.intellij.openapi.util.text.HtmlChunk; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.awt.RelativePoint; import org.jetbrains.annotations.NotNull; @@ -44,9 +44,12 @@ public class ProjectConfigurationProblem extends ConfigurationError { } } - private static @NlsContexts.DetailedDescription String computeDescription(ProjectStructureProblemDescription description) { - final String descriptionString = description.getDescription(); - return descriptionString != null ? descriptionString : description.getMessage(true); + private static HtmlChunk computeDescription(ProjectStructureProblemDescription description) { + if (description.getDescription() == null) { + return HtmlChunk.text(description.getMessage(true)); + } + + return description.getDescription(); } @NotNull diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemDescription.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemDescription.java index ec98605df00b..40ce641d3cc3 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemDescription.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemDescription.java @@ -17,6 +17,7 @@ package com.intellij.openapi.roots.ui.configuration.projectRoot.daemon; import com.intellij.openapi.util.NlsContexts.DetailedDescription; import com.intellij.openapi.util.NlsSafe; +import com.intellij.openapi.util.text.HtmlChunk; import com.intellij.openapi.util.text.StringUtil; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; @@ -28,7 +29,7 @@ public class ProjectStructureProblemDescription { public enum ProblemLevel {PROJECT, GLOBAL} @NotNull private final @Nls(capitalization = Nls.Capitalization.Sentence) String myMessage; - private final @DetailedDescription String myDescription; + private final HtmlChunk myDescription; private final PlaceInProjectStructure myPlace; private final List myFixes; private final ProjectStructureProblemType myProblemType; @@ -36,7 +37,7 @@ public class ProjectStructureProblemDescription { private final boolean myCanShowPlace; public ProjectStructureProblemDescription(@NotNull @Nls(capitalization = Nls.Capitalization.Sentence) String message, - @Nullable @DetailedDescription String description, + @Nullable HtmlChunk description, @NotNull PlaceInProjectStructure place, @NotNull ProjectStructureProblemType problemType, @NotNull List fixes) { @@ -44,7 +45,7 @@ public class ProjectStructureProblemDescription { } public ProjectStructureProblemDescription(@NotNull @Nls(capitalization = Nls.Capitalization.Sentence) String message, - @Nullable @DetailedDescription String description, + @Nullable HtmlChunk description, @NotNull PlaceInProjectStructure place, @NotNull ProjectStructureProblemType problemType, @NotNull ProblemLevel level, @@ -58,10 +59,46 @@ public class ProjectStructureProblemDescription { myCanShowPlace = canShowPlace; } + /** + * @deprecated use the constructor with {@link HtmlChunk} for description. + */ + @Deprecated + public ProjectStructureProblemDescription(@NotNull @Nls(capitalization = Nls.Capitalization.Sentence) String message, + @Nullable @DetailedDescription String description, + @NotNull PlaceInProjectStructure place, + @NotNull ProjectStructureProblemType problemType, + @NotNull List fixes) { + this(message, description, place, problemType, ProblemLevel.PROJECT, fixes, true); + } + + /** + * @deprecated use the constructor with {@link HtmlChunk} for description. + */ + @Deprecated + public ProjectStructureProblemDescription(@NotNull @Nls(capitalization = Nls.Capitalization.Sentence) String message, + @Nullable @DetailedDescription String description, + @NotNull PlaceInProjectStructure place, + @NotNull ProjectStructureProblemType problemType, + @NotNull ProblemLevel level, + @NotNull List fixes, final boolean canShowPlace) { + this(message, + description != null ? HtmlChunk.raw(description) : null, + place, + problemType, + level, + fixes, + canShowPlace); + } + public ProblemLevel getProblemLevel() { return myProblemLevel; } + @NotNull + public @Nls(capitalization = Nls.Capitalization.Sentence) String getMessage() { + return myMessage; + } + @NotNull public @Nls(capitalization = Nls.Capitalization.Sentence) String getMessage(final boolean includePlace) { if (!includePlace || !myCanShowPlace) return myMessage; @@ -74,8 +111,7 @@ public class ProjectStructureProblemDescription { return myCanShowPlace; } - @Nullable - public @DetailedDescription String getDescription() { + public HtmlChunk getDescription() { return myDescription; }