Ejemplo n.º 1
0
  /**
   * Parses this to extract the Tokens using a line of text. This is necessary to evaluate the
   * rendering of the text (color, size, alignment...).
   *
   * @param g The graphics used to retrieve the font metrics.
   * @param htmlText A string of text with or without HTML tags to parse.
   */
  protected void parseText(Graphics g, String htmlText) {
    StringTokenizer tokenizer = new StringTokenizer(htmlText, "<>", true);
    String tokenStr, nextStr, prevStr = tokenizer.nextToken();
    boolean hasMore = tokenizer.hasMoreTokens(), isText = false;
    Font font = new Font(m_name, m_style, m_size);
    TextToken textTok = new TextToken();

    textTok.m_color = new Color(m_color);
    textTok.m_font = font;

    m_curTok = new FormatToken();
    m_curTok.m_flags = m_body.m_flags;
    m_curTok.m_margin = m_body.m_margin;

    m_tokens.addElement(m_curTok);

    g.setFont(font);

    while (hasMore) {
      tokenStr = tokenizer.nextToken();
      hasMore = tokenizer.hasMoreTokens();

      // A start of Tag
      if (prevStr.equals("<")) {
        nextStr = hasMore ? tokenizer.nextToken() : null;

        // A closed Tag
        if (hasMore && nextStr.equals(">")) // tag
        {
          textTok = updateTag(g, tokenStr);

          // An real Tag
          if (textTok != null) {
            isText = false;
          }
          // An unknown Tag. Handle it as normal text.
          else {
            textTok = new TextToken();
            updateText(g, "<" + tokenStr + ">", textTok, isText);
            isText = true;
          }

          prevStr = tokenizer.hasMoreTokens() ? tokenizer.nextToken() : null;
        }
        // An unclosed Tag. Handle it as normal text.
        else {
          updateText(g, "<" + tokenStr, textTok, isText);
          prevStr = nextStr;
          isText = true;
        }
      }
      // Normal text
      else {
        updateText(g, prevStr, textTok, isText);
        prevStr = tokenStr;
        isText = true;
      }

      hasMore = tokenizer.hasMoreTokens();
    }

    // Don't forget the last or only piece of text
    if (prevStr != null) {
      updateText(g, prevStr, textTok, isText);
    }

    updateTag(g, "br"); // to set last line position

    updateBounds();
  }