Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 385387

Summary: [Editing Support]Bad Cell Edited (TableViewer with vertical scrollbar) only with RAP 1.5 Release of June 2012
Product: [RT] RAP Reporter: Francis Delsinnes <francis_delsinnes>
Component: RWTAssignee: Project Inbox <rap-inbox>
Status: RESOLVED DUPLICATE QA Contact:
Severity: critical    
Priority: P3    
Version: 1.5   
Target Milestone: ---   
Hardware: PC   
OS: Windows 7   
Whiteboard:

Description Francis Delsinnes CLA 2012-07-18 05:32:21 EDT
With the last release of June 2012 (RAP 1.5 Release),
I've got the following problem:

Impossible to edit the right cell when a TableViewer needs a vertical scrollbar.
Warning: This problem happens when the scroll bar is lowered to the maximum!
In this case: a bad cell is edited...


-------------
I try the same code with a previous version of RAP (like RAP 1.5.0 M2).
No problem (normal use)!?

Note:
My Current version of Java JDK is: jdk1.6_0_27 (32 bits)

I tested it with Eclipse Indigo (32 bits) + RAP Targets (1.5.0 M2 and 1.5 Release)
And
I tested it also with the current Eclipse Juno (32 bits) + Same Targets
-------------


To try it, you can create a new RAP project with a basic view
and replace the "View" class by the following code:


An example of a correct edition:

I try to edit the cell with a number #8
[screenshot] http://farm9.staticflickr.com/8168/7595884780_b26136f9c9_c.jpg
I've edited the cell (OK)
[screenshot] http://farm9.staticflickr.com/8146/7595884592_fbc7c4ebb2_c.jpg


An example of an incorrect edition (with the same code of course):
I scroll at the max...
I try to edit the last cell (with the number #34)
First problem: Why this cell displays "Value_33" ?
[screenshot] http://farm9.staticflickr.com/8429/7595884850_fa5e9bc601_c.jpg
I modify the text...
[screenshot] http://farm9.staticflickr.com/8157/7595884940_07470e32be_c.jpg
=> Bad Result: The focus is on the cell #34 but it is not the edited cell...
[screenshot] http://farm9.staticflickr.com/8285/7595884670_7c4d9f0b70_c.jpg



//// See the following code
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TextCellEditor;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;

import org.eclipse.ui.part.ViewPart;


/**
 * Test.
 *
 * @author Internal Tools Team
 */
public final class View
  extends ViewPart {

  /**
   * A simple record.
   *
   * @author Internal Tools Team
   */
  private static class Record {

    /** A string. */
    public String key;

    /** A string. */
    public String value;

  }

  /*
   * (non-Javadoc)
   * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
   */
  @Override public void createPartControl(Composite parent) {

    final TableViewer viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
    final Table table = viewer.getTable();
    final TableViewerColumn keyColumnViewer = new TableViewerColumn(viewer, SWT.NONE);
    final TableViewerColumn valueColumnViewer = new TableViewerColumn(viewer, SWT.NONE);
    final TableColumn keyColumn = keyColumnViewer.getColumn();
    final TableColumn valueColumn = valueColumnViewer.getColumn();

    // widgets
    keyColumn.setText("Key");
    keyColumn.setWidth(100);
    valueColumn.setText("Value");
    valueColumn.setWidth(120);
    table.setHeaderVisible(true);
    table.setLinesVisible(true);

    // viewers (label provider, editing support, content provider, input)
    keyColumnViewer.setLabelProvider(createKeyLabelProvider());
    valueColumnViewer.setLabelProvider(createValueLabelProvider());
    valueColumnViewer.setEditingSupport(createValueEditingSupport(viewer));
    viewer.setContentProvider(new ArrayContentProvider());
    viewer.setInput(createFakeRecords(35));

    setViewer(viewer);

  }

  /*
   * (non-Javadoc)
   * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
   */
  @Override public void setFocus() {

    final TableViewer viewer = getViewer();
    viewer.getControl()
          .setFocus();

  }

  /**
   * Creates fake records.
   *
   * @param  nb - a number of records
   * @return a records array
   */
  private static Record[] createFakeRecords(final int nb) {

    final Record[] records = new Record[nb > 0 ? nb
                                               : 10];

    for (int i = 0; i < nb; i++) {

      final Record record = new Record();
      record.key = "Key_" + i;
      record.value = "Value_" + i;
      records[i] = record;

    }

    return records;

  }

  /**
   * Creates the corresponding label provider.
   *
   * @return a label provider
   */
  private static ColumnLabelProvider createKeyLabelProvider() {

    return new ColumnLabelProvider() {

      /** A string id. */
      private static final long serialVersionUID = 1547222513947003304L;

      /*
       * (non-Javadoc)
       * @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
       */
      @Override public String getText(Object element) {

        return ((Record)element).key;

      }

    };

  }

  /**
   * Creates the corresponding editing support.
   *
   * @param  columnViewer - a viewer
   * @return an editing support
   */
  private static EditingSupport createValueEditingSupport(final ColumnViewer columnViewer) {

    return new EditingSupport(columnViewer) {

      /** A string id. */
      private static final long serialVersionUID = 893208682725506423L;

      /*
       * (non-Javadoc)
       * @see org.eclipse.jface.viewers.EditingSupport#setValue(java.lang.Object, java.lang.Object)
       */
      @Override protected void setValue(Object element,
                                        Object value) {

        ((Record)element).value = value.toString();
        getViewer().refresh(element, true);

      }

      /*
       * (non-Javadoc)
       * @see org.eclipse.jface.viewers.EditingSupport#getValue(java.lang.Object)
       */
      @Override protected Object getValue(Object element) {

        return ((Record)element).value;

      }

      /*
       * (non-Javadoc)
       * @see org.eclipse.jface.viewers.EditingSupport#getCellEditor(java.lang.Object)
       */
      @Override protected CellEditor getCellEditor(Object element) {

        return new TextCellEditor((Composite)getViewer().getControl());

      }

      /*
       * (non-Javadoc)
       * @see org.eclipse.jface.viewers.EditingSupport#canEdit(java.lang.Object)
       */
      @Override protected boolean canEdit(Object element) {

        return element instanceof Record;

      }

    };

  }

  /**
   * Creates the corresponding label provider.
   *
   * @return a label provider
   */
  private static ColumnLabelProvider createValueLabelProvider() {

    return new ColumnLabelProvider() {

      /** A string id. */
      private static final long serialVersionUID = -611412295225558699L;

      /*
       * (non-Javadoc)
       * @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
       */
      @Override public String getText(Object element) {

        return ((Record)element).value;

      }

    };

  }

  /**
   * Gets the viewer.
   *
   * @return a viewer
   */
  private TableViewer getViewer() {

    return viewer;

  }

  /**
   * Sets the viewer.
   *
   * @param viewer - a viewer
   */
  private void setViewer(TableViewer viewer) {

    this.viewer = viewer;

  }

  /** String id. */
  public static final String ID = "Rap15ReleaseTest.view";

  /** viewer. */
  private TableViewer viewer;

}
Comment 1 Ivan Furnadjiev CLA 2012-07-18 05:36:34 EDT
.

*** This bug has been marked as a duplicate of bug 384589 ***