/******************************************************************************* * Copyright (c) 2002, 2010 Innoopract Informationssysteme GmbH. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Innoopract Informationssysteme GmbH - initial API and implementation * EclipseSource - ongoing development ******************************************************************************/ package org.eclipse.swt.internal.widgets.tablekit; import java.io.IOException; import java.util.ArrayList; import junit.framework.TestCase; import org.eclipse.rwt.Fixture; import org.eclipse.rwt.graphics.Graphics; import org.eclipse.rwt.internal.lifecycle.*; import org.eclipse.rwt.internal.service.RequestParams; import org.eclipse.rwt.lifecycle.*; import org.eclipse.swt.SWT; import org.eclipse.swt.events.*; import org.eclipse.swt.graphics.*; import org.eclipse.swt.internal.events.*; import org.eclipse.swt.internal.widgets.*; import org.eclipse.swt.internal.widgets.tablekit.TableLCAUtil.ItemMetrics; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.*; public class TableLCA_Test extends TestCase { public void testPreserveValues() { Display display = new Display(); Shell shell = new Shell( display ); Table table = new Table( shell, SWT.BORDER ); Fixture.markInitialized( display ); Fixture.preserveWidgets(); IWidgetAdapter adapter = WidgetUtil.getAdapter( table ); Object headerHeight = adapter.getPreserved( TableLCA.PROP_HEADER_HEIGHT ); assertEquals( new Integer( 0 ), headerHeight ); Object headerVisible = adapter.getPreserved( TableLCA.PROP_HEADER_VISIBLE ); assertEquals( Boolean.FALSE, headerVisible ); Object linesVisible = adapter.getPreserved( TableLCA.PROP_LINES_VISIBLE ); assertEquals( Boolean.FALSE, linesVisible ); Object itemHeight = adapter.getPreserved( TableLCA.PROP_ITEM_HEIGHT ); assertEquals( new Integer( table.getItemHeight() ), itemHeight ); assertEquals( new Integer( 0 ), adapter.getPreserved( TableLCA.PROP_ITEM_COUNT ) ); Object topIndex = adapter.getPreserved( TableLCA.PROP_TOP_INDEX ); assertEquals( new Integer( table.getTopIndex() ), topIndex ); Object focusIndex = adapter.getPreserved( TableLCAUtil.PROP_FOCUS_INDEX ); assertEquals( new Integer( -1 ), focusIndex ); Boolean hasListeners = ( Boolean )adapter.getPreserved( Props.SELECTION_LISTENERS ); assertEquals( Boolean.FALSE, hasListeners ); String prop = TableLCA.PROP_SCROLLBARS_SELECTION_LISTENER; hasListeners = ( Boolean )adapter.getPreserved( prop ); assertEquals( Boolean.FALSE, hasListeners ); Object defaultColumnwidth = adapter.getPreserved( TableLCA.PROP_DEFAULT_COLUMN_WIDTH ); int defaultColumnWidth2 = TableLCA.getDefaultColumnWidth( table ); assertEquals( new Integer( defaultColumnWidth2 ), defaultColumnwidth ); ItemMetrics[] itemMetrics = ( ItemMetrics[] )adapter.getPreserved( TableLCAUtil.PROP_ITEM_METRICS ); int imageLeft1 = ( TableLCAUtil.getItemMetrics( table )[ 0 ] ).imageLeft; assertEquals( imageLeft1, itemMetrics[ 0 ].imageLeft ); int imageWidth = ( TableLCAUtil.getItemMetrics( table )[ 0 ] ).imageWidth; assertEquals( imageWidth, itemMetrics[ 0 ].imageWidth ); int textLeft = ( TableLCAUtil.getItemMetrics( table )[ 0 ] ).textLeft; assertEquals( textLeft, itemMetrics[ 0 ].textLeft ); int textWidth1 = ( TableLCAUtil.getItemMetrics( table )[ 0 ] ).textWidth; assertEquals( textWidth1, itemMetrics[ 0 ].textWidth ); assertEquals( Boolean.FALSE, adapter.getPreserved( TableLCA.PROP_HIDE_SELECTION ) ); assertEquals( new Integer( 0 ), adapter.getPreserved( TableLCA.PROP_LEFT_OFFSET ) ); Fixture.clearPreserved(); TableColumn tc1 = new TableColumn( table, SWT.CENTER ); tc1.setText( "column1" ); tc1.setWidth( 50 ); TableColumn tc2 = new TableColumn( table, SWT.CENTER ); tc2.setText( "column2" ); tc2.setWidth( 50 ); TableItem item1 = new TableItem( table, SWT.NONE ); item1.setText( 0, "item11" ); item1.setText( 1, "item12" ); TableItem item2 = new TableItem( table, SWT.NONE ); item2.setText( 0, "item21" ); item2.setText( 1, "item22" ); table.setHeaderVisible( true ); table.setLinesVisible( true ); table.setTopIndex( 1 ); SelectionListener selectionListener = new SelectionAdapter() { }; table.addSelectionListener( selectionListener ); Fixture.preserveWidgets(); adapter = WidgetUtil.getAdapter( table ); headerHeight = adapter.getPreserved( TableLCA.PROP_HEADER_HEIGHT ); assertEquals( new Integer( table.getHeaderHeight() ), headerHeight ); headerVisible = adapter.getPreserved( TableLCA.PROP_HEADER_VISIBLE ); assertEquals( Boolean.TRUE, headerVisible ); linesVisible = adapter.getPreserved( TableLCA.PROP_LINES_VISIBLE ); assertEquals( Boolean.TRUE, linesVisible ); itemHeight = adapter.getPreserved( TableLCA.PROP_ITEM_HEIGHT ); assertEquals( new Integer( table.getItemHeight() ), itemHeight ); assertEquals( new Integer( 2 ), adapter.getPreserved( TableLCA.PROP_ITEM_COUNT ) ); assertEquals( new Integer( 1 ), adapter.getPreserved( TableLCA.PROP_TOP_INDEX ) ); hasListeners = ( Boolean )adapter.getPreserved( Props.SELECTION_LISTENERS ); assertEquals( Boolean.TRUE, hasListeners ); defaultColumnwidth = adapter.getPreserved( TableLCA.PROP_DEFAULT_COLUMN_WIDTH ); defaultColumnWidth2 = TableLCA.getDefaultColumnWidth( table ); assertEquals( new Integer( defaultColumnWidth2 ), defaultColumnwidth ); itemMetrics = ( ItemMetrics[] )adapter.getPreserved( TableLCAUtil.PROP_ITEM_METRICS ); imageLeft1 = ( TableLCAUtil.getItemMetrics( table )[ 0 ] ).imageLeft; assertEquals( imageLeft1, itemMetrics[ 0 ].imageLeft ); imageWidth = ( TableLCAUtil.getItemMetrics( table )[ 0 ] ).imageWidth; assertEquals( imageWidth, itemMetrics[ 0 ].imageWidth ); textLeft = ( TableLCAUtil.getItemMetrics( table )[ 0 ] ).textLeft; assertEquals( textLeft, itemMetrics[ 0 ].textLeft ); textWidth1 = ( TableLCAUtil.getItemMetrics( table )[ 0 ] ).textWidth; assertEquals( textWidth1, itemMetrics[ 0 ].textWidth ); Fixture.clearPreserved(); // scrollbars selection listener SelectionAdapter listener = new SelectionAdapter() { }; table.getHorizontalBar().addSelectionListener( listener ); Fixture.preserveWidgets(); hasListeners = ( Boolean )adapter.getPreserved( prop ); assertEquals( Boolean.TRUE, hasListeners ); Fixture.clearPreserved(); table.getHorizontalBar().removeSelectionListener( listener ); Fixture.preserveWidgets(); hasListeners = ( Boolean )adapter.getPreserved( prop ); assertEquals( Boolean.FALSE, hasListeners ); Fixture.clearPreserved(); table.getVerticalBar().addSelectionListener( listener ); Fixture.preserveWidgets(); hasListeners = ( Boolean )adapter.getPreserved( prop ); assertEquals( Boolean.TRUE, hasListeners ); Fixture.clearPreserved(); table.getVerticalBar().removeSelectionListener( listener ); Fixture.preserveWidgets(); hasListeners = ( Boolean )adapter.getPreserved( prop ); assertEquals( Boolean.FALSE, hasListeners ); Fixture.clearPreserved(); // control: enabled Fixture.preserveWidgets(); adapter = WidgetUtil.getAdapter( table ); assertEquals( Boolean.TRUE, adapter.getPreserved( Props.ENABLED ) ); Fixture.clearPreserved(); table.setEnabled( false ); Fixture.preserveWidgets(); adapter = WidgetUtil.getAdapter( table ); assertEquals( Boolean.FALSE, adapter.getPreserved( Props.ENABLED ) ); Fixture.clearPreserved(); table.setEnabled( true ); // visible table.setSize( 10, 10 ); Fixture.preserveWidgets(); adapter = WidgetUtil.getAdapter( table ); assertEquals( Boolean.TRUE, adapter.getPreserved( Props.VISIBLE ) ); Fixture.clearPreserved(); table.setVisible( false ); Fixture.preserveWidgets(); adapter = WidgetUtil.getAdapter( table ); assertEquals( Boolean.FALSE, adapter.getPreserved( Props.VISIBLE ) ); Fixture.clearPreserved(); // menu Fixture.preserveWidgets(); adapter = WidgetUtil.getAdapter( table ); assertEquals( null, adapter.getPreserved( Props.MENU ) ); Fixture.clearPreserved(); Menu menu = new Menu( table ); MenuItem item = new MenuItem( menu, SWT.NONE ); item.setText( "1 Item" ); table.setMenu( menu ); Fixture.preserveWidgets(); adapter = WidgetUtil.getAdapter( table ); assertEquals( menu, adapter.getPreserved( Props.MENU ) ); Fixture.clearPreserved(); // bounds Rectangle rectangle = new Rectangle( 10, 10, 30, 50 ); table.setBounds( rectangle ); Fixture.preserveWidgets(); adapter = WidgetUtil.getAdapter( table ); assertEquals( rectangle, adapter.getPreserved( Props.BOUNDS ) ); Fixture.clearPreserved(); // control_listeners (Table always registers a control listener) Fixture.preserveWidgets(); adapter = WidgetUtil.getAdapter( table ); hasListeners = ( Boolean )adapter.getPreserved( Props.CONTROL_LISTENERS ); assertEquals( Boolean.TRUE, hasListeners ); Fixture.clearPreserved(); // z-index Fixture.preserveWidgets(); adapter = WidgetUtil.getAdapter( table ); assertTrue( adapter.getPreserved( Props.Z_INDEX ) != null ); Fixture.clearPreserved(); // foreground background font Color background = Graphics.getColor( 122, 33, 203 ); table.setBackground( background ); Color foreground = Graphics.getColor( 211, 178, 211 ); table.setForeground( foreground ); Font font = Graphics.getFont( "font", 12, SWT.BOLD ); table.setFont( font ); Fixture.preserveWidgets(); adapter = WidgetUtil.getAdapter( table ); assertEquals( background, adapter.getPreserved( Props.BACKGROUND ) ); assertEquals( foreground, adapter.getPreserved( Props.FOREGROUND ) ); assertEquals( font, adapter.getPreserved( Props.FONT ) ); Fixture.clearPreserved(); // tab_index Fixture.preserveWidgets(); adapter = WidgetUtil.getAdapter( table ); assertTrue( adapter.getPreserved( Props.Z_INDEX ) != null ); Fixture.clearPreserved(); // scroll bars Fixture.preserveWidgets(); Object preserved = adapter.getPreserved( TableLCA.PROP_HAS_H_SCROLL_BAR ); assertTrue( preserved != null ); preserved = adapter.getPreserved( TableLCA.PROP_HAS_V_SCROLL_BAR ); assertTrue( preserved != null ); Fixture.clearPreserved(); // tooltip text Fixture.preserveWidgets(); adapter = WidgetUtil.getAdapter( table ); assertEquals( null, table.getToolTipText() ); Fixture.clearPreserved(); table.setToolTipText( "some text" ); Fixture.preserveWidgets(); adapter = WidgetUtil.getAdapter( table ); assertEquals( "some text", table.getToolTipText() ); Fixture.clearPreserved(); // activate listeners, focus listeners Fixture.preserveWidgets(); adapter = WidgetUtil.getAdapter( table ); hasListeners = ( Boolean )adapter.getPreserved( Props.FOCUS_LISTENER ); assertEquals( Boolean.FALSE, hasListeners ); Fixture.clearPreserved(); table.addFocusListener( new FocusAdapter() { } ); Fixture.preserveWidgets(); adapter = WidgetUtil.getAdapter( table ); hasListeners = ( Boolean )adapter.getPreserved( Props.FOCUS_LISTENER ); assertEquals( Boolean.TRUE, hasListeners ); Fixture.clearPreserved(); Fixture.preserveWidgets(); adapter = WidgetUtil.getAdapter( table ); hasListeners = ( Boolean )adapter.getPreserved( Props.ACTIVATE_LISTENER ); assertEquals( Boolean.FALSE, hasListeners ); Fixture.clearPreserved(); ActivateEvent.addListener( table, new ActivateAdapter() { } ); Fixture.preserveWidgets(); adapter = WidgetUtil.getAdapter( table ); hasListeners = ( Boolean )adapter.getPreserved( Props.ACTIVATE_LISTENER ); assertEquals( Boolean.TRUE, hasListeners ); Fixture.clearPreserved(); display.dispose(); } public void testSetDataEvent() { final StringBuffer log = new StringBuffer(); Display display = new Display(); Shell shell = new Shell( display ); final Table table = new Table( shell, SWT.VIRTUAL ); table.setItemCount( 10 ); table.addListener( SWT.SetData, new Listener() { public void handleEvent( final Event event ) { assertSame( table.getItem( 1 ), event.item ); assertEquals( 1, event.index ); log.append( "SetDataEvent" ); } } ); String displayId = DisplayUtil.getId( display ); String tableId = WidgetUtil.getId( table ); Fixture.fakeNewRequest(); Fixture.fakeRequestParam( RequestParams.UIROOT, displayId ); Fixture.fakeRequestParam( JSConst.EVENT_SET_DATA, tableId ); Fixture.fakeRequestParam( JSConst.EVENT_SET_DATA_INDEX, "1" ); Fixture.executeLifeCycleFromServerThread( ); assertEquals( 1, ItemHolder.getItems( table ).length ); assertEquals( "SetDataEvent", log.toString() ); String tableItemCtor = "org.eclipse.swt.widgets.TableItem"; assertTrue( Fixture.getAllMarkup().indexOf( tableItemCtor ) != -1 ); } public void testWidgetSelectedWithCheck() { final SelectionEvent[] events = new SelectionEvent[ 1 ]; Display display = new Display(); Shell shell = new Shell( display ); final Table table = new Table( shell, SWT.CHECK ); TableItem item1 = new TableItem( table, SWT.NONE ); final TableItem item2 = new TableItem( table, SWT.NONE ); table.setSelection( 0 ); table.addSelectionListener( new SelectionListener() { public void widgetSelected( final SelectionEvent event ) { events[ 0 ] = event; } public void widgetDefaultSelected( final SelectionEvent event ) { fail( "unexpected event: widgetDefaultSelected" ); } } ); // Simulate request that comes in after item2 was checked (but not selected) Fixture.fakeNewRequest(); String displayId = DisplayUtil.getId( display ); String tableId = WidgetUtil.getId( table ); String item2Id = WidgetUtil.getId( item2 ); String item2Index = String.valueOf( table.indexOf( item2 )); Fixture.fakeRequestParam( RequestParams.UIROOT, displayId ); Fixture.fakeRequestParam( item2Id + ".checked", "true" ); Fixture.fakeRequestParam( JSConst.EVENT_WIDGET_SELECTED, tableId ); Fixture.fakeRequestParam( JSConst.EVENT_WIDGET_SELECTED_INDEX, item2Index ); Fixture.fakeRequestParam( JSConst.EVENT_WIDGET_SELECTED_DETAIL, "check" ); Fixture.executeLifeCycleFromServerThread( ); assertNotNull( "SelectionEvent was not fired", events[ 0 ] ); assertEquals( table, events[ 0 ].getSource() ); assertEquals( item2, events[ 0 ].item ); assertEquals( true, events[ 0 ].doit ); assertEquals( 0, events[ 0 ].x ); assertEquals( 0, events[ 0 ].y ); assertEquals( 0, events[ 0 ].width ); assertEquals( 0, events[ 0 ].height ); assertEquals( 1, table.getSelectionCount() ); assertEquals( item1, table.getSelection()[ 0 ] ); } public void testWidgetDefaultSelected() { final SelectionEvent[] events = new SelectionEvent[ 1 ]; Display display = new Display(); Shell shell = new Shell( display ); final Table table = new Table( shell, SWT.MULTI ); TableItem item1 = new TableItem( table, SWT.NONE ); final TableItem item2 = new TableItem( table, SWT.NONE ); table.setSelection( 0 ); table.addSelectionListener( new SelectionListener() { public void widgetSelected( final SelectionEvent event ) { fail( "unexpected event: widgetSelected" ); } public void widgetDefaultSelected( final SelectionEvent event ) { events[ 0 ] = event; } } ); // Simulate request that comes in after item2 was checked (but not selected) Fixture.fakeNewRequest(); String displayId = DisplayUtil.getId( display ); String tableId = WidgetUtil.getId( table ); String item2Index = String.valueOf( table.indexOf( item2 ) ); Fixture.fakeRequestParam( RequestParams.UIROOT, displayId ); Fixture.fakeRequestParam( JSConst.EVENT_WIDGET_DEFAULT_SELECTED, tableId ); Fixture.fakeRequestParam( JSConst.EVENT_WIDGET_SELECTED_INDEX, item2Index ); Fixture.executeLifeCycleFromServerThread( ); assertNotNull( "SelectionEvent was not fired", events[ 0 ] ); assertEquals( table, events[ 0 ].getSource() ); assertEquals( item2, events[ 0 ].item ); assertEquals( true, events[ 0 ].doit ); assertEquals( 0, events[ 0 ].x ); assertEquals( 0, events[ 0 ].y ); assertEquals( 0, events[ 0 ].width ); assertEquals( 0, events[ 0 ].height ); assertEquals( 1, table.getSelectionCount() ); assertEquals( item1, table.getSelection()[ 0 ] ); // Simulate request that comes when <Return> is pressed // with focused item is one of the selected events[ 0 ] = null; table.setSelection( 1 ); // Set focused item table.select( 0 ); Fixture.fakeNewRequest(); Fixture.fakeRequestParam( RequestParams.UIROOT, displayId ); Fixture.fakeRequestParam( JSConst.EVENT_WIDGET_DEFAULT_SELECTED, tableId ); Fixture.fakeRequestParam( JSConst.EVENT_WIDGET_SELECTED_INDEX, item2Index ); Fixture.executeLifeCycleFromServerThread( ); assertNotNull( "SelectionEvent was not fired", events[ 0 ] ); assertEquals( table, events[ 0 ].getSource() ); assertEquals( item2, events[ 0 ].item ); assertEquals( true, events[ 0 ].doit ); assertEquals( 0, events[ 0 ].x ); assertEquals( 0, events[ 0 ].y ); assertEquals( 0, events[ 0 ].width ); assertEquals( 0, events[ 0 ].height ); assertEquals( 2, table.getSelectionCount() ); assertEquals( 1, table.getSelectionIndex() ); // Simulate request that comes when <Return> is pressed // with focused item is not one of the selected events[ 0 ] = null; table.setSelection( 0 ); // Set focused item table.deselectAll(); table.select( 1 ); Fixture.fakeNewRequest(); Fixture.fakeRequestParam( RequestParams.UIROOT, displayId ); Fixture.fakeRequestParam( JSConst.EVENT_WIDGET_DEFAULT_SELECTED, tableId ); Fixture.fakeRequestParam( JSConst.EVENT_WIDGET_SELECTED_INDEX, item2Index ); Fixture.executeLifeCycleFromServerThread( ); assertNotNull( "SelectionEvent was not fired", events[ 0 ] ); assertEquals( table, events[ 0 ].getSource() ); assertEquals( item2, events[ 0 ].item ); assertEquals( true, events[ 0 ].doit ); assertEquals( 0, events[ 0 ].x ); assertEquals( 0, events[ 0 ].y ); assertEquals( 0, events[ 0 ].width ); assertEquals( 0, events[ 0 ].height ); assertEquals( 1, table.getSelectionCount() ); assertEquals( 1, table.getSelectionIndex() ); // Simulate request that comes when <Return> is pressed // and there is no selection events[ 0 ] = null; table.setSelection( 1 ); // Set focused item table.deselectAll(); Fixture.fakeNewRequest(); Fixture.fakeRequestParam( RequestParams.UIROOT, displayId ); Fixture.fakeRequestParam( JSConst.EVENT_WIDGET_DEFAULT_SELECTED, tableId ); Fixture.fakeRequestParam( JSConst.EVENT_WIDGET_SELECTED_INDEX, item2Index ); Fixture.executeLifeCycleFromServerThread( ); assertNotNull( "SelectionEvent was not fired", events[ 0 ] ); assertEquals( table, events[ 0 ].getSource() ); assertEquals( item2, events[ 0 ].item ); assertEquals( true, events[ 0 ].doit ); assertEquals( 0, events[ 0 ].x ); assertEquals( 0, events[ 0 ].y ); assertEquals( 0, events[ 0 ].width ); assertEquals( 0, events[ 0 ].height ); assertEquals( 0, table.getSelectionCount() ); assertEquals( -1, table.getSelectionIndex() ); } public void testRedraw() { final Table[] table = { null }; Display display = new Display(); final Shell shell = new Shell( display ); shell.setSize( 100, 100 ); Button button = new Button( shell, SWT.PUSH ); button.addSelectionListener( new SelectionAdapter() { public void widgetSelected( final SelectionEvent event ) { table[ 0 ] = new Table( shell, SWT.VIRTUAL ); table[ 0 ].setItemCount( 500 ); table[ 0 ].setSize( 90, 90 ); assertFalse( isItemVirtual( table[ 0 ], 0 ) ); table[ 0 ].clearAll(); table[ 0 ].redraw(); } } ); shell.open(); String displayId = DisplayUtil.getId( display ); Fixture.fakeResponseWriter(); Fixture.fakeRequestParam( RequestParams.UIROOT, displayId ); String buttonId = WidgetUtil.getId( button ); Fixture.fakeRequestParam( JSConst.EVENT_WIDGET_SELECTED, buttonId ); Fixture.executeLifeCycleFromServerThread( ); assertFalse( isItemVirtual( table[ 0 ], 0 ) ); } public void testNoUnwantedResolveItems() { Display display = new Display(); Shell shell = new Shell( display ); shell.setSize( 100, 100 ); final Table table = new Table( shell, SWT.VIRTUAL ); table.setSize( 90, 90 ); table.setItemCount( 1000 ); shell.open(); String displayId = DisplayUtil.getId( display ); String tableId = WidgetUtil.getId( table ); Fixture.fakeNewRequest(); Fixture.fakeRequestParam( RequestParams.UIROOT, displayId ); Fixture.fakeRequestParam( JSConst.EVENT_SET_DATA, tableId ); Fixture.fakeRequestParam( JSConst.EVENT_SET_DATA_INDEX, "500,501,502,503" ); Fixture.fakeRequestParam( tableId + ".topIndex", "500" ); RWTLifeCycle lifeCycle = ( RWTLifeCycle )LifeCycleFactory.getLifeCycle(); lifeCycle.addPhaseListener( new PhaseListener() { private static final long serialVersionUID = 1L; public void beforePhase( final PhaseEvent event ) { table.redraw(); } public void afterPhase( final PhaseEvent event ) { } public PhaseId getPhaseId() { return PhaseId.PROCESS_ACTION; } } ); Fixture.executeLifeCycleFromServerThread(); assertTrue( isItemVirtual( table, 499 ) ); assertTrue( isItemVirtual( table, 800 ) ); assertTrue( isItemVirtual( table, 999 ) ); } public void testClearVirtual() { Fixture.fakePhase( PhaseId.PROCESS_ACTION ); RWTLifeCycle lifeCycle = ( RWTLifeCycle )LifeCycleFactory.getLifeCycle(); lifeCycle.addPhaseListener( new PreserveWidgetsPhaseListener() ); Display display = new Display(); Shell shell = new Shell( display ); shell.setSize( 100, 100 ); shell.setLayout( new FillLayout() ); final Table table = new Table( shell, SWT.VIRTUAL ); table.setItemCount( 100 ); shell.layout(); shell.open(); ITableAdapter adapter = ( ITableAdapter )table.getAdapter( ITableAdapter.class ); // precondition: all items are resolved (TableItem#cached == true) // resolve all items and ensure for( int i = 0; i < table.getItemCount(); i++ ) { table.getItem( i ).getText(); } assertFalse( adapter.isItemVirtual( table.getItemCount() - 1 ) ); // String displayId = DisplayUtil.getId( display ); final int lastItemIndex = table.getItemCount() - 1; String lastItemId = WidgetUtil.getId( table.getItem( lastItemIndex ) ); // fake one request that would initialize the UI Fixture.fakeNewRequest(); Fixture.fakeRequestParam( RequestParams.UIROOT, displayId ); Fixture.executeLifeCycleFromServerThread(); // run actual request Fixture.fakeNewRequest(); Fixture.fakeRequestParam( RequestParams.UIROOT, displayId ); lifeCycle.addPhaseListener( new PhaseListener() { private static final long serialVersionUID = 1L; public void beforePhase( final PhaseEvent event ) { table.clear( lastItemIndex ); } public void afterPhase( final PhaseEvent event ) { } public PhaseId getPhaseId() { return PhaseId.PROCESS_ACTION; } } ); Fixture.executeLifeCycleFromServerThread(); String markup = Fixture.getAllMarkup(); String expected = "var w = wm.findWidgetById( \"" + lastItemId + "\" );w.clear()"; assertTrue( markup.indexOf( expected ) != -1 ); } public void testSelectUnresolvedVirtualItem() { // Set up VIRTUAL table with SetData listener Display display = new Display(); Shell shell = new Shell( display ); shell.setSize( 100, 100 ); Table table = new Table( shell, SWT.VIRTUAL ); Listener listener = new Listener() { public void handleEvent( Event event ) { Item item = ( Item )event.item; item.setText( "Item " + event.index ); } }; table.addListener( SWT.SetData, listener ); table.setSize( 90, 90 ); table.setItemCount( 1000 ); shell.layout(); shell.open(); String displayId = DisplayUtil.getId( display ); String tableId = WidgetUtil.getId( table ); // Run test request assertTrue( isItemVirtual( table, 500 ) ); // ensure precondition Fixture.fakeNewRequest(); Fixture.fakeRequestParam( RequestParams.UIROOT, displayId ); Fixture.fakeRequestParam( JSConst.EVENT_SET_DATA, tableId ); Fixture.fakeRequestParam( JSConst.EVENT_SET_DATA_INDEX, "500" ); Fixture.fakeRequestParam( tableId + ".topIndex", "500" ); Fixture.fakeRequestParam( tableId + ".selection", "500" ); Fixture.executeLifeCycleFromServerThread(); // Remove SetData listener to not accidentially resolve item with asserts table.removeListener( SWT.SetData, listener ); // assert request results assertFalse( isItemVirtual( table, 500 ) ); assertEquals( "Item 500", table.getItem( 500 ).getText() ); assertEquals( 500, table.getSelectionIndices()[ 0 ] ); assertTrue( Fixture.getAllMarkup().indexOf( "Item 500" ) != -1 ); } /* * Ensures that checkData calls with an invalid index are silently ignored. * This may happen, when the itemCount is reduced during a SetData event. * Queued SetData events may then have stale (out-of-bounds) indices. * See 235368: [table] [table] ArrayIndexOutOfBoundsException in virtual * TableViewer * https://bugs.eclipse.org/bugs/show_bug.cgi?id=235368 */ public void testReduceItemCountInSetData() { Fixture.fakePhase( PhaseId.PROCESS_ACTION ); Display display = new Display(); Shell shell = new Shell( display ); shell.setSize( 100, 100 ); Table table = new Table( shell, SWT.VIRTUAL ); table.addListener( SWT.SetData, new Listener() { public void handleEvent( Event event ) { fail( "Must not trigger SetData event" ); } } ); Fixture.fakePhase( PhaseId.READ_DATA ); table.setItemCount( 1 ); ITableAdapter adapter = ( ITableAdapter )table.getAdapter( ITableAdapter.class ); adapter.checkData( 0 ); Fixture.fakePhase( PhaseId.PROCESS_ACTION ); table.setItemCount( 0 ); int eventCount = 0; while( ProcessActionRunner.executeNext() ) { eventCount++; } while( SetDataEvent.executeNext() ) { eventCount++; } assertEquals( 1, eventCount ); } public void testGetItemMetrics() { Display display = new Display(); Image image = Graphics.getImage( Fixture.IMAGE1 ); Shell shell = new Shell( display ); shell.setBounds( 0, 0, 800, 600 ); shell.setLayout( new FillLayout() ); Table table = new Table( shell, SWT.NONE ); table.setHeaderVisible( true ); TableColumn column = new TableColumn( table, SWT.NONE ); column.setText( "column1" ); column.setWidth( 200 ); TableItem item1 = new TableItem( table, SWT.NONE ); item1.setText( "item1" ); TableItem item2 = new TableItem( table, SWT.NONE ); item2.setText( "item2" ); TableItem item3 = new TableItem( table, SWT.NONE ); item3.setText( "item3" ); item2.setImage( image ); ItemMetrics[] metrics = TableLCAUtil.getItemMetrics( table ); assertTrue( metrics[ 0 ].imageWidth > 0 ); item1.setImage( image ); metrics = TableLCAUtil.getItemMetrics( table ); int defaultLeftPadding = 2; assertEquals( defaultLeftPadding, metrics[ 0 ].imageLeft ); assertTrue( metrics[ 0 ].imageWidth > 0 ); item1.setImage( image ); Fixture.preserveWidgets(); item1.setImage( ( Image )null ); assertTrue( TableLCAUtil.hasItemMetricsChanged( table ) ); // spacing must be respected int defaultSpacing = 2; int expected = metrics[ 0 ].imageLeft + metrics[ 0 ].imageWidth + defaultSpacing; assertEquals( expected, metrics[ 0 ].textLeft ); // left offset must be compensated ITableAdapter adapter = ( ITableAdapter )table.getAdapter( ITableAdapter.class ); adapter.setLeftOffset( 10 ); metrics = TableLCAUtil.getItemMetrics( table ); assertEquals( 0, metrics[ 0 ].left ); assertEquals( defaultLeftPadding, metrics[ 0 ].imageLeft ); expected = metrics[ 0 ].imageLeft + metrics[ 0 ].imageWidth + defaultSpacing; assertEquals( expected, metrics[ 0 ].textLeft ); // image must not exceed right column border column.setWidth( 12 ); metrics = TableLCAUtil.getItemMetrics( table ); assertEquals( 10, metrics[ 0 ].imageWidth ); Fixture.preserveWidgets(); item1.setImage( image ); table.setSelection( item1 ); assertTrue( TableLCAUtil.hasItemMetricsChanged( table ) ); } public void testGetItemMetricsWithoutColumns() { Display display = new Display(); Image image = Graphics.getImage( Fixture.IMAGE1 ); Shell shell = new Shell( display ); shell.setBounds( 0, 0, 800, 600 ); shell.setLayout( new FillLayout() ); Table table = new Table( shell, SWT.NONE ); table.setHeaderVisible( true ); TableItem item1 = new TableItem( table, SWT.NONE ); item1.setText( "item1" ); TableItem item2 = new TableItem( table, SWT.NONE ); item2.setText( "item2" ); TableItem item3 = new TableItem( table, SWT.NONE ); item3.setText( "item3" ); ItemMetrics[] metrics = TableLCAUtil.getItemMetrics( table ); assertEquals( 0, metrics[ 0 ].imageWidth ); item2.setImage( image ); metrics = TableLCAUtil.getItemMetrics( table ); assertTrue( metrics[ 0 ].imageWidth > 0 ); int defaultLeftPadding = 2; assertEquals( defaultLeftPadding, metrics[ 0 ].imageLeft ); assertTrue( metrics[ 0 ].imageWidth > 0 ); item1.setImage( image ); Fixture.preserveWidgets(); item1.setImage( ( Image )null ); assertTrue( TableLCAUtil.hasItemMetricsChanged( table ) ); // spacing must be respected int defaultSpacing = 2; int expected = metrics[ 0 ].imageLeft + metrics[ 0 ].imageWidth + defaultSpacing; assertEquals( expected, metrics[ 0 ].textLeft ); // left offset must be compensated ITableAdapter adapter = ( ITableAdapter )table.getAdapter( ITableAdapter.class ); adapter.setLeftOffset( 10 ); metrics = TableLCAUtil.getItemMetrics( table ); assertEquals( 0, metrics[ 0 ].left ); assertEquals( defaultLeftPadding, metrics[ 0 ].imageLeft ); expected = metrics[ 0 ].imageLeft + metrics[ 0 ].imageWidth + defaultSpacing; assertEquals( expected, metrics[ 0 ].textLeft ); Fixture.preserveWidgets(); item1.setImage( image ); table.setSelection( item1 ); assertTrue( TableLCAUtil.hasItemMetricsChanged( table ) ); } public void testHideSelection() { Display display = new Display(); Shell shell = new Shell( display ); Table table = new Table( shell, SWT.NONE ); assertEquals( Boolean.FALSE, TableLCA.hideSelection( table ) ); table.setData( Table.HIDE_SELECTION, Boolean.TRUE ); assertEquals( Boolean.TRUE, TableLCA.hideSelection( table ) ); table.setData( Table.HIDE_SELECTION, "true" ); assertEquals( Boolean.FALSE, TableLCA.hideSelection( table ) ); } public void testWriteScrollbarsVisible() throws IOException { Fixture.fakeNewRequest(); Display display = new Display(); Shell shell = new Shell( display ); Table table = new Table( shell, SWT.NO_SCROLL ); TableLCA lca = new TableLCA(); lca.renderChanges( table ); String markup = Fixture.getAllMarkup(); String expected = "w.setScrollBarsVisibile( false, false );"; assertTrue( markup.indexOf( expected ) != -1 ); } public void testWriteScrollbarsSelectionListener() throws IOException { Fixture.fakeNewRequest(); Display display = new Display(); Shell shell = new Shell( display ); Table table = new Table( shell, SWT.NONE ); SelectionAdapter listener = new SelectionAdapter() { }; table.getHorizontalBar().addSelectionListener( listener ); TableLCA lca = new TableLCA(); lca.renderChanges( table ); String markup = Fixture.getAllMarkup(); String expected = "w.setHasScrollBarsSelectionListener( true );"; assertTrue( markup.indexOf( expected ) != -1 ); } public void testWriteFocusIndex() throws IOException { Display display = new Display(); Shell shell = new Shell( display ); Table table = new Table( shell, SWT.NO_SCROLL ); for( int i = 0; i < 3; i++ ) { new TableItem( table, SWT.NONE ); } TableLCA lca = new TableLCA(); Fixture.fakeNewRequest(); lca.renderChanges( table ); String markup = Fixture.getAllMarkup(); String expected = "w.setFocusIndex"; assertTrue( markup.indexOf( expected ) == -1 ); table.setSelection( 0 ); Fixture.fakeNewRequest(); Fixture.markInitialized( table ); lca.preserveValues( table ); table.getItem( 0 ).dispose(); lca.renderChanges( table ); markup = Fixture.getAllMarkup(); expected = "w.setFocusIndex( -1 )"; assertTrue( markup.indexOf( expected ) != -1 ); } public void testReadFocusIndex() { Display display = new Display(); Shell shell = new Shell( display ); Table table = new Table( shell, SWT.MULTI ); for( int i = 0; i < 5; i++ ) { new TableItem( table, SWT.NONE ); } Object adapter = table.getAdapter( ITableAdapter.class ); ITableAdapter tableAdapter = ( ITableAdapter )adapter; String tableId = WidgetUtil.getId( table ); // ensure that reading selection parameter does not override focusIndex Fixture.fakeRequestParam( tableId + ".focusIndex", "5" ); Fixture.fakeRequestParam( tableId + ".selection", "0,1,2,3,4,5" ); TableLCA tableLCA = new TableLCA(); tableLCA.readData( table ); assertEquals( 5, tableAdapter.getFocusIndex() ); } public void testReadTopIndex() { Display display = new Display(); Shell shell = new Shell( display ); Table table = new Table( shell, SWT.MULTI ); table.setSize( 485, 485 ); for( int i = 0; i < 115; i++ ) { new TableItem( table, SWT.NONE ); } String tableId = WidgetUtil.getId( table ); String indices = "114,70,71,72,73,74,75,76,77,78,79,80,81,82,83," + "84,85,86,87,88,89,90,91,92,93,94,95,96,97,98," + "99,100,101,102,103,104,105,106,107,108,109," + "110,111,112,113,0"; Fixture.fakeRequestParam( tableId + ".topIndex", "0" ); Fixture.fakeRequestParam( tableId + ".selection", indices ); TableLCA tableLCA = new TableLCA(); tableLCA.readData( table ); assertEquals( 0, table.getTopIndex() ); } public void testGetCellToolTipText() { Display display = new Display(); Shell shell = new Shell( display ); Table table = new Table( shell, SWT.NONE ); for( int i = 0; i < 5; i++ ) { new TableItem( table, SWT.NONE ); } Object adapter = table.getAdapter( ITableAdapter.class ); final ITableAdapter tableAdapter = ( ITableAdapter )adapter; tableAdapter.setCellToolTipProvider( new ICellToolTipProvider() { public void getToolTipText( final int itemIndex, final int columnIndex ) { String text = "[" + itemIndex + "," + columnIndex + "]"; tableAdapter.setToolTipText( text ); } } ); String displayId = DisplayUtil.getId( display ); String tableId = WidgetUtil.getId( table ); Fixture.fakeNewRequest(); Fixture.executeLifeCycleFromServerThread(); String markup = Fixture.getAllMarkup(); String expected = "w.setCellToolTipText("; assertTrue( markup.indexOf( expected ) == -1 ); Fixture.fakeNewRequest(); Fixture.fakeRequestParam( RequestParams.UIROOT, displayId ); Fixture.fakeRequestParam( TableLCA.EVENT_CELL_TOOLTIP_TEXT_REQUESTED, tableId ); Fixture.fakeRequestParam( TableLCA.EVENT_CELL_TOOLTIP_TEXT_REQUESTED_CELL, "1,2" ); Fixture.executeLifeCycleFromServerThread(); markup = Fixture.getAllMarkup(); expected = "w.setCellToolTipText( \"[1,2]\" );"; assertTrue( markup.indexOf( expected ) != -1 ); } public void testScrollbarsSelectionEvent() { Fixture.fakePhase( PhaseId.PROCESS_ACTION ); final ArrayList log = new ArrayList(); Display display = new Display(); Shell shell = new Shell( display ); Table table = new Table( shell, SWT.NONE ); SelectionListener listener = new SelectionAdapter() { public void widgetSelected( SelectionEvent event ) { log.add( "scrollbarSelected" ); } }; table.getHorizontalBar().addSelectionListener( listener ); Fixture.fakeNewRequest(); String tableId = WidgetUtil.getId( table ); Fixture.fakeRequestParam( tableId + ".leftOffset", "10" ); Fixture.readDataAndProcessAction( table ); assertEquals( 1, log.size() ); assertEquals( 10, table.getHorizontalBar().getSelection() ); log.clear(); table.getVerticalBar().addSelectionListener( listener ); Fixture.fakeNewRequest(); Fixture.fakeRequestParam( tableId + ".leftOffset", "10" ); Fixture.fakeRequestParam( tableId + ".topIndex", "10" ); Fixture.readDataAndProcessAction( table ); assertEquals( 2, log.size() ); assertEquals( 10 * table.getItemHeight(), table.getVerticalBar().getSelection()); } protected void setUp() throws Exception { Fixture.setUp(); } protected void tearDown() throws Exception { Fixture.tearDown(); } private static boolean isItemVirtual( final Table table, final int index ) { Object adapter = table.getAdapter( ITableAdapter.class ); ITableAdapter tableAdapter = ( ITableAdapter )adapter; return tableAdapter.isItemVirtual( index ); } }