Program: 68143
Project: 68143
Buggy source:
protected void createTableViewer(Composite parent){
  viewer=new PropertyHandleTableViewer(parent,true,true,true);
  TableColumn column=new TableColumn(viewer.getViewer().getTable(),SWT.LEFT);
  column.setText(cellLabels[COLUMN_NAME_INDEX]);
  column.setWidth(150);
  column=new TableColumn(viewer.getViewer().getTable(),SWT.LEFT);
  column.setText(cellLabels[DATA_TYPE_INDEX]);
  column.setWidth(200);
  column=new TableColumn(viewer.getViewer().getTable(),SWT.LEFT);
  column.setText(cellLabels[EXPRESSION_INDEX]);
  column.setWidth(200);
  column=new TableColumn(viewer.getViewer().getTable(),SWT.LEFT);
  column.setText(cellLabels[AGGREGATION_INDEX]);
  column.setWidth(200);
  column=new TableColumn(viewer.getViewer().getTable(),SWT.LEFT);
  column.setText(cellLabels[FILTER_INDEX]);
  column.setWidth(200);
  viewer.getViewer().setContentProvider(new IStructuredContentProvider(){
    public Object[] getElements(    Object inputElement){
      ArrayList computedColumnsList=new ArrayList(10);
      Iterator iter=computedColumns.iterator();
      if (iter != null) {
        while (iter.hasNext()) {
          computedColumnsList.add(iter.next());
        }
      }
      return computedColumnsList.toArray();
    }
    public void dispose(){
    }
    public void inputChanged(    Viewer viewer,    Object oldInput,    Object newInput){
    }
  }
);
  viewer.getViewer().setLabelProvider(new TableProvider());
  viewer.getViewer().setInput(computedColumns);
}

Fixed version (ground truth):
protected void createTableViewer(Composite parent){
  viewer=new PropertyHandleTableViewer(parent,true,true,true){
    protected void doRemove(){
      int index=viewer.getTable().getSelectionIndex();
      PropertyHandle handle=(PropertyHandle)viewer.getInput();
      int count=(handle.getListValue() == null) ? 0 : handle.getListValue().size();
      if (index > -1 && index < count) {
        ComputedColumnHandle computedColumn=(ComputedColumnHandle)viewer.getTable().getItems()[index].getData();
        removeColumnHint(computedColumn.getName());
        try {
          handle.removeItem(index);
        }
 catch (        PropertyValueException e1) {
          ExceptionHandler.handle(e1);
        }
        viewer.refresh();
        viewer.getTable().setFocus();
        viewer.getTable().select(index);
        updateButtons();
      }
    }
    private void removeColumnHint(    String columnName){
      if (columnName == null)       return;
      PropertyHandle propertyHandle=((DataSetHandle)getContainer().getModel()).getPropertyHandle(DataSetHandle.COLUMN_HINTS_PROP);
      Iterator iter=propertyHandle.iterator();
      while (iter.hasNext()) {
        ColumnHintHandle hint=(ColumnHintHandle)iter.next();
        if (columnName.equals(hint.getColumnName())) {
          try {
            propertyHandle.removeItem(hint);
          }
 catch (          PropertyValueException e) {
            ExceptionHandler.handle(e);
          }
        }
      }
    }
  }
;
  TableColumn column=new TableColumn(viewer.getViewer().getTable(),SWT.LEFT);
  column.setText(cellLabels[COLUMN_NAME_INDEX]);
  column.setWidth(150);
  column=new TableColumn(viewer.getViewer().getTable(),SWT.LEFT);
  column.setText(cellLabels[DATA_TYPE_INDEX]);
  column.setWidth(200);
  column=new TableColumn(viewer.getViewer().getTable(),SWT.LEFT);
  column.setText(cellLabels[EXPRESSION_INDEX]);
  column.setWidth(200);
  column=new TableColumn(viewer.getViewer().getTable(),SWT.LEFT);
  column.setText(cellLabels[AGGREGATION_INDEX]);
  column.setWidth(200);
  column=new TableColumn(viewer.getViewer().getTable(),SWT.LEFT);
  column.setText(cellLabels[FILTER_INDEX]);
  column.setWidth(200);
  viewer.getViewer().setContentProvider(new IStructuredContentProvider(){
    public Object[] getElements(    Object inputElement){
      ArrayList computedColumnsList=new ArrayList(10);
      Iterator iter=computedColumns.iterator();
      if (iter != null) {
        while (iter.hasNext()) {
          computedColumnsList.add(iter.next());
        }
      }
      return computedColumnsList.toArray();
    }
    public void dispose(){
    }
    public void inputChanged(    Viewer viewer,    Object oldInput,    Object newInput){
    }
  }
);
  viewer.getViewer().setLabelProvider(new TableProvider());
  viewer.getViewer().setInput(computedColumns);
}