/******************************************************************************* * Copyright (c) 2010 EclipseSource 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: * EclipseSource - initial API and implementation *******************************************************************************/ package org.eclipse.rwt.internal.protocol; import java.util.HashMap; import java.util.Map; import org.eclipse.rwt.internal.service.ContextProvider; import org.eclipse.rwt.internal.service.IServiceStateInfo; import org.eclipse.rwt.lifecycle.WidgetUtil; import org.eclipse.rwt.protocol.IWidgetSynchronizer; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Widget; public class WidgetSynchronizer implements IWidgetSynchronizer { private static final String SYNCHRONIZER_MAP_KEY = "synchronizerMapKey"; private Widget widget; //prevent instantiation private WidgetSynchronizer( final Widget widget ) { this.widget = widget; } public static IWidgetSynchronizer getSynchronizerForWidget( final Widget widget ) { IServiceStateInfo stateInfo = ContextProvider.getStateInfo(); IWidgetSynchronizer result; Map map = ( Map )stateInfo.getAttribute( SYNCHRONIZER_MAP_KEY ); if( map == null ) { map = new HashMap(); stateInfo.setAttribute( SYNCHRONIZER_MAP_KEY, map ); } if( map.containsKey( widget ) ) { result = ( IWidgetSynchronizer )map.get( widget ); } else { result = new WidgetSynchronizer( widget ); map.put( widget, result ); } return result; } private ProtocolMessageWriter getProtocolMessageWriter() { return ContextProvider.getStateInfo().getProtocolMessageWriter(); } public void newWidget( final String[] styles ) { newWidget( styles, null ); } public void newWidget( String[] styles, final Object[] arguments ) { ProtocolMessageWriter writer = getProtocolMessageWriter(); String parentId = null; if( widget instanceof Control ) { Composite parent = ( ( Control )widget ).getParent(); if( parent != null ) { parentId = WidgetUtil.getId( parent ); } else { parentId = null; } } writer.addConstructPayload( WidgetUtil.getId( widget ), parentId, widget.getClass().getName(), styles, arguments ); } public void disposeWidget() { ProtocolMessageWriter writer = getProtocolMessageWriter(); writer.addDestroyPaylod( WidgetUtil.getId( widget ) ); } public void setWidgetProperty( final String name, final int value ) { setWidgetProperty( name, new Integer( value ) ); } public void setWidgetProperty( final String name, final double value ) { setWidgetProperty( name, new Double( value ) ); } public void setWidgetProperty( final String name, final boolean value ) { setWidgetProperty( name, new Boolean( value ) ); } public void setWidgetProperty( final String name, final String value ) { setWidgetProperty( name, ( Object )value ); } public void setWidgetProperty( final String name, final Object value ) { ProtocolMessageWriter writer = getProtocolMessageWriter(); writer.appendPayload( WidgetUtil.getId( widget ), IProtocolConstants.PAYLOAD_SYNCHRONIZE, name, value ); } public void addListener( final String listenerName ) { appendListenPayload( listenerName, true ); } public void removeListener( final String listenerName ) { appendListenPayload( listenerName, false ); } private void appendListenPayload( final String listenerName, final boolean shouldListen ) { ProtocolMessageWriter writer = getProtocolMessageWriter(); writer.appendPayload( WidgetUtil.getId( widget ), IProtocolConstants.PAYLOAD_LISTEN, listenerName, new Boolean( shouldListen ) ); } public void call( final String methodName ) { call( methodName, null ); } public void call( final String methodName, final Object[] arguments ) { ProtocolMessageWriter writer = getProtocolMessageWriter(); writer.addExecutePayload( WidgetUtil.getId( widget ), methodName, arguments ); } public void executeScript( final String scriptType, final String script ) { ProtocolMessageWriter writer = getProtocolMessageWriter(); writer.addExecuteScript( WidgetUtil.getId( widget ), scriptType, script ); } }