blob: 97f32af2e2bef726fa760189e820d4cd12a02c6a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2019 Innoopract Informationssysteme GmbH and others.
* 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.widgets;
import static org.eclipse.rap.rwt.testfixture.internal.TestUtil.createImage;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import java.io.IOException;
import java.util.ArrayList;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.internal.lifecycle.WidgetLCA;
import org.eclipse.rap.rwt.testfixture.TestContext;
import org.eclipse.rap.rwt.testfixture.internal.Fixture;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.internal.widgets.ITableAdapter;
import org.eclipse.swt.internal.widgets.MarkupValidator;
import org.eclipse.swt.internal.widgets.tablecolumnkit.TableColumnLCA;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
public class TableColumn_Test {
@Rule
public TestContext context = new TestContext();
private Display display;
private Shell shell;
private Table table;
private TableColumn column;
@Before
public void setUp() {
display = new Display();
shell = new Shell( display );
table = new Table( shell, SWT.NONE );
column = new TableColumn( table, SWT.NONE );
}
@Test
public void testCreation() {
assertEquals( 1, table.getColumnCount() );
assertSame( column, table.getColumn( 0 ) );
// Insert an item before first item
TableColumn col0 = new TableColumn( table, SWT.NONE, 0 );
assertEquals( 2, table.getColumnCount() );
assertSame( col0, table.getColumn( 0 ) );
// Try to add an item whit an index which is out of bounds
try {
new TableColumn ( table, SWT.NONE, table.getColumnCount() + 8 );
fail();
} catch( IllegalArgumentException expected ) {
}
}
@Test
public void testParent() {
// Test creating column with valid parent
assertSame( table, column.getParent() );
// Test creating column without parent
try {
new TableColumn( null, SWT.NONE );
fail( "Must not allow to create TableColumn withh null-parent." );
} catch( IllegalArgumentException iae ) {
// expected
}
}
@Test
public void testDisplay() {
assertSame( display, column.getDisplay() );
}
@Test
public void testStyle() {
assertTrue( ( column.getStyle() & SWT.LEFT ) != 0 );
column = new TableColumn( table, SWT.LEFT | SWT.RIGHT | SWT.CENTER );
assertTrue( ( column.getStyle() & SWT.LEFT ) != 0 );
column = new TableColumn( table, SWT.RIGHT );
assertTrue( ( column.getStyle() & SWT.RIGHT ) != 0 );
}
@Test
public void testInitialValues() {
assertEquals( 0, column.getWidth() );
assertEquals( "", column.getText() );
assertEquals( null, column.getToolTipText() );
assertNull( column.getImage() );
assertTrue( column.getResizable() );
assertFalse( column.getMoveable() );
assertEquals( SWT.LEFT, column.getAlignment() );
}
@Test
public void testAlignment() {
assertEquals( SWT.LEFT, column.getAlignment() );
column = new TableColumn( table, SWT.LEFT );
assertEquals( SWT.LEFT, column.getAlignment() );
column = new TableColumn( table, SWT.CENTER );
assertEquals( SWT.CENTER, column.getAlignment() );
column = new TableColumn( table, SWT.RIGHT );
assertEquals( SWT.RIGHT, column.getAlignment() );
column.setAlignment( SWT.LEFT );
assertEquals( SWT.LEFT, column.getAlignment() );
column.setAlignment( 4712 );
assertEquals( SWT.LEFT, column.getAlignment() );
}
@Test
public void testInitialWidth() {
assertEquals( 0, column.getWidth() );
}
@Test
public void testWidth() {
column.setWidth( 70 );
assertEquals( 70, column.getWidth() );
column.setWidth( 0 );
assertEquals( 0, column.getWidth() );
}
@Test
public void testWidthWithNegativeValue() {
column.setWidth( 4711 );
column.setWidth( -1 );
assertEquals( 4711, column.getWidth() );
column.setWidth( -2 );
assertEquals( 4711, column.getWidth() );
column.setWidth( -3 );
assertEquals( 4711, column.getWidth() );
}
@Test
public void testPack() throws IOException {
final java.util.List<Widget> log = new ArrayList<Widget>();
ControlAdapter resizeListener = new ControlAdapter() {
@Override
public void controlResized( ControlEvent e ) {
log.add( e.widget );
}
};
table.setHeaderVisible( true );
column.addControlListener( resizeListener );
// Ensure that controlResized is fired when pack changes the width
column.setWidth( 12312 );
log.clear();
column.pack();
assertSame( log.get( 0 ), column );
// Ensure that controlResized is *not* fired when pack doesn't change the
// width
log.clear();
column.pack();
assertEquals( 0, log.size() );
column.removeControlListener( resizeListener );
// pack calculates a minimal width for an empty column
column = new TableColumn( table, SWT.NONE );
column.pack();
assertTrue( column.getWidth() > 0 );
// Test that an image on a column is taken into account
column = new TableColumn( table, SWT.NONE );
Image image = createImage( display, Fixture.IMAGE_50x100 );
column.setImage( image );
column.pack();
assertTrue( column.getWidth() >= image.getBounds().width );
// An item wider than the column itself strechtes the column
while( table.getColumnCount() > 0 ) {
table.getColumn( 0 ).dispose();
}
table.removeAll();
column = new TableColumn( table, SWT.NONE );
TableItem item = new TableItem( table, SWT.NONE );
item.setImage( image );
column.pack();
assertTrue( column.getWidth() >= item.getBounds().width );
}
@Test
public void testGetPreferredWidthWithInvisibleHeader() {
table.setHeaderVisible( true );
column.setText( "column" );
int preferredWidth = column.getPreferredWidth();
table.setHeaderVisible( false );
assertEquals( preferredWidth, column.getPreferredWidth() );
}
@Test
public void testGetPreferredWidthMultiLineHeader() {
for( int i = 0; i < 3; i++ ) {
TableColumn column1 = new TableColumn( table, SWT.NONE );
column1.setWidth( 50 );
column1.setText( "Column " + i );
}
table.setHeaderVisible( true );
TableColumn column = table.getColumn( 1 );
column.setText( "Multi\nLineText" );
assertEquals( 61, column.getPreferredWidth() );
}
@Test
public void testPackWithVirtual() {
final java.util.List<Widget> log = new ArrayList<Widget>();
Listener setDataListener = new Listener() {
@Override
public void handleEvent( Event event ) {
log.add( event.item );
}
};
ControlListener resizeListener = new ControlAdapter() {
@Override
public void controlResized( ControlEvent event ) {
log.add( event.widget );
}
};
// Must not try to access items if there aren't any
log.clear();
table = new Table( shell, SWT.VIRTUAL );
column = new TableColumn( table, SWT.NONE );
column.setWidth( 200 );
column.addControlListener( resizeListener );
column.pack();
assertEquals( 1, log.size() ); // ensure that pack() did something
// Ensure that pack resolves only first virtual item
log.clear();
table = new Table( shell, SWT.VIRTUAL );
column = new TableColumn( table, SWT.NONE );
table.setSize( 100, 50 );
table.setItemCount( 100 );
table.addListener( SWT.SetData, setDataListener );
column.pack();
assertEquals( 1, log.size() );
}
@Test
public void testResizeEvent() {
final java.util.List<ControlEvent> log = new ArrayList<ControlEvent>();
column.addControlListener( new ControlListener() {
@Override
public void controlMoved( ControlEvent event ) {
fail( "unexpected event: controlMoved" );
}
@Override
public void controlResized( ControlEvent event ) {
log.add( event );
}
} );
ControlEvent event;
// Changing column width leads to resize event
log.clear();
column.setWidth( column.getWidth() + 1 );
assertEquals( 1, log.size() );
event = log.get( 0 );
assertSame( column, event.getSource() );
// Setting the column width to the same value it already has as well leads
// to resize event
log.clear();
column.setWidth( column.getWidth() );
assertEquals( 1, log.size() );
event = log.get( 0 );
assertEquals( column, event.getSource() );
}
@Test
public void testMoveEvent() {
final java.util.List<ControlEvent> log = new ArrayList<ControlEvent>();
column.addControlListener( new ControlListener() {
@Override
public void controlMoved( ControlEvent event ) {
fail( "unexpected event: controlMoved" );
}
@Override
public void controlResized( ControlEvent event ) {
log.add( event );
}
} );
final TableColumn column1 = new TableColumn( table, SWT.NONE );
column1.addControlListener( new ControlListener() {
@Override
public void controlMoved( ControlEvent event ) {
log.add( event );
}
@Override
public void controlResized( ControlEvent event ) {
fail( "unexpected event: controlResized" );
}
} );
ControlEvent event;
// Changing column width leads to resize event and move event of the next
// columns
log.clear();
column.setWidth( column.getWidth() + 1 );
assertEquals( 2, log.size() );
event = log.get( 0 );
assertSame( column, event.getSource() );
event = log.get( 1 );
assertSame( column1, event.getSource() );
}
@Test
public void testDisposeLast() {
TableColumn column1 = new TableColumn( table, SWT.NONE );
TableItem item = new TableItem( table, SWT.NONE );
item.setText( "itemText for column 0" );
item.setText( 1, "itemText for column 1" );
column1.dispose();
assertEquals( "", item.getText( 1 ) );
assertEquals( "itemText for column 0", item.getText() );
column.dispose();
assertEquals( 0, table.getColumnCount() );
assertEquals( 1, table.getItemCount() );
assertEquals( "itemText for column 0", item.getText() );
}
// 323179: Creating and disposing a TableColumn (without updating the
// TableItems) results in an ArrayIndexOutOfBoundsException
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=323179
@Test
public void testCreateDisposeColumnWithoutDataUpdate() {
column.setText( "First Column" );
int number = 5;
TableItem[] items = new TableItem[ number ];
for( int i = 0; i < number; i++ ) {
items[ i ] = new TableItem( table, SWT.NONE );
items[ i ].setText( 0, "x1" );
}
TableColumn column2 = new TableColumn( table, SWT.NONE );
column2.setText( "Second Column" );
column2.dispose();
}
@Test
public void testIsFixedColumn() {
shell.setSize( 800, 600 );
Table table = createFixedColumnsTable( shell );
table.setSize( 300, 100 );
ITableAdapter adapter = table.getAdapter( ITableAdapter.class );
assertTrue( adapter.isFixedColumn( table.getColumn( 0 ) ) );
assertFalse( adapter.isFixedColumn( table.getColumn( 1 ) ) );
table.setColumnOrder( new int[]{ 1, 0, 2, 3, 4, 5, 6, 7, 8, 9 } );
assertFalse( adapter.isFixedColumn( table.getColumn( 0 ) ) );
assertTrue( adapter.isFixedColumn( table.getColumn( 1 ) ) );
}
@Test
public void testAddSelectionListener() {
column.addSelectionListener( mock( SelectionListener.class ) );
assertTrue( column.isListening( SWT.Selection ) );
assertTrue( column.isListening( SWT.DefaultSelection ) );
}
@Test
public void testRemoveSelectionListener() {
SelectionListener listener = mock( SelectionListener.class );
column.addSelectionListener( listener );
column.removeSelectionListener( listener );
assertFalse( column.isListening( SWT.Selection ) );
assertFalse( column.isListening( SWT.DefaultSelection ) );
}
@Test
public void testAddSelectionListenerWithNullArgument() {
try {
column.addSelectionListener( null );
} catch( IllegalArgumentException expected ) {
}
}
@Test
public void testRemoveSelectionListenerWithNullArgument() {
try {
column.removeSelectionListener( null );
} catch( IllegalArgumentException expected ) {
}
}
@Test
public void testAddControlListenerWithNullArgument() {
try {
column.addControlListener( null );
} catch( IllegalArgumentException expected ) {
}
}
@Test
public void testAddControlListener() {
column.addControlListener( mock( ControlListener.class ) );
assertTrue( column.isListening( SWT.Move ) );
assertTrue( column.isListening( SWT.Resize ) );
}
@Test
public void testRemoveControlListenerWithNullArgument() {
try {
column.removeControlListener( null );
} catch( IllegalArgumentException expected ) {
}
}
@Test
public void testRemoveControlListener() {
ControlListener listener = mock( ControlListener.class );
column.addControlListener( listener );
column.removeControlListener( listener );
assertFalse( column.isListening( SWT.Move ) );
assertFalse( column.isListening( SWT.Resize ) );
}
@Test
public void testMarkupToolTipTextWithoutMarkupEnabled() {
column.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.FALSE );
try {
column.setToolTipText( "invalid xhtml: <<&>>" );
} catch( IllegalArgumentException notExpected ) {
fail();
}
}
@Test( expected = IllegalArgumentException.class )
public void testMarkupToolTipTextWithMarkupEnabled() {
column.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
column.setToolTipText( "invalid xhtml: <<&>>" );
}
@Test
public void testMarkupTextWithMarkupEnabled_ValidationDisabled() {
column.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
column.setData( MarkupValidator.MARKUP_VALIDATION_DISABLED, Boolean.TRUE );
try {
column.setToolTipText( "invalid xhtml: <<&>>" );
} catch( IllegalArgumentException notExpected ) {
fail();
}
}
@Test
public void testSetToolTipMarkupEnabled_onDirtyWidget() {
column.setToolTipText( "something" );
try {
column.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
fail();
} catch( SWTException expected ) {
assertTrue( expected.throwable instanceof IllegalStateException );
}
}
@Test
public void testSetToolTipMarkupEnabled_onDirtyWidget_onceEnabledBefore() {
column.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
column.setToolTipText( "something" );
column.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
}
@Test
public void testDisableMarkupIsIgnored() {
column.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
column.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.FALSE );
assertEquals( Boolean.TRUE, column.getData( RWT.TOOLTIP_MARKUP_ENABLED ) );
}
@Test
public void testSetData() {
column.setData( "foo", "bar" );
assertEquals( "bar", column.getData( "foo" ) );
}
private Table createFixedColumnsTable( Shell shell ) {
Table result = new Table( shell, SWT.NONE );
result.setData( RWT.FIXED_COLUMNS, new Integer( 1 ) );
for( int i = 0; i < 10; i++ ) {
TableColumn column = new TableColumn( result, SWT.NONE );
column.setWidth( 50 );
}
return result;
}
@Test
public void testGetAdapter_LCA() {
assertTrue( column.getAdapter( WidgetLCA.class ) instanceof TableColumnLCA );
assertSame( column.getAdapter( WidgetLCA.class ), column.getAdapter( WidgetLCA.class ) );
}
}