private ActionInsertFactCol52 cloneActionInsertColumn(ActionInsertFactCol52 col) {
   ActionInsertFactCol52 clone = null;
   if (col instanceof LimitedEntryActionInsertFactCol52) {
     clone = new LimitedEntryActionInsertFactCol52();
     DTCellValue52 dcv = cloneLimitedEntryValue(((LimitedEntryCol) col).getValue());
     ((LimitedEntryCol) clone).setValue(dcv);
   } else {
     clone = new ActionInsertFactCol52();
   }
   clone.setBoundName(col.getBoundName());
   clone.setType(col.getType());
   clone.setFactField(col.getFactField());
   clone.setFactType(col.getFactType());
   clone.setHeader(col.getHeader());
   clone.setValueList(col.getValueList());
   clone.setDefaultValue(col.getDefaultValue());
   clone.setHideColumn(col.isHideColumn());
   clone.setInsertLogical(col.isInsertLogical());
   return clone;
 }
  public ActionInsertColumnPopup(
      SuggestionCompletionEngine sce,
      final GuidedDecisionTable52 model,
      final GenericColumnCommand refreshGrid,
      final ActionInsertFactCol52 col,
      final boolean isNew) {
    this.editingCol = cloneActionInsertColumn(col);
    this.model = model;
    this.sce = sce;

    // Set-up factory for common widgets
    factory = new DTCellValueWidgetFactory(model, sce);

    setTitle(constants.ActionColumnConfigurationInsertingANewFact());
    setModal(false);

    // Fact being inserted
    HorizontalPanel pattern = new HorizontalPanel();
    pattern.add(patternLabel);
    doPatternLabel();

    Image changePattern =
        new ImageButton(
            images.edit(),
            constants.ChooseAPatternThatThisColumnAddsDataTo(),
            new ClickHandler() {
              public void onClick(ClickEvent w) {
                showChangePattern(w);
              }
            });
    pattern.add(changePattern);
    addAttribute(constants.Pattern(), pattern);

    // Fact field being set
    HorizontalPanel field = new HorizontalPanel();
    field.add(fieldLabel);
    Image editField =
        new ImageButton(
            images.edit(),
            constants.EditTheFieldThatThisColumnOperatesOn(),
            new ClickHandler() {
              public void onClick(ClickEvent w) {
                showFieldChange();
              }
            });
    field.add(editField);
    addAttribute(constants.Field(), field);
    doFieldLabel();

    // Column header
    final TextBox header = new TextBox();
    header.setText(col.getHeader());
    header.addChangeHandler(
        new ChangeHandler() {
          public void onChange(ChangeEvent event) {
            editingCol.setHeader(header.getText());
          }
        });
    addAttribute(constants.ColumnHeaderDescription(), header);

    // Optional value list
    if (model.getTableFormat() == TableFormat.EXTENDED_ENTRY) {
      final TextBox valueList = new TextBox();
      valueList.setText(editingCol.getValueList());
      valueList.addChangeHandler(
          new ChangeHandler() {
            public void onChange(ChangeEvent event) {
              editingCol.setValueList(valueList.getText());
            }
          });
      HorizontalPanel vl = new HorizontalPanel();
      vl.add(valueList);
      vl.add(new InfoPopup(constants.ValueList(), constants.ValueListsExplanation()));
      addAttribute(constants.optionalValueList(), vl);
    }

    // Default Value
    if (model.getTableFormat() == TableFormat.EXTENDED_ENTRY) {
      addAttribute(constants.DefaultValue(), DTCellValueWidgetFactory.getDefaultEditor(editingCol));
    }

    // Limited entry value widget
    limitedEntryValueAttributeIndex =
        addAttribute(constants.LimitedEntryValue(), limitedEntryValueWidgetContainer);
    makeLimitedValueWidget();

    // Logical insertion
    addAttribute(
        constants.LogicallyAssertAFactTheFactWillBeRetractedWhenTheSupportingEvidenceIsRemoved(),
        doInsertLogical());

    // Hide column tick-box
    addAttribute(
        constants.HideThisColumn(), DTCellValueWidgetFactory.getHideColumnIndicator(editingCol));

    Button apply = new Button(constants.ApplyChanges());
    apply.addClickHandler(
        new ClickHandler() {
          public void onClick(ClickEvent w) {
            if (null == editingCol.getHeader() || "".equals(editingCol.getHeader())) {
              Window.alert(constants.YouMustEnterAColumnHeaderValueDescription());
              return;
            }
            if (isNew) {
              if (!unique(editingCol.getHeader())) {
                Window.alert(constants.ThatColumnNameIsAlreadyInUsePleasePickAnother());
                return;
              }

            } else {
              if (!col.getHeader().equals(editingCol.getHeader())) {
                if (!unique(editingCol.getHeader())) {
                  Window.alert(constants.ThatColumnNameIsAlreadyInUsePleasePickAnother());
                  return;
                }
              }
            }

            // Pass new\modified column back for handling
            refreshGrid.execute(editingCol);
            hide();
          }
        });
    addAttribute("", apply);
  }