/**
  * Renderes a list or table cell value if the value contains an OWLAnnotation.
  *
  * @param page The page that the value will be rendered into.
  * @param value The value that may or may not contain an OWLAnnotation. The annotation will be
  *     extracted from this value.
  * @param foreground The default foreground color.
  * @param background The default background color.
  * @param isSelected Whether or not the cell containing the value is selected.
  */
 private void renderCellValue(
     Page page, Object value, Color foreground, Color background, boolean isSelected) {
   OWLAnnotation annotation = extractOWLAnnotationFromCellValue(value);
   if (annotation != null) {
     renderAnnotationProperty(page, annotation, foreground, background, isSelected);
     renderAnnotationValue(page, annotation, foreground, background, isSelected);
     if (inlineAnnotationRendering == RENDER_COMPOUND_ANNOTATIONS_INLINE
         && value instanceof HasAnnotations) {
       Page subAnnotationPage = new Page();
       for (OWLAnnotation anno : ((HasAnnotations) value).getAnnotations()) {
         renderCellValue(subAnnotationPage, anno, foreground, background, isSelected);
       }
       subAnnotationPage.setMarginLeft(40);
       subAnnotationPage.setOpacity(0.6);
       page.add(subAnnotationPage);
     }
   }
   switch (annotationRenderingStyle) {
     case COMFORTABLE:
       page.setMargin(2);
       page.setMarginBottom(6);
       break;
     case COSY:
       page.setMargin(1);
       page.setMarginBottom(3);
       break;
     case COMPACT:
       page.setMargin(0);
       page.setMarginBottom(1);
   }
 }
 /**
  * Renders an IRI as a full IRI rather than as an IRI that represents an entity in the signature
  * of the imports closure of the active ontology.
  *
  * @param page The page that the IRI should be rendered into.
  * @param iri The IRI to be rendered.
  * @return A list of paragraphs that represent the rendering of the annotation value.
  */
 private List<Paragraph> renderExternalIRI(Page page, IRI iri) {
   Paragraph paragraph;
   if (isLinkableAddress(iri)) {
     paragraph = page.addParagraph(iri.toString(), new HTTPLink(iri.toURI()));
   } else {
     paragraph = page.addParagraph(iri.toString());
   }
   return Arrays.asList(paragraph);
 }
 /**
  * Renders the annotation property into a paragraph in the page.
  *
  * @param page The page to insert the paragraph into.
  * @param annotation The annotation containing the property to be rendered.
  * @param defaultForeground The default foreground color.
  * @param defaultBackground The default background color.
  * @param isSelected Specifies whether the associated cell is selected or not.
  */
 private Paragraph renderAnnotationProperty(
     Page page,
     OWLAnnotation annotation,
     Color defaultForeground,
     Color defaultBackground,
     boolean isSelected) {
   OWLAnnotationProperty property = annotation.getProperty();
   String rendering = editorKit.getOWLModelManager().getRendering(property);
   Paragraph paragraph = page.addParagraph(rendering);
   Color foreground = getAnnotationPropertyForeground(defaultForeground, isSelected);
   paragraph.setForeground(foreground);
   //        if (isReferenceOntologyActive()) {
   //            paragraph.setBold(true);
   //        }
   if (annotation.getValue() instanceof OWLLiteral) {
     OWLLiteral literalValue = (OWLLiteral) annotation.getValue();
     paragraph.append("    ", foreground);
     appendTag(paragraph, literalValue, foreground, isSelected);
   }
   switch (annotationRenderingStyle) {
     case COMFORTABLE:
       paragraph.setMarginBottom(4);
       break;
     case COSY:
       paragraph.setMarginBottom(2);
       break;
     case COMPACT:
       paragraph.setMarginBottom(1);
       break;
   }
   return paragraph;
 }
 /**
  * Renders an annotation value that is an OWLLiteral.
  *
  * @param page The page that the value will be rendered into.
  * @param literal The literal to be rendered.
  * @param foreground The default foreground.
  * @param background The default background.
  * @param isSelected Whether or not the cell containing the annotation value is selected.
  * @return A list of paragraphs that represent the rendering of the literal.
  */
 private List<Paragraph> renderLiteral(
     Page page, OWLLiteral literal, Color foreground, Color background, boolean isSelected) {
   String rendering = EscapeUtils.unescapeString(literal.getLiteral()).trim();
   List<Paragraph> result = new ArrayList<>();
   if (rendering.length() > 0) {
     List<LinkSpan> linkSpans = extractLinks(rendering);
     Paragraph literalParagraph = new Paragraph(rendering, linkSpans);
     literalParagraph.setForeground(foreground);
     page.add(literalParagraph);
     result.add(literalParagraph);
     Paragraph tagParagraph = literalParagraph; // new Paragraph("");
     tagParagraph.append("    ", foreground);
     page.add(tagParagraph);
     result.add(tagParagraph);
     tagParagraph.setMarginTop(2);
     tagParagraph.setTabCount(2);
     //            appendTag(tagParagraph, literal, foreground, isSelected);
   }
   return result;
 }
  /**
   * Renders an IRI as a full IRI rather than as an IRI that represents an entity in the signature
   * of the imports closure of the active ontology.
   *
   * @param page The page that the IRI should be rendered into.
   * @param iri The IRI to be rendered.
   * @return A list of paragraphs that represent the rendering of the annotation value.
   */
  private List<Paragraph> renderExternalIRI(Page page, IRI iri) {
    List<Paragraph> paragraphs = new ArrayList<>();
    String iriString = iri.toString();
    if (isLinkableAddress(iri)) {
      if (isImageAddress(iri) && isDisplayThumbnails()) {
        try {
          IconBox iconBox = getImageBox(iri);
          page.add(iconBox);

        } catch (MalformedURLException e) {
          paragraphs.add(page.addParagraph(iriString, new HTTPLink(iri.toURI())));
        }
      } else {
        paragraphs.add(page.addParagraph(iriString, new HTTPLink(iri.toURI())));
      }
    } else {
      paragraphs.add(page.addParagraph(iriString));
    }
    return paragraphs;
  }
 /**
  * Renderes a set of entities as an annotation value. The idea is that the annotation value is an
  * IRI that corresponds to the IRI of entities in the imports closure of the active ontology.
  *
  * @param page The page that the entities will be rendered into.
  * @param entities The entities.
  * @return A list of paragraphs that represents the rendering of the entities.
  */
 private List<Paragraph> renderEntities(Page page, Set<OWLEntity> entities) {
   List<Paragraph> paragraphs = new ArrayList<>();
   for (OWLEntity entity : entities) {
     Icon icon = getIcon(entity);
     OWLModelManager modelManager = editorKit.getOWLModelManager();
     Paragraph paragraph =
         new Paragraph(modelManager.getRendering(entity), new OWLEntityLink(editorKit, entity));
     paragraph.setIcon(icon);
     page.add(paragraph);
     paragraphs.add(paragraph);
   }
   return paragraphs;
 }
 /**
  * Renders an annotation value that is an anonymous individual.
  *
  * @param page The page that the individual should be rendered into.
  * @param individual The individual.
  * @return A list of paragraphs that represent the rendering of the individual.
  */
 private List<Paragraph> renderAnonymousIndividual(Page page, OWLAnonymousIndividual individual) {
   String rendering = editorKit.getOWLModelManager().getRendering(individual);
   Paragraph paragraph = page.addParagraph(rendering);
   paragraph.setIcon(getIcon(individual));
   return Arrays.asList(paragraph);
 }