private String getMessage(final ParserMessage msg) {
    if (msg instanceof AmbiguousRootParserMessage) {
      final TypeNode tn = model.getRoot();
      final AmbiguousRootParserMessage m = (AmbiguousRootParserMessage) msg;
      return GuidedDecisionTreeConstants.INSTANCE.parserMessageAmbiguousRootParserMessage(
          tn.getClassName(), m.getClassName());

    } else if (msg instanceof BindingNotFoundParserMessage) {
      final BindingNotFoundParserMessage m = (BindingNotFoundParserMessage) msg;
      return GuidedDecisionTreeConstants.INSTANCE.parserMessageBindingNotFoundParserMessage(
          m.getBinding());

    } else if (msg instanceof DataTypeConversionErrorParserMessage) {
      final DataTypeConversionErrorParserMessage m = (DataTypeConversionErrorParserMessage) msg;
      return GuidedDecisionTreeConstants.INSTANCE.parserMessageDataTypeConversionErrorParserMessage(
          m.getValue(), m.getDataTypeClassName());

    } else if (msg instanceof DataTypeNotFoundParserMessage) {
      final DataTypeNotFoundParserMessage m = (DataTypeNotFoundParserMessage) msg;
      return GuidedDecisionTreeConstants.INSTANCE.parserMessageDataTypeNotFoundParserMessage(
          m.getClassName(), m.getFieldName());

    } else if (msg instanceof DefaultParserMessage) {
      final DefaultParserMessage m = (DefaultParserMessage) msg;
      return GuidedDecisionTreeConstants.INSTANCE.parserMessageDefaultParserMessage(m.getMessage());

    } else if (msg instanceof InvalidRootParserMessage) {
      return GuidedDecisionTreeConstants.INSTANCE.parserMessageInvalidRootParserMessage();

    } else if (msg instanceof UnsupportedFieldConstraintParserMessage) {
      return GuidedDecisionTreeConstants.INSTANCE
          .parserMessageUnsupportedFieldConstraintParserMessage();

    } else if (msg instanceof UnsupportedFieldConstraintTypeParserMessage) {
      return GuidedDecisionTreeConstants.INSTANCE
          .parserMessageUnsupportedFieldConstraintTypeParserMessage();

    } else if (msg instanceof UnsupportedFieldNatureTypeParserMessage) {
      return GuidedDecisionTreeConstants.INSTANCE
          .parserMessageUnsupportedFieldNatureTypeParserMessage();

    } else if (msg instanceof UnsupportedIActionParserMessage) {
      return GuidedDecisionTreeConstants.INSTANCE.parserMessageUnsupportedIActionParserMessage();

    } else if (msg instanceof UnsupportedIPatternParserMessage) {
      return GuidedDecisionTreeConstants.INSTANCE.parserMessageUnsupportedIPatternParserMessage();

    } else {
      return GuidedDecisionTreeConstants.INSTANCE.parserMessageUnknownMessage();
    }
  }
  public ParserMessagesPopup(final GuidedDecisionTree model) {
    this.model = checkNotNull("model", model);

    for (GuidedDecisionTreeParserError error : model.getParserErrors()) {
      for (ParserMessage msg : error.getMessages()) {
        errors.add(Pair.newPair(error.getOriginalDrl(), msg));
      }
    }

    setTitle(GuidedDecisionTreeConstants.INSTANCE.popupTitleParserMessages());
    messages = new MessageTableWidget<Pair<String, ParserMessage>>();
    messages.setToolBarVisible(false);
    messages.setHeight("150px");

    footer.addButton(
        GuidedDecisionTreeConstants.INSTANCE.remove(),
        new Command() {
          @Override
          public void execute() {
            model.getParserErrors().clear();
            hide();
          }
        },
        IconType.WARNING,
        ButtonType.DANGER);
    footer.addButton(
        GuidedDecisionTreeConstants.INSTANCE.ignore(),
        new Command() {
          @Override
          public void execute() {
            hide();
          }
        },
        ButtonType.PRIMARY);

    setBody(uiBinder.createAndBindUi(this));
    add(footer);

    messages.addCellPreviewHandler(
        new CellPreviewEvent.Handler<Pair<String, ParserMessage>>() {
          @Override
          public void onCellPreview(final CellPreviewEvent<Pair<String, ParserMessage>> event) {
            if (Event.getTypeInt(event.getNativeEvent().getType()) == Event.ONCLICK) {
              drlPreview.setContent(event.getValue().getK1());
            }
          }
        });

    messages.setRowData(errors);

    messages.addLevelColumn(
        10,
        new MessageTableWidget.ColumnExtractor<Level>() {
          @Override
          public Level getValue(final Object row) {
            return Level.ERROR;
          }
        });

    messages.addTextColumn(
        90,
        new MessageTableWidget.ColumnExtractor<String>() {
          @Override
          public String getValue(final Object row) {
            return getMessage(((Pair<String, ParserMessage>) row).getK2());
          }
        });
  }