private static String getTextAreaContent(Creature creature) {
    StringBuilder sb = new StringBuilder();

    if (creature.getTemplate().getRace().showDetailedDescription()) {
      appendDetails(creature, sb);
    } else {
      sb.append("<div style=\"font-family: medium-blue;\">");
      sb.append(creature.getTemplate().getRace().getName());
      sb.append("</div>");
    }

    synchronized (creature.getEffects()) {
      for (Effect effect : creature.getEffects()) {
        effect.appendDescription(sb);
      }
    }

    for (Inventory.Slot slot : Inventory.Slot.values()) {
      Item item = creature.inventory.getEquippedItem(slot);
      if (item == null) continue;

      if (item != null) {
        synchronized (item.getEffects()) {
          for (Effect effect : item.getEffects()) {
            effect.appendDescription(sb);
          }
        }
      }
    }

    return sb.toString();
  }
  /**
   * Create a new CreatureDetailsWindow displaying details for the specified Creature.
   *
   * @param creature the Creature to show details for
   */
  public CreatureDetailsWindow(Creature creature) {
    this.creature = creature;
    creature.addViewer(this);

    this.setSize(280, 300);
    this.setTitle("Details for " + creature.getTemplate().getName());

    DialogLayout layout = new DialogLayout();
    layout.setTheme("content");
    this.add(layout);

    // set up the widgets for the top row
    Widget viewer = new Viewer();
    viewer.setTheme("iconviewer");
    Label title = new Label(creature.getTemplate().getName());
    title.setTheme("titlelabel");

    DialogLayout.Group topRowV = layout.createParallelGroup(viewer, title);

    DialogLayout.Group topRowH = layout.createSequentialGroup(viewer);
    topRowH.addGap(10);
    topRowH.addWidget(title);
    topRowH.addGap(10);

    // create widgets for details text area
    textAreaModel = new HTMLTextAreaModel();
    TextArea textArea = new TextArea(textAreaModel);
    ScrollPane textPane = new ScrollPane(textArea);
    textPane.setFixed(ScrollPane.Fixed.HORIZONTAL);
    textPane.setTheme("detailspane");

    // set the main top level layout
    Group mainGroupV = layout.createSequentialGroup();
    mainGroupV.addGroup(topRowV);
    mainGroupV.addGap(5);
    mainGroupV.addWidget(textPane);

    Group mainGroupH = layout.createParallelGroup();
    mainGroupH.addGroup(topRowH);
    mainGroupH.addWidget(textPane);

    layout.setHorizontalGroup(mainGroupH);
    layout.setVerticalGroup(mainGroupV);

    entityUpdated(creature);
  }
  private static void appendDetails(Creature creature, StringBuilder sb) {
    sb.append("<div style=\"font-family: medium;\">");
    sb.append(creature.getTemplate().getGender()).append(' ');
    sb.append("<span style=\"font-family: medium-blue;\">")
        .append(creature.getTemplate().getRace().getName())
        .append("</span>");
    sb.append("</div>");

    sb.append("<div style=\"font-family: medium; margin-bottom: 1em\">");
    for (String roleID : creature.roles.getRoleIDs()) {
      Role role = Game.ruleset.getRole(roleID);
      int level = creature.roles.getLevel(role);

      sb.append("<p>");
      sb.append("Level <span style=\"font-family: medium-italic;\">")
          .append(level)
          .append("</span> ");
      sb.append("<span style=\"font-family: medium-red;\">")
          .append(role.getName())
          .append("</span>");
      sb.append("</p>");
    }
    sb.append("</div>");

    sb.append("<div style=\"font-family: medium; margin-bottom: 1em\">");
    sb.append("Hit Points ");
    sb.append("<span style=\"font-family: medium-italic-green\">");
    sb.append(creature.getCurrentHitPoints())
        .append("</span> / <span style=\"font-family: medium-italic-green\">");
    sb.append(creature.stats.get(Stat.MaxHP)).append("</span>");
    sb.append("</div>");

    Item mainHand = creature.getMainHandWeapon();
    Item offHand = creature.inventory.getEquippedItem(Inventory.Slot.OffHand);

    sb.append("<div style=\"margin-bottom: 1em; font-family: medium;\"><p>Main hand</p>");
    sb.append("<div style=\"font-family: medium-italic-blue\">");
    sb.append(mainHand.getTemplate().getName()).append("</div></div>");

    if (offHand != null) {
      sb.append("<div style=\"margin-bottom: 1em; font-family: medium;\"><p>Off hand</p>");
      sb.append("<div style=\"font-family: medium-italic-blue\">");
      sb.append(offHand.getTemplate().getName()).append("</div></div>");
    }
  }
 @Override
 public void run() {
   removeListener();
   creature.removeViewer(this);
 }