示例#1
0
  public static TextDocument parseMText(MText text) {
    // initialize
    TextDocument doc = new TextDocument();
    StringBuffer buf = new StringBuffer();
    StringBuffer value = new StringBuffer();
    StyledTextParagraph p = createParagraphFromMText(text);

    switch (text.getAlignment()) {
      case MText.ATTACHMENT_TOP_LEFT:
        p.setValign(StyledTextParagraph.VERTICAL_ALIGNMENT_TOP);

        break;

      case MText.ATTACHMENT_TOP_CENTER:
        p.setValign(StyledTextParagraph.VERTICAL_ALIGNMENT_TOP);

        break;

      case MText.ATTACHMENT_TOP_RIGHT:
        p.setValign(StyledTextParagraph.VERTICAL_ALIGNMENT_TOP);

        break;

      case MText.ATTACHMENT_MIDDLE_LEFT:
        p.setValign(StyledTextParagraph.VERTICAL_ALIGNMENT_CENTER);

        break;

      case MText.ATTACHMENT_MIDDLE_CENTER:
        p.setValign(StyledTextParagraph.VERTICAL_ALIGNMENT_CENTER);

        break;

      case MText.ATTACHMENT_MIDDLE_RIGHT:
        p.setValign(StyledTextParagraph.VERTICAL_ALIGNMENT_CENTER);

        break;

      case MText.ATTACHMENT_BOTTOM_LEFT:
        p.setValign(StyledTextParagraph.VERTICAL_ALIGNMENT_BASELINE);

        break;

      case MText.ATTACHMENT_BOTTOM_CENTER:
        p.setValign(StyledTextParagraph.VERTICAL_ALIGNMENT_BASELINE);

        break;

      case MText.ATTACHMENT_BOTTOM_RIGHT:
        p.setValign(StyledTextParagraph.VERTICAL_ALIGNMENT_BASELINE);

        break;

      default:
        p.setValign(StyledTextParagraph.VERTICAL_ALIGNMENT_BASELINE);

        break;
    }

    boolean formatting = false;
    boolean keyfollow = false;
    boolean complete = true;
    Stack<StyledTextParagraph> paras = new Stack<StyledTextParagraph>();
    int linecount = 0;
    int linePosition = 0;
    String str = text.getText();
    char key = ' ';

    // parse the symbols
    str = parseSymbols(str);

    // http://www.cadforum.cz/cadforum_en/text-formatting-codes-in-mtext-objects-tip8640

    // parse the style
    for (int i = 0; i < str.length(); i++) {
      char c = str.charAt(i);

      switch (c) {
        case '\\':
          if (formatting) {
            if (!complete) {
              parseStyledTextParagraphSettings(key, value.toString(), p);
              value.delete(0, value.length());
              formatting = true;
              keyfollow = true;
            } else {
              buf.append(c);
              formatting = false;
            }
          } else {
            formatting = true;
            keyfollow = true;
            complete = false;
          }

          break;

        case '~':
          if (formatting) {
            buf.append(c);
            formatting = false;
            keyfollow = false;
          }

          break;

        case ';':
          if (formatting) {
            parseStyledTextParagraphSettings(key, value.toString(), p);
            value.delete(0, value.length());
            formatting = false;
            complete = true;
            keyfollow = false;
          } else {
            buf.append(c);
          }

          break;

        case '}':
          if (formatting && keyfollow) {
            buf.append(c);
            formatting = false;
            keyfollow = false;
          } else {
            if (formatting) {
              value.append(c);
            } else {
              // format change end
              if (buf.length() > 0) {
                p.setText(buf.toString());
                doc.addStyledParagraph(p);
                buf.delete(0, buf.length());
              }

              if (paras.size() > 0) {
                p = createParagraphFromParent((StyledTextParagraph) paras.pop());
              } else {
                p = createParagraphFromMText(text);
              }
            }
          }

          break;

        case '{':
          if (formatting && keyfollow) {
            buf.append(c);
            formatting = false;
            keyfollow = false;
          } else {
            if (formatting) {
              value.append(c);
            } else {
              // start format change
              if (linePosition != 0) {
                p.setText(buf.toString());
                if (buf.length() > 0) {
                  doc.addStyledParagraph(p);
                  buf.delete(0, buf.length());
                }
                paras.add(p);
                p = createParagraphFromMText(text);
              }
            }
          }

          break;

        case 'O':
          if (formatting && keyfollow) {
            if (buf.length() > 0) {
              p.setText(buf.toString());
              buf.delete(0, buf.length());
              doc.addStyledParagraph(p);
              p = createParagraphFromParent(p);
            }
            p.setOverline(true);
            formatting = false;
            keyfollow = false;
          } else {
            if (formatting) {
              value.append(c);
            } else {
              buf.append(c);
            }
          }

          break;

        case 'o':
          if (formatting && keyfollow) {
            if (buf.length() > 0) {
              p.setText(buf.toString());
              buf.delete(0, buf.length());
              doc.addStyledParagraph(p);
              p = createParagraphFromParent(p);
            }
            p.setOverline(false);
            formatting = false;
            keyfollow = false;
          } else {
            if (formatting) {
              value.append(c);
            } else {
              buf.append(c);
            }
          }

          break;

        case 'u':
          if (formatting && keyfollow) {
            if (buf.length() > 0) {
              p.setText(buf.toString());
              buf.delete(0, buf.length());
              doc.addStyledParagraph(p);
              p = createParagraphFromParent(p);
            }
            p.setUnderline(false);
            formatting = false;
            keyfollow = false;
          } else {
            if (formatting) {
              value.append(c);
            } else {
              buf.append(c);
            }
          }

          break;

        case 'L':
          if (formatting && keyfollow) {
            if (buf.length() > 0) {
              p.setText(buf.toString());
              buf.delete(0, buf.length());
              doc.addStyledParagraph(p);
              p = createParagraphFromParent(p);
            }
            p.setUnderline(true);
            formatting = false;
            keyfollow = false;
          } else {
            if (formatting) {
              value.append(c);
            } else {
              buf.append(c);
            }
          }

          break;

        case 'l':
          if (formatting && keyfollow) {
            if (buf.length() > 0) {
              p.setText(buf.toString());
              buf.delete(0, buf.length());
              doc.addStyledParagraph(p);
              p = createParagraphFromParent(p);
            }
            p.setUnderline(false);
            formatting = false;
            keyfollow = false;
          } else {
            if (formatting) {
              value.append(c);
            } else {
              buf.append(c);
            }
          }

          break;

        case 'P':
          if (formatting && keyfollow) {
            // end the current paragraph and set its newline flag
            p.setText(buf.toString());
            buf.delete(0, buf.length());
            p.setNewline(true);
            doc.addStyledParagraph(p);
            linecount++;

            // start a new line
            p = createParagraphFromParent(p);
            p.setLineIndex(linecount);

            formatting = false;
            keyfollow = false;
            linePosition = 0;
          } else {
            if (formatting) {
              value.append(c);
            } else {
              buf.append(c);
            }
          }

          break;

        default:
          if (formatting) {
            if (keyfollow) {
              key = c;
              keyfollow = false;
            } else {
              value.append(c);
            }
          } else {
            buf.append(c);
          }

          break;
      }

      linePosition++;
    }

    if (formatting) {
      parseStyledTextParagraphSettings(key, value.toString(), p);
    }

    if (buf.length() > 0) {
      p.setText(buf.toString());
      doc.addStyledParagraph(p);
    }

    if (doc.getParagraphCount() == 0) {
      doc.addStyledParagraph(p);
    }

    return doc;
  }