private void setupTableHeaders(boolean includeMappingColumn) {
    Label defsLabel = new Label(definitionsLabel);
    defsLabel.setStyleName(style.definitionHeader());
    table.setWidget(0, 0, defsLabel);
    table.getFlexCellFormatter().setColSpan(0, 0, includeMappingColumn ? 2 : 4);
    table.getFlexCellFormatter().setStyleName(0, 0, style.headerCell());

    if (includeMappingColumn) {
      Label tarsLabel = new Label(targetsLabel);
      tarsLabel.setStyleName(style.targetHeader());
      table.setWidget(0, 1, tarsLabel);
      table.getFlexCellFormatter().setColSpan(0, 1, 2);
      table.getFlexCellFormatter().setStyleName(0, 1, style.headerCell());
    }
  }
  public DefinitionsMappingPanel(
      DefinitionWidgetProvider<T> widgetProvider,
      String definitionsLabel,
      String targetsLabel,
      boolean includeTargetColumn) {
    this.widgetProvider = widgetProvider;
    this.definitionsLabel = definitionsLabel;
    this.targetsLabel = targetsLabel;
    this.includeTargetColumn = includeTargetColumn;
    container = new SimplePanel();
    table = new FlexTable();
    table.setCellPadding(5);
    table.setCellSpacing(5);
    table.setStyleName(style.table());
    setupLoadingContainer();

    container.setWidget(table);
    initWidget(container);
  }
  /** {@inheritDoc} */
  @SuppressWarnings("unchecked")
  public void setMappings(List<DefinitionMapping> mappings) {
    table.removeAllRows();
    definitionsPanels.clear();
    includeCheckBoxes.clear();
    targetWidgets.clear();
    definitions.clear();

    setupTableHeaders(includeTargetColumn);

    table.getColumnFormatter().setWidth(DEFINITION_COLUMN, "100%");
    // table.getColumnFormatter().setWidth(ARROW_COLUMN, "70px");

    if (mappings.isEmpty()) {
      Label noAttributesLabel = new Label("No attributes or links");
      table.setWidget(1, 0, noAttributesLabel);
      table.getFlexCellFormatter().setColSpan(1, 0, includeTargetColumn ? 3 : 4);
      table.getFlexCellFormatter().setStyleName(1, 0, style.emptyCell());

    } else {
      FlexCellFormatter cellFormatter = table.getFlexCellFormatter();
      for (DefinitionMapping mapping : mappings) {

        final int row = table.getRowCount();
        UIDefinition definition = mapping.getDefinition();
        definitions.add(definition);

        DefinitionPanel definitionPanel = new DefinitionPanel();
        definitionPanel.setDefinition(definition);
        definitionPanel.setEnabled(mapping.isMapped());

        definitionsPanels.add(definitionPanel);
        table.setWidget(row, DEFINITION_COLUMN, definitionPanel);
        cellFormatter.setVerticalAlignment(
            row, DEFINITION_COLUMN, HasVerticalAlignment.ALIGN_MIDDLE);

        final SimpleCheckBox includeCheckBox = new SimpleCheckBox();
        includeCheckBox.setStyleName(
            CommonResources.INSTANCE.css().simpleCheckbox() + " " + style.checkbox());
        includeCheckBox.addClickHandler(
            new ClickHandler() {

              @Override
              public void onClick(ClickEvent event) {
                setInclude(row, includeCheckBox.getValue());
              }
            });

        includeCheckBox.setValue(mapping.isMapped());
        table.setWidget(row, INCLUDE_COLUMN, includeCheckBox);
        cellFormatter.setVerticalAlignment(row, INCLUDE_COLUMN, HasVerticalAlignment.ALIGN_MIDDLE);
        includeCheckBoxes.add(includeCheckBox);

        Widget targetWidget = widgetProvider.getTargetWidget((T) mapping.getTarget());

        if (targetWidget != null) {

          Image arrow = new Image(Resources.INSTANCE.arrow());
          arrow.setStyleName(style.arrow());
          table.setWidget(row, ARROW_COLUMN, arrow);
          cellFormatter.setVerticalAlignment(row, ARROW_COLUMN, HasVerticalAlignment.ALIGN_MIDDLE);
          // table.getCellFormatter().setWidth(row, ARROW_COLUMN, "60px");
          table.getCellFormatter().setHeight(row, ARROW_COLUMN, "40px");

          widgetProvider.include(targetWidget, mapping.isMapped());

          table.setWidget(row, TARGET_COLUMN, targetWidget);
          cellFormatter.setVerticalAlignment(row, TARGET_COLUMN, HasVerticalAlignment.ALIGN_MIDDLE);
          targetWidgets.add(targetWidget);
        }
      }
    }
  }