/**
* Copyright (c) 2014 - 2017 Frank Appel
* 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:
* Frank Appel - initial API and implementation
*/
package com.codeaffine.eclipse.swt.widget.scrollable;
import static com.codeaffine.eclipse.swt.test.util.ShellHelper.computeTrim;
import static com.codeaffine.eclipse.swt.test.util.ShellHelper.createDemoShell;
import static com.codeaffine.eclipse.swt.util.ReadAndDispatch.ERROR_BOX_HANDLER;
import static com.codeaffine.eclipse.swt.widget.scrollable.ScrollableAdapterFactoryHelper.adapt;
import static com.codeaffine.eclipse.swt.widget.scrollable.TableHelper.createPackedSingleColumnTable;
import static com.codeaffine.eclipse.swt.widget.scrollable.TableHelper.createTableInSingleCellGridLayout;
import static com.codeaffine.eclipse.swt.widget.scrollable.TableHelper.createVirtualTableWithOwnerDrawnItems;
import static com.codeaffine.eclipse.swt.widget.scrollable.TreeHelper.createChildren;
import static com.codeaffine.eclipse.swt.widget.scrollable.TreeHelper.createTree;
import static com.codeaffine.eclipse.swt.widget.scrollable.TreeHelper.expandRootLevelItems;
import static com.codeaffine.eclipse.swt.widget.scrollable.TreeHelper.expandTopBranch;
import static java.lang.Math.min;
import java.util.Random;
import java.util.stream.Stream;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.part.PageBook;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import com.codeaffine.eclipse.swt.test.util.DisplayHelper;
import com.codeaffine.eclipse.swt.util.ReadAndDispatch;
public class ScrollableAdapterFactoryDemo {
private static final int TABLE_ITEM_COUNT = 20;
@Rule
public final DisplayHelper displayHelper = new DisplayHelper();
private Shell shell;
@Before
public void setUp() {
shell = createDemoShell( displayHelper );
}
@Test
public void treeDemo() {
Tree tree = new TestTreeFactory().create( shell );
adapt( tree, TreeAdapter.class );
shell.open();
expandRootLevelItems( tree );
expandTopBranch( tree );
spinLoop();
}
@Test
public void treeDemoWithBorder() {
Tree tree = new TestTreeFactory( SWT.BORDER ).create( shell );
adapt( tree, TreeAdapter.class );
shell.open();
expandRootLevelItems( tree );
expandTopBranch( tree );
spinLoop();
}
@Test
public void treeDemoWithoutHorizontalBar() {
Tree tree = new TestTreeFactory( SWT.NO_SCROLL | SWT.V_SCROLL ).create( shell );
adapt( tree, TreeAdapter.class );
shell.open();
expandRootLevelItems( tree );
expandTopBranch( tree );
spinLoop();
}
@Test
public void treeDemoWithPageBook() {
PageBook pageBook = new PageBook( shell, SWT.NONE );
pageBook.setBackground( displayHelper.getDisplay().getSystemColor( SWT.COLOR_BLUE ) );
Label label = new Label( pageBook, SWT.NONE );
label.setText( "Frontpage" );
Tree tree = createTree( pageBook, 8, 3 );
adapt( tree, TreeAdapter.class );
scheduleRandomPageSelection( pageBook, label, tree, () -> replaceTreeItems( tree ), 3 );
shell.open();
spinLoop();
}
@Test
public void scrollableDemoWithCTabFolder() {
shell.setSize( 400, 200 );
CTabFolder container = new CTabFolder( shell, SWT.BOTTOM | SWT.FLAT );
Tree tree = new TestTreeFactory().create( container );
adapt( tree, TreeAdapter.class );
CTabItem treeItem = new CTabItem( container, SWT.NONE, 0 );
treeItem.setText( "Tree" );
treeItem.setControl( tree );
expandRootLevelItems( tree );
expandTopBranch( tree );
Table table = new TestTableFactory().create( container );
adapt( table, TableAdapter.class );
CTabItem tableItem = new CTabItem( container, SWT.NONE, 1 );
tableItem.setText( "Table" );
tableItem.setControl( table );
StyledText styledText = new TestStyledTextFactory().create( container );
adapt( styledText, StyledTextAdapter.class );
CTabItem styledTextItem = new CTabItem( container, SWT.NONE, 2 );
styledTextItem.setText( "StyledText" );
styledTextItem.setControl( styledText );
ScrolledComposite scrolledComposite = new TestScrolledCompositeFactory().create( container );
adapt( scrolledComposite, ScrolledCompositeAdapter.class );
CTabItem scrolledCompositeItem = new CTabItem( container, SWT.NONE, 3 );
scrolledCompositeItem.setText( "ScrolledComposite" );
scrolledCompositeItem.setControl( scrolledComposite );
shell.open();
spinLoop();
}
@Test
public void tableDemo() {
adapt( new TestTableFactory().create( shell ), TableAdapter.class );
shell.open();
spinLoop();
}
@Test
public void tableDemoWithColumnWidthAdjustment() {
Table table = equipWithSingleColumnTable( shell );
adapt( table, TableAdapter.class );
shell.setBounds( computeTrim( shell, adjustTableHeight( table, TABLE_ITEM_COUNT + 2 ) ) );
table.getColumns()[ 0 ].setWidth( table.getClientArea().width );
shell.setLocation( 300, 300 );
shell.open();
spinLoop();
}
@Test
public void tableDemoWithPackedPopupShell() {
shell.open();
Shell popup = new Shell( shell, SWT.NO_TRIM );
popup.setLocation( shell.getLocation() );
Table table = createTableInSingleCellGridLayout( popup, tbl -> adapt( tbl, TableAdapter.class ) );
popup.pack();
popup.open();
spinLoop( 1000 );
table.getItem( 1 ).dispose();
GridData data = new GridData( GridData.FILL_BOTH );
data.widthHint = table.getSize().x;
data.heightHint = table.getItemHeight();
table.setLayoutData( data );
popup.pack();
spinLoop( 1000 );
TableItem tableItem = new TableItem( table, SWT.NONE );
tableItem.setText( "replaced" );
data.heightHint = table.getItemHeight() * 2;
table.setLayoutData( data );
popup.pack();
spinLoop();
}
@Test
public void virtualTableDemoWithOwnerDrawnItems() {
ItemList itemList = new ItemList();
Table table = createVirtualTableWithOwnerDrawnItems( shell, itemList );
adapt( table, TableAdapter.class );
table.setItemCount( itemList.getItems().length );
shell.open();
spinLoop();
}
@Test
public void styledTextDemo() {
adapt( new TestStyledTextFactory().create( shell ), StyledTextAdapter.class );
shell.open();
spinLoop();
}
@Test
public void scrolledCompositeDemo() {
adapt( new TestScrolledCompositeFactory().create( shell ), ScrolledCompositeAdapter.class );
shell.open();
spinLoop();
}
@Test
public void sashFormWithAdaptedControls() {
SashForm sashForm = new SashForm( shell, SWT.SMOOTH | SWT.VERTICAL );
adapt( TreeHelper.createOwnerDrawnTreeWithColumn( sashForm ), TreeAdapter.class );
adapt( new TestStyledTextFactory().create( sashForm ), StyledTextAdapter.class );
sashForm.setWeights( new int[] { 7, 3 } );
shell.open();
spinLoop();
}
private void spinLoop() {
newReadAndDispatch().spinLoop( shell );
}
private void spinLoop( long duration ) {
newReadAndDispatch().spinLoop( shell, duration );
}
private static ReadAndDispatch newReadAndDispatch() {
return new ReadAndDispatch( ERROR_BOX_HANDLER );
}
private void scheduleRandomPageSelection(
PageBook pageBook, Control page1, Control page2, Runnable page2Changer, int showPageRecurranceNumberToRunChange )
{
displayHelper.getDisplay().timerExec( 2000, () -> {
int newShowPageRecurranceNumberToRunChange = showPageRecurranceNumberToRunChange;
pageBook.showPage( page1 );
if( new Random().nextBoolean() ) {
if( showPageRecurranceNumberToRunChange == 0 ) {
page2Changer.run();
}
pageBook.showPage( page2 );
newShowPageRecurranceNumberToRunChange--;
}
scheduleRandomPageSelection( pageBook, page1, page2, page2Changer, newShowPageRecurranceNumberToRunChange );
} );
}
private static void replaceTreeItems( Tree tree ) {
Stream.of( tree.getItems() ).forEach( item -> item.dispose() );
createChildren( tree, "blub", 8, 3 );
tree.pack();
}
private static Table equipWithSingleColumnTable( Shell shell ) {
shell.setLayout( new FillLayout() );
Table result = createPackedSingleColumnTable( shell, TABLE_ITEM_COUNT );
shell.pack();
return result;
}
private static Rectangle adjustTableHeight( Table table, int maxItems ) {
Rectangle result = table.getBounds();
result.height = min( result.height, table.getItemHeight() * maxItems );
table.setBounds( result );
return result;
}
}