/*******************************************************************************
* Copyright (c) 2002, 2017 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.custom.ctabfolderkit;
import static org.eclipse.rap.rwt.internal.lifecycle.WidgetLCAUtil.getStyles;
import static org.eclipse.rap.rwt.internal.lifecycle.WidgetLCAUtil.preserveProperty;
import static org.eclipse.rap.rwt.internal.lifecycle.WidgetLCAUtil.renderListenDefaultSelection;
import static org.eclipse.rap.rwt.internal.lifecycle.WidgetLCAUtil.renderProperty;
import static org.eclipse.rap.rwt.internal.protocol.JsonUtil.createJsonArray;
import static org.eclipse.rap.rwt.internal.protocol.RemoteObjectFactory.createRemoteObject;
import static org.eclipse.rap.rwt.internal.protocol.RemoteObjectFactory.getRemoteObject;
import static org.eclipse.rap.rwt.remote.JsonMapping.toJson;
import java.io.IOException;
import org.eclipse.rap.json.JsonArray;
import org.eclipse.rap.json.JsonValue;
import org.eclipse.rap.rwt.internal.lifecycle.WidgetLCA;
import org.eclipse.rap.rwt.internal.lifecycle.ControlLCAUtil;
import org.eclipse.rap.rwt.internal.lifecycle.WidgetLCAUtil;
import org.eclipse.rap.rwt.internal.lifecycle.WidgetUtil;
import org.eclipse.rap.rwt.remote.RemoteObject;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.internal.custom.ICTabFolderAdapter;
import org.eclipse.swt.internal.widgets.IWidgetGraphicsAdapter;
import org.eclipse.swt.widgets.Control;
public final class CTabFolderLCA extends WidgetLCA<CTabFolder> {
public static final CTabFolderLCA INSTANCE = new CTabFolderLCA();
private static final String TYPE = "rwt.widgets.CTabFolder";
private static final String[] ALLOWED_STYLES = {
"CLOSE", "FLAT", "SINGLE", "MULTI", "NO_RADIO_GROUP", "BORDER"
};
// Property names
private static final String PROP_TOOLTIP_TEXTS = "toolTipTexts";
private static final String PROP_TAB_POSITION = "tabPosition";
private static final String PROP_TAB_HEIGHT = "tabHeight";
private static final String PROP_MIN_MAX_STATE = "minMaxState";
private static final String PROP_MINIMIZE_BOUNDS = "minimizeBounds";
private static final String PROP_MINIMIZE_VISIBLE = "minimizeVisible";
private static final String PROP_MAXIMIZE_BOUNDS = "maximizeBounds";
private static final String PROP_MAXIMIZE_VISIBLE = "maximizeVisible";
private static final String PROP_CHEVRON_BOUNDS = "chevronBounds";
private static final String PROP_CHEVRON_VISIBLE = "chevronVisible";
private static final String PROP_UNSELECTED_CLOSE_VISIBLE = "unselectedCloseVisible";
private static final String PROP_SELECTION = "selection";
private static final String PROP_SELECTION_BACKGROUND = "selectionBackground";
private static final String PROP_SELECTION_FOREGROUND = "selectionForeground";
private static final String PROP_SELECTION_BACKGROUND_IMAGE = "selectionBackgroundImage";
private static final String PROP_SELECTION_BG_GRADIENT = "selectionBackgroundGradient";
private static final String PROP_SELECTION_BG_GRADIENT_COLORS
= "selectionBgGradientColors";
private static final String PROP_SELECTION_BG_GRADIENT_PERCENTS
= "selectionBgGradientPercents";
private static final String PROP_SELECTION_BG_GRADIENT_VERTICAL
= "selectionBgGradientVertical";
private static final String PROP_BORDER_VISIBLE = "borderVisible";
private static final String PROP_FOLDER_LISTENER = "Folder";
private static final String PROP_SELECTION_LISTENER = "Selection";
private static final String DEFAULT_TAB_POSITION = "top";
private static final int DEFAULT_TAB_HEIGHT = 0;
private static final String DEFAULT_MIN_MAX_STATE = "normal";
private static final Rectangle ZERO_BOUNDS = new Rectangle( 0, 0, 0, 0 );
@Override
public void preserveValues( CTabFolder folder ) {
preserveProperty( folder, PROP_TAB_POSITION, getTabPosition( folder ) );
preserveProperty( folder, PROP_TAB_HEIGHT, folder.getTabHeight() );
preserveProperty( folder, PROP_MIN_MAX_STATE, getMinMaxState( folder ) );
preserveProperty( folder, PROP_MINIMIZE_BOUNDS, getMinimizeBounds( folder ) );
preserveProperty( folder, PROP_MINIMIZE_VISIBLE, folder.getMinimizeVisible() );
preserveProperty( folder, PROP_MAXIMIZE_BOUNDS, getMaximizeBounds( folder ) );
preserveProperty( folder, PROP_MAXIMIZE_VISIBLE, folder.getMaximizeVisible() );
preserveProperty( folder, PROP_CHEVRON_BOUNDS, getChevronBounds( folder ) );
preserveProperty( folder, PROP_CHEVRON_VISIBLE, getChevronVisible( folder ) );
preserveProperty( folder, PROP_UNSELECTED_CLOSE_VISIBLE, folder.getUnselectedCloseVisible() );
preserveProperty( folder, PROP_SELECTION, folder.getSelection() );
preserveProperty( folder, PROP_SELECTION_BACKGROUND, getSelectionBackground( folder ) );
preserveProperty( folder, PROP_SELECTION_FOREGROUND, getSelectionForeground( folder ) );
preserveProperty( folder,
PROP_SELECTION_BACKGROUND_IMAGE,
getSelectionBackgroundImage( folder ) );
preserveSelectionBgGradient( folder );
preserveProperty( folder, PROP_BORDER_VISIBLE, folder.getBorderVisible() );
}
@Override
public void renderInitialization( CTabFolder folder ) throws IOException {
RemoteObject remoteObject = createRemoteObject( folder, TYPE );
remoteObject.setHandler( new CTabFolderOperationHandler( folder ) );
remoteObject.set( "parent", WidgetUtil.getId( folder.getParent() ) );
remoteObject.set( "style", createJsonArray( getStyles( folder, ALLOWED_STYLES ) ) );
JsonArray toolTipTexts = new JsonArray()
.add( SWT.getMessage( "SWT_Minimize" ) )
.add( SWT.getMessage( "SWT_Maximize" ) )
.add( SWT.getMessage( "SWT_Restore" ) )
.add( SWT.getMessage( "SWT_ShowList" ) )
.add( SWT.getMessage( "SWT_Close" ) );
remoteObject.set( PROP_TOOLTIP_TEXTS, toolTipTexts );
// Always listen for Selection and Folder.
// Currently required for item's control visibility and bounds update.
remoteObject.listen( PROP_SELECTION_LISTENER, true );
// Currently required for always sending close/showList notify operations.
remoteObject.listen( PROP_FOLDER_LISTENER, true );
}
@Override
public void renderChanges( CTabFolder folder ) throws IOException {
ControlLCAUtil.renderChanges( folder );
WidgetLCAUtil.renderCustomVariant( folder );
renderProperty( folder, PROP_TAB_POSITION, getTabPosition( folder ), DEFAULT_TAB_POSITION );
renderProperty( folder, PROP_TAB_HEIGHT, folder.getTabHeight(), DEFAULT_TAB_HEIGHT );
renderProperty( folder, PROP_MIN_MAX_STATE, getMinMaxState( folder ), DEFAULT_MIN_MAX_STATE );
renderProperty( folder, PROP_MINIMIZE_BOUNDS, getMinimizeBounds( folder ), ZERO_BOUNDS );
renderProperty( folder, PROP_MINIMIZE_VISIBLE, folder.getMinimizeVisible(), false );
renderProperty( folder, PROP_MAXIMIZE_BOUNDS, getMaximizeBounds( folder ), ZERO_BOUNDS );
renderProperty( folder, PROP_MAXIMIZE_VISIBLE, folder.getMaximizeVisible(), false );
renderProperty( folder, PROP_CHEVRON_BOUNDS, getChevronBounds( folder ), ZERO_BOUNDS );
renderProperty( folder, PROP_CHEVRON_VISIBLE, getChevronVisible( folder ), false );
renderProperty( folder,
PROP_UNSELECTED_CLOSE_VISIBLE,
folder.getUnselectedCloseVisible(),
true );
renderProperty( folder, PROP_SELECTION, folder.getSelection(), null );
renderProperty( folder, PROP_SELECTION_BACKGROUND, getSelectionBackground( folder ), null );
renderProperty( folder, PROP_SELECTION_FOREGROUND, getSelectionForeground( folder ), null );
renderProperty( folder,
PROP_SELECTION_BACKGROUND_IMAGE,
getSelectionBackgroundImage( folder ),
null);
renderSelectionBackgroundGradient( folder );
renderProperty( folder, PROP_BORDER_VISIBLE, folder.getBorderVisible(), false );
renderListenDefaultSelection( folder );
}
@Override
public void doRedrawFake( Control control ) {
CTabFolder folder = ( CTabFolder )control;
getCTabFolderAdapter( folder ).doRedraw();
}
/////////////////////////////////////////
// Helping methods to preserve properties
private static void preserveSelectionBgGradient( CTabFolder folder ) {
ICTabFolderAdapter adapter = getCTabFolderAdapter( folder );
IWidgetGraphicsAdapter gfxAdapter = adapter.getUserSelectionBackgroundGradient();
Color[] bgGradientColors = gfxAdapter.getBackgroundGradientColors();
int[] bgGradientPercents = gfxAdapter.getBackgroundGradientPercents();
Boolean bgGradientVertical = Boolean.valueOf( gfxAdapter.isBackgroundGradientVertical() );
preserveProperty( folder, PROP_SELECTION_BG_GRADIENT_COLORS, bgGradientColors );
preserveProperty( folder, PROP_SELECTION_BG_GRADIENT_PERCENTS, bgGradientPercents );
preserveProperty( folder, PROP_SELECTION_BG_GRADIENT_VERTICAL, bgGradientVertical );
}
//////////////////////////////////////
// Helping methods to write properties
private static void renderSelectionBackgroundGradient( CTabFolder folder ) {
ICTabFolderAdapter adapter = getCTabFolderAdapter( folder );
IWidgetGraphicsAdapter gfxAdapter = adapter.getUserSelectionBackgroundGradient();
Color[] bgGradientColors = gfxAdapter.getBackgroundGradientColors();
int[] bgGradientPercents = gfxAdapter.getBackgroundGradientPercents();
Boolean bgGradientVertical = Boolean.valueOf( gfxAdapter.isBackgroundGradientVertical() );
boolean hasChanged = WidgetLCAUtil.hasChanged( folder,
PROP_SELECTION_BG_GRADIENT_COLORS,
bgGradientColors,
null )
|| WidgetLCAUtil.hasChanged( folder,
PROP_SELECTION_BG_GRADIENT_PERCENTS,
bgGradientPercents,
null )
|| WidgetLCAUtil.hasChanged( folder,
PROP_SELECTION_BG_GRADIENT_VERTICAL,
bgGradientVertical,
Boolean.FALSE );
if( hasChanged ) {
JsonValue gradient = JsonValue.NULL;
if( bgGradientColors != null ) {
JsonArray colors = new JsonArray();
for( int i = 0; i < bgGradientColors.length; i++ ) {
colors.add( toJson( bgGradientColors[ i ] ) );
}
JsonValue percents = createJsonArray( bgGradientPercents );
gradient = new JsonArray()
.add( colors )
.add( percents )
.add( bgGradientVertical.booleanValue() );
}
getRemoteObject( folder ).set( PROP_SELECTION_BG_GRADIENT, gradient );
}
}
//////////////////
// Helping methods
private static String getTabPosition( CTabFolder folder ) {
return folder.getTabPosition() == SWT.TOP ? "top" : "bottom";
}
private static String getMinMaxState( CTabFolder folder ) {
String result = "normal";
if( folder.getMinimized() ) {
result = "min";
} else if( folder.getMaximized() ) {
result = "max";
}
return result;
}
private static Rectangle getMinimizeBounds( CTabFolder folder ) {
return getCTabFolderAdapter( folder ).getMinimizeRect();
}
private static Rectangle getMaximizeBounds( CTabFolder folder ) {
return getCTabFolderAdapter( folder ).getMaximizeRect();
}
private static Rectangle getChevronBounds( CTabFolder folder ) {
return getCTabFolderAdapter( folder ).getChevronRect();
}
private static boolean getChevronVisible( CTabFolder folder ) {
return getCTabFolderAdapter( folder ).getChevronVisible();
}
private static Color getSelectionBackground( CTabFolder folder ) {
return getCTabFolderAdapter( folder ).getUserSelectionBackground();
}
private static Color getSelectionForeground( CTabFolder folder ) {
return getCTabFolderAdapter( folder ).getUserSelectionForeground();
}
private static Image getSelectionBackgroundImage( CTabFolder folder ) {
return getCTabFolderAdapter( folder ).getUserSelectionBackgroundImage();
}
private static ICTabFolderAdapter getCTabFolderAdapter( CTabFolder folder ) {
return folder.getAdapter( ICTabFolderAdapter.class );
}
private CTabFolderLCA() {
// prevent instantiation
}
}