/******************************************************************************* * Copyright (c) 2009, 2017 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 java.util.Arrays.asList; import static org.eclipse.rap.rwt.testfixture.internal.TestUtil.createImage; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; 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.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.eclipse.rap.rwt.RWT; import org.eclipse.rap.rwt.internal.lifecycle.RemoteAdapter; import org.eclipse.rap.rwt.internal.lifecycle.ReparentedControls; import org.eclipse.rap.rwt.internal.lifecycle.WidgetLCA; import org.eclipse.rap.rwt.internal.theme.ThemeAdapter; import org.eclipse.rap.rwt.internal.theme.ThemeTestUtil; import org.eclipse.rap.rwt.testfixture.TestContext; import org.eclipse.rap.rwt.testfixture.internal.Fixture; import org.eclipse.rap.rwt.theme.BoxDimensions; import org.eclipse.rap.rwt.theme.ControlThemeAdapter; import org.eclipse.swt.SWT; import org.eclipse.swt.SWTException; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.ControlListener; import org.eclipse.swt.events.DragDetectListener; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.HelpListener; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.MenuDetectListener; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.TraverseListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.internal.widgets.ControlRemoteAdapter; import org.eclipse.swt.internal.widgets.ControlUtil; import org.eclipse.swt.internal.widgets.IControlAdapter; import org.eclipse.swt.internal.widgets.IShellAdapter; import org.eclipse.swt.internal.widgets.MarkupValidator; import org.eclipse.swt.layout.FillLayout; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @SuppressWarnings( "deprecation" ) public class Control_Test { @Rule public TestContext context = new TestContext(); private Display display; private Shell shell; @Before public void setUp() { display = new Display(); shell = new Shell( display ); } @Test public void testCreate() { Control control = new Button( shell, SWT.NONE ); assertSame( shell, control.getParent() ); assertSame( display, control.getDisplay() ); } @Test( expected = IllegalArgumentException.class ) public void testCreate_failsWithNullParent() { new Button( null, SWT.NONE ); } @Test public void testGetAdapterWithControlAdapter() { Control control = new Button( shell, SWT.NONE ); Object adapter = control.getAdapter( IControlAdapter.class ); assertNotNull( adapter ); } @Test public void testGetAdapterWithControlThemeAdapter() { Control control = new Button( shell, SWT.NONE ); Object controlThemeAdapter = control.getAdapter( ControlThemeAdapter.class ); Object themeAdapter = control.getAdapter( ThemeAdapter.class ); assertNotNull( controlThemeAdapter ); assertSame( controlThemeAdapter, themeAdapter ); } @Test public void testStyle() { Control control = new Button( shell, SWT.NONE ); assertTrue( ( control.getStyle() & SWT.LEFT_TO_RIGHT ) != 0 ); control = new Button( shell, SWT.BORDER ); assertTrue( ( control.getStyle() & SWT.LEFT_TO_RIGHT ) != 0 ); } @Test public void testBounds() { Control control = new Button( shell, SWT.PUSH ); Rectangle controlBounds = control.getBounds(); Rectangle expected = new Rectangle( 0, 0, 0, 0 ); assertEquals( expected, controlBounds ); Rectangle newBounds = new Rectangle( 10, 20, 30, 40 ); control.setBounds( newBounds ); controlBounds = control.getBounds(); expected = new Rectangle( 10, 20, 30, 40 ); assertEquals( expected, controlBounds ); assertNotSame( newBounds, controlBounds ); assertNotSame( controlBounds, control.getBounds() ); newBounds.x = 100; controlBounds = control.getBounds(); expected = new Rectangle( 10, 20, 30, 40 ); assertEquals( expected, controlBounds ); control.setBounds( 5, 6, 7, 8 ); controlBounds = control.getBounds(); expected = new Rectangle( 5, 6, 7, 8 ); assertEquals( expected, controlBounds ); control.setLocation( 11, 12 ); control.setSize( 13, 14 ); controlBounds = control.getBounds(); expected = new Rectangle( 11, 12, 13, 14 ); assertEquals( expected, controlBounds ); try { control.setBounds( null ); fail( "Rectangle parameter must not be null." ); } catch( IllegalArgumentException iae ) { // expected } control.setBounds( 0, 0, -1, -1 ); assertEquals( new Rectangle( 0, 0, 0, 0 ), control.getBounds() ); } @Test public void testLocation() { Control control = new Button( shell, SWT.PUSH ); Point expectedLocation = new Point( 10, 20 ); control.setLocation( expectedLocation ); Rectangle controlBounds = control.getBounds(); Rectangle expectedBounds = new Rectangle( 10, 20, 0, 0 ); assertEquals( expectedBounds, controlBounds ); Point controlLocation = control.getLocation(); assertEquals( expectedLocation, controlLocation ); assertNotSame( expectedLocation, controlLocation ); expectedLocation.x = 15; controlLocation = control.getLocation(); assertEquals( new Point( 10, 20 ), controlLocation ); try { control.setLocation( null ); fail( "Point parameter must not be null." ); } catch( IllegalArgumentException iae ) { // expected } } @Test public void testSize() { Control control = new Button( shell, SWT.PUSH ); Point expectedSize = new Point( 10, 20 ); control.setSize( expectedSize ); Rectangle controlBounds = control.getBounds(); Rectangle expectedBounds = new Rectangle( 0, 0, 10, 20 ); assertEquals( expectedBounds, controlBounds ); Point controlSize = control.getSize(); assertEquals( expectedSize, controlSize ); assertNotSame( expectedSize, controlSize ); expectedSize.x = 15; controlSize = control.getSize(); assertEquals( new Point( 10, 20 ), controlSize ); try { control.setSize( null ); fail( "Point parameter must not be null." ); } catch( IllegalArgumentException iae ) { // expected } control.setSize( -2, -2 ); assertEquals( new Point( 0, 0 ), control.getSize() ); } @Test public void testGetShell() { Button button1 = new Button( shell, SWT.PUSH ); Composite shell2 = new Shell( display, SWT.NONE ); Button button2 = new Button( shell2, SWT.PUSH ); assertSame( shell, shell.getShell() ); assertSame( shell, button1.getShell() ); assertSame( shell2, shell2.getShell() ); assertSame( shell2, button2.getShell() ); assertNotSame( shell2, shell.getShell() ); assertNotSame( shell2, button1.getShell() ); } @Test public void testToolTipText() { Control control1 = new Button( shell, SWT.PUSH ); control1.setToolTipText( null ); assertEquals( null, control1.getToolTipText() ); control1.setToolTipText( "" ); assertEquals( "", control1.getToolTipText() ); control1.setToolTipText( "xyz" ); assertEquals( "xyz", control1.getToolTipText() ); Control control2 = new Button( shell, SWT.PUSH ); assertEquals( null, control2.getToolTipText() ); } @Test public void testMenu() { Control control = new Button( shell, SWT.PUSH ); Menu menu = new Menu( control ); control.setMenu( menu ); assertSame( menu, control.getMenu() ); menu.dispose(); try { control.setMenu( menu ); fail( "Must not allow to set dipsosed of menu" ); } catch( IllegalArgumentException e ) { // expected } Shell anotherShell = new Shell( display , SWT.NONE ); menu = new Menu( anotherShell, SWT.POP_UP ); try { control.setMenu( menu ); fail( "Must not allow to set menu from different shell" ); } catch( IllegalArgumentException e ) { // expected } menu = new Menu( shell, SWT.BAR ); try { control.setMenu( menu ); fail( "Menu to be set must have style SWT.POP_UP" ); } catch( RuntimeException e ) { // expected } menu = new Menu( shell, SWT.POP_UP ); control.setMenu( menu ); menu.dispose(); assertEquals( null, control.getMenu() ); } @Test public void testInitialTabIndex() { Control control = new Button( shell, SWT.PUSH ); IControlAdapter adapter = ControlUtil.getControlAdapter( control ); assertEquals( -1, adapter.getTabIndex() ); } @Test public void testSetTabIndex_onControl() { Control control = new Button( shell, SWT.PUSH ); IControlAdapter adapter = ControlUtil.getControlAdapter( control ); adapter.setTabIndex( 5 ); assertEquals( 5, adapter.getTabIndex() ); } @Test public void testSetTabIndex_onScrolledComposite() { Control control = new ScrolledComposite( shell, SWT.NONE ); IControlAdapter adapter = ControlUtil.getControlAdapter( control ); adapter.setTabIndex( 5 ); assertEquals( -1, adapter.getTabIndex() ); } @Test public void testSetTabIndex_onComposite() { Control control = new Composite( shell, SWT.NONE ); IControlAdapter adapter = ControlUtil.getControlAdapter( control ); adapter.setTabIndex( 5 ); assertEquals( -1, adapter.getTabIndex() ); } @Test public void testSetTabIndex_onSashForm() { Control control = new SashForm( shell, SWT.NONE ); IControlAdapter adapter = ControlUtil.getControlAdapter( control ); adapter.setTabIndex( 5 ); assertEquals( -1, adapter.getTabIndex() ); } @Test public void testDispose() { Control control = new Button( shell, SWT.PUSH ); control.dispose(); assertTrue( control.isDisposed() ); } @Test public void testDispose_triggersDisposeEvent() { Control control = new Button( shell, SWT.PUSH ); Listener listener = mock( Listener.class ); control.addListener( SWT.Dispose, listener ); control.dispose(); verify( listener ).handleEvent( any( Event.class ) ); } @Test public void testDisposeTwice_doesNotTriggerAnotherDisposeEvent() { Control control = new Button( shell, SWT.PUSH ); Listener listener = mock( Listener.class ); control.addListener( SWT.Dispose, listener ); control.dispose(); control.dispose(); verify( listener, times( 1 ) ).handleEvent( any( Event.class ) ); } @Test public void testDispose_removesFromParent() { Control control = new Button( shell, SWT.PUSH ); control.dispose(); assertFalse( asList( shell.getChildren() ).contains( control ) ); } @Test public void testDisposeWithMenu() { Control control = new Button( shell, SWT.PUSH ); Menu menu = new Menu( control ); control.setMenu( menu ); control.dispose(); assertTrue( menu.isDisposed() ); Control controlA = new Button( shell, SWT.PUSH ); Control controlB = new Button( shell, SWT.PUSH ); menu = new Menu( shell, SWT.POP_UP ); controlA.setMenu( menu ); controlB.setMenu( menu ); controlA.dispose(); assertTrue( menu.isDisposed() ); } @Test public void testFont() { Composite composite = new Composite( shell, SWT.NONE ); Control control = new Button( composite, SWT.PUSH ); // Initially the system font is set assertSame( display.getSystemFont(), control.getFont() ); // Setting a parents' font must not affect the childrens font Font compositeFont = new Font( display, "Composite Font", 12, SWT.NORMAL ); composite.setFont( compositeFont ); assertNotSame( control.getFont(), compositeFont ); // (re)setting a font to null assigns the system font to the control Label label = new Label( composite, SWT.NONE ); Font labelFont = new Font( display, "label font", 14, SWT.BOLD ); label.setFont( labelFont ); assertSame( labelFont, label.getFont() ); label.setFont( null ); assertSame( display.getSystemFont(), label.getFont() ); } /* * In SWT, it is not allowed to dispose of a resource that is in use. (see bug 342943) * Though, SWT does not immediately 'react' when disposing of a resource that is in use. * This test mimics the behaviour on Windows. */ @Test public void testGetFontAfterDisposingFont() { Control control = new Label( shell, SWT.NONE ); Font font = new Font( display, "font-name", 10, SWT.NONE ); control.setFont( font ); font.dispose(); Font returnedFont = control.getFont(); assertSame( font, returnedFont ); } @Test public void testForeground() { Composite comp = new Composite( shell, SWT.NONE ); Control control = new Label( comp, SWT.PUSH ); // Initially the system widget foreground color is set assertSame( display.getSystemColor( SWT.COLOR_WIDGET_FOREGROUND ), control.getForeground() ); // Setting a parents' color must not affect the children's color comp.setForeground( display.getSystemColor( SWT.COLOR_RED ) ); assertNotSame( display.getSystemColor( SWT.COLOR_RED ), control.getForeground() ); // setting the foreground changes the state persistently control.setForeground( display.getSystemColor( SWT.COLOR_BLUE ) ); assertSame( display.getSystemColor( SWT.COLOR_BLUE ), control.getForeground() ); // (re)setting the foreground to null assigns the system color again control.setForeground( null ); assertSame( display.getSystemColor( SWT.COLOR_WIDGET_FOREGROUND ), control.getForeground() ); } @Test public void testBackground() { Composite comp = new Composite( shell, SWT.NONE ); Control control = new Label( comp, SWT.PUSH ); // Initially the system widget background color is set assertSame( display.getSystemColor( SWT.COLOR_WIDGET_BACKGROUND ), control.getBackground() ); // Setting a parents' color must not affect the children's color comp.setBackground( display.getSystemColor( SWT.COLOR_RED ) ); assertNotSame( display.getSystemColor( SWT.COLOR_RED ), control.getBackground() ); // setting the background changes the state persistently control.setBackground( display.getSystemColor( SWT.COLOR_BLUE ) ); assertSame( display.getSystemColor( SWT.COLOR_BLUE ), control.getBackground() ); // (re)setting the background to null assigns the system color again control.setBackground( null ); assertSame( display.getSystemColor( SWT.COLOR_WIDGET_BACKGROUND ), control.getBackground() ); } @Test public void testBackgroundMode() throws IOException { Color red = display.getSystemColor( SWT.COLOR_RED ); Color blue = display.getSystemColor( SWT.COLOR_BLUE ); Color widgetBg = display.getSystemColor( SWT.COLOR_WIDGET_BACKGROUND ); Image image = createImage( display, Fixture.IMAGE1 ); Composite comp = new Composite( shell, SWT.NONE ); Control control = new Label( comp, SWT.NONE ); // no inheritance by default comp.setBackground( red ); assertEquals( widgetBg, control.getBackground() ); // inherited background comp.setBackgroundMode( SWT.INHERIT_DEFAULT ); assertEquals( red, control.getBackground() ); // newly created control also inherits background mode Control control2 = new Label( comp, SWT.NONE ); assertEquals( red, control2.getBackground() ); // no inheritance when bg image is set control.setBackgroundImage( image ); assertEquals( widgetBg, control.getBackground() ); // inherited background again control.setBackgroundImage( null ); assertEquals( red, control.getBackground() ); // no inheritance when bg color is set control.setBackground( blue ); assertEquals( blue, control.getBackground() ); } @Test public void testBackgroundModeMultiLevel() { Color red = display.getSystemColor( SWT.COLOR_RED ); Color blue = display.getSystemColor( SWT.COLOR_BLUE ); Composite comp = new Composite( shell, SWT.NONE ); Label label = new Label( comp, SWT.NONE ); // label inherits background from shell shell.setBackground( red ); shell.setBackgroundMode( SWT.INHERIT_DEFAULT ); comp.setBackgroundMode( SWT.INHERIT_DEFAULT ); assertEquals( red, label.getBackground() ); // label inherits background from comp comp.setBackground( blue ); assertEquals( blue, label.getBackground() ); } @Test public void testBackgroundTransparency() throws IOException { Composite comp = new Composite( shell, SWT.NONE ); Color blue = display.getSystemColor( SWT.COLOR_BLUE ); comp.setBackground( blue ); Image image = createImage( display, Fixture.IMAGE1 ); comp.setBackgroundImage( image ); Control control = new Label( comp, SWT.NONE ); IControlAdapter adapter = ControlUtil.getControlAdapter( control ); // initial state assertNull( adapter.getUserBackground() ); assertNull( adapter.getUserBackgroundImage() ); assertFalse( adapter.getBackgroundTransparency() ); // set background mode on parent enables transparency comp.setBackgroundMode( SWT.INHERIT_DEFAULT ); assertSame( blue, control.getBackground() ); assertSame( image, control.getBackgroundImage() ); assertNull( adapter.getUserBackground() ); assertNull( adapter.getUserBackgroundImage() ); assertTrue( adapter.getBackgroundTransparency() ); // controls created after set background mode are also transparent Control control2 = new Label( comp, SWT.NONE ); IControlAdapter adapter2 = ControlUtil.getControlAdapter( control2 ); assertSame( blue, control.getBackground() ); assertSame( image, control.getBackgroundImage() ); assertNull( adapter2.getUserBackground() ); assertNull( adapter2.getUserBackgroundImage() ); assertTrue( adapter2.getBackgroundTransparency() ); // set color on control overrides transparency Color red = display.getSystemColor( SWT.COLOR_RED ); control.setBackground( red ); assertSame( red, control.getBackground() ); assertNull( control.getBackgroundImage() ); assertEquals( red, adapter.getUserBackground() ); assertFalse( adapter.getBackgroundTransparency() ); } @Test public void testEnabled() { Composite composite = new Composite( shell, SWT.NONE ); Control control = new Button( composite, SWT.PUSH ); // Must be enabled, initially assertTrue( control.getEnabled() ); assertTrue( control.isEnabled() ); // Must react on setEnabled() control.setEnabled( false ); assertFalse( control.getEnabled() ); assertFalse( control.isEnabled() ); // Test the difference between is- and getEnabled control.setEnabled( true ); composite.setEnabled( false ); assertFalse( composite.getEnabled() ); assertFalse( composite.isEnabled() ); assertTrue( control.getEnabled() ); assertFalse( control.isEnabled() ); } @Test public void testUserForeground() { Composite composite = new Composite( shell, SWT.NONE ); Control control = new Label( composite, SWT.NONE ); Color blue = display.getSystemColor( SWT.COLOR_BLUE ); IControlAdapter adapter = ControlUtil.getControlAdapter( control ); assertNull( adapter.getUserForeground() ); Color themeColor = control.getForeground(); control.setForeground( blue ); assertEquals( blue, adapter.getUserForeground() ); assertEquals( blue, control.getForeground() ); control.setForeground( null ); assertEquals( null, adapter.getUserForeground() ); assertEquals( themeColor, control.getForeground() ); } @Test public void testVisible() { Composite composite = new Composite( shell, SWT.NONE ); Control control = new Button( composite, SWT.PUSH ); shell.open(); // Must be enabled, initially assertTrue( control.getVisible() ); assertTrue( control.isVisible() ); // Must react on setEnabled() control.setVisible( false ); assertFalse( control.getVisible() ); assertFalse( control.isVisible() ); // Test the difference between is- and getEnabled control.setVisible( true ); composite.setVisible( false ); assertFalse( composite.getVisible() ); assertFalse( composite.isVisible() ); assertTrue( control.getVisible() ); assertFalse( control.isVisible() ); } @Test public void testSetVisibleSendsShowEvent() { Control control = new Button( shell, SWT.PUSH ); control.setVisible( false ); Listener listener = mock( Listener.class ); control.addListener( SWT.Show, listener ); control.setVisible( true ); verify( listener ).handleEvent( any( Event.class ) ); } @Test public void testSetVisibleOnVisibleControl() { Control control = new Button( shell, SWT.PUSH ); Listener listener = mock( Listener.class ); control.addListener( SWT.Show, listener ); control.setVisible( true ); verify( listener, never() ).handleEvent( any( Event.class ) ); } @Test public void testSetVisibleSendsHideEvent() { Control control = new Button( shell, SWT.PUSH ); Listener listener = mock( Listener.class ); control.addListener( SWT.Hide, listener ); control.setVisible( false ); verify( listener ).handleEvent( any( Event.class ) ); } @Test public void testZOrder() { Control control1 = new Button( shell, SWT.PUSH ); Control control2 = new Button( shell, SWT.PUSH ); Control control3 = new Button( shell, SWT.PUSH ); assertEquals( 0, indexOf( shell, control1 ) ); assertEquals( 1, indexOf( shell, control2 ) ); assertEquals( 2, indexOf( shell, control3 ) ); control3.moveAbove( control2 ); assertEquals( 0, indexOf( shell, control1 ) ); assertEquals( 1, indexOf( shell, control3 ) ); assertEquals( 2, indexOf( shell, control2 ) ); control1.moveBelow( control3 ); assertEquals( 0, indexOf( shell, control3 ) ); assertEquals( 1, indexOf( shell, control1 ) ); assertEquals( 2, indexOf( shell, control2 ) ); control2.moveAbove( null ); assertEquals( 0, indexOf( shell, control2 ) ); assertEquals( 1, indexOf( shell, control3 ) ); assertEquals( 2, indexOf( shell, control1 ) ); control2.moveBelow( null ); assertEquals( 0, indexOf( shell, control3 ) ); assertEquals( 1, indexOf( shell, control1 ) ); assertEquals( 2, indexOf( shell, control2 ) ); // control is already at the top / bottom control3.moveAbove( null ); assertEquals( 0, indexOf( shell, control3 ) ); control2.moveBelow( null ); assertEquals( 0, indexOf( shell, control3 ) ); // try to move control above / below itself control1.moveAbove( control1 ); assertEquals( 1, indexOf( shell, control1 ) ); control1.moveBelow( control1 ); assertEquals( 1, indexOf( shell, control1 ) ); shell.dispose(); } private int indexOf( Composite parent, Control control ) { return asList(parent.getChildren()).indexOf( control ); } @Test public void testFocus() { Control control1 = new Button( shell, SWT.PUSH ); // When shell is closed, creating a control does not affect its focus assertSame( null, display.getFocusControl() ); // When no focus was set, the first control is forceFocus'ed shell.open(); assertSame( control1, display.getFocusControl() ); assertTrue( control1.isFocusControl() ); } @Test public void testFocusOnClosedShell() { Control control1 = new Button( shell, SWT.PUSH ); final Control control2 = new Button( shell, SWT.PUSH ); final StringBuilder log = new StringBuilder(); FocusListener focusListener = new FocusListener() { @Override public void focusGained( FocusEvent event ) { if( event.getSource() == shell ) { log.append( "shell.focusGained|" ); } else if( event.getSource() == control2 ) { log.append( "control2.focusGained|" ); } else { fail( "Unexpected event: focusGained" ); } } @Override public void focusLost( FocusEvent event ) { if( event.getSource() == shell ) { log.append( "shell.focusLost|" ); } else if( event.getSource() == control2 ) { log.append( "control2.focusLost|" ); } else { fail( "Unexpected event: focusLost" ); } } }; shell.addFocusListener( focusListener ); control2.addFocusListener( focusListener ); // focus control on closed shell, returns false boolean result = control2.forceFocus(); assertFalse( result ); assertNotSame( control2, display.getFocusControl() ); // ...but will set the focus once the shell is opened shell.open(); assertSame( control2, display.getFocusControl() ); assertFalse( control1.isFocusControl() ); assertTrue( control2.isFocusControl() ); assertEquals( "shell.focusGained|shell.focusLost|control2.focusGained|", log.toString() ); } @Test public void testNoFocusControls() { Control control = new Button( shell, SWT.NONE ); control.forceFocus(); Control noFocusControl = new Label( shell, SWT.NONE ); shell.open(); // calling setFocus on controls with NO_FOCUS bit has no effect boolean result = noFocusControl.setFocus(); assertFalse( result ); assertFalse( noFocusControl.isFocusControl() ); // ... but calling forceFocus marks even the NO_FOCUS control as focused result = noFocusControl.forceFocus(); assertTrue( result ); assertTrue( noFocusControl.isFocusControl() ); } @Test public void testDisableOfFocused() { Control control = new Button( shell, SWT.PUSH ); shell.open(); control.setFocus(); control.setEnabled( false ); assertSame( shell, display.getFocusControl() ); } @Test public void testDisposeOfFocused() { Control control1 = new Button( shell, SWT.PUSH ); Composite composite = new Composite( shell, SWT.NONE ); Control control2 = new Button( composite, SWT.PUSH ); Control control3 = new Button( composite, SWT.PUSH ); shell.open(); // Disposing of a control focuses its parent if the parent itself was not // disposed of control1.dispose(); assertSame( shell, display.getFocusControl() ); control3.setFocus(); control3.dispose(); assertSame( composite, display.getFocusControl() ); control2.setFocus(); composite.dispose(); assertSame( shell, display.getFocusControl() ); shell.dispose(); assertSame( null, display.getFocusControl() ); } // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=373770 @Test public void testDisposeOfFocusedInFocusLostEvent() { final Control control1 = new Button( shell, SWT.PUSH ); control1.addFocusListener( new FocusAdapter() { @Override public void focusLost( FocusEvent event ) { control1.dispose(); } } ); Control control2 = new Button( shell, SWT.PUSH ); shell.open(); control1.setFocus(); control2.setFocus(); // ensures no exception is thrown assertTrue( control1.isDisposed() ); } @Test public void testDisposeOfActiveShell_withFocusedControl_restoresFocusControl() { Control control = new Button( shell, SWT.PUSH ); shell.open(); control.setFocus(); Shell shell1 = new Shell( shell, SWT.NONE ); Control control1 = new Button( shell1, SWT.PUSH ); shell1.open(); control1.setFocus(); shell1.dispose(); assertSame( control, display.getFocusControl() ); } @Test public void testDisposeOfActiveShell_withFocusedShell_restoresFocusControl() { Control control = new Button( shell, SWT.PUSH ); shell.open(); control.setFocus(); Shell shell1 = new Shell( shell, SWT.NONE ); shell1.open(); shell1.setFocus(); shell1.dispose(); assertSame( control, display.getFocusControl() ); } // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=265634 @Test public void testNoFocusOutOnDispose() { final StringBuilder log = new StringBuilder(); Control control = new Button( shell, SWT.PUSH ); control.addFocusListener( new FocusAdapter() { @Override public void focusLost( FocusEvent event ) { log.append( "focusout" ); } } ); shell.open(); control.dispose(); assertEquals( "", log.toString() ); } @Test public void testHideFocusedControl() { shell.setLayout( new FillLayout() ); Composite composite = new Composite( shell, SWT.NONE ); Control control = new Button( composite, SWT.PUSH ); shell.setSize( 100, 100 ); shell.open(); // Hide control -> its parent (composite) must take focus control.setFocus(); assertTrue( control.isFocusControl() ); control.setVisible( false ); assertFalse( control.isFocusControl() ); assertTrue( composite.isFocusControl() ); assertSame( composite, display.getFocusControl() ); // Indirectly hide control -> shell must take focus control.setVisible( true ); control.setFocus(); composite.setVisible( false ); assertFalse( control.isVisible() ); assertFalse( control.isFocusControl() ); assertFalse( composite.isFocusControl() ); assertTrue( shell.isFocusControl() ); assertSame( shell, display.getFocusControl() ); // Indirectly hide control and leave no visible parent // no control must have focus control.setVisible( true ); control.setFocus(); shell.setVisible( false ); assertFalse( shell.isVisible() ); assertFalse( shell.isFocusControl() ); assertFalse( composite.isFocusControl() ); assertNull( display.getFocusControl() ); } @Test public void testFocusEventsForForceFocus() { final StringBuilder log = new StringBuilder(); final Control control1 = new Button( shell, SWT.PUSH ); control1.addFocusListener( new FocusAdapter() { @Override public void focusGained( FocusEvent event ) { assertSame( control1, event.getSource() ); log.append( "focusGained" ); } @Override public void focusLost( FocusEvent event ) { log.append( "focusLost" ); } } ); shell.open(); // Changing focus programmatically must throw event control1.forceFocus(); assertEquals( "focusGained", log.toString() ); // Focusing the same control again must not cause an event. log.setLength( 0 ); control1.forceFocus(); assertEquals( "", log.toString() ); } // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=323570 @Test public void testFocusOnBlockedShell() { Control button1 = new Button( shell, SWT.PUSH ); Shell shell2 = new Shell( shell, SWT.APPLICATION_MODAL ); shell.open(); assertEquals( button1, display.getFocusControl() ); assertEquals( shell, display.getActiveShell() ); shell2.open(); button1.setFocus(); assertEquals( shell2, display.getFocusControl() ); assertEquals( shell2, display.getActiveShell() ); } @Test public void testToControl() { Control control = new Button( shell, SWT.PUSH ); Point controlCoords = control.toControl( 0, 0 ); assertEquals( new Point( 0, 0 ), control.toDisplay( controlCoords.x, controlCoords.y ) ); controlCoords = control.toControl( new Point( 0, 0 ) ); assertEquals( new Point( 0, 0 ), control.toDisplay( controlCoords ) ); try { control.toControl( null ); fail( "No exception thrown for null-argument" ); } catch( IllegalArgumentException e ) { } } @Test public void testToDisplay() { final Control control = new Button( shell, SWT.PUSH ); Point displayCoords = control.toDisplay( 0, 0 ); assertEquals( new Point( 0, 0 ), control.toControl( displayCoords.x, displayCoords.y ) ); displayCoords = control.toDisplay( new Point( 0, 0 ) ); assertEquals( new Point( 0, 0 ), control.toControl( displayCoords ) ); try { control.toDisplay( null ); fail( "No exception thrown for null-argument" ); } catch( IllegalArgumentException e ) { } } @Test public void testGetOrientation() { Composite childDefault = new Composite( shell, SWT.NONE ); assertTrue( "default orientation: SWT.LEFT_TO_RIGHT", ( shell.getStyle() & SWT.LEFT_TO_RIGHT ) != 0 ); assertEquals( SWT.LEFT_TO_RIGHT, shell.getOrientation() ); assertTrue( "default orientation inherited: SWT.LEFT_TO_RIGHT", ( childDefault.getStyle() & SWT.LEFT_TO_RIGHT ) != 0 ); assertEquals( SWT.LEFT_TO_RIGHT, childDefault.getOrientation() ); } @Test public void testSetOrientation() { Control control = new Button( shell, SWT.NONE ); control.setOrientation( SWT.RIGHT_TO_LEFT ); assertEquals( SWT.RIGHT_TO_LEFT, control.getOrientation() ); } @Test public void testMirrored_inital() { Control control = new Button( shell, SWT.NONE ); assertTrue( ( control.getStyle() & SWT.MIRRORED ) == 0 ); } @Test public void testMirrored_RTL() { Control control = new Button( shell, SWT.RIGHT_TO_LEFT ); assertTrue( ( control.getStyle() & SWT.MIRRORED ) != 0 ); } @Test public void testMirrored_afterOrientationChangeToRTL() { Control control = new Button( shell, SWT.NONE ); control.setOrientation( SWT.RIGHT_TO_LEFT ); assertTrue( ( control.getStyle() & SWT.MIRRORED ) != 0 ); } @Test public void testMirrored_afterOrientationChangeToLTR() { Control control = new Button( shell, SWT.RIGHT_TO_LEFT ); control.setOrientation( SWT.LEFT_TO_RIGHT ); assertTrue( ( control.getStyle() & SWT.MIRRORED ) == 0 ); } @Test public void testShowEvent() { final java.util.List<Event> log = new ArrayList<Event>(); Listener showListener = new Listener() { @Override public void handleEvent( Event event ) { log.add( event ); } }; shell.addListener( SWT.Show, showListener ); Control control = new Button( shell, SWT.NONE ); control.addListener( SWT.Show, showListener ); // Separate test for shell (since it overides setVisible); Show event is // only sent for the shell itself, not for its containing controls shell.setVisible( true ); assertEquals( 1, log.size() ); Event event = log.get( 0 ); assertSame( shell, event.widget ); // Calling setVisible(true) on an already visible control does not trigger // event log.clear(); control.setVisible( true ); assertEquals( 0, log.size() ); // Making an invisible control visible, sends the Show event control.setVisible( false ); log.clear(); control.setVisible( true ); assertEquals( 1, log.size() ); assertSame( control, log.get( 0 ).widget ); } @Test public void testShowEventDetails() { Listener ensureInvisible = new Listener() { @Override public void handleEvent( Event event ) { assertFalse( ( ( Control )event.widget ).getVisible() ); } }; shell.addListener( SWT.Show, ensureInvisible ); shell.setVisible( true ); } @Test public void testHideEvent() { final java.util.List<Event> log = new ArrayList<Event>(); Listener showListener = new Listener() { @Override public void handleEvent( Event event ) { log.add( event ); } }; shell.addListener( SWT.Hide, showListener ); Control control = new Button( shell, SWT.NONE ); control.addListener( SWT.Hide, showListener ); shell.open(); log.clear(); control.setVisible( false ); assertEquals( 1, log.size() ); assertSame( control, log.get( 0 ).widget ); log.clear(); shell.setVisible( false ); assertEquals( 1, log.size() ); assertSame( shell, log.get( 0 ).widget ); log.clear(); shell.setVisible( true ); control.setVisible( true ); shell.setVisible( false ); assertEquals( 1, log.size() ); assertSame( shell, log.get( 0 ).widget ); } @Test public void testCursor() { final Control control = new Button( shell, SWT.PUSH ); assertNull( control.getCursor() ); Cursor handCursor = display.getSystemCursor( SWT.CURSOR_HAND ); control.setCursor( handCursor ); assertEquals( handCursor, control.getCursor() ); Cursor crossCursor = display.getSystemCursor( SWT.CURSOR_CROSS ); control.setCursor( crossCursor ); assertEquals( crossCursor, control.getCursor() ); control.setCursor( null ); assertNull( control.getCursor() ); } @Test public void testGetMonitor() { Monitor monitor = shell.getMonitor(); assertNotNull( monitor ); assertEquals( display.getPrimaryMonitor(), monitor ); } @Test public void testUntypedHelpListener() { final Event[] untypedHelpEvent = { null }; shell.addListener( SWT.Help, new Listener() { @Override public void handleEvent( Event event ) { untypedHelpEvent[ 0 ] = event; } } ); shell.notifyListeners( SWT.Help, new Event() ); assertNotNull( untypedHelpEvent[ 0 ] ); } @Test public void testSetRedraw() { shell.setRedraw( true ); assertTrue( display.needsRedraw( shell ) ); shell.setRedraw( false ); assertFalse( display.needsRedraw( shell ) ); } @Test public void testRedraw() { shell.redraw(); assertTrue( display.needsRedraw( shell ) ); } @Test public void testRedrawWithBounds() { shell.redraw( 0, 0, -1, 0, true ); assertFalse( display.needsRedraw( shell ) ); } @Test public void testRedrawTriggersLCAInOrder() { final List<Widget> log = new ArrayList<Widget>(); Composite control0 = new RedrawLogginShell( display, log ); Composite control1 = new RedrawLogginShell( display, log ); control0.redraw(); control1.redraw(); display.readAndDispatch(); display.readAndDispatch(); assertEquals( 2, log.size() ); assertEquals( control0, log.get( 0 ) ); assertEquals( control1, log.get( 1 ) ); assertFalse( display.needsRedraw( control0 ) ); assertFalse( display.needsRedraw( control1 ) ); } @Test public void testRedrawDisposed() { shell.redraw(); shell.dispose(); assertFalse( display.needsRedraw( shell ) ); } @Test public void testSetBackground() { Color color = display.getSystemColor( SWT.COLOR_RED ); shell.setBackground( color ); assertEquals( color, shell.getBackground() ); shell.setBackground( null ); ControlThemeAdapter themeAdapter = getThemeAdapter( shell ); assertEquals( themeAdapter.getBackground( shell ), shell.getBackground() ); Color color2 = new Color( display, 0, 0, 0 ); color2.dispose(); try { shell.setBackground( color2 ); fail( "Disposed Image must not be set." ); } catch( IllegalArgumentException e ) { // Expected Exception } } @Test public void testSetBackgroundImage() { ClassLoader loader = Fixture.class.getClassLoader(); InputStream stream = loader.getResourceAsStream( Fixture.IMAGE1 ); Image image = new Image( display, stream ); image.dispose(); try { shell.setBackgroundImage( image ); fail( "Disposed Image must not be set." ); } catch( IllegalArgumentException e ) { // Expected Exception } finally { try { stream.close(); } catch( IOException e ) { fail( "Unable to close input stream." ); } } } @Test public void testSetCursor() { Cursor cursor = new Cursor( display, SWT.NONE ); shell.setCursor( cursor ); assertEquals( cursor, shell.getCursor() ); shell.setCursor( null ); assertEquals( null, shell.getCursor() ); cursor.dispose(); try { shell.setCursor( cursor ); fail( "Disposed Image must not be set." ); } catch( IllegalArgumentException e ) { // Expected Exception } } @Test public void testSetFont() { Font controlFont = new Font( display, "BeautifullyCraftedTreeFont", 15, SWT.BOLD ); shell.setFont( controlFont ); assertSame( controlFont, shell.getFont() ); Font itemFont = new Font( display, "ItemFont", 40, SWT.NORMAL ); shell.setFont( itemFont ); assertSame( itemFont, shell.getFont() ); shell.setFont( null ); ControlThemeAdapter themeAdapter = getThemeAdapter( shell ); assertSame( themeAdapter.getFont( shell ), shell.getFont() ); // Test with images, that should appear on unselected tabs Font font = new Font( display, "Testfont", 10, SWT.BOLD ); font.dispose(); try { shell.setFont( font ); fail( "Disposed font must not be set." ); } catch( IllegalArgumentException e ) { // Expected Exception } } @Test public void testSetForeground() { Color color = display.getSystemColor( SWT.COLOR_RED ); shell.setForeground( color ); assertEquals( color, shell.getForeground() ); shell.setForeground( null ); ControlThemeAdapter themeAdapter = getThemeAdapter( shell ); assertEquals( themeAdapter.getForeground( shell ), shell.getForeground() ); Color color2 = new Color( display, 255, 0, 0 ); color2.dispose(); try { shell.setForeground( color2 ); fail( "Disposed color must not be set." ); } catch( IllegalArgumentException e ) { // Expected Exception } } @Test public void testNotClearPackedOnSetLocation() { shell.pack(); shell.setLocation( 1, 2 ); IControlAdapter controlAdapter = shell.getAdapter( IControlAdapter.class ); assertTrue( controlAdapter.isPacked() ); } @Test public void testAddControlListenerWithNullArgument() { try { shell.addControlListener( null ); } catch( IllegalArgumentException expected ) { } } @Test public void testAddControlListener() { shell.addControlListener( mock( ControlListener.class ) ); assertTrue( shell.isListening( SWT.Move ) ); assertTrue( shell.isListening( SWT.Resize ) ); } @Test public void testRemoveControlListenerWithNullArgument() { try { shell.removeControlListener( null ); } catch( IllegalArgumentException expected ) { } } @Test public void testRemoveControlListener() { ControlListener listener = mock( ControlListener.class ); shell.addControlListener( listener ); shell.removeControlListener( listener ); assertFalse( shell.isListening( SWT.Move ) ); assertFalse( shell.isListening( SWT.Resize ) ); } @Test public void testAddFocusListener() { shell.addFocusListener( mock( FocusListener.class ) ); assertTrue( shell.isListening( SWT.FocusIn ) ); assertTrue( shell.isListening( SWT.FocusOut ) ); } @Test public void testAddFocusListenerWithNullArgument() { try { shell.addFocusListener( null ); } catch( IllegalArgumentException expected ) { } } @Test public void testRemoveFocusListener() { FocusListener listener = mock( FocusListener.class ); shell.addFocusListener( listener ); shell.removeFocusListener( listener ); assertFalse( shell.isListening( SWT.FocusIn ) ); assertFalse( shell.isListening( SWT.FocusOut ) ); } @Test public void testRemoveFocusListenerWithNullArgument() { try { shell.removeFocusListener( null ); } catch( IllegalArgumentException expected ) { } } @Test public void testAddHelpListener() { shell.addHelpListener( mock( HelpListener.class ) ); assertTrue( shell.isListening( SWT.Help ) ); } @Test public void testAddHelpListenerWithNullArgument() { try { shell.addHelpListener( null ); } catch( IllegalArgumentException expected ) { } } @Test public void testRemoveHelpListener() { HelpListener listener = mock( HelpListener.class ); shell.addHelpListener( listener ); shell.removeHelpListener( listener ); assertFalse( shell.isListening( SWT.Help ) ); } @Test public void testRemoveHelpListenerWithNullArgument() { try { shell.removeHelpListener( null ); } catch( IllegalArgumentException expected ) { } } private static ControlThemeAdapter getThemeAdapter( Control control ) { return ( ControlThemeAdapter )control.getAdapter( ThemeAdapter.class ); } @Test public void testAddKeyListener() { shell.addKeyListener( mock( KeyListener.class ) ); assertTrue( shell.isListening( SWT.KeyUp ) ); assertTrue( shell.isListening( SWT.KeyDown ) ); } @Test public void testAddKeyListenerWithNullArgument() { try { shell.addKeyListener( null ); } catch( IllegalArgumentException expected ) { } } @Test public void testRemoveKeyListener() { KeyListener listener = mock( KeyListener.class ); shell.addKeyListener( listener ); shell.removeKeyListener( listener ); assertFalse( shell.isListening( SWT.KeyUp ) ); assertFalse( shell.isListening( SWT.KeyDown ) ); } @Test public void testRemoveKeyListenerWithNullArgument() { try { shell.removeKeyListener( null ); } catch( IllegalArgumentException expected ) { } } @Test public void testAddDragDetectDetectListener() { shell.addDragDetectListener( mock( DragDetectListener.class ) ); assertTrue( shell.isListening( SWT.DragDetect ) ); } @Test public void testAddDragDetectListenerWithNullArgument() { try { shell.addDragDetectListener( null ); } catch( IllegalArgumentException expected ) { } } @Test public void testRemoveDragDetectListener() { DragDetectListener listener = mock( DragDetectListener.class ); shell.addDragDetectListener( listener ); shell.removeDragDetectListener( listener ); assertFalse( shell.isListening( SWT.MenuDetect ) ); } @Test public void testRemoveDragDetectListenerWithNullArgument() { try { shell.removeDragDetectListener( null ); } catch( IllegalArgumentException expected ) { } } @Test public void testAddMenuDetectListener() { shell.addMenuDetectListener( mock( MenuDetectListener.class ) ); assertTrue( shell.isListening( SWT.MenuDetect ) ); } @Test public void testAddMenuDetectListenerWithNullArgument() { try { shell.addMenuDetectListener( null ); } catch( IllegalArgumentException expected ) { } } @Test public void testRemoveMenuDetectListener() { MenuDetectListener listener = mock( MenuDetectListener.class ); shell.addMenuDetectListener( listener ); shell.removeMenuDetectListener( listener ); assertFalse( shell.isListening( SWT.MenuDetect ) ); } @Test public void testRemoveMenuDetectListenerWithNullArgument() { try { shell.removeMenuDetectListener( null ); } catch( IllegalArgumentException expected ) { } } @Test public void testAddMouseListener() { shell.addMouseListener( mock( MouseListener.class ) ); assertTrue( shell.isListening( SWT.MouseUp ) ); assertTrue( shell.isListening( SWT.MouseDown ) ); assertTrue( shell.isListening( SWT.MouseDoubleClick ) ); } @Test public void testAddMouseListenerWithNullArgument() { try { shell.addMouseListener( null ); } catch( IllegalArgumentException expected ) { } } @Test public void testRemoveMouseListener() { MouseListener listener = mock( MouseListener.class ); shell.addMouseListener( listener ); shell.removeMouseListener( listener ); assertFalse( shell.isListening( SWT.MouseUp ) ); assertFalse( shell.isListening( SWT.MouseDown ) ); assertFalse( shell.isListening( SWT.MouseDoubleClick ) ); } @Test public void testRemoveMouseListenerWithNullArgument() { try { shell.removeMouseListener( null ); } catch( IllegalArgumentException expected ) { } } @Test public void testAddTraverseListener() { shell.addTraverseListener( mock( TraverseListener.class ) ); assertTrue( shell.isListening( SWT.Traverse ) ); } @Test public void testAddTraverseListenerWithNullArgument() { try { shell.addTraverseListener( null ); } catch( IllegalArgumentException expected ) { } } @Test public void testRemoveTraverseListener() { TraverseListener listener = mock( TraverseListener.class ); shell.addTraverseListener( listener ); shell.removeTraverseListener( listener ); assertFalse( shell.isListening( SWT.Traverse ) ); } @Test public void testRemoveTraverseListenerWithNullArgument() { try { shell.removeTraverseListener( null ); } catch( IllegalArgumentException expected ) { } } @Test public void testMarkupToolTipTextWithoutMarkupEnabled() { shell.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.FALSE ); try { shell.setToolTipText( "invalid xhtml: <<&>>" ); } catch( IllegalArgumentException notExpected ) { fail(); } } @Test( expected = IllegalArgumentException.class ) public void testMarkupToolTipTextWithMarkupEnabled() { shell.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE ); shell.setToolTipText( "invalid xhtml: <<&>>" ); } @Test public void testMarkupTextWithMarkupEnabled_ValidationDisabled() { shell.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE ); shell.setData( MarkupValidator.MARKUP_VALIDATION_DISABLED, Boolean.TRUE ); try { shell.setToolTipText( "invalid xhtml: <<&>>" ); } catch( IllegalArgumentException notExpected ) { fail(); } } @Test public void testDisableMarkupIsIgnored() { shell.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE ); shell.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.FALSE ); assertEquals( Boolean.TRUE, shell.getData( RWT.TOOLTIP_MARKUP_ENABLED ) ); } @Test public void testPadding() throws IOException { String css = "Composite { padding: 1px 2px 3px 4px }"; ThemeTestUtil.registerTheme( "custom", css, null ); ThemeTestUtil.setCurrentThemeId( "custom" ); Composite composite = new Composite( shell, SWT.NONE ); BoxDimensions expected = new BoxDimensions( 1, 2, 3, 4 ); assertEquals( expected, composite.getPadding() ); } @Test public void testPadding_afterSettingCustomVariant() throws IOException { String css = "Composite { padding: 1px 2px 3px 4px } " + "Composite.abc { padding: 5px 6px 7px 8px }"; ThemeTestUtil.registerTheme( "custom", css, null ); ThemeTestUtil.setCurrentThemeId( "custom" ); Composite composite = new Composite( shell, SWT.NONE ); // buffer the padding composite.getPadding(); composite.setData( RWT.CUSTOM_VARIANT, "abc" ); BoxDimensions expected = new BoxDimensions( 5, 6, 7, 8 ); assertEquals( expected, composite.getPadding() ); } @Test public void testGetBorderWidth_returnsTheMaximumBorderEdgeWidth() throws IOException { String css = "Composite { border: 1px solid black; border-top: 3px solid black; }"; ThemeTestUtil.registerTheme( "custom", css, null ); ThemeTestUtil.setCurrentThemeId( "custom" ); Composite composite = new Composite( shell, SWT.BORDER ); assertEquals( 3, composite.getBorderWidth() ); } @Test public void testGetBorder() throws IOException { String css = "Composite { border: 1px solid black; border-top: 3px solid black; }"; ThemeTestUtil.registerTheme( "custom", css, null ); ThemeTestUtil.setCurrentThemeId( "custom" ); Composite composite = new Composite( shell, SWT.BORDER ); BoxDimensions expected = new BoxDimensions( 3, 1, 1, 1 ); assertEquals( expected, composite.getBorder() ); } @Test( expected = IllegalArgumentException.class ) public void testSetParent_nullParent() { Control control = new Button( shell, SWT.NONE ); control.setParent( null ); } @Test( expected = IllegalArgumentException.class ) public void testSetParent_disposedParent() { Control control = new Button( shell, SWT.NONE ); Composite parent = new Composite( shell, SWT.NONE ); parent.dispose(); control.setParent( parent ); } @Test public void testSetParent() { Control control = new Button( shell, SWT.NONE ); Composite parent = new Composite( shell, SWT.NONE ); boolean success = control.setParent( parent ); assertTrue( success ); assertSame( parent, control.getParent() ); assertFalse( Arrays.asList( shell.getChildren() ).contains( control ) ); assertTrue( Arrays.asList( parent.getChildren() ).contains( control ) ); } @Test public void testSetParent_withDisabledReparenting() { Control control = new Button( shell, SWT.NONE ) { @Override public boolean isReparentable() { return false; } }; Composite parent = new Composite( shell, SWT.NONE ); boolean success = control.setParent( parent ); assertFalse( success ); assertSame( shell, control.getParent() ); assertTrue( Arrays.asList( shell.getChildren() ).contains( control ) ); assertFalse( Arrays.asList( parent.getChildren() ).contains( control ) ); } @Test public void testSetParent_fixesActiveControl() { Control control = new Button( shell, SWT.NONE ); shell.open(); control.setFocus(); Shell parent = new Shell( display ); control.setParent( parent ); assertNull( shell.getAdapter( IShellAdapter.class ).getActiveControl() ); } @Test public void testSetParent_fixesDefaultButton() { Button button = new Button( shell, SWT.NONE ); shell.setDefaultButton( button ); shell.open(); Shell parent = new Shell( display ); button.setParent( parent ); assertNull( shell.getDefaultButton() ); } @Test public void testSetParent_fixesSavedDefaultButton() { Button button = new Button( shell, SWT.NONE ); shell.setDefaultButton( button, true ); shell.open(); Shell parent = new Shell( display ); button.setParent( parent ); shell.setDefaultButton( null, true ); assertNull( shell.getDefaultButton() ); } @Test public void testSetParent_fixesSavedFocus() { Control control = new Button( shell, SWT.NONE ); shell.open(); control.setFocus(); Shell parent = new Shell( display ); control.setParent( parent ); assertNull( shell.getSavedFocus() ); } @Test public void testSetParent_addsControlToReparentedList() { Control control = new Button( shell, SWT.NONE ); shell.open(); control.setFocus(); Shell parent = new Shell( display ); control.setParent( parent ); assertSame( control, ReparentedControls.getAll().get( 0 ) ); } @Test public void testIsReparentable() { Control control = new Button( shell, SWT.NONE ); assertTrue( control.isReparentable() ); } @Test public void testMoveAbove() { Control child1 = new Label(shell, SWT.NONE); Control child2 = new Label(shell, SWT.NONE); child2.moveAbove( child1 ); assertArrayEquals( new Control[] {child2, child1}, shell.getChildren() ); } @Test public void testMoveAbove_ignoresWidgetWithDifferentParent() { Control child1 = new Label(shell, SWT.NONE); Control child2 = new Label(shell, SWT.NONE); child1.moveAbove( shell ); assertArrayEquals( new Control[] {child1, child2}, shell.getChildren() ); } @Test( expected = SWTException.class ) public void testMoveAbove_failsOnDisposed() { Control child1 = new Label(shell, SWT.NONE); Control child2 = new Label(shell, SWT.NONE); child1.dispose(); child1.moveAbove( child2 ); } @Test( expected = IllegalArgumentException.class ) public void testMoveAbove_failsWithDisposed() { Control child1 = new Label(shell, SWT.NONE); Control child2 = new Label(shell, SWT.NONE); child2.dispose(); child1.moveAbove( child2 ); } @Test public void testMoveBelow() { Control child1 = new Label(shell, SWT.NONE); Control child2 = new Label(shell, SWT.NONE); child1.moveBelow( child2 ); assertArrayEquals( new Control[] {child2, child1}, shell.getChildren() ); } @Test public void testMoveBelow_ignoresWidgetWithDifferentParent() { Control child1 = new Label(shell, SWT.NONE); Control child2 = new Label(shell, SWT.NONE); child1.moveBelow( shell ); assertArrayEquals( new Control[] {child1, child2}, shell.getChildren() ); } @Test( expected = SWTException.class ) public void testMoveBelow_failsOnDisposed() { Control child1 = new Label(shell, SWT.NONE); Control child2 = new Label(shell, SWT.NONE); child1.dispose(); child1.moveBelow( child2 ); } @Test( expected = IllegalArgumentException.class ) public void testMoveBelow_failsWithDisposed() { Control child1 = new Label(shell, SWT.NONE); Control child2 = new Label(shell, SWT.NONE); child2.dispose(); child1.moveBelow( child2 ); } @Test public void testRemoteAdapter_isAControlRemoteAdapter() { Control control = new Control( shell, SWT.NONE ) {}; RemoteAdapter adapter = control.getAdapter( RemoteAdapter.class ); assertTrue( adapter instanceof ControlRemoteAdapter ); } @Test public void testRemoteAdapter_isOnlyCreatedOnce() { Control control = new Control( shell, SWT.NONE ) {}; RemoteAdapter adapter1 = control.getAdapter( RemoteAdapter.class ); RemoteAdapter adapter2 = control.getAdapter( RemoteAdapter.class ); assertSame( adapter1, adapter2 ); } @Test public void testAdapterBounds() { Control control = new Control( shell, SWT.NONE ) {}; control.setBounds( 1, 2, 3, 4 ); assertEquals( control.getBounds(), control.getAdapter( IControlAdapter.class ).getBounds() ); } @Test public void testAdapterBounds_returnsSameInstance() { Control control = new Control( shell, SWT.NONE ) {}; control.setBounds( 1, 2, 3, 4 ); assertSame( control.getAdapter( IControlAdapter.class ).getBounds(), control.getAdapter( IControlAdapter.class ).getBounds() ); } @Test( expected = IllegalArgumentException.class ) public void testSetData_forActiveKeys_rejectsNonStringArray() { Control control = new Control( shell, SWT.NONE ) {}; control.setData( RWT.ACTIVE_KEYS, "1-Foo-Bar" ); } @Test public void testSetData_forActiveKeys_acceptsNull() { Control control = new Control( shell, SWT.NONE ) {}; control.setData( RWT.ACTIVE_KEYS, new String[] { "foo" } ); control.setData( RWT.ACTIVE_KEYS, null ); assertNull( control.getData( RWT.ACTIVE_KEYS ) ); } @Test public void testSetData_forActiveKeys_preservesActiveKeys() { Control control = new Control( shell, SWT.NONE ) {}; control.setData( RWT.ACTIVE_KEYS, new String[] { "foo"} ); ControlRemoteAdapter adapter = ( ControlRemoteAdapter )control.getAdapter( RemoteAdapter.class ); assertTrue( adapter.hasPreservedActiveKeys() ); } @Test( expected = IllegalArgumentException.class ) public void testSetData_forCancelKeys_rejectsNonStringArray() { Control control = new Control( shell, SWT.NONE ) {}; control.setData( RWT.CANCEL_KEYS, "1-Foo-Bar" ); } @Test public void testSetData_forCancelKeys_acceptsNull() { Control control = new Control( shell, SWT.NONE ) {}; control.setData( RWT.CANCEL_KEYS, new String[] { "foo" } ); control.setData( RWT.CANCEL_KEYS, null ); assertNull( control.getData( RWT.CANCEL_KEYS ) ); } @Test public void testSetData_forCancelKeys_preservesCancelKeys() { Control control = new Control( shell, SWT.NONE ) {}; control.setData( RWT.CANCEL_KEYS, new String[] { "foo"} ); ControlRemoteAdapter adapter = ( ControlRemoteAdapter )control.getAdapter( RemoteAdapter.class ); assertTrue( adapter.hasPreservedCancelKeys() ); } private static class RedrawLogginShell extends Shell { private final List<Widget> log; private RedrawLogginShell( Display display, List<Widget> log ) { super( display ); this.log = log; } @Override @SuppressWarnings("unchecked") public <T> T getAdapter( Class<T> adapter ) { Object result = null; if( adapter == WidgetLCA.class ) { result = new LoggingWidgetLCA( log ); } else { result = super.getAdapter( adapter ); } return ( T )result; } } private static class LoggingWidgetLCA extends WidgetLCA { private final List<Widget> log; public LoggingWidgetLCA( List<Widget> log ) { this.log = log; } @Override public void readData( Widget widget ) { } @Override public void preserveValues( Widget widget ) { } @Override public void renderInitialization( Widget widget ) throws IOException { } @Override public void doRedrawFake( Control control ) { log.add( control ); } @Override public void renderChanges( Widget widget ) throws IOException { } @Override public void renderDispose( Widget widget ) throws IOException { } } }