diff options
author | Jouni Koivuviita <jouni@jounikoivuviita.com> | 2012-05-18 20:59:25 +0300 |
---|---|---|
committer | Jouni Koivuviita <jouni@jounikoivuviita.com> | 2012-05-18 20:59:25 +0300 |
commit | 1b5dae24a39944b657ad1fa82a8952adc1c4abd3 (patch) | |
tree | e63f568836f9171a7861843445cc14fde6fa92ca | |
parent | 612443937cdd054b53287c1c2760a48bb2624eec (diff) | |
parent | 2ad73a7b9aedd38b14b0e40195e557dc4b097edd (diff) | |
download | vaadin-framework-1b5dae24a39944b657ad1fa82a8952adc1c4abd3.tar.gz vaadin-framework-1b5dae24a39944b657ad1fa82a8952adc1c4abd3.zip |
Merge branch 'master' into layoutgraph
170 files changed, 2003 insertions, 1475 deletions
diff --git a/src/com/vaadin/Version.java b/src/com/vaadin/Version.java new file mode 100644 index 0000000000..eb6d73e7e0 --- /dev/null +++ b/src/com/vaadin/Version.java @@ -0,0 +1,74 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +package com.vaadin; + +import java.io.Serializable; + +public class Version implements Serializable { + /** + * The version number of this release. For example "6.2.0". Always in the + * format "major.minor.revision[.build]". The build part is optional. All of + * major, minor, revision must be integers. + */ + private static final String VERSION; + /** + * Major version number. For example 6 in 6.2.0. + */ + private static final int VERSION_MAJOR; + + /** + * Minor version number. For example 2 in 6.2.0. + */ + private static final int VERSION_MINOR; + + /** + * Version revision number. For example 0 in 6.2.0. + */ + private static final int VERSION_REVISION; + + /** + * Build identifier. For example "nightly-20091123-c9963" in + * 6.2.0.nightly-20091123-c9963. + */ + private static final String VERSION_BUILD; + + /* Initialize version numbers from string replaced by build-script. */ + static { + if ("@VERSION@".equals("@" + "VERSION" + "@")) { + VERSION = "9.9.9.INTERNAL-DEBUG-BUILD"; + } else { + VERSION = "@VERSION@"; + } + final String[] digits = VERSION.split("\\.", 4); + VERSION_MAJOR = Integer.parseInt(digits[0]); + VERSION_MINOR = Integer.parseInt(digits[1]); + VERSION_REVISION = Integer.parseInt(digits[2]); + if (digits.length == 4) { + VERSION_BUILD = digits[3]; + } else { + VERSION_BUILD = ""; + } + } + + public static String getFullVersion() { + return VERSION; + } + + public static int getMajorVersion() { + return VERSION_MAJOR; + } + + public static int getMinorVersion() { + return VERSION_MINOR; + } + + public static int getRevision() { + return VERSION_REVISION; + } + + public static String getBuildIdentifier() { + return VERSION_BUILD; + } + +} diff --git a/src/com/vaadin/terminal/PaintException.java b/src/com/vaadin/terminal/PaintException.java index 02b138035c..68f689b7f1 100644 --- a/src/com/vaadin/terminal/PaintException.java +++ b/src/com/vaadin/terminal/PaintException.java @@ -30,6 +30,19 @@ public class PaintException extends IOException implements Serializable { } /** + * Constructs an instance of <code>PaintExeception</code> with the specified + * detail message and cause. + * + * @param msg + * the detail message. + * @param cause + * the cause + */ + public PaintException(String msg, Throwable cause) { + super(msg, cause); + } + + /** * Constructs an instance of <code>PaintExeception</code> from IOException. * * @param exception diff --git a/src/com/vaadin/terminal/gwt/DefaultWidgetSet.gwt.xml b/src/com/vaadin/terminal/gwt/DefaultWidgetSet.gwt.xml index abea4a43e4..3487a655e5 100644 --- a/src/com/vaadin/terminal/gwt/DefaultWidgetSet.gwt.xml +++ b/src/com/vaadin/terminal/gwt/DefaultWidgetSet.gwt.xml @@ -45,7 +45,7 @@ </replace-with> <generate-with - class="com.vaadin.terminal.gwt.widgetsetutils.EagerWidgetMapGenerator"> + class="com.vaadin.terminal.gwt.widgetsetutils.EagerWidgetMapGenerator"> <when-type-is class="com.vaadin.terminal.gwt.client.WidgetMap" /> </generate-with> @@ -76,6 +76,18 @@ class="com.vaadin.terminal.gwt.client.communication.RpcManager" /> </generate-with> + <generate-with + class="com.vaadin.terminal.gwt.widgetsetutils.ConnectorWidgetFactoryGenerator"> + <when-type-assignable + class="com.vaadin.terminal.gwt.client.ui.ConnectorWidgetFactory" /> + </generate-with> + + <generate-with + class="com.vaadin.terminal.gwt.widgetsetutils.ConnectorStateFactoryGenerator"> + <when-type-assignable + class="com.vaadin.terminal.gwt.client.ui.ConnectorStateFactory" /> + </generate-with> + <entry-point class="com.vaadin.terminal.gwt.client.ApplicationConfiguration" /> <!-- Use the new cross site linker to get a nocache.js without document.write --> diff --git a/src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java b/src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java index ff77c5904a..8eeccb828d 100644 --- a/src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java +++ b/src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java @@ -212,6 +212,7 @@ public class ApplicationConfiguration implements EntryPoint { private Class<? extends ComponentConnector>[] classes = new Class[1024]; private boolean browserDetailsSent = false; + private boolean widgetsetVersionSent = false; static// TODO consider to make this hashmap per application LinkedList<Command> callbacks = new LinkedList<Command>(); @@ -645,4 +646,23 @@ public class ApplicationConfiguration implements EntryPoint { browserDetailsSent = true; } + /** + * Checks whether the widget set version has been sent to the server. It is + * sent in the first UIDL request. + * + * @return <code>true</code> if browser information has already been sent + * + * @see ApplicationConnection#getNativeBrowserDetailsParameters(String) + */ + public boolean isWidgetsetVersionSent() { + return widgetsetVersionSent; + } + + /** + * Registers that the widget set version has been sent to the server. + */ + public void setWidgetsetVersionSent() { + widgetsetVersionSent = true; + } + } diff --git a/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java b/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java index 739c232a72..51a0ec3f02 100644 --- a/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java +++ b/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java @@ -43,7 +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.SharedState; +import com.vaadin.terminal.gwt.client.communication.SerializerMap; import com.vaadin.terminal.gwt.client.communication.StateChangeEvent; import com.vaadin.terminal.gwt.client.ui.AbstractComponentConnector; import com.vaadin.terminal.gwt.client.ui.VContextMenu; @@ -102,6 +102,8 @@ public class ApplicationConnection { public static final String PARAM_UNLOADBURST = "onunloadburst"; + private static SerializerMap serializerMap; + /** * 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 @@ -197,6 +199,7 @@ public class ApplicationConnection { rpcManager = GWT.create(RpcManager.class); layoutManager = GWT.create(LayoutManager.class); layoutManager.setConnection(this); + serializerMap = GWT.create(SerializerMap.class); } public void init(WidgetSet widgetSet, ApplicationConfiguration cnf) { @@ -412,13 +415,10 @@ public class ApplicationConnection { // initial uidl request String nativeBootstrapParameters = getNativeBrowserDetailsParameters(getConfiguration() .getRootPanelId()); - String widgetsetVersion = ApplicationConfiguration.VERSION; - // TODO figure out how client and view size could be used better on // server. screen size can be accessed via Browser object, but other // values currently only via transaction listener. - String parameters = "repaintAll=1&" + nativeBootstrapParameters - + "&wsver=" + widgetsetVersion; + String parameters = "repaintAll=1&" + nativeBootstrapParameters; return parameters; } @@ -1413,11 +1413,10 @@ public class ApplicationConnection { JSONArray stateDataAndType = new JSONArray( states.getJavaScriptObject(connectorId)); - Object state = JsonDecoder.decodeValue( - stateDataAndType, connectorMap, + JsonDecoder.decodeValue(stateDataAndType, + connector.getState(), connectorMap, ApplicationConnection.this); - connector.setState((SharedState) state); StateChangeEvent event = GWT .create(StateChangeEvent.class); event.setConnector(connector); @@ -1569,7 +1568,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); @@ -1687,11 +1687,12 @@ public class ApplicationConnection { invocationJson.set(2, new JSONString(invocation.getMethodName())); JSONArray paramJson = new JSONArray(); + boolean restrictToInternalTypes = isLegacyVariableChange(invocation); for (int i = 0; i < invocation.getParameters().length; ++i) { // TODO non-static encoder? type registration? paramJson.set(i, JsonEncoder.encode( - invocation.getParameters()[i], getConnectorMap(), - this)); + invocation.getParameters()[i], + restrictToInternalTypes, getConnectorMap(), this)); } invocationJson.set(3, paramJson); reqJson.set(reqJson.size(), invocationJson); @@ -1718,10 +1719,25 @@ public class ApplicationConnection { } else { extraParams = ""; } + if (!getConfiguration().isWidgetsetVersionSent()) { + if (!extraParams.isEmpty()) { + extraParams += "&"; + } + String widgetsetVersion = ApplicationConfiguration.VERSION; + extraParams += "wsver=" + widgetsetVersion; + getConfiguration().setWidgetsetVersionSent(); + } makeUidlRequest(req.toString(), extraParams, forceSync); } + private boolean isLegacyVariableChange(MethodInvocation invocation) { + return ApplicationConnection.UPDATE_VARIABLE_METHOD.equals(invocation + .getInterfaceName()) + && ApplicationConnection.UPDATE_VARIABLE_METHOD + .equals(invocation.getMethodName()); + } + /** * Sends a new value for the given paintables given variable to the server. * <p> @@ -2439,4 +2455,8 @@ public class ApplicationConnection { LayoutManager getLayoutManager() { return layoutManager; } + + public SerializerMap getSerializerMap() { + return serializerMap; + } } diff --git a/src/com/vaadin/terminal/gwt/client/BrowserInfo.java b/src/com/vaadin/terminal/gwt/client/BrowserInfo.java index 064f175301..e12c002930 100644 --- a/src/com/vaadin/terminal/gwt/client/BrowserInfo.java +++ b/src/com/vaadin/terminal/gwt/client/BrowserInfo.java @@ -203,10 +203,6 @@ public class BrowserInfo { return browserDetails.isSafari(); } - public boolean isSafari4() { - return isSafari() && browserDetails.getBrowserMajorVersion() == 4; - } - public boolean isIE8() { return isIE() && browserDetails.getBrowserMajorVersion() == 8; } diff --git a/src/com/vaadin/terminal/gwt/client/ServerConnector.java b/src/com/vaadin/terminal/gwt/client/ServerConnector.java index c10f4bb411..02b894e831 100644 --- a/src/com/vaadin/terminal/gwt/client/ServerConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ServerConnector.java @@ -8,7 +8,6 @@ import java.util.Collection; import com.google.gwt.event.shared.GwtEvent; import com.google.web.bindery.event.shared.HandlerRegistration; import com.vaadin.terminal.gwt.client.communication.ClientRpc; -import com.vaadin.terminal.gwt.client.communication.SharedState; import com.vaadin.terminal.gwt.client.communication.StateChangeEvent.StateChangeHandler; /** @@ -23,21 +22,6 @@ import com.vaadin.terminal.gwt.client.communication.StateChangeEvent.StateChange public interface ServerConnector extends Connector { /** - * Sets a new state for the connector. - * - * @param state - * The new state - * @deprecated This should be removed. Framework should update what is - * returned by getState() instead of setting a new state object. - * Note that this must be done either so that setState accepts a - * state object once (first time received from the server) or - * getState() in AbstractConnector uses a generated class to - * create the state object (like RpcProy.craete()) - */ - @Deprecated - public void setState(SharedState state); - - /** * Gets ApplicationConnection instance that created this connector. * * @return The ApplicationConnection as set by diff --git a/src/com/vaadin/terminal/gwt/client/communication/JSONSerializer.java b/src/com/vaadin/terminal/gwt/client/communication/JSONSerializer.java index c626d31d0a..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; @@ -33,12 +34,14 @@ public interface JSONSerializer<T> { * * @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(JSONValue jsonValue, T target, ConnectorMap idMapper, ApplicationConnection connection); /** @@ -54,7 +57,7 @@ public interface JSONSerializer<T> { * 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 2b58c13f3e..9ed20b6c79 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/JsonDecoder.java +++ b/src/com/vaadin/terminal/gwt/client/communication/JsonDecoder.java @@ -12,12 +12,12 @@ 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.JSONParser; 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; import com.vaadin.terminal.gwt.client.ServerConnector; @@ -33,7 +33,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 +47,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) { + private static Object decodeValue(String variableType, JSONValue value, + Object target, ConnectorMap idMapper, + ApplicationConnection connection) { Object val = null; // TODO type checks etc. if (JsonEncoder.VTYPE_NULL.equals(variableType)) { @@ -64,8 +64,6 @@ public class JsonDecoder { val = decodeArray((JSONArray) value, idMapper, connection); } else if (JsonEncoder.VTYPE_MAP.equals(variableType)) { val = decodeMap((JSONObject) value, idMapper, connection); - } else if (JsonEncoder.VTYPE_MAP_CONNECTOR.equals(variableType)) { - val = decodeConnectorMap((JSONObject) value, idMapper, connection); } else if (JsonEncoder.VTYPE_LIST.equals(variableType)) { val = decodeList((JSONArray) value, idMapper, connection); } else if (JsonEncoder.VTYPE_SET.equals(variableType)) { @@ -92,42 +90,38 @@ 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, - idMapper, connection); - return object; + return decodeObject(variableType, value, target, idMapper, + connection); } return val; } - private static Map<String, Object> decodeMap(JSONObject jsonMap, - ConnectorMap idMapper, ApplicationConnection connection) { - HashMap<String, Object> map = new HashMap<String, Object>(); - Iterator<String> it = jsonMap.keySet().iterator(); - while (it.hasNext()) { - String key = it.next(); - map.put(key, - decodeValue((JSONArray) jsonMap.get(key), idMapper, - connection)); - } - return map; + private static Object decodeObject(String variableType, + JSONValue encodedValue, Object target, ConnectorMap idMapper, + ApplicationConnection connection) { + // object, class name as type + JSONSerializer<Object> 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<Connector, Object> decodeConnectorMap( - JSONObject jsonMap, ConnectorMap idMapper, - ApplicationConnection connection) { - HashMap<Connector, Object> map = new HashMap<Connector, Object>(); + private static Map<Object, Object> decodeMap(JSONObject jsonMap, + ConnectorMap idMapper, ApplicationConnection connection) { + HashMap<Object, Object> map = new HashMap<Object, Object>(); Iterator<String> it = jsonMap.keySet().iterator(); while (it.hasNext()) { - String connectorId = it.next(); - Connector connector = idMapper.getConnector(connectorId); - map.put(connector, - decodeValue((JSONArray) jsonMap.get(connectorId), idMapper, - connection)); + String key = it.next(); + JSONArray encodedKey = (JSONArray) JSONParser.parseStrict(key); + JSONArray encodedValue = (JSONArray) jsonMap.get(key); + Object decodedKey = decodeValue(encodedKey, null, idMapper, + connection); + Object decodedValue = decodeValue(encodedValue, null, idMapper, + connection); + map.put(decodedKey, decodedValue); } return map; } @@ -153,7 +147,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 +158,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..f09536a9f7 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/JsonEncoder.java +++ b/src/com/vaadin/terminal/gwt/client/communication/JsonEncoder.java @@ -42,10 +42,6 @@ public class JsonEncoder { public static final String VTYPE_ARRAY = "a"; public static final String VTYPE_STRINGARRAY = "S"; public static final String VTYPE_MAP = "m"; - // Hack to support Map<Connector,?>. Should be replaced by generic support - // for any object as key (#8602) - @Deprecated - public static final String VTYPE_MAP_CONNECTOR = "M"; public static final String VTYPE_LIST = "L"; public static final String VTYPE_SET = "q"; public static final String VTYPE_NULL = "n"; @@ -61,7 +57,8 @@ public class JsonEncoder { * @param connection * @return JSON representation of the value */ - public static JSONValue encode(Object value, ConnectorMap connectorMap, + public static JSONValue encode(Object value, + boolean restrictToInternalTypes, ConnectorMap connectorMap, ApplicationConnection connection) { if (null == value) { return combineTypeAndValue(VTYPE_NULL, JSONNull.getInstance()); @@ -79,35 +76,28 @@ public class JsonEncoder { return combineTypeAndValue(VTYPE_BOOLEAN, JSONBoolean.getInstance((Boolean) value)); } else if (value instanceof Object[]) { - return encodeObjectArray((Object[]) value, connectorMap, connection); - } else if (value instanceof Map) { - Map<Object, Object> map = (Map<Object, Object>) value; - JSONObject jsonMap = new JSONObject(); - String type = VTYPE_MAP; - for (Object mapKey : map.keySet()) { - Object mapValue = map.get(mapKey); - if (mapKey instanceof Connector) { - mapKey = ((Connector) mapKey).getConnectorId(); - type = VTYPE_MAP_CONNECTOR; - } - - if (!(mapKey instanceof String)) { - throw new RuntimeException( - "Only Map<String,?> and Map<Connector,?> is currently supported." - + " Failed map used " - + mapKey.getClass().getName() + " as keys"); - } - jsonMap.put((String) mapKey, - encode(mapValue, connectorMap, connection)); + return encodeObjectArray((Object[]) value, restrictToInternalTypes, + connectorMap, connection); + } else if (value instanceof Enum) { + if (restrictToInternalTypes) { + // Enums are encoded as strings in Vaadin 6 so we still do that + // for backwards copmatibility. + return encode(value.toString(), restrictToInternalTypes, + connectorMap, connection); + } else { + Enum e = (Enum) value; + return encodeEnum(e, connectorMap, connection); } - return combineTypeAndValue(type, jsonMap); + } else if (value instanceof Map) { + return encodeMap((Map) value, restrictToInternalTypes, + connectorMap, connection); } else if (value instanceof Connector) { Connector connector = (Connector) value; return combineTypeAndValue(VTYPE_CONNECTOR, new JSONString( connector.getConnectorId())); } else if (value instanceof Collection) { - return encodeCollection((Collection) value, connectorMap, - connection); + return encodeCollection((Collection) value, + restrictToInternalTypes, connectorMap, connection); } else { String transportType = getTransportType(value); if (transportType != null) { @@ -117,7 +107,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 @@ -127,22 +117,49 @@ public class JsonEncoder { } } + private static JSONValue encodeMap(Map<Object, Object> map, + boolean restrictToInternalTypes, ConnectorMap connectorMap, + ApplicationConnection connection) { + JSONObject jsonMap = new JSONObject(); + for (Object mapKey : map.keySet()) { + Object mapValue = map.get(mapKey); + JSONValue encodedKey = encode(mapKey, restrictToInternalTypes, + connectorMap, connection); + JSONValue encodedValue = encode(mapValue, restrictToInternalTypes, + connectorMap, connection); + jsonMap.put(encodedKey.toString(), encodedValue); + } + return combineTypeAndValue(VTYPE_MAP, jsonMap); + } + + 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) { + boolean restrictToInternalTypes, ConnectorMap connectorMap, + ApplicationConnection connection) { JSONArray jsonArray = new JSONArray(); for (int i = 0; i < array.length; ++i) { // TODO handle object graph loops? - jsonArray.set(i, encode(array[i], connectorMap, connection)); + jsonArray.set( + i, + encode(array[i], restrictToInternalTypes, connectorMap, + connection)); } return combineTypeAndValue(VTYPE_ARRAY, jsonArray); } private static JSONValue encodeCollection(Collection collection, - ConnectorMap connectorMap, ApplicationConnection connection) { + boolean restrictToInternalTypes, ConnectorMap connectorMap, + ApplicationConnection connection) { JSONArray jsonArray = new JSONArray(); int idx = 0; for (Object o : collection) { - JSONValue encodedObject = encode(o, connectorMap, connection); + JSONValue encodedObject = encode(o, restrictToInternalTypes, + connectorMap, connection); jsonArray.set(idx++, encodedObject); } if (collection instanceof Set) { @@ -193,8 +210,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 4fefc7f845..2ee7df7f6d 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/URLReference_Serializer.java +++ b/src/com/vaadin/terminal/gwt/client/communication/URLReference_Serializer.java @@ -6,26 +6,30 @@ 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<URLReference> { - public URLReference deserialize(JSONObject jsonValue, + public URLReference deserialize(JSONValue 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)); + 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)); + } 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", - JsonEncoder.encode(value.getURL(), idMapper, connection)); + JsonEncoder.encode(value.getURL(), true, idMapper, connection)); return json; } diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbstractComponentConnector.java b/src/com/vaadin/terminal/gwt/client/ui/AbstractComponentConnector.java index fdb04f0ddf..d690bdded1 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/AbstractComponentConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/AbstractComponentConnector.java @@ -18,7 +18,6 @@ import com.vaadin.terminal.gwt.client.TooltipInfo; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.Util; import com.vaadin.terminal.gwt.client.VConsole; -import com.vaadin.terminal.gwt.client.communication.SharedState; import com.vaadin.terminal.gwt.client.communication.StateChangeEvent; import com.vaadin.terminal.gwt.client.ui.root.RootConnector; @@ -29,9 +28,6 @@ public abstract class AbstractComponentConnector extends AbstractConnector private Widget widget; - // shared state from the server to the client - private ComponentState state; - private String lastKnownWidth = ""; private String lastKnownHeight = ""; @@ -47,7 +43,9 @@ public abstract class AbstractComponentConnector extends AbstractConnector * * @return */ - protected abstract Widget createWidget(); + protected Widget createWidget() { + return ConnectorWidgetFactory.createWidget(getClass()); + } /** * Returns the widget associated with this paintable. The widget returned by @@ -63,24 +61,17 @@ public abstract class AbstractComponentConnector extends AbstractConnector return widget; } - /** - * Returns the shared state object for this connector. - * - * If overriding this method to return a more specific type, also - * {@link #createState()} must be overridden. - * - * @return current shared state (not null) - */ - public ComponentState getState() { - return state; - } - @Deprecated public static boolean isRealUpdate(UIDL uidl) { return !uidl.hasAttribute("cached"); } @Override + public ComponentState getState() { + return (ComponentState) super.getState(); + } + + @Override public void onStateChanged(StateChangeEvent stateChangeEvent) { super.onStateChanged(stateChangeEvent); @@ -97,8 +88,9 @@ public abstract class AbstractComponentConnector extends AbstractConnector * Disabled state may affect (override) tabindex so the order must be * first setting tabindex, then enabled state. */ - if (state instanceof TabIndexState && getWidget() instanceof Focusable) { - ((Focusable) getWidget()).setTabIndex(((TabIndexState) state) + if (getState() instanceof TabIndexState + && getWidget() instanceof Focusable) { + ((Focusable) getWidget()).setTabIndex(((TabIndexState) getState()) .getTabIndex()); } @@ -288,17 +280,6 @@ public abstract class AbstractComponentConnector extends AbstractConnector return getState().isReadOnly(); } - /** - * Sets the shared state for the paintable widget. - * - * @param new shared state (must be compatible with the return value of - * {@link #getState()} - {@link ComponentState} if - * {@link #getState()} is not overridden - */ - public final void setState(SharedState state) { - this.state = (ComponentState) state; - } - public LayoutManager getLayoutManager() { return LayoutManager.get(getConnection()); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbstractConnector.java b/src/com/vaadin/terminal/gwt/client/ui/AbstractConnector.java index e205723e64..54812a7a42 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/AbstractConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/AbstractConnector.java @@ -17,6 +17,7 @@ import com.vaadin.terminal.gwt.client.ServerConnector; import com.vaadin.terminal.gwt.client.Util; import com.vaadin.terminal.gwt.client.VConsole; import com.vaadin.terminal.gwt.client.communication.ClientRpc; +import com.vaadin.terminal.gwt.client.communication.SharedState; import com.vaadin.terminal.gwt.client.communication.StateChangeEvent; import com.vaadin.terminal.gwt.client.communication.StateChangeEvent.StateChangeHandler; @@ -38,6 +39,8 @@ public abstract class AbstractConnector implements ServerConnector, private Map<String, Collection<ClientRpc>> rpcImplementations; private final boolean debugLogging = false; + private SharedState state; + /* * (non-Javadoc) * @@ -187,4 +190,32 @@ public abstract class AbstractConnector implements ServerConnector, } } + + /** + * Returns the shared state object for this connector. + * + * Override this method to define the shared state type for your connector. + * + * @return the current shared state (never null) + */ + public SharedState getState() { + if (state == null) { + state = createState(); + } + + return state; + } + + /** + * Creates a state object with default values for this connector. The + * created state object must be compatible with the return type of + * {@link #getState()}. The default implementation creates a state object + * using GWT.create() using the defined return type of {@link #getState()}. + * + * @return A new state object + */ + protected SharedState createState() { + return ConnectorStateFactory.createState(getClass()); + } + } 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..0ab3851671 --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/AbstractMediaState.java @@ -0,0 +1,82 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +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<URLReference> sources = new ArrayList<URLReference>(); + private List<String> sourceTypes = new ArrayList<String>(); + + 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<URLReference> getSources() { + return sources; + } + + public void setSources(List<URLReference> sources) { + this.sources = sources; + } + + public List<String> getSourceTypes() { + return sourceTypes; + } + + public void setSourceTypes(List<String> sourceTypes) { + this.sourceTypes = sourceTypes; + } + +} diff --git a/src/com/vaadin/terminal/gwt/client/ui/ConnectorClassBasedFactory.java b/src/com/vaadin/terminal/gwt/client/ui/ConnectorClassBasedFactory.java new file mode 100644 index 0000000000..051ebdc6df --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/ConnectorClassBasedFactory.java @@ -0,0 +1,40 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +package com.vaadin.terminal.gwt.client.ui; + +import java.util.HashMap; +import java.util.Map; + +import com.vaadin.terminal.gwt.client.Connector; + +public abstract class ConnectorClassBasedFactory<T> { + public interface Creator<T> { + public T create(); + } + + private Map<Class<? extends Connector>, Creator<? extends T>> creators = new HashMap<Class<? extends Connector>, Creator<? extends T>>(); + + protected void addCreator(Class<? extends Connector> cls, + Creator<? extends T> creator) { + creators.put(cls, creator); + } + + /** + * Creates a widget using GWT.create for the given connector, based on its + * {@link AbstractComponentConnector#getWidget()} return type. + * + * @param connector + * @return + */ + public T create(Class<? extends Connector> connector) { + Creator<? extends T> foo = creators.get(connector); + if (foo == null) { + throw new RuntimeException(getClass().getName() + + " could not find a creator for connector of type " + + connector.getName()); + } + return foo.create(); + } + +} diff --git a/src/com/vaadin/terminal/gwt/client/ui/ConnectorStateFactory.java b/src/com/vaadin/terminal/gwt/client/ui/ConnectorStateFactory.java new file mode 100644 index 0000000000..86e651a0a5 --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/ConnectorStateFactory.java @@ -0,0 +1,31 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +package com.vaadin.terminal.gwt.client.ui; + +import com.google.gwt.core.client.GWT; +import com.vaadin.terminal.gwt.client.Connector; +import com.vaadin.terminal.gwt.client.communication.SharedState; + +public abstract class ConnectorStateFactory extends + ConnectorClassBasedFactory<SharedState> { + private static ConnectorStateFactory impl = null; + + /** + * Creates a SharedState using GWT.create for the given connector, based on + * its {@link AbstractComponentConnector#getSharedState ()} return type. + * + * @param connector + * @return + */ + public static SharedState createState(Class<? extends Connector> connector) { + return getImpl().create(connector); + } + + private static ConnectorStateFactory getImpl() { + if (impl == null) { + impl = GWT.create(ConnectorStateFactory.class); + } + return impl; + } +} diff --git a/src/com/vaadin/terminal/gwt/client/ui/ConnectorWidgetFactory.java b/src/com/vaadin/terminal/gwt/client/ui/ConnectorWidgetFactory.java new file mode 100644 index 0000000000..063d9f03a1 --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/ConnectorWidgetFactory.java @@ -0,0 +1,42 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +package com.vaadin.terminal.gwt.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.ui.Widget; +import com.vaadin.terminal.gwt.client.ui.textfield.TextFieldConnector; +import com.vaadin.terminal.gwt.client.ui.textfield.VTextField; + +public abstract class ConnectorWidgetFactory extends + ConnectorClassBasedFactory<Widget> { + private static ConnectorWidgetFactory impl = null; + + // TODO Move to generator + { + addCreator(TextFieldConnector.class, new Creator<Widget>() { + public Widget create() { + return GWT.create(VTextField.class); + } + }); + } + + /** + * Creates a widget using GWT.create for the given connector, based on its + * {@link AbstractComponentConnector#getWidget()} return type. + * + * @param connector + * @return + */ + public static Widget createWidget( + Class<? extends AbstractComponentConnector> connector) { + return getImpl().create(connector); + } + + private static ConnectorWidgetFactory getImpl() { + if (impl == null) { + impl = GWT.create(ConnectorWidgetFactory.class); + } + return impl; + } +} 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/UnknownComponentConnector.java b/src/com/vaadin/terminal/gwt/client/ui/UnknownComponentConnector.java index 94eff44eee..0cccec6481 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/UnknownComponentConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/UnknownComponentConnector.java @@ -4,8 +4,6 @@ package com.vaadin.terminal.gwt.client.ui; -import com.google.gwt.core.client.GWT; -import com.google.gwt.user.client.ui.Widget; public class UnknownComponentConnector extends AbstractComponentConnector { @@ -15,11 +13,6 @@ public class UnknownComponentConnector extends AbstractComponentConnector { } @Override - protected Widget createWidget() { - return GWT.create(VUnknownComponent.class); - } - - @Override public VUnknownComponent getWidget() { return (VUnknownComponent) super.getWidget(); } 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/absolutelayout/AbsoluteLayoutConnector.java b/src/com/vaadin/terminal/gwt/client/ui/absolutelayout/AbsoluteLayoutConnector.java index 80b6254e02..b42c0acea7 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/absolutelayout/AbsoluteLayoutConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/absolutelayout/AbsoluteLayoutConnector.java @@ -6,7 +6,6 @@ package com.vaadin.terminal.gwt.client.ui.absolutelayout; import java.util.HashMap; import java.util.Map; -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.Element; @@ -94,11 +93,6 @@ public class AbsoluteLayoutConnector extends } @Override - protected Widget createWidget() { - return GWT.create(VAbsoluteLayout.class); - } - - @Override public VAbsoluteLayout getWidget() { return (VAbsoluteLayout) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/accordion/AccordionConnector.java b/src/com/vaadin/terminal/gwt/client/ui/accordion/AccordionConnector.java index a03fa37214..f022e97973 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/accordion/AccordionConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/accordion/AccordionConnector.java @@ -5,8 +5,6 @@ package com.vaadin.terminal.gwt.client.ui.accordion; import java.util.Iterator; -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.ComponentConnector; import com.vaadin.terminal.gwt.client.UIDL; @@ -59,11 +57,6 @@ public class AccordionConnector extends TabsheetBaseConnector implements return (VAccordion) super.getWidget(); } - @Override - protected Widget createWidget() { - return GWT.create(VAccordion.class); - } - public void updateCaption(ComponentConnector component) { /* Accordion does not render its children's captions */ } 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 <code>audio</code> 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 <code>audio</code> element."; - } - } diff --git a/src/com/vaadin/terminal/gwt/client/ui/button/ButtonConnector.java b/src/com/vaadin/terminal/gwt/client/ui/button/ButtonConnector.java index a555ecd392..d79aa96ac6 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/button/ButtonConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/button/ButtonConnector.java @@ -4,7 +4,6 @@ package com.vaadin.terminal.gwt.client.ui.button; -import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.BlurEvent; import com.google.gwt.event.dom.client.BlurHandler; import com.google.gwt.event.dom.client.ClickEvent; @@ -13,7 +12,6 @@ import com.google.gwt.event.dom.client.FocusEvent; import com.google.gwt.event.dom.client.FocusHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.DOM; -import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.EventHelper; import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.MouseEventDetailsBuilder; @@ -96,11 +94,6 @@ public class ButtonConnector extends AbstractComponentConnector implements } @Override - protected Widget createWidget() { - return GWT.create(VButton.class); - } - - @Override public VButton getWidget() { return (VButton) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/checkbox/CheckBoxConnector.java b/src/com/vaadin/terminal/gwt/client/ui/checkbox/CheckBoxConnector.java index 731838371f..bc405b793b 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/checkbox/CheckBoxConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/checkbox/CheckBoxConnector.java @@ -3,7 +3,6 @@ */ package com.vaadin.terminal.gwt.client.ui.checkbox; -import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.BlurEvent; import com.google.gwt.event.dom.client.BlurHandler; import com.google.gwt.event.dom.client.ClickEvent; @@ -13,7 +12,6 @@ import com.google.gwt.event.dom.client.FocusHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; -import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.EventHelper; import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.MouseEventDetailsBuilder; @@ -116,11 +114,6 @@ public class CheckBoxConnector extends AbstractFieldConnector implements return (VCheckBox) super.getWidget(); } - @Override - protected Widget createWidget() { - return GWT.create(VCheckBox.class); - } - public void onFocus(FocusEvent event) { // EventHelper.updateFocusHandler ensures that this is called only when // there is a listener on server side diff --git a/src/com/vaadin/terminal/gwt/client/ui/combobox/ComboBoxConnector.java b/src/com/vaadin/terminal/gwt/client/ui/combobox/ComboBoxConnector.java index ee16d90b12..ff153d30c9 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/combobox/ComboBoxConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/combobox/ComboBoxConnector.java @@ -5,8 +5,6 @@ package com.vaadin.terminal.gwt.client.ui.combobox; import java.util.Iterator; -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.Paintable; import com.vaadin.terminal.gwt.client.UIDL; @@ -228,11 +226,6 @@ public class ComboBoxConnector extends AbstractFieldConnector implements } @Override - protected Widget createWidget() { - return GWT.create(VFilterSelect.class); - } - - @Override public VFilterSelect getWidget() { return (VFilterSelect) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/csslayout/CssLayoutConnector.java b/src/com/vaadin/terminal/gwt/client/ui/csslayout/CssLayoutConnector.java index 7df31a8593..71d670fe9d 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/csslayout/CssLayoutConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/csslayout/CssLayoutConnector.java @@ -6,7 +6,6 @@ package com.vaadin.terminal.gwt.client.ui.csslayout; import java.util.HashMap; import java.util.Map; -import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.Widget; @@ -138,11 +137,6 @@ public class CssLayoutConnector extends AbstractLayoutConnector { return (VCssLayout) super.getWidget(); } - @Override - protected Widget createWidget() { - return GWT.create(VCssLayout.class); - } - public void updateCaption(ComponentConnector child) { Widget childWidget = child.getWidget(); FlowPane cssLayoutWidgetContainer = getWidget().panel; diff --git a/src/com/vaadin/terminal/gwt/client/ui/customcomponent/CustomComponentConnector.java b/src/com/vaadin/terminal/gwt/client/ui/customcomponent/CustomComponentConnector.java index a65187a461..981818fc69 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/customcomponent/CustomComponentConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/customcomponent/CustomComponentConnector.java @@ -3,8 +3,6 @@ */ package com.vaadin.terminal.gwt.client.ui.customcomponent; -import com.google.gwt.core.client.GWT; -import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ConnectorHierarchyChangeEvent; import com.vaadin.terminal.gwt.client.ui.AbstractComponentContainerConnector; @@ -17,11 +15,6 @@ public class CustomComponentConnector extends AbstractComponentContainerConnector { @Override - protected Widget createWidget() { - return GWT.create(VCustomComponent.class); - } - - @Override public VCustomComponent getWidget() { return (VCustomComponent) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/customfield/CustomFieldConnector.java b/src/com/vaadin/terminal/gwt/client/ui/customfield/CustomFieldConnector.java index a2ba09da43..09045df6eb 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/customfield/CustomFieldConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/customfield/CustomFieldConnector.java @@ -4,22 +4,19 @@ package com.vaadin.terminal.gwt.client.ui.customfield; import com.google.gwt.core.client.GWT; -import com.google.gwt.user.client.ui.Widget; +import com.vaadin.terminal.gwt.client.AbstractFieldState; +import com.vaadin.terminal.gwt.client.communication.SharedState; import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.customcomponent.CustomComponentConnector; -import com.vaadin.terminal.gwt.client.ui.customcomponent.VCustomComponent; import com.vaadin.ui.CustomField; @Connect(value = CustomField.class) public class CustomFieldConnector extends CustomComponentConnector { - @Override - protected Widget createWidget() { - return GWT.create(VCustomComponent.class); + protected SharedState createState() { + // Workaround as CustomFieldConnector does not extend + // AbstractFieldConnector. + return GWT.create(AbstractFieldState.class); } - @Override - public VCustomComponent getWidget() { - return super.getWidget(); - } } diff --git a/src/com/vaadin/terminal/gwt/client/ui/customlayout/CustomLayoutConnector.java b/src/com/vaadin/terminal/gwt/client/ui/customlayout/CustomLayoutConnector.java index 5e8f01258f..ca24cfc91a 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/customlayout/CustomLayoutConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/customlayout/CustomLayoutConnector.java @@ -3,7 +3,6 @@ */ package com.vaadin.terminal.gwt.client.ui.customlayout; -import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.ComponentConnector; @@ -103,11 +102,6 @@ public class CustomLayoutConnector extends AbstractLayoutConnector implements return (VCustomLayout) super.getWidget(); } - @Override - protected Widget createWidget() { - return GWT.create(VCustomLayout.class); - } - public void updateCaption(ComponentConnector paintable) { getWidget().updateCaption(paintable); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/datefield/AbstractDateFieldConnector.java b/src/com/vaadin/terminal/gwt/client/ui/datefield/AbstractDateFieldConnector.java index e19d9b996f..b55f480bac 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/datefield/AbstractDateFieldConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/datefield/AbstractDateFieldConnector.java @@ -5,8 +5,6 @@ package com.vaadin.terminal.gwt.client.ui.datefield; import java.util.Date; -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.LocaleNotLoadedException; import com.vaadin.terminal.gwt.client.Paintable; @@ -98,11 +96,6 @@ public class AbstractDateFieldConnector extends AbstractFieldConnector } @Override - protected Widget createWidget() { - return GWT.create(VDateField.class); - } - - @Override public VDateField getWidget() { return (VDateField) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/datefield/InlineDateFieldConnector.java b/src/com/vaadin/terminal/gwt/client/ui/datefield/InlineDateFieldConnector.java index 8a4840a088..7cd9c110ba 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/datefield/InlineDateFieldConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/datefield/InlineDateFieldConnector.java @@ -5,8 +5,6 @@ package com.vaadin.terminal.gwt.client.ui.datefield; import java.util.Date; -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.DateTimeService; import com.vaadin.terminal.gwt.client.UIDL; @@ -93,11 +91,6 @@ public class InlineDateFieldConnector extends AbstractDateFieldConnector { } @Override - protected Widget createWidget() { - return GWT.create(VDateFieldCalendar.class); - } - - @Override public VDateFieldCalendar getWidget() { return (VDateFieldCalendar) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/datefield/PopupDateFieldConnector.java b/src/com/vaadin/terminal/gwt/client/ui/datefield/PopupDateFieldConnector.java index 1bcb40d549..e169d83b48 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/datefield/PopupDateFieldConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/datefield/PopupDateFieldConnector.java @@ -6,8 +6,6 @@ package com.vaadin.terminal.gwt.client.ui.datefield; import java.util.Date; -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.DateTimeService; import com.vaadin.terminal.gwt.client.UIDL; @@ -113,11 +111,6 @@ public class PopupDateFieldConnector extends TextualDateConnector { } @Override - protected Widget createWidget() { - return GWT.create(VPopupCalendar.class); - } - - @Override public VPopupCalendar getWidget() { return (VPopupCalendar) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/datefield/TextualDateConnector.java b/src/com/vaadin/terminal/gwt/client/ui/datefield/TextualDateConnector.java index 90679f5705..32af4024cb 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/datefield/TextualDateConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/datefield/TextualDateConnector.java @@ -4,8 +4,6 @@ package com.vaadin.terminal.gwt.client.ui.datefield; -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; @@ -45,11 +43,6 @@ public class TextualDateConnector extends AbstractDateFieldConnector { } @Override - protected Widget createWidget() { - return GWT.create(VTextualDate.class); - } - - @Override public VTextualDate getWidget() { return (VTextualDate) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/draganddropwrapper/DragAndDropWrapperConnector.java b/src/com/vaadin/terminal/gwt/client/ui/draganddropwrapper/DragAndDropWrapperConnector.java index db531ac70f..57f6835bcc 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/draganddropwrapper/DragAndDropWrapperConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/draganddropwrapper/DragAndDropWrapperConnector.java @@ -6,8 +6,6 @@ package com.vaadin.terminal.gwt.client.ui.draganddropwrapper; import java.util.HashMap; import java.util.Set; -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.Paintable; import com.vaadin.terminal.gwt.client.UIDL; @@ -63,11 +61,6 @@ public class DragAndDropWrapperConnector extends CustomComponentConnector } @Override - protected Widget createWidget() { - return GWT.create(VDragAndDropWrapper.class); - } - - @Override public VDragAndDropWrapper getWidget() { return (VDragAndDropWrapper) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/embedded/EmbeddedConnector.java b/src/com/vaadin/terminal/gwt/client/ui/embedded/EmbeddedConnector.java index 81ac195c8e..af3ad67db4 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/embedded/EmbeddedConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/embedded/EmbeddedConnector.java @@ -6,7 +6,6 @@ package com.vaadin.terminal.gwt.client.ui.embedded; import java.util.Map; -import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.dom.client.Node; @@ -16,7 +15,6 @@ import com.google.gwt.dom.client.Style; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; 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.MouseEventDetails; import com.vaadin.terminal.gwt.client.Paintable; @@ -182,11 +180,6 @@ public class EmbeddedConnector extends AbstractComponentConnector implements } @Override - protected Widget createWidget() { - return GWT.create(VEmbedded.class); - } - - @Override public VEmbedded getWidget() { return (VEmbedded) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/form/FormConnector.java b/src/com/vaadin/terminal/gwt/client/ui/form/FormConnector.java index 82cbc95b2d..981c753dd1 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/form/FormConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/form/FormConnector.java @@ -3,7 +3,6 @@ */ package com.vaadin.terminal.gwt.client.ui.form; -import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.KeyDownEvent; import com.google.gwt.user.client.ui.Widget; @@ -192,11 +191,6 @@ public class FormConnector extends AbstractComponentContainerConnector } @Override - protected Widget createWidget() { - return GWT.create(VForm.class); - } - - @Override public boolean isReadOnly() { return super.isReadOnly() || getState().isPropertyReadOnly(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/formlayout/FormLayoutConnector.java b/src/com/vaadin/terminal/gwt/client/ui/formlayout/FormLayoutConnector.java index d7774b66ef..cdac73a771 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/formlayout/FormLayoutConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/formlayout/FormLayoutConnector.java @@ -3,7 +3,6 @@ */ package com.vaadin.terminal.gwt.client.ui.formlayout; -import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ConnectorHierarchyChangeEvent; @@ -97,9 +96,4 @@ public class FormLayoutConnector extends AbstractLayoutConnector { return (VFormLayout) super.getWidget(); } - @Override - protected Widget createWidget() { - return GWT.create(VFormLayout.class); - } - } diff --git a/src/com/vaadin/terminal/gwt/client/ui/gridlayout/GridLayoutConnector.java b/src/com/vaadin/terminal/gwt/client/ui/gridlayout/GridLayoutConnector.java index e4a31b96ef..50afbc5913 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/gridlayout/GridLayoutConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/gridlayout/GridLayoutConnector.java @@ -5,7 +5,6 @@ package com.vaadin.terminal.gwt.client.ui.gridlayout; import java.util.Iterator; -import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.ApplicationConnection; @@ -224,11 +223,6 @@ public class GridLayoutConnector extends AbstractComponentContainerConnector return (VGridLayout) super.getWidget(); } - @Override - protected Widget createWidget() { - return GWT.create(VGridLayout.class); - } - public void layoutVertically() { getWidget().updateHeight(); } 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..2c232c9c38 --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/label/ContentMode.java @@ -0,0 +1,48 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +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..e64f9fffea 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/label/LabelConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/label/LabelConnector.java @@ -3,58 +3,57 @@ */ package com.vaadin.terminal.gwt.client.ui.label; -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; - } + @Override + 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()); @@ -62,11 +61,6 @@ public class LabelConnector extends AbstractComponentConnector implements } @Override - protected Widget createWidget() { - return GWT.create(VLabel.class); - } - - @Override public VLabel getWidget() { return (VLabel) super.getWidget(); } 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..25bbca3c3d --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/label/LabelState.java @@ -0,0 +1,28 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +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/terminal/gwt/client/ui/link/LinkConnector.java b/src/com/vaadin/terminal/gwt/client/ui/link/LinkConnector.java index f74a851d03..c002d2dd50 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/link/LinkConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/link/LinkConnector.java @@ -4,9 +4,7 @@ package com.vaadin.terminal.gwt.client.ui.link; -import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.DOM; -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; @@ -88,11 +86,6 @@ public class LinkConnector extends AbstractComponentConnector implements } @Override - protected Widget createWidget() { - return GWT.create(VLink.class); - } - - @Override public VLink getWidget() { return (VLink) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/listselect/ListSelectConnector.java b/src/com/vaadin/terminal/gwt/client/ui/listselect/ListSelectConnector.java index ddaa959560..8a4553d983 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/listselect/ListSelectConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/listselect/ListSelectConnector.java @@ -4,8 +4,6 @@ package com.vaadin.terminal.gwt.client.ui.listselect; -import com.google.gwt.core.client.GWT; -import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.optiongroup.OptionGroupBaseConnector; import com.vaadin.ui.ListSelect; @@ -14,11 +12,6 @@ import com.vaadin.ui.ListSelect; public class ListSelectConnector extends OptionGroupBaseConnector { @Override - protected Widget createWidget() { - return GWT.create(VListSelect.class); - } - - @Override public VListSelect getWidget() { return (VListSelect) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/menubar/MenuBarConnector.java b/src/com/vaadin/terminal/gwt/client/ui/menubar/MenuBarConnector.java index d063c89ca9..d1f77aa0ff 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/menubar/MenuBarConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/menubar/MenuBarConnector.java @@ -8,7 +8,6 @@ import java.util.Stack; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.Command; -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; @@ -154,11 +153,6 @@ public class MenuBarConnector extends AbstractComponentConnector implements }// updateFromUIDL @Override - protected Widget createWidget() { - return GWT.create(VMenuBar.class); - } - - @Override public VMenuBar getWidget() { return (VMenuBar) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/nativebutton/NativeButtonConnector.java b/src/com/vaadin/terminal/gwt/client/ui/nativebutton/NativeButtonConnector.java index 84d3b73285..c010fba711 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/nativebutton/NativeButtonConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/nativebutton/NativeButtonConnector.java @@ -3,14 +3,12 @@ */ package com.vaadin.terminal.gwt.client.ui.nativebutton; -import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.BlurEvent; import com.google.gwt.event.dom.client.BlurHandler; import com.google.gwt.event.dom.client.FocusEvent; import com.google.gwt.event.dom.client.FocusHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.DOM; -import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.EventHelper; import com.vaadin.terminal.gwt.client.communication.FieldRpc.FocusAndBlurServerRpc; import com.vaadin.terminal.gwt.client.communication.RpcProxy; @@ -100,11 +98,6 @@ public class NativeButtonConnector extends AbstractComponentConnector implements } @Override - protected Widget createWidget() { - return GWT.create(VNativeButton.class); - } - - @Override public VNativeButton getWidget() { return (VNativeButton) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/nativeselect/NativeSelectConnector.java b/src/com/vaadin/terminal/gwt/client/ui/nativeselect/NativeSelectConnector.java index e6264e492f..8f57e0c37f 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/nativeselect/NativeSelectConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/nativeselect/NativeSelectConnector.java @@ -4,8 +4,6 @@ package com.vaadin.terminal.gwt.client.ui.nativeselect; -import com.google.gwt.core.client.GWT; -import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.optiongroup.OptionGroupBaseConnector; import com.vaadin.ui.NativeSelect; @@ -14,11 +12,6 @@ import com.vaadin.ui.NativeSelect; public class NativeSelectConnector extends OptionGroupBaseConnector { @Override - protected Widget createWidget() { - return GWT.create(VNativeSelect.class); - } - - @Override public VNativeSelect getWidget() { return (VNativeSelect) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/optiongroup/OptionGroupConnector.java b/src/com/vaadin/terminal/gwt/client/ui/optiongroup/OptionGroupConnector.java index 06552a2812..e6064bd03f 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/optiongroup/OptionGroupConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/optiongroup/OptionGroupConnector.java @@ -6,7 +6,6 @@ package com.vaadin.terminal.gwt.client.ui.optiongroup; import java.util.ArrayList; -import com.google.gwt.core.client.GWT; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.Widget; @@ -62,11 +61,6 @@ public class OptionGroupConnector extends OptionGroupBaseConnector { } @Override - protected Widget createWidget() { - return GWT.create(VOptionGroup.class); - } - - @Override public VOptionGroup getWidget() { return (VOptionGroup) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/AbstractOrderedLayoutConnector.java b/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/AbstractOrderedLayoutConnector.java index 174da61bd3..d15766db21 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/AbstractOrderedLayoutConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/AbstractOrderedLayoutConnector.java @@ -9,17 +9,14 @@ import com.google.gwt.dom.client.Style; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.Widget; -import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ConnectorHierarchyChangeEvent; import com.vaadin.terminal.gwt.client.DirectionalManagedLayout; import com.vaadin.terminal.gwt.client.LayoutManager; -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.VCaption; -import com.vaadin.terminal.gwt.client.ValueMap; import com.vaadin.terminal.gwt.client.communication.RpcProxy; +import com.vaadin.terminal.gwt.client.communication.StateChangeEvent; import com.vaadin.terminal.gwt.client.ui.AbstractLayoutConnector; import com.vaadin.terminal.gwt.client.ui.AlignmentInfo; import com.vaadin.terminal.gwt.client.ui.LayoutClickEventHandler; @@ -29,7 +26,7 @@ import com.vaadin.terminal.gwt.client.ui.layout.ComponentConnectorLayoutSlot; import com.vaadin.terminal.gwt.client.ui.layout.VLayoutSlot; public abstract class AbstractOrderedLayoutConnector extends - AbstractLayoutConnector implements Paintable, DirectionalManagedLayout { + AbstractLayoutConnector implements DirectionalManagedLayout { AbstractOrderedLayoutServerRpc rpc; @@ -100,35 +97,23 @@ public abstract class AbstractOrderedLayoutConnector extends return (VMeasuringOrderedLayout) super.getWidget(); } - public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { - if (!isRealUpdate(uidl)) { - return; - } + @Override + public void onStateChanged(StateChangeEvent stateChangeEvent) { + super.onStateChanged(stateChangeEvent); + clickEventHandler.handleEventHandlerRegistration(); VMeasuringOrderedLayout layout = getWidget(); - ValueMap expandRatios = uidl.getMapAttribute("expandRatios"); - ValueMap alignments = uidl.getMapAttribute("alignments"); - for (ComponentConnector child : getChildren()) { VLayoutSlot slot = layout.getSlotForChild(child.getWidget()); - String pid = child.getConnectorId(); - AlignmentInfo alignment; - if (alignments.containsKey(pid)) { - alignment = new AlignmentInfo(alignments.getInt(pid)); - } else { - alignment = AlignmentInfo.TOP_LEFT; - } + AlignmentInfo alignment = new AlignmentInfo(getState() + .getChildData().get(child).getAlignmentBitmask()); slot.setAlignment(alignment); - double expandRatio; - if (expandRatios.containsKey(pid)) { - expandRatio = expandRatios.getRawNumber(pid); - } else { - expandRatio = 0; - } + double expandRatio = getState().getChildData().get(child) + .getExpandRatio(); slot.setExpandRatio(expandRatio); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/AbstractOrderedLayoutState.java b/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/AbstractOrderedLayoutState.java index bf542d3951..1d57358490 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/AbstractOrderedLayoutState.java +++ b/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/AbstractOrderedLayoutState.java @@ -3,11 +3,48 @@ */ package com.vaadin.terminal.gwt.client.ui.orderedlayout; +import java.io.Serializable; +import java.util.HashMap; + +import com.vaadin.terminal.gwt.client.Connector; import com.vaadin.terminal.gwt.client.ui.AbstractLayoutState; +import com.vaadin.terminal.gwt.client.ui.AlignmentInfo; public class AbstractOrderedLayoutState extends AbstractLayoutState { private boolean spacing = false; + public HashMap<Connector, ChildComponentData> childData = new HashMap<Connector, ChildComponentData>(); + + public static class ChildComponentData implements Serializable { + private int alignmentBitmask = AlignmentInfo.TOP_LEFT.getBitMask(); + private float expandRatio = 0.0f; + + public int getAlignmentBitmask() { + return alignmentBitmask; + } + + public void setAlignmentBitmask(int alignmentBitmask) { + this.alignmentBitmask = alignmentBitmask; + } + + public float getExpandRatio() { + return expandRatio; + } + + public void setExpandRatio(float expandRatio) { + this.expandRatio = expandRatio; + } + + } + + public HashMap<Connector, ChildComponentData> getChildData() { + return childData; + } + + public void setChildData(HashMap<Connector, ChildComponentData> childData) { + this.childData = childData; + } + public boolean isSpacing() { return spacing; } diff --git a/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/HorizontalLayoutConnector.java b/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/HorizontalLayoutConnector.java index a12b41ade7..3b0014c0f0 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/HorizontalLayoutConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/HorizontalLayoutConnector.java @@ -3,7 +3,6 @@ */ package com.vaadin.terminal.gwt.client.ui.orderedlayout; -import com.google.gwt.core.client.GWT; import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.Connect.LoadStyle; import com.vaadin.ui.HorizontalLayout; @@ -16,9 +15,4 @@ public class HorizontalLayoutConnector extends AbstractOrderedLayoutConnector { return (VHorizontalLayout) super.getWidget(); } - @Override - protected VHorizontalLayout createWidget() { - return GWT.create(VHorizontalLayout.class); - } - } diff --git a/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/VerticalLayoutConnector.java b/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/VerticalLayoutConnector.java index 1e5651ce38..42a762864e 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/VerticalLayoutConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/VerticalLayoutConnector.java @@ -3,7 +3,6 @@ */ package com.vaadin.terminal.gwt.client.ui.orderedlayout; -import com.google.gwt.core.client.GWT; import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.Connect.LoadStyle; import com.vaadin.ui.VerticalLayout; @@ -16,9 +15,4 @@ public class VerticalLayoutConnector extends AbstractOrderedLayoutConnector { return (VVerticalLayout) super.getWidget(); } - @Override - protected VVerticalLayout createWidget() { - return GWT.create(VVerticalLayout.class); - } - } diff --git a/src/com/vaadin/terminal/gwt/client/ui/panel/PanelConnector.java b/src/com/vaadin/terminal/gwt/client/ui/panel/PanelConnector.java index 9555c38a36..35a0ede390 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/panel/PanelConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/panel/PanelConnector.java @@ -3,7 +3,6 @@ */ package com.vaadin.terminal.gwt.client.ui.panel; -import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.dom.client.Style; import com.google.gwt.dom.client.Style.Unit; @@ -172,11 +171,6 @@ public class PanelConnector extends AbstractComponentContainerConnector return (VPanel) super.getWidget(); } - @Override - protected Widget createWidget() { - return GWT.create(VPanel.class); - } - public void layout() { updateSizes(); } 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..c4c5954c33 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/passwordfield/PasswordFieldConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/passwordfield/PasswordFieldConnector.java @@ -4,10 +4,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; @@ -16,16 +12,6 @@ import com.vaadin.ui.PasswordField; 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); - } - - @Override public VPasswordField getWidget() { return (VPasswordField) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/popupview/PopupViewConnector.java b/src/com/vaadin/terminal/gwt/client/ui/popupview/PopupViewConnector.java index 4faa6cec86..c5117fdddb 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/popupview/PopupViewConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/popupview/PopupViewConnector.java @@ -3,8 +3,6 @@ */ package com.vaadin.terminal.gwt.client.ui.popupview; -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.ComponentConnector; import com.vaadin.terminal.gwt.client.Paintable; @@ -106,11 +104,6 @@ public class PopupViewConnector extends AbstractComponentContainerConnector return (VPopupView) super.getWidget(); } - @Override - protected Widget createWidget() { - return GWT.create(VPopupView.class); - } - public void postLayout() { if (centerAfterLayout) { centerAfterLayout = false; diff --git a/src/com/vaadin/terminal/gwt/client/ui/progressindicator/ProgressIndicatorConnector.java b/src/com/vaadin/terminal/gwt/client/ui/progressindicator/ProgressIndicatorConnector.java index 09fa5fb44e..9d0532fae3 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/progressindicator/ProgressIndicatorConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/progressindicator/ProgressIndicatorConnector.java @@ -4,9 +4,7 @@ package com.vaadin.terminal.gwt.client.ui.progressindicator; -import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.DOM; -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; @@ -55,11 +53,6 @@ public class ProgressIndicatorConnector extends AbstractFieldConnector } @Override - protected Widget createWidget() { - return GWT.create(VProgressIndicator.class); - } - - @Override public VProgressIndicator getWidget() { return (VProgressIndicator) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/richtextarea/RichTextAreaConnector.java b/src/com/vaadin/terminal/gwt/client/ui/richtextarea/RichTextAreaConnector.java index 01e79bc1c3..db52640088 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/richtextarea/RichTextAreaConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/richtextarea/RichTextAreaConnector.java @@ -3,9 +3,7 @@ */ package com.vaadin.terminal.gwt.client.ui.richtextarea; -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.Paintable; import com.vaadin.terminal.gwt.client.UIDL; @@ -70,9 +68,4 @@ public class RichTextAreaConnector extends AbstractFieldConnector implements return (VRichTextArea) super.getWidget(); }; - @Override - protected Widget createWidget() { - return GWT.create(VRichTextArea.class); - } - } diff --git a/src/com/vaadin/terminal/gwt/client/ui/root/RootConnector.java b/src/com/vaadin/terminal/gwt/client/ui/root/RootConnector.java index 46f82d60b7..e02bcc9330 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/root/RootConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/root/RootConnector.java @@ -7,7 +7,6 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.dom.client.Style; @@ -299,11 +298,6 @@ public class RootConnector extends AbstractComponentContainerConnector return (VRoot) super.getWidget(); } - @Override - protected Widget createWidget() { - return GWT.create(VRoot.class); - } - protected ComponentConnector getContent() { return (ComponentConnector) getState().getContent(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/slider/SliderConnector.java b/src/com/vaadin/terminal/gwt/client/ui/slider/SliderConnector.java index 9cd3c35fee..6fd7f8b6aa 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/slider/SliderConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/slider/SliderConnector.java @@ -3,10 +3,8 @@ */ package com.vaadin.terminal.gwt.client.ui.slider; -import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; import com.google.gwt.user.client.Command; -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; @@ -69,9 +67,4 @@ public class SliderConnector extends AbstractFieldConnector implements return (VSlider) super.getWidget(); } - @Override - protected Widget createWidget() { - return GWT.create(VSlider.class); - } - } diff --git a/src/com/vaadin/terminal/gwt/client/ui/splitpanel/AbstractSplitPanelConnector.java b/src/com/vaadin/terminal/gwt/client/ui/splitpanel/AbstractSplitPanelConnector.java index b3921204dc..a2f1f26c15 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/splitpanel/AbstractSplitPanelConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/splitpanel/AbstractSplitPanelConnector.java @@ -172,9 +172,6 @@ public abstract class AbstractSplitPanelConnector extends } @Override - protected abstract VAbstractSplitPanel createWidget(); - - @Override public AbstractSplitPanelState getState() { return (AbstractSplitPanelState) super.getState(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/splitpanel/HorizontalSplitPanelConnector.java b/src/com/vaadin/terminal/gwt/client/ui/splitpanel/HorizontalSplitPanelConnector.java index 7814ab8e13..92c942e04b 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/splitpanel/HorizontalSplitPanelConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/splitpanel/HorizontalSplitPanelConnector.java @@ -3,7 +3,6 @@ */ package com.vaadin.terminal.gwt.client.ui.splitpanel; -import com.google.gwt.core.client.GWT; import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.Connect.LoadStyle; import com.vaadin.ui.HorizontalSplitPanel; @@ -12,8 +11,8 @@ import com.vaadin.ui.HorizontalSplitPanel; public class HorizontalSplitPanelConnector extends AbstractSplitPanelConnector { @Override - protected VAbstractSplitPanel createWidget() { - return GWT.create(VSplitPanelHorizontal.class); + public VSplitPanelHorizontal getWidget() { + return (VSplitPanelHorizontal) super.getWidget(); } } diff --git a/src/com/vaadin/terminal/gwt/client/ui/splitpanel/VerticalSplitPanelConnector.java b/src/com/vaadin/terminal/gwt/client/ui/splitpanel/VerticalSplitPanelConnector.java index 83404177c0..5015fcc60c 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/splitpanel/VerticalSplitPanelConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/splitpanel/VerticalSplitPanelConnector.java @@ -12,8 +12,8 @@ import com.vaadin.ui.VerticalSplitPanel; public class VerticalSplitPanelConnector extends AbstractSplitPanelConnector { @Override - protected VAbstractSplitPanel createWidget() { - return GWT.create(VSplitPanelVertical.class); + public VSplitPanelVertical getWidget() { + return (VSplitPanelVertical) super.getWidget(); } } diff --git a/src/com/vaadin/terminal/gwt/client/ui/table/TableConnector.java b/src/com/vaadin/terminal/gwt/client/ui/table/TableConnector.java index f16ee3463f..73bc5da83f 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/table/TableConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/table/TableConnector.java @@ -5,7 +5,6 @@ package com.vaadin.terminal.gwt.client.ui.table; import java.util.Iterator; -import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.dom.client.Style.Position; @@ -261,11 +260,6 @@ public class TableConnector extends AbstractComponentContainerConnector } @Override - protected Widget createWidget() { - return GWT.create(VScrollTable.class); - } - - @Override public VScrollTable getWidget() { return (VScrollTable) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/tabsheet/TabsheetConnector.java b/src/com/vaadin/terminal/gwt/client/ui/tabsheet/TabsheetConnector.java index 7829934f70..08d4679dc5 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/tabsheet/TabsheetConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/tabsheet/TabsheetConnector.java @@ -63,11 +63,6 @@ public class TabsheetConnector extends TabsheetBaseConnector implements } @Override - protected Widget createWidget() { - return GWT.create(VTabsheet.class); - } - - @Override public VTabsheet getWidget() { return (VTabsheet) super.getWidget(); } 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..a235ca5389 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/textarea/TextAreaConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/textarea/TextAreaConnector.java @@ -4,11 +4,7 @@ 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,22 +13,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); - - if (uidl.hasAttribute("rows")) { - getWidget().setRows(uidl.getIntAttribute("rows")); - } - - if (getWidget().getMaxLength() >= 0) { - getWidget().sinkEvents(Event.ONKEYUP); - } + public TextAreaState getState() { + return (TextAreaState) super.getState(); } @Override - protected Widget createWidget() { - return GWT.create(VTextArea.class); + public void onStateChanged(StateChangeEvent stateChangeEvent) { + super.onStateChanged(stateChangeEvent); + + 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..71bdd230b7 --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/textarea/TextAreaState.java @@ -0,0 +1,36 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +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..d11b049f56 --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/textfield/AbstractTextFieldState.java @@ -0,0 +1,61 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +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..04bf029b05 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/textfield/TextFieldConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/textfield/TextFieldConnector.java @@ -4,11 +4,9 @@ package com.vaadin.terminal.gwt.client.ui.textfield; -import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; import com.google.gwt.user.client.Command; 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.Paintable; import com.vaadin.terminal.gwt.client.UIDL; @@ -22,6 +20,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 +36,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 +59,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,21 +88,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 - protected Widget createWidget() { - return GWT.create(VTextField.class); } @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/terminal/gwt/client/ui/tree/TreeConnector.java b/src/com/vaadin/terminal/gwt/client/ui/tree/TreeConnector.java index ebe5d22e99..e4afa32143 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/tree/TreeConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/tree/TreeConnector.java @@ -5,8 +5,6 @@ package com.vaadin.terminal.gwt.client.ui.tree; import java.util.Iterator; -import com.google.gwt.core.client.GWT; -import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.AbstractFieldState; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.BrowserInfo; @@ -130,11 +128,6 @@ public class TreeConnector extends AbstractComponentConnector implements } @Override - protected Widget createWidget() { - return GWT.create(VTree.class); - } - - @Override public VTree getWidget() { return (VTree) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/treetable/TreeTableConnector.java b/src/com/vaadin/terminal/gwt/client/ui/treetable/TreeTableConnector.java index f81771781b..59910c1b3e 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/treetable/TreeTableConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/treetable/TreeTableConnector.java @@ -3,8 +3,6 @@ */ package com.vaadin.terminal.gwt.client.ui.treetable; -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; @@ -91,11 +89,6 @@ public class TreeTableConnector extends TableConnector { } @Override - protected Widget createWidget() { - return GWT.create(VTreeTable.class); - } - - @Override public VTreeTable getWidget() { return (VTreeTable) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/treetable/VTreeTable.java b/src/com/vaadin/terminal/gwt/client/ui/treetable/VTreeTable.java index 2e15e7c445..f7cd9d133e 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/treetable/VTreeTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/treetable/VTreeTable.java @@ -24,7 +24,6 @@ import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.Widget; -import com.vaadin.terminal.gwt.client.BrowserInfo; import com.vaadin.terminal.gwt.client.ComputedStyle; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.Util; @@ -81,7 +80,7 @@ public class VTreeTable extends VScrollTable { return; } - if (animationsEnabled && browserSupportsAnimation()) { + if (animationsEnabled) { if (partialRowAdditions.hasAttribute("hide")) { scrollBody.unlinkRowsAnimatedAndUpdateCacheWhenFinished( partialRowAdditions.getIntAttribute("firstprowix"), @@ -97,11 +96,6 @@ public class VTreeTable extends VScrollTable { } } - private boolean browserSupportsAnimation() { - BrowserInfo bi = BrowserInfo.get(); - return !(bi.isSafari4()); - } - class VTreeTableScrollBody extends VScrollTable.VScrollTableBody { private int identWidth = -1; diff --git a/src/com/vaadin/terminal/gwt/client/ui/twincolselect/TwinColSelectConnector.java b/src/com/vaadin/terminal/gwt/client/ui/twincolselect/TwinColSelectConnector.java index 328d0fc18b..a77319920c 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/twincolselect/TwinColSelectConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/twincolselect/TwinColSelectConnector.java @@ -4,8 +4,6 @@ package com.vaadin.terminal.gwt.client.ui.twincolselect; -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.DirectionalManagedLayout; import com.vaadin.terminal.gwt.client.UIDL; @@ -42,11 +40,6 @@ public class TwinColSelectConnector extends OptionGroupBaseConnector implements } @Override - protected Widget createWidget() { - return GWT.create(VTwinColSelect.class); - } - - @Override public VTwinColSelect getWidget() { return (VTwinColSelect) super.getWidget(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/upload/UploadConnector.java b/src/com/vaadin/terminal/gwt/client/ui/upload/UploadConnector.java index 0a2c0b241e..153d99229b 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/upload/UploadConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/upload/UploadConnector.java @@ -4,8 +4,6 @@ package com.vaadin.terminal.gwt.client.ui.upload; -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.Paintable; import com.vaadin.terminal.gwt.client.UIDL; @@ -56,11 +54,6 @@ public class UploadConnector extends AbstractComponentConnector implements } @Override - protected Widget createWidget() { - return GWT.create(VUpload.class); - } - - @Override public VUpload getWidget() { return (VUpload) super.getWidget(); } 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 <code>video</code> 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..ddf8df66ff 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/video/VideoConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/video/VideoConnector.java @@ -3,33 +3,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); } } @@ -39,8 +34,8 @@ public class VideoConnector extends MediaBaseConnector { } @Override - protected Widget createWidget() { - return GWT.create(VVideo.class); + protected String getDefaultAltHtml() { + return "Your browser does not support the <code>video</code> 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..f59d9ccac1 --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/video/VideoState.java @@ -0,0 +1,20 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +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/terminal/gwt/client/ui/window/WindowConnector.java b/src/com/vaadin/terminal/gwt/client/ui/window/WindowConnector.java index 6979982a9c..3a37baafbb 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/window/WindowConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/window/WindowConnector.java @@ -3,7 +3,6 @@ */ package com.vaadin.terminal.gwt.client.ui.window; -import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.dom.client.Style; @@ -196,11 +195,6 @@ public class WindowConnector extends AbstractComponentContainerConnector } @Override - protected Widget createWidget() { - return GWT.create(VWindow.class); - } - - @Override public void onConnectorHierarchyChange(ConnectorHierarchyChangeEvent event) { super.onConnectorHierarchyChange(event); diff --git a/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java b/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java index 77698805de..1acc9d128a 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java @@ -333,21 +333,6 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet } } - /** - * Checks that the version reported by the client (widgetset) matches that - * of the server. - * - * @param request - */ - private void checkWidgetsetVersion(WrappedRequest request) { - if (!AbstractApplicationServlet.VERSION.equals(request - .getParameter("wsver"))) { - logger.warning(String.format(WIDGETSET_MISMATCH_INFO, - AbstractApplicationServlet.VERSION, - request.getParameter("wsver"))); - } - } - private void checkProductionMode() { // TODO Identical code in AbstractApplicationServlet -> refactor // Check if the application is in production mode. @@ -674,10 +659,6 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet return; } else if (requestType == RequestType.UIDL) { // Handles AJAX UIDL requests - if (isRepaintAll(request)) { - // warn if versions do not match - checkWidgetsetVersion(wrappedRequest); - } applicationManager.handleUidlRequest(wrappedRequest, wrappedResponse, portletWrapper, root); return; diff --git a/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java b/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java index 6ab2748332..905cfe7e3c 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java @@ -90,51 +90,6 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements private static final Logger logger = Logger .getLogger(AbstractApplicationServlet.class.getName()); - /** - * The version number of this release. For example "6.2.0". Always in the - * format "major.minor.revision[.build]". The build part is optional. All of - * major, minor, revision must be integers. - */ - public static final String VERSION; - /** - * Major version number. For example 6 in 6.2.0. - */ - public static final int VERSION_MAJOR; - - /** - * Minor version number. For example 2 in 6.2.0. - */ - public static final int VERSION_MINOR; - - /** - * Version revision number. For example 0 in 6.2.0. - */ - public static final int VERSION_REVISION; - - /** - * Build identifier. For example "nightly-20091123-c9963" in - * 6.2.0.nightly-20091123-c9963. - */ - public static final String VERSION_BUILD; - - /* Initialize version numbers from string replaced by build-script. */ - static { - if ("@VERSION@".equals("@" + "VERSION" + "@")) { - VERSION = "9.9.9.INTERNAL-DEBUG-BUILD"; - } else { - VERSION = "@VERSION@"; - } - final String[] digits = VERSION.split("\\.", 4); - VERSION_MAJOR = Integer.parseInt(digits[0]); - VERSION_MINOR = Integer.parseInt(digits[1]); - VERSION_REVISION = Integer.parseInt(digits[2]); - if (digits.length == 4) { - VERSION_BUILD = digits[3]; - } else { - VERSION_BUILD = ""; - } - } - private Properties applicationProperties; private boolean productionMode = false; @@ -235,19 +190,6 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements } } - /** - * Checks that the version reported by the client (widgetset) matches that - * of the server. - * - * @param request - */ - private void checkWidgetsetVersion(HttpServletRequest request) { - if (!VERSION.equals(request.getParameter("wsver"))) { - logger.warning(String.format(WIDGETSET_MISMATCH_INFO, VERSION, - request.getParameter("wsver"))); - } - } - private void checkProductionMode() { // Check if the application is in production mode. // We are in production mode if productionMode=true @@ -416,11 +358,6 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements return; } - if (isRepaintAll(request)) { - // warn if versions do not match - checkWidgetsetVersion(request); - } - Application application = null; boolean transactionStarted = false; boolean requestStarted = false; diff --git a/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java b/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java index c57e7d8bc1..c08d70aa37 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java @@ -45,6 +45,7 @@ import java.util.logging.Logger; import com.vaadin.Application; import com.vaadin.Application.SystemMessages; import com.vaadin.RootRequiresMoreInformationException; +import com.vaadin.Version; import com.vaadin.external.json.JSONArray; import com.vaadin.external.json.JSONException; import com.vaadin.external.json.JSONObject; @@ -499,6 +500,7 @@ public abstract class AbstractCommunicationManager implements Serializable { WrappedResponse response, Callback callback, Root root) throws IOException, InvalidUIDLSecurityKeyException { + checkWidgetsetVersion(request); requestThemeName = request.getParameter("theme"); maxInactiveInterval = request.getSessionMaxInactiveInterval(); // repaint requested or session has timed out and new one is created @@ -586,6 +588,27 @@ public abstract class AbstractCommunicationManager implements Serializable { } /** + * Checks that the version reported by the client (widgetset) matches that + * of the server. + * + * @param request + */ + private void checkWidgetsetVersion(WrappedRequest request) { + String widgetsetVersion = request.getParameter("wsver"); + if (widgetsetVersion == null) { + // Only check when the widgetset version is reported. It is reported + // in the first UIDL request (not the initial request as it is a + // plain GET /) + return; + } + + if (!Version.getFullVersion().equals(widgetsetVersion)) { + logger.warning(String.format(Constants.WIDGETSET_MISMATCH_INFO, + Version.getFullVersion(), widgetsetVersion)); + } + } + + /** * Method called after the paint phase while still being synchronized on the * application * @@ -803,14 +826,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<? extends SharedState> 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) { @@ -818,7 +855,7 @@ public abstract class AbstractCommunicationManager implements Serializable { "Failed to serialize shared state for connector " + connector.getClass().getName() + " (" + connector.getConnectorId() + "): " - + e.getMessage()); + + e.getMessage(), e); } } } @@ -839,7 +876,7 @@ public abstract class AbstractCommunicationManager implements Serializable { throw new PaintException( "Failed to send connector type for connector " + connector.getConnectorId() + ": " - + e.getMessage()); + + e.getMessage(), e); } } outWriter.print("\"types\":"); @@ -873,7 +910,7 @@ public abstract class AbstractCommunicationManager implements Serializable { throw new PaintException( "Failed to send hierarchy information about " + parentConnectorId + " to the client: " - + e.getMessage()); + + e.getMessage(), e); } } } @@ -900,9 +937,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); @@ -912,7 +961,7 @@ public abstract class AbstractCommunicationManager implements Serializable { + invocation.getConnector().getConnectorId() + " method " + invocation.getInterfaceName() + "." + invocation.getMethodName() + ": " - + e.getMessage()); + + e.getMessage(), e); } } diff --git a/src/com/vaadin/terminal/gwt/server/BootstrapHandler.java b/src/com/vaadin/terminal/gwt/server/BootstrapHandler.java index 84f87124d3..8a0c700121 100644 --- a/src/com/vaadin/terminal/gwt/server/BootstrapHandler.java +++ b/src/com/vaadin/terminal/gwt/server/BootstrapHandler.java @@ -15,6 +15,7 @@ import javax.servlet.http.HttpServletResponse; import com.vaadin.Application; import com.vaadin.RootRequiresMoreInformationException; +import com.vaadin.Version; import com.vaadin.external.json.JSONException; import com.vaadin.external.json.JSONObject; import com.vaadin.terminal.DeploymentConfiguration; @@ -370,7 +371,7 @@ public abstract class BootstrapHandler implements RequestHandler { } JSONObject versionInfo = new JSONObject(); - versionInfo.put("vaadinVersion", AbstractApplicationServlet.VERSION); + versionInfo.put("vaadinVersion", Version.getFullVersion()); versionInfo.put("applicationVersion", application.getVersion()); appConfig.put("versionInfo", versionInfo); @@ -478,8 +479,8 @@ public abstract class BootstrapHandler implements RequestHandler { } Root root = context.getRoot(); - String title = ((root == null || root.getCaption() == null) ? "Vaadin " - + AbstractApplicationServlet.VERSION_MAJOR : root.getCaption()); + String title = ((root == null || root.getCaption() == null) ? "" : root + .getCaption()); page.write("<title>" + AbstractApplicationServlet.safeEscapeForHtml(title) 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<? extends SharedState> 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<? extends SharedState> 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..e082eca47e 100644 --- a/src/com/vaadin/terminal/gwt/server/JsonCodec.java +++ b/src/com/vaadin/terminal/gwt/server/JsonCodec.java @@ -61,6 +61,7 @@ public class JsonCodec implements Serializable { registerType(String[].class, JsonEncoder.VTYPE_STRINGARRAY); registerType(Object[].class, JsonEncoder.VTYPE_ARRAY); registerType(Map.class, JsonEncoder.VTYPE_MAP); + registerType(HashMap.class, JsonEncoder.VTYPE_MAP); registerType(List.class, JsonEncoder.VTYPE_LIST); registerType(Set.class, JsonEncoder.VTYPE_SET); } @@ -143,8 +144,12 @@ public class JsonCodec implements Serializable { } // Try to decode object using fields - return decodeObject(targetType, (JSONObject) valueAndType.get(1), - application); + Object value = valueAndType.get(1); + if (value == JSONObject.NULL) { + return null; + } else { + return decodeObject(targetType, (JSONObject) value, application); + } } /** @@ -197,12 +202,8 @@ public class JsonCodec implements Serializable { } else if (JsonEncoder.VTYPE_SET.equals(transportType)) { return decodeSet(targetType, restrictToInternalTypes, (JSONArray) encodedJsonValue, application); - } else if (JsonEncoder.VTYPE_MAP_CONNECTOR.equals(transportType)) { - return decodeConnectorToObjectMap(targetType, - restrictToInternalTypes, (JSONObject) encodedJsonValue, - application); } else if (JsonEncoder.VTYPE_MAP.equals(transportType)) { - return decodeStringToObjectMap(targetType, restrictToInternalTypes, + return decodeMap(targetType, restrictToInternalTypes, (JSONObject) encodedJsonValue, application); } @@ -258,37 +259,22 @@ public class JsonCodec implements Serializable { return false; } - @Deprecated - private static Map<String, Object> decodeStringToObjectMap(Type targetType, + private static Map<Object, Object> decodeMap(Type targetType, boolean restrictToInternalTypes, JSONObject jsonMap, Application application) throws JSONException { - HashMap<String, Object> map = new HashMap<String, Object>(); - Iterator<String> it = jsonMap.keys(); - while (it.hasNext()) { - String key = it.next(); - JSONArray encodedValueAndType = jsonMap.getJSONArray(key); - Object decodedChild = decodeChild(targetType, - restrictToInternalTypes, 1, encodedValueAndType, - application); - map.put(key, decodedChild); - } - return map; - } + HashMap<Object, Object> map = new HashMap<Object, Object>(); - @Deprecated - private static Map<Connector, Object> decodeConnectorToObjectMap( - Type targetType, boolean restrictToInternalTypes, - JSONObject jsonMap, Application application) throws JSONException { - HashMap<Connector, Object> map = new HashMap<Connector, Object>(); Iterator<String> it = jsonMap.keys(); while (it.hasNext()) { - String connectorId = it.next(); - Connector connector = application.getConnector(connectorId); - JSONArray encodedValueAndType = jsonMap.getJSONArray(connectorId); - Object decodedChild = decodeChild(targetType, - restrictToInternalTypes, 1, encodedValueAndType, - application); - map.put(connector, decodedChild); + String key = it.next(); + JSONArray encodedKey = new JSONArray(key); + JSONArray encodedValue = jsonMap.getJSONArray(key); + + Object decodedKey = decodeParametrizedType(targetType, + restrictToInternalTypes, 0, encodedKey, application); + Object decodedValue = decodeParametrizedType(targetType, + restrictToInternalTypes, 1, encodedValue, application); + map.put(decodedKey, decodedValue); } return map; } @@ -304,7 +290,7 @@ public class JsonCodec implements Serializable { * @return * @throws JSONException */ - private static Object decodeChild(Type targetType, + private static Object decodeParametrizedType(Type targetType, boolean restrictToInternalTypes, int typeIndex, JSONArray encodedValueAndType, Application application) throws JSONException { @@ -321,6 +307,11 @@ public class JsonCodec implements Serializable { } } + private static Object decodeEnum(Class<? extends Enum> 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(); @@ -344,7 +335,7 @@ public class JsonCodec implements Serializable { for (int i = 0; i < jsonArray.length(); ++i) { // each entry always has two elements: type and value JSONArray encodedValueAndType = jsonArray.getJSONArray(i); - Object decodedChild = decodeChild(targetType, + Object decodedChild = decodeParametrizedType(targetType, restrictToInternalTypes, 0, encodedValueAndType, application); list.add(decodedChild); @@ -372,7 +363,7 @@ public class JsonCodec implements Serializable { * @return the name to be used or null if both getter and setter are not * found. */ - private static String getTransportFieldName(PropertyDescriptor pd) { + static String getTransportFieldName(PropertyDescriptor pd) { if (pd.getReadMethod() == null || pd.getWriteMethod() == null) { return null; } @@ -384,6 +375,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) @@ -419,11 +415,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 +449,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[]) { @@ -461,16 +458,9 @@ public class JsonCodec implements Serializable { JSONArray jsonArray = encodeArrayContents(array, application); return combineTypeAndValue(JsonEncoder.VTYPE_ARRAY, jsonArray); } else if (value instanceof Map) { - Map<Object, Object> map = (Map<Object, Object>) value; - JSONObject jsonMap = encodeMapContents(map, application); - // Hack to support Connector as map key. Should be fixed by # - if (!map.isEmpty() - && map.keySet().iterator().next() instanceof Connector) { - return combineTypeAndValue(JsonEncoder.VTYPE_MAP_CONNECTOR, - jsonMap); - } else { - return combineTypeAndValue(JsonEncoder.VTYPE_MAP, jsonMap); - } + JSONObject jsonMap = encodeMap(valueType, (Map<?, ?>) value, + application); + return combineTypeAndValue(JsonEncoder.VTYPE_MAP, jsonMap); } else if (value instanceof Connector) { Connector connector = (Connector) value; if (value instanceof Component @@ -483,11 +473,14 @@ 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 - return combineTypeAndValue(getCustomTransportType(valueType), - encodeObject(value, application)); + return combineTypeAndValue( + getCustomTransportType((Class<?>) valueType), + encodeObject(value, referenceValue, application)); } } @@ -495,22 +488,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,39 +530,80 @@ 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 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(); 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 JSONObject encodeMapContents(Map<Object, Object> map, + 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 encodeMap(Type mapType, Map<?, ?> map, Application application) throws JSONException { + Type keyType, valueType; + + if (mapType instanceof ParameterizedType) { + keyType = ((ParameterizedType) mapType).getActualTypeArguments()[0]; + valueType = ((ParameterizedType) mapType).getActualTypeArguments()[1]; + } else { + throw new JSONException("Map is missing generics"); + } + JSONObject jsonMap = new JSONObject(); for (Object mapKey : map.keySet()) { Object mapValue = map.get(mapKey); - - if (mapKey instanceof ClientConnector) { - mapKey = ((ClientConnector) mapKey).getConnectorId(); - } - if (!(mapKey instanceof String)) { - throw new JSONException( - "Only maps with String/Connector keys are currently supported (#8602)"); - } - - jsonMap.put((String) mapKey, encode(mapValue, null, application)); + JSONArray encodedKey = encode(mapKey, null, keyType, application); + JSONArray encodedValue = encode(mapValue, null, valueType, + application); + jsonMap.put(encodedKey.toString(), encodedValue); } return jsonMap; } 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(); diff --git a/src/com/vaadin/terminal/gwt/server/PortletCommunicationManager.java b/src/com/vaadin/terminal/gwt/server/PortletCommunicationManager.java index b3ec33a9e0..55f15da3d9 100644 --- a/src/com/vaadin/terminal/gwt/server/PortletCommunicationManager.java +++ b/src/com/vaadin/terminal/gwt/server/PortletCommunicationManager.java @@ -15,7 +15,6 @@ import javax.portlet.PortletRequest; import javax.portlet.PortletResponse; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; -import javax.portlet.ResourceResponse; import javax.portlet.ResourceURL; import com.vaadin.Application; @@ -38,7 +37,7 @@ import com.vaadin.ui.Root; @SuppressWarnings("serial") public class PortletCommunicationManager extends AbstractCommunicationManager { - private transient ResourceResponse currentUidlResponse; + private transient MimeResponse currentMimeResponse; public PortletCommunicationManager(Application application) { super(application); @@ -83,13 +82,42 @@ public class PortletCommunicationManager extends AbstractCommunicationManager { } @Override + protected boolean handleApplicationRequest(WrappedRequest request, + WrappedResponse response) throws IOException { + setCurrentMimeReponse(response); + try { + return super.handleApplicationRequest(request, response); + } finally { + currentMimeResponse = null; + } + } + + private void setCurrentMimeReponse(WrappedResponse response) { + PortletResponse portletResponse = ((WrappedPortletResponse) response) + .getPortletResponse(); + if (portletResponse instanceof MimeResponse) { + currentMimeResponse = (MimeResponse) portletResponse; + } + + } + + @Override public void handleUidlRequest(WrappedRequest request, WrappedResponse response, Callback callback, Root root) throws IOException, InvalidUIDLSecurityKeyException { - currentUidlResponse = (ResourceResponse) ((WrappedPortletResponse) response) - .getPortletResponse(); + setCurrentMimeReponse(response); super.handleUidlRequest(request, response, callback, root); - currentUidlResponse = null; + currentMimeResponse = null; + } + + @Override + public void handleBrowserDetailsRequest(WrappedRequest request, + WrappedResponse response, Application application) + throws IOException { + setCurrentMimeReponse(response); + super.handleBrowserDetailsRequest(request, response, application); + currentMimeResponse = null; + } private Map<Connector, Map<String, StreamVariable>> ownerToNameToStreamVariable; @@ -107,7 +135,7 @@ public class PortletCommunicationManager extends AbstractCommunicationManager { ownerToNameToStreamVariable.put(owner, nameToReceiver); } nameToReceiver.put(name, value); - ResourceURL resurl = currentUidlResponse.createResourceURL(); + ResourceURL resurl = createResourceURL(); resurl.setResourceID("UPLOAD"); resurl.setParameter("name", name); resurl.setParameter("rec-owner", owner.getConnectorId()); @@ -116,6 +144,14 @@ public class PortletCommunicationManager extends AbstractCommunicationManager { return resurl.toString(); } + private ResourceURL createResourceURL() { + if (currentMimeResponse == null) { + throw new RuntimeException( + "No reponse object available. Cannot create a resource URL"); + } + return currentMimeResponse.createResourceURL(); + } + @Override protected void cleanStreamVariable(Connector owner, String name) { Map<String, StreamVariable> map = ownerToNameToStreamVariable diff --git a/src/com/vaadin/terminal/gwt/widgetsetutils/AbstractConnectorClassBasedFactoryGenerator.java b/src/com/vaadin/terminal/gwt/widgetsetutils/AbstractConnectorClassBasedFactoryGenerator.java new file mode 100644 index 0000000000..3a13fceece --- /dev/null +++ b/src/com/vaadin/terminal/gwt/widgetsetutils/AbstractConnectorClassBasedFactoryGenerator.java @@ -0,0 +1,145 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ + +package com.vaadin.terminal.gwt.widgetsetutils; + +import java.io.PrintWriter; +import java.util.Date; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.ext.Generator; +import com.google.gwt.core.ext.GeneratorContext; +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.JMethod; +import com.google.gwt.core.ext.typeinfo.JType; +import com.google.gwt.core.ext.typeinfo.NotFoundException; +import com.google.gwt.core.ext.typeinfo.TypeOracle; +import com.google.gwt.user.rebind.ClassSourceFileComposerFactory; +import com.google.gwt.user.rebind.SourceWriter; +import com.vaadin.terminal.gwt.client.ServerConnector; +import com.vaadin.terminal.gwt.client.ui.ConnectorClassBasedFactory; +import com.vaadin.terminal.gwt.client.ui.ConnectorClassBasedFactory.Creator; + +/** + * GWT generator that creates a lookup method for + * {@link ConnectorClassBasedFactory} instances. + * + * @since 7.0 + */ +public abstract class AbstractConnectorClassBasedFactoryGenerator extends + Generator { + + @Override + public String generate(TreeLogger logger, GeneratorContext context, + String typeName) throws UnableToCompleteException { + + try { + // get classType and save instance variables + return generateConnectorClassBasedFactory(typeName, logger, context); + } catch (Exception e) { + logger.log(TreeLogger.ERROR, typeName + " creation failed", e); + throw new UnableToCompleteException(); + } + } + + private String generateConnectorClassBasedFactory(String typeName, + TreeLogger logger, GeneratorContext context) + throws NotFoundException { + TypeOracle typeOracle = context.getTypeOracle(); + + JClassType classType = typeOracle.getType(typeName); + String superName = classType.getSimpleSourceName(); + String packageName = classType.getPackage().getName(); + String className = superName + "Impl"; + + // get print writer that receives the source code + PrintWriter printWriter = null; + printWriter = context.tryCreate(logger, packageName, className); + // print writer if null, source code has ALREADY been generated + if (printWriter == null) { + return packageName + "." + className; + } + + Date date = new Date(); + + // init composer, set class properties, create source writer + ClassSourceFileComposerFactory composer = null; + composer = new ClassSourceFileComposerFactory(packageName, className); + composer.addImport(GWT.class.getName()); + composer.addImport(Creator.class.getCanonicalName()); + composer.setSuperclass(superName); + + SourceWriter sourceWriter = composer.createSourceWriter(context, + printWriter); + sourceWriter.indent(); + + // public ConnectorStateFactoryImpl() { + sourceWriter.println("public " + className + "() {"); + sourceWriter.indent(); + + JClassType serverConnectorType = typeOracle.getType(getConnectorType() + .getCanonicalName()); + for (JClassType connector : serverConnectorType.getSubtypes()) { + // addCreator(TextAreaConnector.class, new Creator<SharedState>() { + if (connector.isInterface() != null || connector.isAbstract()) { + continue; + } + + JClassType targetType = getTargetType(connector); + if (targetType.isAbstract()) { + continue; + } + + sourceWriter.println("addCreator(" + + connector.getQualifiedSourceName() + + ".class, new Creator<" + + targetType.getQualifiedSourceName() + ">() {"); + // public SharedState create() { + sourceWriter.println("public " + + targetType.getQualifiedSourceName() + " create() {"); + // return GWT.create(TextAreaState.class); + sourceWriter.println("return GWT.create(" + + targetType.getQualifiedSourceName() + ".class);"); + // } + sourceWriter.println("}"); + // }); + sourceWriter.println("});"); + } + + // End of constructor + sourceWriter.outdent(); + sourceWriter.println("}"); + + // close generated class + sourceWriter.outdent(); + sourceWriter.println("}"); + + // commit generated class + context.commit(logger, printWriter); + logger.log(Type.INFO, + "Done. (" + (new Date().getTime() - date.getTime()) / 1000 + + "seconds)"); + return packageName + "." + className; + + } + + protected abstract Class<? extends ServerConnector> getConnectorType(); + + protected abstract JClassType getTargetType(JClassType connectorType); + + protected JClassType getGetterReturnType(JClassType connector, + String getterName) { + try { + JMethod getMethod = connector.getMethod(getterName, new JType[] {}); + return (JClassType) getMethod.getReturnType(); + } catch (NotFoundException e) { + return getGetterReturnType(connector.getSuperclass(), getterName); + } + + } + +} diff --git a/src/com/vaadin/terminal/gwt/widgetsetutils/ConnectorStateFactoryGenerator.java b/src/com/vaadin/terminal/gwt/widgetsetutils/ConnectorStateFactoryGenerator.java new file mode 100644 index 0000000000..33406ef85f --- /dev/null +++ b/src/com/vaadin/terminal/gwt/widgetsetutils/ConnectorStateFactoryGenerator.java @@ -0,0 +1,29 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ + +package com.vaadin.terminal.gwt.widgetsetutils; + +import com.google.gwt.core.ext.typeinfo.JClassType; +import com.vaadin.terminal.gwt.client.ServerConnector; + +/** + * GWT generator that creates a SharedState class for a given Connector class, + * based on the return type of getState() + * + * @since 7.0 + */ +public class ConnectorStateFactoryGenerator extends + AbstractConnectorClassBasedFactoryGenerator { + + @Override + protected JClassType getTargetType(JClassType connectorType) { + return getGetterReturnType(connectorType, "getState"); + } + + @Override + protected Class<? extends ServerConnector> getConnectorType() { + return ServerConnector.class; + } + +} diff --git a/src/com/vaadin/terminal/gwt/widgetsetutils/ConnectorWidgetFactoryGenerator.java b/src/com/vaadin/terminal/gwt/widgetsetutils/ConnectorWidgetFactoryGenerator.java new file mode 100644 index 0000000000..55a2857ce0 --- /dev/null +++ b/src/com/vaadin/terminal/gwt/widgetsetutils/ConnectorWidgetFactoryGenerator.java @@ -0,0 +1,29 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ + +package com.vaadin.terminal.gwt.widgetsetutils; + +import com.google.gwt.core.ext.typeinfo.JClassType; +import com.vaadin.terminal.gwt.client.ComponentConnector; +import com.vaadin.terminal.gwt.client.ServerConnector; + +/** + * GWT generator that creates a Widget class for a given Connector class, based + * on the return type of getWidget() + * + * @since 7.0 + */ +public class ConnectorWidgetFactoryGenerator extends + AbstractConnectorClassBasedFactoryGenerator { + @Override + protected JClassType getTargetType(JClassType connectorType) { + return getGetterReturnType(connectorType, "getWidget"); + } + + @Override + protected Class<? extends ServerConnector> getConnectorType() { + return ComponentConnector.class; + } + +}
\ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerGenerator.java b/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerGenerator.java index d3ed9fe484..bc031f4bdb 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(); @@ -106,7 +112,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); @@ -116,49 +123,83 @@ 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, " + sourceWriter.println("public " + JSONValue.class.getName() + + " serialize(" + beanQualifiedSourceName + " value, " + ConnectorMap.class.getName() + " idMapper, " + ApplicationConnection.class.getName() + " connection) {"); sourceWriter.indent(); // 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(); - // VButtonState state = GWT.create(VButtonState.class); - sourceWriter.println(beanQualifiedSourceName + " state = GWT.create(" - + beanQualifiedSourceName + ".class);"); + 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 @@ -167,41 +208,94 @@ public class SerializerGenerator extends Generator { logger.log(Type.DEBUG, "* Processing field " + fieldName + " in " + beanQualifiedSourceName + " (" + beanType.getName() + ")"); + // 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 + "\");"); - - // state.setHeight((String) - // JsonDecoder.decodeValue(jsonFieldValue,idMapper, connection)); + + " = (JSONArray) json.get(\"" + fieldName + "\");"); 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;"); - sourceWriter.println("}"); - sourceWriter.outdent(); + // return target; + sourceWriter.println("return target;"); - // 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(), false, idMapper, + // connection)); + sourceWriter.println("json.put(\"" + fieldName + "\", " + + JsonEncoder.class.getName() + ".encode(castedValue." + + getterName + "(), false, idMapper, connection));"); + } + // return json; + sourceWriter.println("return json;"); } @@ -246,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; } 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; @@ -821,19 +820,27 @@ public abstract class AbstractComponent implements Component, MethodEventSource */ 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<? extends ComponentState> getStateType() { + try { Method m = getClass().getMethod("getState", (Class[]) null); Class<? extends ComponentState> type = (Class<? extends ComponentState>) 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/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<Resource> sources = new ArrayList<Resource>(); - - 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<Resource> getSources() { - return Collections.unmodifiableList(sources); + ArrayList<Resource> sources = new ArrayList<Resource>(); + 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</a> 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<String, Object> variables) { - // TODO Remove once Vaadin6Component is no longer implemented - } } diff --git a/src/com/vaadin/ui/AbstractOrderedLayout.java b/src/com/vaadin/ui/AbstractOrderedLayout.java index 3606fa6572..2cd6fc2a9a 100644 --- a/src/com/vaadin/ui/AbstractOrderedLayout.java +++ b/src/com/vaadin/ui/AbstractOrderedLayout.java @@ -4,28 +4,23 @@ package com.vaadin.ui; -import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; -import java.util.Map; import com.vaadin.event.LayoutEvents.LayoutClickEvent; import com.vaadin.event.LayoutEvents.LayoutClickListener; import com.vaadin.event.LayoutEvents.LayoutClickNotifier; -import com.vaadin.terminal.PaintException; -import com.vaadin.terminal.PaintTarget; import com.vaadin.terminal.Sizeable; -import com.vaadin.terminal.Vaadin6Component; import com.vaadin.terminal.gwt.client.Connector; import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.ui.LayoutClickEventHandler; import com.vaadin.terminal.gwt.client.ui.orderedlayout.AbstractOrderedLayoutServerRpc; import com.vaadin.terminal.gwt.client.ui.orderedlayout.AbstractOrderedLayoutState; +import com.vaadin.terminal.gwt.client.ui.orderedlayout.AbstractOrderedLayoutState.ChildComponentData; @SuppressWarnings("serial") public abstract class AbstractOrderedLayout extends AbstractLayout implements - Layout.AlignmentHandler, Layout.SpacingHandler, LayoutClickNotifier, - Vaadin6Component { + Layout.AlignmentHandler, Layout.SpacingHandler, LayoutClickNotifier { private AbstractOrderedLayoutServerRpc rpc = new AbstractOrderedLayoutServerRpc() { @@ -48,10 +43,6 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements /** * Mapping from components to alignments (horizontal + vertical). */ - private final Map<Component, Alignment> componentToAlignment = new HashMap<Component, Alignment>(); - - private final Map<Component, Float> componentToExpandRatio = new HashMap<Component, Float>(); - public AbstractOrderedLayout() { registerRpc(rpc); } @@ -75,11 +66,11 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements components.add(c); try { super.addComponent(c); - requestRepaint(); } catch (IllegalArgumentException e) { components.remove(c); throw e; } + componentAdded(c); } /** @@ -98,11 +89,12 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements components.addFirst(c); try { super.addComponent(c); - requestRepaint(); } catch (IllegalArgumentException e) { components.remove(c); throw e; } + componentAdded(c); + } /** @@ -127,11 +119,23 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements components.add(index, c); try { super.addComponent(c); - requestRepaint(); } catch (IllegalArgumentException e) { components.remove(c); throw e; } + + componentAdded(c); + } + + private void componentRemoved(Component c) { + getState().getChildData().remove(c); + requestRepaint(); + } + + private void componentAdded(Component c) { + getState().getChildData().put(c, new ChildComponentData()); + requestRepaint(); + } /** @@ -143,10 +147,8 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements @Override public void removeComponent(Component c) { components.remove(c); - componentToAlignment.remove(c); - componentToExpandRatio.remove(c); super.removeComponent(c); - requestRepaint(); + componentRemoved(c); } /** @@ -169,24 +171,6 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements return components.size(); } - /** - * Paints the content of this component. - * - * @param target - * the Paint Event. - * @throws PaintException - * if the paint operation failed. - */ - public void paintContent(PaintTarget target) throws PaintException { - // Add child component alignment info to layout tag - target.addAttribute("alignments", componentToAlignment); - target.addAttribute("expandRatios", componentToExpandRatio); - } - - public void changeVariables(Object source, Map<String, Object> variables) { - // TODO Remove once Vaadin6Component is no longer implemented - } - /* Documented in superclass */ public void replaceComponent(Component oldComponent, Component newComponent) { @@ -213,17 +197,16 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements removeComponent(oldComponent); addComponent(newComponent, oldLocation); } else { + // Both old and new are in the layout if (oldLocation > newLocation) { components.remove(oldComponent); components.add(newLocation, oldComponent); components.remove(newComponent); - componentToAlignment.remove(newComponent); components.add(oldLocation, newComponent); } else { components.remove(newComponent); components.add(oldLocation, newComponent); components.remove(oldComponent); - componentToAlignment.remove(oldComponent); components.add(newLocation, oldComponent); } @@ -239,21 +222,17 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements */ public void setComponentAlignment(Component childComponent, int horizontalAlignment, int verticalAlignment) { - if (components.contains(childComponent)) { - // Alignments are bit masks - componentToAlignment.put(childComponent, new Alignment( - horizontalAlignment + verticalAlignment)); - requestRepaint(); - } else { - throw new IllegalArgumentException( - "Component must be added to layout before using setComponentAlignment()"); - } + Alignment a = new Alignment(horizontalAlignment + verticalAlignment); + setComponentAlignment(childComponent, a); } public void setComponentAlignment(Component childComponent, Alignment alignment) { - if (components.contains(childComponent)) { - componentToAlignment.put(childComponent, alignment); + ChildComponentData childData = getState().getChildData().get( + childComponent); + if (childData != null) { + // Alignments are bit masks + childData.setAlignmentBitmask(alignment.getBitMask()); requestRepaint(); } else { throw new IllegalArgumentException( @@ -269,12 +248,14 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements * .vaadin.ui.Component) */ public Alignment getComponentAlignment(Component childComponent) { - Alignment alignment = componentToAlignment.get(childComponent); - if (alignment == null) { - return ALIGNMENT_DEFAULT; - } else { - return alignment; + ChildComponentData childData = getState().getChildData().get( + childComponent); + if (childData == null) { + throw new IllegalArgumentException( + "The given component is not a child of this layout"); } + + return new Alignment(childData.getAlignmentBitmask()); } /* @@ -326,13 +307,14 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements * @param ratio */ public void setExpandRatio(Component component, float ratio) { - if (components.contains(component)) { - componentToExpandRatio.put(component, ratio); - requestRepaint(); - } else { + ChildComponentData childData = getState().getChildData().get(component); + if (childData == null) { throw new IllegalArgumentException( - "Component must be added to layout before using setExpandRatio()"); + "The given component is not a child of this layout"); } + + childData.setExpandRatio(ratio); + requestRepaint(); }; /** @@ -340,11 +322,16 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements * * @param component * which expand ratios is requested - * @return expand ratio of given component, 0.0f by default + * @return expand ratio of given component, 0.0f by default. */ public float getExpandRatio(Component component) { - Float ratio = componentToExpandRatio.get(component); - return (ratio == null) ? 0 : ratio.floatValue(); + ChildComponentData childData = getState().getChildData().get(component); + if (childData == null) { + throw new IllegalArgumentException( + "The given component is not a child of this layout"); + } + + return childData.getExpandRatio(); } public void addListener(LayoutClickListener listener) { 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,18 +18,13 @@ 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<String> implements BlurNotifier, FocusNotifier, TextChangeNotifier, Vaadin6Component { /** - * Value formatter used to format the string contents. - */ - @Deprecated - private Format format; - - /** * Null representation. */ private String nullRepresentation = "null"; @@ -40,21 +34,6 @@ public abstract class AbstractTextField extends AbstractField<String> implements */ 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<String> 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<String> 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<String, Object> variables) { changingVariables = true; @@ -215,7 +154,7 @@ public abstract class AbstractTextField extends AbstractField<String> 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<String> 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<String> 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<String> implements * @return the maxLength */ public int getMaxLength() { - return maxLength; + return getState().getMaxLength(); } /** @@ -393,7 +307,7 @@ public abstract class AbstractTextField extends AbstractField<String> 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<String> 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<String> implements if (columns < 0) { columns = 0; } - this.columns = columns; + getState().setColumns(columns); requestRepaint(); } @@ -431,7 +345,7 @@ public abstract class AbstractTextField extends AbstractField<String> 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<String> implements * @param inputPrompt */ public void setInputPrompt(String inputPrompt) { - this.inputPrompt = inputPrompt; + getState().setInputPrompt(inputPrompt); requestRepaint(); } 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<Object>, 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<Object> { /** * @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<String, Object> variables) { - // TODO Remove once Vaadin6Component is no longer implemented - } - } diff --git a/src/com/vaadin/ui/Root.java b/src/com/vaadin/ui/Root.java index 405ae8da93..93b98693c2 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<? extends RootState> getStateType() { // This is a workaround for a problem with creating the correct state // object during build - return new RootState(); + return RootState.class; } /** @@ -644,6 +643,10 @@ public abstract class Root extends AbstractComponentContainer implements * @see com.vaadin.ui.ComponentContainer#getComponentIterator() */ public Iterator<Component> getComponentIterator() { + if (getContent() == null) { + return Collections.EMPTY_LIST.iterator(); + } + return Collections.singleton((Component) getContent()).iterator(); } 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 { * <code>false</code> 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); - } - - } } 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()); - } - } } diff --git a/tests/client-side/com/vaadin/terminal/gwt/server/JSONSerializerTest.java b/tests/client-side/com/vaadin/terminal/gwt/server/JSONSerializerTest.java new file mode 100644 index 0000000000..926f026b40 --- /dev/null +++ b/tests/client-side/com/vaadin/terminal/gwt/server/JSONSerializerTest.java @@ -0,0 +1,146 @@ +package com.vaadin.terminal.gwt.server; + +/* + @VaadinApache2LicenseForJavaFiles@ + */ +import java.beans.BeanInfo; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.lang.reflect.Type; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import junit.framework.TestCase; + +import com.vaadin.external.json.JSONArray; +import com.vaadin.terminal.gwt.client.communication.JsonDecoder; +import com.vaadin.terminal.gwt.client.communication.JsonEncoder; +import com.vaadin.terminal.gwt.client.ui.splitpanel.AbstractSplitPanelState; + +/** + * Tests for {@link JsonCodec}, {@link JsonEncoder}, {@link JsonDecoder} + * + * @author Vaadin Ltd + * @version @VERSION@ + * @since 7.0 + * + */ +public class JSONSerializerTest extends TestCase { + HashMap<String, AbstractSplitPanelState> stringToStateMap; + HashMap<AbstractSplitPanelState, String> stateToStringMap; + + public void testStringToBeanMapSerialization() throws Exception { + Type mapType = getClass().getDeclaredField("stringToStateMap") + .getGenericType(); + stringToStateMap = new HashMap<String, AbstractSplitPanelState>(); + AbstractSplitPanelState s = new AbstractSplitPanelState(); + AbstractSplitPanelState s2 = new AbstractSplitPanelState(); + s.setCaption("State 1"); + s.setDebugId("foo"); + s2.setCaption("State 2"); + s2.setDebugId("bar"); + stringToStateMap.put("string - state 1", s); + stringToStateMap.put("String - state 2", s2); + + JSONArray encodedMap = JsonCodec.encode(stringToStateMap, null, + mapType, null); + + ensureDecodedCorrectly(stringToStateMap, encodedMap, mapType); + } + + public void testBeanToStringMapSerialization() throws Exception { + Type mapType = getClass().getDeclaredField("stateToStringMap") + .getGenericType(); + stateToStringMap = new HashMap<AbstractSplitPanelState, String>(); + AbstractSplitPanelState s = new AbstractSplitPanelState(); + AbstractSplitPanelState s2 = new AbstractSplitPanelState(); + s.setCaption("State 1"); + s2.setCaption("State 2"); + stateToStringMap.put(s, "string - state 1"); + stateToStringMap.put(s2, "String - state 2"); + + JSONArray encodedMap = JsonCodec.encode(stateToStringMap, null, + mapType, null); + + ensureDecodedCorrectly(stateToStringMap, encodedMap, mapType); + } + + private void ensureDecodedCorrectly(Object original, JSONArray encoded, + Type type) throws Exception { + Object serverSideDecoded = JsonCodec.decodeInternalOrCustomType(type, + encoded, null); + assertTrue("Server decoded", equals(original, serverSideDecoded)); + + // Object clientSideDecoded = JsonDecoder.decodeValue( + // (com.google.gwt.json.client.JSONArray) JSONParser + // .parseStrict(encoded.toString()), null, null, null); + // assertTrue("Client decoded", + // equals(original, clientSideDecoded)); + + } + + private boolean equals(Object o1, Object o2) throws Exception { + if (o1 == null) { + return (o2 == null); + } + if (o2 == null) { + return false; + } + + if (o1 instanceof Map) { + if (!(o2 instanceof Map)) { + return false; + } + return equalsMap((Map) o1, (Map) o2); + } + + if (o1.getClass() != o2.getClass()) { + return false; + } + + if (o1 instanceof Collection || o1 instanceof Number + || o1 instanceof String) { + return o1.equals(o2); + } + + return equalsBean(o1, o2); + } + + private boolean equalsBean(Object o1, Object o2) throws Exception { + BeanInfo beanInfo = Introspector.getBeanInfo(o1.getClass()); + for (PropertyDescriptor pd : beanInfo.getPropertyDescriptors()) { + String fieldName = JsonCodec.getTransportFieldName(pd); + if (fieldName == null) { + continue; + } + + Object c1 = pd.getReadMethod().invoke(o1); + Object c2 = pd.getReadMethod().invoke(o2); + if (!equals(c1, c2)) { + return false; + } + } + return true; + } + + private boolean equalsMap(Map o1, Map o2) throws Exception { + for (Object key1 : o1.keySet()) { + Object key2 = key1; + if (!(o2.containsKey(key2))) { + // Try to fins a key that is equal + for (Object k2 : o2.keySet()) { + if (equals(key1, k2)) { + key2 = k2; + break; + } + } + } + if (!equals(o1.get(key1), o2.get(key2))) { + return false; + } + + } + return true; + } +} 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<Label> { diff --git a/tests/testbench/com/vaadin/tests/components/label/LabelTest.java b/tests/testbench/com/vaadin/tests/components/label/LabelTest.java index 130aaeca78..6547e7a20f 100644 --- a/tests/testbench/com/vaadin/tests/components/label/LabelTest.java +++ b/tests/testbench/com/vaadin/tests/components/label/LabelTest.java @@ -5,9 +5,9 @@ import java.util.LinkedHashMap; import java.util.List; import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.tests.components.AbstractComponentTest; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; public class LabelTest extends AbstractComponentTest<Label> implements ValueChangeListener { diff --git a/tests/testbench/com/vaadin/tests/components/label/Labels.java b/tests/testbench/com/vaadin/tests/components/label/Labels.java index bbd64375ef..1536f4555e 100644 --- a/tests/testbench/com/vaadin/tests/components/label/Labels.java +++ b/tests/testbench/com/vaadin/tests/components/label/Labels.java @@ -1,9 +1,9 @@ package com.vaadin.tests.components.label; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.tests.components.ComponentTestCase; import com.vaadin.tests.util.LoremIpsum; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; public class Labels extends ComponentTestCase<Label> { diff --git a/tests/testbench/com/vaadin/tests/components/label/MarginsInLabels.java b/tests/testbench/com/vaadin/tests/components/label/MarginsInLabels.java index 699f94bb7e..55f5d431d3 100644 --- a/tests/testbench/com/vaadin/tests/components/label/MarginsInLabels.java +++ b/tests/testbench/com/vaadin/tests/components/label/MarginsInLabels.java @@ -1,12 +1,12 @@ package com.vaadin.tests.components.label; import com.vaadin.terminal.WrappedRequest; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.tests.components.AbstractTestRoot; import com.vaadin.ui.AbstractLayout; import com.vaadin.ui.Accordion; import com.vaadin.ui.GridLayout; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.TabSheet; import com.vaadin.ui.VerticalLayout; diff --git a/tests/testbench/com/vaadin/tests/components/optiongroup/OptionGroupMultipleValueChange.java b/tests/testbench/com/vaadin/tests/components/optiongroup/OptionGroupMultipleValueChange.java index 9a4bb15272..ff860f3293 100644 --- a/tests/testbench/com/vaadin/tests/components/optiongroup/OptionGroupMultipleValueChange.java +++ b/tests/testbench/com/vaadin/tests/components/optiongroup/OptionGroupMultipleValueChange.java @@ -2,9 +2,9 @@ package com.vaadin.tests.components.optiongroup; import com.vaadin.data.Property; 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.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.OptionGroup; public class OptionGroupMultipleValueChange extends TestBase { diff --git a/tests/testbench/com/vaadin/tests/components/panel/PanelShouldNotScroll.java b/tests/testbench/com/vaadin/tests/components/panel/PanelShouldNotScroll.java index 62b3007aba..65754de0f3 100644 --- a/tests/testbench/com/vaadin/tests/components/panel/PanelShouldNotScroll.java +++ b/tests/testbench/com/vaadin/tests/components/panel/PanelShouldNotScroll.java @@ -1,5 +1,6 @@ package com.vaadin.tests.components.panel; +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; @@ -7,7 +8,6 @@ import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.Component; import com.vaadin.ui.CssLayout; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Panel; import com.vaadin.ui.VerticalLayout; diff --git a/tests/testbench/com/vaadin/tests/components/popupview/PopupViewOffScreen.java b/tests/testbench/com/vaadin/tests/components/popupview/PopupViewOffScreen.java index cd2b77806c..72183e3570 100644 --- a/tests/testbench/com/vaadin/tests/components/popupview/PopupViewOffScreen.java +++ b/tests/testbench/com/vaadin/tests/components/popupview/PopupViewOffScreen.java @@ -3,6 +3,7 @@ package com.vaadin.tests.components.popupview; import java.util.ArrayList; import java.util.List; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.tests.components.TestBase; import com.vaadin.tests.util.LoremIpsum; import com.vaadin.ui.Button; @@ -11,7 +12,6 @@ import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.Component; import com.vaadin.ui.GridLayout; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Panel; import com.vaadin.ui.PopupView; import com.vaadin.ui.VerticalLayout; diff --git a/tests/testbench/com/vaadin/tests/components/popupview/ReopenPopupView.html b/tests/testbench/com/vaadin/tests/components/popupview/ReopenPopupView.html new file mode 100644 index 0000000000..a8d1407005 --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/popupview/ReopenPopupView.html @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head profile="http://selenium-ide.openqa.org/profiles/test-case"> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> +<link rel="selenium.base" href="" /> +<title>New Test</title> +</head> +<body> +<table cellpadding="1" cellspacing="1" border="1"> +<thead> +<tr><td rowspan="1" colspan="3">New Test</td></tr> +</thead><tbody> +<tr> + <td>open</td> + <td>/run/com.vaadin.tests.components.popupview.ReopenPopupView?restartApplication</td> + <td></td> +</tr> +<tr> + <td>mouseClick</td> + <td>vaadin=runcomvaadintestscomponentspopupviewReopenPopupView::/VVerticalLayout[0]/VVerticalLayout[0]/VPopupView[0]</td> + <td>42,5</td> +</tr> +<tr> + <td>click</td> + <td>//span/span</td> + <td></td> +</tr> +<tr> + <td>assertText</td> + <td>vaadin=runcomvaadintestscomponentspopupviewReopenPopupView::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[0]</td> + <td>1. Button clicked</td> +</tr> +<tr> + <td>click</td> + <td>//span/span</td> + <td></td> +</tr> +<tr> + <td>assertText</td> + <td>vaadin=runcomvaadintestscomponentspopupviewReopenPopupView::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[0]</td> + <td>2. Button clicked</td> +</tr> +<!--Click outside to close PopupView--> +<tr> + <td>mouseClick</td> + <td>vaadin=runcomvaadintestscomponentspopupviewReopenPopupView::</td> + <td>304,229</td> +</tr> +<tr> + <td>pause</td> + <td></td> + <td>1000</td> +</tr> +<!--Open PopupView again and click button--> +<tr> + <td>mouseClick</td> + <td>vaadin=runcomvaadintestscomponentspopupviewReopenPopupView::/VVerticalLayout[0]/VVerticalLayout[0]/VPopupView[0]</td> + <td>33,6</td> +</tr> +<tr> + <td>click</td> + <td>//span/span</td> + <td></td> +</tr> +<tr> + <td>assertText</td> + <td>vaadin=runcomvaadintestscomponentspopupviewReopenPopupView::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[0]</td> + <td>3. Button clicked</td> +</tr> +</tbody></table> +</body> +</html> diff --git a/tests/testbench/com/vaadin/tests/components/popupview/ReopenPopupView.java b/tests/testbench/com/vaadin/tests/components/popupview/ReopenPopupView.java new file mode 100644 index 0000000000..89f6d155f2 --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/popupview/ReopenPopupView.java @@ -0,0 +1,37 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +package com.vaadin.tests.components.popupview; + +import com.vaadin.terminal.WrappedRequest; +import com.vaadin.tests.components.AbstractTestRoot; +import com.vaadin.tests.util.Log; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.PopupView; + +public class ReopenPopupView extends AbstractTestRoot { + private final Log log = new Log(5); + + @Override + protected void setup(WrappedRequest request) { + addComponent(log); + addComponent(new PopupView("PopupView", new Button("Button", + new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + log.log("Button clicked"); + } + }))); + } + + @Override + protected String getTestDescription() { + return "Clicking a button in a PopupView should work every time"; + } + + @Override + protected Integer getTicketNumber() { + return Integer.valueOf(8804); + } + +} diff --git a/tests/testbench/com/vaadin/tests/components/root/LazyInitRoots.java b/tests/testbench/com/vaadin/tests/components/root/LazyInitRoots.java index 97f6701fdb..c4547e56ff 100644 --- a/tests/testbench/com/vaadin/tests/components/root/LazyInitRoots.java +++ b/tests/testbench/com/vaadin/tests/components/root/LazyInitRoots.java @@ -5,9 +5,9 @@ import com.vaadin.annotations.EagerInit; import com.vaadin.terminal.ExternalResource; import com.vaadin.terminal.WrappedRequest; import com.vaadin.terminal.WrappedRequest.BrowserDetails; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.tests.components.AbstractTestApplication; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Link; import com.vaadin.ui.Root; diff --git a/tests/testbench/com/vaadin/tests/components/table/EditableTableLeak.java b/tests/testbench/com/vaadin/tests/components/table/EditableTableLeak.java index 08938c079a..8aa6d1277f 100644 --- a/tests/testbench/com/vaadin/tests/components/table/EditableTableLeak.java +++ b/tests/testbench/com/vaadin/tests/components/table/EditableTableLeak.java @@ -9,6 +9,7 @@ import java.util.HashMap; import com.vaadin.data.Container; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.tests.components.TestBase; import com.vaadin.tests.util.TestUtils; import com.vaadin.ui.Button; @@ -19,7 +20,6 @@ import com.vaadin.ui.Component; import com.vaadin.ui.DefaultFieldFactory; import com.vaadin.ui.Field; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Table; public class EditableTableLeak extends TestBase { diff --git a/tests/testbench/com/vaadin/tests/components/table/LabelEmbeddedClickThroughForTable.java b/tests/testbench/com/vaadin/tests/components/table/LabelEmbeddedClickThroughForTable.java index 1cfb1ee5e5..de0d2b8d56 100644 --- a/tests/testbench/com/vaadin/tests/components/table/LabelEmbeddedClickThroughForTable.java +++ b/tests/testbench/com/vaadin/tests/components/table/LabelEmbeddedClickThroughForTable.java @@ -4,11 +4,11 @@ import com.vaadin.data.Item; import com.vaadin.event.ItemClickEvent; import com.vaadin.event.ItemClickEvent.ItemClickListener; import com.vaadin.terminal.ThemeResource; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.tests.components.TestBase; import com.vaadin.ui.Component; import com.vaadin.ui.Embedded; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Table; public class LabelEmbeddedClickThroughForTable extends TestBase { diff --git a/tests/testbench/com/vaadin/tests/components/table/LongMultiselect.java b/tests/testbench/com/vaadin/tests/components/table/LongMultiselect.java index 07925db05c..0196395bf4 100644 --- a/tests/testbench/com/vaadin/tests/components/table/LongMultiselect.java +++ b/tests/testbench/com/vaadin/tests/components/table/LongMultiselect.java @@ -2,14 +2,11 @@ package com.vaadin.tests.components.table; import java.util.Collection; -import com.vaadin.Application; import com.vaadin.data.Property; import com.vaadin.tests.components.TestBase; import com.vaadin.ui.Button; -import com.vaadin.ui.Label; import com.vaadin.ui.Table; import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Window; public class LongMultiselect extends TestBase { diff --git a/tests/testbench/com/vaadin/tests/components/table/Tables.java b/tests/testbench/com/vaadin/tests/components/table/Tables.java index 4c773c9678..47c858f441 100644 --- a/tests/testbench/com/vaadin/tests/components/table/Tables.java +++ b/tests/testbench/com/vaadin/tests/components/table/Tables.java @@ -9,11 +9,11 @@ import com.vaadin.event.Action; import com.vaadin.event.Action.Handler; import com.vaadin.event.ItemClickEvent.ItemClickListener; import com.vaadin.terminal.Resource; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.tests.components.select.AbstractSelectTestCase; import com.vaadin.ui.AbstractSelect.MultiSelectMode; import com.vaadin.ui.Button; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Table; import com.vaadin.ui.Table.Align; import com.vaadin.ui.Table.CellStyleGenerator; diff --git a/tests/testbench/com/vaadin/tests/components/tabsheet/WrapTabSheetInTabSheet.java b/tests/testbench/com/vaadin/tests/components/tabsheet/WrapTabSheetInTabSheet.java index 869b981ac1..3872f7a8dd 100644 --- a/tests/testbench/com/vaadin/tests/components/tabsheet/WrapTabSheetInTabSheet.java +++ b/tests/testbench/com/vaadin/tests/components/tabsheet/WrapTabSheetInTabSheet.java @@ -1,6 +1,5 @@ package com.vaadin.tests.components.tabsheet; -import com.vaadin.Application; import com.vaadin.tests.components.TestBase; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; @@ -8,7 +7,6 @@ import com.vaadin.ui.ComponentContainer; import com.vaadin.ui.Label; import com.vaadin.ui.TabSheet; import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Window; public class WrapTabSheetInTabSheet extends TestBase { @Override diff --git a/tests/testbench/com/vaadin/tests/components/window/LazyWindowResize.java b/tests/testbench/com/vaadin/tests/components/window/LazyWindowResize.java index 2e6a386667..49da6758ea 100644 --- a/tests/testbench/com/vaadin/tests/components/window/LazyWindowResize.java +++ b/tests/testbench/com/vaadin/tests/components/window/LazyWindowResize.java @@ -2,12 +2,12 @@ package com.vaadin.tests.components.window; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.tests.components.AbstractTestCase; import com.vaadin.tests.util.Log; import com.vaadin.tests.util.LoremIpsum; import com.vaadin.ui.CheckBox; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Root.BrowserWindowResizeEvent; import com.vaadin.ui.Root.BrowserWindowResizeListener; import com.vaadin.ui.Root.LegacyWindow; diff --git a/tests/testbench/com/vaadin/tests/components/window/SubWindowWithUndefinedHeight.java b/tests/testbench/com/vaadin/tests/components/window/SubWindowWithUndefinedHeight.java index 60f0c598ae..fc99309b50 100644 --- a/tests/testbench/com/vaadin/tests/components/window/SubWindowWithUndefinedHeight.java +++ b/tests/testbench/com/vaadin/tests/components/window/SubWindowWithUndefinedHeight.java @@ -1,10 +1,10 @@ package com.vaadin.tests.components.window; import com.vaadin.tests.components.TestBase; -import com.vaadin.ui.Window; import com.vaadin.ui.Button; -import com.vaadin.ui.Table; import com.vaadin.ui.TabSheet; +import com.vaadin.ui.Table; +import com.vaadin.ui.Window; public class SubWindowWithUndefinedHeight extends TestBase { diff --git a/tests/testbench/com/vaadin/tests/dd/MyDragSourceConnector.java b/tests/testbench/com/vaadin/tests/dd/MyDragSourceConnector.java index c94ac05ea2..2b01bad2cf 100644 --- a/tests/testbench/com/vaadin/tests/dd/MyDragSourceConnector.java +++ b/tests/testbench/com/vaadin/tests/dd/MyDragSourceConnector.java @@ -3,8 +3,6 @@ */ package com.vaadin.tests.dd; -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.Paintable; import com.vaadin.terminal.gwt.client.UIDL; @@ -23,8 +21,8 @@ public class MyDragSourceConnector extends AbstractComponentConnector implements } @Override - protected Widget createWidget() { - return GWT.create(VMyDragSource.class); + public VMyDragSource getWidget() { + return (VMyDragSource) super.getWidget(); } } diff --git a/tests/testbench/com/vaadin/tests/dd/MyDropTargetConnector.java b/tests/testbench/com/vaadin/tests/dd/MyDropTargetConnector.java index 0021cbf7ea..5671efa236 100644 --- a/tests/testbench/com/vaadin/tests/dd/MyDropTargetConnector.java +++ b/tests/testbench/com/vaadin/tests/dd/MyDropTargetConnector.java @@ -3,8 +3,6 @@ */ package com.vaadin.tests.dd; -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.Paintable; import com.vaadin.terminal.gwt.client.UIDL; @@ -28,9 +26,4 @@ public class MyDropTargetConnector extends AbstractComponentConnector implements return (VMyDropTarget) super.getWidget(); } - @Override - protected Widget createWidget() { - return GWT.create(VMyDropTarget.class); - } - } diff --git a/tests/testbench/com/vaadin/tests/integration/JSR286PortletApplication.java b/tests/testbench/com/vaadin/tests/integration/JSR286PortletApplication.java index ecc7ea9647..7ba6f2c0c0 100644 --- a/tests/testbench/com/vaadin/tests/integration/JSR286PortletApplication.java +++ b/tests/testbench/com/vaadin/tests/integration/JSR286PortletApplication.java @@ -1,5 +1,7 @@ package com.vaadin.tests.integration; +import java.io.ByteArrayOutputStream; +import java.io.OutputStream; import java.util.Iterator; import java.util.Map; @@ -18,16 +20,18 @@ import javax.portlet.WindowState; import com.vaadin.Application; import com.vaadin.terminal.ExternalResource; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.terminal.gwt.server.PortletApplicationContext2; import com.vaadin.terminal.gwt.server.PortletApplicationContext2.PortletListener; import com.vaadin.ui.Embedded; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Link; import com.vaadin.ui.Notification; import com.vaadin.ui.Root; import com.vaadin.ui.Root.LegacyWindow; import com.vaadin.ui.TextField; +import com.vaadin.ui.Upload; +import com.vaadin.ui.Upload.Receiver; /** * Adapted from old PortletDemo to support integration testing. @@ -67,6 +71,14 @@ public class JSR286PortletApplication extends Application.LegacyApplication { portletMax.setEnabled(false); main.addComponent(portletMax); + Upload upload = new Upload("Upload a file", new Receiver() { + + public OutputStream receiveUpload(String filename, String mimeType) { + return new ByteArrayOutputStream(); + } + }); + main.addComponent(upload); + if (getContext() instanceof PortletApplicationContext2) { PortletApplicationContext2 ctx = (PortletApplicationContext2) getContext(); ctx.addPortletListener(this, new DemoPortletListener()); diff --git a/tests/testbench/com/vaadin/tests/integration/LiferayThemeDemo.java b/tests/testbench/com/vaadin/tests/integration/LiferayThemeDemo.java index 91e9a4620c..0250658bc9 100644 --- a/tests/testbench/com/vaadin/tests/integration/LiferayThemeDemo.java +++ b/tests/testbench/com/vaadin/tests/integration/LiferayThemeDemo.java @@ -11,6 +11,7 @@ import com.vaadin.event.Action; import com.vaadin.terminal.ExternalResource; import com.vaadin.terminal.Resource; import com.vaadin.terminal.ThemeResource; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.AbstractComponent; import com.vaadin.ui.AbstractSelect; import com.vaadin.ui.Accordion; @@ -26,7 +27,6 @@ import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.HorizontalSplitPanel; import com.vaadin.ui.InlineDateField; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Layout; import com.vaadin.ui.ListSelect; import com.vaadin.ui.MenuBar; diff --git a/tests/testbench/com/vaadin/tests/layouts/HiddenHorizontalLayout.java b/tests/testbench/com/vaadin/tests/layouts/HiddenHorizontalLayout.java index a8f44a5771..8c05df6ca9 100644 --- a/tests/testbench/com/vaadin/tests/layouts/HiddenHorizontalLayout.java +++ b/tests/testbench/com/vaadin/tests/layouts/HiddenHorizontalLayout.java @@ -1,11 +1,11 @@ package com.vaadin.tests.layouts; +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.HorizontalLayout; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.VerticalLayout; public class HiddenHorizontalLayout extends TestBase { diff --git a/tests/testbench/com/vaadin/tests/layouts/TestLayoutPerformance.java b/tests/testbench/com/vaadin/tests/layouts/TestLayoutPerformance.java index a5e2048066..3d496fa446 100644 --- a/tests/testbench/com/vaadin/tests/layouts/TestLayoutPerformance.java +++ b/tests/testbench/com/vaadin/tests/layouts/TestLayoutPerformance.java @@ -1,5 +1,6 @@ package com.vaadin.tests.layouts; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.tests.components.TestBase; import com.vaadin.ui.AbstractComponent; import com.vaadin.ui.Button; @@ -9,7 +10,6 @@ import com.vaadin.ui.Component; import com.vaadin.ui.CssLayout; 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.NativeSelect; import com.vaadin.ui.TextField; diff --git a/tests/testbench/com/vaadin/tests/layouts/layouttester/HorizontalLayoutTests.java b/tests/testbench/com/vaadin/tests/layouts/layouttester/HorizontalLayoutTests.java index 920c9ec819..bd60e9ff21 100644 --- a/tests/testbench/com/vaadin/tests/layouts/layouttester/HorizontalLayoutTests.java +++ b/tests/testbench/com/vaadin/tests/layouts/layouttester/HorizontalLayoutTests.java @@ -5,6 +5,7 @@ import com.vaadin.terminal.Resource; import com.vaadin.terminal.SystemError; import com.vaadin.terminal.ThemeResource; import com.vaadin.terminal.UserError; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.AbstractComponent; import com.vaadin.ui.AbstractField; import com.vaadin.ui.Alignment; @@ -14,7 +15,6 @@ import com.vaadin.ui.CheckBox; import com.vaadin.ui.DateField; 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.Link; import com.vaadin.ui.Select; diff --git a/tests/testbench/com/vaadin/tests/layouts/layouttester/VerticalLayoutTests.java b/tests/testbench/com/vaadin/tests/layouts/layouttester/VerticalLayoutTests.java index a542a8f10c..2861acabdd 100644 --- a/tests/testbench/com/vaadin/tests/layouts/layouttester/VerticalLayoutTests.java +++ b/tests/testbench/com/vaadin/tests/layouts/layouttester/VerticalLayoutTests.java @@ -5,6 +5,7 @@ import com.vaadin.terminal.Resource; import com.vaadin.terminal.SystemError; import com.vaadin.terminal.ThemeResource; import com.vaadin.terminal.UserError; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.AbstractComponent; import com.vaadin.ui.AbstractField; import com.vaadin.ui.Alignment; @@ -14,7 +15,6 @@ import com.vaadin.ui.CheckBox; import com.vaadin.ui.DateField; 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.Link; import com.vaadin.ui.NativeSelect; diff --git a/tests/testbench/com/vaadin/tests/tickets/Ticket1225.java b/tests/testbench/com/vaadin/tests/tickets/Ticket1225.java index 92a5e526d1..fe9cb6e415 100644 --- a/tests/testbench/com/vaadin/tests/tickets/Ticket1225.java +++ b/tests/testbench/com/vaadin/tests/tickets/Ticket1225.java @@ -1,10 +1,10 @@ package com.vaadin.tests.tickets; import com.vaadin.Application; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.tests.TestForTablesInitialColumnWidthLogicRendering; import com.vaadin.ui.Alignment; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Root.LegacyWindow; import com.vaadin.ui.TabSheet; import com.vaadin.ui.Table; diff --git a/tests/testbench/com/vaadin/tests/tickets/Ticket124.java b/tests/testbench/com/vaadin/tests/tickets/Ticket124.java index f1d33dca0b..81a164d22e 100644 --- a/tests/testbench/com/vaadin/tests/tickets/Ticket124.java +++ b/tests/testbench/com/vaadin/tests/tickets/Ticket124.java @@ -1,12 +1,12 @@ package com.vaadin.tests.tickets; 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.Button.ClickListener; import com.vaadin.ui.GridLayout; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Root.LegacyWindow; import com.vaadin.ui.TextField; diff --git a/tests/testbench/com/vaadin/tests/tickets/Ticket1444.java b/tests/testbench/com/vaadin/tests/tickets/Ticket1444.java index 5076e79996..1af3b405e2 100644 --- a/tests/testbench/com/vaadin/tests/tickets/Ticket1444.java +++ b/tests/testbench/com/vaadin/tests/tickets/Ticket1444.java @@ -1,8 +1,8 @@ package com.vaadin.tests.tickets; import com.vaadin.Application; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; 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/tickets/Ticket1804.java b/tests/testbench/com/vaadin/tests/tickets/Ticket1804.java index b659eff01e..d627d11e18 100644 --- a/tests/testbench/com/vaadin/tests/tickets/Ticket1804.java +++ b/tests/testbench/com/vaadin/tests/tickets/Ticket1804.java @@ -6,11 +6,11 @@ import java.util.LinkedList; import com.vaadin.data.Validator; import com.vaadin.data.util.MethodProperty; import com.vaadin.terminal.SystemError; +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.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Root.LegacyWindow; import com.vaadin.ui.Select; import com.vaadin.ui.Window; diff --git a/tests/testbench/com/vaadin/tests/tickets/Ticket1811.java b/tests/testbench/com/vaadin/tests/tickets/Ticket1811.java index 7df9610e99..d530c949e8 100644 --- a/tests/testbench/com/vaadin/tests/tickets/Ticket1811.java +++ b/tests/testbench/com/vaadin/tests/tickets/Ticket1811.java @@ -5,10 +5,10 @@ import java.util.LinkedList; import com.vaadin.data.Validator; import com.vaadin.data.validator.StringLengthValidator; +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.TextField; import com.vaadin.ui.Window; diff --git a/tests/testbench/com/vaadin/tests/tickets/Ticket1819.java b/tests/testbench/com/vaadin/tests/tickets/Ticket1819.java index 86325f35a9..8e5f107b17 100644 --- a/tests/testbench/com/vaadin/tests/tickets/Ticket1819.java +++ b/tests/testbench/com/vaadin/tests/tickets/Ticket1819.java @@ -3,11 +3,11 @@ package com.vaadin.tests.tickets; import java.util.Iterator; import java.util.LinkedList; +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.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Root.LegacyWindow; import com.vaadin.ui.Select; import com.vaadin.ui.Window; diff --git a/tests/testbench/com/vaadin/tests/tickets/Ticket1970.java b/tests/testbench/com/vaadin/tests/tickets/Ticket1970.java index beeda85c9f..3c5822fbda 100644 --- a/tests/testbench/com/vaadin/tests/tickets/Ticket1970.java +++ b/tests/testbench/com/vaadin/tests/tickets/Ticket1970.java @@ -3,10 +3,10 @@ package com.vaadin.tests.tickets; import java.util.Iterator; 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; public class Ticket1970 extends Application.LegacyApplication { diff --git a/tests/testbench/com/vaadin/tests/tickets/Ticket2104.java b/tests/testbench/com/vaadin/tests/tickets/Ticket2104.java index 4637b71fb4..b40035a189 100644 --- a/tests/testbench/com/vaadin/tests/tickets/Ticket2104.java +++ b/tests/testbench/com/vaadin/tests/tickets/Ticket2104.java @@ -7,10 +7,10 @@ import com.vaadin.data.util.MethodProperty; import com.vaadin.event.ItemClickEvent; import com.vaadin.event.ItemClickEvent.ItemClickListener; import com.vaadin.terminal.ExternalResource; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.CheckBox; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Root.LegacyWindow; import com.vaadin.ui.Table; import com.vaadin.ui.Tree; diff --git a/tests/testbench/com/vaadin/tests/tickets/Ticket2117.java b/tests/testbench/com/vaadin/tests/tickets/Ticket2117.java index 82241843df..933494f78a 100644 --- a/tests/testbench/com/vaadin/tests/tickets/Ticket2117.java +++ b/tests/testbench/com/vaadin/tests/tickets/Ticket2117.java @@ -2,11 +2,11 @@ package com.vaadin.tests.tickets; import com.vaadin.Application; import com.vaadin.terminal.ExternalResource; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Root.LegacyWindow; public class Ticket2117 extends Application.LegacyApplication { diff --git a/tests/testbench/com/vaadin/tests/tickets/Ticket2119.java b/tests/testbench/com/vaadin/tests/tickets/Ticket2119.java index b7dc84b8ab..34054e09d1 100644 --- a/tests/testbench/com/vaadin/tests/tickets/Ticket2119.java +++ b/tests/testbench/com/vaadin/tests/tickets/Ticket2119.java @@ -4,9 +4,9 @@ import com.vaadin.Application; import com.vaadin.data.Property; import com.vaadin.data.util.ObjectProperty; import com.vaadin.terminal.ExternalResource; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.Button; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Layout; import com.vaadin.ui.Root.LegacyWindow; import com.vaadin.ui.Select; diff --git a/tests/testbench/com/vaadin/tests/tickets/Ticket2240.java b/tests/testbench/com/vaadin/tests/tickets/Ticket2240.java index bf01475809..f33d2f7ea8 100644 --- a/tests/testbench/com/vaadin/tests/tickets/Ticket2240.java +++ b/tests/testbench/com/vaadin/tests/tickets/Ticket2240.java @@ -1,9 +1,9 @@ package com.vaadin.tests.tickets; import com.vaadin.Application; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.AbstractOrderedLayout; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Root.LegacyWindow; import com.vaadin.ui.TextField; diff --git a/tests/testbench/com/vaadin/tests/tickets/Ticket2287.java b/tests/testbench/com/vaadin/tests/tickets/Ticket2287.java index 66328fa4b9..a4664989ec 100644 --- a/tests/testbench/com/vaadin/tests/tickets/Ticket2287.java +++ b/tests/testbench/com/vaadin/tests/tickets/Ticket2287.java @@ -2,8 +2,8 @@ package com.vaadin.tests.tickets; import java.net.URL; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Root.LegacyWindow; public class Ticket2287 extends Ticket2292 { diff --git a/tests/testbench/com/vaadin/tests/tickets/Ticket2304.java b/tests/testbench/com/vaadin/tests/tickets/Ticket2304.java index 9484b4865f..264ce9b5fc 100644 --- a/tests/testbench/com/vaadin/tests/tickets/Ticket2304.java +++ b/tests/testbench/com/vaadin/tests/tickets/Ticket2304.java @@ -1,8 +1,8 @@ package com.vaadin.tests.tickets; import com.vaadin.Application; +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.themes.Reindeer; diff --git a/tests/testbench/com/vaadin/tests/tickets/Ticket2426.java b/tests/testbench/com/vaadin/tests/tickets/Ticket2426.java index a979b6711f..7866d031ed 100644 --- a/tests/testbench/com/vaadin/tests/tickets/Ticket2426.java +++ b/tests/testbench/com/vaadin/tests/tickets/Ticket2426.java @@ -1,8 +1,8 @@ package com.vaadin.tests.tickets; import com.vaadin.Application; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Root.LegacyWindow; public class Ticket2426 extends Application.LegacyApplication { @@ -15,7 +15,7 @@ public class Ticket2426 extends Application.LegacyApplication { final String content = "<select/>"; w.addComponent(new Label("CONTENT_DEFAULT: " + content, - ContentMode.DEFAULT)); + ContentMode.TEXT)); w.addComponent(new Label("CONTENT_PREFORMATTED: " + content, ContentMode.PREFORMATTED)); w.addComponent(new Label("CONTENT_RAW: " + content, ContentMode.RAW)); diff --git a/tests/testbench/com/vaadin/tests/tickets/Ticket5952.java b/tests/testbench/com/vaadin/tests/tickets/Ticket5952.java index 3c0c549f1f..a608f736ca 100644 --- a/tests/testbench/com/vaadin/tests/tickets/Ticket5952.java +++ b/tests/testbench/com/vaadin/tests/tickets/Ticket5952.java @@ -1,8 +1,8 @@ package com.vaadin.tests.tickets; import com.vaadin.Application; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.Root.LegacyWindow; public class Ticket5952 extends Application.LegacyApplication { diff --git a/tests/testbench/com/vaadin/tests/tickets/Ticket677.java b/tests/testbench/com/vaadin/tests/tickets/Ticket677.java index bf7aa7bc36..473ec79342 100644 --- a/tests/testbench/com/vaadin/tests/tickets/Ticket677.java +++ b/tests/testbench/com/vaadin/tests/tickets/Ticket677.java @@ -5,6 +5,7 @@ import com.vaadin.data.Container; import com.vaadin.data.Item; import com.vaadin.data.Property; import com.vaadin.data.util.BeanItem; +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; @@ -15,7 +16,6 @@ import com.vaadin.ui.Form; 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.Panel; import com.vaadin.ui.Root.LegacyWindow; import com.vaadin.ui.Table; diff --git a/tests/testbench/com/vaadin/tests/util/Log.java b/tests/testbench/com/vaadin/tests/util/Log.java index fca858cb15..1404db0dee 100644 --- a/tests/testbench/com/vaadin/tests/util/Log.java +++ b/tests/testbench/com/vaadin/tests/util/Log.java @@ -3,8 +3,8 @@ package com.vaadin.tests.util; import java.util.ArrayList; import java.util.List; +import com.vaadin.terminal.gwt.client.ui.label.ContentMode; import com.vaadin.ui.Label; -import com.vaadin.ui.Label.ContentMode; import com.vaadin.ui.VerticalLayout; public class Log extends VerticalLayout { diff --git a/tests/testbench/com/vaadin/tests/util/SampleDirectory.java b/tests/testbench/com/vaadin/tests/util/SampleDirectory.java index a1f3202cea..2c8ac675f8 100644 --- a/tests/testbench/com/vaadin/tests/util/SampleDirectory.java +++ b/tests/testbench/com/vaadin/tests/util/SampleDirectory.java @@ -8,8 +8,8 @@ import java.io.File; import com.vaadin.Application; import com.vaadin.terminal.SystemError; +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; |