From badc5c3ee400b1225145de6532004b36d4ad14b9 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Mon, 23 Apr 2012 21:48:02 +0300 Subject: Initial support for sending difference in state (#8419) Forces the shared state to be the type declared by getStateType (#8677) Creates an empty object for reference when doing a full repaint, causing only the differences between a freshly created object and the current state to be sent. --- .../terminal/gwt/client/ApplicationConnection.java | 15 +++- .../gwt/client/communication/JSONSerializer.java | 4 +- .../gwt/client/communication/JsonDecoder.java | 38 ++++++---- .../gwt/client/communication/JsonEncoder.java | 2 +- .../communication/URLReference_Serializer.java | 12 +-- .../gwt/server/AbstractCommunicationManager.java | 36 +++++++-- .../terminal/gwt/server/ClientConnector.java | 9 +++ .../terminal/gwt/server/DragAndDropService.java | 4 + src/com/vaadin/terminal/gwt/server/JsonCodec.java | 85 ++++++++++++++++++---- .../gwt/widgetsetutils/SerializerGenerator.java | 61 +++++++++++++--- src/com/vaadin/ui/AbstractComponent.java | 25 ++++--- src/com/vaadin/ui/Root.java | 5 +- 12 files changed, 225 insertions(+), 71 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java b/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java index 739c232a72..18b1afd813 100644 --- a/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java +++ b/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java @@ -43,6 +43,7 @@ import com.vaadin.terminal.gwt.client.communication.JsonDecoder; import com.vaadin.terminal.gwt.client.communication.JsonEncoder; import com.vaadin.terminal.gwt.client.communication.MethodInvocation; import com.vaadin.terminal.gwt.client.communication.RpcManager; +import com.vaadin.terminal.gwt.client.communication.SerializerMap; import com.vaadin.terminal.gwt.client.communication.SharedState; import com.vaadin.terminal.gwt.client.communication.StateChangeEvent; import com.vaadin.terminal.gwt.client.ui.AbstractComponentConnector; @@ -102,6 +103,9 @@ public class ApplicationConnection { public static final String PARAM_UNLOADBURST = "onunloadburst"; + private static SerializerMap serializerMap = GWT + .create(SerializerMap.class); + /** * A string that, if found in a non-JSON response to a UIDL request, will * cause the browser to refresh the page. If followed by a colon, optional @@ -1414,8 +1418,8 @@ public class ApplicationConnection { states.getJavaScriptObject(connectorId)); Object state = JsonDecoder.decodeValue( - stateDataAndType, connectorMap, - ApplicationConnection.this); + stateDataAndType, connector.getState(), + connectorMap, ApplicationConnection.this); connector.setState((SharedState) state); StateChangeEvent event = GWT @@ -1569,7 +1573,8 @@ public class ApplicationConnection { Object[] parameters = new Object[parametersJson.size()]; for (int j = 0; j < parametersJson.size(); ++j) { parameters[j] = JsonDecoder.decodeValue( - (JSONArray) parametersJson.get(j), getConnectorMap(), this); + (JSONArray) parametersJson.get(j), null, getConnectorMap(), + this); } return new MethodInvocation(connectorId, interfaceName, methodName, parameters); @@ -2439,4 +2444,8 @@ public class ApplicationConnection { LayoutManager getLayoutManager() { return layoutManager; } + + public SerializerMap getSerializerMap() { + return serializerMap; + } } diff --git a/src/com/vaadin/terminal/gwt/client/communication/JSONSerializer.java b/src/com/vaadin/terminal/gwt/client/communication/JSONSerializer.java index c626d31d0a..5f82e339f4 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/JSONSerializer.java +++ b/src/com/vaadin/terminal/gwt/client/communication/JSONSerializer.java @@ -33,12 +33,14 @@ public interface JSONSerializer { * * @param jsonValue * JSON map from property name to property value + * @param target + * The object to write the deserialized values to * @param idMapper * mapper from paintable id to paintable, used to decode * references to paintables * @return A deserialized object */ - T deserialize(JSONObject jsonValue, ConnectorMap idMapper, + T deserialize(JSONObject jsonValue, T target, ConnectorMap idMapper, ApplicationConnection connection); /** diff --git a/src/com/vaadin/terminal/gwt/client/communication/JsonDecoder.java b/src/com/vaadin/terminal/gwt/client/communication/JsonDecoder.java index 2b58c13f3e..790b5cb305 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/JsonDecoder.java +++ b/src/com/vaadin/terminal/gwt/client/communication/JsonDecoder.java @@ -12,7 +12,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import com.google.gwt.core.client.GWT; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONString; @@ -33,7 +32,6 @@ import com.vaadin.terminal.gwt.client.ServerConnector; * @since 7.0 */ public class JsonDecoder { - static SerializerMap serializerMap = GWT.create(SerializerMap.class); /** * Decode a JSON array with two elements (type and value) into a client-side @@ -48,14 +46,15 @@ public class JsonDecoder { * reference to the current ApplicationConnection * @return decoded value (does not contain JSON types) */ - public static Object decodeValue(JSONArray jsonArray, + public static Object decodeValue(JSONArray jsonArray, Object target, ConnectorMap idMapper, ApplicationConnection connection) { String type = ((JSONString) jsonArray.get(0)).stringValue(); - return decodeValue(type, jsonArray.get(1), idMapper, connection); + return decodeValue(type, jsonArray.get(1), target, idMapper, connection); } private static Object decodeValue(String variableType, Object value, - ConnectorMap idMapper, ApplicationConnection connection) { + Object target, ConnectorMap idMapper, + ApplicationConnection connection) { Object val = null; // TODO type checks etc. if (JsonEncoder.VTYPE_NULL.equals(variableType)) { @@ -92,18 +91,25 @@ public class JsonDecoder { } else if (JsonEncoder.VTYPE_CONNECTOR.equals(variableType)) { val = idMapper.getConnector(((JSONString) value).stringValue()); } else { - // object, class name as type - JSONSerializer serializer = serializerMap - .getSerializer(variableType); - // TODO handle case with no serializer found - Object object = serializer.deserialize((JSONObject) value, + return decodeObject(variableType, (JSONObject) value, target, idMapper, connection); - return object; } return val; } + private static Object decodeObject(String variableType, + JSONObject encodedValue, Object target, ConnectorMap idMapper, + ApplicationConnection connection) { + // object, class name as type + JSONSerializer serializer = connection.getSerializerMap() + .getSerializer(variableType); + // TODO handle case with no serializer found + Object object = serializer.deserialize(encodedValue, target, idMapper, + connection); + return object; + } + private static Map decodeMap(JSONObject jsonMap, ConnectorMap idMapper, ApplicationConnection connection) { HashMap map = new HashMap(); @@ -111,7 +117,7 @@ public class JsonDecoder { while (it.hasNext()) { String key = it.next(); map.put(key, - decodeValue((JSONArray) jsonMap.get(key), idMapper, + decodeValue((JSONArray) jsonMap.get(key), null, idMapper, connection)); } return map; @@ -126,8 +132,8 @@ public class JsonDecoder { String connectorId = it.next(); Connector connector = idMapper.getConnector(connectorId); map.put(connector, - decodeValue((JSONArray) jsonMap.get(connectorId), idMapper, - connection)); + decodeValue((JSONArray) jsonMap.get(connectorId), null, + idMapper, connection)); } return map; } @@ -153,7 +159,7 @@ public class JsonDecoder { for (int i = 0; i < jsonArray.size(); ++i) { // each entry always has two elements: type and value JSONArray entryArray = (JSONArray) jsonArray.get(i); - tokens.add(decodeValue(entryArray, idMapper, connection)); + tokens.add(decodeValue(entryArray, null, idMapper, connection)); } return tokens; } @@ -164,7 +170,7 @@ public class JsonDecoder { for (int i = 0; i < jsonArray.size(); ++i) { // each entry always has two elements: type and value JSONArray entryArray = (JSONArray) jsonArray.get(i); - tokens.add(decodeValue(entryArray, idMapper, connection)); + tokens.add(decodeValue(entryArray, null, idMapper, connection)); } return tokens; } diff --git a/src/com/vaadin/terminal/gwt/client/communication/JsonEncoder.java b/src/com/vaadin/terminal/gwt/client/communication/JsonEncoder.java index fdc06b0e21..4a3515ff13 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/JsonEncoder.java +++ b/src/com/vaadin/terminal/gwt/client/communication/JsonEncoder.java @@ -117,7 +117,7 @@ public class JsonEncoder { // Try to find a generated serializer object, class name is the // type transportType = value.getClass().getName(); - JSONSerializer serializer = JsonDecoder.serializerMap + JSONSerializer serializer = connection.getSerializerMap() .getSerializer(transportType); // TODO handle case with no serializer found diff --git a/src/com/vaadin/terminal/gwt/client/communication/URLReference_Serializer.java b/src/com/vaadin/terminal/gwt/client/communication/URLReference_Serializer.java index 4fefc7f845..27a0d0118e 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/URLReference_Serializer.java +++ b/src/com/vaadin/terminal/gwt/client/communication/URLReference_Serializer.java @@ -11,13 +11,15 @@ import com.vaadin.terminal.gwt.client.ConnectorMap; public class URLReference_Serializer implements JSONSerializer { - public URLReference deserialize(JSONObject jsonValue, + public URLReference deserialize(JSONObject jsonValue, URLReference target, ConnectorMap idMapper, ApplicationConnection connection) { URLReference reference = GWT.create(URLReference.class); - JSONArray jsonURL = (JSONArray) jsonValue.get("URL"); - String URL = (String) JsonDecoder.decodeValue(jsonURL, idMapper, - connection); - reference.setURL(connection.translateVaadinUri(URL)); + if (jsonValue.containsKey("URL")) { + JSONArray jsonURL = (JSONArray) jsonValue.get("URL"); + String URL = (String) JsonDecoder.decodeValue(jsonURL, null, + idMapper, connection); + reference.setURL(connection.translateVaadinUri(URL)); + } return reference; } diff --git a/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java b/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java index c57e7d8bc1..97cb3114b9 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java @@ -803,14 +803,28 @@ public abstract class AbstractCommunicationManager implements Serializable { // client after component creation but before legacy UIDL // processing. JSONObject sharedStates = new JSONObject(); - for (Connector connector : dirtyVisibleConnectors) { + for (ClientConnector connector : dirtyVisibleConnectors) { SharedState state = connector.getState(); if (null != state) { // encode and send shared state try { - // FIXME Use declared type + Class stateType = connector + .getStateType(); + SharedState referenceState = null; + if (repaintAll) { + // Use an empty state object as reference for full + // repaints + try { + referenceState = stateType.newInstance(); + } catch (Exception e) { + logger.log(Level.WARNING, + "Error creating reference object for state of type " + + stateType.getName()); + } + } JSONArray stateJsonArray = JsonCodec.encode(state, - state.getClass(), application); + referenceState, stateType, application); + sharedStates .put(connector.getConnectorId(), stateJsonArray); } catch (JSONException e) { @@ -900,9 +914,21 @@ public abstract class AbstractCommunicationManager implements Serializable { invocationJson.put(invocation.getMethodName()); JSONArray paramJson = new JSONArray(); for (int i = 0; i < invocation.getParameterTypes().length; ++i) { + Class parameterType = invocation.getParameterTypes()[i]; + Object referenceParameter = null; + // TODO Use default values for RPC parameter types + // if (!JsonCodec.isInternalType(parameterType)) { + // try { + // referenceParameter = parameterType.newInstance(); + // } catch (Exception e) { + // logger.log(Level.WARNING, + // "Error creating reference object for parameter of type " + // + parameterType.getName()); + // } + // } paramJson.put(JsonCodec.encode( - invocation.getParameters()[i], - invocation.getParameterTypes()[i], application)); + invocation.getParameters()[i], referenceParameter, + parameterType, application)); } invocationJson.put(paramJson); rpcCalls.put(invocationJson); diff --git a/src/com/vaadin/terminal/gwt/server/ClientConnector.java b/src/com/vaadin/terminal/gwt/server/ClientConnector.java index 7a1f0fad68..7e74c26fb1 100644 --- a/src/com/vaadin/terminal/gwt/server/ClientConnector.java +++ b/src/com/vaadin/terminal/gwt/server/ClientConnector.java @@ -6,6 +6,7 @@ package com.vaadin.terminal.gwt.server; import java.util.List; import com.vaadin.terminal.gwt.client.Connector; +import com.vaadin.terminal.gwt.client.communication.SharedState; /** * Interface implemented by all connectors that are capable of communicating @@ -35,4 +36,12 @@ public interface ClientConnector extends Connector, RpcTarget { * @return true if the connector can receive messages, false otherwise */ public boolean isConnectorEnabled(); + + /** + * Returns the type of the shared state for this connector + * + * @return The type of the state. Must never return null. + */ + public Class getStateType(); + } diff --git a/src/com/vaadin/terminal/gwt/server/DragAndDropService.java b/src/com/vaadin/terminal/gwt/server/DragAndDropService.java index d3fe5a890b..f6c96557ea 100644 --- a/src/com/vaadin/terminal/gwt/server/DragAndDropService.java +++ b/src/com/vaadin/terminal/gwt/server/DragAndDropService.java @@ -238,4 +238,8 @@ public class DragAndDropService implements VariableOwner, ClientConnector { // TODO Use rpc for drag'n'drop return null; } + + public Class getStateType() { + return SharedState.class; + } } diff --git a/src/com/vaadin/terminal/gwt/server/JsonCodec.java b/src/com/vaadin/terminal/gwt/server/JsonCodec.java index 375cce4161..c88a1c828c 100644 --- a/src/com/vaadin/terminal/gwt/server/JsonCodec.java +++ b/src/com/vaadin/terminal/gwt/server/JsonCodec.java @@ -419,11 +419,11 @@ public class JsonCodec implements Serializable { @Deprecated private static JSONArray encode(Object value, Application application) throws JSONException { - return encode(value, null, application); + return encode(value, null, null, application); } - public static JSONArray encode(Object value, Class valueType, - Application application) throws JSONException { + public static JSONArray encode(Object value, Object referenceValue, + Type valueType, Application application) throws JSONException { if (null == value) { return encodeNull(); @@ -453,7 +453,8 @@ public class JsonCodec implements Serializable { "Unable to serialize unsupported type: " + valueType); } Collection collection = (Collection) value; - JSONArray jsonArray = encodeCollection(collection, application); + JSONArray jsonArray = encodeCollection(valueType, collection, + application); return combineTypeAndValue(internalTransportType, jsonArray); } else if (value instanceof Object[]) { @@ -486,8 +487,9 @@ public class JsonCodec implements Serializable { } else { // Any object that we do not know how to encode we encode by looping // through fields - return combineTypeAndValue(getCustomTransportType(valueType), - encodeObject(value, application)); + return combineTypeAndValue( + getCustomTransportType((Class) valueType), + encodeObject(value, referenceValue, application)); } } @@ -495,22 +497,40 @@ public class JsonCodec implements Serializable { return combineTypeAndValue(JsonEncoder.VTYPE_NULL, JSONObject.NULL); } - private static Object encodeObject(Object value, Application application) - throws JSONException { + private static Object encodeObject(Object value, Object referenceValue, + Application application) throws JSONException { JSONObject jsonMap = new JSONObject(); try { for (PropertyDescriptor pd : Introspector.getBeanInfo( value.getClass()).getPropertyDescriptors()) { - Class fieldType = pd.getPropertyType(); String fieldName = getTransportFieldName(pd); if (fieldName == null) { continue; } Method getterMethod = pd.getReadMethod(); + // We can't use PropertyDescriptor.getPropertyType() as it does + // not support generics + Type fieldType = getterMethod.getGenericReturnType(); Object fieldValue = getterMethod.invoke(value, (Object[]) null); - jsonMap.put(fieldName, - encode(fieldValue, fieldType, application)); + boolean equals = false; + Object referenceFieldValue = null; + if (referenceValue != null) { + referenceFieldValue = getterMethod.invoke(referenceValue, + (Object[]) null); + equals = equals(fieldValue, referenceFieldValue); + } + if (!equals) { + jsonMap.put( + fieldName, + encode(fieldValue, referenceFieldValue, fieldType, + application)); + // } else { + // System.out.println("Skipping field " + fieldName + // + " of type " + fieldType.getName() + // + " for object " + value.getClass().getName() + // + " as " + fieldValue + "==" + referenceFieldValue); + } } } catch (Exception e) { // TODO: Should exceptions be handled in a different way? @@ -519,24 +539,56 @@ public class JsonCodec implements Serializable { return jsonMap; } + /** + * Compares the value with the reference. If they match, returns true. + * + * @param fieldValue + * @param referenceValue + * @return + */ + private static boolean equals(Object fieldValue, Object referenceValue) { + if (fieldValue == null) { + return referenceValue == null; + } + + if (fieldValue.equals(referenceValue)) { + return true; + } + + return false; + } + private static JSONArray encodeArrayContents(Object[] array, Application application) throws JSONException { JSONArray jsonArray = new JSONArray(); for (Object o : array) { - jsonArray.put(encode(o, null, application)); + jsonArray.put(encode(o, null, null, application)); } return jsonArray; } - private static JSONArray encodeCollection(Collection collection, - Application application) throws JSONException { + private static JSONArray encodeCollection(Type targetType, + Collection collection, Application application) + throws JSONException { JSONArray jsonArray = new JSONArray(); for (Object o : collection) { - jsonArray.put(encode(o, application)); + jsonArray.put(encodeChild(targetType, 0, o, application)); } return jsonArray; } + private static JSONArray encodeChild(Type targetType, int typeIndex, + Object o, Application application) throws JSONException { + if (targetType instanceof ParameterizedType) { + Type childType = ((ParameterizedType) targetType) + .getActualTypeArguments()[typeIndex]; + // Encode using the given type + return encode(o, null, childType, application); + } else { + return encode(o, application); + } + } + private static JSONObject encodeMapContents(Map map, Application application) throws JSONException { JSONObject jsonMap = new JSONObject(); @@ -551,7 +603,8 @@ public class JsonCodec implements Serializable { "Only maps with String/Connector keys are currently supported (#8602)"); } - jsonMap.put((String) mapKey, encode(mapValue, null, application)); + jsonMap.put((String) mapKey, + encode(mapValue, null, null, application)); } return jsonMap; } diff --git a/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerGenerator.java b/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerGenerator.java index d3ed9fe484..3b6ab8cdba 100644 --- a/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerGenerator.java +++ b/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerGenerator.java @@ -106,7 +106,8 @@ public class SerializerGenerator extends Generator { composer.addImport(JsonDecoder.class.getName()); // composer.addImport(VaadinSerializer.class.getName()); - composer.addImplementedInterface(JSONSerializer.class.getName()); + composer.addImplementedInterface(JSONSerializer.class.getName() + "<" + + beanQualifiedSourceName + ">"); SourceWriter sourceWriter = composer.createSourceWriter(context, printWriter); @@ -117,7 +118,7 @@ public class SerializerGenerator extends Generator { // public JSONValue serialize(Object value, ConnectorMap idMapper, // ApplicationConnection connection) { sourceWriter.println("public " + JSONObject.class.getName() - + " serialize(" + Object.class.getName() + " value, " + + " serialize(" + beanQualifiedSourceName + " value, " + ConnectorMap.class.getName() + " idMapper, " + ApplicationConnection.class.getName() + " connection) {"); sourceWriter.indent(); @@ -152,13 +153,20 @@ public class SerializerGenerator extends Generator { // Deserializer sourceWriter.println("public " + beanQualifiedSourceName + " deserialize(" + JSONObject.class.getName() + " jsonValue, " + + beanQualifiedSourceName + " target, " + ConnectorMap.class.getName() + " idMapper, " + ApplicationConnection.class.getName() + " connection) {"); sourceWriter.indent(); - // VButtonState state = GWT.create(VButtonState.class); - sourceWriter.println(beanQualifiedSourceName + " state = GWT.create(" - + beanQualifiedSourceName + ".class);"); + // if (target == null) { + sourceWriter.println("if (target == null) {"); + sourceWriter.indent(); + // target = GWT.create(VButtonState.class); + sourceWriter.println("target = GWT.create(" + beanQualifiedSourceName + + ".class);"); + sourceWriter.outdent(); + sourceWriter.println("}"); + for (JMethod method : getSetters(beanType)) { String setterName = method.getName(); String fieldName = setterName.substring(3); // setZIndex() -> ZIndex @@ -167,30 +175,59 @@ public class SerializerGenerator extends Generator { logger.log(Type.DEBUG, "* Processing field " + fieldName + " in " + beanQualifiedSourceName + " (" + beanType.getName() + ")"); + // if (jsonValue.containsKey("height")) { + sourceWriter.println("if (jsonValue.containsKey(\"" + fieldName + + "\")) {"); + sourceWriter.indent(); String jsonFieldName = "json_" + fieldName; // JSONArray json_Height = (JSONArray) jsonValue.get("height"); sourceWriter.println("JSONArray " + jsonFieldName + " = (JSONArray) jsonValue.get(\"" + fieldName + "\");"); - // state.setHeight((String) - // JsonDecoder.decodeValue(jsonFieldValue,idMapper, connection)); - String fieldType; + String getterName = "get" + fieldName; JPrimitiveType primitiveType = setterParameterType.isPrimitive(); if (primitiveType != null) { // This is a primitive type -> must used the boxed type fieldType = primitiveType.getQualifiedBoxedSourceName(); + if (primitiveType == JPrimitiveType.BOOLEAN) { + getterName = "is" + fieldName; + } } else { fieldType = setterParameterType.getQualifiedSourceName(); } - sourceWriter.println("state." + setterName + "((" + fieldType + // String referenceValue; + sourceWriter.println(fieldType + " referenceValue;"); + // if (target == null) { + sourceWriter.println("if (target == null) {"); + sourceWriter.indent(); + // referenceValue = null; + sourceWriter.println("referenceValue = null;"); + // } else { + sourceWriter.println("} else {"); + // referenceValue = target.getHeight(); + sourceWriter.println("referenceValue = target." + getterName + + "();"); + // } + sourceWriter.outdent(); + sourceWriter.println("}"); + + // target.setHeight((String) + // JsonDecoder.decodeValue(jsonFieldValue,referenceValue, idMapper, + // connection)); + sourceWriter.println("target." + setterName + "((" + fieldType + ") " + JsonDecoder.class.getName() + ".decodeValue(" - + jsonFieldName + ", idMapper, connection));"); + + jsonFieldName + + ", referenceValue, idMapper, connection));"); + + // } ... end of if contains + sourceWriter.println("}"); + sourceWriter.outdent(); } - // return state; - sourceWriter.println("return state;"); + // return target; + sourceWriter.println("return target;"); sourceWriter.println("}"); sourceWriter.outdent(); diff --git a/src/com/vaadin/ui/AbstractComponent.java b/src/com/vaadin/ui/AbstractComponent.java index 79a07ae00e..554d7806f9 100644 --- a/src/com/vaadin/ui/AbstractComponent.java +++ b/src/com/vaadin/ui/AbstractComponent.java @@ -18,7 +18,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -820,20 +819,28 @@ public abstract class AbstractComponent implements Component, MethodEventSource * @return new shared state object */ protected ComponentState createState() { + try { + return getStateType().newInstance(); + } catch (Exception e) { + throw new RuntimeException( + "Error creating state of type " + getStateType().getName() + + " for " + getClass().getName(), e); + } + } + + /* (non-Javadoc) + * @see com.vaadin.terminal.gwt.server.ClientConnector#getStateType() + */ + public Class getStateType() { try { Method m = getClass().getMethod("getState", (Class[]) null); Class type = (Class) m .getReturnType(); - return type.newInstance(); + return type; } catch (Exception e) { - getLogger().log( - Level.INFO, - "Error determining state object class for " - + getClass().getName()); + throw new RuntimeException("Error finding state type for " + + getClass().getName(), e); } - - // Fall back to ComponentState if detection fails for some reason. - return new ComponentState(); } /* Documentation copied from interface */ diff --git a/src/com/vaadin/ui/Root.java b/src/com/vaadin/ui/Root.java index 405ae8da93..07dd5a0f69 100644 --- a/src/com/vaadin/ui/Root.java +++ b/src/com/vaadin/ui/Root.java @@ -30,7 +30,6 @@ import com.vaadin.terminal.Resource; import com.vaadin.terminal.Vaadin6Component; import com.vaadin.terminal.WrappedRequest; import com.vaadin.terminal.WrappedRequest.BrowserDetails; -import com.vaadin.terminal.gwt.client.ComponentState; import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.ui.notification.VNotification; import com.vaadin.terminal.gwt.client.ui.root.RootServerRpc; @@ -475,10 +474,10 @@ public abstract class Root extends AbstractComponentContainer implements } @Override - protected ComponentState createState() { + public Class getStateType() { // This is a workaround for a problem with creating the correct state // object during build - return new RootState(); + return RootState.class; } /** -- cgit v1.2.3 From 3387e8e2370a37f3e2d32d87dbe700def12dee65 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Mon, 23 Apr 2012 21:48:21 +0300 Subject: Avoid unnecessary spaces in UIDL --- src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java b/src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java index 0140c0f799..def334290e 100644 --- a/src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java +++ b/src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java @@ -387,7 +387,7 @@ public class JsonPaintTarget implements PaintTarget { "Parameters must be non-null strings"); } - tag.addAttribute("\"" + name + "\": \"" + escapeJSON(value) + "\""); + tag.addAttribute("\"" + name + "\":\"" + escapeJSON(value) + "\""); if (customLayoutArgumentsOpen && "template".equals(name)) { getUsedResources().add("layouts/" + value + ".html"); @@ -411,7 +411,7 @@ public class JsonPaintTarget implements PaintTarget { StringBuilder sb = new StringBuilder(); sb.append("\""); sb.append(name); - sb.append("\": "); + sb.append("\":"); sb.append("{"); for (Iterator it = value.keySet().iterator(); it.hasNext();) { Object key = it.next(); -- cgit v1.2.3 From 2e6c788c14013ebca8cdea7da9d0ff7e7547df09 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Thu, 3 May 2012 21:51:30 +0300 Subject: Moved most of TextField/TextArea/PasswordField paintContent to state Removed deprecated value formatter from AbstractTextField (#8672) --- .../ui/passwordfield/PasswordFieldConnector.java | 7 -- .../gwt/client/ui/textarea/TextAreaConnector.java | 21 ++-- .../gwt/client/ui/textarea/TextAreaState.java | 33 ++++++ .../terminal/gwt/client/ui/textarea/VTextArea.java | 58 ++++++++-- .../ui/textfield/AbstractTextFieldState.java | 58 ++++++++++ .../client/ui/textfield/TextFieldConnector.java | 34 ++---- .../gwt/client/ui/textfield/VTextField.java | 79 ++++--------- src/com/vaadin/ui/AbstractTextField.java | 128 ++++----------------- src/com/vaadin/ui/TextArea.java | 48 ++------ 9 files changed, 215 insertions(+), 251 deletions(-) create mode 100644 src/com/vaadin/terminal/gwt/client/ui/textarea/TextAreaState.java create mode 100644 src/com/vaadin/terminal/gwt/client/ui/textfield/AbstractTextFieldState.java (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/passwordfield/PasswordFieldConnector.java b/src/com/vaadin/terminal/gwt/client/ui/passwordfield/PasswordFieldConnector.java index 1d1ec58fbb..29a1aeef79 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/passwordfield/PasswordFieldConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/passwordfield/PasswordFieldConnector.java @@ -6,8 +6,6 @@ package com.vaadin.terminal.gwt.client.ui.passwordfield; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.ui.Widget; -import com.vaadin.terminal.gwt.client.ApplicationConnection; -import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.textfield.TextFieldConnector; import com.vaadin.ui.PasswordField; @@ -15,11 +13,6 @@ import com.vaadin.ui.PasswordField; @Connect(PasswordField.class) public class PasswordFieldConnector extends TextFieldConnector { - @Override - public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { - super.updateFromUIDL(uidl, client); - } - @Override protected Widget createWidget() { return GWT.create(VPasswordField.class); diff --git a/src/com/vaadin/terminal/gwt/client/ui/textarea/TextAreaConnector.java b/src/com/vaadin/terminal/gwt/client/ui/textarea/TextAreaConnector.java index 0f3ae0ad4f..ea32ae49c6 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/textarea/TextAreaConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/textarea/TextAreaConnector.java @@ -5,10 +5,8 @@ package com.vaadin.terminal.gwt.client.ui.textarea; import com.google.gwt.core.client.GWT; -import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.Widget; -import com.vaadin.terminal.gwt.client.ApplicationConnection; -import com.vaadin.terminal.gwt.client.UIDL; +import com.vaadin.terminal.gwt.client.communication.StateChangeEvent; import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.textfield.TextFieldConnector; import com.vaadin.ui.TextArea; @@ -17,17 +15,16 @@ import com.vaadin.ui.TextArea; public class TextAreaConnector extends TextFieldConnector { @Override - public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { - // Call parent renderer explicitly - super.updateFromUIDL(uidl, client); + public TextAreaState getState() { + return (TextAreaState) super.getState(); + } - if (uidl.hasAttribute("rows")) { - getWidget().setRows(uidl.getIntAttribute("rows")); - } + @Override + public void onStateChanged(StateChangeEvent stateChangeEvent) { + super.onStateChanged(stateChangeEvent); - if (getWidget().getMaxLength() >= 0) { - getWidget().sinkEvents(Event.ONKEYUP); - } + getWidget().setRows(getState().getRows()); + getWidget().setWordwrap(getState().isWordwrap()); } @Override diff --git a/src/com/vaadin/terminal/gwt/client/ui/textarea/TextAreaState.java b/src/com/vaadin/terminal/gwt/client/ui/textarea/TextAreaState.java new file mode 100644 index 0000000000..02aa2070f1 --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/textarea/TextAreaState.java @@ -0,0 +1,33 @@ +package com.vaadin.terminal.gwt.client.ui.textarea; + +import com.vaadin.terminal.gwt.client.ui.textfield.AbstractTextFieldState; + +public class TextAreaState extends AbstractTextFieldState { + + /** + * Number of visible rows in the text area. The default is 5. + */ + private int rows = 5; + + /** + * Tells if word-wrapping should be used in the text area. + */ + private boolean wordwrap = true; + + public int getRows() { + return rows; + } + + public void setRows(int rows) { + this.rows = rows; + } + + public boolean isWordwrap() { + return wordwrap; + } + + public void setWordwrap(boolean wordwrap) { + this.wordwrap = wordwrap; + } + +} diff --git a/src/com/vaadin/terminal/gwt/client/ui/textarea/VTextArea.java b/src/com/vaadin/terminal/gwt/client/ui/textarea/VTextArea.java index c600b2fd1e..aede1ef002 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/textarea/VTextArea.java +++ b/src/com/vaadin/terminal/gwt/client/ui/textarea/VTextArea.java @@ -5,10 +5,13 @@ package com.vaadin.terminal.gwt.client.ui.textarea; import com.google.gwt.core.client.Scheduler; +import com.google.gwt.dom.client.Style.Overflow; +import com.google.gwt.dom.client.TextAreaElement; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.DOM; -import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Event; +import com.vaadin.terminal.gwt.client.BrowserInfo; +import com.vaadin.terminal.gwt.client.Util; import com.vaadin.terminal.gwt.client.ui.textfield.VTextField; /** @@ -22,23 +25,33 @@ import com.vaadin.terminal.gwt.client.ui.textfield.VTextField; */ public class VTextArea extends VTextField { public static final String CLASSNAME = "v-textarea"; + private boolean wordwrap = true; public VTextArea() { super(DOM.createTextArea()); setStyleName(CLASSNAME); } + public TextAreaElement getTextAreaElement() { + return super.getElement().cast(); + } + public void setRows(int rows) { - setRows(getElement(), rows); + getTextAreaElement().setRows(rows); } - private native void setRows(Element e, int r) - /*-{ - try { - if(e.tagName.toLowerCase() == "textarea") - e.rows = r; - } catch (e) {} - }-*/; + @Override + protected void setMaxLength(int newMaxLength) { + super.setMaxLength(newMaxLength); + + boolean hasMaxLength = (newMaxLength >= 0); + + if (hasMaxLength) { + sinkEvents(Event.ONKEYUP); + } else { + unsinkEvents(Event.ONKEYUP); + } + } @Override public void onBrowserEvent(Event event) { @@ -61,4 +74,31 @@ public class VTextArea extends VTextField { // detected in a different way. return getImpl().getTextAreaCursorPos(getElement()); } + + @Override + protected void setMaxLengthToElement(int newMaxLength) { + // There is no maxlength property for textarea. The maximum length is + // enforced by the KEYUP handler + + } + + public void setWordwrap(boolean wordwrap) { + if (wordwrap == this.wordwrap) { + return; // No change + } + + if (wordwrap) { + getElement().removeAttribute("wrap"); + getElement().getStyle().clearOverflow(); + } else { + getElement().setAttribute("wrap", "off"); + getElement().getStyle().setOverflow(Overflow.AUTO); + } + if (BrowserInfo.get().isOpera()) { + // Opera fails to dynamically update the wrap attribute so we detach + // and reattach the whole TextArea. + Util.detachAttach(getElement()); + } + this.wordwrap = wordwrap; + } } diff --git a/src/com/vaadin/terminal/gwt/client/ui/textfield/AbstractTextFieldState.java b/src/com/vaadin/terminal/gwt/client/ui/textfield/AbstractTextFieldState.java new file mode 100644 index 0000000000..323e5ec67f --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/textfield/AbstractTextFieldState.java @@ -0,0 +1,58 @@ +package com.vaadin.terminal.gwt.client.ui.textfield; + +import com.vaadin.terminal.gwt.client.AbstractFieldState; + +public class AbstractTextFieldState extends AbstractFieldState { + /** + * Maximum character count in text field. + */ + private int maxLength = -1; + + /** + * Number of visible columns in the TextField. + */ + private int columns = 0; + + /** + * The prompt to display in an empty field. Null when disabled. + */ + private String inputPrompt = null; + + /** + * The text in the field + */ + private String text = null; + + public int getMaxLength() { + return maxLength; + } + + public void setMaxLength(int maxLength) { + this.maxLength = maxLength; + } + + public int getColumns() { + return columns; + } + + public void setColumns(int columns) { + this.columns = columns; + } + + public String getInputPrompt() { + return inputPrompt; + } + + public void setInputPrompt(String inputPrompt) { + this.inputPrompt = inputPrompt; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + +} diff --git a/src/com/vaadin/terminal/gwt/client/ui/textfield/TextFieldConnector.java b/src/com/vaadin/terminal/gwt/client/ui/textfield/TextFieldConnector.java index 7e9e786676..069dd1fb0d 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/textfield/TextFieldConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/textfield/TextFieldConnector.java @@ -22,6 +22,11 @@ import com.vaadin.ui.TextField; public class TextFieldConnector extends AbstractFieldConnector implements Paintable, BeforeShortcutActionListener { + @Override + public AbstractTextFieldState getState() { + return (AbstractTextFieldState) super.getState(); + } + public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { // Save details getWidget().client = client; @@ -33,14 +38,9 @@ public class TextFieldConnector extends AbstractFieldConnector implements getWidget().setReadOnly(isReadOnly()); - getWidget().inputPrompt = uidl - .getStringAttribute(VTextField.ATTR_INPUTPROMPT); - - getWidget().setMaxLength( - uidl.hasAttribute("maxLength") ? uidl - .getIntAttribute("maxLength") : -1); - - getWidget().immediate = getState().isImmediate(); + getWidget().setInputPrompt(getState().getInputPrompt()); + getWidget().setMaxLength(getState().getMaxLength()); + getWidget().setImmediate(getState().isImmediate()); getWidget().listenTextChangeEvents = hasEventListener("ie"); if (getWidget().listenTextChangeEvents) { @@ -61,13 +61,9 @@ public class TextFieldConnector extends AbstractFieldConnector implements getWidget().sinkEvents(VTextField.TEXTCHANGE_EVENTS); getWidget().attachCutEventListener(getWidget().getElement()); } + getWidget().setColumns(getState().getColumns()); - if (uidl.hasAttribute("cols")) { - getWidget().setColumns( - new Integer(uidl.getStringAttribute("cols")).intValue()); - } - - final String text = uidl.getStringVariable("text"); + final String text = getState().getText(); /* * We skip the text content update if field has been repainted, but text @@ -94,16 +90,6 @@ public class TextFieldConnector extends AbstractFieldConnector implements } }); } - - // Here for backward compatibility; to be moved to TextArea. - // Optimization: server does not send attribute for the default 'true' - // state. - if (uidl.hasAttribute("wordwrap") - && uidl.getBooleanAttribute("wordwrap") == false) { - getWidget().setWordwrap(false); - } else { - getWidget().setWordwrap(true); - } } @Override diff --git a/src/com/vaadin/terminal/gwt/client/ui/textfield/VTextField.java b/src/com/vaadin/terminal/gwt/client/ui/textfield/VTextField.java index 7bd392b503..aeae165f60 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/textfield/VTextField.java +++ b/src/com/vaadin/terminal/gwt/client/ui/textfield/VTextField.java @@ -4,7 +4,6 @@ package com.vaadin.terminal.gwt.client.ui.textfield; -import com.google.gwt.dom.client.Style.Overflow; import com.google.gwt.event.dom.client.BlurEvent; import com.google.gwt.event.dom.client.BlurHandler; import com.google.gwt.event.dom.client.ChangeEvent; @@ -60,21 +59,19 @@ public class VTextField extends TextBoxBase implements Field, ChangeHandler, */ private boolean valueBeforeEditIsSynced = true; - protected boolean immediate = false; + private boolean immediate = false; private int maxLength = -1; private static final String CLASSNAME_PROMPT = "prompt"; - protected static final String ATTR_INPUTPROMPT = "prompt"; public static final String ATTR_TEXTCHANGE_TIMEOUT = "iet"; public static final String VAR_CURSOR = "c"; public static final String ATTR_TEXTCHANGE_EVENTMODE = "iem"; protected static final String TEXTCHANGE_MODE_EAGER = "EAGER"; private static final String TEXTCHANGE_MODE_TIMEOUT = "TIMEOUT"; - protected String inputPrompt = null; + private String inputPrompt = null; private boolean prompting = false; private int lastCursorPos = -1; - private boolean wordwrap = true; public VTextField() { this(DOM.createInputText()); @@ -264,20 +261,18 @@ public class VTextField extends TextBoxBase implements Field, ChangeHandler, protected void setMaxLength(int newMaxLength) { if (newMaxLength >= 0) { maxLength = newMaxLength; - if (getElement().getTagName().toLowerCase().equals("textarea")) { - // NOP no maxlength property for textarea - } else { - getElement().setPropertyInt("maxLength", maxLength); - } - } else if (maxLength != -1) { - if (getElement().getTagName().toLowerCase().equals("textarea")) { - // NOP no maxlength property for textarea - } else { - getElement().removeAttribute("maxLength"); - } + } else { maxLength = -1; } + setMaxLengthToElement(newMaxLength); + } + protected void setMaxLengthToElement(int newMaxLength) { + if (newMaxLength >= 0) { + getElement().setPropertyInt("maxLength", newMaxLength); + } else { + getElement().removeAttribute("maxLength"); + } } public int getMaxLength() { @@ -390,48 +385,11 @@ public class VTextField extends TextBoxBase implements Field, ChangeHandler, } public void setColumns(int columns) { - setColumns(getElement(), columns); - } - - private native void setColumns(Element e, int c) - /*-{ - try { - switch(e.tagName.toLowerCase()) { - case "input": - //e.size = c; - e.style.width = c+"em"; - break; - case "textarea": - //e.cols = c; - e.style.width = c+"em"; - break; - default:; - } - } catch (e) {} - }-*/; - - // Here for backward compatibility; to be moved to TextArea - public void setWordwrap(boolean enabled) { - if (enabled == wordwrap) { - return; // No change + if (columns <= 0) { + return; } - if (enabled) { - getElement().removeAttribute("wrap"); - getElement().getStyle().clearOverflow(); - } else { - getElement().setAttribute("wrap", "off"); - getElement().getStyle().setOverflow(Overflow.AUTO); - } - if (BrowserInfo.get().isSafari4()) { - // Force redraw as Safari 4 does not properly update the screen - Util.forceWebkitRedraw(getElement()); - } else if (BrowserInfo.get().isOpera()) { - // Opera fails to dynamically update the wrap attribute so we detach - // and reattach the whole TextArea. - Util.detachAttach(getElement()); - } - wordwrap = enabled; + setWidth(columns + "em"); } public void onKeyDown(KeyDownEvent event) { @@ -439,4 +397,13 @@ public class VTextField extends TextBoxBase implements Field, ChangeHandler, valueChange(false); } } + + public void setImmediate(boolean immediate) { + this.immediate = immediate; + } + + public void setInputPrompt(String inputPrompt) { + this.inputPrompt = inputPrompt; + } + } diff --git a/src/com/vaadin/ui/AbstractTextField.java b/src/com/vaadin/ui/AbstractTextField.java index acb1d71ed8..d584374bda 100644 --- a/src/com/vaadin/ui/AbstractTextField.java +++ b/src/com/vaadin/ui/AbstractTextField.java @@ -4,7 +4,6 @@ package com.vaadin.ui; -import java.text.Format; import java.util.Map; import com.vaadin.event.FieldEvents.BlurEvent; @@ -19,17 +18,12 @@ import com.vaadin.event.FieldEvents.TextChangeNotifier; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.PaintTarget; import com.vaadin.terminal.Vaadin6Component; +import com.vaadin.terminal.gwt.client.ui.textfield.AbstractTextFieldState; import com.vaadin.terminal.gwt.client.ui.textfield.VTextField; public abstract class AbstractTextField extends AbstractField implements BlurNotifier, FocusNotifier, TextChangeNotifier, Vaadin6Component { - /** - * Value formatter used to format the string contents. - */ - @Deprecated - private Format format; - /** * Null representation. */ @@ -39,21 +33,6 @@ public abstract class AbstractTextField extends AbstractField implements * representation . */ private boolean nullSettingAllowed = false; - /** - * Maximum character count in text field. - */ - private int maxLength = -1; - - /** - * Number of visible columns in the TextField. - */ - private int columns = 0; - - /** - * The prompt to display in an empty field. Null when disabled. - */ - private String inputPrompt = null; - /** * The text content when the last messages to the server was sent. Cleared * when value is changed. @@ -100,32 +79,23 @@ public abstract class AbstractTextField extends AbstractField implements super(); } - public void paintContent(PaintTarget target) throws PaintException { - - if (getMaxLength() >= 0) { - target.addAttribute("maxLength", getMaxLength()); - } - - // Adds the number of column and rows - final int columns = getColumns(); - if (columns != 0) { - target.addAttribute("cols", String.valueOf(columns)); - } + @Override + public AbstractTextFieldState getState() { + return (AbstractTextFieldState) super.getState(); + } - if (getInputPrompt() != null) { - target.addAttribute("prompt", getInputPrompt()); - } + @Override + public void updateState() { + super.updateState(); - // Adds the content as variable - String value = getFormattedValue(); + String value = getValue(); if (value == null) { value = getNullRepresentation(); } - if (value == null) { - throw new IllegalStateException( - "Null values are not allowed if the null-representation is null"); - } - target.addVariable(this, "text", value); + getState().setText(value); + } + + public void paintContent(PaintTarget target) throws PaintException { if (selectionPosition != -1) { target.addAttribute("selpos", selectionPosition); @@ -153,37 +123,6 @@ public abstract class AbstractTextField extends AbstractField implements } - /** - * Gets the formatted string value. Sets the field value by using the - * assigned Format. - * - * @return the Formatted value. - * @see #setFormat(Format) - * @see Format - * @deprecated - */ - @Deprecated - protected String getFormattedValue() { - Object v = getValue(); - if (v == null) { - return null; - } - return v.toString(); - } - - @Override - public String getValue() { - String v = super.getValue(); - if (format == null || v == null) { - return v; - } - try { - return format.format(v); - } catch (final IllegalArgumentException e) { - return v; - } - } - public void changeVariables(Object source, Map variables) { changingVariables = true; @@ -215,7 +154,7 @@ public abstract class AbstractTextField extends AbstractField implements if (getMaxLength() != -1 && newValue.length() > getMaxLength()) { newValue = newValue.substring(0, getMaxLength()); } - final String oldValue = getFormattedValue(); + final String oldValue = getValue(); if (newValue != null && (oldValue == null || isNullSettingAllowed()) && newValue.equals(getNullRepresentation())) { @@ -228,7 +167,7 @@ public abstract class AbstractTextField extends AbstractField implements // If the modified status changes, or if we have a // formatter, repaint is needed after all. - if (format != null || wasModified != isModified()) { + if (wasModified != isModified()) { requestRepaint(); } } @@ -345,31 +284,6 @@ public abstract class AbstractTextField extends AbstractField implements requestRepaint(); } - /** - * Gets the value formatter of TextField. - * - * @return the Format used to format the value. - * @deprecated replaced by {@link com.vaadin.data.util.PropertyFormatter} - */ - @Deprecated - public Format getFormat() { - return format; - } - - /** - * Gets the value formatter of TextField. - * - * @param format - * the Format used to format the value. Null disables the - * formatting. - * @deprecated replaced by {@link com.vaadin.data.util.PropertyFormatter} - */ - @Deprecated - public void setFormat(Format format) { - this.format = format; - requestRepaint(); - } - @Override protected boolean isEmpty() { return super.isEmpty() || getValue().length() == 0; @@ -382,7 +296,7 @@ public abstract class AbstractTextField extends AbstractField implements * @return the maxLength */ public int getMaxLength() { - return maxLength; + return getState().getMaxLength(); } /** @@ -393,7 +307,7 @@ public abstract class AbstractTextField extends AbstractField implements * the maxLength to set */ public void setMaxLength(int maxLength) { - this.maxLength = maxLength; + getState().setMaxLength(maxLength); requestRepaint(); } @@ -405,7 +319,7 @@ public abstract class AbstractTextField extends AbstractField implements * @return the number of columns in the editor. */ public int getColumns() { - return columns; + return getState().getColumns(); } /** @@ -420,7 +334,7 @@ public abstract class AbstractTextField extends AbstractField implements if (columns < 0) { columns = 0; } - this.columns = columns; + getState().setColumns(columns); requestRepaint(); } @@ -431,7 +345,7 @@ public abstract class AbstractTextField extends AbstractField implements * @return the current input prompt, or null if not enabled */ public String getInputPrompt() { - return inputPrompt; + return getState().getInputPrompt(); } /** @@ -441,7 +355,7 @@ public abstract class AbstractTextField extends AbstractField implements * @param inputPrompt */ public void setInputPrompt(String inputPrompt) { - this.inputPrompt = inputPrompt; + getState().setInputPrompt(inputPrompt); requestRepaint(); } diff --git a/src/com/vaadin/ui/TextArea.java b/src/com/vaadin/ui/TextArea.java index adb980818e..4c0b563b00 100644 --- a/src/com/vaadin/ui/TextArea.java +++ b/src/com/vaadin/ui/TextArea.java @@ -5,26 +5,13 @@ package com.vaadin.ui; import com.vaadin.data.Property; -import com.vaadin.terminal.PaintException; -import com.vaadin.terminal.PaintTarget; +import com.vaadin.terminal.gwt.client.ui.textarea.TextAreaState; /** * A text field that supports multi line editing. */ public class TextArea extends AbstractTextField { - private static final int DEFAULT_ROWS = 5; - - /** - * Number of visible rows in the text area. - */ - private int rows = DEFAULT_ROWS; - - /** - * Tells if word-wrapping should be used in the text area. - */ - private boolean wordwrap = true; - /** * Constructs an empty TextArea. */ @@ -81,6 +68,11 @@ public class TextArea extends AbstractTextField { } + @Override + public TextAreaState getState() { + return (TextAreaState) super.getState(); + } + /** * Sets the number of rows in the text area. * @@ -91,10 +83,8 @@ public class TextArea extends AbstractTextField { if (rows < 0) { rows = 0; } - if (this.rows != rows) { - this.rows = rows; - requestRepaint(); - } + getState().setRows(rows); + requestRepaint(); } /** @@ -103,7 +93,7 @@ public class TextArea extends AbstractTextField { * @return number of explicitly set rows. */ public int getRows() { - return rows; + return getState().getRows(); } /** @@ -114,10 +104,8 @@ public class TextArea extends AbstractTextField { * word-wrap mode. */ public void setWordwrap(boolean wordwrap) { - if (this.wordwrap != wordwrap) { - this.wordwrap = wordwrap; - requestRepaint(); - } + getState().setWordwrap(wordwrap); + requestRepaint(); } /** @@ -127,19 +115,7 @@ public class TextArea extends AbstractTextField { * false if not. */ public boolean isWordwrap() { - return wordwrap; + return getState().isWordwrap(); } - @Override - public void paintContent(PaintTarget target) throws PaintException { - super.paintContent(target); - - target.addAttribute("rows", getRows()); - - if (!isWordwrap()) { - // Wordwrap is only painted if turned off to minimize communications - target.addAttribute("wordwrap", false); - } - - } } -- cgit v1.2.3 From 5c43a3fc241514e784d010b47266afaf4a0ab1f5 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Thu, 3 May 2012 22:15:40 +0300 Subject: Updated Audio and Video to use state --- .../terminal/gwt/client/ui/AbstractMediaState.java | 79 ++++++++++++++++ .../terminal/gwt/client/ui/MediaBaseConnector.java | 102 ++++++--------------- .../vaadin/terminal/gwt/client/ui/VMediaBase.java | 6 -- .../gwt/client/ui/audio/AudioConnector.java | 17 ++-- .../terminal/gwt/client/ui/audio/VAudio.java | 5 - .../terminal/gwt/client/ui/video/VVideo.java | 5 - .../gwt/client/ui/video/VideoConnector.java | 32 ++++--- .../terminal/gwt/client/ui/video/VideoState.java | 17 ++++ src/com/vaadin/ui/AbstractMedia.java | 96 ++++++++----------- src/com/vaadin/ui/Video.java | 22 ++--- 10 files changed, 198 insertions(+), 183 deletions(-) create mode 100644 src/com/vaadin/terminal/gwt/client/ui/AbstractMediaState.java create mode 100644 src/com/vaadin/terminal/gwt/client/ui/video/VideoState.java (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbstractMediaState.java b/src/com/vaadin/terminal/gwt/client/ui/AbstractMediaState.java new file mode 100644 index 0000000000..0ecb7159d5 --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/AbstractMediaState.java @@ -0,0 +1,79 @@ +package com.vaadin.terminal.gwt.client.ui; + +import java.util.ArrayList; +import java.util.List; + +import com.vaadin.terminal.gwt.client.ComponentState; +import com.vaadin.terminal.gwt.client.communication.URLReference; + +public class AbstractMediaState extends ComponentState { + private boolean showControls; + + private String altText; + + private boolean htmlContentAllowed; + + private boolean autoplay; + + private boolean muted; + + private List sources = new ArrayList(); + private List sourceTypes = new ArrayList(); + + public boolean isShowControls() { + return showControls; + } + + public void setShowControls(boolean showControls) { + this.showControls = showControls; + } + + public String getAltText() { + return altText; + } + + public void setAltText(String altText) { + this.altText = altText; + } + + public boolean isHtmlContentAllowed() { + return htmlContentAllowed; + } + + public void setHtmlContentAllowed(boolean htmlContentAllowed) { + this.htmlContentAllowed = htmlContentAllowed; + } + + public boolean isAutoplay() { + return autoplay; + } + + public void setAutoplay(boolean autoplay) { + this.autoplay = autoplay; + } + + public boolean isMuted() { + return muted; + } + + public void setMuted(boolean muted) { + this.muted = muted; + } + + public List getSources() { + return sources; + } + + public void setSources(List sources) { + this.sources = sources; + } + + public List getSourceTypes() { + return sourceTypes; + } + + public void setSourceTypes(List sourceTypes) { + this.sourceTypes = sourceTypes; + } + +} diff --git a/src/com/vaadin/terminal/gwt/client/ui/MediaBaseConnector.java b/src/com/vaadin/terminal/gwt/client/ui/MediaBaseConnector.java index 1e067bf6fb..42027f911b 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/MediaBaseConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/MediaBaseConnector.java @@ -3,24 +3,12 @@ */ package com.vaadin.terminal.gwt.client.ui; -import com.vaadin.terminal.gwt.client.ApplicationConnection; -import com.vaadin.terminal.gwt.client.Paintable; -import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.Util; import com.vaadin.terminal.gwt.client.communication.ClientRpc; +import com.vaadin.terminal.gwt.client.communication.StateChangeEvent; +import com.vaadin.terminal.gwt.client.communication.URLReference; -public abstract class MediaBaseConnector extends AbstractComponentConnector - implements Paintable { - - public static final String TAG_SOURCE = "src"; - - public static final String ATTR_MUTED = "muted"; - public static final String ATTR_CONTROLS = "ctrl"; - public static final String ATTR_AUTOPLAY = "auto"; - public static final String ATTR_RESOURCE = "res"; - public static final String ATTR_RESOURCE_TYPE = "type"; - public static final String ATTR_HTML = "html"; - public static final String ATTR_ALT_TEXT = "alt"; +public abstract class MediaBaseConnector extends AbstractComponentConnector { /** * Server to client RPC interface for controlling playback of the media. @@ -54,40 +42,24 @@ public abstract class MediaBaseConnector extends AbstractComponentConnector }); } - public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { - if (!isRealUpdate(uidl)) { - return; - } - - getWidget().setControls(shouldShowControls(uidl)); - getWidget().setAutoplay(shouldAutoplay(uidl)); - getWidget().setMuted(isMediaMuted(uidl)); - - // Add all sources - for (int ix = 0; ix < uidl.getChildCount(); ix++) { - UIDL child = uidl.getChildUIDL(ix); - if (TAG_SOURCE.equals(child.getTag())) { - getWidget() - .addSource(getSourceUrl(child), getSourceType(child)); - } - } - setAltText(uidl); - } - - protected boolean shouldShowControls(UIDL uidl) { - return uidl.getBooleanAttribute(ATTR_CONTROLS); - } - - private boolean shouldAutoplay(UIDL uidl) { - return uidl.getBooleanAttribute(ATTR_AUTOPLAY); - } - - private boolean isMediaMuted(UIDL uidl) { - return uidl.getBooleanAttribute(ATTR_MUTED); + @Override + public AbstractMediaState getState() { + return (AbstractMediaState) super.getState(); } - private boolean allowHtmlContent(UIDL uidl) { - return uidl.getBooleanAttribute(ATTR_HTML); + @Override + public void onStateChanged(StateChangeEvent stateChangeEvent) { + super.onStateChanged(stateChangeEvent); + + getWidget().setControls(getState().isShowControls()); + getWidget().setAutoplay(getState().isAutoplay()); + getWidget().setMuted(getState().isMuted()); + for (int i = 0; i < getState().getSources().size(); i++) { + URLReference source = getState().getSources().get(i); + String sourceType = getState().getSourceTypes().get(i); + getWidget().addSource(source.getURL(), sourceType); + } + setAltText(getState().getAltText()); } @Override @@ -95,36 +67,20 @@ public abstract class MediaBaseConnector extends AbstractComponentConnector return (VMediaBase) super.getWidget(); } - /** - * @param uidl - * @return the URL of a resource to be used as a source for the media - */ - private String getSourceUrl(UIDL uidl) { - String url = getConnection().translateVaadinUri( - uidl.getStringAttribute(MediaBaseConnector.ATTR_RESOURCE)); - if (url == null) { - return ""; + private void setAltText(String altText) { + + if (altText == null || "".equals(altText)) { + altText = getDefaultAltHtml(); + } else if (!getState().isHtmlContentAllowed()) { + altText = Util.escapeHTML(altText); } - return url; + getWidget().setAltText(altText); } /** - * @param uidl - * @return the mime type of the media + * @return the default HTML to show users with browsers that do not support + * HTML5 media markup. */ - private String getSourceType(UIDL uidl) { - return uidl.getStringAttribute(MediaBaseConnector.ATTR_RESOURCE_TYPE); - } - - private void setAltText(UIDL uidl) { - String alt = uidl.getStringAttribute(MediaBaseConnector.ATTR_ALT_TEXT); - - if (alt == null || "".equals(alt)) { - alt = getWidget().getDefaultAltHtml(); - } else if (!allowHtmlContent(uidl)) { - alt = Util.escapeHTML(alt); - } - getWidget().setAltText(alt); - } + protected abstract String getDefaultAltHtml(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/VMediaBase.java b/src/com/vaadin/terminal/gwt/client/ui/VMediaBase.java index 6c5fbc2ef0..40696ccec5 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VMediaBase.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VMediaBase.java @@ -23,12 +23,6 @@ public abstract class VMediaBase extends Widget { media = element; } - /** - * @return the default HTML to show users with browsers that do not support - * HTML5 media markup. - */ - protected abstract String getDefaultAltHtml(); - public void play() { media.play(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/audio/AudioConnector.java b/src/com/vaadin/terminal/gwt/client/ui/audio/AudioConnector.java index d55e66dbd5..1c7feb132a 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/audio/AudioConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/audio/AudioConnector.java @@ -7,9 +7,8 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.user.client.ui.Widget; -import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.BrowserInfo; -import com.vaadin.terminal.gwt.client.UIDL; +import com.vaadin.terminal.gwt.client.communication.StateChangeEvent; import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.MediaBaseConnector; import com.vaadin.ui.Audio; @@ -18,15 +17,13 @@ import com.vaadin.ui.Audio; public class AudioConnector extends MediaBaseConnector { @Override - public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { - super.updateFromUIDL(uidl, client); - if (!isRealUpdate(uidl)) { - return; - } + public void onStateChanged(StateChangeEvent stateChangeEvent) { + super.onStateChanged(stateChangeEvent); + Style style = getWidget().getElement().getStyle(); // Make sure that the controls are not clipped if visible. - if (shouldShowControls(uidl) + if (getState().isShowControls() && (style.getHeight() == null || "".equals(style.getHeight()))) { if (BrowserInfo.get().isChrome()) { style.setHeight(32, Unit.PX); @@ -41,4 +38,8 @@ public class AudioConnector extends MediaBaseConnector { return GWT.create(VAudio.class); } + @Override + protected String getDefaultAltHtml() { + return "Your browser does not support the audio element."; + } } diff --git a/src/com/vaadin/terminal/gwt/client/ui/audio/VAudio.java b/src/com/vaadin/terminal/gwt/client/ui/audio/VAudio.java index 7d5d1fe034..08bc95ba16 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/audio/VAudio.java +++ b/src/com/vaadin/terminal/gwt/client/ui/audio/VAudio.java @@ -19,9 +19,4 @@ public class VAudio extends VMediaBase { setStyleName(CLASSNAME); } - @Override - protected String getDefaultAltHtml() { - return "Your browser does not support the audio element."; - } - } diff --git a/src/com/vaadin/terminal/gwt/client/ui/video/VVideo.java b/src/com/vaadin/terminal/gwt/client/ui/video/VVideo.java index 484000b8d1..a2a4cd0ce3 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/video/VVideo.java +++ b/src/com/vaadin/terminal/gwt/client/ui/video/VVideo.java @@ -52,11 +52,6 @@ public class VVideo extends VMediaBase { Util.notifyParentOfSizeChange(this, true); } - @Override - protected String getDefaultAltHtml() { - return "Your browser does not support the video element."; - } - public void setPoster(String poster) { video.setPoster(poster); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/video/VideoConnector.java b/src/com/vaadin/terminal/gwt/client/ui/video/VideoConnector.java index ec763fff07..da1631c44d 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/video/VideoConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/video/VideoConnector.java @@ -5,31 +5,28 @@ package com.vaadin.terminal.gwt.client.ui.video; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.ui.Widget; -import com.vaadin.terminal.gwt.client.ApplicationConnection; -import com.vaadin.terminal.gwt.client.UIDL; +import com.vaadin.terminal.gwt.client.communication.StateChangeEvent; +import com.vaadin.terminal.gwt.client.communication.URLReference; import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.MediaBaseConnector; import com.vaadin.ui.Video; @Connect(Video.class) public class VideoConnector extends MediaBaseConnector { - public static final String ATTR_POSTER = "poster"; @Override - public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { - super.updateFromUIDL(uidl, client); - if (!isRealUpdate(uidl)) { - return; - } - super.updateFromUIDL(uidl, client); - setPosterFromUIDL(uidl); + public VideoState getState() { + return (VideoState) super.getState(); } - private void setPosterFromUIDL(UIDL uidl) { - if (uidl.hasAttribute(ATTR_POSTER)) { - getWidget().setPoster( - getConnection().translateVaadinUri( - uidl.getStringAttribute(ATTR_POSTER))); + @Override + public void onStateChanged(StateChangeEvent stateChangeEvent) { + super.onStateChanged(stateChangeEvent); + URLReference poster = getState().getPoster(); + if (poster != null) { + getWidget().setPoster(poster.getURL()); + } else { + getWidget().setPoster(null); } } @@ -43,4 +40,9 @@ public class VideoConnector extends MediaBaseConnector { return GWT.create(VVideo.class); } + @Override + protected String getDefaultAltHtml() { + return "Your browser does not support the video element."; + } + } diff --git a/src/com/vaadin/terminal/gwt/client/ui/video/VideoState.java b/src/com/vaadin/terminal/gwt/client/ui/video/VideoState.java new file mode 100644 index 0000000000..ab37c4d352 --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/video/VideoState.java @@ -0,0 +1,17 @@ +package com.vaadin.terminal.gwt.client.ui.video; + +import com.vaadin.terminal.gwt.client.communication.URLReference; +import com.vaadin.terminal.gwt.client.ui.AbstractMediaState; + +public class VideoState extends AbstractMediaState { + private URLReference poster; + + public URLReference getPoster() { + return poster; + } + + public void setPoster(URLReference poster) { + this.poster = poster; + } + +} diff --git a/src/com/vaadin/ui/AbstractMedia.java b/src/com/vaadin/ui/AbstractMedia.java index 09cfd5ff12..760d9878ca 100644 --- a/src/com/vaadin/ui/AbstractMedia.java +++ b/src/com/vaadin/ui/AbstractMedia.java @@ -5,37 +5,25 @@ package com.vaadin.ui; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; import java.util.List; -import java.util.Map; -import com.vaadin.terminal.PaintException; -import com.vaadin.terminal.PaintTarget; import com.vaadin.terminal.Resource; -import com.vaadin.terminal.Vaadin6Component; -import com.vaadin.terminal.gwt.client.ui.MediaBaseConnector; +import com.vaadin.terminal.gwt.client.communication.URLReference; +import com.vaadin.terminal.gwt.client.ui.AbstractMediaState; import com.vaadin.terminal.gwt.client.ui.MediaBaseConnector.MediaControl; +import com.vaadin.terminal.gwt.server.ResourceReference; /** * Abstract base class for the HTML5 media components. * * @author Vaadin Ltd */ -public class AbstractMedia extends AbstractComponent implements - Vaadin6Component { +public class AbstractMedia extends AbstractComponent { - private List sources = new ArrayList(); - - private boolean showControls; - - private String altText; - - private boolean htmlContentAllowed; - - private boolean autoplay; - - private boolean muted; + @Override + public AbstractMediaState getState() { + return (AbstractMediaState) super.getState(); + } /** * Sets a single media file as the source of the media component. @@ -43,10 +31,16 @@ public class AbstractMedia extends AbstractComponent implements * @param source */ public void setSource(Resource source) { - sources.clear(); + clearSources(); + addSource(source); } + private void clearSources() { + getState().getSources().clear(); + getState().getSourceTypes().clear(); + } + /** * Adds an alternative media file to the sources list. Which of the sources * is used is selected by the browser depending on which file formats it @@ -58,7 +52,8 @@ public class AbstractMedia extends AbstractComponent implements */ public void addSource(Resource source) { if (source != null) { - sources.add(source); + getState().getSources().add(new ResourceReference(source)); + getState().getSourceTypes().add(source.getMIMEType()); requestRepaint(); } } @@ -72,15 +67,21 @@ public class AbstractMedia extends AbstractComponent implements * @param sources */ public void setSources(Resource... sources) { - this.sources.addAll(Arrays.asList(sources)); - requestRepaint(); + clearSources(); + for (Resource source : sources) { + addSource(source); + } } /** * @return The sources pointed to in this media. */ public List getSources() { - return Collections.unmodifiableList(sources); + ArrayList sources = new ArrayList(); + for (URLReference ref : getState().getSources()) { + sources.add(((ResourceReference) ref).getResource()); + } + return sources; } /** @@ -89,7 +90,7 @@ public class AbstractMedia extends AbstractComponent implements * @param showControls */ public void setShowControls(boolean showControls) { - this.showControls = showControls; + getState().setShowControls(showControls); requestRepaint(); } @@ -97,7 +98,7 @@ public class AbstractMedia extends AbstractComponent implements * @return true if the browser is to show native media controls. */ public boolean isShowControls() { - return showControls; + return getState().isShowControls(); } /** @@ -109,10 +110,10 @@ public class AbstractMedia extends AbstractComponent implements * "https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox#Using_Flash" * >Mozilla Developer Network for details. * - * @param text + * @param altText */ - public void setAltText(String text) { - altText = text; + public void setAltText(String altText) { + getState().setAltText(altText); requestRepaint(); } @@ -121,7 +122,7 @@ public class AbstractMedia extends AbstractComponent implements * HTML5. */ public String getAltText() { - return altText; + return getState().getAltText(); } /** @@ -131,7 +132,7 @@ public class AbstractMedia extends AbstractComponent implements * @param htmlContentAllowed */ public void setHtmlContentAllowed(boolean htmlContentAllowed) { - this.htmlContentAllowed = htmlContentAllowed; + getState().setHtmlContentAllowed(htmlContentAllowed); requestRepaint(); } @@ -140,7 +141,7 @@ public class AbstractMedia extends AbstractComponent implements * be rendered as HTML. */ public boolean isHtmlContentAllowed() { - return htmlContentAllowed; + return getState().isHtmlContentAllowed(); } /** @@ -150,7 +151,7 @@ public class AbstractMedia extends AbstractComponent implements * @param autoplay */ public void setAutoplay(boolean autoplay) { - this.autoplay = autoplay; + getState().setAutoplay(autoplay); requestRepaint(); } @@ -158,7 +159,7 @@ public class AbstractMedia extends AbstractComponent implements * @return true if the media is set to automatically start playback. */ public boolean isAutoplay() { - return autoplay; + return getState().isAutoplay(); } /** @@ -167,7 +168,7 @@ public class AbstractMedia extends AbstractComponent implements * @param muted */ public void setMuted(boolean muted) { - this.muted = muted; + getState().setMuted(muted); requestRepaint(); } @@ -175,7 +176,7 @@ public class AbstractMedia extends AbstractComponent implements * @return true if the audio is muted. */ public boolean isMuted() { - return muted; + return getState().isMuted(); } /** @@ -192,25 +193,4 @@ public class AbstractMedia extends AbstractComponent implements getRpcProxy(MediaControl.class).play(); } - public void paintContent(PaintTarget target) throws PaintException { - target.addAttribute(MediaBaseConnector.ATTR_CONTROLS, isShowControls()); - if (getAltText() != null) { - target.addAttribute(MediaBaseConnector.ATTR_ALT_TEXT, getAltText()); - } - target.addAttribute(MediaBaseConnector.ATTR_HTML, - isHtmlContentAllowed()); - target.addAttribute(MediaBaseConnector.ATTR_AUTOPLAY, isAutoplay()); - for (Resource r : getSources()) { - target.startTag(MediaBaseConnector.TAG_SOURCE); - target.addAttribute(MediaBaseConnector.ATTR_RESOURCE, r); - target.addAttribute(MediaBaseConnector.ATTR_RESOURCE_TYPE, - r.getMIMEType()); - target.endTag(MediaBaseConnector.TAG_SOURCE); - } - target.addAttribute(MediaBaseConnector.ATTR_MUTED, isMuted()); - } - - public void changeVariables(Object source, Map variables) { - // TODO Remove once Vaadin6Component is no longer implemented - } } diff --git a/src/com/vaadin/ui/Video.java b/src/com/vaadin/ui/Video.java index 28fbfb0547..0a2eccca0f 100644 --- a/src/com/vaadin/ui/Video.java +++ b/src/com/vaadin/ui/Video.java @@ -4,10 +4,9 @@ package com.vaadin.ui; -import com.vaadin.terminal.PaintException; -import com.vaadin.terminal.PaintTarget; import com.vaadin.terminal.Resource; -import com.vaadin.terminal.gwt.client.ui.video.VideoConnector; +import com.vaadin.terminal.gwt.client.ui.video.VideoState; +import com.vaadin.terminal.gwt.server.ResourceReference; /** * The Video component translates into an HTML5 <video> element and as @@ -32,7 +31,10 @@ import com.vaadin.terminal.gwt.client.ui.video.VideoConnector; */ public class Video extends AbstractMedia { - private Resource poster; + @Override + public VideoState getState() { + return (VideoState) super.getState(); + } public Video() { this("", null); @@ -65,21 +67,15 @@ public class Video extends AbstractMedia { * @param poster */ public void setPoster(Resource poster) { - this.poster = poster; + getState().setPoster(new ResourceReference(poster)); + requestRepaint(); } /** * @return The poster image. */ public Resource getPoster() { - return poster; + return ((ResourceReference) getState().getPoster()).getResource(); } - @Override - public void paintContent(PaintTarget target) throws PaintException { - super.paintContent(target); - if (getPoster() != null) { - target.addAttribute(VideoConnector.ATTR_POSTER, getPoster()); - } - } } -- cgit v1.2.3 From 43794ef1b830047e6a5d8270efb86abde56c0e0c Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Fri, 4 May 2012 00:28:25 +0300 Subject: Added support for serializing enums (#8675) Changed JSONSerializer to use JSONValue instead of JSONObject --- .../gwt/client/communication/JSONSerializer.java | 5 +- .../gwt/client/communication/JsonDecoder.java | 9 +- .../gwt/client/communication/JsonEncoder.java | 11 +- .../communication/URLReference_Serializer.java | 10 +- src/com/vaadin/terminal/gwt/server/JsonCodec.java | 18 +++ .../gwt/widgetsetutils/SerializerGenerator.java | 131 +++++++++++++++------ .../gwt/widgetsetutils/SerializerMapGenerator.java | 3 - 7 files changed, 133 insertions(+), 54 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/communication/JSONSerializer.java b/src/com/vaadin/terminal/gwt/client/communication/JSONSerializer.java index 5f82e339f4..f7b3df6b05 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/JSONSerializer.java +++ b/src/com/vaadin/terminal/gwt/client/communication/JSONSerializer.java @@ -5,6 +5,7 @@ package com.vaadin.terminal.gwt.client.communication; import com.google.gwt.json.client.JSONObject; +import com.google.gwt.json.client.JSONValue; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.ConnectorMap; import com.vaadin.terminal.gwt.server.JsonCodec; @@ -40,7 +41,7 @@ public interface JSONSerializer { * references to paintables * @return A deserialized object */ - T deserialize(JSONObject jsonValue, T target, ConnectorMap idMapper, + T deserialize(JSONValue jsonValue, T target, ConnectorMap idMapper, ApplicationConnection connection); /** @@ -56,7 +57,7 @@ public interface JSONSerializer { * references to paintables * @return A JSON serialized version of the object */ - JSONObject serialize(T value, ConnectorMap idMapper, + JSONValue serialize(T value, ConnectorMap idMapper, ApplicationConnection connection); } diff --git a/src/com/vaadin/terminal/gwt/client/communication/JsonDecoder.java b/src/com/vaadin/terminal/gwt/client/communication/JsonDecoder.java index 790b5cb305..d7cf764f75 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/JsonDecoder.java +++ b/src/com/vaadin/terminal/gwt/client/communication/JsonDecoder.java @@ -15,6 +15,7 @@ import java.util.Set; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONString; +import com.google.gwt.json.client.JSONValue; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.Connector; import com.vaadin.terminal.gwt.client.ConnectorMap; @@ -52,7 +53,7 @@ public class JsonDecoder { return decodeValue(type, jsonArray.get(1), target, idMapper, connection); } - private static Object decodeValue(String variableType, Object value, + private static Object decodeValue(String variableType, JSONValue value, Object target, ConnectorMap idMapper, ApplicationConnection connection) { Object val = null; @@ -91,15 +92,15 @@ public class JsonDecoder { } else if (JsonEncoder.VTYPE_CONNECTOR.equals(variableType)) { val = idMapper.getConnector(((JSONString) value).stringValue()); } else { - return decodeObject(variableType, (JSONObject) value, target, - idMapper, connection); + return decodeObject(variableType, value, target, idMapper, + connection); } return val; } private static Object decodeObject(String variableType, - JSONObject encodedValue, Object target, ConnectorMap idMapper, + JSONValue encodedValue, Object target, ConnectorMap idMapper, ApplicationConnection connection) { // object, class name as type JSONSerializer serializer = connection.getSerializerMap() diff --git a/src/com/vaadin/terminal/gwt/client/communication/JsonEncoder.java b/src/com/vaadin/terminal/gwt/client/communication/JsonEncoder.java index 4a3515ff13..599022b78c 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/JsonEncoder.java +++ b/src/com/vaadin/terminal/gwt/client/communication/JsonEncoder.java @@ -80,6 +80,9 @@ public class JsonEncoder { JSONBoolean.getInstance((Boolean) value)); } else if (value instanceof Object[]) { return encodeObjectArray((Object[]) value, connectorMap, connection); + } else if (value instanceof Enum) { + Enum e = (Enum) value; + return encodeEnum(e, connectorMap, connection); } else if (value instanceof Map) { Map map = (Map) value; JSONObject jsonMap = new JSONObject(); @@ -127,6 +130,12 @@ public class JsonEncoder { } } + private static JSONValue encodeEnum(Enum e, ConnectorMap connectorMap, + ApplicationConnection connection) { + return combineTypeAndValue(e.getClass().getName(), + new JSONString(e.toString())); + } + private static JSONValue encodeObjectArray(Object[] array, ConnectorMap connectorMap, ApplicationConnection connection) { JSONArray jsonArray = new JSONArray(); @@ -193,8 +202,6 @@ public class JsonEncoder { return VTYPE_LIST; } else if (value instanceof Set) { return VTYPE_SET; - } else if (value instanceof Enum) { - return VTYPE_STRING; // transported as string representation } else if (value instanceof String[]) { return VTYPE_STRINGARRAY; } else if (value instanceof Object[]) { diff --git a/src/com/vaadin/terminal/gwt/client/communication/URLReference_Serializer.java b/src/com/vaadin/terminal/gwt/client/communication/URLReference_Serializer.java index 27a0d0118e..3ddae493b7 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/URLReference_Serializer.java +++ b/src/com/vaadin/terminal/gwt/client/communication/URLReference_Serializer.java @@ -6,16 +6,18 @@ package com.vaadin.terminal.gwt.client.communication; import com.google.gwt.core.client.GWT; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONObject; +import com.google.gwt.json.client.JSONValue; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.ConnectorMap; public class URLReference_Serializer implements JSONSerializer { - public URLReference deserialize(JSONObject jsonValue, URLReference target, + public URLReference deserialize(JSONValue jsonValue, URLReference target, ConnectorMap idMapper, ApplicationConnection connection) { URLReference reference = GWT.create(URLReference.class); - if (jsonValue.containsKey("URL")) { - JSONArray jsonURL = (JSONArray) jsonValue.get("URL"); + JSONObject json = (JSONObject) jsonValue; + if (json.containsKey("URL")) { + JSONArray jsonURL = (JSONArray) json.get("URL"); String URL = (String) JsonDecoder.decodeValue(jsonURL, null, idMapper, connection); reference.setURL(connection.translateVaadinUri(URL)); @@ -23,7 +25,7 @@ public class URLReference_Serializer implements JSONSerializer { return reference; } - public JSONObject serialize(URLReference value, ConnectorMap idMapper, + public JSONValue serialize(URLReference value, ConnectorMap idMapper, ApplicationConnection connection) { JSONObject json = new JSONObject(); json.put("URL", diff --git a/src/com/vaadin/terminal/gwt/server/JsonCodec.java b/src/com/vaadin/terminal/gwt/server/JsonCodec.java index c88a1c828c..750aa7c15b 100644 --- a/src/com/vaadin/terminal/gwt/server/JsonCodec.java +++ b/src/com/vaadin/terminal/gwt/server/JsonCodec.java @@ -321,6 +321,11 @@ public class JsonCodec implements Serializable { } } + private static Object decodeEnum(Class cls, JSONObject value) { + String enumIdentifier = String.valueOf(value); + return Enum.valueOf(cls, enumIdentifier); + } + private static String[] decodeStringArray(JSONArray jsonArray) throws JSONException { int length = jsonArray.length(); @@ -384,6 +389,11 @@ public class JsonCodec implements Serializable { throws JSONException { Class targetClass = getClassForType(targetType); + if (Enum.class.isAssignableFrom(targetClass)) { + return decodeEnum(targetClass.asSubclass(Enum.class), + serializedObject); + } + try { Object decodedObject = targetClass.newInstance(); for (PropertyDescriptor pd : Introspector.getBeanInfo(targetClass) @@ -484,6 +494,8 @@ public class JsonCodec implements Serializable { } else if (internalTransportType != null) { return combineTypeAndValue(internalTransportType, String.valueOf(value)); + } else if (value instanceof Enum) { + return encodeEnum((Enum) value, application); } else { // Any object that we do not know how to encode we encode by looping // through fields @@ -558,6 +570,12 @@ public class JsonCodec implements Serializable { return false; } + private static JSONArray encodeEnum(Enum e, Application application) + throws JSONException { + String enumIdentifier = e.name(); + return combineTypeAndValue(e.getClass().getName(), enumIdentifier); + } + private static JSONArray encodeArrayContents(Object[] array, Application application) throws JSONException { JSONArray jsonArray = new JSONArray(); diff --git a/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerGenerator.java b/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerGenerator.java index 3b6ab8cdba..0f0ca80426 100644 --- a/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerGenerator.java +++ b/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerGenerator.java @@ -16,12 +16,16 @@ import com.google.gwt.core.ext.TreeLogger; import com.google.gwt.core.ext.TreeLogger.Type; import com.google.gwt.core.ext.UnableToCompleteException; import com.google.gwt.core.ext.typeinfo.JClassType; +import com.google.gwt.core.ext.typeinfo.JEnumConstant; +import com.google.gwt.core.ext.typeinfo.JEnumType; import com.google.gwt.core.ext.typeinfo.JMethod; import com.google.gwt.core.ext.typeinfo.JPrimitiveType; import com.google.gwt.core.ext.typeinfo.JType; import com.google.gwt.core.ext.typeinfo.TypeOracle; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONObject; +import com.google.gwt.json.client.JSONString; +import com.google.gwt.json.client.JSONValue; import com.google.gwt.user.rebind.ClassSourceFileComposerFactory; import com.google.gwt.user.rebind.SourceWriter; import com.vaadin.terminal.gwt.client.ApplicationConnection; @@ -89,6 +93,8 @@ public class SerializerGenerator extends Generator { if (printWriter == null) { return; } + boolean isEnum = (beanType.isEnum() != null); + Date date = new Date(); TypeOracle typeOracle = context.getTypeOracle(); String beanQualifiedSourceName = beanType.getQualifiedSourceName(); @@ -117,7 +123,7 @@ public class SerializerGenerator extends Generator { // public JSONValue serialize(Object value, ConnectorMap idMapper, // ApplicationConnection connection) { - sourceWriter.println("public " + JSONObject.class.getName() + sourceWriter.println("public " + JSONValue.class.getName() + " serialize(" + beanQualifiedSourceName + " value, " + ConnectorMap.class.getName() + " idMapper, " + ApplicationConnection.class.getName() + " connection) {"); @@ -125,48 +131,75 @@ public class SerializerGenerator extends Generator { // MouseEventDetails castedValue = (MouseEventDetails) value; sourceWriter.println(beanQualifiedSourceName + " castedValue = (" + beanQualifiedSourceName + ") value;"); - // JSONObject json = new JSONObject(); - sourceWriter.println(JSONObject.class.getName() + " json = new " - + JSONObject.class.getName() + "();"); - for (JMethod setterMethod : getSetters(beanType)) { - String setterName = setterMethod.getName(); - String fieldName = setterName.substring(3); // setZindex() -> ZIndex - String getterName = findGetter(beanType, setterMethod); - - if (getterName == null) { - logger.log(TreeLogger.ERROR, "No getter found for " + fieldName - + ". Serialization will likely fail"); - } - // json.put("button", - // JsonEncoder.encode(castedValue.getButton(), idMapper, - // connection)); - sourceWriter.println("json.put(\"" + fieldName + "\", " - + JsonEncoder.class.getName() + ".encode(castedValue." - + getterName + "(), idMapper, connection));"); + if (isEnum) { + writeEnumSerializer(logger, sourceWriter, beanType); + } else { + writeBeanSerializer(logger, sourceWriter, beanType); } - // return json; - sourceWriter.println("return json;"); // } sourceWriter.println("}"); // Deserializer sourceWriter.println("public " + beanQualifiedSourceName - + " deserialize(" + JSONObject.class.getName() + " jsonValue, " + + " deserialize(" + JSONValue.class.getName() + " jsonValue, " + beanQualifiedSourceName + " target, " + ConnectorMap.class.getName() + " idMapper, " + ApplicationConnection.class.getName() + " connection) {"); sourceWriter.indent(); + if (isEnum) { + writeEnumDeserializer(logger, sourceWriter, beanType.isEnum()); + } else { + writeBeanDeserializer(logger, sourceWriter, beanType); + } + sourceWriter.println("}"); + sourceWriter.outdent(); + + // End of class + sourceWriter.println("}"); + sourceWriter.outdent(); + + // commit generated class + context.commit(logger, printWriter); + logger.log(TreeLogger.INFO, "Generated Serializer class " + + getFullyQualifiedSerializerClassName(beanType)); + } + + private void writeEnumDeserializer(TreeLogger logger, + SourceWriter sourceWriter, JEnumType enumType) { + sourceWriter.println("String enumIdentifier = ((" + + JSONString.class.getName() + ")jsonValue).stringValue();"); + for (JEnumConstant e : enumType.getEnumConstants()) { + sourceWriter.println("if (\"" + e.getName() + + "\".equals(enumIdentifier)) {"); + sourceWriter.indent(); + sourceWriter.println("return " + enumType.getQualifiedSourceName() + + "." + e.getName() + ";"); + sourceWriter.outdent(); + sourceWriter.println("}"); + } + sourceWriter.println("return null;"); + } + + private void writeBeanDeserializer(TreeLogger logger, + SourceWriter sourceWriter, JClassType beanType) { + String beanQualifiedSourceName = beanType.getQualifiedSourceName(); + // if (target == null) { sourceWriter.println("if (target == null) {"); sourceWriter.indent(); + // target = GWT.create(VButtonState.class); sourceWriter.println("target = GWT.create(" + beanQualifiedSourceName + ".class);"); sourceWriter.outdent(); sourceWriter.println("}"); + // JSONOBject json = (JSONObject)jsonValue; + sourceWriter.println(JSONObject.class.getName() + " json = (" + + JSONObject.class.getName() + ")jsonValue;"); + for (JMethod method : getSetters(beanType)) { String setterName = method.getName(); String fieldName = setterName.substring(3); // setZIndex() -> ZIndex @@ -175,14 +208,14 @@ public class SerializerGenerator extends Generator { logger.log(Type.DEBUG, "* Processing field " + fieldName + " in " + beanQualifiedSourceName + " (" + beanType.getName() + ")"); - // if (jsonValue.containsKey("height")) { - sourceWriter.println("if (jsonValue.containsKey(\"" + fieldName + // if (json.containsKey("height")) { + sourceWriter.println("if (json.containsKey(\"" + fieldName + "\")) {"); sourceWriter.indent(); String jsonFieldName = "json_" + fieldName; - // JSONArray json_Height = (JSONArray) jsonValue.get("height"); + // JSONArray json_Height = (JSONArray) json.get("height"); sourceWriter.println("JSONArray " + jsonFieldName - + " = (JSONArray) jsonValue.get(\"" + fieldName + "\");"); + + " = (JSONArray) json.get(\"" + fieldName + "\");"); String fieldType; String getterName = "get" + fieldName; @@ -228,17 +261,41 @@ public class SerializerGenerator extends Generator { // return target; sourceWriter.println("return target;"); - sourceWriter.println("}"); - sourceWriter.outdent(); - // End of class - sourceWriter.println("}"); - sourceWriter.outdent(); + } - // commit generated class - context.commit(logger, printWriter); - logger.log(TreeLogger.INFO, "Generated Serializer class " - + getFullyQualifiedSerializerClassName(beanType)); + private void writeEnumSerializer(TreeLogger logger, + SourceWriter sourceWriter, JClassType beanType) { + // return new JSONString(castedValue.name()); + sourceWriter.println("return new " + JSONString.class.getName() + + "(castedValue.name());"); + } + + private void writeBeanSerializer(TreeLogger logger, + SourceWriter sourceWriter, JClassType beanType) { + + // JSONObject json = new JSONObject(); + sourceWriter.println(JSONObject.class.getName() + " json = new " + + JSONObject.class.getName() + "();"); + + for (JMethod setterMethod : getSetters(beanType)) { + String setterName = setterMethod.getName(); + String fieldName = setterName.substring(3); // setZIndex() -> ZIndex + String getterName = findGetter(beanType, setterMethod); + + if (getterName == null) { + logger.log(TreeLogger.ERROR, "No getter found for " + fieldName + + ". Serialization will likely fail"); + } + // json.put("button", + // JsonEncoder.encode(castedValue.getButton(), idMapper, + // connection)); + sourceWriter.println("json.put(\"" + fieldName + "\", " + + JsonEncoder.class.getName() + ".encode(castedValue." + + getterName + "(), idMapper, connection));"); + } + // return json; + sourceWriter.println("return json;"); } @@ -283,10 +340,6 @@ public class SerializerGenerator extends Generator { return setterMethods; } - private String decapitalize(String name) { - return name.substring(0, 1).toLowerCase() + name.substring(1); - } - private static String getSerializerSimpleClassName(JClassType beanType) { return getSimpleClassName(beanType) + "_Serializer"; } diff --git a/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerMapGenerator.java b/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerMapGenerator.java index 013df4710c..07efcda91b 100644 --- a/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerMapGenerator.java +++ b/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerMapGenerator.java @@ -301,9 +301,6 @@ public class SerializerMapGenerator extends Generator { if (setterType.isArray() != null) { return true; } - if (setterType.isEnum() != null) { - return true; - } if (setterType.isPrimitive() != null) { return true; } -- cgit v1.2.3 From d78656c8d59c3b27bcf1ecb0d008a033b794beb1 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Fri, 4 May 2012 00:33:09 +0300 Subject: Updated Label to use shared state --- .../terminal/gwt/client/ui/label/ContentMode.java | 46 ++++++ .../gwt/client/ui/label/LabelConnector.java | 62 ++++---- .../terminal/gwt/client/ui/label/LabelState.java | 25 +++ src/com/vaadin/ui/Label.java | 175 +++------------------ tests/testbench/com/vaadin/tests/Components.java | 2 +- .../com/vaadin/tests/CustomLayoutDemo.java | 2 +- tests/testbench/com/vaadin/tests/LayoutDemo.java | 2 +- .../com/vaadin/tests/NativeWindowing.java | 2 +- .../PerformanceTestBasicComponentRendering.java | 2 +- .../PerformanceTestLabelsAndOrderedLayouts.java | 2 +- .../tests/PerformanceTestSubTreeCaching.java | 2 +- .../com/vaadin/tests/TestCaptionWrapper.java | 2 +- .../com/vaadin/tests/TestForNativeWindowing.java | 2 +- .../com/vaadin/tests/TestForRichTextEditor.java | 2 +- .../com/vaadin/tests/TestForStyledUpload.java | 2 +- .../testbench/com/vaadin/tests/TestForUpload.java | 2 +- tests/testbench/com/vaadin/tests/TestIFrames.java | 2 +- .../testbench/com/vaadin/tests/TreeFilesystem.java | 2 +- .../com/vaadin/tests/UsingObjectsInSelect.java | 2 +- .../tests/application/ApplicationCloseTest.java | 2 +- .../vaadin/tests/components/AbstractTestRoot.java | 2 +- .../com/vaadin/tests/components/TestBase.java | 2 +- .../components/button/ButtonMouseDetails.java | 2 +- .../tests/components/caption/IconsInCaption.java | 2 +- .../components/combobox/ComboFocusBlurEvents.java | 2 +- .../components/customcomponent/ClipContent.java | 2 +- .../components/datefield/DateFieldEmptyValid.java | 2 +- .../components/datefield/ValueThroughProperty.java | 2 +- .../vaadin/tests/components/label/LabelModes.java | 2 +- .../vaadin/tests/components/label/LabelTest.java | 2 +- .../com/vaadin/tests/components/label/Labels.java | 2 +- .../tests/components/label/MarginsInLabels.java | 2 +- .../OptionGroupMultipleValueChange.java | 2 +- .../components/panel/PanelShouldNotScroll.java | 2 +- .../components/popupview/PopupViewOffScreen.java | 2 +- .../tests/components/root/LazyInitRoots.java | 2 +- .../tests/components/table/EditableTableLeak.java | 2 +- .../table/LabelEmbeddedClickThroughForTable.java | 2 +- .../tests/components/table/LongMultiselect.java | 3 - .../com/vaadin/tests/components/table/Tables.java | 2 +- .../tabsheet/WrapTabSheetInTabSheet.java | 2 - .../tests/components/window/LazyWindowResize.java | 2 +- .../window/SubWindowWithUndefinedHeight.java | 4 +- .../integration/JSR286PortletApplication.java | 2 +- .../vaadin/tests/integration/LiferayThemeDemo.java | 2 +- .../tests/layouts/HiddenHorizontalLayout.java | 2 +- .../tests/layouts/TestLayoutPerformance.java | 2 +- .../layouttester/HorizontalLayoutTests.java | 2 +- .../layouts/layouttester/VerticalLayoutTests.java | 2 +- .../com/vaadin/tests/tickets/Ticket1225.java | 2 +- .../com/vaadin/tests/tickets/Ticket124.java | 2 +- .../com/vaadin/tests/tickets/Ticket1444.java | 2 +- .../com/vaadin/tests/tickets/Ticket1804.java | 2 +- .../com/vaadin/tests/tickets/Ticket1811.java | 2 +- .../com/vaadin/tests/tickets/Ticket1819.java | 2 +- .../com/vaadin/tests/tickets/Ticket1970.java | 2 +- .../com/vaadin/tests/tickets/Ticket2104.java | 2 +- .../com/vaadin/tests/tickets/Ticket2117.java | 2 +- .../com/vaadin/tests/tickets/Ticket2119.java | 2 +- .../com/vaadin/tests/tickets/Ticket2240.java | 2 +- .../com/vaadin/tests/tickets/Ticket2287.java | 2 +- .../com/vaadin/tests/tickets/Ticket2304.java | 2 +- .../com/vaadin/tests/tickets/Ticket2426.java | 4 +- .../com/vaadin/tests/tickets/Ticket5952.java | 2 +- .../com/vaadin/tests/tickets/Ticket677.java | 2 +- tests/testbench/com/vaadin/tests/util/Log.java | 2 +- .../com/vaadin/tests/util/SampleDirectory.java | 2 +- 67 files changed, 189 insertions(+), 250 deletions(-) create mode 100644 src/com/vaadin/terminal/gwt/client/ui/label/ContentMode.java create mode 100644 src/com/vaadin/terminal/gwt/client/ui/label/LabelState.java (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/label/ContentMode.java b/src/com/vaadin/terminal/gwt/client/ui/label/ContentMode.java new file mode 100644 index 0000000000..44fd1b7683 --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/label/ContentMode.java @@ -0,0 +1,46 @@ +package com.vaadin.terminal.gwt.client.ui.label; + + +/** + * Content modes defining how the client should interpret a Label's value. + * + * @sine 7.0 + */ +public enum ContentMode { + /** + * Content mode, where the label contains only plain text. The getValue() + * result is coded to XML when painting. + */ + TEXT, + + /** + * Content mode, where the label contains preformatted text. + */ + PREFORMATTED, + + /** + * Content mode, where the label contains XHTML. + */ + XHTML, + + /** + * Content mode, where the label contains well-formed or well-balanced XML. + * Each of the root elements must have their default namespace specified. + * + * @deprecated Use {@link #XHTML} + */ + @Deprecated + XML, + + /** + * Content mode, where the label contains RAW output. Output is not required + * to comply to with XML. In Web Adapter output is inserted inside the + * resulting HTML document as-is. This is useful for some specific purposes + * where possibly broken HTML content needs to be shown, but in most cases + * XHTML mode should be preferred. + * + * @deprecated Use {@link #XHTML}, {@link #TEXT} or {@link #PREFORMATTED}. + */ + @Deprecated + RAW; +} diff --git a/src/com/vaadin/terminal/gwt/client/ui/label/LabelConnector.java b/src/com/vaadin/terminal/gwt/client/ui/label/LabelConnector.java index 308a4860b5..2285fca267 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/label/LabelConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/label/LabelConnector.java @@ -7,54 +7,54 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.PreElement; import com.google.gwt.user.client.ui.Widget; -import com.vaadin.terminal.gwt.client.ApplicationConnection; -import com.vaadin.terminal.gwt.client.Paintable; -import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.Util; +import com.vaadin.terminal.gwt.client.communication.StateChangeEvent; import com.vaadin.terminal.gwt.client.ui.AbstractComponentConnector; import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.Connect.LoadStyle; import com.vaadin.ui.Label; @Connect(value = Label.class, loadStyle = LoadStyle.EAGER) -public class LabelConnector extends AbstractComponentConnector implements - Paintable { +public class LabelConnector extends AbstractComponentConnector { - public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { - getWidget().setConnection(client); - if (!isRealUpdate(uidl)) { - return; - } + public LabelState getState() { + return (LabelState) super.getState(); + } - boolean sinkOnloads = false; + @Override + protected void init() { + super.init(); + getWidget().setConnection(getConnection()); + } - final String mode = uidl.getStringAttribute("mode"); - if (mode == null || "text".equals(mode)) { - getWidget().setText(uidl.getChildString(0)); - } else if ("pre".equals(mode)) { + @Override + public void onStateChanged(StateChangeEvent stateChangeEvent) { + super.onStateChanged(stateChangeEvent); + boolean sinkOnloads = false; + switch (getState().getContentMode()) { + case PREFORMATTED: PreElement preElement = Document.get().createPreElement(); - preElement.setInnerText(uidl.getChildUIDL(0).getChildString(0)); + preElement.setInnerText(getState().getText()); // clear existing content getWidget().setHTML(""); // add preformatted text to dom getWidget().getElement().appendChild(preElement); - } else if ("uidl".equals(mode)) { - getWidget().setHTML(uidl.getChildrenAsXML()); - } else if ("xhtml".equals(mode)) { - UIDL content = uidl.getChildUIDL(0).getChildUIDL(0); - if (content.getChildCount() > 0) { - getWidget().setHTML(content.getChildString(0)); - } else { - getWidget().setHTML(""); - } - sinkOnloads = true; - } else if ("xml".equals(mode)) { - getWidget().setHTML(uidl.getChildUIDL(0).getChildString(0)); - } else if ("raw".equals(mode)) { - getWidget().setHTML(uidl.getChildUIDL(0).getChildString(0)); + break; + + case TEXT: + getWidget().setText(getState().getText()); + break; + + case XHTML: + case RAW: sinkOnloads = true; - } else { + case XML: + getWidget().setHTML(getState().getText()); + break; + default: getWidget().setText(""); + break; + } if (sinkOnloads) { Util.sinkOnloadForImages(getWidget().getElement()); diff --git a/src/com/vaadin/terminal/gwt/client/ui/label/LabelState.java b/src/com/vaadin/terminal/gwt/client/ui/label/LabelState.java new file mode 100644 index 0000000000..ef73a01d2a --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/label/LabelState.java @@ -0,0 +1,25 @@ +package com.vaadin.terminal.gwt.client.ui.label; + +import com.vaadin.terminal.gwt.client.ComponentState; + +public class LabelState extends ComponentState { + private ContentMode contentMode = ContentMode.TEXT; + private String text = ""; + + public ContentMode getContentMode() { + return contentMode; + } + + public void setContentMode(ContentMode contentMode) { + this.contentMode = contentMode; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + +} diff --git a/src/com/vaadin/ui/Label.java b/src/com/vaadin/ui/Label.java index e52090aa5f..99a0f89e5c 100644 --- a/src/com/vaadin/ui/Label.java +++ b/src/com/vaadin/ui/Label.java @@ -5,13 +5,11 @@ package com.vaadin.ui; import java.lang.reflect.Method; -import java.util.Map; import com.vaadin.data.Property; import com.vaadin.data.util.ObjectProperty; -import com.vaadin.terminal.PaintException; -import com.vaadin.terminal.PaintTarget; -import com.vaadin.terminal.Vaadin6Component; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; +import com.vaadin.terminal.gwt.client.ui.label.LabelState; /** * Label component for showing non-editable short texts. @@ -41,120 +39,7 @@ import com.vaadin.terminal.Vaadin6Component; // TODO generics for interface Property public class Label extends AbstractComponent implements Property, Property.Viewer, Property.ValueChangeListener, - Property.ValueChangeNotifier, Comparable, Vaadin6Component { - - /** - * Content modes defining how the client should interpret a Label's value. - * - * @sine 7.0 - */ - public enum ContentMode { - /** - * Content mode, where the label contains only plain text. The - * getValue() result is coded to XML when painting. - */ - TEXT(null) { - @Override - public void paintText(String text, PaintTarget target) - throws PaintException { - target.addText(text); - } - }, - - /** - * Content mode, where the label contains preformatted text. - */ - PREFORMATTED("pre") { - @Override - public void paintText(String text, PaintTarget target) - throws PaintException { - target.startTag("pre"); - target.addText(text); - target.endTag("pre"); - } - }, - - /** - * Content mode, where the label contains XHTML. Contents is then - * enclosed in DIV elements having namespace of - * "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd". - */ - XHTML("xhtml") { - @Override - public void paintText(String text, PaintTarget target) - throws PaintException { - target.startTag("data"); - target.addXMLSection("div", text, - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"); - target.endTag("data"); - } - }, - - /** - * Content mode, where the label contains well-formed or well-balanced - * XML. Each of the root elements must have their default namespace - * specified. - */ - XML("xml") { - @Override - public void paintText(String text, PaintTarget target) - throws PaintException { - target.addXMLSection("data", text, null); - } - }, - - /** - * Content mode, where the label contains RAW output. Output is not - * required to comply to with XML. In Web Adapter output is inserted - * inside the resulting HTML document as-is. This is useful for some - * specific purposes where possibly broken HTML content needs to be - * shown, but in most cases XHTML mode should be preferred. - */ - RAW("raw") { - @Override - public void paintText(String text, PaintTarget target) - throws PaintException { - target.startTag("data"); - target.addAttribute("escape", false); - target.addText(text); - target.endTag("data"); - } - }; - - private final String uidlName; - - /** - * The default content mode is text - */ - public static ContentMode DEFAULT = TEXT; - - private ContentMode(String uidlName) { - this.uidlName = uidlName; - } - - /** - * Gets the name representing this content mode in UIDL messages - * - * @return the UIDL name of this content mode - */ - public String getUidlName() { - return uidlName; - } - - /** - * Adds the text value to a {@link PaintTarget} according to this - * content mode - * - * @param text - * the text to add - * @param target - * the paint target to add the value to - * @throws PaintException - * if the paint operation failed - */ - public abstract void paintText(String text, PaintTarget target) - throws PaintException; - } + Property.ValueChangeNotifier, Comparable { /** * @deprecated From 7.0, use {@link ContentMode#TEXT} instead @@ -187,17 +72,15 @@ public class Label extends AbstractComponent implements Property, public static final ContentMode CONTENT_RAW = ContentMode.RAW; /** - * @deprecated From 7.0, use {@link ContentMode#DEFAULT} instead + * @deprecated From 7.0, use {@link ContentMode#TEXT} instead */ @Deprecated - public static final ContentMode CONTENT_DEFAULT = ContentMode.DEFAULT; + public static final ContentMode CONTENT_DEFAULT = ContentMode.TEXT; private static final String DATASOURCE_MUST_BE_SET = "Datasource must be set"; private Property dataSource; - private ContentMode contentMode = ContentMode.DEFAULT; - /** * Creates an empty Label. */ @@ -211,7 +94,7 @@ public class Label extends AbstractComponent implements Property, * @param content */ public Label(String content) { - this(content, ContentMode.DEFAULT); + this(content, ContentMode.TEXT); } /** @@ -221,7 +104,7 @@ public class Label extends AbstractComponent implements Property, * @param contentSource */ public Label(Property contentSource) { - this(contentSource, ContentMode.DEFAULT); + this(contentSource, ContentMode.TEXT); } /** @@ -243,27 +126,21 @@ public class Label extends AbstractComponent implements Property, */ public Label(Property contentSource, ContentMode contentMode) { setPropertyDataSource(contentSource); - if (contentMode != ContentMode.DEFAULT) { - setContentMode(contentMode); - } + setContentMode(contentMode); setWidth(100, UNITS_PERCENTAGE); } - /** - * Paints the content of this component. - * - * @param target - * the Paint Event. - * @throws PaintException - * if the Paint Operation fails. - */ - public void paintContent(PaintTarget target) throws PaintException { - String uidlName = contentMode.getUidlName(); - if (uidlName != null) { - target.addAttribute("mode", uidlName); - } - contentMode.paintText(getStringValue(), target); + @Override + public void updateState() { + super.updateState(); + // We don't know when the text is updated so update it here before + // sending the state to the client + getState().setText(getStringValue()); + } + @Override + public LabelState getState() { + return (LabelState) super.getState(); } /** @@ -381,7 +258,7 @@ public class Label extends AbstractComponent implements Property, * @see ContentMode */ public ContentMode getContentMode() { - return contentMode; + return getState().getContentMode(); } /** @@ -396,10 +273,9 @@ public class Label extends AbstractComponent implements Property, if (contentMode == null) { throw new IllegalArgumentException("Content mode can not be null"); } - if (contentMode != this.contentMode) { - this.contentMode = contentMode; - requestRepaint(); - } + + getState().setContentMode(contentMode); + requestRepaint(); } /* Value change events */ @@ -516,7 +392,8 @@ public class Label extends AbstractComponent implements Property, String thisValue; String otherValue; - if (contentMode == ContentMode.XML || contentMode == ContentMode.XHTML) { + if (getContentMode() == ContentMode.XML + || getContentMode() == ContentMode.XHTML) { thisValue = stripTags(getStringValue()); } else { thisValue = getStringValue(); @@ -566,8 +443,4 @@ public class Label extends AbstractComponent implements Property, return res.toString(); } - public void changeVariables(Object source, Map variables) { - // TODO Remove once Vaadin6Component is no longer implemented - } - } diff --git a/tests/testbench/com/vaadin/tests/Components.java b/tests/testbench/com/vaadin/tests/Components.java index fa82948e2b..4352072ccf 100644 --- a/tests/testbench/com/vaadin/tests/Components.java +++ b/tests/testbench/com/vaadin/tests/Components.java @@ -17,6 +17,7 @@ import com.vaadin.event.ItemClickEvent; import com.vaadin.event.ItemClickEvent.ItemClickListener; import com.vaadin.terminal.ExternalResource; import com.vaadin.terminal.Sizeable; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.tests.components.AbstractComponentTest; import com.vaadin.ui.AbstractComponent; import com.vaadin.ui.Component; @@ -24,7 +25,6 @@ import com.vaadin.ui.ComponentContainer; import com.vaadin.ui.Embedded; import com.vaadin.ui.HorizontalSplitPanel; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Root.LegacyWindow; import com.vaadin.ui.Tree; import com.vaadin.ui.Tree.ItemStyleGenerator; diff --git a/tests/testbench/com/vaadin/tests/CustomLayoutDemo.java b/tests/testbench/com/vaadin/tests/CustomLayoutDemo.java index 62340b7c9e..73282cc1fb 100644 --- a/tests/testbench/com/vaadin/tests/CustomLayoutDemo.java +++ b/tests/testbench/com/vaadin/tests/CustomLayoutDemo.java @@ -4,6 +4,7 @@ package com.vaadin.tests; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Component.Event; @@ -11,7 +12,6 @@ import com.vaadin.ui.Component.Listener; import com.vaadin.ui.CustomLayout; import com.vaadin.ui.Field; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Panel; import com.vaadin.ui.PasswordField; import com.vaadin.ui.Root.LegacyWindow; diff --git a/tests/testbench/com/vaadin/tests/LayoutDemo.java b/tests/testbench/com/vaadin/tests/LayoutDemo.java index d88285468e..d838283cf1 100644 --- a/tests/testbench/com/vaadin/tests/LayoutDemo.java +++ b/tests/testbench/com/vaadin/tests/LayoutDemo.java @@ -5,12 +5,12 @@ package com.vaadin.tests; import com.vaadin.terminal.ClassResource; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.Component; import com.vaadin.ui.Embedded; import com.vaadin.ui.GridLayout; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Layout; import com.vaadin.ui.Panel; import com.vaadin.ui.Root.LegacyWindow; diff --git a/tests/testbench/com/vaadin/tests/NativeWindowing.java b/tests/testbench/com/vaadin/tests/NativeWindowing.java index 1a22b5a4d2..6a561dd861 100644 --- a/tests/testbench/com/vaadin/tests/NativeWindowing.java +++ b/tests/testbench/com/vaadin/tests/NativeWindowing.java @@ -8,10 +8,10 @@ import java.net.MalformedURLException; import java.net.URL; import com.vaadin.Application; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Root.LegacyWindow; import com.vaadin.ui.Window; diff --git a/tests/testbench/com/vaadin/tests/PerformanceTestBasicComponentRendering.java b/tests/testbench/com/vaadin/tests/PerformanceTestBasicComponentRendering.java index a0bd894ebe..0d588a3306 100644 --- a/tests/testbench/com/vaadin/tests/PerformanceTestBasicComponentRendering.java +++ b/tests/testbench/com/vaadin/tests/PerformanceTestBasicComponentRendering.java @@ -8,12 +8,12 @@ import java.util.Date; import java.util.Map; import com.vaadin.terminal.UserError; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.Button; import com.vaadin.ui.ComboBox; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.DateField; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.TabSheet; import com.vaadin.ui.Table; import com.vaadin.ui.TextField; diff --git a/tests/testbench/com/vaadin/tests/PerformanceTestLabelsAndOrderedLayouts.java b/tests/testbench/com/vaadin/tests/PerformanceTestLabelsAndOrderedLayouts.java index 93df046fa0..b3f232f24d 100644 --- a/tests/testbench/com/vaadin/tests/PerformanceTestLabelsAndOrderedLayouts.java +++ b/tests/testbench/com/vaadin/tests/PerformanceTestLabelsAndOrderedLayouts.java @@ -6,13 +6,13 @@ package com.vaadin.tests; import java.util.Date; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.AbstractOrderedLayout; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.VerticalLayout; public class PerformanceTestLabelsAndOrderedLayouts extends CustomComponent { diff --git a/tests/testbench/com/vaadin/tests/PerformanceTestSubTreeCaching.java b/tests/testbench/com/vaadin/tests/PerformanceTestSubTreeCaching.java index 40433fae84..882b776d5d 100644 --- a/tests/testbench/com/vaadin/tests/PerformanceTestSubTreeCaching.java +++ b/tests/testbench/com/vaadin/tests/PerformanceTestSubTreeCaching.java @@ -6,11 +6,11 @@ package com.vaadin.tests; import java.util.Date; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Table; import com.vaadin.ui.VerticalLayout; diff --git a/tests/testbench/com/vaadin/tests/TestCaptionWrapper.java b/tests/testbench/com/vaadin/tests/TestCaptionWrapper.java index 89822a9574..0e49fdd8ae 100644 --- a/tests/testbench/com/vaadin/tests/TestCaptionWrapper.java +++ b/tests/testbench/com/vaadin/tests/TestCaptionWrapper.java @@ -8,6 +8,7 @@ import com.vaadin.terminal.ClassResource; import com.vaadin.terminal.ErrorMessage; import com.vaadin.terminal.ExternalResource; import com.vaadin.terminal.UserError; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.AbstractComponent; import com.vaadin.ui.Button; import com.vaadin.ui.CheckBox; @@ -17,7 +18,6 @@ import com.vaadin.ui.DateField; import com.vaadin.ui.Embedded; import com.vaadin.ui.GridLayout; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Layout; import com.vaadin.ui.Link; import com.vaadin.ui.NativeSelect; diff --git a/tests/testbench/com/vaadin/tests/TestForNativeWindowing.java b/tests/testbench/com/vaadin/tests/TestForNativeWindowing.java index 91ade9b403..8e4ec17738 100644 --- a/tests/testbench/com/vaadin/tests/TestForNativeWindowing.java +++ b/tests/testbench/com/vaadin/tests/TestForNativeWindowing.java @@ -8,10 +8,10 @@ import java.net.MalformedURLException; import java.net.URL; import com.vaadin.Application; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Root.LegacyWindow; import com.vaadin.ui.Window; diff --git a/tests/testbench/com/vaadin/tests/TestForRichTextEditor.java b/tests/testbench/com/vaadin/tests/TestForRichTextEditor.java index 302d28af35..992222cb9a 100644 --- a/tests/testbench/com/vaadin/tests/TestForRichTextEditor.java +++ b/tests/testbench/com/vaadin/tests/TestForRichTextEditor.java @@ -7,11 +7,11 @@ package com.vaadin.tests; import com.vaadin.data.Property; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.Button; import com.vaadin.ui.CheckBox; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.RichTextArea; import com.vaadin.ui.VerticalLayout; diff --git a/tests/testbench/com/vaadin/tests/TestForStyledUpload.java b/tests/testbench/com/vaadin/tests/TestForStyledUpload.java index 3b1100bb66..1fc20fe3e2 100644 --- a/tests/testbench/com/vaadin/tests/TestForStyledUpload.java +++ b/tests/testbench/com/vaadin/tests/TestForStyledUpload.java @@ -16,10 +16,10 @@ import java.lang.management.MemoryMXBean; import com.vaadin.Application; import com.vaadin.terminal.StreamResource; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Layout; import com.vaadin.ui.Link; import com.vaadin.ui.Panel; diff --git a/tests/testbench/com/vaadin/tests/TestForUpload.java b/tests/testbench/com/vaadin/tests/TestForUpload.java index fdda4dfd2a..c254198add 100644 --- a/tests/testbench/com/vaadin/tests/TestForUpload.java +++ b/tests/testbench/com/vaadin/tests/TestForUpload.java @@ -18,13 +18,13 @@ import java.lang.management.MemoryMXBean; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.terminal.StreamResource; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.AbstractField; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.CheckBox; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Layout; import com.vaadin.ui.Link; import com.vaadin.ui.Panel; diff --git a/tests/testbench/com/vaadin/tests/TestIFrames.java b/tests/testbench/com/vaadin/tests/TestIFrames.java index a8a9d1c2ca..ccddc7f557 100644 --- a/tests/testbench/com/vaadin/tests/TestIFrames.java +++ b/tests/testbench/com/vaadin/tests/TestIFrames.java @@ -4,9 +4,9 @@ package com.vaadin.tests; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.VerticalLayout; public class TestIFrames extends CustomComponent { diff --git a/tests/testbench/com/vaadin/tests/TreeFilesystem.java b/tests/testbench/com/vaadin/tests/TreeFilesystem.java index 28fb289af4..e451d2ced7 100644 --- a/tests/testbench/com/vaadin/tests/TreeFilesystem.java +++ b/tests/testbench/com/vaadin/tests/TreeFilesystem.java @@ -7,9 +7,9 @@ package com.vaadin.tests; import java.io.File; import com.vaadin.data.Item; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.tests.util.SampleDirectory; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Panel; import com.vaadin.ui.Root.LegacyWindow; import com.vaadin.ui.Tree; diff --git a/tests/testbench/com/vaadin/tests/UsingObjectsInSelect.java b/tests/testbench/com/vaadin/tests/UsingObjectsInSelect.java index 780b7d94e1..13918ace90 100644 --- a/tests/testbench/com/vaadin/tests/UsingObjectsInSelect.java +++ b/tests/testbench/com/vaadin/tests/UsingObjectsInSelect.java @@ -9,8 +9,8 @@ import java.util.Random; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Panel; import com.vaadin.ui.Root.LegacyWindow; import com.vaadin.ui.Select; diff --git a/tests/testbench/com/vaadin/tests/application/ApplicationCloseTest.java b/tests/testbench/com/vaadin/tests/application/ApplicationCloseTest.java index 2706134c27..ce41a895c4 100644 --- a/tests/testbench/com/vaadin/tests/application/ApplicationCloseTest.java +++ b/tests/testbench/com/vaadin/tests/application/ApplicationCloseTest.java @@ -1,12 +1,12 @@ package com.vaadin.tests.application; import com.vaadin.Application; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.terminal.gwt.server.WebApplicationContext; import com.vaadin.tests.components.TestBase; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; public class ApplicationCloseTest extends TestBase { diff --git a/tests/testbench/com/vaadin/tests/components/AbstractTestRoot.java b/tests/testbench/com/vaadin/tests/components/AbstractTestRoot.java index eb27d18ca0..fd90cf2d6e 100644 --- a/tests/testbench/com/vaadin/tests/components/AbstractTestRoot.java +++ b/tests/testbench/com/vaadin/tests/components/AbstractTestRoot.java @@ -3,11 +3,11 @@ package com.vaadin.tests.components; import com.vaadin.Application; import com.vaadin.service.ApplicationContext; import com.vaadin.terminal.WrappedRequest; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.terminal.gwt.server.AbstractWebApplicationContext; import com.vaadin.terminal.gwt.server.WebBrowser; import com.vaadin.ui.Component; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Root; import com.vaadin.ui.VerticalLayout; diff --git a/tests/testbench/com/vaadin/tests/components/TestBase.java b/tests/testbench/com/vaadin/tests/components/TestBase.java index 4825e09404..6524a30fb7 100644 --- a/tests/testbench/com/vaadin/tests/components/TestBase.java +++ b/tests/testbench/com/vaadin/tests/components/TestBase.java @@ -1,8 +1,8 @@ package com.vaadin.tests.components; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.Component; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Root.LegacyWindow; import com.vaadin.ui.VerticalLayout; diff --git a/tests/testbench/com/vaadin/tests/components/button/ButtonMouseDetails.java b/tests/testbench/com/vaadin/tests/components/button/ButtonMouseDetails.java index deab87f8a2..8fe56b7619 100644 --- a/tests/testbench/com/vaadin/tests/components/button/ButtonMouseDetails.java +++ b/tests/testbench/com/vaadin/tests/components/button/ButtonMouseDetails.java @@ -1,10 +1,10 @@ package com.vaadin.tests.components.button; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.tests.components.TestBase; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; public class ButtonMouseDetails extends TestBase { diff --git a/tests/testbench/com/vaadin/tests/components/caption/IconsInCaption.java b/tests/testbench/com/vaadin/tests/components/caption/IconsInCaption.java index 428ebdb66b..3211a9c142 100644 --- a/tests/testbench/com/vaadin/tests/components/caption/IconsInCaption.java +++ b/tests/testbench/com/vaadin/tests/components/caption/IconsInCaption.java @@ -3,6 +3,7 @@ package com.vaadin.tests.components.caption; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.terminal.ThemeResource; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.tests.VaadinClasses; import com.vaadin.tests.components.TestBase; import com.vaadin.tests.util.Log; @@ -10,7 +11,6 @@ import com.vaadin.ui.ComboBox; import com.vaadin.ui.ComponentContainer; import com.vaadin.ui.Embedded; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.VerticalLayout; public class IconsInCaption extends TestBase { diff --git a/tests/testbench/com/vaadin/tests/components/combobox/ComboFocusBlurEvents.java b/tests/testbench/com/vaadin/tests/components/combobox/ComboFocusBlurEvents.java index 027cf5fd24..44285f97c2 100644 --- a/tests/testbench/com/vaadin/tests/components/combobox/ComboFocusBlurEvents.java +++ b/tests/testbench/com/vaadin/tests/components/combobox/ComboFocusBlurEvents.java @@ -7,10 +7,10 @@ import com.vaadin.data.util.ObjectProperty; import com.vaadin.event.FieldEvents; import com.vaadin.event.FieldEvents.BlurEvent; import com.vaadin.event.FieldEvents.FocusEvent; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.tests.components.TestBase; import com.vaadin.ui.ComboBox; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.TextField; public class ComboFocusBlurEvents extends TestBase { diff --git a/tests/testbench/com/vaadin/tests/components/customcomponent/ClipContent.java b/tests/testbench/com/vaadin/tests/components/customcomponent/ClipContent.java index 7ba26e54a9..22fc381c72 100644 --- a/tests/testbench/com/vaadin/tests/components/customcomponent/ClipContent.java +++ b/tests/testbench/com/vaadin/tests/components/customcomponent/ClipContent.java @@ -1,11 +1,11 @@ package com.vaadin.tests.components.customcomponent; import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.tests.components.TestBase; import com.vaadin.ui.Button; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.TextField; public class ClipContent extends TestBase { diff --git a/tests/testbench/com/vaadin/tests/components/datefield/DateFieldEmptyValid.java b/tests/testbench/com/vaadin/tests/components/datefield/DateFieldEmptyValid.java index 37fb09ab29..dac3169b18 100644 --- a/tests/testbench/com/vaadin/tests/components/datefield/DateFieldEmptyValid.java +++ b/tests/testbench/com/vaadin/tests/components/datefield/DateFieldEmptyValid.java @@ -7,6 +7,7 @@ import java.util.Locale; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.data.util.ObjectProperty; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.tests.components.TestBase; import com.vaadin.tests.util.Log; import com.vaadin.ui.Button; @@ -14,7 +15,6 @@ import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.DateField; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.PopupDateField; @SuppressWarnings("serial") diff --git a/tests/testbench/com/vaadin/tests/components/datefield/ValueThroughProperty.java b/tests/testbench/com/vaadin/tests/components/datefield/ValueThroughProperty.java index 12c9608d28..578c4df903 100644 --- a/tests/testbench/com/vaadin/tests/components/datefield/ValueThroughProperty.java +++ b/tests/testbench/com/vaadin/tests/components/datefield/ValueThroughProperty.java @@ -6,13 +6,13 @@ import java.util.Locale; import com.vaadin.data.Property; import com.vaadin.data.util.ObjectProperty; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.tests.components.TestBase; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.DateField; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.PopupDateField; public class ValueThroughProperty extends TestBase { diff --git a/tests/testbench/com/vaadin/tests/components/label/LabelModes.java b/tests/testbench/com/vaadin/tests/components/label/LabelModes.java index 00553ddf96..c220076b58 100644 --- a/tests/testbench/com/vaadin/tests/components/label/LabelModes.java +++ b/tests/testbench/com/vaadin/tests/components/label/LabelModes.java @@ -1,8 +1,8 @@ package com.vaadin.tests.components.label; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.tests.components.ComponentTestCase; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; public class LabelModes extends ComponentTestCase