/*******************************************************************************
* Copyright (c) 2002, 2008 Innoopract Informationssysteme GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Innoopract Informationssysteme GmbH - initial API and implementation
******************************************************************************/
package org.eclipse.swt.internal.custom.ctabfolderkit;
import java.io.IOException;
import java.lang.reflect.Field;
import junit.framework.TestCase;
import org.eclipse.rwt.Fixture;
import org.eclipse.rwt.graphics.Graphics;
import org.eclipse.rwt.internal.lifecycle.*;
import org.eclipse.rwt.internal.service.RequestParams;
import org.eclipse.rwt.lifecycle.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.internal.custom.ICTabFolderAdapter;
import org.eclipse.swt.internal.custom.ctabitemkit.CTabItemLCA;
import org.eclipse.swt.internal.events.ActivateAdapter;
import org.eclipse.swt.internal.events.ActivateEvent;
import org.eclipse.swt.internal.widgets.Props;
import org.eclipse.swt.widgets.*;
public class CTabFolderLCA_Test extends TestCase {
private static final class CTabItemControl extends Composite {
public final StringBuffer markup = new StringBuffer();
public CTabItemControl( final Composite parent, final int style ) {
super( parent, style );
}
public Object getAdapter( final Class adapter ) {
Object result;
if( adapter == ILifeCycleAdapter.class ) {
result = new AbstractWidgetLCA() {
public void preserveValues( final Widget widget ) {
Control control = ( Control )widget;
IWidgetAdapter adapter = WidgetUtil.getAdapter( widget );
Boolean visible = Boolean.valueOf( control.isVisible() );
adapter.preserve( "visible", visible );
}
public void renderChanges( final Widget widget ) throws IOException {
markup.setLength( 0 );
Control control = ( Control )widget;
Boolean visible = Boolean.valueOf( control.isVisible() );
if( WidgetLCAUtil.hasChanged( widget, "visible", visible ) ) {
markup.append( "visible=" + visible );
}
}
public void renderDispose( final Widget widget ) throws IOException {
}
public void renderInitialization( final Widget widget )
throws IOException
{
}
public void readData( final Widget widget ) {
}
};
} else {
result = super.getAdapter( adapter );
}
return result;
}
}
protected void setUp() throws Exception {
Fixture.setUp();
}
protected void tearDown() throws Exception {
Fixture.tearDown();
}
public void testLCA() {
Display display = new Display();
Shell shell = new Shell( display , SWT.NONE );
CTabFolder folder = new CTabFolder( shell, SWT.NONE );
CTabItem item = new CTabItem( folder, SWT.NONE );
assertSame( CTabFolderLCA.class,
folder.getAdapter( ILifeCycleAdapter.class ).getClass() );
assertSame( CTabItemLCA.class,
item.getAdapter( ILifeCycleAdapter.class ).getClass() );
}
public void testPreserveValues() {
SelectionListener selectionListener = new SelectionAdapter() {
public void widgetSelected( final SelectionEvent event ) {
}
};
Display display = new Display();
Composite shell = new Shell( display, SWT.NONE );
CTabFolder folder = new CTabFolder( shell, SWT.NONE );
Label label = new Label( folder, SWT.NONE );
folder.setTopRight( label, SWT.FILL );
Fixture.markInitialized( display );
Fixture.preserveWidgets();
IWidgetAdapter adapter = WidgetUtil.getAdapter( folder );
Boolean hasListeners;
hasListeners = ( Boolean )adapter.getPreserved( Props.SELECTION_LISTENERS );
assertEquals( Boolean.FALSE, hasListeners );
Object selectionIndex
= adapter.getPreserved( CTabFolderLCA.PROP_SELECTION_INDEX );
assertEquals( new Integer( folder.getSelectionIndex() ), selectionIndex );
Object width = adapter.getPreserved( "width" );
assertEquals( new Integer( folder.getBounds().width ), width );
Object minVisible = adapter.getPreserved( CTabFolderLCA.PROP_MINIMIZE_VISIBLE );
assertEquals( Boolean.valueOf( folder.getMinimizeVisible() ), minVisible );
Object maxVisible = adapter.getPreserved( CTabFolderLCA.PROP_MAXIMIZE_VISIBLE );
assertEquals( Boolean.valueOf( folder.getMaximizeVisible() ), maxVisible );
Object tabHeight = adapter.getPreserved( CTabFolderLCA.PROP_TAB_HEIGHT );
assertEquals( new Integer( folder.getTabHeight() ), tabHeight );
Object minimized = adapter.getPreserved( CTabFolderLCA.PROP_MINIMIZED );
assertEquals( Boolean.valueOf( folder.getMinimized() ), minimized );
Object maximized = adapter.getPreserved( CTabFolderLCA.PROP_MAXIMIZED );
assertEquals( Boolean.valueOf( folder.getMaximized() ), maximized );
hasListeners
= ( Boolean )adapter.getPreserved( CTabFolderLCA.PROP_FOLDER_LISTENERS );
assertEquals( Boolean.FALSE, hasListeners );
ICTabFolderAdapter folderAdapter
= ( ICTabFolderAdapter )folder.getAdapter( ICTabFolderAdapter.class );
Object minimizerect = adapter.getPreserved( CTabFolderLCA.PROP_MINIMIZE_RECT );
assertEquals( folderAdapter.getMinimizeRect(), minimizerect );
Object maximizerect = adapter.getPreserved( CTabFolderLCA.PROP_MAXIMIZE_RECT );
assertEquals( folderAdapter.getMaximizeRect(), maximizerect );
Object tabPosition = adapter.getPreserved( CTabFolderLCA.PROP_TAB_POSITION );
assertEquals( new Integer( folder.getTabPosition() ), tabPosition );
Object selectionBg = adapter.getPreserved( CTabFolderLCA.PROP_SELECTION_BG );
assertEquals( folderAdapter.getUserSelectionBackground(), selectionBg );
Object selectionFg = adapter.getPreserved( CTabFolderLCA.PROP_SELECTION_FG );
assertEquals( folderAdapter.getUserSelectionForeground(), selectionFg );
Object chevronVisible
= adapter.getPreserved( CTabFolderLCA.PROP_CHEVRON_VISIBLE );
assertEquals( Boolean.valueOf( folderAdapter.getChevronVisible() ),
chevronVisible );
Object chevronRect = adapter.getPreserved( CTabFolderLCA.PROP_CHEVRON_RECT );
assertEquals( folderAdapter.getChevronRect(), chevronRect );
Fixture.clearPreserved();
folder.addSelectionListener( selectionListener );
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( folder );
hasListeners = ( Boolean )adapter.getPreserved( Props.SELECTION_LISTENERS );
assertEquals( Boolean.TRUE, hasListeners );
folder.addCTabFolder2Listener( new CTabFolder2Listener() {
public void close( final CTabFolderEvent event ) {
}
public void maximize( final CTabFolderEvent event ) {
}
public void minimize( final CTabFolderEvent event ) {
}
public void restore( final CTabFolderEvent event ) {
}
public void showList( final CTabFolderEvent event ) {
}
} );
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( folder );
hasListeners
= ( Boolean )adapter.getPreserved( CTabFolderLCA.PROP_FOLDER_LISTENERS );
assertEquals( Boolean.TRUE, hasListeners );
CTabItem item1 = new CTabItem( folder, SWT.NULL );
item1.setText( "item1" );
CTabItem item2 = new CTabItem( folder, SWT.NULL );
item2.setText( "item2" );
CTabItem item3 = new CTabItem( folder, SWT.NULL );
item3.setText( "item3" );
folder.setSelection( 2 );
folder.setBounds( 20, 30, 40, 30 );
folder.setMinimizeVisible( true );
folder.setMaximizeVisible( true );
folder.setMaximized( true );
folder.setMinimized( true );
folder.setTabHeight( 40 );
folder.setTabPosition( 1024 );
Color background = Graphics.getColor( 122, 233, 188 );
folder.setSelectionBackground( background );
Color foreground = Graphics.getColor( 233, 122, 199 );
folder.setSelectionForeground( foreground );
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( folder );
selectionIndex = adapter.getPreserved( CTabFolderLCA.PROP_SELECTION_INDEX );
assertEquals( new Integer( 2 ), selectionIndex );
width = adapter.getPreserved( "width" );
assertEquals( new Integer( 40 ), width );
minVisible = adapter.getPreserved( CTabFolderLCA.PROP_MINIMIZE_VISIBLE );
assertEquals( Boolean.TRUE, minVisible );
maxVisible = adapter.getPreserved( CTabFolderLCA.PROP_MAXIMIZE_VISIBLE );
assertEquals( Boolean.TRUE, maxVisible );
minimized = adapter.getPreserved( CTabFolderLCA.PROP_MINIMIZED );
assertEquals( Boolean.TRUE, minimized );
maximized = adapter.getPreserved( CTabFolderLCA.PROP_MINIMIZED );
assertEquals( Boolean.TRUE, maximized );
tabHeight = adapter.getPreserved( CTabFolderLCA.PROP_TAB_HEIGHT );
assertEquals( new Integer( 40 ), tabHeight );
tabPosition = adapter.getPreserved( CTabFolderLCA.PROP_TAB_POSITION );
assertEquals( new Integer( 1024 ), tabPosition );
selectionBg = adapter.getPreserved( CTabFolderLCA.PROP_SELECTION_BG );
assertEquals( background, selectionBg );
selectionFg = adapter.getPreserved( CTabFolderLCA.PROP_SELECTION_FG );
assertEquals( foreground, selectionFg );
assertNotNull( adapter.getPreserved( CTabFolderLCA.PROP_MINIMIZE_RECT ) );
assertNotNull( adapter.getPreserved( CTabFolderLCA.PROP_MAXIMIZE_RECT ) );
assertNotNull( adapter.getPreserved( CTabFolderLCA.PROP_CHEVRON_RECT ) );
assertNotNull( adapter.getPreserved( CTabFolderLCA.PROP_CHEVRON_VISIBLE ) );
chevronVisible = adapter.getPreserved( CTabFolderLCA.PROP_CHEVRON_VISIBLE );
assertTrue( chevronVisible instanceof Boolean );
// bound
Rectangle rectangle = new Rectangle( 10, 10, 10, 10 );
folder.setBounds( rectangle );
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( folder );
assertEquals( rectangle, adapter.getPreserved( Props.BOUNDS ) );
Fixture.clearPreserved();
// z-index
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( folder );
assertTrue( adapter.getPreserved( Props.Z_INDEX ) != null );
Fixture.clearPreserved();
// menu
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( folder );
assertEquals( null, adapter.getPreserved( Props.MENU ) );
Fixture.clearPreserved();
Menu menu = new Menu( folder );
MenuItem item = new MenuItem( menu, SWT.NONE );
item.setText( "1 Item" );
folder.setMenu( menu );
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( folder );
assertEquals( menu, adapter.getPreserved( Props.MENU ) );
// visible
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( folder );
assertEquals( Boolean.TRUE, adapter.getPreserved( Props.VISIBLE ) );
Fixture.clearPreserved();
folder.setVisible( false );
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( folder );
assertEquals( Boolean.FALSE, adapter.getPreserved( Props.VISIBLE ) );
Fixture.clearPreserved();
// enabled
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( folder );
assertEquals( Boolean.TRUE, adapter.getPreserved( Props.ENABLED ) );
Fixture.clearPreserved();
folder.setEnabled( false );
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( folder );
assertEquals( Boolean.FALSE, adapter.getPreserved( Props.ENABLED ) );
Fixture.clearPreserved();
folder.setEnabled( true );
// control_listeners
folder.addControlListener( new ControlListener() {
public void controlMoved( final ControlEvent e ) {
}
public void controlResized( final ControlEvent e ) {
}
} );
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( folder );
hasListeners = ( Boolean )adapter.getPreserved( Props.CONTROL_LISTENERS );
assertEquals( Boolean.TRUE, hasListeners );
Fixture.clearPreserved();
// foreground background font
Color controlBackground = Graphics.getColor( 122, 33, 203 );
folder.setBackground( controlBackground );
Color controlForeground = Graphics.getColor( 211, 178, 211 );
folder.setForeground( controlForeground );
Font font = Graphics.getFont( "font", 12, SWT.BOLD );
folder.setFont( font );
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( folder );
assertEquals( controlBackground, adapter.getPreserved( Props.BACKGROUND ) );
assertEquals( controlForeground, adapter.getPreserved( Props.FOREGROUND ) );
assertEquals( font, adapter.getPreserved( Props.FONT ) );
Fixture.clearPreserved();
// tab_index
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( folder );
assertTrue( adapter.getPreserved( Props.Z_INDEX ) != null );
Fixture.clearPreserved();
// tooltiptext
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( folder );
assertEquals( null, folder.getToolTipText() );
Fixture.clearPreserved();
folder.setToolTipText( "some text" );
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( folder );
assertEquals( "some text", folder.getToolTipText() );
Fixture.clearPreserved();
// activate_listeners Focus_listeners
folder.addFocusListener( new FocusListener() {
public void focusGained( final FocusEvent event ) {
}
public void focusLost( final FocusEvent event ) {
}
} );
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( folder );
hasListeners = ( Boolean )adapter.getPreserved( Props.FOCUS_LISTENER );
assertEquals( Boolean.TRUE, hasListeners );
Fixture.clearPreserved();
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( folder );
hasListeners = ( Boolean )adapter.getPreserved( Props.ACTIVATE_LISTENER );
assertEquals( Boolean.FALSE, hasListeners );
Fixture.clearPreserved();
ActivateEvent.addListener( folder, new ActivateAdapter() {
} );
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( folder );
hasListeners = ( Boolean )adapter.getPreserved( Props.ACTIVATE_LISTENER );
assertEquals( Boolean.TRUE, hasListeners );
Fixture.clearPreserved();
display.dispose();
}
public void testChangeSelection() {
Display display = new Display();
Shell shell = new Shell( display , SWT.MULTI );
CTabFolder folder = new CTabFolder( shell, SWT.MULTI );
folder.setSize( 100, 100 );
CTabItem item1 = new CTabItem( folder, SWT.NONE );
CTabItemControl item1Control = new CTabItemControl( folder, SWT.NONE );
item1.setControl( item1Control );
CTabItem item2 = new CTabItem( folder, SWT.NONE );
CTabItemControl item2Control = new CTabItemControl( folder, SWT.NONE );
item2.setControl( item2Control );
shell.open();
String displayId = DisplayUtil.getId( display );
String folderId = WidgetUtil.getId( folder );
String item2Id = WidgetUtil.getId( item2 );
// Let pass one startup request to init the 'system'
Fixture.fakeNewRequest();
Fixture.fakeRequestParam( RequestParams.UIROOT, displayId );
PhaseListenerRegistry.add( new PreserveWidgetsPhaseListener() );
PhaseListenerRegistry.add( new CurrentPhase.Listener() );
Fixture.executeLifeCycleFromServerThread( );
// The actual test request: item1 is selected, the request selects item2
folder.setSelection( item1 );
Fixture.fakeNewRequest();
Fixture.fakeRequestParam( RequestParams.UIROOT, displayId );
Fixture.fakeRequestParam( folderId + ".selectedItemId", item2Id );
Fixture.fakeRequestParam( JSConst.EVENT_WIDGET_SELECTED, folderId );
Fixture.executeLifeCycleFromServerThread( );
assertSame( item2, folder.getSelection() );
assertEquals( "visible=false", item1Control.markup.toString() );
assertEquals( "visible=true", item2Control.markup.toString() );
}
public void testSelectionEvent() {
final StringBuffer log = new StringBuffer();
SelectionListener listener = new SelectionAdapter() {
public void widgetSelected( final SelectionEvent event ) {
log.append( "widgetSelected|" );
}
};
Display display = new Display();
Shell shell = new Shell( display, SWT.NONE );
CTabFolder folder = new CTabFolder( shell, SWT.MULTI );
folder.addSelectionListener( listener );
CTabItem item1 = new CTabItem( folder, SWT.NONE );
CTabItem item2 = new CTabItem( folder, SWT.NONE );
// Select item1 and fake request that selects item2
folder.setSelection( item1 );
String folderId = WidgetUtil.getId( folder );
String item2Id = WidgetUtil.getId( item2 );
Fixture.fakeNewRequest();
Fixture.fakeRequestParam( JSConst.EVENT_WIDGET_SELECTED, folderId );
String name = folderId + "." + CTabFolderLCA.PARAM_SELECTED_ITEM_ID;
Fixture.fakeRequestParam( name, item2Id );
Fixture.readDataAndProcessAction( folder );
assertSame( item2, folder.getSelection() );
assertEquals( "widgetSelected|", log.toString() );
}
public void testShowListEvent() {
// Widgets for test
Display display= new Display();
Shell shell = new Shell( display, SWT.NONE );
final CTabFolder folder = new CTabFolder( shell, SWT.SINGLE );
folder.setSize( 30, 130 );
CTabItem item1 = new CTabItem( folder, SWT.NONE );
new CTabItem( folder, SWT.NONE );
//
Object adapter = folder.getAdapter( ICTabFolderAdapter.class );
final ICTabFolderAdapter folderAdapter = ( ICTabFolderAdapter )adapter;
final StringBuffer log = new StringBuffer();
CTabFolder2Listener listener = new CTabFolder2Adapter() {
public void showList( final CTabFolderEvent event ) {
assertEquals( true, event.doit );
log.append( "showList|" );
}
};
CTabFolder2Listener vetoListener = new CTabFolder2Adapter() {
public void showList( final CTabFolderEvent event ) {
Rectangle chevronRect = folderAdapter.getChevronRect();
Rectangle eventRet
= new Rectangle( event.x, event.y, event.width, event.height);
assertEquals( eventRet, chevronRect );
assertEquals( true, event.doit );
assertEquals( folder, event.getSource() );
log.append( "vetoShowList|" );
event.doit = false;
}
};
// Test showList event with listeners that prevents menu form showing
// Note: this test must run first since it relies on the fact that the
// showList menu wasn't populated by previous showList requests
folder.setSelection( item1 );
folder.addCTabFolder2Listener( vetoListener );
String folderId = WidgetUtil.getId( folder );
Fixture.fakeNewRequest();
Fixture.fakeRequestParam( CTabFolderLCA.EVENT_SHOW_LIST, folderId );
Fixture.readDataAndProcessAction( folder );
assertEquals( "vetoShowList|", log.toString() );
Menu menu = getShowListMenu( folder );
assertEquals( null, menu );
// clean up above test
folder.removeCTabFolder2Listener( vetoListener );
// Test showList event with listeners that does not veto showing
log.setLength( 0 );
folder.addCTabFolder2Listener( listener );
Fixture.fakeNewRequest();
Fixture.fakeRequestParam( CTabFolderLCA.EVENT_SHOW_LIST, folderId );
Fixture.readDataAndProcessAction( folder );
assertEquals( "showList|", log.toString() );
menu = getShowListMenu( folder );
assertEquals( 1, menu.getItemCount() );
}
private static Menu getShowListMenu( final CTabFolder folder ) {
Menu result = null;
try {
Field field = CTabFolder.class.getDeclaredField( "showMenu" );
field.setAccessible( true );
result = ( Menu )field.get( folder );
} catch( Exception e ) {
e.printStackTrace();
}
return result;
}
}