/*******************************************************************************
* Copyright (c) 2007, 2016 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.rap.demo.controls;
import java.util.Iterator;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
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.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.Text;
public class CTabFolderTab extends ExampleTab {
protected static final int MAX_ITEMS = 3;
private static final String PROP_CONTEXT_MENU = "contextMenu";
private static final String CTAB_IMAGE_PATH = "resources/newfolder_wiz.gif";
private Image ctabImage;
private CTabFolder folder;
private boolean showClose;
private boolean unselectedCloseVisible;
private boolean setImage;
private boolean unselectedImageVisible;
private boolean showTopRightControl;
private boolean minVisible;
private boolean maxVisible;
private int selFgIndex;
private int selBgIndex;
private int tabHeight = -1;
private boolean showSelectionBgGradient = false;
private boolean showSelectionBgImage = false;
private boolean customFontOnItem;
private Font customFont;
private Button[] tabRadios;
public CTabFolderTab() {
super( "CTabFolder" );
}
@Override
protected void createStyleControls( Composite parent ) {
createStyleButton( "FLAT", SWT.FLAT );
createStyleButton( "BORDER", SWT.BORDER );
createStyleButton( "TOP", SWT.TOP );
createStyleButton( "BOTTOM", SWT.BOTTOM );
createStyleButton( "CLOSE", SWT.CLOSE );
createStyleButton( "SINGLE", SWT.SINGLE );
createStyleButton( "MULTI", SWT.MULTI );
createOrientationButton();
createVisibilityButton();
createEnablementButton();
createFontChooser();
createFgColorButton();
createBgColorButton();
createSelectionFgColorButton();
createSelectionBgColorButton();
createSelectionBgGradientButton();
createSelectionBgImageButton();
createBgImageButton();
createTabHeightControl( styleComp );
createTopRightControl( styleComp );
final Button cbMin = createPropertyButton( "Minimize visible", SWT.CHECK );
cbMin.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
minVisible = cbMin.getSelection();
updateProperties();
}
} );
final Button cbMax = createPropertyButton( "Maximize visible", SWT.CHECK );
cbMax.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
maxVisible = cbMax.getSelection();
updateProperties();
}
} );
tabRadios = new Button[ MAX_ITEMS ];
for( int i = 0; i < MAX_ITEMS; i++ ) {
final int index = i;
String rbText = "Select " + folder.getItem( index ).getText();
tabRadios[ i ] = createPropertyButton( rbText, SWT.RADIO );
tabRadios[ i ].addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
Button radio = ( Button )event.getSource();
if( radio.getSelection() ) {
folder.setSelection( index );
}
}
} );
}
tabRadios[ 0 ].setSelection( true );
String text = "Set Image";
Button cbSetImage = createPropertyButton( text, SWT.CHECK );
cbSetImage.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
Button button = ( Button )event.widget;
setImage = button.getSelection();
updateProperties();
}
} );
text = "UnselectedImageVisible";
Button cbUnselectedImageVisible = createPropertyButton( text, SWT.CHECK );
cbUnselectedImageVisible.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
Button button = ( Button )event.widget;
unselectedImageVisible = button.getSelection();
updateProperties();
}
} );
text = "UnselectedCloseVisible";
Button cbUnselectedCloseVisible = createPropertyButton( text, SWT.CHECK );
cbUnselectedCloseVisible.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
Button button = ( Button )event.widget;
unselectedCloseVisible = button.getSelection();
updateProperties();
}
} );
text = "showClose on Tab 2";
Button cbShowClose = createPropertyButton( text, SWT.CHECK );
cbShowClose.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
Button button = ( Button )event.widget;
showClose = button.getSelection();
updateProperties();
}
} );
text = "Custom font on Tab 2";
Button cbCustomFont = createPropertyButton( text, SWT.CHECK );
cbCustomFont.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
Button button = ( Button )event.widget;
customFontOnItem = button.getSelection();
updateProperties();
}
} );
createPropertyCheckbox( "Add Context Menu", PROP_CONTEXT_MENU );
text = "Switch tabPosition";
Button btnSwitchTabPosition = createPropertyButton( text, SWT.PUSH );
btnSwitchTabPosition.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
boolean isTop = folder.getTabPosition() == SWT.TOP;
folder.setTabPosition( isTop ? SWT.BOTTOM : SWT.TOP );
}
} );
Button borderVisibleButton = createPropertyButton( "Switch borderVisible", SWT.PUSH );
borderVisibleButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
folder.setBorderVisible( !folder.getBorderVisible() );
}
} );
Button btnAddTabItem = new Button( parent, SWT.PUSH );
btnAddTabItem.setText( "Add Item (SWT.NONE)" );
btnAddTabItem.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
createTabItem( SWT.NONE );
}
} );
Button btnAddCloseableTabItem = new Button( parent, SWT.PUSH );
btnAddCloseableTabItem.setText( "Add Item (SWT.CLOSE)" );
btnAddCloseableTabItem.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
createTabItem( SWT.CLOSE );
}
} );
createSetFirstItemBadge( parent );
}
@Override
protected void createExampleControls( Composite parent ) {
GridLayout layout = new GridLayout();
layout.marginHeight = 5;
layout.marginWidth = 5;
parent.setLayout( layout );
folder = new CTabFolder( parent, getStyle() );
folder.setLayoutData( new GridData( 300, 300 ) );
for( int i = 0; i < 3; i++ ) {
createTabItem( SWT.NONE );
}
folder.setSelection( 0 );
folder.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
CTabItem item = ( CTabItem )event.item;
if( tabRadios != null ) {
int index = item.getParent().indexOf( item );
for( int i = 0; i < MAX_ITEMS; i++ ) {
tabRadios[ i ].setSelection( index == i );
}
}
}
@Override
public void widgetDefaultSelected( SelectionEvent event ) {
}
} );
registerControl( folder );
if( tabHeight >= 0 ) {
folder.setTabHeight( tabHeight );
}
updateContextMenu();
updateTopRightControl();
updateProperties();
updateSelFgColor();
updateSelBgGradient();
updateSelBgColor();
updateSelBgImage();
}
private void createTabItem( int style ) {
CTabItem item = new CTabItem( folder, style );
int count = folder.getItemCount();
item.setText( "Tab " + count );
if( setImage ) {
ctabImage = Util.loadImage( item.getDisplay(), CTAB_IMAGE_PATH );
item.setImage( ctabImage );
} else {
item.setImage( null );
}
if( count != 3 ) {
Text content = new Text( folder, SWT.WRAP | SWT.MULTI );
if( count % 2 != 0 ) {
content.setBackground( bgColors[ BG_COLOR_BROWN ] );
content.setForeground( fgColors[ FG_COLOR_BLUE ] );
}
content.setText( "Some Content " + count );
item.setControl( content );
}
}
private void createTabHeightControl( Composite parent ) {
Composite composite = new Composite( parent, SWT.NONE );
composite.setLayout( new GridLayout( 3, false ) );
Label label = new Label( composite, SWT.NONE );
label.setText( "Tab Height" );
final Spinner spinner = new Spinner( composite, SWT.BORDER );
spinner.setSelection( folder.getTabHeight() );
spinner.setMinimum( 0 );
spinner.setMaximum( 100 );
spinner.addModifyListener( new ModifyListener() {
@Override
public void modifyText( ModifyEvent event ) {
tabHeight = spinner.getSelection();
folder.setTabHeight( tabHeight );
}
} );
}
private void createTopRightControl( Composite parent ) {
final Button button = new Button( parent, SWT.CHECK );
button.setText( "Top Right Control" );
button.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
showTopRightControl = button.getSelection();
updateTopRightControl();
}
} );
}
private Button createSelectionFgColorButton() {
final Button button = new Button( styleComp, SWT.PUSH );
button.setText( "Selection Foreground" );
button.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
selFgIndex = ( selFgIndex + 1 ) % fgColors.length;
updateSelFgColor();
}
} );
return button;
}
private Button createSelectionBgColorButton() {
final Button button = new Button( styleComp, SWT.PUSH );
button.setText( "Selection Background" );
button.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
selBgIndex = ( selBgIndex + 1 ) % bgColors.length;
updateSelBgColor();
}
} );
return button;
}
private Button createSelectionBgGradientButton() {
final Button button = new Button( styleComp, SWT.CHECK );
button.setText( "Selection Background Gradient" );
button.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
showSelectionBgGradient = button.getSelection();
updateSelBgGradient();
}
} );
return button;
}
private Button createSelectionBgImageButton() {
final Button button = new Button( styleComp, SWT.CHECK );
button.setText( "Selection Background Image" );
button.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
showSelectionBgImage = button.getSelection();
updateSelBgImage();
}
} );
return button;
}
private void createSetFirstItemBadge( Composite parent ) {
Composite composite = new Composite( parent, SWT.NONE );
composite.setLayout( new GridLayout( 3, false ) );
new Label( composite, SWT.NONE ).setText( "Badge:" );
final Text text = new Text( composite, SWT.BORDER );
Listener setBadgeListener = new Listener() {
@Override
public void handleEvent( Event event ) {
if( folder.getItemCount() > 0 ) {
folder.getItem( 0 ).setData( RWT.BADGE, text.getText() );
}
}
};
Button button = new Button( composite, SWT.PUSH );
button.setText( "Set" );
button.addListener( SWT.Selection, setBadgeListener );
text.addListener( SWT.DefaultSelection, setBadgeListener );
}
private void updateProperties() {
CTabItem[] items = folder.getItems();
for( int i = 0; i < items.length; i++ ) {
if( setImage ) {
ctabImage = Util.loadImage( folder.getDisplay(), CTAB_IMAGE_PATH );
items[ i ].setImage( ctabImage );
} else {
items[ i ].setImage( null );
}
}
if( items.length > 1 ) {
items[ 1 ].setShowClose( showClose );
items[ 1 ].setFont( customFontOnItem ? getCustomFont( folder.getDisplay() ) : null );
}
folder.setMinimizeVisible( minVisible );
folder.setMaximizeVisible( maxVisible );
folder.setUnselectedCloseVisible( unselectedCloseVisible );
folder.setUnselectedImageVisible( unselectedImageVisible );
}
private Font getCustomFont( Display display ) {
if( customFont == null ) {
customFont = new Font( display, "Courier", 12, SWT.ITALIC );
}
return customFont;
}
private void updateTopRightControl() {
if( showTopRightControl ) {
Label label = new Label( folder, SWT.NONE );
label.setText( "topRight" );
Display display = label.getDisplay();
label.setBackground( display.getSystemColor( SWT.COLOR_DARK_CYAN ) );
folder.setTopRight( label );
} else {
Control topRight = folder.getTopRight();
if( topRight != null && !topRight.isDisposed() ) {
topRight.dispose();
}
folder.setTopRight( null );
}
}
private void updateSelFgColor() {
Iterator<Control> iter = controls.iterator();
while( iter.hasNext() ) {
Control control = iter.next();
if( control instanceof CTabFolder ) {
CTabFolder folder = ( CTabFolder )control;
folder.setSelectionForeground( fgColors[ selFgIndex ] );
}
}
}
private void updateSelBgColor() {
Iterator<Control> iter = controls.iterator();
while( iter.hasNext() ) {
Control control = iter.next();
if( control instanceof CTabFolder ) {
CTabFolder folder = ( CTabFolder )control;
folder.setSelectionBackground( bgColors[ selBgIndex ] );
}
}
}
private void updateSelBgGradient() {
Iterator<Control> iter = controls.iterator();
while( iter.hasNext() ) {
Control control = iter.next();
if( control instanceof CTabFolder ) {
CTabFolder folder = ( CTabFolder )control;
if( showSelectionBgGradient ) {
Color[] colors = new Color[] {
gradientColors[ BGG_COLOR_BLUE ],
gradientColors[ BGG_COLOR_GREEN ],
gradientColors[ BGG_COLOR_BLUE ]
};
int[] percents = new int[] { 50, 100 };
folder.setSelectionBackground( colors, percents );
} else {
folder.setSelectionBackground( null, null );
}
}
}
}
private void updateSelBgImage() {
for( Control control : controls ) {
if( control instanceof CTabFolder ) {
CTabFolder folder = ( CTabFolder )control;
Image image = Util.loadImage( control.getDisplay(), "resources/pattern.png" );
if( showSelectionBgImage ) {
folder.setSelectionBackground( image );
} else {
folder.setSelectionBackground( ( Image )null );
}
}
}
}
private void updateContextMenu() {
if( hasCreateProperty( PROP_CONTEXT_MENU ) ) {
Menu folderMenu = new Menu( folder );
MenuItem folderMenuItem = new MenuItem( folderMenu, SWT.PUSH );
folderMenuItem.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
String message = "You requested a context menu for the CTabFolder";
MessageDialog.openInformation( folder.getShell(), "Information", message );
}
} );
folderMenuItem.setText( "CTabFolder context menu item" );
folder.setMenu( folderMenu );
}
}
}