blob: eb23d9485373a1ebc9441e761e96c4db51f03099 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2002, 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.rwt.internal.lifecycle;
import static org.eclipse.rap.rwt.internal.lifecycle.WidgetLCAUtil.renderData;
import static org.eclipse.rap.rwt.internal.lifecycle.WidgetLCAUtil.renderListenKey;
import static org.eclipse.rap.rwt.internal.lifecycle.WidgetLCAUtil.renderListener;
import static org.eclipse.rap.rwt.internal.lifecycle.WidgetLCAUtil.renderToolTipMarkupEnabled;
import static org.eclipse.swt.internal.widgets.ControlUtil.getControlAdapter;
import org.eclipse.rap.rwt.internal.util.ActiveKeysUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.internal.widgets.ControlRemoteAdapter;
import org.eclipse.swt.internal.widgets.IControlAdapter;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Shell;
public class ControlLCAUtil {
private static final String PROP_ACTIVATE_LISTENER = "Activate";
private static final String PROP_DEACTIVATE_LISTENER = "Deactivate";
private static final String PROP_FOCUS_IN_LISTENER = "FocusIn";
private static final String PROP_FOCUS_OUT_LISTENER = "FocusOut";
private static final String PROP_MOUSE_DOWN_LISTENER = "MouseDown";
private static final String PROP_MOUSE_DOUBLE_CLICK_LISTENER = "MouseDoubleClick";
private static final String PROP_MOUSE_UP_LISTENER = "MouseUp";
private static final String PROP_TRAVERSE_LISTENER = "Traverse";
private static final String PROP_MENU_DETECT_LISTENER = "MenuDetect";
private static final String PROP_HELP_LISTENER = "Help";
private ControlLCAUtil() {
// prevent instance creation
}
public static void renderChanges( Control control ) {
ControlRemoteAdapter remoteAdapter = getRemoteAdapter( control );
IControlAdapter controlAdapter = getControlAdapter( control );
if( control instanceof Shell ) {
recalculateTabIndex( ( Shell ) control );
}
if( control instanceof Composite ) {
remoteAdapter.renderChildren( ( Composite )control );
}
remoteAdapter.renderBounds( controlAdapter );
remoteAdapter.renderTabIndex( control );
renderToolTipMarkupEnabled( control );
remoteAdapter.renderToolTipText( control );
remoteAdapter.renderMenu( control );
remoteAdapter.renderVisible( control );
remoteAdapter.renderEnabled( control );
remoteAdapter.renderOrientation( control );
remoteAdapter.renderForeground( controlAdapter );
remoteAdapter.renderBackground( controlAdapter );
remoteAdapter.renderBackgroundImage( controlAdapter );
remoteAdapter.renderFont( controlAdapter );
remoteAdapter.renderCursor( control );
renderData( control );
ActiveKeysUtil.renderActiveKeys( control );
ActiveKeysUtil.renderCancelKeys( control );
renderListenActivate( control );
renderListenMouse( control );
renderListenFocus( control );
renderListenKey( control );
renderListenTraverse( control );
renderListenMenuDetect( control );
renderListenHelp( control );
}
private static void recalculateTabIndex( Shell shell ) {
resetTabIndices( shell );
// tabIndex must be a positive value
computeTabIndices( shell, 1 );
}
private static void resetTabIndices( Composite composite ) {
for( Control control : composite.getChildren() ) {
getControlAdapter( control ).setTabIndex( -1 );
if( control instanceof Composite ) {
resetTabIndices( ( Composite )control );
}
}
}
private static int computeTabIndices( Composite composite, int startIndex ) {
int result = startIndex;
for( Control control : composite.getTabList() ) {
getControlAdapter( control ).setTabIndex( result );
// for Links, leave a range out to be assigned to hrefs on the client
result += control instanceof Link ? 300 : 1;
if( control instanceof Composite ) {
result = computeTabIndices( ( Composite )control, result );
}
}
return result;
}
private static void renderListenActivate( Control control ) {
// Note: Shell "Activate" event is handled by ShellLCA
if( !( control instanceof Shell ) ) {
renderListener( control, SWT.Activate, PROP_ACTIVATE_LISTENER );
renderListener( control, SWT.Deactivate, PROP_DEACTIVATE_LISTENER );
}
}
private static void renderListenMouse( Control control ) {
renderListener( control, SWT.MouseDown, PROP_MOUSE_DOWN_LISTENER );
renderListener( control, SWT.MouseUp, PROP_MOUSE_UP_LISTENER );
renderListener( control, SWT.MouseDoubleClick, PROP_MOUSE_DOUBLE_CLICK_LISTENER );
}
private static void renderListenFocus( Control control ) {
if( ( control.getStyle() & SWT.NO_FOCUS ) == 0 ) {
renderListener( control, SWT.FocusIn, PROP_FOCUS_IN_LISTENER );
renderListener( control, SWT.FocusOut, PROP_FOCUS_OUT_LISTENER );
}
}
private static void renderListenTraverse( Control control ) {
renderListener( control, SWT.Traverse, PROP_TRAVERSE_LISTENER );
}
private static void renderListenMenuDetect( Control control ) {
renderListener( control, SWT.MenuDetect, PROP_MENU_DETECT_LISTENER );
}
private static void renderListenHelp( Control control ) {
renderListener( control, SWT.Help, PROP_HELP_LISTENER );
}
private static ControlRemoteAdapter getRemoteAdapter( Control control ) {
return ( ControlRemoteAdapter )control.getAdapter( RemoteAdapter.class );
}
}