/**
   * Update the Decision Table model with the columns contained in the grid. The Decision Table
   * controls indexing of new columns to preserve grouping of column types. If the order of columns
   * is important to client-code this can be called to ensure columns within the model are
   * synchronised with the Decision Table.
   */
  public void scrapeColumns() {

    // Clear existing definition
    model.getMetadataCols().clear();
    model.getAttributeCols().clear();
    model.getConditionCols().clear();
    model.getActionCols().clear();

    RowNumberCol rnCol = null;
    DescriptionCol descCol = null;

    // Extract column information
    for (DynamicColumn<DTColumnConfig> column : widget.getGridWidget().getColumns()) {
      DTColumnConfig modelCol = column.getModelColumn();
      if (modelCol instanceof RowNumberCol) {
        rnCol = (RowNumberCol) modelCol;
        model.setRowNumberCol(rnCol);

      } else if (modelCol instanceof DescriptionCol) {
        descCol = (DescriptionCol) modelCol;
        model.setDescriptionCol(descCol);

      } else if (modelCol instanceof MetadataCol) {
        MetadataCol tc = (MetadataCol) modelCol;
        model.getMetadataCols().add(tc);

      } else if (modelCol instanceof AttributeCol) {
        AttributeCol tc = (AttributeCol) modelCol;
        model.getAttributeCols().add(tc);

      } else if (modelCol instanceof ConditionCol) {
        ConditionCol tc = (ConditionCol) modelCol;
        model.getConditionCols().add(tc);

      } else if (modelCol instanceof ActionCol) {
        ActionCol tc = (ActionCol) modelCol;
        model.getActionCols().add(tc);
      }
      modelCol.setWidth(column.getWidth());
      modelCol.setHideColumn(!column.isVisible());
    }
  }