/******************************************************************************* * Copyright (c) 2002, 2015 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.internal.widgets.treekit; import static org.eclipse.rap.rwt.internal.lifecycle.DisplayUtil.getLCA; import static org.eclipse.rap.rwt.internal.lifecycle.WidgetUtil.getId; import static org.eclipse.rap.rwt.internal.protocol.JsonUtil.createJsonArray; import static org.eclipse.rap.rwt.internal.protocol.RemoteObjectFactory.getRemoteObject; import static org.eclipse.rap.rwt.testfixture.internal.TestMessage.getParent; import static org.eclipse.rap.rwt.testfixture.internal.TestMessage.getStyles; 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.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import java.io.IOException; import java.util.LinkedList; import java.util.List; import org.eclipse.rap.json.JsonArray; import org.eclipse.rap.json.JsonObject; import org.eclipse.rap.json.JsonValue; import org.eclipse.rap.rwt.RWT; import org.eclipse.rap.rwt.internal.lifecycle.WidgetUtil; import org.eclipse.rap.rwt.internal.protocol.ClientMessageConst; import org.eclipse.rap.rwt.internal.protocol.Operation; import org.eclipse.rap.rwt.internal.protocol.Operation.CreateOperation; import org.eclipse.rap.rwt.internal.protocol.Operation.SetOperation; import org.eclipse.rap.rwt.internal.remote.RemoteObjectRegistry; import org.eclipse.rap.rwt.remote.OperationHandler; import org.eclipse.rap.rwt.template.Template; import org.eclipse.rap.rwt.testfixture.internal.Fixture; import org.eclipse.rap.rwt.testfixture.internal.TestMessage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.internal.widgets.CellToolTipUtil; import org.eclipse.swt.internal.widgets.ICellToolTipAdapter; import org.eclipse.swt.internal.widgets.ICellToolTipProvider; import org.eclipse.swt.internal.widgets.ITreeAdapter; import org.eclipse.swt.internal.widgets.controlkit.ControlLCATestUtil; import org.eclipse.swt.internal.widgets.treekit.TreeLCA.ItemMetrics; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Item; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeColumn; import org.eclipse.swt.widgets.TreeItem; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TreeLCA_Test { private Display display; private Shell shell; private Tree tree; private TreeLCA lca; @Before public void setUp() { Fixture.setUp(); display = new Display(); shell = new Shell( display ); tree = new Tree( shell, SWT.H_SCROLL | SWT.V_SCROLL ); lca = TreeLCA.INSTANCE; } @After public void tearDown() { Fixture.tearDown(); } @Test public void testCommonControlProperties() throws IOException { ControlLCATestUtil.testCommonControlProperties( tree ); } @Test public void testGetItemMetricsImageWidth() throws IOException { Image image1 = createImage( display, Fixture.IMAGE_100x50 ); Image image2 = createImage( display, Fixture.IMAGE_50x100 ); shell.setBounds( 0, 0, 800, 600 ); shell.setLayout( new FillLayout() ); tree.setHeaderVisible( true ); TreeColumn column = new TreeColumn( tree, SWT.NONE ); column.setText( "column1" ); column.setWidth( 200 ); TreeItem item1 = new TreeItem( tree, SWT.NONE ); item1.setText( "item1" ); TreeItem item2 = new TreeItem( tree, SWT.NONE ); item2.setText( "item2" ); TreeItem item3 = new TreeItem( tree, SWT.NONE ); item3.setText( "item3" ); ItemMetrics[] metrics = TreeLCA.getItemMetrics( tree ); assertEquals( 0, metrics[ 0 ].imageWidth ); item2.setImage( image2 ); item1.setImage( image1 ); metrics = TreeLCA.getItemMetrics( tree ); assertEquals( 50, metrics[ 0 ].imageWidth ); item2.setImage( (Image) null ); item1.setImage( (Image) null ); metrics = TreeLCA.getItemMetrics( tree ); assertEquals( 0, metrics[ 0 ].imageWidth ); } @Test public void testGetItemMetricsImageLeft() throws IOException { Image image1 = createImage( display, Fixture.IMAGE_100x50 ); Image image2 = createImage( display, Fixture.IMAGE_50x100 ); shell.setBounds( 0, 0, 800, 600 ); shell.setLayout( new FillLayout() ); tree.setHeaderVisible( true ); TreeColumn column1 = new TreeColumn( tree, SWT.NONE ); column1.setText( "column1" ); column1.setWidth( 200 ); TreeColumn column2 = new TreeColumn( tree, SWT.NONE ); column2.setText( "column2" ); column2.setWidth( 200 ); TreeItem item1 = new TreeItem( tree, SWT.NONE ); item1.setText( "item1" ); TreeItem item2 = new TreeItem( tree, SWT.NONE ); item2.setText( "item2" ); TreeItem item3 = new TreeItem( tree, SWT.NONE ); item3.setText( "item3" ); ItemMetrics[] metrics = TreeLCA.getItemMetrics( tree ); assertEquals( 0, metrics[ 0 ].imageLeft ); assertEquals( 206, metrics[ 1 ].imageLeft ); item2.setImage( image2 ); item1.setImage( 1, image1 ); metrics = TreeLCA.getItemMetrics( tree ); assertEquals( 0, metrics[ 0 ].imageLeft ); assertEquals( 206, metrics[ 1 ].imageLeft ); } @Test public void testGetItemMetricsCellLeft() { shell.setBounds( 0, 0, 800, 600 ); shell.setLayout( new FillLayout() ); tree.setHeaderVisible( true ); TreeColumn column1 = new TreeColumn( tree, SWT.NONE ); column1.setText( "column1" ); column1.setWidth( 210 ); TreeColumn column2 = new TreeColumn( tree, SWT.NONE ); column2.setText( "column2" ); column2.setWidth( 200 ); TreeColumn column3 = new TreeColumn( tree, SWT.NONE ); column3.setText( "column2" ); column3.setWidth( 200 ); ItemMetrics[] metrics = TreeLCA.getItemMetrics( tree ); assertEquals( 0, metrics[ 0 ].left ); assertEquals( 210, metrics[ 1 ].left ); assertEquals( 410, metrics[ 2 ].left ); } @Test public void testGetItemMetricsCellWidth() { shell.setBounds( 0, 0, 800, 600 ); shell.setLayout( new FillLayout() ); tree.setHeaderVisible( true ); TreeColumn column1 = new TreeColumn( tree, SWT.NONE ); column1.setText( "column1" ); column1.setWidth( 210 ); TreeColumn column2 = new TreeColumn( tree, SWT.NONE ); column2.setText( "column2" ); column2.setWidth( 200 ); TreeColumn column3 = new TreeColumn( tree, SWT.NONE ); column3.setText( "column2" ); column3.setWidth( 220 ); ItemMetrics[] metrics = TreeLCA.getItemMetrics( tree ); assertEquals( 210, metrics[ 0 ].width ); assertEquals( 200, metrics[ 1 ].width ); assertEquals( 220, metrics[ 2 ].width ); } @Test public void testGetItemMetricsTextLeftWithImage() throws IOException { shell.setBounds( 0, 0, 800, 600 ); shell.setLayout( new FillLayout() ); Image image = createImage( display, Fixture.IMAGE_100x50 ); tree.setHeaderVisible( true ); TreeColumn column = new TreeColumn( tree, SWT.NONE ); column.setText( "column1" ); column.setWidth( 200 ); TreeColumn column2 = new TreeColumn( tree, SWT.NONE ); column2.setText( "column2" ); column2.setWidth( 200 ); TreeItem item1 = new TreeItem( tree, SWT.NONE ); item1.setText( 1, "item12" ); ItemMetrics[] metrics = TreeLCA.getItemMetrics( tree ); assertEquals( 206, metrics[ 1 ].textLeft ); item1.setImage( 1, image ); metrics = TreeLCA.getItemMetrics( tree ); assertEquals( 306, metrics[ 1 ].textLeft ); } @Test public void testGetItemMetricsTextLeftWithCheckbox() throws IOException { shell.setBounds( 0, 0, 800, 600 ); shell.setLayout( new FillLayout() ); Image image = createImage( display, Fixture.IMAGE_100x50 ); Tree tree = new Tree( shell, SWT.CHECK ); tree.setHeaderVisible( true ); TreeColumn column = new TreeColumn( tree, SWT.NONE ); column.setText( "column1" ); column.setWidth( 200 ); TreeItem item1 = new TreeItem( tree, SWT.NONE ); item1.setText( "item" ); item1.setImage( image ); ItemMetrics[] metrics = TreeLCA.getItemMetrics( tree ); assertEquals( 126, metrics[ 0 ].textLeft ); } @Test public void testGetItemMetricsTextWidthWithCheckbox() throws IOException { shell.setBounds( 0, 0, 800, 600 ); shell.setLayout( new FillLayout() ); Image image = createImage( display, Fixture.IMAGE_100x50 ); Tree tree = new Tree( shell, SWT.CHECK ); tree.setHeaderVisible( true ); TreeColumn column = new TreeColumn( tree, SWT.NONE ); column.setText( "column1" ); column.setWidth( 200 ); TreeItem item1 = new TreeItem( tree, SWT.NONE ); item1.setText( "item" ); item1.setImage( image ); ItemMetrics[] metrics = TreeLCA.getItemMetrics( tree ); assertEquals( 63, metrics[ 0 ].textWidth ); } @Test public void testVirtualSelectionEvent() { java.util.List<SelectionEvent> events = new LinkedList<SelectionEvent>(); Tree tree = new Tree( shell, SWT.VIRTUAL ); getRemoteObject( tree ).setHandler( new TreeOperationHandler( tree ) ); tree.setItemCount( 100 ); tree.setBounds( new Rectangle( 1, 2, 3, 4 ) ); tree.addSelectionListener( new LoggingSelectionListener( events ) ); Fixture.fakeNewRequest(); JsonObject properties = new JsonObject() .add( ClientMessageConst.EVENT_PARAM_ITEM, getId( tree ) + "#" + 50 ); Fixture.fakeNotifyOperation( getId( tree ), ClientMessageConst.EVENT_SELECTION, properties ); Fixture.readDataAndProcessAction( tree ); assertEquals( 1, events.size() ); SelectionEvent event = events.get( 0 ); assertEquals( tree, event.getSource() ); assertSame( tree.getItem( 50 ), event.item ); } @Test public void testVirtualSelectionEventWithSubitem() { java.util.List<SelectionEvent> events = new LinkedList<SelectionEvent>(); Tree tree = new Tree( shell, SWT.VIRTUAL ); getRemoteObject( tree ).setHandler( new TreeOperationHandler( tree ) ); tree.setItemCount( 1 ); TreeItem item = tree.getItem( 0 ); // Important: parent item must be materialized item.setText( "item 1" ); item.setItemCount( 100 ); tree.setBounds( new Rectangle( 1, 2, 3, 4 ) ); tree.addSelectionListener( new LoggingSelectionListener( events ) ); Fixture.fakeNewRequest(); JsonObject properties = new JsonObject() .add( ClientMessageConst.EVENT_PARAM_ITEM, getId( item ) + "#" + 50 ); Fixture.fakeNotifyOperation( getId( tree ), ClientMessageConst.EVENT_SELECTION, properties ); Fixture.readDataAndProcessAction( display ); assertEquals( 1, events.size() ); SelectionEvent event = events.get( 0 ); assertEquals( tree, event.getSource() ); assertSame( item.getItem( 50 ), event.item ); } @Test public void testCellTooltipRequestForMissingCells() { getRemoteObject( tree ).setHandler( new TreeOperationHandler( tree ) ); createTreeItems( tree, 3 ); final StringBuilder log = new StringBuilder(); final ICellToolTipAdapter adapter = CellToolTipUtil.getAdapter( tree ); adapter.setCellToolTipProvider( new ICellToolTipProvider() { @Override public void getToolTipText( Item item, int columnIndex ) { StringBuilder buffer = new StringBuilder(); buffer.append( "[" ); buffer.append( WidgetUtil.getId( item ) ); buffer.append( "," ); buffer.append( columnIndex ); buffer.append( "]" ); log.append( buffer.toString() ); } } ); String itemId = WidgetUtil.getId( tree.getItem( 0 ) ); processCellToolTipRequest( tree, itemId, 0 ); assertEquals( "[" + itemId + ",0]", log.toString() ); log.setLength( 0 ); itemId = WidgetUtil.getId( tree.getItem( 2 ) ); processCellToolTipRequest( tree, itemId, 0 ); assertEquals( "[" + itemId + ",0]", log.toString() ); log.setLength( 0 ); processCellToolTipRequest( tree, "xyz", 0 ); assertEquals( "", log.toString() ); processCellToolTipRequest( tree, itemId, 1 ); assertEquals( "", log.toString() ); createTreeColumns( tree, 2 ); processCellToolTipRequest( tree, itemId, 1 ); assertEquals( "[" + itemId + ",1]", log.toString() ); log.setLength( 0 ); processCellToolTipRequest( tree, itemId, 2 ); assertEquals( "", log.toString() ); } @Test public void testCreateVirtualItems() { final Tree tree = new Tree( shell, SWT.VIRTUAL ); tree.setSize( 200, 200 ); tree.addListener( SWT.SetData, new Listener() { @Override public void handleEvent( Event event ) { TreeItem item = ( TreeItem )event.item; item.setText( "node " + tree.indexOf( item ) ); item.setItemCount( 10 ); } } ); tree.setItemCount( 7 ); Fixture.markInitialized( display ); Fixture.markInitialized( shell ); Fixture.fakeNewRequest(); Fixture.executeLifeCycleFromServerThread(); TestMessage message = Fixture.getProtocolMessage(); assertEquals( 7, countCreateOperations( "rwt.widgets.GridItem", message ) ); } @Test public void testVirtualReadSelection() { Tree tree = new Tree( shell, SWT.VIRTUAL ); getRemoteObject( tree ).setHandler( new TreeOperationHandler( tree ) ); tree.setItemCount( 100 ); tree.setBounds( new Rectangle( 1, 2, 3, 4 ) ); Fixture.fakeNewRequest(); Fixture.fakeSetProperty( getId( tree ), "selection", createJsonArray( getId( tree ) + "#" + 50 ) ); Fixture.readDataAndProcessAction( tree ); assertEquals( 1, tree.getSelection().length ); assertSame( tree.getItem( 50 ), tree.getSelection()[ 0 ] ); } @Test public void testVirtualReadSelectionWithSubitem() { Tree tree = new Tree( shell, SWT.VIRTUAL ); getRemoteObject( tree ).setHandler( new TreeOperationHandler( tree ) ); tree.setItemCount( 1 ); TreeItem item = tree.getItem( 0 ); // Important: parent item must be materialized item.setText( "item 1" ); item.setItemCount( 100 ); tree.setBounds( new Rectangle( 1, 2, 3, 4 ) ); Fixture.fakeNewRequest(); Fixture.fakeSetProperty( getId( tree ), "selection", createJsonArray( getId( item ) + "#" + 50 ) ); Fixture.readDataAndProcessAction( tree ); assertEquals( 1, tree.getSelection().length ); assertSame( item.getItem( 50 ), tree.getSelection()[ 0 ] ); } @Test public void testReadSelectionDisposedItem() { Tree tree = new Tree( shell, SWT.MULTI ); getRemoteObject( tree ).setHandler( new TreeOperationHandler( tree ) ); TreeItem item1 = new TreeItem( tree, SWT.NONE ); new TreeItem( tree, SWT.NONE ); item1.dispose(); Fixture.fakeNewRequest(); Fixture.fakeSetProperty( getId( tree ), "selection", createJsonArray( getId( item1 ) ) ); Fixture.readDataAndProcessAction( tree ); TreeItem[] selectedItems = tree.getSelection(); assertEquals( 0, selectedItems.length ); } @Test public void testRenderCreate() throws IOException { lca.renderInitialization( tree ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation = message.findCreateOperation( tree ); assertEquals( "rwt.widgets.Grid", operation.getType() ); assertEquals( "tree", operation.getProperties().get( "appearance" ).asString() ); assertEquals( 16, operation.getProperties().get( "indentionWidth" ).asInt() ); assertEquals( JsonArray.readFrom( "[3, 5]" ), operation.getProperties().get( "selectionPadding" ) ); assertFalse( operation.getProperties().names().contains( "checkBoxMetrics" ) ); assertEquals( JsonValue.FALSE, operation.getProperties().get( "markupEnabled" ) ); } @Test public void testRenderCreateWithFixedColumns() throws IOException { tree.setData( RWT.FIXED_COLUMNS, Integer.valueOf( 1 ) ); lca.renderInitialization( tree ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation = message.findCreateOperation( tree ); assertEquals( JsonValue.TRUE, operation.getProperties().get( "splitContainer" ) ); } @Test public void testRenderCreate_setsOperationHandler() throws IOException { String id = getId( tree ); lca.renderInitialization( tree ); OperationHandler handler = RemoteObjectRegistry.getInstance().get( id ).getHandler(); assertTrue( handler instanceof TreeOperationHandler ); } @Test public void testRenderParent() throws IOException { lca.renderInitialization( tree ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation = message.findCreateOperation( tree ); assertEquals( getId( tree.getParent() ), getParent( operation ) ); } @Test public void testRenderCreateWithVirtualNoScrollMulti() throws IOException { Tree tree = new Tree( shell, SWT.VIRTUAL | SWT.NO_SCROLL | SWT.MULTI ); lca.renderInitialization( tree ); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation = message.findCreateOperation( tree ); List<String> styles = getStyles( operation ); assertTrue( styles.contains( "VIRTUAL" ) ); assertTrue( styles.contains( "NO_SCROLL" ) ); assertTrue( styles.contains( "MULTI" ) ); assertEquals( JsonValue.TRUE, message.findListenProperty( tree, "SetData" ) ); } @Test public void testDontRenderSetDataListenerTwice() throws Exception { Tree tree = new Tree( shell, SWT.VIRTUAL | SWT.NO_SCROLL | SWT.MULTI ); Fixture.markInitialized( display ); Fixture.markInitialized( tree ); Fixture.preserveWidgets(); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findListenOperation( tree, "SetData" ) ); } @Test public void testDontRenderSetDataWithoutVirtual() throws Exception { Fixture.markInitialized( display ); Fixture.markInitialized( tree ); Fixture.preserveWidgets(); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findListenOperation( tree, "SetData" ) ); } @Test public void testRenderCreateWithFullSelection() throws IOException { Tree tree = new Tree( shell, SWT.FULL_SELECTION ); lca.renderInitialization( tree ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation = message.findCreateOperation( tree ); assertTrue( getStyles( operation ).contains( "FULL_SELECTION" ) ); assertFalse( operation.getProperties().names().contains( "selectionPadding" ) ); } @Test public void testRenderCreateWithCheck() throws IOException { Tree tree = new Tree( shell, SWT.CHECK ); lca.renderInitialization( tree ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation = message.findCreateOperation( tree ); assertTrue( getStyles( operation ).contains( "CHECK" ) ); JsonArray exptected = JsonArray.readFrom( "[0, 21]" ); assertEquals( exptected, operation.getProperties().get( "checkBoxMetrics" ) ); } @Test public void testRenderInitialItemCount() throws IOException { lca.render( tree ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation = message.findCreateOperation( tree ); assertFalse( operation.getProperties().names().contains( "itemCount" ) ); } @Test public void testRenderItemCount() throws IOException { tree.setItemCount( 10 ); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertEquals( 10, message.findSetProperty( tree, "itemCount" ).asInt() ); } @Test public void testRenderItemCountUnchanged() throws IOException { Fixture.markInitialized( display ); Fixture.markInitialized( tree ); tree.setItemCount( 10 ); Fixture.preserveWidgets(); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findSetOperation( tree, "itemCount" ) ); } @Test public void testRenderInitialItemHeight() throws IOException { lca.render( tree ); TestMessage message = Fixture.getProtocolMessage(); assertNotNull( message.findSetOperation( getId( tree ), "itemHeight" ) ); } @Test public void testRenderItemHeight() throws IOException { Font font = new Font( display, "Arial", 26, SWT.NONE ); tree.setFont( font ); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertEquals( 39, message.findSetProperty( tree, "itemHeight" ).asInt() ); } @Test public void testRenderItemHeightUnchanged() throws IOException { Font font = new Font( display, "Arial", 26, SWT.NONE ); Fixture.markInitialized( display ); Fixture.markInitialized( tree ); tree.setFont( font ); Fixture.preserveWidgets(); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findSetOperation( tree, "itemHeight" ) ); } @Test public void testRenderInitialItemMetrics() throws IOException { lca.render( tree ); TestMessage message = Fixture.getProtocolMessage(); assertNotNull( message.findSetOperation( getId( tree ), "itemMetrics" ) ); } @Test public void testRenderItemMetrics() throws IOException { TreeItem item = new TreeItem( tree, SWT.NONE ); item.setText( "foo" ); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); JsonArray expected = JsonArray.readFrom( "[[0, 0, 50, 0, 0, 3, 36]]" ); assertEquals( expected, message.findSetProperty( tree, "itemMetrics" ) ); } @Test public void testRenderItemMetricsUnchanged() throws IOException { TreeItem item = new TreeItem( tree, SWT.NONE ); item.setText( "foo" ); Fixture.markInitialized( display ); Fixture.markInitialized( tree ); Fixture.preserveWidgets(); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findSetOperation( tree, "itemMetrics" ) ); } @Test public void testRenderInitialColumnCount() throws IOException { lca.render( tree ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation = message.findCreateOperation( tree ); assertFalse( operation.getProperties().names().contains( "columnCount" ) ); } @Test public void testRenderColumnCount() throws IOException { new TreeColumn( tree, SWT.NONE ); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertEquals( 1, message.findSetProperty( tree, "columnCount" ).asInt() ); } @Test public void testRenderColumnCountUnchanged() throws IOException { Fixture.markInitialized( display ); Fixture.markInitialized( tree ); new TreeColumn( tree, SWT.NONE ); Fixture.preserveWidgets(); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findSetOperation( tree, "columnCount" ) ); } @Test public void testRenderInitialColumnOrder() throws IOException { lca.render( tree ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation = message.findCreateOperation( tree ); assertTrue( operation.getProperties().names().indexOf( "columnOrder" ) == -1 ); } @Test public void testRenderColumnOrder() throws IOException { TreeColumn[] columns = createTreeColumns( tree, 3 ); tree.setColumnOrder( new int[] { 2, 0, 1 } ); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); JsonArray expected = new JsonArray() .add( getId( columns[ 2 ] ) ) .add( getId( columns[ 0 ] ) ) .add( getId( columns[ 1 ] ) ); assertEquals( expected, message.findSetProperty( tree, "columnOrder" ) ); } @Test public void testRenderColumnOrderUnchanged() throws IOException { Fixture.markInitialized( display ); Fixture.markInitialized( tree ); createTreeColumns( tree, 3 ); tree.setColumnOrder( new int[] { 2, 0, 1 } ); Fixture.preserveWidgets(); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findSetOperation( tree, "columnOrder" ) ); } @Test public void testRenderInitialFixedColumns() throws IOException { lca.render( tree ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation = message.findCreateOperation( tree ); assertFalse( operation.getProperties().names().contains( "fixedColumns" ) ); } @Test public void testRenderFixedColumns() throws IOException { new TreeColumn( tree, SWT.NONE ); tree.setData( RWT.FIXED_COLUMNS, Integer.valueOf( 1 ) ); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertEquals( 1, message.findSetProperty( tree, "fixedColumns" ).asInt() ); } @Test public void testRenderFixedColumnsUnchanged() throws IOException { new TreeColumn( tree, SWT.NONE ); Fixture.markInitialized( display ); Fixture.markInitialized( tree ); tree.setData( "fixedColumns", Integer.valueOf( 1 ) ); Fixture.preserveWidgets(); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findSetOperation( tree, "fixedColumns" ) ); } @Test public void testRenderInitialTreeColumn() throws IOException { new TreeColumn( tree, SWT.NONE ); new TreeColumn( tree, SWT.NONE ); lca.render( tree ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation = message.findCreateOperation( tree ); assertFalse( operation.getProperties().names().contains( "treeColumn" ) ); } @Test public void testRenderTreeColumn() throws IOException { new TreeColumn( tree, SWT.NONE ); new TreeColumn( tree, SWT.NONE ); tree.setColumnOrder( new int[]{ 1, 0 } ); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertEquals( 1, message.findSetProperty( tree, "treeColumn" ).asInt() ); } @Test public void testRenderTreeColumnUnchanged() throws IOException { new TreeColumn( tree, SWT.NONE ); new TreeColumn( tree, SWT.NONE ); Fixture.markInitialized( display ); Fixture.markInitialized( tree ); tree.setColumnOrder( new int[]{ 1, 0 } ); Fixture.preserveWidgets(); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findSetOperation( tree, "treeColumn" ) ); } @Test public void testRenderInitialHeaderHeight() throws IOException { lca.render( tree ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation = message.findCreateOperation( tree ); assertFalse( operation.getProperties().names().contains( "headerHeight" ) ); } @Test public void testRenderHeaderHeight() throws IOException { tree.setHeaderVisible( true ); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertEquals( 31, message.findSetProperty( tree, "headerHeight" ).asInt() ); } @Test public void testRenderHeaderHeightUnchanged() throws IOException { Fixture.markInitialized( display ); Fixture.markInitialized( tree ); tree.setHeaderVisible( true ); Fixture.preserveWidgets(); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findSetOperation( tree, "headerHeight" ) ); } @Test public void testRenderInitialHeaderVisible() throws IOException { lca.render( tree ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation = message.findCreateOperation( tree ); assertFalse( operation.getProperties().names().contains( "headerVisible" ) ); } @Test public void testRenderHeaderVisible() throws IOException { tree.setHeaderVisible( true ); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertEquals( JsonValue.TRUE, message.findSetProperty( tree, "headerVisible" ) ); } @Test public void testRenderHeaderVisibleUnchanged() throws IOException { Fixture.markInitialized( display ); Fixture.markInitialized( tree ); tree.setHeaderVisible( true ); Fixture.preserveWidgets(); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findSetOperation( tree, "headerVisible" ) ); } @Test public void testRenderInitialLinesVisible() throws IOException { lca.render( tree ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation = message.findCreateOperation( tree ); assertFalse( operation.getProperties().names().contains( "linesVisible" ) ); } @Test public void testRenderLinesVisible() throws IOException { tree.setLinesVisible( true ); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertEquals( JsonValue.TRUE, message.findSetProperty( tree, "linesVisible" ) ); } @Test public void testRenderLinesVisibleUnchanged() throws IOException { Fixture.markInitialized( display ); Fixture.markInitialized( tree ); tree.setLinesVisible( true ); Fixture.preserveWidgets(); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findSetOperation( tree, "linesVisible" ) ); } @Test public void testRenderInitialTopItemIndex() throws IOException { getLCA( display ).render( display ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation = message.findCreateOperation( tree ); assertFalse( operation.getProperties().names().contains( "topItemIndex" ) ); } @Test public void testRenderTopItemIndex() throws IOException { new TreeItem( tree, SWT.NONE ); TreeItem item = new TreeItem( tree, SWT.NONE ); tree.setTopItem( item ); getLCA( display ).render( display ); TestMessage message = Fixture.getProtocolMessage(); assertEquals( 1, message.findSetProperty( tree, "topItemIndex" ).asInt() ); } @Test public void testRenderTopItemIndex_afterAllItems() throws IOException { new TreeItem( tree, SWT.NONE ); TreeItem item = new TreeItem( tree, SWT.NONE ); TreeColumn column = new TreeColumn( tree, SWT.NONE ); tree.setTopItem( item ); getLCA( display ).render( display ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation1 = message.findCreateOperation( item ); CreateOperation operation2 = message.findCreateOperation( column ); SetOperation operation3 = message.findSetOperation( tree, "topItemIndex" ); assertNotNull( operation1 ); assertNotNull( operation2 ); assertNotNull( operation3 ); List<Operation> operations = message.getOperations(); assertTrue( operations.indexOf( operation1 ) < operations.indexOf( operation3 ) ); assertTrue( operations.indexOf( operation2 ) < operations.indexOf( operation3 ) ); } @Test public void testRenderTopItemIndexUnchanged() throws IOException { new TreeItem( tree, SWT.NONE ); TreeItem item = new TreeItem( tree, SWT.NONE ); Fixture.markInitialized( display ); Fixture.markInitialized( tree ); tree.setTopItem( item ); Fixture.preserveWidgets(); getLCA( display ).render( display ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findSetOperation( tree, "topItemIndex" ) ); } @Test public void testRenderInitialScrollLeft() throws IOException { getLCA( display ).render( display ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation = message.findCreateOperation( tree ); assertFalse( operation.getProperties().names().contains( "scrollLeft" ) ); } @Test public void testRenderScrollLeft() throws IOException { setScrollLeft( tree, 10 ); getLCA( display ).render( display ); TestMessage message = Fixture.getProtocolMessage(); assertEquals( 10, message.findSetProperty( tree, "scrollLeft" ).asInt() ); } @Test public void testRenderScrollLeft_afterAllItems() throws IOException { new TreeItem( tree, SWT.NONE ); TreeItem item = new TreeItem( tree, SWT.NONE ); TreeColumn column = new TreeColumn( tree, SWT.NONE ); setScrollLeft( tree, 10 ); getLCA( display ).render( display ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation1 = message.findCreateOperation( item ); CreateOperation operation2 = message.findCreateOperation( column ); SetOperation operation3 = message.findSetOperation( tree, "scrollLeft" ); assertNotNull( operation1 ); assertNotNull( operation2 ); assertNotNull( operation3 ); List<Operation> operations = message.getOperations(); assertTrue( operations.indexOf( operation1 ) < operations.indexOf( operation3 ) ); assertTrue( operations.indexOf( operation2 ) < operations.indexOf( operation3 ) ); } @Test public void testRenderScrollLeftUnchanged() throws IOException { Fixture.markInitialized( display ); Fixture.markInitialized( tree ); setScrollLeft( tree, 10 ); Fixture.preserveWidgets(); getLCA( display ).render( display ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findSetOperation( tree, "scrollLeft" ) ); } @Test public void testRenderInitialSelection() throws IOException { getLCA( display ).render( display ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation = message.findCreateOperation( tree ); assertFalse( operation.getProperties().names().contains( "selection" ) ); } @Test public void testRenderSelection() throws IOException { Tree tree = new Tree( shell, SWT.MULTI ); TreeItem item1 = new TreeItem( tree, SWT.NONE ); new TreeItem( tree, SWT.NONE ); TreeItem item3 = new TreeItem( tree, SWT.NONE ); tree.setSelection( new TreeItem[] { item1, item3 } ); getLCA( display ).render( display ); TestMessage message = Fixture.getProtocolMessage(); JsonArray expected = new JsonArray(); expected.add( getId( item1 ) ); expected.add( getId( item3 ) ); assertEquals( expected, message.findSetProperty( tree, "selection" ) ); } @Test public void testRenderSelectionUnchanged() throws IOException { Tree tree = new Tree( shell, SWT.MULTI ); TreeItem item1 = new TreeItem( tree, SWT.NONE ); new TreeItem( tree, SWT.NONE ); TreeItem item3 = new TreeItem( tree, SWT.NONE ); Fixture.markInitialized( display ); Fixture.markInitialized( tree ); tree.setSelection( new TreeItem[] { item1, item3 } ); Fixture.preserveWidgets(); getLCA( display ).render( display ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findSetOperation( tree, "selection" ) ); } @Test public void testRenderAddSelectionListener() throws Exception { Fixture.markInitialized( display ); Fixture.markInitialized( tree ); Fixture.preserveWidgets(); tree.addListener( SWT.Selection, mock( Listener.class ) ); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertEquals( JsonValue.TRUE, message.findListenProperty( tree, "Selection" ) ); assertNull( message.findListenOperation( tree, "DefaultSelection" ) ); } @Test public void testRenderRemoveSelectionListener() throws Exception { Listener listener = mock( Listener.class ); tree.addListener( SWT.Selection, listener ); Fixture.markInitialized( display ); Fixture.markInitialized( tree ); Fixture.preserveWidgets(); tree.removeListener( SWT.Selection, listener ); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertEquals( JsonValue.FALSE, message.findListenProperty( tree, "Selection" ) ); assertNull( message.findListenOperation( tree, "DefaultSelection" ) ); } @Test public void testRenderAddDefaultSelectionListener() throws Exception { Fixture.markInitialized( display ); Fixture.markInitialized( tree ); Fixture.preserveWidgets(); tree.addListener( SWT.DefaultSelection, mock( Listener.class ) ); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertEquals( JsonValue.TRUE, message.findListenProperty( tree, "DefaultSelection" ) ); assertNull( message.findListenOperation( tree, "Selection" ) ); } @Test public void testRenderRemoveDefaultSelectionListener() throws Exception { Listener listener = mock( Listener.class ); tree.addListener( SWT.DefaultSelection, listener ); Fixture.markInitialized( display ); Fixture.markInitialized( tree ); Fixture.preserveWidgets(); tree.removeListener( SWT.DefaultSelection, listener ); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertEquals( JsonValue.FALSE, message.findListenProperty( tree, "DefaultSelection" ) ); assertNull( message.findListenOperation( tree, "Selection" ) ); } @Test public void testRenderSelectionListenerUnchanged() throws Exception { Fixture.markInitialized( display ); Fixture.markInitialized( tree ); Fixture.preserveWidgets(); tree.addListener( SWT.Selection, mock( Listener.class ) ); Fixture.preserveWidgets(); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findListenOperation( tree, "Selection" ) ); } @Test public void testRenderAddExpandListener() throws Exception { lca.renderInitialization( tree ); TestMessage message = Fixture.getProtocolMessage(); assertEquals( JsonValue.TRUE, message.findListenProperty( tree, "Expand" ) ); } @Test public void testRenderAddCollapseListener() throws Exception { lca.renderInitialization( tree ); TestMessage message = Fixture.getProtocolMessage(); assertEquals( JsonValue.TRUE, message.findListenProperty( tree, "Collapse" ) ); } @Test public void testRenderInitialEnableCellToolTip() throws IOException { lca.render( tree ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation = message.findCreateOperation( tree ); assertFalse( operation.getProperties().names().contains( "enableCellToolTip" ) ); } @Test public void testRenderEnableCellToolTip() throws IOException { tree.setData( ICellToolTipProvider.ENABLE_CELL_TOOLTIP, Boolean.TRUE ); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertEquals( JsonValue.TRUE, message.findSetProperty( tree, "enableCellToolTip" ) ); } @Test public void testRenderEnableCellToolTipUnchanged() throws IOException { Fixture.markInitialized( display ); Fixture.markInitialized( tree ); tree.setData( ICellToolTipProvider.ENABLE_CELL_TOOLTIP, Boolean.TRUE ); Fixture.preserveWidgets(); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findSetOperation( tree, "enableCellToolTip" ) ); } @Test public void testRenderCellToolTipText() { getRemoteObject( tree ).setHandler( new TreeOperationHandler( tree ) ); Fixture.markInitialized( display ); Fixture.markInitialized( tree ); createTreeItems( tree, 5 ); final ICellToolTipAdapter adapter = CellToolTipUtil.getAdapter( tree ); adapter.setCellToolTipProvider( new ICellToolTipProvider() { @Override public void getToolTipText( Item item, int columnIndex ) { StringBuilder buffer = new StringBuilder(); buffer.append( "[" ); buffer.append( WidgetUtil.getId( item ) ); buffer.append( "," ); buffer.append( columnIndex ); buffer.append( "]" ); adapter.setCellToolTipText( buffer.toString() ); } } ); String itemId = WidgetUtil.getId( tree.getItem( 2 ) ); JsonObject parameters = new JsonObject().add( "item", itemId ).add( "column", 0 ); Fixture.fakeCallOperation( getId( tree ), "renderToolTipText", parameters ); Fixture.executeLifeCycleFromServerThread(); TestMessage message = Fixture.getProtocolMessage(); String expected = "[" + itemId + ",0]"; assertEquals( expected, message.findSetProperty( tree, "cellToolTipText" ).asString() ); } @Test public void testRenderCellToolTipText_resetsText() throws IOException { ICellToolTipAdapter adapter = CellToolTipUtil.getAdapter( tree ); adapter.setCellToolTipText( "foo" ); lca.renderChanges( tree ); assertNull( adapter.getCellToolTipText() ); } @Test public void testRenderCellToolTipTextNull() { getRemoteObject( tree ).setHandler( new TreeOperationHandler( tree ) ); Fixture.markInitialized( display ); Fixture.markInitialized( tree ); createTreeItems( tree, 5 ); final ICellToolTipAdapter adapter = CellToolTipUtil.getAdapter( tree ); adapter.setCellToolTipProvider( new ICellToolTipProvider() { @Override public void getToolTipText( Item item, int columnIndex ) { adapter.setCellToolTipText( null ); } } ); String itemId = WidgetUtil.getId( tree.getItem( 2 ) ); processCellToolTipRequest( tree, itemId, 0 ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findSetOperation( tree, "cellToolTipText" ) ); } @Test public void testRenderInitialSortDirection() throws IOException { lca.render( tree ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation = message.findCreateOperation( tree ); assertFalse( operation.getProperties().names().contains( "sortDirection" ) ); } @Test public void testRenderSortDirection() throws IOException { TreeColumn column = new TreeColumn( tree, SWT.NONE ); tree.setSortColumn( column ); tree.setSortDirection( SWT.UP ); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertEquals( "up", message.findSetProperty( tree, "sortDirection" ).asString() ); } @Test public void testRenderSortDirectionUnchanged() throws IOException { TreeColumn column = new TreeColumn( tree, SWT.NONE ); Fixture.markInitialized( display ); Fixture.markInitialized( tree ); tree.setSortColumn( column ); tree.setSortDirection( SWT.UP ); Fixture.preserveWidgets(); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findSetOperation( tree, "sortDirection" ) ); } @Test public void testRenderInitialSortColumn() throws IOException { getLCA( display ).render( display ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation = message.findCreateOperation( tree ); assertFalse( operation.getProperties().names().contains( "sortColumn" ) ); } @Test public void testRenderSortColumn() throws IOException { TreeColumn column = new TreeColumn( tree, SWT.NONE ); tree.setSortColumn( column ); getLCA( display ).render( display ); TestMessage message = Fixture.getProtocolMessage(); assertEquals( getId( column ), message.findSetProperty( tree, "sortColumn" ).asString() ); } @Test public void testRenderSortColumnUnchanged() throws IOException { TreeColumn column = new TreeColumn( tree, SWT.NONE ); Fixture.markInitialized( display ); Fixture.markInitialized( tree ); tree.setSortColumn( column ); Fixture.preserveWidgets(); getLCA( display ).render( display ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findSetOperation( tree, "sortColumn" ) ); } @Test public void testRenderInitialFocusItem() throws IOException { getLCA( display ).render( display ); TestMessage message = Fixture.getProtocolMessage(); CreateOperation operation = message.findCreateOperation( tree ); assertFalse( operation.getProperties().names().contains( "focusItem" ) ); } @Test public void testRenderFocusItem() throws IOException { new TreeItem( tree, SWT.NONE ); new TreeItem( tree, SWT.NONE ); TreeItem item = new TreeItem( tree, SWT.NONE ); tree.setSelection( item ); getLCA( display ).render( display ); TestMessage message = Fixture.getProtocolMessage(); assertEquals( getId( item ), message.findSetProperty( tree, "focusItem" ).asString() ); } @Test public void testRenderFocusItemUnchanged() throws IOException { new TreeItem( tree, SWT.NONE ); new TreeItem( tree, SWT.NONE ); TreeItem item = new TreeItem( tree, SWT.NONE ); Fixture.markInitialized( display ); Fixture.markInitialized( tree ); tree.setSelection( item ); Fixture.preserveWidgets(); getLCA( display ).render( display ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findSetOperation( tree, "focusItem" ) ); } @Test public void testRenderFocusItemOnEmptySelection() throws IOException { new TreeItem( tree, SWT.NONE ); new TreeItem( tree, SWT.NONE ); TreeItem item = new TreeItem( tree, SWT.NONE ); Fixture.markInitialized( display ); Fixture.markInitialized( tree ); tree.setSelection( item ); Fixture.preserveWidgets(); tree.setSelection( new TreeItem[ 0 ] ); lca.renderChanges( tree ); TestMessage message = Fixture.getProtocolMessage(); assertNull( message.findSetOperation( tree, "focusItem" ) ); } @Test public void testRenderMarkupEnabled() throws IOException { tree.setData( RWT.MARKUP_ENABLED, Boolean.TRUE ); lca.render( tree ); TestMessage message = Fixture.getProtocolMessage(); assertEquals( JsonValue.TRUE, message.findCreateProperty( tree, "markupEnabled" ) ); } @Test public void testRenderRowTemplate() throws IOException { Template rowTemplate = new Template(); tree.setData( RWT.ROW_TEMPLATE, rowTemplate ); lca.render( tree ); TestMessage message = Fixture.getProtocolMessage(); assertNotNull( message.findCreateProperty( tree, "rowTemplate" ) ); } private static void setScrollLeft( Tree tree, int scrollLeft ) { ITreeAdapter treeAdapter = getTreeAdapter( tree ); treeAdapter.setScrollLeft( scrollLeft); } private static ITreeAdapter getTreeAdapter( Tree tree ) { Object adapter = tree.getAdapter( ITreeAdapter.class ); return ( ITreeAdapter )adapter; } private static TreeColumn[] createTreeColumns( Tree tree, int columns ) { TreeColumn[] result = new TreeColumn[ columns ]; for( int i = 0; i < columns; i++ ) { result[ i ] = new TreeColumn( tree, SWT.NONE ); } return result; } private static void createTreeItems( Tree tree, int count ) { for( int i = 0; i < count; i++ ) { TreeItem item = new TreeItem( tree, SWT.NONE ); for( int j = 0; j < count; j++ ) { new TreeItem( item, SWT.NONE ); } item.setExpanded( true ); } } private static int countCreateOperations( String type, TestMessage message ) { int result = 0; int operations = message.getOperationCount(); for( int i = 0; i < operations; i++ ) { Operation operation = message.getOperation( i ); if( operation instanceof CreateOperation ) { if( type.equals( ( ( CreateOperation )operation ).getType() ) ) { result++; } } } return result; } private static void processCellToolTipRequest( Tree tree, String itemId, int column ) { Fixture.fakeNewRequest(); JsonObject parameters = new JsonObject() .add( "item", itemId ) .add( "column", column ); Fixture.fakeCallOperation( getId( tree ), "renderToolTipText", parameters ); Fixture.readDataAndProcessAction( tree ); } private static class LoggingSelectionListener extends SelectionAdapter { private final List<SelectionEvent> events; private LoggingSelectionListener( List<SelectionEvent> events ) { this.events = events; } @Override public void widgetSelected( SelectionEvent event ) { events.add( event ); } @Override public void widgetDefaultSelected( SelectionEvent event ) { events.add( event ); } } }