/*******************************************************************************
* Copyright (c) 2011, 2015 Frank Appel 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:
* Frank Appel - initial API and implementation
* EclipseSource - ongoing development
******************************************************************************/
package org.eclipse.rap.rwt.internal.textsize;
import static org.eclipse.rap.rwt.internal.service.ContextProvider.getApplicationContext;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import java.util.concurrent.atomic.AtomicInteger;
import org.eclipse.rap.rwt.internal.lifecycle.PhaseId;
import org.eclipse.rap.rwt.testfixture.internal.Fixture;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.internal.widgets.ControlUtil;
import org.eclipse.swt.internal.widgets.IColumnAdapter;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class TextSizeRecalculation_Test {
private static final FontData FONT_DATA = new FontData( "arial", 23, SWT.BOLD );
private static final String TEXT_TO_MEASURE = "textToMeasure";
private Display display;
private Shell shell;
private Composite scrolledCompositeContent;
private ResizeListener shellResizeListener;
private ResizeListener scrolledCompositeContentResizeListener;
private Label packedControl;
private TableColumn packedTableColumn;
private TreeColumn packedTreeColumn;
@Before
public void setUp() {
Fixture.setUp();
display = new Display();
shell = new Shell( display );
}
@After
public void tearDown() {
Fixture.tearDown();
}
@Test
public void testExecute() {
createWidgetTree();
registerResizeListeners();
turnOnImmediateResizeEventHandling();
fakeMeasurementResults();
TextSizeRecalculation.execute();
checkResizeTookPlace();
checkRePackTookPlace();
}
/*
* See bug 421942: [Dialog] Initial size is too big
*/
@Test
public void testExecute_restoresShellAfterScrolledComposite() {
createWidgetTree();
turnOnImmediateResizeEventHandling();
fakeMeasurementResults();
final Rectangle scrolledCompositeContentBounds = new Rectangle( 0, 0, 0, 0 );
shell.addListener( SWT.Resize, new Listener() {
@Override
public void handleEvent( Event event ) {
Rectangle size = scrolledCompositeContent.getBounds();
scrolledCompositeContentBounds.x = size.x;
scrolledCompositeContentBounds.y = size.x;
scrolledCompositeContentBounds.width = size.width;
scrolledCompositeContentBounds.height = size.height;
}
} );
TextSizeRecalculation.execute();
assertEquals( getInitialContentBounds(), scrolledCompositeContentBounds );
}
@Test
public void testShellRePack() {
final AtomicInteger counter = new AtomicInteger( 0 );
shell = new Shell( display ) {
@Override
public void pack() {
super.pack();
counter.incrementAndGet();
}
};
shell.pack();
turnOnImmediateResizeEventHandling();
fakeMeasurementResults();
TextSizeRecalculation.execute();
assertEquals( 2, counter.get() );
}
@Test
public void testShellRePack_olnyOnce() {
final AtomicInteger counter = new AtomicInteger( 0 );
shell = new Shell( display ) {
@Override
public void pack() {
super.pack();
counter.incrementAndGet();
}
};
shell.pack();
turnOnImmediateResizeEventHandling();
fakeMeasurementResults();
TextSizeRecalculation.execute();
TextSizeRecalculation.execute();
assertEquals( 2, counter.get() );
}
@Test
public void testLayoutOfCompositeWithFixedSize() {
turnOnImmediateResizeEventHandling();
createShellWithLayout();
Composite fixedSizeComposite = createFixedSizeComposite();
Label label = new Label( fixedSizeComposite, SWT.NONE );
label.setFont( new Font( display, FONT_DATA ) );
label.setText( TEXT_TO_MEASURE );
shell.pack();
ResizeListener resizeListener = new ResizeListener();
label.addControlListener( resizeListener );
fakeMeasurementResults();
TextSizeRecalculation.execute();
assertEquals( 1, resizeListener.resizeCount() );
assertEquals( "false|", resizeListener.getResizeLog() );
}
private void checkResizeTookPlace() {
assertEquals( getInitialShellBounds(), shell.getBounds() );
assertEquals( getInitialContentBounds(), scrolledCompositeContent.getBounds() );
assertEquals( 2, shellResizeListener.resizeCount() );
assertEquals( 2, scrolledCompositeContentResizeListener.resizeCount() );
assertEquals( "true|false|", shellResizeListener.getResizeLog() );
assertEquals( "true|false|", scrolledCompositeContentResizeListener.getResizeLog() );
}
private void checkRePackTookPlace() {
assertEquals( new Point( 100, 22 ), packedControl.getSize() );
assertEquals( 107, packedTableColumn.getWidth() );
assertEquals( 117, packedTreeColumn.getWidth() );
assertFalse( ControlUtil.getControlAdapter( packedControl ).isPacked() );
assertFalse( packedTableColumn.getAdapter( IColumnAdapter.class ) .isPacked() );
assertFalse( packedTreeColumn.getAdapter( IColumnAdapter.class ) .isPacked() );
}
private Rectangle getInitialShellBounds() {
return new Shell().getBounds();
}
private void createWidgetTree() {
createShellWithLayout();
createScrolledCompositeWithContent();
createPackedControl();
createPackedColumns();
}
private void createPackedControl() {
packedControl = new Label( scrolledCompositeContent, SWT.NONE );
packedControl.setFont( new Font( display, FONT_DATA ) );
packedControl.setText( TEXT_TO_MEASURE );
packedControl.pack();
}
private void createPackedColumns() {
Table table = new Table( scrolledCompositeContent, SWT.NONE );
table.setHeaderVisible( true );
table.setFont( new Font( display, FONT_DATA ) );
packedTableColumn = new TableColumn( table, SWT.NONE );
packedTableColumn.setText( TEXT_TO_MEASURE );
packedTableColumn.pack();
Tree tree = new Tree( scrolledCompositeContent, SWT.NONE );
tree.setHeaderVisible( true );
tree.setFont( new Font( display, FONT_DATA ) );
packedTreeColumn = new TreeColumn( tree, SWT.NONE );
packedTreeColumn.setText( TEXT_TO_MEASURE );
packedTreeColumn.pack();
}
private void createScrolledCompositeWithContent() {
ScrolledComposite scrolledComposite = new ScrolledComposite( shell, SWT.V_SCROLL | SWT.H_SCROLL );
scrolledCompositeContent = new Composite( scrolledComposite, SWT.NONE );
scrolledCompositeContent.setBounds( getInitialContentBounds() );
scrolledComposite.setContent( scrolledCompositeContent );
scrolledComposite.setOrigin( 5, 5 );
}
private Rectangle getInitialContentBounds() {
return new Rectangle( -5, -5, 100, 100 );
}
private void createShellWithLayout() {
shell.setLayout( new GridLayout() );
}
private Composite createFixedSizeComposite() {
Composite result = new Composite( shell, SWT.NONE );
result.setLayout( new GridLayout() );
result.setLayoutData( new GridData( 300, 50 ) );
return result;
}
private void registerResizeListeners() {
shellResizeListener = new ResizeListener();
scrolledCompositeContentResizeListener = new ResizeListener();
shell.addControlListener( shellResizeListener );
scrolledCompositeContent.addControlListener( scrolledCompositeContentResizeListener );
}
private void turnOnImmediateResizeEventHandling() {
Fixture.fakePhase( PhaseId.PROCESS_ACTION );
}
private void fakeMeasurementResults() {
ProbeResultStore.getInstance().createProbeResult( new Probe( FONT_DATA ), new Point( 4, 20 ) );
getApplicationContext().getTextSizeStorage().storeFont( FONT_DATA );
TextSizeStorageUtil.store( FONT_DATA,
TEXT_TO_MEASURE,
SWT.DEFAULT,
TextSizeUtil.TEXT_EXTENT,
new Point( 100, 20 ) );
TextSizeStorageUtil.store( FONT_DATA,
TEXT_TO_MEASURE,
SWT.DEFAULT,
TextSizeUtil.STRING_EXTENT,
new Point( 100, 20 ) );
}
private final class ResizeListener implements ControlListener {
private int resizeCount;
private final StringBuilder resizeLog = new StringBuilder();
@Override
public void controlResized( ControlEvent e ) {
resizeCount++;
resizeLog.append( TextSizeUtil.isTemporaryResize() );
resizeLog.append( "|" );
}
@Override
public void controlMoved( ControlEvent e ) {
}
public int resizeCount() {
return resizeCount;
}
public String getResizeLog() {
return resizeLog.toString();
}
}
}