class CreateTimeInterval implements AttributeColumnsMergeStrategy {

    private Table table;
    private Column[] columns;
    private Column startColumn, endColumn;
    private boolean parseNumbers = true;
    //Number mode:
    private double startNumber, endNumber;
    //Date mode:
    private SimpleDateFormat dateFormat;
    private String startDate, endDate;

    @Override
    public void setup(Table table, Column[] columns) {
        this.table = table;
        this.columns = columns;
    }

    @Override
    public void execute() {<FILL_FUNCTION_BODY>}

    @Override
    public String getName() {
        return NbBundle.getMessage(CreateTimeInterval.class, "CreateTimeInterval.name");
    }

    @Override
    public String getDescription() {
        return NbBundle.getMessage(CreateTimeInterval.class, "CreateTimeInterval.description");
    }

    @Override
    public boolean canExecute() {
        TimeRepresentation timeRepresentation =
            Lookup.getDefault().lookup(GraphController.class).getGraphModel().getConfiguration()
                .getTimeRepresentation();
        if (timeRepresentation != TimeRepresentation.INTERVAL) {
            return false;
        }

        return columns.length == 1 || columns.length == 2;
    }

    @Override
    public ManipulatorUI getUI() {
        return new CreateTimeIntervalUI();
    }

    @Override
    public int getType() {
        return 0;
    }

    @Override
    public int getPosition() {
        return 200;
    }

    @Override
    public Icon getIcon() {
        return ImageUtilities.loadImageIcon("DataLaboratoryPlugin/clock-select.png", false);
    }

    public Column[] getColumns() {
        return columns;
    }

    public SimpleDateFormat getDateFormat() {
        return dateFormat;
    }

    public void setDateFormat(SimpleDateFormat dateFormat) {
        this.dateFormat = dateFormat;
    }

    public Column getEndColumn() {
        return endColumn;
    }

    public void setEndColumn(Column endColumn) {
        this.endColumn = endColumn;
    }

    public String getEndDate() {
        return endDate;
    }

    public void setEndDate(String endDate) {
        this.endDate = endDate;
    }

    public double getEndNumber() {
        return endNumber;
    }

    public void setEndNumber(double endNumber) {
        this.endNumber = endNumber;
    }

    public boolean isParseNumbers() {
        return parseNumbers;
    }

    public void setParseNumbers(boolean parseNumbers) {
        this.parseNumbers = parseNumbers;
    }

    public Column getStartColumn() {
        return startColumn;
    }

    public void setStartColumn(Column startColumn) {
        this.startColumn = startColumn;
    }

    public String getStartDate() {
        return startDate;
    }

    public void setStartDate(String startDate) {
        this.startDate = startDate;
    }

    public double getStartNumber() {
        return startNumber;
    }

    public void setStartNumber(double startNumber) {
        this.startNumber = startNumber;
    }
}

        AttributeColumnsMergeStrategiesController ac =
            Lookup.getDefault().lookup(AttributeColumnsMergeStrategiesController.class);
        if (parseNumbers) {
            ac.mergeNumericColumnsToTimeInterval(table, startColumn, endColumn, startNumber, endNumber);
        } else {
            ac.mergeDateColumnsToTimeInterval(table, startColumn, endColumn, dateFormat, startDate, endDate);
        }
    
<no_super_class>