/******************************************************************************* * 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.widgets; import java.util.ArrayList; import junit.framework.TestCase; import org.eclipse.rwt.Fixture; import org.eclipse.rwt.graphics.Graphics; import org.eclipse.rwt.lifecycle.PhaseId; import org.eclipse.swt.SWT; import org.eclipse.swt.events.*; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.internal.widgets.ItemHolder; public class TabFolderAndItem_Test extends TestCase { public void testGetItemsAndGetItemCount() { Display display = new Display(); Composite shell = new Shell( display, SWT.NONE ); TabFolder folder = new TabFolder( shell, SWT.NONE ); assertEquals( 0, folder.getItemCount() ); assertEquals( 0, folder.getItems().length ); TabItem item = new TabItem( folder, SWT.NONE ); assertEquals( 1, folder.getItemCount() ); assertEquals( 1, folder.getItems().length ); assertSame( item, folder.getItems()[ 0 ] ); } public void testInitialSelection() { Fixture.fakePhase( PhaseId.PROCESS_ACTION ); final java.util.List log = new ArrayList(); Display display = new Display(); Shell shell = new Shell( display ); TabFolder folder = new TabFolder( shell, SWT.NONE ); folder.setSize( 100, 100 ); SelectionListener selectionListener = new SelectionAdapter() { public void widgetSelected( final SelectionEvent e ) { log.add( e ); } }; folder.addSelectionListener( selectionListener ); assertEquals( -1, folder.getSelectionIndex() ); assertEquals( 0, folder.getSelection().length ); // add first item which must become selected and fire a SelectionEvent TabItem item = new TabItem( folder, SWT.NONE ); assertEquals( 0, folder.getSelectionIndex() ); assertEquals( 1, folder.getSelection().length ); assertSame( item, folder.getSelection()[ 0 ] ); assertEquals( 1, log.size() ); SelectionEvent event = ( SelectionEvent )log.get( 0 ); assertSame( folder, event.widget ); assertSame( item, event.item ); assertTrue( event.doit ); assertEquals( 0, event.x ); assertEquals( 0, event.y ); assertEquals( 0, event.width ); assertEquals( 0, event.height ); assertNull( event.data ); assertEquals( SWT.NONE, event.detail ); assertNull( event.text ); // ... and the same wihtout a SelectionListener folder.removeSelectionListener( selectionListener ); item.dispose(); item = new TabItem( folder, SWT.NONE ); assertEquals( 0, folder.getSelectionIndex() ); assertEquals( 1, folder.getSelection().length ); assertSame( item, folder.getSelection()[ 0 ] ); } public void testIndexOf() { Display display = new Display(); Composite shell = new Shell( display, SWT.NONE ); TabFolder folder = new TabFolder( shell, SWT.NONE ); TabItem item0 = new TabItem( folder, SWT.NONE ); TabItem item1 = new TabItem( folder, SWT.NONE ); assertEquals( 0, folder.indexOf( item0 ) ); assertEquals( 1, folder.indexOf( item1 ) ); item0.dispose(); assertEquals( 0, folder.indexOf( item1 ) ); TabFolder anotherTabFolder = new TabFolder( shell, SWT.NONE ); TabItem anotherItem = new TabItem( anotherTabFolder, SWT.NONE ); assertEquals( -1, folder.indexOf( anotherItem ) ); } public void testSelection() { Fixture.fakePhase( PhaseId.PROCESS_ACTION ); Display display = new Display(); Composite shell = new Shell( display, SWT.NONE ); TabFolder folder = new TabFolder( shell, SWT.NONE ); TabItem item0 = new TabItem( folder, SWT.NONE ); TabItem item1 = new TabItem( folder, SWT.NONE ); folder.setSelection( new TabItem[]{ item0 } ); TabItem[] selection = folder.getSelection(); assertEquals( 1, selection.length ); assertSame( item0, selection[ 0 ] ); assertEquals( 0, folder.getSelectionIndex() ); folder.setSelection( new TabItem[]{ item1, item0 } ); selection = folder.getSelection(); assertEquals( 1, selection.length ); assertSame( item1, selection[ 0 ] ); assertEquals( 1, folder.getSelectionIndex() ); folder.setSelection( new TabItem[ 0 ] ); selection = folder.getSelection(); assertEquals( 0, selection.length ); assertEquals( -1, folder.getSelectionIndex() ); try { folder.setSelection( ( TabItem )null ); fail( "No exception thrown for selection == null" ); } catch( IllegalArgumentException iae ) { // expected } try { folder.setSelection( ( TabItem[] )null ); fail( "Parameter items must not be null." ); } catch( final IllegalArgumentException iae ) { // expected } folder.setSelection( 1 ); selection = folder.getSelection(); assertEquals( 1, selection.length ); assertSame( item1, selection[ 0 ] ); assertEquals( 1, folder.getSelectionIndex() ); folder.setSelection( 3 ); selection = folder.getSelection(); assertEquals( 1, selection.length ); assertSame( item1, selection[ 0 ] ); assertEquals( 1, folder.getSelectionIndex() ); folder.setSelection( -2 ); selection = folder.getSelection(); assertEquals( 1, selection.length ); assertSame( item1, selection[ 0 ] ); assertEquals( 1, folder.getSelectionIndex() ); folder.setSelection( -1 ); selection = folder.getSelection(); assertEquals( 1, selection.length ); assertSame( item1, selection[ 0 ] ); assertEquals( 1, folder.getSelectionIndex() ); // Ensure that no event is fired when selection is changed programmatically final boolean[] eventOccured = new boolean[] { false }; SelectionListener listener = new SelectionAdapter() { public void widgetSelected( final SelectionEvent e ) { eventOccured[ 0 ] = true; } }; folder.setSelection( 0 ); folder.addSelectionListener( listener ); folder.setSelection( 1 ); assertEquals( 1, folder.getSelectionIndex() ); assertEquals( false, eventOccured[ 0 ] ); folder.removeSelectionListener( listener ); // test change of selection index in case of disposing the item thats // currently selected // TODO: [fappel] note that this is only a preliminarily implementation // since SWT behaves different in case that the selected // tab is disposed. folder.setSelection( 1 ); item1.dispose(); assertEquals( 0, folder.getSelectionIndex() ); assertSame( item0, folder.getSelection()[ 0 ] ); item1 = new TabItem( folder, SWT.NONE ); folder.setSelection( 0 ); item1.dispose(); assertEquals( 0, folder.getSelectionIndex() ); assertSame( item0, folder.getSelection()[ 0 ] ); } public void testSelectedControl() { Display display = new Display(); Shell shell = new Shell( display, SWT.NONE ); TabFolder folder = new TabFolder( shell, SWT.NONE ); shell.open(); TabItem item0 = new TabItem( folder, SWT.NONE ); Control control0 = new Button( folder, SWT.PUSH ); item0.setControl( control0 ); assertTrue( control0.getVisible() ); TabItem item1 = new TabItem( folder, SWT.NONE ); Control control1 = new Button( folder, SWT.PUSH ); item1.setControl( control1 ); assertFalse( control1.getVisible() ); folder.setSelection( item1 ); assertTrue( control1.getVisible() ); Control alternativeControl1 = new Button( folder, SWT.PUSH ); item1.setControl( alternativeControl1 ); assertFalse( control1.getVisible() ); assertTrue( alternativeControl1.getVisible() ); } public void testImages() { Display display = new Display(); Composite shell = new Shell( display, SWT.NONE ); TabFolder folder = new TabFolder( shell, SWT.NONE ); TabItem item0 = new TabItem( folder, SWT.NONE ); item0.setImage(Graphics.getImage( Fixture.IMAGE1 ) ); assertSame( Graphics.getImage( Fixture.IMAGE1 ), item0.getImage() ); TabItem item1 = new TabItem( folder, SWT.NONE ); item1.setImage(Graphics.getImage( Fixture.IMAGE2 ) ); assertSame( Graphics.getImage( Fixture.IMAGE2 ), item1.getImage() ); } public void testHierarchy() { Display display = new Display(); Shell shell = new Shell( display, SWT.NONE ); TabFolder folder = new TabFolder( shell, SWT.NONE ); TabItem item = new TabItem( folder, SWT.NONE ); assertSame( folder, item.getParent() ); assertSame( display, item.getDisplay() ); Control control = new Label( folder, SWT.NONE ); item.setControl( control ); assertSame( control, item.getControl() ); try { item.setControl( shell ); fail( "Wrong parent." ); } catch( final IllegalArgumentException iae ) { // expected } } public void testDispose() { Display display = new Display(); Composite shell = new Shell( display, SWT.NONE ); TabFolder folder = new TabFolder( shell, SWT.NONE ); TabItem item = new TabItem( folder, SWT.NONE ); folder.dispose(); assertEquals( true, item.isDisposed() ); assertEquals( 0, ItemHolder.getItems( folder ).length ); } public void testIndexedItemCreation() { Fixture.fakePhase( PhaseId.PROCESS_ACTION ); Display display = new Display(); Shell shell = new Shell( display, SWT.NONE ); TabFolder folder = new TabFolder( shell, SWT.NONE ); TabItem secondItem = new TabItem( folder, SWT.NONE ); TabItem firstItem = new TabItem( folder, SWT.NONE, 0 ); assertSame( firstItem, folder.getItem( 0 ) ); assertEquals( 0, folder.indexOf( firstItem ) ); assertSame( secondItem, folder.getItem( 1 ) ); assertEquals( 1, folder.indexOf( secondItem ) ); } public void testItemDispose() { Fixture.fakePhase( PhaseId.PROCESS_ACTION ); Display display = new Display(); Shell shell = new Shell( display, SWT.NONE ); TabFolder folder = new TabFolder( shell, SWT.NONE ); new TabItem( folder, SWT.NONE ); new TabItem( folder, SWT.NONE ); new TabItem( folder, SWT.NONE ); TabItem item = folder.getItem( 2 ); item.dispose(); assertEquals( true, item.isDisposed() ); assertEquals( 2, folder.getItemCount() ); } public void testToolTip() throws Exception { Display display = new Display(); Shell shell = new Shell( display, SWT.NONE ); TabFolder folder = new TabFolder( shell, SWT.NONE ); TabItem tabItem = new TabItem( folder, SWT.NONE ); assertEquals( null, tabItem.getToolTipText() ); tabItem.setToolTipText( "funny" ); assertEquals( "funny", tabItem.getToolTipText() ); } public void testGetItemAtPoint() { Display display = new Display(); Shell shell = new Shell( display, SWT.NONE ); // Test with bar on top TabFolder folder = new TabFolder( shell, SWT.NONE ); folder.setSize( 400, 400 ); for( int i = 0; i < 3; i++ ) { TabItem tabItem = new TabItem( folder, SWT.NONE ); tabItem.setText( "TabItem " + i ); } Rectangle expected = new Rectangle( 0, 0, 65, 21 ); assertEquals( expected, folder.getItem( 0 ).getBounds() ); expected = new Rectangle( 65, 3, 60, 18 ); assertEquals( expected, folder.getItem( 1 ).getBounds() ); expected = new Rectangle( 126, 3, 61, 18 ); assertEquals( expected, folder.getItem( 2 ).getBounds() ); assertEquals( folder.getItem( 0 ), folder.getItem( new Point( 10, 2 ) ) ); assertEquals( folder.getItem( 0 ), folder.getItem( new Point( 10, 10 ) ) ); assertNull( folder.getItem( new Point( 95, 2 ) ) ); assertEquals( folder.getItem( 1 ), folder.getItem( new Point( 95, 10 ) ) ); assertNull( folder.getItem( new Point( 130, 2 ) ) ); assertEquals( folder.getItem( 2 ), folder.getItem( new Point( 130, 10 ) ) ); // Test with bar on bottom folder = new TabFolder( shell, SWT.BOTTOM ); folder.setSize( 400, 400 ); for( int i = 0; i < 3; i++ ) { TabItem tabItem = new TabItem( folder, SWT.NONE ); tabItem.setText( "TabItem " + i ); } expected = new Rectangle( 0, 379, 65, 21 ); assertEquals( expected, folder.getItem( 0 ).getBounds() ); expected = new Rectangle( 65, 379, 60, 18 ); assertEquals( expected, folder.getItem( 1 ).getBounds() ); expected = new Rectangle( 126, 379, 61, 18 ); assertEquals( expected, folder.getItem( 2 ).getBounds() ); assertEquals( folder.getItem( 0 ), folder.getItem( new Point( 10, 398 ) ) ); assertEquals( folder.getItem( 0 ), folder.getItem( new Point( 10, 390 ) ) ); assertNull( folder.getItem( new Point( 95, 398 ) ) ); assertEquals( folder.getItem( 1 ), folder.getItem( new Point( 95, 390 ) ) ); assertNull( folder.getItem( new Point( 130, 398 ) ) ); assertEquals( folder.getItem( 2 ), folder.getItem( new Point( 130, 390 ) ) ); assertNull( folder.getItem( new Point( 200, 200 ) ) ); try { folder.getItem( null ); fail( "Null argument" ); } catch( final IllegalArgumentException iae ) { // expected } } protected void setUp() throws Exception { Fixture.setUp(); } protected void tearDown() throws Exception { Fixture.tearDown(); } }