Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 235368 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/swt/internal/widgets/tablekit/TableLCA.java (-14 / +20 lines)
Lines 83-89 Link Here
83
    Table table = ( Table )widget;
83
    Table table = ( Table )widget;
84
    readTopIndex( table ); // topIndex MUST be read *before* processSetData
84
    readTopIndex( table ); // topIndex MUST be read *before* processSetData
85
    readSelection( table );
85
    readSelection( table );
86
    processSetData( table );
86
    readSetData( table );
87
    readWidgetSelected( table );
87
    readWidgetSelected( table );
88
    readWidgetDefaultSelected( table );
88
    readWidgetDefaultSelected( table );
89
    ControlLCAUtil.processMouseEvents( table );
89
    ControlLCAUtil.processMouseEvents( table );
Lines 169-175 Link Here
169
    }
169
    }
170
  }
170
  }
171
  
171
  
172
  private static void processSetData( final Table table ) {
172
  private static void readSetData( final Table table ) {
173
    if( WidgetLCAUtil.wasEventSent( table, JSConst.EVENT_SET_DATA ) ) {
173
    if( WidgetLCAUtil.wasEventSent( table, JSConst.EVENT_SET_DATA ) ) {
174
      HttpServletRequest request = ContextProvider.getRequest();
174
      HttpServletRequest request = ContextProvider.getRequest();
175
      String value = request.getParameter( JSConst.EVENT_SET_DATA_INDEX );
175
      String value = request.getParameter( JSConst.EVENT_SET_DATA_INDEX );
Lines 178-184 Link Here
178
      ITableAdapter tableAdapter = ( ITableAdapter )adapter;
178
      ITableAdapter tableAdapter = ( ITableAdapter )adapter;
179
      for( int i = 0; i < indices.length; i++ ) {
179
      for( int i = 0; i < indices.length; i++ ) {
180
        int index = Integer.parseInt( indices[ i ] );
180
        int index = Integer.parseInt( indices[ i ] );
181
        tableAdapter.checkData( index );
181
        if (index >-1 && index < table.getItemCount()) {
182
            tableAdapter.checkData( index );
183
        }
182
      }
184
      }
183
    }
185
    }
184
  }
186
  }
Lines 186-202 Link Here
186
  private void readWidgetSelected( final Table table ) {
188
  private void readWidgetSelected( final Table table ) {
187
    if( WidgetLCAUtil.wasEventSent( table, JSConst.EVENT_WIDGET_SELECTED ) ) {
189
    if( WidgetLCAUtil.wasEventSent( table, JSConst.EVENT_WIDGET_SELECTED ) ) {
188
      // TODO [rh] do something about when index points to unresolved item! 
190
      // TODO [rh] do something about when index points to unresolved item! 
189
      TableItem item = table.getItem( getWidgetSelectedIndex() );
191
      final int widgetSelectedIndex = getWidgetSelectedIndex();
190
      int detail = getWidgetSelectedDetail();
192
      // Bugfix: check if index is valid before firing event to avoid problems with fast scrolling
191
      int id = SelectionEvent.WIDGET_SELECTED;
193
      if (widgetSelectedIndex > -1 && widgetSelectedIndex < table.getItemCount()) {
192
      SelectionEvent event = new SelectionEvent( table,
194
          TableItem item = table.getItem( widgetSelectedIndex );
193
                                                 item,
195
          int detail = getWidgetSelectedDetail();
194
                                                 id,
196
          int id = SelectionEvent.WIDGET_SELECTED;
195
                                                 new Rectangle( 0, 0, 0, 0 ),
197
          SelectionEvent event = new SelectionEvent( table,
196
                                                 "",
198
                  item,
197
                                                 true,
199
                  id,
198
                                                 detail );
200
                  new Rectangle( 0, 0, 0, 0 ),
199
      event.processEvent();
201
                  "",
202
                  true,
203
                  detail );
204
          event.processEvent();
205
      }
200
    }
206
    }
201
  }
207
  }
202
208
(-)src/org/eclipse/swt/widgets/Table.java (-10 / +17 lines)
Lines 2131-2147 Link Here
2131
  }
2131
  }
2132
2132
2133
  final void checkData( final TableItem item, final int index ) {
2133
  final void checkData( final TableItem item, final int index ) {
2134
    if( ( style & SWT.VIRTUAL ) != 0 && !item.cached ) {
2134
      if( ( style & SWT.VIRTUAL ) != 0 && !item.cached ) {
2135
      ProcessActionRunner.add( new Runnable() {
2135
        ProcessActionRunner.add( new Runnable() {
2136
        public void run() {
2136
        public void run() {
2137
          item.cached = true;
2137
              item.cached = true;
2138
          SetDataEvent event = new SetDataEvent( Table.this, item, index );
2138
              SetDataEvent event = new SetDataEvent( Table.this, item, index );
2139
          event.processEvent();
2139
              // Check if index is valid to avoid problems when scrolling fast down
2140
          // widget could be disposed at this point
2140
              if (index > -1 && index < Table.this.getItemCount()) {
2141
          if( isDisposed() || item.isDisposed() ) {
2141
                  event.processEvent();
2142
            SWT.error( SWT.ERROR_WIDGET_DISPOSED );
2142
              }
2143
          }
2143
              // the event can change the item count so check index validity before continue
2144
        }
2144
              if (index > -1 && index < Table.this.getItemCount()) {
2145
                // widget could be disposed at this point
2146
                if( isDisposed() || item.isDisposed() ) {
2147
                    System.out.println("index " + index + " count " + Table.this.getItemCount());
2148
                    SWT.error( SWT.ERROR_WIDGET_DISPOSED );
2149
                }
2150
              }
2151
            }
2145
      } );
2152
      } );
2146
    }
2153
    }
2147
  }
2154
  }

Return to bug 235368