diff options
author | Jouni Koivuviita <jouni@vaadin.com> | 2012-08-07 16:05:49 +0300 |
---|---|---|
committer | Jouni Koivuviita <jouni@vaadin.com> | 2012-08-07 16:05:49 +0300 |
commit | 8356465b3897fa16233064cfd586b4557f33e8e4 (patch) | |
tree | aa14a1e52e85935486e7a4aec453247939a228fc /src/com/vaadin | |
parent | 9a83722fde94af949b45d4c091399ba9e1f6ba29 (diff) | |
parent | 5813e0e9e5af4f946e5ea9c73d426e95d93b7bc4 (diff) | |
download | vaadin-framework-8356465b3897fa16233064cfd586b4557f33e8e4.tar.gz vaadin-framework-8356465b3897fa16233064cfd586b4557f33e8e4.zip |
merge master
Diffstat (limited to 'src/com/vaadin')
448 files changed, 5869 insertions, 2558 deletions
diff --git a/src/com/vaadin/Application.java b/src/com/vaadin/Application.java index 84a8df5053..086caa5509 100644 --- a/src/com/vaadin/Application.java +++ b/src/com/vaadin/Application.java @@ -1066,6 +1066,7 @@ public class Application implements Terminal.ErrorListener, Serializable { * @see com.vaadin.terminal.Terminal.ErrorListener#terminalError(com.vaadin.terminal.Terminal.ErrorEvent) */ + @Override public void terminalError(Terminal.ErrorEvent event) { final Throwable t = event.getThrowable(); if (t instanceof SocketException) { @@ -1810,6 +1811,7 @@ public class Application implements Terminal.ErrorListener, Serializable { this.throwable = throwable; } + @Override public Throwable getThrowable() { return throwable; } @@ -2373,4 +2375,18 @@ public class Application implements Terminal.ErrorListener, Serializable { private static final Logger getLogger() { return Logger.getLogger(Application.class.getName()); } + + /** + * Returns a Root with the given id. + * <p> + * This is meant for framework internal use. + * </p> + * + * @param rootId + * The root id + * @return The root with the given id or null if not found + */ + public Root getRootById(int rootId) { + return roots.get(rootId); + } } diff --git a/src/com/vaadin/Vaadin.gwt.xml b/src/com/vaadin/Vaadin.gwt.xml new file mode 100644 index 0000000000..07d7c941e6 --- /dev/null +++ b/src/com/vaadin/Vaadin.gwt.xml @@ -0,0 +1,85 @@ +<module> + <!-- This GWT module inherits all Vaadin client side functionality modules. + This is the module you want to inherit in your client side project to be + able to use com.vaadin.* classes. --> + + <!-- Hint for WidgetSetBuilder not to automatically update the file --> + <!-- WS Compiler: manually edited --> + + <inherits name="com.google.gwt.user.User" /> + + <inherits name="com.google.gwt.http.HTTP" /> + + <inherits name="com.google.gwt.json.JSON" /> + + <inherits name="com.vaadin.terminal.gwt.VaadinBrowserSpecificOverrides" /> + + <source path="terminal/gwt/client" /> + <source path="shared" /> + + <!-- Use own Scheduler implementation to be able to track if commands are + running --> + <replace-with class="com.vaadin.terminal.gwt.client.VSchedulerImpl"> + <when-type-is class="com.google.gwt.core.client.impl.SchedulerImpl" /> + </replace-with> + + <!-- Generators for serializators for classes used in communication between + server and client --> + <generate-with + class="com.vaadin.terminal.gwt.widgetsetutils.SerializerMapGenerator"> + <when-type-is + class="com.vaadin.terminal.gwt.client.communication.SerializerMap" /> + </generate-with> + + <replace-with class="com.vaadin.terminal.gwt.client.VDebugConsole"> + <when-type-is class="com.vaadin.terminal.gwt.client.Console" /> + </replace-with> + + <generate-with + class="com.vaadin.terminal.gwt.widgetsetutils.EagerWidgetMapGenerator"> + <when-type-is class="com.vaadin.terminal.gwt.client.WidgetMap" /> + </generate-with> + + <generate-with + class="com.vaadin.terminal.gwt.widgetsetutils.AcceptCriteriaFactoryGenerator"> + <when-type-is + class="com.vaadin.terminal.gwt.client.ui.dd.VAcceptCriterionFactory" /> + </generate-with> + + <!-- Generate client side proxies for client to server RPC interfaces --> + <generate-with + class="com.vaadin.terminal.gwt.widgetsetutils.RpcProxyGenerator"> + <when-type-assignable + class="com.vaadin.shared.communication.ServerRpc" /> + </generate-with> + + <!-- Generate client side proxies for client to server RPC interfaces --> + <generate-with + class="com.vaadin.terminal.gwt.widgetsetutils.RpcProxyCreatorGenerator"> + <when-type-assignable + class="com.vaadin.terminal.gwt.client.communication.RpcProxy.RpcProxyCreator" /> + </generate-with> + + <!-- Generate client side RPC manager for server to client RPC --> + <generate-with + class="com.vaadin.terminal.gwt.widgetsetutils.GeneratedRpcMethodProviderGenerator"> + <when-type-assignable + class="com.vaadin.terminal.gwt.client.communication.GeneratedRpcMethodProvider" /> + </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> + + <!-- Use the new cross site linker to get a nocache.js without document.write --> + <add-linker name="xsiframe" /> + +</module> diff --git a/src/com/vaadin/annotations/JavaScript.java b/src/com/vaadin/annotations/JavaScript.java new file mode 100644 index 0000000000..f97457c1cd --- /dev/null +++ b/src/com/vaadin/annotations/JavaScript.java @@ -0,0 +1,42 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ + +package com.vaadin.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import com.vaadin.terminal.gwt.server.ClientConnector; + +/** + * If this annotation is present on a {@link ClientConnector} class, the + * framework ensures the referenced JavaScript files are loaded before the init + * method for the corresponding client-side connector is invoked. + * <p> + * Absolute URLs including protocol and host are used as is on the client-side. + * Relative urls are mapped to APP/CONNECTOR/[url] which are by default served + * from the classpath relative to the class where the annotation is defined. + * <p> + * Example: {@code @JavaScript( "http://host.com/file1.js", "file2.js"})} on + * the class com.example.MyConnector would load the file + * http://host.com/file1.js as is and file2.js from /com/example/file2.js on the + * server's classpath using the ClassLoader that was used to load + * com.example.MyConnector. + * + * @author Vaadin Ltd + * @version @VERSION@ + * @since 7.0.0 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface JavaScript { + /** + * JavaScript files to load before initializing the client-side connector. + * + * @return an array of JavaScript file urls + */ + public String[] value(); +} diff --git a/src/com/vaadin/annotations/LoadScripts.java b/src/com/vaadin/annotations/LoadScripts.java deleted file mode 100644 index 84ac2d2fb7..0000000000 --- a/src/com/vaadin/annotations/LoadScripts.java +++ /dev/null @@ -1,24 +0,0 @@ -/* -@VaadinApache2LicenseForJavaFiles@ - */ -package com.vaadin.annotations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Temporary hack used for ensuring external javascript libraries are included. - * To add a javascript, add this annotation to your Root class. - * - * @deprecated Will be removed in favor of a more robust solution before version - * 7.0.0 - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -@Deprecated -public @interface LoadScripts { - public String[] value(); - -} diff --git a/src/com/vaadin/annotations/StyleSheet.java b/src/com/vaadin/annotations/StyleSheet.java new file mode 100644 index 0000000000..d082cb8d30 --- /dev/null +++ b/src/com/vaadin/annotations/StyleSheet.java @@ -0,0 +1,38 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ + +package com.vaadin.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import com.vaadin.terminal.gwt.server.ClientConnector; + +/** + * If this annotation is present on a {@link ClientConnector} class, the + * framework ensures the referenced style sheets are loaded before the init + * method for the corresponding client-side connector is invoked. + * <p> + * Example: {@code @StyleSheet( "http://host.com/file1.css", "file2.css"})} on + * the class com.example.MyConnector would load the file + * http://host.com/file1.css as is and file2.css from /com/example/file2.css on + * the server's classpath using the ClassLoader that was used to load + * com.example.MyConnector. + * + * @author Vaadin Ltd + * @version @VERSION@ + * @since 7.0.0 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface StyleSheet { + /** + * Style sheets to load before initializing the client-side connector. + * + * @return an array of style sheet urls + */ + public String[] value(); +} diff --git a/src/com/vaadin/data/Container.java b/src/com/vaadin/data/Container.java index f722e07741..f4c0ed9794 100644 --- a/src/com/vaadin/data/Container.java +++ b/src/com/vaadin/data/Container.java @@ -697,6 +697,7 @@ public interface Container extends Serializable { * @return <code>true</code> if the operation succeeded, * <code>false</code> if not */ + @Override public boolean removeItem(Object itemId) throws UnsupportedOperationException; } diff --git a/src/com/vaadin/data/fieldgroup/DefaultFieldGroupFieldFactory.java b/src/com/vaadin/data/fieldgroup/DefaultFieldGroupFieldFactory.java index 569f643998..be0db328f2 100644 --- a/src/com/vaadin/data/fieldgroup/DefaultFieldGroupFieldFactory.java +++ b/src/com/vaadin/data/fieldgroup/DefaultFieldGroupFieldFactory.java @@ -23,6 +23,7 @@ public class DefaultFieldGroupFieldFactory implements FieldGroupFieldFactory { public static final Object CAPTION_PROPERTY_ID = "Caption"; + @Override public <T extends Field> T createField(Class<?> type, Class<T> fieldType) { if (Enum.class.isAssignableFrom(type)) { return createEnumField(type, fieldType); diff --git a/src/com/vaadin/data/util/AbstractBeanContainer.java b/src/com/vaadin/data/util/AbstractBeanContainer.java index 300f92ea3a..2f428d2cb6 100644 --- a/src/com/vaadin/data/util/AbstractBeanContainer.java +++ b/src/com/vaadin/data/util/AbstractBeanContainer.java @@ -96,6 +96,7 @@ public abstract class AbstractBeanContainer<IDTYPE, BEANTYPE> extends this.propertyId = propertyId; } + @Override @SuppressWarnings("unchecked") public IDTYPE getIdForBean(BEANTYPE bean) throws IllegalArgumentException { @@ -163,6 +164,7 @@ public abstract class AbstractBeanContainer<IDTYPE, BEANTYPE> extends * * @see com.vaadin.data.Container#getType(java.lang.Object) */ + @Override public Class<?> getType(Object propertyId) { return model.get(propertyId).getPropertyType(); } @@ -195,6 +197,7 @@ public abstract class AbstractBeanContainer<IDTYPE, BEANTYPE> extends * * @see com.vaadin.data.Container#getContainerPropertyIds() */ + @Override public Collection<String> getContainerPropertyIds() { return model.keySet(); } @@ -258,6 +261,7 @@ public abstract class AbstractBeanContainer<IDTYPE, BEANTYPE> extends * @see com.vaadin.data.Container#getContainerProperty(java.lang.Object, * java.lang.Object) */ + @Override public Property<?> getContainerProperty(Object itemId, Object propertyId) { Item item = getItem(itemId); if (item == null) { @@ -300,6 +304,7 @@ public abstract class AbstractBeanContainer<IDTYPE, BEANTYPE> extends /** * Re-filter the container when one of the monitored properties changes. */ + @Override public void valueChange(ValueChangeEvent event) { // if a property that is used in a filter is changed, refresh filtering filterAll(); @@ -312,6 +317,7 @@ public abstract class AbstractBeanContainer<IDTYPE, BEANTYPE> extends * com.vaadin.data.Container.Filterable#addContainerFilter(java.lang.Object, * java.lang.String, boolean, boolean) */ + @Override public void addContainerFilter(Object propertyId, String filterString, boolean ignoreCase, boolean onlyMatchPrefix) { try { @@ -328,6 +334,7 @@ public abstract class AbstractBeanContainer<IDTYPE, BEANTYPE> extends * * @see com.vaadin.data.Container.Filterable#removeAllContainerFilters() */ + @Override public void removeAllContainerFilters() { if (!getFilters().isEmpty()) { for (Item item : itemIdToItem.values()) { @@ -344,6 +351,7 @@ public abstract class AbstractBeanContainer<IDTYPE, BEANTYPE> extends * com.vaadin.data.Container.Filterable#removeContainerFilters(java.lang * .Object) */ + @Override public void removeContainerFilters(Object propertyId) { Collection<Filter> removedFilters = super.removeFilters(propertyId); if (!removedFilters.isEmpty()) { @@ -354,11 +362,13 @@ public abstract class AbstractBeanContainer<IDTYPE, BEANTYPE> extends } } + @Override public void addContainerFilter(Filter filter) throws UnsupportedFilterException { addFilter(filter); } + @Override public void removeContainerFilter(Filter filter) { removeFilter(filter); } @@ -416,6 +426,7 @@ public abstract class AbstractBeanContainer<IDTYPE, BEANTYPE> extends * * @see com.vaadin.data.Container.Sortable#getSortableContainerPropertyIds() */ + @Override public Collection<?> getSortableContainerPropertyIds() { return getSortablePropertyIds(); } @@ -426,6 +437,7 @@ public abstract class AbstractBeanContainer<IDTYPE, BEANTYPE> extends * @see com.vaadin.data.Container.Sortable#sort(java.lang.Object[], * boolean[]) */ + @Override public void sort(Object[] propertyId, boolean[] ascending) { sortContainer(propertyId, ascending); } diff --git a/src/com/vaadin/data/util/AbstractContainer.java b/src/com/vaadin/data/util/AbstractContainer.java index 58a3a8687a..7d96c2d757 100644 --- a/src/com/vaadin/data/util/AbstractContainer.java +++ b/src/com/vaadin/data/util/AbstractContainer.java @@ -52,6 +52,7 @@ public abstract class AbstractContainer implements Container { super(source); } + @Override public Container getContainer() { return (Container) getSource(); } @@ -72,6 +73,7 @@ public abstract class AbstractContainer implements Container { super(source); } + @Override public Container getContainer() { return (Container) getSource(); } diff --git a/src/com/vaadin/data/util/AbstractInMemoryContainer.java b/src/com/vaadin/data/util/AbstractInMemoryContainer.java index 795aabb419..b7832756f2 100644 --- a/src/com/vaadin/data/util/AbstractInMemoryContainer.java +++ b/src/com/vaadin/data/util/AbstractInMemoryContainer.java @@ -125,6 +125,7 @@ public abstract class AbstractInMemoryContainer<ITEMIDTYPE, PROPERTYIDCLASS, ITE // Container interface methods with more specific return class // default implementation, can be overridden + @Override public ITEMCLASS getItem(Object itemId) { if (containsId(itemId)) { return getUnfilteredItem(itemId); @@ -152,10 +153,12 @@ public abstract class AbstractInMemoryContainer<ITEMIDTYPE, PROPERTYIDCLASS, ITE // Container interface method implementations + @Override public int size() { return getVisibleItemIds().size(); } + @Override public boolean containsId(Object itemId) { // only look at visible items after filtering if (itemId == null) { @@ -165,12 +168,14 @@ public abstract class AbstractInMemoryContainer<ITEMIDTYPE, PROPERTYIDCLASS, ITE } } + @Override public List<?> getItemIds() { return Collections.unmodifiableList(getVisibleItemIds()); } // Container.Ordered + @Override public ITEMIDTYPE nextItemId(Object itemId) { int index = indexOfId(itemId); if (index >= 0 && index < size() - 1) { @@ -181,6 +186,7 @@ public abstract class AbstractInMemoryContainer<ITEMIDTYPE, PROPERTYIDCLASS, ITE } } + @Override public ITEMIDTYPE prevItemId(Object itemId) { int index = indexOfId(itemId); if (index > 0) { @@ -191,6 +197,7 @@ public abstract class AbstractInMemoryContainer<ITEMIDTYPE, PROPERTYIDCLASS, ITE } } + @Override public ITEMIDTYPE firstItemId() { if (size() > 0) { return getIdByIndex(0); @@ -199,6 +206,7 @@ public abstract class AbstractInMemoryContainer<ITEMIDTYPE, PROPERTYIDCLASS, ITE } } + @Override public ITEMIDTYPE lastItemId() { if (size() > 0) { return getIdByIndex(size() - 1); @@ -207,6 +215,7 @@ public abstract class AbstractInMemoryContainer<ITEMIDTYPE, PROPERTYIDCLASS, ITE } } + @Override public boolean isFirstId(Object itemId) { if (itemId == null) { return false; @@ -214,6 +223,7 @@ public abstract class AbstractInMemoryContainer<ITEMIDTYPE, PROPERTYIDCLASS, ITE return itemId.equals(firstItemId()); } + @Override public boolean isLastId(Object itemId) { if (itemId == null) { return false; @@ -223,66 +233,78 @@ public abstract class AbstractInMemoryContainer<ITEMIDTYPE, PROPERTYIDCLASS, ITE // Container.Indexed + @Override public ITEMIDTYPE getIdByIndex(int index) { return getVisibleItemIds().get(index); } + @Override public int indexOfId(Object itemId) { return getVisibleItemIds().indexOf(itemId); } // methods that are unsupported by default, override to support + @Override public Object addItemAt(int index) throws UnsupportedOperationException { throw new UnsupportedOperationException( "Adding items not supported. Override the relevant addItem*() methods if required as specified in AbstractInMemoryContainer javadoc."); } + @Override public Item addItemAt(int index, Object newItemId) throws UnsupportedOperationException { throw new UnsupportedOperationException( "Adding items not supported. Override the relevant addItem*() methods if required as specified in AbstractInMemoryContainer javadoc."); } + @Override public Object addItemAfter(Object previousItemId) throws UnsupportedOperationException { throw new UnsupportedOperationException( "Adding items not supported. Override the relevant addItem*() methods if required as specified in AbstractInMemoryContainer javadoc."); } + @Override public Item addItemAfter(Object previousItemId, Object newItemId) throws UnsupportedOperationException { throw new UnsupportedOperationException( "Adding items not supported. Override the relevant addItem*() methods if required as specified in AbstractInMemoryContainer javadoc."); } + @Override public Item addItem(Object itemId) throws UnsupportedOperationException { throw new UnsupportedOperationException( "Adding items not supported. Override the relevant addItem*() methods if required as specified in AbstractInMemoryContainer javadoc."); } + @Override public Object addItem() throws UnsupportedOperationException { throw new UnsupportedOperationException( "Adding items not supported. Override the relevant addItem*() methods if required as specified in AbstractInMemoryContainer javadoc."); } + @Override public boolean removeItem(Object itemId) throws UnsupportedOperationException { throw new UnsupportedOperationException( "Removing items not supported. Override the removeItem() method if required as specified in AbstractInMemoryContainer javadoc."); } + @Override public boolean removeAllItems() throws UnsupportedOperationException { throw new UnsupportedOperationException( "Removing items not supported. Override the removeAllItems() method if required as specified in AbstractInMemoryContainer javadoc."); } + @Override public boolean addContainerProperty(Object propertyId, Class<?> type, Object defaultValue) throws UnsupportedOperationException { throw new UnsupportedOperationException( "Adding container properties not supported. Override the addContainerProperty() method if required."); } + @Override public boolean removeContainerProperty(Object propertyId) throws UnsupportedOperationException { throw new UnsupportedOperationException( diff --git a/src/com/vaadin/data/util/AbstractProperty.java b/src/com/vaadin/data/util/AbstractProperty.java index 3b6db3807e..373a8dfd58 100644 --- a/src/com/vaadin/data/util/AbstractProperty.java +++ b/src/com/vaadin/data/util/AbstractProperty.java @@ -42,10 +42,12 @@ public abstract class AbstractProperty<T> implements Property<T>, * Override for additional restrictions on what is considered a read-only * property. */ + @Override public boolean isReadOnly() { return readOnly; } + @Override public void setReadOnly(boolean newStatus) { boolean oldStatus = isReadOnly(); readOnly = newStatus; @@ -93,6 +95,7 @@ public abstract class AbstractProperty<T> implements Property<T>, * * @return source Property of the event. */ + @Override public Property getProperty() { return (Property) getSource(); } @@ -105,6 +108,7 @@ public abstract class AbstractProperty<T> implements Property<T>, * @param listener * the new Listener to be registered. */ + @Override public void addListener(Property.ReadOnlyStatusChangeListener listener) { if (readOnlyStatusChangeListeners == null) { readOnlyStatusChangeListeners = new LinkedList<ReadOnlyStatusChangeListener>(); @@ -118,6 +122,7 @@ public abstract class AbstractProperty<T> implements Property<T>, * @param listener * the listener to be removed. */ + @Override public void removeListener(Property.ReadOnlyStatusChangeListener listener) { if (readOnlyStatusChangeListeners != null) { readOnlyStatusChangeListeners.remove(listener); @@ -161,12 +166,14 @@ public abstract class AbstractProperty<T> implements Property<T>, * * @return source Property of the event. */ + @Override public Property getProperty() { return (Property) getSource(); } } + @Override public void addListener(ValueChangeListener listener) { if (valueChangeListeners == null) { valueChangeListeners = new LinkedList<ValueChangeListener>(); @@ -175,6 +182,7 @@ public abstract class AbstractProperty<T> implements Property<T>, } + @Override public void removeListener(ValueChangeListener listener) { if (valueChangeListeners != null) { valueChangeListeners.remove(listener); diff --git a/src/com/vaadin/data/util/BeanItemContainer.java b/src/com/vaadin/data/util/BeanItemContainer.java index 245a623d5d..dc4deaebdc 100644 --- a/src/com/vaadin/data/util/BeanItemContainer.java +++ b/src/com/vaadin/data/util/BeanItemContainer.java @@ -59,6 +59,7 @@ public class BeanItemContainer<BEANTYPE> extends private static class IdentityBeanIdResolver<BT> implements BeanIdResolver<BT, BT> { + @Override public BT getIdForBean(BT bean) { return bean; } diff --git a/src/com/vaadin/data/util/ContainerHierarchicalWrapper.java b/src/com/vaadin/data/util/ContainerHierarchicalWrapper.java index 9159fa358b..717ce834cf 100644 --- a/src/com/vaadin/data/util/ContainerHierarchicalWrapper.java +++ b/src/com/vaadin/data/util/ContainerHierarchicalWrapper.java @@ -71,6 +71,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, this.itemIds = itemIds; } + @Override public int compare(Object o1, Object o2) { if (o1.equals(o2)) { return 0; @@ -233,6 +234,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * Can the specified Item have any children? Don't add a JavaDoc comment * here, we use the default documentation from implemented interface. */ + @Override public boolean areChildrenAllowed(Object itemId) { // If the wrapped container implements the method directly, use it @@ -253,6 +255,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * comment here, we use the default documentation from implemented * interface. */ + @Override public Collection<?> getChildren(Object itemId) { // If the wrapped container implements the method directly, use it @@ -272,6 +275,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * comment here, we use the default documentation from implemented * interface. */ + @Override public Object getParent(Object itemId) { // If the wrapped container implements the method directly, use it @@ -287,6 +291,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * JavaDoc comment here, we use the default documentation from implemented * interface. */ + @Override public boolean hasChildren(Object itemId) { // If the wrapped container implements the method directly, use it @@ -303,6 +308,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * JavaDoc comment here, we use the default documentation from implemented * interface. */ + @Override public boolean isRoot(Object itemId) { // If the wrapped container implements the method directly, use it @@ -322,6 +328,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * comment here, we use the default documentation from implemented * interface. */ + @Override public Collection<?> rootItemIds() { // If the wrapped container implements the method directly, use it @@ -351,6 +358,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * @return <code>true</code> if the operation succeeded, <code>false</code> * if not */ + @Override public boolean setChildrenAllowed(Object itemId, boolean childrenAllowed) { // If the wrapped container implements the method directly, use it @@ -391,6 +399,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * @return <code>true</code> if the operation succeeded, <code>false</code> * if not */ + @Override public boolean setParent(Object itemId, Object newParentId) { // If the wrapped container implements the method directly, use it @@ -483,6 +492,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * @throws UnsupportedOperationException * if the addItem is not supported. */ + @Override public Object addItem() throws UnsupportedOperationException { final Object id = container.addItem(); @@ -502,6 +512,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * @throws UnsupportedOperationException * if the addItem is not supported. */ + @Override public Item addItem(Object itemId) throws UnsupportedOperationException { // Null ids are not accepted @@ -524,6 +535,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * @throws UnsupportedOperationException * if the removeAllItems is not supported. */ + @Override public boolean removeAllItems() throws UnsupportedOperationException { final boolean success = container.removeAllItems(); @@ -548,6 +560,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * @throws UnsupportedOperationException * if the removeItem is not supported. */ + @Override public boolean removeItem(Object itemId) throws UnsupportedOperationException { @@ -586,6 +599,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * @throws UnsupportedOperationException * if the addContainerProperty is not supported. */ + @Override public boolean addContainerProperty(Object propertyId, Class<?> type, Object defaultValue) throws UnsupportedOperationException { @@ -606,6 +620,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * @throws UnsupportedOperationException * if the removeContainerProperty is not supported. */ + @Override public boolean removeContainerProperty(Object propertyId) throws UnsupportedOperationException { return container.removeContainerProperty(propertyId); @@ -616,6 +631,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * comment here, we use the default documentation from implemented * interface. */ + @Override public boolean containsId(Object itemId) { return container.containsId(itemId); } @@ -624,6 +640,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * Gets the specified Item from the container. Don't add a JavaDoc comment * here, we use the default documentation from implemented interface. */ + @Override public Item getItem(Object itemId) { return container.getItem(itemId); } @@ -633,6 +650,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * comment here, we use the default documentation from implemented * interface. */ + @Override public Collection<?> getItemIds() { return container.getItemIds(); } @@ -642,6 +660,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * Container Don't add a JavaDoc comment here, we use the default * documentation from implemented interface. */ + @Override public Property<?> getContainerProperty(Object itemId, Object propertyId) { return container.getContainerProperty(itemId, propertyId); } @@ -651,6 +670,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * JavaDoc comment here, we use the default documentation from implemented * interface. */ + @Override public Collection<?> getContainerPropertyIds() { return container.getContainerPropertyIds(); } @@ -660,6 +680,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * Don't add a JavaDoc comment here, we use the default documentation from * implemented interface. */ + @Override public Class<?> getType(Object propertyId) { return container.getType(propertyId); } @@ -668,6 +689,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * Gets the number of Items in the Container. Don't add a JavaDoc comment * here, we use the default documentation from implemented interface. */ + @Override public int size() { return container.size(); } @@ -677,6 +699,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * JavaDoc comment here, we use the default documentation from implemented * interface. */ + @Override public void addListener(Container.ItemSetChangeListener listener) { if (container instanceof Container.ItemSetChangeNotifier) { ((Container.ItemSetChangeNotifier) container) @@ -689,6 +712,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * comment here, we use the default documentation from implemented * interface. */ + @Override public void removeListener(Container.ItemSetChangeListener listener) { if (container instanceof Container.ItemSetChangeNotifier) { ((Container.ItemSetChangeNotifier) container) @@ -701,6 +725,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * add a JavaDoc comment here, we use the default documentation from * implemented interface. */ + @Override public void addListener(Container.PropertySetChangeListener listener) { if (container instanceof Container.PropertySetChangeNotifier) { ((Container.PropertySetChangeNotifier) container) @@ -713,6 +738,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, * JavaDoc comment here, we use the default documentation from implemented * interface. */ + @Override public void removeListener(Container.PropertySetChangeListener listener) { if (container instanceof Container.PropertySetChangeNotifier) { ((Container.PropertySetChangeNotifier) container) @@ -736,6 +762,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, listener = realListener; } + @Override public void containerItemSetChange(ItemSetChangeEvent event) { updateHierarchicalWrapper(); ((Container.ItemSetChangeListener) listener) @@ -743,6 +770,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, } + @Override public void containerPropertySetChange(PropertySetChangeEvent event) { updateHierarchicalWrapper(); ((Container.PropertySetChangeListener) listener) diff --git a/src/com/vaadin/data/util/ContainerOrderedWrapper.java b/src/com/vaadin/data/util/ContainerOrderedWrapper.java index f333edecf4..d3d6f88d3e 100644 --- a/src/com/vaadin/data/util/ContainerOrderedWrapper.java +++ b/src/com/vaadin/data/util/ContainerOrderedWrapper.java @@ -221,6 +221,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * comment here, we use the default documentation from implemented * interface. */ + @Override public Object firstItemId() { if (ordered) { return ((Container.Ordered) container).firstItemId(); @@ -233,6 +234,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * JavaDoc comment here, we use the default documentation from implemented * interface. */ + @Override public boolean isFirstId(Object itemId) { if (ordered) { return ((Container.Ordered) container).isFirstId(itemId); @@ -245,6 +247,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * JavaDoc comment here, we use the default documentation from implemented * interface. */ + @Override public boolean isLastId(Object itemId) { if (ordered) { return ((Container.Ordered) container).isLastId(itemId); @@ -257,6 +260,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * comment here, we use the default documentation from implemented * interface. */ + @Override public Object lastItemId() { if (ordered) { return ((Container.Ordered) container).lastItemId(); @@ -269,6 +273,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * comment here, we use the default documentation from implemented * interface. */ + @Override public Object nextItemId(Object itemId) { if (ordered) { return ((Container.Ordered) container).nextItemId(itemId); @@ -284,6 +289,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * JavaDoc comment here, we use the default documentation from implemented * interface. */ + @Override public Object prevItemId(Object itemId) { if (ordered) { return ((Container.Ordered) container).prevItemId(itemId); @@ -306,6 +312,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * @return <code>true</code> if the operation succeeded, <code>false</code> * if not */ + @Override public boolean addContainerProperty(Object propertyId, Class<?> type, Object defaultValue) throws UnsupportedOperationException { @@ -321,6 +328,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * @throws UnsupportedOperationException * if the addItem is not supported. */ + @Override public Object addItem() throws UnsupportedOperationException { final Object id = container.addItem(); @@ -340,6 +348,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * @throws UnsupportedOperationException * if the addItem is not supported. */ + @Override public Item addItem(Object itemId) throws UnsupportedOperationException { final Item item = container.addItem(itemId); if (!ordered && item != null) { @@ -356,6 +365,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * @throws UnsupportedOperationException * if the removeAllItems is not supported. */ + @Override public boolean removeAllItems() throws UnsupportedOperationException { final boolean success = container.removeAllItems(); if (!ordered && success) { @@ -377,6 +387,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * @throws UnsupportedOperationException * if the removeItem is not supported. */ + @Override public boolean removeItem(Object itemId) throws UnsupportedOperationException { @@ -401,6 +412,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * @throws UnsupportedOperationException * if the removeContainerProperty is not supported. */ + @Override public boolean removeContainerProperty(Object propertyId) throws UnsupportedOperationException { return container.removeContainerProperty(propertyId); @@ -411,6 +423,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * comment here, we use the default documentation from implemented * interface. */ + @Override public boolean containsId(Object itemId) { return container.containsId(itemId); } @@ -419,6 +432,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * Gets the specified Item from the container. Don't add a JavaDoc comment * here, we use the default documentation from implemented interface. */ + @Override public Item getItem(Object itemId) { return container.getItem(itemId); } @@ -428,6 +442,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * comment here, we use the default documentation from implemented * interface. */ + @Override public Collection<?> getItemIds() { return container.getItemIds(); } @@ -437,6 +452,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * Container Don't add a JavaDoc comment here, we use the default * documentation from implemented interface. */ + @Override public Property<?> getContainerProperty(Object itemId, Object propertyId) { return container.getContainerProperty(itemId, propertyId); } @@ -446,6 +462,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * JavaDoc comment here, we use the default documentation from implemented * interface. */ + @Override public Collection<?> getContainerPropertyIds() { return container.getContainerPropertyIds(); } @@ -455,6 +472,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * Don't add a JavaDoc comment here, we use the default documentation from * implemented interface. */ + @Override public Class<?> getType(Object propertyId) { return container.getType(propertyId); } @@ -463,6 +481,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * Gets the number of Items in the Container. Don't add a JavaDoc comment * here, we use the default documentation from implemented interface. */ + @Override public int size() { int newSize = container.size(); if (lastKnownSize != -1 && newSize != lastKnownSize @@ -480,6 +499,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * JavaDoc comment here, we use the default documentation from implemented * interface. */ + @Override public void addListener(Container.ItemSetChangeListener listener) { if (container instanceof Container.ItemSetChangeNotifier) { ((Container.ItemSetChangeNotifier) container) @@ -492,6 +512,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * comment here, we use the default documentation from implemented * interface. */ + @Override public void removeListener(Container.ItemSetChangeListener listener) { if (container instanceof Container.ItemSetChangeNotifier) { ((Container.ItemSetChangeNotifier) container) @@ -504,6 +525,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * add a JavaDoc comment here, we use the default documentation from * implemented interface. */ + @Override public void addListener(Container.PropertySetChangeListener listener) { if (container instanceof Container.PropertySetChangeNotifier) { ((Container.PropertySetChangeNotifier) container) @@ -516,6 +538,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * JavaDoc comment here, we use the default documentation from implemented * interface. */ + @Override public void removeListener(Container.PropertySetChangeListener listener) { if (container instanceof Container.PropertySetChangeNotifier) { ((Container.PropertySetChangeNotifier) container) @@ -529,6 +552,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * @see com.vaadin.data.Container.Ordered#addItemAfter(java.lang.Object, * java.lang.Object) */ + @Override public Item addItemAfter(Object previousItemId, Object newItemId) throws UnsupportedOperationException { @@ -553,6 +577,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, * * @see com.vaadin.data.Container.Ordered#addItemAfter(java.lang.Object) */ + @Override public Object addItemAfter(Object previousItemId) throws UnsupportedOperationException { @@ -588,6 +613,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, listener = realListener; } + @Override public void containerItemSetChange(ItemSetChangeEvent event) { updateOrderWrapper(); ((Container.ItemSetChangeListener) listener) @@ -595,6 +621,7 @@ public class ContainerOrderedWrapper implements Container.Ordered, } + @Override public void containerPropertySetChange(PropertySetChangeEvent event) { updateOrderWrapper(); ((Container.PropertySetChangeListener) listener) diff --git a/src/com/vaadin/data/util/DefaultItemSorter.java b/src/com/vaadin/data/util/DefaultItemSorter.java index 47db5d7507..81b15ebd4f 100644 --- a/src/com/vaadin/data/util/DefaultItemSorter.java +++ b/src/com/vaadin/data/util/DefaultItemSorter.java @@ -61,6 +61,7 @@ public class DefaultItemSorter implements ItemSorter { * @see com.vaadin.data.util.ItemSorter#compare(java.lang.Object, * java.lang.Object) */ + @Override public int compare(Object o1, Object o2) { Item item1 = container.getItem(o1); Item item2 = container.getItem(o2); @@ -147,6 +148,7 @@ public class DefaultItemSorter implements ItemSorter { * com.vaadin.data.util.ItemSorter#setSortProperties(com.vaadin.data.Container * .Sortable, java.lang.Object[], boolean[]) */ + @Override public void setSortProperties(Container.Sortable container, Object[] propertyId, boolean[] ascending) { this.container = container; @@ -181,6 +183,7 @@ public class DefaultItemSorter implements ItemSorter { public static class DefaultPropertyValueComparator implements Comparator<Object>, Serializable { + @Override @SuppressWarnings("unchecked") public int compare(Object o1, Object o2) { int r = 0; diff --git a/src/com/vaadin/data/util/FilesystemContainer.java b/src/com/vaadin/data/util/FilesystemContainer.java index 7100286712..cdfeb57e14 100644 --- a/src/com/vaadin/data/util/FilesystemContainer.java +++ b/src/com/vaadin/data/util/FilesystemContainer.java @@ -187,6 +187,7 @@ public class FilesystemContainer implements Container.Hierarchical { * @return <code>true</code> if the specified Item is a directory, * <code>false</code> otherwise. */ + @Override public boolean areChildrenAllowed(Object itemId) { return itemId instanceof File && ((File) itemId).canRead() && ((File) itemId).isDirectory(); @@ -197,6 +198,7 @@ public class FilesystemContainer implements Container.Hierarchical { * add a JavaDoc comment here, we use the default documentation from * implemented interface. */ + @Override public Collection<File> getChildren(Object itemId) { if (!(itemId instanceof File)) { @@ -223,6 +225,7 @@ public class FilesystemContainer implements Container.Hierarchical { * Gets the parent item of the specified Item. Don't add a JavaDoc comment * here, we use the default documentation from implemented interface. */ + @Override public Object getParent(Object itemId) { if (!(itemId instanceof File)) { @@ -235,6 +238,7 @@ public class FilesystemContainer implements Container.Hierarchical { * Tests if the specified Item has any children. Don't add a JavaDoc comment * here, we use the default documentation from implemented interface. */ + @Override public boolean hasChildren(Object itemId) { if (!(itemId instanceof File)) { @@ -254,6 +258,7 @@ public class FilesystemContainer implements Container.Hierarchical { * JavaDoc comment here, we use the default documentation from implemented * interface. */ + @Override public boolean isRoot(Object itemId) { if (!(itemId instanceof File)) { @@ -272,6 +277,7 @@ public class FilesystemContainer implements Container.Hierarchical { * comment here, we use the default documentation from implemented * interface. */ + @Override public Collection<File> rootItemIds() { File[] f; @@ -311,6 +317,7 @@ public class FilesystemContainer implements Container.Hierarchical { * @throws UnsupportedOperationException * if the setChildrenAllowed is not supported. */ + @Override public boolean setChildrenAllowed(Object itemId, boolean areChildrenAllowed) throws UnsupportedOperationException { @@ -332,6 +339,7 @@ public class FilesystemContainer implements Container.Hierarchical { * @throws UnsupportedOperationException * if the setParent is not supported. */ + @Override public boolean setParent(Object itemId, Object newParentId) throws UnsupportedOperationException { @@ -343,6 +351,7 @@ public class FilesystemContainer implements Container.Hierarchical { * comment here, we use the default documentation from implemented * interface. */ + @Override public boolean containsId(Object itemId) { if (!(itemId instanceof File)) { @@ -371,6 +380,7 @@ public class FilesystemContainer implements Container.Hierarchical { * Gets the specified Item from the filesystem. Don't add a JavaDoc comment * here, we use the default documentation from implemented interface. */ + @Override public Item getItem(Object itemId) { if (!(itemId instanceof File)) { @@ -416,6 +426,7 @@ public class FilesystemContainer implements Container.Hierarchical { * Gets the IDs of Items in the filesystem. Don't add a JavaDoc comment * here, we use the default documentation from implemented interface. */ + @Override public Collection<File> getItemIds() { if (recursive) { @@ -459,6 +470,7 @@ public class FilesystemContainer implements Container.Hierarchical { * the property's ID. * @return the requested property's value, or <code>null</code> */ + @Override public Property<?> getContainerProperty(Object itemId, Object propertyId) { if (!(itemId instanceof File)) { @@ -493,6 +505,7 @@ public class FilesystemContainer implements Container.Hierarchical { * * @return Unmodifiable collection containing all available file properties. */ + @Override public Collection<String> getContainerPropertyIds() { return FILE_PROPERTIES; } @@ -506,6 +519,7 @@ public class FilesystemContainer implements Container.Hierarchical { * the ID of the property whose type is requested. * @return data type of the requested property, or <code>null</code> */ + @Override public Class<?> getType(Object propertyId) { if (propertyId.equals(PROPERTY_NAME)) { @@ -556,6 +570,7 @@ public class FilesystemContainer implements Container.Hierarchical { * * @return Number of Items in the container. */ + @Override public int size() { if (recursive) { @@ -609,6 +624,7 @@ public class FilesystemContainer implements Container.Hierarchical { * Gets the specified property of this file. Don't add a JavaDoc comment * here, we use the default documentation from implemented interface. */ + @Override public Property<?> getItemProperty(Object id) { return getContainerProperty(file, id); } @@ -618,6 +634,7 @@ public class FilesystemContainer implements Container.Hierarchical { * JavaDoc comment here, we use the default documentation from * implemented interface. */ + @Override public Collection<String> getItemPropertyIds() { return getContainerPropertyIds(); } @@ -716,6 +733,7 @@ public class FilesystemContainer implements Container.Hierarchical { * * @see com.vaadin.data.Item#addItemProperty(Object, Property) */ + @Override public boolean addItemProperty(Object id, Property property) throws UnsupportedOperationException { throw new UnsupportedOperationException("Filesystem container " @@ -727,6 +745,7 @@ public class FilesystemContainer implements Container.Hierarchical { * * @see com.vaadin.data.Item#removeItemProperty(Object) */ + @Override public boolean removeItemProperty(Object id) throws UnsupportedOperationException { throw new UnsupportedOperationException( @@ -763,6 +782,7 @@ public class FilesystemContainer implements Container.Hierarchical { * * @see java.io.FilenameFilter#accept(File, String) */ + @Override public boolean accept(File dir, String name) { if (name.endsWith(filter)) { return true; @@ -832,6 +852,7 @@ public class FilesystemContainer implements Container.Hierarchical { * @see com.vaadin.data.Container#addContainerProperty(java.lang.Object, * java.lang.Class, java.lang.Object) */ + @Override public boolean addContainerProperty(Object propertyId, Class<?> type, Object defaultValue) throws UnsupportedOperationException { throw new UnsupportedOperationException( @@ -843,6 +864,7 @@ public class FilesystemContainer implements Container.Hierarchical { * * @see com.vaadin.data.Container#addItem() */ + @Override public Object addItem() throws UnsupportedOperationException { throw new UnsupportedOperationException( "File system container does not support this operation"); @@ -853,6 +875,7 @@ public class FilesystemContainer implements Container.Hierarchical { * * @see com.vaadin.data.Container#addItem(java.lang.Object) */ + @Override public Item addItem(Object itemId) throws UnsupportedOperationException { throw new UnsupportedOperationException( "File system container does not support this operation"); @@ -863,6 +886,7 @@ public class FilesystemContainer implements Container.Hierarchical { * * @see com.vaadin.data.Container#removeAllItems() */ + @Override public boolean removeAllItems() throws UnsupportedOperationException { throw new UnsupportedOperationException( "File system container does not support this operation"); @@ -873,6 +897,7 @@ public class FilesystemContainer implements Container.Hierarchical { * * @see com.vaadin.data.Container#removeItem(java.lang.Object) */ + @Override public boolean removeItem(Object itemId) throws UnsupportedOperationException { throw new UnsupportedOperationException( @@ -884,6 +909,7 @@ public class FilesystemContainer implements Container.Hierarchical { * * @see com.vaadin.data.Container#removeContainerProperty(java.lang.Object ) */ + @Override public boolean removeContainerProperty(Object propertyId) throws UnsupportedOperationException { throw new UnsupportedOperationException( diff --git a/src/com/vaadin/data/util/HierarchicalContainer.java b/src/com/vaadin/data/util/HierarchicalContainer.java index 1291c8fcc4..06ab77c0e7 100644 --- a/src/com/vaadin/data/util/HierarchicalContainer.java +++ b/src/com/vaadin/data/util/HierarchicalContainer.java @@ -77,6 +77,7 @@ public class HierarchicalContainer extends IndexedContainer implements * Can the specified Item have any children? Don't add a JavaDoc comment * here, we use the default documentation from implemented interface. */ + @Override public boolean areChildrenAllowed(Object itemId) { if (noChildrenAllowed.contains(itemId)) { return false; @@ -89,6 +90,7 @@ public class HierarchicalContainer extends IndexedContainer implements * comment here, we use the default documentation from implemented * interface. */ + @Override public Collection<?> getChildren(Object itemId) { LinkedList<Object> c; @@ -109,6 +111,7 @@ public class HierarchicalContainer extends IndexedContainer implements * comment here, we use the default documentation from implemented * interface. */ + @Override public Object getParent(Object itemId) { if (filteredParent != null) { return filteredParent.get(itemId); @@ -121,6 +124,7 @@ public class HierarchicalContainer extends IndexedContainer implements * JavaDoc comment here, we use the default documentation from implemented * interface. */ + @Override public boolean hasChildren(Object itemId) { if (filteredChildren != null) { return filteredChildren.containsKey(itemId); @@ -134,6 +138,7 @@ public class HierarchicalContainer extends IndexedContainer implements * JavaDoc comment here, we use the default documentation from implemented * interface. */ + @Override public boolean isRoot(Object itemId) { // If the container is filtered the itemId must be among filteredRoots // to be a root. @@ -156,6 +161,7 @@ public class HierarchicalContainer extends IndexedContainer implements * comment here, we use the default documentation from implemented * interface. */ + @Override public Collection<?> rootItemIds() { if (filteredRoots != null) { return Collections.unmodifiableCollection(filteredRoots); @@ -183,6 +189,7 @@ public class HierarchicalContainer extends IndexedContainer implements * @return <code>true</code> if the operation succeeded, <code>false</code> * if not */ + @Override public boolean setChildrenAllowed(Object itemId, boolean childrenAllowed) { // Checks that the item is in the container @@ -217,6 +224,7 @@ public class HierarchicalContainer extends IndexedContainer implements * @return <code>true</code> if the operation succeeded, <code>false</code> * if not */ + @Override public boolean setParent(Object itemId, Object newParentId) { // Checks that the item is in the container diff --git a/src/com/vaadin/data/util/HierarchicalContainerOrderedWrapper.java b/src/com/vaadin/data/util/HierarchicalContainerOrderedWrapper.java index b7eac3e378..172dc0dd4f 100644 --- a/src/com/vaadin/data/util/HierarchicalContainerOrderedWrapper.java +++ b/src/com/vaadin/data/util/HierarchicalContainerOrderedWrapper.java @@ -25,35 +25,43 @@ public class HierarchicalContainerOrderedWrapper extends hierarchical = toBeWrapped; } + @Override public boolean areChildrenAllowed(Object itemId) { return hierarchical.areChildrenAllowed(itemId); } + @Override public Collection<?> getChildren(Object itemId) { return hierarchical.getChildren(itemId); } + @Override public Object getParent(Object itemId) { return hierarchical.getParent(itemId); } + @Override public boolean hasChildren(Object itemId) { return hierarchical.hasChildren(itemId); } + @Override public boolean isRoot(Object itemId) { return hierarchical.isRoot(itemId); } + @Override public Collection<?> rootItemIds() { return hierarchical.rootItemIds(); } + @Override public boolean setChildrenAllowed(Object itemId, boolean areChildrenAllowed) throws UnsupportedOperationException { return hierarchical.setChildrenAllowed(itemId, areChildrenAllowed); } + @Override public boolean setParent(Object itemId, Object newParentId) throws UnsupportedOperationException { return hierarchical.setParent(itemId, newParentId); diff --git a/src/com/vaadin/data/util/IndexedContainer.java b/src/com/vaadin/data/util/IndexedContainer.java index bcaa5eda42..b95b2c4de8 100644 --- a/src/com/vaadin/data/util/IndexedContainer.java +++ b/src/com/vaadin/data/util/IndexedContainer.java @@ -128,6 +128,7 @@ public class IndexedContainer extends * * @see com.vaadin.data.Container#getContainerPropertyIds() */ + @Override public Collection<?> getContainerPropertyIds() { return Collections.unmodifiableCollection(propertyIds); } @@ -139,6 +140,7 @@ public class IndexedContainer extends * the ID of the Property. * @return Type of the requested Property */ + @Override public Class<?> getType(Object propertyId) { return types.get(propertyId); } @@ -149,6 +151,7 @@ public class IndexedContainer extends * @see com.vaadin.data.Container#getContainerProperty(java.lang.Object, * java.lang.Object) */ + @Override public Property<?> getContainerProperty(Object itemId, Object propertyId) { if (!containsId(itemId)) { return null; @@ -466,6 +469,7 @@ public class IndexedContainer extends * * @see com.vaadin.data.Property.ValueChangeEvent#getProperty() */ + @Override public Property getProperty() { return (Property) getSource(); } @@ -488,6 +492,7 @@ public class IndexedContainer extends * @see com.vaadin.data.Property.ValueChangeNotifier#addListener(com. * vaadin.data.Property.ValueChangeListener) */ + @Override public void addListener(Property.ValueChangeListener listener) { if (propertyValueChangeListeners == null) { propertyValueChangeListeners = new LinkedList<Property.ValueChangeListener>(); @@ -501,6 +506,7 @@ public class IndexedContainer extends * @see com.vaadin.data.Property.ValueChangeNotifier#removeListener(com * .vaadin.data.Property.ValueChangeListener) */ + @Override public void removeListener(Property.ValueChangeListener listener) { if (propertyValueChangeListeners != null) { propertyValueChangeListeners.remove(listener); @@ -679,10 +685,12 @@ public class IndexedContainer extends * * @see com.vaadin.data.Item#getItemProperty(java.lang.Object) */ + @Override public Property<?> getItemProperty(Object id) { return new IndexedContainerProperty(itemId, id); } + @Override public Collection<?> getItemPropertyIds() { return Collections.unmodifiableCollection(propertyIds); } @@ -753,6 +761,7 @@ public class IndexedContainer extends * * @see com.vaadin.data.Item#addProperty(Object, Property) */ + @Override public boolean addItemProperty(Object id, Property property) throws UnsupportedOperationException { throw new UnsupportedOperationException("Indexed container item " @@ -766,6 +775,7 @@ public class IndexedContainer extends * * @see com.vaadin.data.Item#removeProperty(Object) */ + @Override public boolean removeItemProperty(Object id) throws UnsupportedOperationException { throw new UnsupportedOperationException( @@ -824,6 +834,7 @@ public class IndexedContainer extends * * @see com.vaadin.data.Property#getType() */ + @Override public Class<?> getType() { return types.get(propertyId); } @@ -833,6 +844,7 @@ public class IndexedContainer extends * * @see com.vaadin.data.Property#getValue() */ + @Override public Object getValue() { return items.get(itemId).get(propertyId); } @@ -842,6 +854,7 @@ public class IndexedContainer extends * * @see com.vaadin.data.Property#isReadOnly() */ + @Override public boolean isReadOnly() { return readOnlyProperties.contains(this); } @@ -851,6 +864,7 @@ public class IndexedContainer extends * * @see com.vaadin.data.Property#setReadOnly(boolean) */ + @Override public void setReadOnly(boolean newStatus) { if (newStatus) { readOnlyProperties.add(this); @@ -864,6 +878,7 @@ public class IndexedContainer extends * * @see com.vaadin.data.Property#setValue(java.lang.Object) */ + @Override public void setValue(Object newValue) throws Property.ReadOnlyException { // Gets the Property set final Map<Object, Object> propertySet = items.get(itemId); @@ -946,6 +961,7 @@ public class IndexedContainer extends * @see com.vaadin.data.Property.ValueChangeNotifier#addListener( * com.vaadin.data.Property.ValueChangeListener) */ + @Override public void addListener(Property.ValueChangeListener listener) { addSinglePropertyChangeListener(propertyId, itemId, listener); } @@ -956,6 +972,7 @@ public class IndexedContainer extends * @see com.vaadin.data.Property.ValueChangeNotifier#removeListener * (com.vaadin.data.Property.ValueChangeListener) */ + @Override public void removeListener(Property.ValueChangeListener listener) { removeSinglePropertyChangeListener(propertyId, itemId, listener); } @@ -972,6 +989,7 @@ public class IndexedContainer extends * @see com.vaadin.data.Container.Sortable#sort(java.lang.Object[], * boolean[]) */ + @Override public void sort(Object[] propertyId, boolean[] ascending) { sortContainer(propertyId, ascending); } @@ -982,6 +1000,7 @@ public class IndexedContainer extends * @see com.vaadin.data.Container.Sortable#getSortableContainerPropertyIds * () */ + @Override public Collection<?> getSortableContainerPropertyIds() { return getSortablePropertyIds(); } @@ -1054,6 +1073,7 @@ public class IndexedContainer extends return nc; } + @Override public void addContainerFilter(Object propertyId, String filterString, boolean ignoreCase, boolean onlyMatchPrefix) { try { @@ -1065,19 +1085,23 @@ public class IndexedContainer extends } } + @Override public void removeAllContainerFilters() { removeAllFilters(); } + @Override public void removeContainerFilters(Object propertyId) { removeFilters(propertyId); } + @Override public void addContainerFilter(Filter filter) throws UnsupportedFilterException { addFilter(filter); } + @Override public void removeContainerFilter(Filter filter) { removeFilter(filter); } diff --git a/src/com/vaadin/data/util/ItemSorter.java b/src/com/vaadin/data/util/ItemSorter.java index 7f9e3a3f13..4399dbe292 100644 --- a/src/com/vaadin/data/util/ItemSorter.java +++ b/src/com/vaadin/data/util/ItemSorter.java @@ -51,6 +51,7 @@ public interface ItemSorter extends Comparator<Object>, Cloneable, Serializable * * @see Comparator#compare(Object, Object) */ + @Override int compare(Object itemId1, Object itemId2); } diff --git a/src/com/vaadin/data/util/MethodProperty.java b/src/com/vaadin/data/util/MethodProperty.java index 7df45e04ab..0c64d90481 100644 --- a/src/com/vaadin/data/util/MethodProperty.java +++ b/src/com/vaadin/data/util/MethodProperty.java @@ -568,6 +568,7 @@ public class MethodProperty<T> extends AbstractProperty<T> { * * @return type of the Property */ + @Override public final Class<? extends T> getType() { return type; } @@ -591,6 +592,7 @@ public class MethodProperty<T> extends AbstractProperty<T> { * * @return the value of the Property */ + @Override public T getValue() { try { return (T) getMethod.invoke(instance, getArgs); @@ -638,6 +640,7 @@ public class MethodProperty<T> extends AbstractProperty<T> { * read-only mode. * @see #invokeSetMethod(Object) */ + @Override @SuppressWarnings("unchecked") public void setValue(Object newValue) throws Property.ReadOnlyException { diff --git a/src/com/vaadin/data/util/MethodPropertyDescriptor.java b/src/com/vaadin/data/util/MethodPropertyDescriptor.java index 5fdb982b9e..a2a76ec6cf 100644 --- a/src/com/vaadin/data/util/MethodPropertyDescriptor.java +++ b/src/com/vaadin/data/util/MethodPropertyDescriptor.java @@ -112,14 +112,17 @@ public class MethodPropertyDescriptor<BT> implements } }; + @Override public String getName() { return name; } + @Override public Class<?> getPropertyType() { return propertyType; } + @Override public Property<?> createProperty(Object bean) { return new MethodProperty<Object>(propertyType, bean, readMethod, writeMethod); diff --git a/src/com/vaadin/data/util/NestedMethodProperty.java b/src/com/vaadin/data/util/NestedMethodProperty.java index d7b0f44912..9bff38456d 100644 --- a/src/com/vaadin/data/util/NestedMethodProperty.java +++ b/src/com/vaadin/data/util/NestedMethodProperty.java @@ -165,6 +165,7 @@ public class NestedMethodProperty<T> extends AbstractProperty<T> { this.setMethod = setMethod; } + @Override public Class<? extends T> getType() { return type; } @@ -180,6 +181,7 @@ public class NestedMethodProperty<T> extends AbstractProperty<T> { * * @return the value of the Property */ + @Override public T getValue() { try { Object object = instance; @@ -202,6 +204,7 @@ public class NestedMethodProperty<T> extends AbstractProperty<T> { * read-only mode. * @see #invokeSetMethod(Object) */ + @Override public void setValue(Object newValue) throws ReadOnlyException { // Checks the mode if (isReadOnly()) { diff --git a/src/com/vaadin/data/util/NestedPropertyDescriptor.java b/src/com/vaadin/data/util/NestedPropertyDescriptor.java index 6404f6361d..b67b425d1d 100644 --- a/src/com/vaadin/data/util/NestedPropertyDescriptor.java +++ b/src/com/vaadin/data/util/NestedPropertyDescriptor.java @@ -42,14 +42,17 @@ public class NestedPropertyDescriptor<BT> implements this.propertyType = property.getType(); } + @Override public String getName() { return name; } + @Override public Class<?> getPropertyType() { return propertyType; } + @Override public Property<?> createProperty(BT bean) { return new NestedMethodProperty<Object>(bean, name); } diff --git a/src/com/vaadin/data/util/ObjectProperty.java b/src/com/vaadin/data/util/ObjectProperty.java index 9c60b9146e..cb85b44c2a 100644 --- a/src/com/vaadin/data/util/ObjectProperty.java +++ b/src/com/vaadin/data/util/ObjectProperty.java @@ -91,6 +91,7 @@ public class ObjectProperty<T> extends AbstractProperty<T> { * * @return type of the Property */ + @Override public final Class<T> getType() { return type; } @@ -100,6 +101,7 @@ public class ObjectProperty<T> extends AbstractProperty<T> { * * @return the value stored in the Property */ + @Override public T getValue() { return value; } @@ -115,6 +117,7 @@ public class ObjectProperty<T> extends AbstractProperty<T> { * @throws <code>Property.ReadOnlyException</code> if the object is in * read-only mode */ + @Override @SuppressWarnings("unchecked") public void setValue(Object newValue) throws Property.ReadOnlyException { diff --git a/src/com/vaadin/data/util/PropertyFormatter.java b/src/com/vaadin/data/util/PropertyFormatter.java index a63973535b..3d65726309 100644 --- a/src/com/vaadin/data/util/PropertyFormatter.java +++ b/src/com/vaadin/data/util/PropertyFormatter.java @@ -75,6 +75,7 @@ public abstract class PropertyFormatter<T> extends AbstractProperty<String> * @return the current data source as a Property, or <code>null</code> if * none defined. */ + @Override public Property<T> getPropertyDataSource() { return dataSource; } @@ -91,6 +92,7 @@ public abstract class PropertyFormatter<T> extends AbstractProperty<String> * @param newDataSource * the new data source Property. */ + @Override public void setPropertyDataSource(Property newDataSource) { boolean readOnly = false; @@ -132,6 +134,7 @@ public abstract class PropertyFormatter<T> extends AbstractProperty<String> } /* Documented in the interface */ + @Override public Class<String> getType() { return String.class; } @@ -142,6 +145,7 @@ public abstract class PropertyFormatter<T> extends AbstractProperty<String> * @return If the datasource returns null, this is null. Otherwise this is * String given by format(). */ + @Override public String getValue() { T value = dataSource == null ? null : dataSource.getValue(); if (value == null) { @@ -195,6 +199,7 @@ public abstract class PropertyFormatter<T> extends AbstractProperty<String> } } + @Override public void setValue(Object newValue) throws ReadOnlyException { if (dataSource == null) { return; @@ -221,6 +226,7 @@ public abstract class PropertyFormatter<T> extends AbstractProperty<String> * * This should not be called directly. */ + @Override public void valueChange(com.vaadin.data.Property.ValueChangeEvent event) { fireValueChange(); } @@ -230,6 +236,7 @@ public abstract class PropertyFormatter<T> extends AbstractProperty<String> * * This should not be called directly. */ + @Override public void readOnlyStatusChange( com.vaadin.data.Property.ReadOnlyStatusChangeEvent event) { fireReadOnlyStatusChange(); diff --git a/src/com/vaadin/data/util/PropertysetItem.java b/src/com/vaadin/data/util/PropertysetItem.java index 3270fa31f9..22f2da75b2 100644 --- a/src/com/vaadin/data/util/PropertysetItem.java +++ b/src/com/vaadin/data/util/PropertysetItem.java @@ -57,6 +57,7 @@ public class PropertysetItem implements Item, Item.PropertySetChangeNotifier, * the identifier of the Property to get. * @return the Property with the given ID or <code>null</code> */ + @Override public Property<?> getItemProperty(Object id) { return map.get(id); } @@ -67,6 +68,7 @@ public class PropertysetItem implements Item, Item.PropertySetChangeNotifier, * @return unmodifiable collection containing IDs of the Properties stored * the Item */ + @Override public Collection<?> getItemPropertyIds() { return Collections.unmodifiableCollection(list); } @@ -83,6 +85,7 @@ public class PropertysetItem implements Item, Item.PropertySetChangeNotifier, * @return <code>true</code> if the operation succeeded <code>false</code> * if not */ + @Override public boolean removeItemProperty(Object id) { // Cant remove missing properties @@ -107,6 +110,7 @@ public class PropertysetItem implements Item, Item.PropertySetChangeNotifier, * @return <code>true</code> if the operation succeeded, <code>false</code> * if not */ + @Override public boolean addItemProperty(Object id, Property property) { // Null ids are not accepted @@ -175,6 +179,7 @@ public class PropertysetItem implements Item, Item.PropertySetChangeNotifier, * * @return source object of the event as an <code>Item</code> */ + @Override public Item getItem() { return (Item) getSource(); } @@ -186,6 +191,7 @@ public class PropertysetItem implements Item, Item.PropertySetChangeNotifier, * @param listener * the new Listener to be registered. */ + @Override public void addListener(Item.PropertySetChangeListener listener) { if (propertySetChangeListeners == null) { propertySetChangeListeners = new LinkedList<PropertySetChangeListener>(); @@ -199,6 +205,7 @@ public class PropertysetItem implements Item, Item.PropertySetChangeNotifier, * @param listener * the Listener to be removed. */ + @Override public void removeListener(Item.PropertySetChangeListener listener) { if (propertySetChangeListeners != null) { propertySetChangeListeners.remove(listener); diff --git a/src/com/vaadin/data/util/QueryContainer.java b/src/com/vaadin/data/util/QueryContainer.java index 7fef63e7f1..dc7c883a7e 100644 --- a/src/com/vaadin/data/util/QueryContainer.java +++ b/src/com/vaadin/data/util/QueryContainer.java @@ -188,6 +188,7 @@ public class QueryContainer implements Container, Container.Ordered, * @return Item Id. */ + @Override public Item getItem(Object id) { return new Row(id); } @@ -198,6 +199,7 @@ public class QueryContainer implements Container, Container.Ordered, * @return Collection of Property ID. */ + @Override public Collection<String> getContainerPropertyIds() { return propertyIds; } @@ -207,6 +209,7 @@ public class QueryContainer implements Container, Container.Ordered, * * @return collection of Item IDs */ + @Override public Collection<?> getItemIds() { final Collection<Integer> c = new ArrayList<Integer>(size); for (int i = 1; i <= size; i++) { @@ -229,6 +232,7 @@ public class QueryContainer implements Container, Container.Ordered, * otherwise. */ + @Override public synchronized Property<?> getContainerProperty(Object itemId, Object propertyId) { if (!(itemId instanceof Integer && propertyId instanceof String)) { @@ -256,6 +260,7 @@ public class QueryContainer implements Container, Container.Ordered, * @return data type of the Properties */ + @Override public Class<?> getType(Object id) { return propertyTypes.get(id); } @@ -265,6 +270,7 @@ public class QueryContainer implements Container, Container.Ordered, * * @return the number of items in the container. */ + @Override public int size() { return size; } @@ -277,6 +283,7 @@ public class QueryContainer implements Container, Container.Ordered, * @return <code>true</code> if given id is in the container; * <code>false</code> otherwise. */ + @Override public boolean containsId(Object id) { if (!(id instanceof Integer)) { return false; @@ -302,6 +309,7 @@ public class QueryContainer implements Container, Container.Ordered, * @throws UnsupportedOperationException * if the addItem method is not supported. */ + @Override public Item addItem(Object itemId) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -313,6 +321,7 @@ public class QueryContainer implements Container, Container.Ordered, * @throws UnsupportedOperationException * if the addItem method is not supported. */ + @Override public Object addItem() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -327,6 +336,7 @@ public class QueryContainer implements Container, Container.Ordered, * @throws UnsupportedOperationException * if the removeItem method is not supported. */ + @Override public boolean removeItem(Object itemId) throws UnsupportedOperationException { throw new UnsupportedOperationException(); @@ -346,6 +356,7 @@ public class QueryContainer implements Container, Container.Ordered, * @throws UnsupportedOperationException * if the addContainerProperty method is not supported. */ + @Override public boolean addContainerProperty(Object propertyId, Class<?> type, Object defaultValue) throws UnsupportedOperationException { throw new UnsupportedOperationException(); @@ -361,6 +372,7 @@ public class QueryContainer implements Container, Container.Ordered, * @throws UnsupportedOperationException * if the removeContainerProperty method is not supported. */ + @Override public boolean removeContainerProperty(Object propertyId) throws UnsupportedOperationException { throw new UnsupportedOperationException(); @@ -374,6 +386,7 @@ public class QueryContainer implements Container, Container.Ordered, * @throws UnsupportedOperationException * if the removeAllItems method is not supported. */ + @Override public boolean removeAllItems() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -389,6 +402,7 @@ public class QueryContainer implements Container, Container.Ordered, * @throws UnsupportedOperationException * if the addItemAfter method is not supported. */ + @Override public Item addItemAfter(Object previousItemId, Object newItemId) throws UnsupportedOperationException { throw new UnsupportedOperationException(); @@ -404,6 +418,7 @@ public class QueryContainer implements Container, Container.Ordered, * @throws UnsupportedOperationException * if the addItemAfter method is not supported. */ + @Override public Object addItemAfter(Object previousItemId) throws UnsupportedOperationException { throw new UnsupportedOperationException(); @@ -414,6 +429,7 @@ public class QueryContainer implements Container, Container.Ordered, * * @return ID of the first Item in the list. */ + @Override public Object firstItemId() { if (size < 1) { return null; @@ -427,6 +443,7 @@ public class QueryContainer implements Container, Container.Ordered, * @param id * ID of an Item in the Container. */ + @Override public boolean isFirstId(Object id) { return size > 0 && (id instanceof Integer) && ((Integer) id).intValue() == 1; @@ -439,6 +456,7 @@ public class QueryContainer implements Container, Container.Ordered, * ID of an Item in the Container * */ + @Override public boolean isLastId(Object id) { return size > 0 && (id instanceof Integer) && ((Integer) id).intValue() == size; @@ -449,6 +467,7 @@ public class QueryContainer implements Container, Container.Ordered, * * @return ID of the last Item. */ + @Override public Object lastItemId() { if (size < 1) { return null; @@ -463,6 +482,7 @@ public class QueryContainer implements Container, Container.Ordered, * ID of an Item in the Container. * @return ID of the next Item or null. */ + @Override public Object nextItemId(Object id) { if (size < 1 || !(id instanceof Integer)) { return null; @@ -481,6 +501,7 @@ public class QueryContainer implements Container, Container.Ordered, * ID of an Item in the Container. * @return ID of the previous Item or null. */ + @Override public Object prevItemId(Object id) { if (size < 1 || !(id instanceof Integer)) { return null; @@ -519,6 +540,7 @@ public class QueryContainer implements Container, Container.Ordered, * @throws UnsupportedOperationException * if the addItemProperty method is not supported. */ + @Override public boolean addItemProperty(Object id, Property property) throws UnsupportedOperationException { throw new UnsupportedOperationException(); @@ -532,6 +554,7 @@ public class QueryContainer implements Container, Container.Ordered, * identifier of the Property to get * @return the Property with the given ID or <code>null</code> */ + @Override public Property<?> getItemProperty(Object propertyId) { return getContainerProperty(id, propertyId); } @@ -542,6 +565,7 @@ public class QueryContainer implements Container, Container.Ordered, * @return unmodifiable collection containing IDs of the Properties * stored the Item. */ + @Override public Collection<String> getItemPropertyIds() { return propertyIds; } @@ -556,6 +580,7 @@ public class QueryContainer implements Container, Container.Ordered, * @throws UnsupportedOperationException * if the removeItemProperty is not supported. */ + @Override public boolean removeItemProperty(Object id) throws UnsupportedOperationException { throw new UnsupportedOperationException(); @@ -588,6 +613,7 @@ public class QueryContainer implements Container, Container.Ordered, * @throws UnsupportedOperationException * if the addItemAt is not supported. */ + @Override public Item addItemAt(int index, Object newItemId) throws UnsupportedOperationException { throw new UnsupportedOperationException(); @@ -605,6 +631,7 @@ public class QueryContainer implements Container, Container.Ordered, * if the addItemAt is not supported. */ + @Override public Object addItemAt(int index) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -616,6 +643,7 @@ public class QueryContainer implements Container, Container.Ordered, * Index Id. * @return ID in the given index. */ + @Override public Object getIdByIndex(int index) { if (size < 1 || index < 0 || index >= size) { return null; @@ -632,6 +660,7 @@ public class QueryContainer implements Container, Container.Ordered, * Item */ + @Override public int indexOfId(Object id) { if (size < 1 || !(id instanceof Integer)) { return -1; diff --git a/src/com/vaadin/data/util/TextFileProperty.java b/src/com/vaadin/data/util/TextFileProperty.java index 5ebba98062..598b721a9c 100644 --- a/src/com/vaadin/data/util/TextFileProperty.java +++ b/src/com/vaadin/data/util/TextFileProperty.java @@ -64,6 +64,7 @@ public class TextFileProperty extends AbstractProperty<String> { * * @see com.vaadin.data.Property#getType() */ + @Override public Class<String> getType() { return String.class; } @@ -73,6 +74,7 @@ public class TextFileProperty extends AbstractProperty<String> { * * @see com.vaadin.data.Property#getValue() */ + @Override public String getValue() { if (file == null) { return null; @@ -114,6 +116,7 @@ public class TextFileProperty extends AbstractProperty<String> { * * @see com.vaadin.data.Property#setValue(java.lang.Object) */ + @Override public void setValue(Object newValue) throws ReadOnlyException { if (isReadOnly()) { throw new ReadOnlyException(); diff --git a/src/com/vaadin/data/util/TransactionalPropertyWrapper.java b/src/com/vaadin/data/util/TransactionalPropertyWrapper.java index 06ec0935c3..d042bfaac2 100644 --- a/src/com/vaadin/data/util/TransactionalPropertyWrapper.java +++ b/src/com/vaadin/data/util/TransactionalPropertyWrapper.java @@ -44,6 +44,7 @@ public class TransactionalPropertyWrapper<T> extends AbstractProperty<T> ((ValueChangeNotifier) wrappedProperty) .addListener(new ValueChangeListener() { + @Override public void valueChange(ValueChangeEvent event) { fireValueChange(); } @@ -51,29 +52,35 @@ public class TransactionalPropertyWrapper<T> extends AbstractProperty<T> } } + @Override public Class getType() { return wrappedProperty.getType(); } + @Override public T getValue() { return wrappedProperty.getValue(); } + @Override public void setValue(Object newValue) throws ReadOnlyException { // Causes a value change to be sent to this listener which in turn fires // a new value change event for this property wrappedProperty.setValue(newValue); } + @Override public void startTransaction() { inTransaction = true; valueBeforeTransaction = getValue(); } + @Override public void commit() { endTransaction(); } + @Override public void rollback() { try { wrappedProperty.setValue(valueBeforeTransaction); diff --git a/src/com/vaadin/data/util/converter/DateToLongConverter.java b/src/com/vaadin/data/util/converter/DateToLongConverter.java index 537800f617..aeba38aa1f 100644 --- a/src/com/vaadin/data/util/converter/DateToLongConverter.java +++ b/src/com/vaadin/data/util/converter/DateToLongConverter.java @@ -24,6 +24,7 @@ public class DateToLongConverter implements Converter<Date, Long> { * com.vaadin.data.util.converter.Converter#convertToModel(java.lang.Object, * java.util.Locale) */ + @Override public Long convertToModel(Date value, Locale locale) { if (value == null) { return null; @@ -39,6 +40,7 @@ public class DateToLongConverter implements Converter<Date, Long> { * com.vaadin.data.util.converter.Converter#convertToPresentation(java.lang * .Object, java.util.Locale) */ + @Override public Date convertToPresentation(Long value, Locale locale) { if (value == null) { return null; @@ -52,6 +54,7 @@ public class DateToLongConverter implements Converter<Date, Long> { * * @see com.vaadin.data.util.converter.Converter#getModelType() */ + @Override public Class<Long> getModelType() { return Long.class; } @@ -61,6 +64,7 @@ public class DateToLongConverter implements Converter<Date, Long> { * * @see com.vaadin.data.util.converter.Converter#getPresentationType() */ + @Override public Class<Date> getPresentationType() { return Date.class; } diff --git a/src/com/vaadin/data/util/converter/DefaultConverterFactory.java b/src/com/vaadin/data/util/converter/DefaultConverterFactory.java index 3ad7b6a85b..afb95d81ed 100644 --- a/src/com/vaadin/data/util/converter/DefaultConverterFactory.java +++ b/src/com/vaadin/data/util/converter/DefaultConverterFactory.java @@ -27,6 +27,7 @@ public class DefaultConverterFactory implements ConverterFactory { private final static Logger log = Logger .getLogger(DefaultConverterFactory.class.getName()); + @Override public <PRESENTATION, MODEL> Converter<PRESENTATION, MODEL> createConverter( Class<PRESENTATION> presentationType, Class<MODEL> modelType) { Converter<PRESENTATION, MODEL> converter = findConverter( diff --git a/src/com/vaadin/data/util/converter/ReverseConverter.java b/src/com/vaadin/data/util/converter/ReverseConverter.java index 1c561f29e8..fa1bb5daf1 100644 --- a/src/com/vaadin/data/util/converter/ReverseConverter.java +++ b/src/com/vaadin/data/util/converter/ReverseConverter.java @@ -42,6 +42,7 @@ public class ReverseConverter<PRESENTATION, MODEL> implements * @see com.vaadin.data.util.converter.Converter#convertToModel(java * .lang.Object, java.util.Locale) */ + @Override public MODEL convertToModel(PRESENTATION value, Locale locale) throws com.vaadin.data.util.converter.Converter.ConversionException { return realConverter.convertToPresentation(value, locale); @@ -54,6 +55,7 @@ public class ReverseConverter<PRESENTATION, MODEL> implements * com.vaadin.data.util.converter.Converter#convertToPresentation(java.lang * .Object, java.util.Locale) */ + @Override public PRESENTATION convertToPresentation(MODEL value, Locale locale) throws com.vaadin.data.util.converter.Converter.ConversionException { return realConverter.convertToModel(value, locale); @@ -64,6 +66,7 @@ public class ReverseConverter<PRESENTATION, MODEL> implements * * @see com.vaadin.data.util.converter.Converter#getSourceType() */ + @Override public Class<MODEL> getModelType() { return realConverter.getPresentationType(); } @@ -73,6 +76,7 @@ public class ReverseConverter<PRESENTATION, MODEL> implements * * @see com.vaadin.data.util.converter.Converter#getTargetType() */ + @Override public Class<PRESENTATION> getPresentationType() { return realConverter.getModelType(); } diff --git a/src/com/vaadin/data/util/converter/StringToBooleanConverter.java b/src/com/vaadin/data/util/converter/StringToBooleanConverter.java index 96a3a3d071..999f575dc4 100644 --- a/src/com/vaadin/data/util/converter/StringToBooleanConverter.java +++ b/src/com/vaadin/data/util/converter/StringToBooleanConverter.java @@ -27,6 +27,7 @@ public class StringToBooleanConverter implements Converter<String, Boolean> { * com.vaadin.data.util.converter.Converter#convertToModel(java.lang.Object, * java.util.Locale) */ + @Override public Boolean convertToModel(String value, Locale locale) throws ConversionException { if (value == null) { @@ -71,6 +72,7 @@ public class StringToBooleanConverter implements Converter<String, Boolean> { * com.vaadin.data.util.converter.Converter#convertToPresentation(java.lang * .Object, java.util.Locale) */ + @Override public String convertToPresentation(Boolean value, Locale locale) throws ConversionException { if (value == null) { @@ -88,6 +90,7 @@ public class StringToBooleanConverter implements Converter<String, Boolean> { * * @see com.vaadin.data.util.converter.Converter#getModelType() */ + @Override public Class<Boolean> getModelType() { return Boolean.class; } @@ -97,6 +100,7 @@ public class StringToBooleanConverter implements Converter<String, Boolean> { * * @see com.vaadin.data.util.converter.Converter#getPresentationType() */ + @Override public Class<String> getPresentationType() { return String.class; } diff --git a/src/com/vaadin/data/util/converter/StringToDateConverter.java b/src/com/vaadin/data/util/converter/StringToDateConverter.java index 6f3c2e47f6..487b02b2aa 100644 --- a/src/com/vaadin/data/util/converter/StringToDateConverter.java +++ b/src/com/vaadin/data/util/converter/StringToDateConverter.java @@ -52,6 +52,7 @@ public class StringToDateConverter implements Converter<String, Date> { * com.vaadin.data.util.converter.Converter#convertToModel(java.lang.Object, * java.util.Locale) */ + @Override public Date convertToModel(String value, Locale locale) throws com.vaadin.data.util.converter.Converter.ConversionException { if (value == null) { @@ -78,6 +79,7 @@ public class StringToDateConverter implements Converter<String, Date> { * com.vaadin.data.util.converter.Converter#convertToPresentation(java.lang * .Object, java.util.Locale) */ + @Override public String convertToPresentation(Date value, Locale locale) throws com.vaadin.data.util.converter.Converter.ConversionException { if (value == null) { @@ -92,6 +94,7 @@ public class StringToDateConverter implements Converter<String, Date> { * * @see com.vaadin.data.util.converter.Converter#getModelType() */ + @Override public Class<Date> getModelType() { return Date.class; } @@ -101,6 +104,7 @@ public class StringToDateConverter implements Converter<String, Date> { * * @see com.vaadin.data.util.converter.Converter#getPresentationType() */ + @Override public Class<String> getPresentationType() { return String.class; } diff --git a/src/com/vaadin/data/util/converter/StringToDoubleConverter.java b/src/com/vaadin/data/util/converter/StringToDoubleConverter.java index 60a38f4127..251f91855b 100644 --- a/src/com/vaadin/data/util/converter/StringToDoubleConverter.java +++ b/src/com/vaadin/data/util/converter/StringToDoubleConverter.java @@ -49,6 +49,7 @@ public class StringToDoubleConverter implements Converter<String, Double> { * com.vaadin.data.util.converter.Converter#convertToModel(java.lang.Object, * java.util.Locale) */ + @Override public Double convertToModel(String value, Locale locale) throws ConversionException { if (value == null) { @@ -74,6 +75,7 @@ public class StringToDoubleConverter implements Converter<String, Double> { * com.vaadin.data.util.converter.Converter#convertToPresentation(java.lang * .Object, java.util.Locale) */ + @Override public String convertToPresentation(Double value, Locale locale) throws ConversionException { if (value == null) { @@ -88,6 +90,7 @@ public class StringToDoubleConverter implements Converter<String, Double> { * * @see com.vaadin.data.util.converter.Converter#getModelType() */ + @Override public Class<Double> getModelType() { return Double.class; } @@ -97,6 +100,7 @@ public class StringToDoubleConverter implements Converter<String, Double> { * * @see com.vaadin.data.util.converter.Converter#getPresentationType() */ + @Override public Class<String> getPresentationType() { return String.class; } diff --git a/src/com/vaadin/data/util/converter/StringToIntegerConverter.java b/src/com/vaadin/data/util/converter/StringToIntegerConverter.java index e55feec3b6..950f01c6ab 100644 --- a/src/com/vaadin/data/util/converter/StringToIntegerConverter.java +++ b/src/com/vaadin/data/util/converter/StringToIntegerConverter.java @@ -39,6 +39,7 @@ public class StringToIntegerConverter implements Converter<String, Integer> { return NumberFormat.getIntegerInstance(locale); } + @Override public Integer convertToModel(String value, Locale locale) throws ConversionException { if (value == null) { @@ -64,6 +65,7 @@ public class StringToIntegerConverter implements Converter<String, Integer> { return parsedValue.intValue(); } + @Override public String convertToPresentation(Integer value, Locale locale) throws ConversionException { if (value == null) { @@ -73,10 +75,12 @@ public class StringToIntegerConverter implements Converter<String, Integer> { return getFormat(locale).format(value); } + @Override public Class<Integer> getModelType() { return Integer.class; } + @Override public Class<String> getPresentationType() { return String.class; } diff --git a/src/com/vaadin/data/util/converter/StringToNumberConverter.java b/src/com/vaadin/data/util/converter/StringToNumberConverter.java index d1816007e7..42699a326a 100644 --- a/src/com/vaadin/data/util/converter/StringToNumberConverter.java +++ b/src/com/vaadin/data/util/converter/StringToNumberConverter.java @@ -45,6 +45,7 @@ public class StringToNumberConverter implements Converter<String, Number> { * com.vaadin.data.util.converter.Converter#convertToModel(java.lang.Object, * java.util.Locale) */ + @Override public Number convertToModel(String value, Locale locale) throws ConversionException { if (value == null) { @@ -77,6 +78,7 @@ public class StringToNumberConverter implements Converter<String, Number> { * com.vaadin.data.util.converter.Converter#convertToPresentation(java.lang * .Object, java.util.Locale) */ + @Override public String convertToPresentation(Number value, Locale locale) throws ConversionException { if (value == null) { @@ -91,6 +93,7 @@ public class StringToNumberConverter implements Converter<String, Number> { * * @see com.vaadin.data.util.converter.Converter#getModelType() */ + @Override public Class<Number> getModelType() { return Number.class; } @@ -100,6 +103,7 @@ public class StringToNumberConverter implements Converter<String, Number> { * * @see com.vaadin.data.util.converter.Converter#getPresentationType() */ + @Override public Class<String> getPresentationType() { return String.class; } diff --git a/src/com/vaadin/data/util/filter/AbstractJunctionFilter.java b/src/com/vaadin/data/util/filter/AbstractJunctionFilter.java index 0f20e28586..482b10120c 100644 --- a/src/com/vaadin/data/util/filter/AbstractJunctionFilter.java +++ b/src/com/vaadin/data/util/filter/AbstractJunctionFilter.java @@ -45,6 +45,7 @@ public abstract class AbstractJunctionFilter implements Filter { * If there are no sub-filters, false is returned - override in subclasses * to change this behavior. */ + @Override public boolean appliesToProperty(Object propertyId) { for (Filter filter : getFilters()) { if (filter.appliesToProperty(propertyId)) { diff --git a/src/com/vaadin/data/util/filter/And.java b/src/com/vaadin/data/util/filter/And.java index 08182794a8..ca6c35aba7 100644 --- a/src/com/vaadin/data/util/filter/And.java +++ b/src/com/vaadin/data/util/filter/And.java @@ -30,6 +30,7 @@ public final class And extends AbstractJunctionFilter { super(filters); } + @Override public boolean passesFilter(Object itemId, Item item) throws UnsupportedFilterException { for (Filter filter : getFilters()) { diff --git a/src/com/vaadin/data/util/filter/Between.java b/src/com/vaadin/data/util/filter/Between.java index dd47d36c7f..b00a74d13d 100644 --- a/src/com/vaadin/data/util/filter/Between.java +++ b/src/com/vaadin/data/util/filter/Between.java @@ -30,6 +30,7 @@ public class Between implements Filter { return endValue; } + @Override public boolean passesFilter(Object itemId, Item item) throws UnsupportedOperationException { Object value = item.getItemProperty(getPropertyId()).getValue(); @@ -41,6 +42,7 @@ public class Between implements Filter { return false; } + @Override public boolean appliesToProperty(Object propertyId) { return getPropertyId() != null && getPropertyId().equals(propertyId); } diff --git a/src/com/vaadin/data/util/filter/Compare.java b/src/com/vaadin/data/util/filter/Compare.java index 111d95f055..4091f5b922 100644 --- a/src/com/vaadin/data/util/filter/Compare.java +++ b/src/com/vaadin/data/util/filter/Compare.java @@ -227,6 +227,7 @@ public abstract class Compare implements Filter { this.operation = operation; } + @Override public boolean passesFilter(Object itemId, Item item) { final Property<?> p = item.getItemProperty(getPropertyId()); if (null == p) { @@ -264,6 +265,7 @@ public abstract class Compare implements Filter { + value1 + ", " + getValue()); } + @Override public boolean appliesToProperty(Object propertyId) { return getPropertyId().equals(propertyId); } diff --git a/src/com/vaadin/data/util/filter/IsNull.java b/src/com/vaadin/data/util/filter/IsNull.java index aad71a7c80..3faf4153ee 100644 --- a/src/com/vaadin/data/util/filter/IsNull.java +++ b/src/com/vaadin/data/util/filter/IsNull.java @@ -33,6 +33,7 @@ public final class IsNull implements Filter { this.propertyId = propertyId; } + @Override public boolean passesFilter(Object itemId, Item item) throws UnsupportedOperationException { final Property<?> p = item.getItemProperty(getPropertyId()); @@ -42,6 +43,7 @@ public final class IsNull implements Filter { return null == p.getValue(); } + @Override public boolean appliesToProperty(Object propertyId) { return getPropertyId().equals(propertyId); } diff --git a/src/com/vaadin/data/util/filter/Like.java b/src/com/vaadin/data/util/filter/Like.java index 723623bb69..3dcc48e809 100644 --- a/src/com/vaadin/data/util/filter/Like.java +++ b/src/com/vaadin/data/util/filter/Like.java @@ -37,6 +37,7 @@ public class Like implements Filter { return caseSensitive; } + @Override public boolean passesFilter(Object itemId, Item item) throws UnsupportedOperationException { if (!item.getItemProperty(getPropertyId()).getType() @@ -54,6 +55,7 @@ public class Like implements Filter { return colValue.toUpperCase().matches(pattern.toUpperCase()); } + @Override public boolean appliesToProperty(Object propertyId) { return getPropertyId() != null && getPropertyId().equals(propertyId); } diff --git a/src/com/vaadin/data/util/filter/Not.java b/src/com/vaadin/data/util/filter/Not.java index 1731dcc2b5..bbfc9ca86a 100644 --- a/src/com/vaadin/data/util/filter/Not.java +++ b/src/com/vaadin/data/util/filter/Not.java @@ -36,6 +36,7 @@ public final class Not implements Filter { return filter; } + @Override public boolean passesFilter(Object itemId, Item item) throws UnsupportedOperationException { return !filter.passesFilter(itemId, item); @@ -48,6 +49,7 @@ public final class Not implements Filter { * * @return boolean */ + @Override public boolean appliesToProperty(Object propertyId) { return filter.appliesToProperty(propertyId); } diff --git a/src/com/vaadin/data/util/filter/Or.java b/src/com/vaadin/data/util/filter/Or.java index 194afbc7da..b60074f7e3 100644 --- a/src/com/vaadin/data/util/filter/Or.java +++ b/src/com/vaadin/data/util/filter/Or.java @@ -30,6 +30,7 @@ public final class Or extends AbstractJunctionFilter { super(filters); } + @Override public boolean passesFilter(Object itemId, Item item) throws UnsupportedFilterException { for (Filter filter : getFilters()) { diff --git a/src/com/vaadin/data/util/filter/SimpleStringFilter.java b/src/com/vaadin/data/util/filter/SimpleStringFilter.java index 6203251045..f98b2c02b4 100644 --- a/src/com/vaadin/data/util/filter/SimpleStringFilter.java +++ b/src/com/vaadin/data/util/filter/SimpleStringFilter.java @@ -39,6 +39,7 @@ public final class SimpleStringFilter implements Filter { this.onlyMatchPrefix = onlyMatchPrefix; } + @Override public boolean passesFilter(Object itemId, Item item) { final Property<?> p = item.getItemProperty(propertyId); if (p == null) { @@ -62,6 +63,7 @@ public final class SimpleStringFilter implements Filter { return true; } + @Override public boolean appliesToProperty(Object propertyId) { return this.propertyId.equals(propertyId); } diff --git a/src/com/vaadin/data/util/sqlcontainer/ColumnProperty.java b/src/com/vaadin/data/util/sqlcontainer/ColumnProperty.java index d84a164bfa..168bce1880 100644 --- a/src/com/vaadin/data/util/sqlcontainer/ColumnProperty.java +++ b/src/com/vaadin/data/util/sqlcontainer/ColumnProperty.java @@ -61,6 +61,7 @@ final public class ColumnProperty implements Property { this.readOnly = readOnly; } + @Override public Object getValue() { if (isModified()) { return changedValue; @@ -68,6 +69,7 @@ final public class ColumnProperty implements Property { return value; } + @Override public void setValue(Object newValue) throws ReadOnlyException { if (newValue == null && !nullable) { throw new NotNullableException( @@ -134,10 +136,12 @@ final public class ColumnProperty implements Property { || newValue.equals(referenceValue); } + @Override public Class<?> getType() { return type; } + @Override public boolean isReadOnly() { return readOnly; } @@ -146,6 +150,7 @@ final public class ColumnProperty implements Property { return allowReadOnlyChange; } + @Override public void setReadOnly(boolean newStatus) { if (allowReadOnlyChange) { readOnly = newStatus; diff --git a/src/com/vaadin/data/util/sqlcontainer/RowItem.java b/src/com/vaadin/data/util/sqlcontainer/RowItem.java index adededb65c..d613a06b63 100644 --- a/src/com/vaadin/data/util/sqlcontainer/RowItem.java +++ b/src/com/vaadin/data/util/sqlcontainer/RowItem.java @@ -48,6 +48,7 @@ public final class RowItem implements Item { this.id = id; } + @Override public Property<?> getItemProperty(Object id) { if (id instanceof String && id != null) { for (ColumnProperty cp : properties) { @@ -59,6 +60,7 @@ public final class RowItem implements Item { return null; } + @Override public Collection<?> getItemPropertyIds() { Collection<String> ids = new ArrayList<String>(properties.size()); for (ColumnProperty cp : properties) { @@ -71,6 +73,7 @@ public final class RowItem implements Item { * Adding properties is not supported. Properties are generated by * SQLContainer. */ + @Override public boolean addItemProperty(Object id, Property property) throws UnsupportedOperationException { throw new UnsupportedOperationException(); @@ -80,6 +83,7 @@ public final class RowItem implements Item { * Removing properties is not supported. Properties are generated by * SQLContainer. */ + @Override public boolean removeItemProperty(Object id) throws UnsupportedOperationException { throw new UnsupportedOperationException(); diff --git a/src/com/vaadin/data/util/sqlcontainer/SQLContainer.java b/src/com/vaadin/data/util/sqlcontainer/SQLContainer.java index e9b5b4fea3..5827390723 100644 --- a/src/com/vaadin/data/util/sqlcontainer/SQLContainer.java +++ b/src/com/vaadin/data/util/sqlcontainer/SQLContainer.java @@ -130,6 +130,7 @@ public class SQLContainer implements Container, Container.Filterable, * {@inheritDoc} */ + @Override public Object addItem() throws UnsupportedOperationException { Object emptyKey[] = new Object[delegate.getPrimaryKeyColumns().size()]; RowId itemId = new TemporaryRowId(emptyKey); @@ -186,6 +187,7 @@ public class SQLContainer implements Container, Container.Filterable, * @see com.vaadin.data.Container#containsId(java.lang.Object) */ + @Override public boolean containsId(Object itemId) { if (itemId == null) { return false; @@ -227,6 +229,7 @@ public class SQLContainer implements Container, Container.Filterable, * java.lang.Object) */ + @Override public Property<?> getContainerProperty(Object itemId, Object propertyId) { Item item = getItem(itemId); if (item == null) { @@ -241,6 +244,7 @@ public class SQLContainer implements Container, Container.Filterable, * @see com.vaadin.data.Container#getContainerPropertyIds() */ + @Override public Collection<?> getContainerPropertyIds() { return Collections.unmodifiableCollection(propertyIds); } @@ -251,6 +255,7 @@ public class SQLContainer implements Container, Container.Filterable, * @see com.vaadin.data.Container#getItem(java.lang.Object) */ + @Override public Item getItem(Object itemId) { if (!cachedItems.containsKey(itemId)) { int index = indexOfId(itemId); @@ -298,6 +303,7 @@ public class SQLContainer implements Container, Container.Filterable, * {@inheritDoc} */ + @Override public Collection<?> getItemIds() { updateCount(); ArrayList<RowId> ids = new ArrayList<RowId>(); @@ -355,6 +361,7 @@ public class SQLContainer implements Container, Container.Filterable, * @see com.vaadin.data.Container#getType(java.lang.Object) */ + @Override public Class<?> getType(Object propertyId) { if (!propertyIds.contains(propertyId)) { return null; @@ -368,6 +375,7 @@ public class SQLContainer implements Container, Container.Filterable, * @see com.vaadin.data.Container#size() */ + @Override public int size() { updateCount(); return size + sizeOfAddedItems() - removedItems.size(); @@ -379,6 +387,7 @@ public class SQLContainer implements Container, Container.Filterable, * @see com.vaadin.data.Container#removeItem(java.lang.Object) */ + @Override public boolean removeItem(Object itemId) throws UnsupportedOperationException { if (!containsId(itemId)) { @@ -447,6 +456,7 @@ public class SQLContainer implements Container, Container.Filterable, * @see com.vaadin.data.Container#removeAllItems() */ + @Override public boolean removeAllItems() throws UnsupportedOperationException { if (autoCommit) { /* Remove and commit instantly. */ @@ -508,6 +518,7 @@ public class SQLContainer implements Container, Container.Filterable, * {@inheritDoc} */ + @Override public void addContainerFilter(Filter filter) throws UnsupportedFilterException { // filter.setCaseSensitive(!ignoreCase); @@ -520,8 +531,10 @@ public class SQLContainer implements Container, Container.Filterable, * {@inheritDoc} */ + @Override public void removeContainerFilter(Filter filter) { filters.remove(filter); + refresh(); } /** @@ -560,6 +573,7 @@ public class SQLContainer implements Container, Container.Filterable, * {@inheritDoc} */ + @Override public void removeAllContainerFilters() { filters.clear(); refresh(); @@ -575,6 +589,7 @@ public class SQLContainer implements Container, Container.Filterable, * @see com.vaadin.data.Container.Indexed#indexOfId(java.lang.Object) */ + @Override public int indexOfId(Object itemId) { // First check if the id is in the added items for (int ix = 0; ix < addedItems.size(); ix++) { @@ -622,6 +637,7 @@ public class SQLContainer implements Container, Container.Filterable, * @see com.vaadin.data.Container.Indexed#getIdByIndex(int) */ + @Override public Object getIdByIndex(int index) { if (index < 0 || index > size() - 1) { return null; @@ -649,6 +665,7 @@ public class SQLContainer implements Container, Container.Filterable, * @see com.vaadin.data.Container.Ordered#nextItemId(java.lang.Object) */ + @Override public Object nextItemId(Object itemId) { return getIdByIndex(indexOfId(itemId) + 1); } @@ -659,6 +676,7 @@ public class SQLContainer implements Container, Container.Filterable, * @see com.vaadin.data.Container.Ordered#prevItemId(java.lang.Object) */ + @Override public Object prevItemId(Object itemId) { return getIdByIndex(indexOfId(itemId) - 1); } @@ -669,6 +687,7 @@ public class SQLContainer implements Container, Container.Filterable, * @see com.vaadin.data.Container.Ordered#firstItemId() */ + @Override public Object firstItemId() { updateCount(); if (size == 0) { @@ -697,6 +716,7 @@ public class SQLContainer implements Container, Container.Filterable, * @see com.vaadin.data.Container.Ordered#lastItemId() */ + @Override public Object lastItemId() { if (addedItems.isEmpty()) { int lastIx = size() - 1; @@ -723,6 +743,7 @@ public class SQLContainer implements Container, Container.Filterable, * @see com.vaadin.data.Container.Ordered#isFirstId(java.lang.Object) */ + @Override public boolean isFirstId(Object itemId) { return firstItemId().equals(itemId); } @@ -733,6 +754,7 @@ public class SQLContainer implements Container, Container.Filterable, * @see com.vaadin.data.Container.Ordered#isLastId(java.lang.Object) */ + @Override public boolean isLastId(Object itemId) { return lastItemId().equals(itemId); } @@ -748,6 +770,7 @@ public class SQLContainer implements Container, Container.Filterable, * boolean[]) */ + @Override public void sort(Object[] propertyId, boolean[] ascending) { sorters.clear(); if (propertyId == null || propertyId.length == 0) { @@ -777,6 +800,7 @@ public class SQLContainer implements Container, Container.Filterable, * @see com.vaadin.data.Container.Sortable#getSortableContainerPropertyIds() */ + @Override public Collection<?> getSortableContainerPropertyIds() { return getContainerPropertyIds(); } @@ -1351,6 +1375,7 @@ public class SQLContainer implements Container, Container.Filterable, * java.lang.Class, java.lang.Object) */ + @Override public boolean addContainerProperty(Object propertyId, Class<?> type, Object defaultValue) throws UnsupportedOperationException { throw new UnsupportedOperationException(); @@ -1362,6 +1387,7 @@ public class SQLContainer implements Container, Container.Filterable, * @see com.vaadin.data.Container#removeContainerProperty(java.lang.Object) */ + @Override public boolean removeContainerProperty(Object propertyId) throws UnsupportedOperationException { throw new UnsupportedOperationException(); @@ -1373,6 +1399,7 @@ public class SQLContainer implements Container, Container.Filterable, * @see com.vaadin.data.Container#addItem(java.lang.Object) */ + @Override public Item addItem(Object itemId) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -1384,6 +1411,7 @@ public class SQLContainer implements Container, Container.Filterable, * java.lang.Object) */ + @Override public Item addItemAfter(Object previousItemId, Object newItemId) throws UnsupportedOperationException { throw new UnsupportedOperationException(); @@ -1395,6 +1423,7 @@ public class SQLContainer implements Container, Container.Filterable, * @see com.vaadin.data.Container.Indexed#addItemAt(int, java.lang.Object) */ + @Override public Item addItemAt(int index, Object newItemId) throws UnsupportedOperationException { throw new UnsupportedOperationException(); @@ -1406,6 +1435,7 @@ public class SQLContainer implements Container, Container.Filterable, * @see com.vaadin.data.Container.Indexed#addItemAt(int) */ + @Override public Object addItemAt(int index) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -1416,6 +1446,7 @@ public class SQLContainer implements Container, Container.Filterable, * @see com.vaadin.data.Container.Ordered#addItemAfter(java.lang.Object) */ + @Override public Object addItemAfter(Object previousItemId) throws UnsupportedOperationException { throw new UnsupportedOperationException(); @@ -1433,6 +1464,7 @@ public class SQLContainer implements Container, Container.Filterable, * .data.Container.ItemSetChangeListener) */ + @Override public void addListener(Container.ItemSetChangeListener listener) { if (itemSetChangeListeners == null) { itemSetChangeListeners = new LinkedList<Container.ItemSetChangeListener>(); @@ -1448,6 +1480,7 @@ public class SQLContainer implements Container, Container.Filterable, * .data.Container.ItemSetChangeListener) */ + @Override public void removeListener(Container.ItemSetChangeListener listener) { if (itemSetChangeListeners != null) { itemSetChangeListeners.remove(listener); @@ -1477,6 +1510,7 @@ public class SQLContainer implements Container, Container.Filterable, super(source); } + @Override public Container getContainer() { return (Container) getSource(); } diff --git a/src/com/vaadin/data/util/sqlcontainer/connection/J2EEConnectionPool.java b/src/com/vaadin/data/util/sqlcontainer/connection/J2EEConnectionPool.java index 40d0d0426f..9aa4f7c4be 100644 --- a/src/com/vaadin/data/util/sqlcontainer/connection/J2EEConnectionPool.java +++ b/src/com/vaadin/data/util/sqlcontainer/connection/J2EEConnectionPool.java @@ -26,6 +26,7 @@ public class J2EEConnectionPool implements JDBCConnectionPool { this.dataSourceJndiName = dataSourceJndiName; } + @Override public Connection reserveConnection() throws SQLException { Connection conn = getDataSource().getConnection(); conn.setAutoCommit(false); @@ -51,6 +52,7 @@ public class J2EEConnectionPool implements JDBCConnectionPool { } } + @Override public void releaseConnection(Connection conn) { if (conn != null) { try { @@ -62,6 +64,7 @@ public class J2EEConnectionPool implements JDBCConnectionPool { } } + @Override public void destroy() { dataSource = null; } diff --git a/src/com/vaadin/data/util/sqlcontainer/connection/SimpleJDBCConnectionPool.java b/src/com/vaadin/data/util/sqlcontainer/connection/SimpleJDBCConnectionPool.java index 2a1068e786..21760014b9 100644 --- a/src/com/vaadin/data/util/sqlcontainer/connection/SimpleJDBCConnectionPool.java +++ b/src/com/vaadin/data/util/sqlcontainer/connection/SimpleJDBCConnectionPool.java @@ -81,6 +81,7 @@ public class SimpleJDBCConnectionPool implements JDBCConnectionPool { initialized = true; } + @Override public synchronized Connection reserveConnection() throws SQLException { if (!initialized) { initializeConnections(); @@ -100,6 +101,7 @@ public class SimpleJDBCConnectionPool implements JDBCConnectionPool { return c; } + @Override public synchronized void releaseConnection(Connection conn) { if (conn == null || !initialized) { return; @@ -139,6 +141,7 @@ public class SimpleJDBCConnectionPool implements JDBCConnectionPool { return c; } + @Override public void destroy() { for (Connection c : availableConnections) { try { diff --git a/src/com/vaadin/data/util/sqlcontainer/query/FreeformQuery.java b/src/com/vaadin/data/util/sqlcontainer/query/FreeformQuery.java index 56a8455a16..ec986fab95 100644 --- a/src/com/vaadin/data/util/sqlcontainer/query/FreeformQuery.java +++ b/src/com/vaadin/data/util/sqlcontainer/query/FreeformQuery.java @@ -99,6 +99,7 @@ public class FreeformQuery implements QueryDelegate { * * {@inheritDoc} */ + @Override public int getCount() throws SQLException { // First try the delegate int count = countByDelegate(); @@ -187,6 +188,7 @@ public class FreeformQuery implements QueryDelegate { * * @see FreeformQueryDelegate#getQueryString(int, int) */ + @Override @SuppressWarnings("deprecation") public ResultSet getResults(int offset, int pagelength) throws SQLException { if (activeConnection == null) { @@ -218,6 +220,7 @@ public class FreeformQuery implements QueryDelegate { return rs; } + @Override @SuppressWarnings("deprecation") public boolean implementationRespectsPagingLimits() { if (delegate == null) { @@ -251,6 +254,7 @@ public class FreeformQuery implements QueryDelegate { * com.vaadin.data.util.sqlcontainer.query.QueryDelegate#setFilters(java * .util.List) */ + @Override public void setFilters(List<Filter> filters) throws UnsupportedOperationException { if (delegate != null) { @@ -268,6 +272,7 @@ public class FreeformQuery implements QueryDelegate { * com.vaadin.data.util.sqlcontainer.query.QueryDelegate#setOrderBy(java * .util.List) */ + @Override public void setOrderBy(List<OrderBy> orderBys) throws UnsupportedOperationException { if (delegate != null) { @@ -285,6 +290,7 @@ public class FreeformQuery implements QueryDelegate { * com.vaadin.data.util.sqlcontainer.query.QueryDelegate#storeRow(com.vaadin * .data.util.sqlcontainer.RowItem) */ + @Override public int storeRow(RowItem row) throws SQLException { if (activeConnection == null) { throw new IllegalStateException("No transaction is active!"); @@ -307,6 +313,7 @@ public class FreeformQuery implements QueryDelegate { * com.vaadin.data.util.sqlcontainer.query.QueryDelegate#removeRow(com.vaadin * .data.util.sqlcontainer.RowItem) */ + @Override public boolean removeRow(RowItem row) throws SQLException { if (activeConnection == null) { throw new IllegalStateException("No transaction is active!"); @@ -328,6 +335,7 @@ public class FreeformQuery implements QueryDelegate { * @see * com.vaadin.data.util.sqlcontainer.query.QueryDelegate#beginTransaction() */ + @Override public synchronized void beginTransaction() throws UnsupportedOperationException, SQLException { if (activeConnection != null) { @@ -342,6 +350,7 @@ public class FreeformQuery implements QueryDelegate { * * @see com.vaadin.data.util.sqlcontainer.query.QueryDelegate#commit() */ + @Override public synchronized void commit() throws UnsupportedOperationException, SQLException { if (activeConnection == null) { @@ -359,6 +368,7 @@ public class FreeformQuery implements QueryDelegate { * * @see com.vaadin.data.util.sqlcontainer.query.QueryDelegate#rollback() */ + @Override public synchronized void rollback() throws UnsupportedOperationException, SQLException { if (activeConnection == null) { @@ -376,6 +386,7 @@ public class FreeformQuery implements QueryDelegate { * com.vaadin.data.util.sqlcontainer.query.QueryDelegate#getPrimaryKeyColumns * () */ + @Override public List<String> getPrimaryKeyColumns() { return primaryKeyColumns; } @@ -403,6 +414,7 @@ public class FreeformQuery implements QueryDelegate { * @see FreeformQueryDelegate#getContainsRowQueryString(Object...) * */ + @Override @SuppressWarnings("deprecation") public boolean containsRowWithKey(Object... keys) throws SQLException { String query = null; diff --git a/src/com/vaadin/data/util/sqlcontainer/query/TableQuery.java b/src/com/vaadin/data/util/sqlcontainer/query/TableQuery.java index 22ca30cc32..d0606704f7 100644 --- a/src/com/vaadin/data/util/sqlcontainer/query/TableQuery.java +++ b/src/com/vaadin/data/util/sqlcontainer/query/TableQuery.java @@ -111,6 +111,7 @@ public class TableQuery implements QueryDelegate, * * @see com.vaadin.addon.sqlcontainer.query.QueryDelegate#getCount() */ + @Override public int getCount() throws SQLException { getLogger().log(Level.FINE, "Fetching count..."); StatementHelper sh = sqlGenerator.generateSelectQuery(tableName, @@ -137,6 +138,7 @@ public class TableQuery implements QueryDelegate, * @see com.vaadin.addon.sqlcontainer.query.QueryDelegate#getResults(int, * int) */ + @Override public ResultSet getResults(int offset, int pagelength) throws SQLException { StatementHelper sh; /* @@ -161,6 +163,7 @@ public class TableQuery implements QueryDelegate, * @see com.vaadin.addon.sqlcontainer.query.QueryDelegate# * implementationRespectsPagingLimits() */ + @Override public boolean implementationRespectsPagingLimits() { return true; } @@ -172,6 +175,7 @@ public class TableQuery implements QueryDelegate, * com.vaadin.addon.sqlcontainer.query.QueryDelegate#storeRow(com.vaadin * .addon.sqlcontainer.RowItem) */ + @Override public int storeRow(RowItem row) throws UnsupportedOperationException, SQLException { if (row == null) { @@ -254,6 +258,7 @@ public class TableQuery implements QueryDelegate, * com.vaadin.addon.sqlcontainer.query.QueryDelegate#setFilters(java.util * .List) */ + @Override public void setFilters(List<Filter> filters) throws UnsupportedOperationException { if (filters == null) { @@ -270,6 +275,7 @@ public class TableQuery implements QueryDelegate, * com.vaadin.addon.sqlcontainer.query.QueryDelegate#setOrderBy(java.util * .List) */ + @Override public void setOrderBy(List<OrderBy> orderBys) throws UnsupportedOperationException { if (orderBys == null) { @@ -284,6 +290,7 @@ public class TableQuery implements QueryDelegate, * * @see com.vaadin.addon.sqlcontainer.query.QueryDelegate#beginTransaction() */ + @Override public void beginTransaction() throws UnsupportedOperationException, SQLException { if (transactionOpen && activeConnection != null) { @@ -301,6 +308,7 @@ public class TableQuery implements QueryDelegate, * * @see com.vaadin.addon.sqlcontainer.query.QueryDelegate#commit() */ + @Override public void commit() throws UnsupportedOperationException, SQLException { if (transactionOpen && activeConnection != null) { getLogger().log(Level.FINE, "DB -> commit"); @@ -329,6 +337,7 @@ public class TableQuery implements QueryDelegate, * * @see com.vaadin.addon.sqlcontainer.query.QueryDelegate#rollback() */ + @Override public void rollback() throws UnsupportedOperationException, SQLException { if (transactionOpen && activeConnection != null) { getLogger().log(Level.FINE, "DB -> rollback"); @@ -346,6 +355,7 @@ public class TableQuery implements QueryDelegate, * @see * com.vaadin.addon.sqlcontainer.query.QueryDelegate#getPrimaryKeyColumns() */ + @Override public List<String> getPrimaryKeyColumns() { return Collections.unmodifiableList(primaryKeyColumns); } @@ -581,6 +591,7 @@ public class TableQuery implements QueryDelegate, * com.vaadin.addon.sqlcontainer.query.QueryDelegate#removeRow(com.vaadin * .addon.sqlcontainer.RowItem) */ + @Override public boolean removeRow(RowItem row) throws UnsupportedOperationException, SQLException { getLogger().log(Level.FINE, @@ -604,6 +615,7 @@ public class TableQuery implements QueryDelegate, * com.vaadin.addon.sqlcontainer.query.QueryDelegate#containsRowWithKey( * java.lang.Object[]) */ + @Override public boolean containsRowWithKey(Object... keys) throws SQLException { ArrayList<Filter> filtersAndKeys = new ArrayList<Filter>(); if (filters != null) { @@ -665,10 +677,12 @@ public class TableQuery implements QueryDelegate, this.newId = newId; } + @Override public RowId getNewRowId() { return newId; } + @Override public RowId getOldRowId() { return oldId; } @@ -677,6 +691,7 @@ public class TableQuery implements QueryDelegate, /** * Adds RowIdChangeListener to this query */ + @Override public void addListener(RowIdChangeListener listener) { if (rowIdChangeListeners == null) { rowIdChangeListeners = new LinkedList<QueryDelegate.RowIdChangeListener>(); @@ -687,6 +702,7 @@ public class TableQuery implements QueryDelegate, /** * Removes the given RowIdChangeListener from this query */ + @Override public void removeListener(RowIdChangeListener listener) { if (rowIdChangeListeners != null) { rowIdChangeListeners.remove(listener); diff --git a/src/com/vaadin/data/util/sqlcontainer/query/generator/DefaultSQLGenerator.java b/src/com/vaadin/data/util/sqlcontainer/query/generator/DefaultSQLGenerator.java index 24d283c9ab..6485330541 100644 --- a/src/com/vaadin/data/util/sqlcontainer/query/generator/DefaultSQLGenerator.java +++ b/src/com/vaadin/data/util/sqlcontainer/query/generator/DefaultSQLGenerator.java @@ -24,11 +24,25 @@ import com.vaadin.data.util.sqlcontainer.query.generator.filter.StringDecorator; @SuppressWarnings("serial") public class DefaultSQLGenerator implements SQLGenerator { + private Class<? extends StatementHelper> statementHelperClass = null; + public DefaultSQLGenerator() { } /** + * Create a new DefaultSqlGenerator instance that uses the given + * implementation of {@link StatementHelper} + * + * @param statementHelper + */ + public DefaultSQLGenerator( + Class<? extends StatementHelper> statementHelperClazz) { + this(); + statementHelperClass = statementHelperClazz; + } + + /** * Construct a DefaultSQLGenerator with the specified identifiers for start * and end of quoted strings. The identifiers may be different depending on * the database engine and it's settings. @@ -44,6 +58,20 @@ public class DefaultSQLGenerator implements SQLGenerator { quoteEnd)); } + /** + * Same as {@link #DefaultSQLGenerator(String, String)} but with support for + * custom {@link StatementHelper} implementation. + * + * @param quoteStart + * @param quoteEnd + * @param statementHelperClazz + */ + public DefaultSQLGenerator(String quoteStart, String quoteEnd, + Class<? extends StatementHelper> statementHelperClazz) { + this(quoteStart, quoteEnd); + statementHelperClass = statementHelperClazz; + } + /* * (non-Javadoc) * @@ -51,6 +79,7 @@ public class DefaultSQLGenerator implements SQLGenerator { * generateSelectQuery(java.lang.String, java.util.List, java.util.List, * int, int, java.lang.String) */ + @Override public StatementHelper generateSelectQuery(String tableName, List<Filter> filters, List<OrderBy> orderBys, int offset, int pagelength, String toSelect) { @@ -58,7 +87,7 @@ public class DefaultSQLGenerator implements SQLGenerator { throw new IllegalArgumentException("Table name must be given."); } toSelect = toSelect == null ? "*" : toSelect; - StatementHelper sh = new StatementHelper(); + StatementHelper sh = getStatementHelper(); StringBuffer query = new StringBuffer(); query.append("SELECT " + toSelect + " FROM ").append( SQLUtil.escapeSQL(tableName)); @@ -84,6 +113,7 @@ public class DefaultSQLGenerator implements SQLGenerator { * generateUpdateQuery(java.lang.String, * com.vaadin.addon.sqlcontainer.RowItem) */ + @Override public StatementHelper generateUpdateQuery(String tableName, RowItem item) { if (tableName == null || tableName.trim().equals("")) { throw new IllegalArgumentException("Table name must be given."); @@ -91,7 +121,7 @@ public class DefaultSQLGenerator implements SQLGenerator { if (item == null) { throw new IllegalArgumentException("Updated item must be given."); } - StatementHelper sh = new StatementHelper(); + StatementHelper sh = getStatementHelper(); StringBuffer query = new StringBuffer(); query.append("UPDATE ").append(tableName).append(" SET"); @@ -133,6 +163,7 @@ public class DefaultSQLGenerator implements SQLGenerator { * generateInsertQuery(java.lang.String, * com.vaadin.addon.sqlcontainer.RowItem) */ + @Override public StatementHelper generateInsertQuery(String tableName, RowItem item) { if (tableName == null || tableName.trim().equals("")) { throw new IllegalArgumentException("Table name must be given."); @@ -144,7 +175,7 @@ public class DefaultSQLGenerator implements SQLGenerator { throw new IllegalArgumentException( "Cannot generate an insert query for item already in database."); } - StatementHelper sh = new StatementHelper(); + StatementHelper sh = getStatementHelper(); StringBuffer query = new StringBuffer(); query.append("INSERT INTO ").append(tableName).append(" ("); @@ -184,6 +215,7 @@ public class DefaultSQLGenerator implements SQLGenerator { * generateDeleteQuery(java.lang.String, * com.vaadin.addon.sqlcontainer.RowItem) */ + @Override public StatementHelper generateDeleteQuery(String tableName, List<String> primaryKeyColumns, String versionColumn, RowItem item) { if (tableName == null || tableName.trim().equals("")) { @@ -197,7 +229,7 @@ public class DefaultSQLGenerator implements SQLGenerator { throw new IllegalArgumentException( "Valid keyColumnNames must be provided."); } - StatementHelper sh = new StatementHelper(); + StatementHelper sh = getStatementHelper(); StringBuffer query = new StringBuffer(); query.append("DELETE FROM ").append(tableName).append(" WHERE "); int count = 1; @@ -308,4 +340,28 @@ public class DefaultSQLGenerator implements SQLGenerator { } return rowIdentifiers; } -}
\ No newline at end of file + + /** + * Returns the statement helper for the generator. Override this to handle + * platform specific data types. + * + * @see http://dev.vaadin.com/ticket/9148 + * @return a new instance of the statement helper + */ + protected StatementHelper getStatementHelper() { + if (statementHelperClass == null) { + return new StatementHelper(); + } + + try { + return statementHelperClass.newInstance(); + } catch (InstantiationException e) { + throw new RuntimeException( + "Unable to instantiate custom StatementHelper", e); + } catch (IllegalAccessException e) { + throw new RuntimeException( + "Unable to instantiate custom StatementHelper", e); + } + } + +} diff --git a/src/com/vaadin/data/util/sqlcontainer/query/generator/MSSQLGenerator.java b/src/com/vaadin/data/util/sqlcontainer/query/generator/MSSQLGenerator.java index 52c13feecb..13ef1d0090 100644 --- a/src/com/vaadin/data/util/sqlcontainer/query/generator/MSSQLGenerator.java +++ b/src/com/vaadin/data/util/sqlcontainer/query/generator/MSSQLGenerator.java @@ -50,7 +50,7 @@ public class MSSQLGenerator extends DefaultSQLGenerator { offset = pagelength > 1 ? ++offset : offset; pagelength = pagelength > 1 ? --pagelength : pagelength; toSelect = toSelect == null ? "*" : toSelect; - StatementHelper sh = new StatementHelper(); + StatementHelper sh = getStatementHelper(); StringBuffer query = new StringBuffer(); /* Row count request is handled here */ diff --git a/src/com/vaadin/data/util/sqlcontainer/query/generator/OracleGenerator.java b/src/com/vaadin/data/util/sqlcontainer/query/generator/OracleGenerator.java index 8e33211154..43a562d3a8 100644 --- a/src/com/vaadin/data/util/sqlcontainer/query/generator/OracleGenerator.java +++ b/src/com/vaadin/data/util/sqlcontainer/query/generator/OracleGenerator.java @@ -16,6 +16,10 @@ public class OracleGenerator extends DefaultSQLGenerator { } + public OracleGenerator(Class<? extends StatementHelper> statementHelperClazz) { + super(statementHelperClazz); + } + /** * Construct an OracleSQLGenerator with the specified identifiers for start * and end of quoted strings. The identifiers may be different depending on @@ -31,6 +35,11 @@ public class OracleGenerator extends DefaultSQLGenerator { super(quoteStart, quoteEnd); } + public OracleGenerator(String quoteStart, String quoteEnd, + Class<? extends StatementHelper> statementHelperClazz) { + super(quoteStart, quoteEnd, statementHelperClazz); + } + /* * (non-Javadoc) * @@ -50,7 +59,7 @@ public class OracleGenerator extends DefaultSQLGenerator { offset = pagelength > 1 ? ++offset : offset; pagelength = pagelength > 1 ? --pagelength : pagelength; toSelect = toSelect == null ? "*" : toSelect; - StatementHelper sh = new StatementHelper(); + StatementHelper sh = getStatementHelper(); StringBuffer query = new StringBuffer(); /* Row count request is handled here */ @@ -99,4 +108,5 @@ public class OracleGenerator extends DefaultSQLGenerator { sh.setQueryString(query.toString()); return sh; } + }
\ No newline at end of file diff --git a/src/com/vaadin/data/util/sqlcontainer/query/generator/StatementHelper.java b/src/com/vaadin/data/util/sqlcontainer/query/generator/StatementHelper.java index 3fd92e920d..f9458609c3 100644 --- a/src/com/vaadin/data/util/sqlcontainer/query/generator/StatementHelper.java +++ b/src/com/vaadin/data/util/sqlcontainer/query/generator/StatementHelper.java @@ -128,8 +128,32 @@ public class StatementHelper implements Serializable { } else if (Timestamp.class.equals(dataTypes.get(i))) { pstmt.setTimestamp(i + 1, null); } else { + + if (handleUnrecognizedTypeNullValue(i, pstmt, dataTypes)) { + return; + } + throw new SQLException("Data type not supported by SQLContainer: " + parameters.get(i).getClass().toString()); } } + + /** + * Handle unrecognized null values. Override this to handle null values for + * platform specific data types that are not handled by the default + * implementation of the {@link StatementHelper}. + * + * @param i + * @param pstmt + * @param dataTypes2 + * + * @return true if handled, false otherwise + * + * @see {@link http://dev.vaadin.com/ticket/9148} + */ + protected boolean handleUnrecognizedTypeNullValue(int i, + PreparedStatement pstmt, Map<Integer, Class<?>> dataTypes) + throws SQLException { + return false; + } } diff --git a/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/AndTranslator.java b/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/AndTranslator.java index 02d6671b60..251a543a8a 100644 --- a/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/AndTranslator.java +++ b/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/AndTranslator.java @@ -9,10 +9,12 @@ import com.vaadin.data.util.sqlcontainer.query.generator.StatementHelper; public class AndTranslator implements FilterTranslator { + @Override public boolean translatesFilter(Filter filter) { return filter instanceof And; } + @Override public String getWhereStringForFilter(Filter filter, StatementHelper sh) { return QueryBuilder.group(QueryBuilder.getJoinedFilterString( ((And) filter).getFilters(), "AND", sh)); diff --git a/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/BetweenTranslator.java b/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/BetweenTranslator.java index e8a87a82d8..4fcaf759ea 100644 --- a/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/BetweenTranslator.java +++ b/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/BetweenTranslator.java @@ -9,10 +9,12 @@ import com.vaadin.data.util.sqlcontainer.query.generator.StatementHelper; public class BetweenTranslator implements FilterTranslator { + @Override public boolean translatesFilter(Filter filter) { return filter instanceof Between; } + @Override public String getWhereStringForFilter(Filter filter, StatementHelper sh) { Between between = (Between) filter; sh.addParameterValue(between.getStartValue()); diff --git a/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/CompareTranslator.java b/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/CompareTranslator.java index 72d72dd069..4293e1d630 100644 --- a/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/CompareTranslator.java +++ b/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/CompareTranslator.java @@ -9,10 +9,12 @@ import com.vaadin.data.util.sqlcontainer.query.generator.StatementHelper; public class CompareTranslator implements FilterTranslator { + @Override public boolean translatesFilter(Filter filter) { return filter instanceof Compare; } + @Override public String getWhereStringForFilter(Filter filter, StatementHelper sh) { Compare compare = (Compare) filter; sh.addParameterValue(compare.getValue()); diff --git a/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/IsNullTranslator.java b/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/IsNullTranslator.java index 2593bbae57..a2a6cd2c09 100644 --- a/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/IsNullTranslator.java +++ b/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/IsNullTranslator.java @@ -9,10 +9,12 @@ import com.vaadin.data.util.sqlcontainer.query.generator.StatementHelper; public class IsNullTranslator implements FilterTranslator { + @Override public boolean translatesFilter(Filter filter) { return filter instanceof IsNull; } + @Override public String getWhereStringForFilter(Filter filter, StatementHelper sh) { IsNull in = (IsNull) filter; return QueryBuilder.quote(in.getPropertyId()) + " IS NULL"; diff --git a/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/LikeTranslator.java b/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/LikeTranslator.java index b1c779ae73..25a85caec0 100644 --- a/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/LikeTranslator.java +++ b/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/LikeTranslator.java @@ -9,10 +9,12 @@ import com.vaadin.data.util.sqlcontainer.query.generator.StatementHelper; public class LikeTranslator implements FilterTranslator { + @Override public boolean translatesFilter(Filter filter) { return filter instanceof Like; } + @Override public String getWhereStringForFilter(Filter filter, StatementHelper sh) { Like like = (Like) filter; if (like.isCaseSensitive()) { diff --git a/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/NotTranslator.java b/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/NotTranslator.java index 7c1bba2bb5..5dfbe240e7 100644 --- a/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/NotTranslator.java +++ b/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/NotTranslator.java @@ -10,10 +10,12 @@ import com.vaadin.data.util.sqlcontainer.query.generator.StatementHelper; public class NotTranslator implements FilterTranslator { + @Override public boolean translatesFilter(Filter filter) { return filter instanceof Not; } + @Override public String getWhereStringForFilter(Filter filter, StatementHelper sh) { Not not = (Not) filter; if (not.getFilter() instanceof IsNull) { diff --git a/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/OrTranslator.java b/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/OrTranslator.java index 9724ee7944..2f0ed814e0 100644 --- a/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/OrTranslator.java +++ b/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/OrTranslator.java @@ -9,10 +9,12 @@ import com.vaadin.data.util.sqlcontainer.query.generator.StatementHelper; public class OrTranslator implements FilterTranslator { + @Override public boolean translatesFilter(Filter filter) { return filter instanceof Or; } + @Override public String getWhereStringForFilter(Filter filter, StatementHelper sh) { return QueryBuilder.group(QueryBuilder.getJoinedFilterString( ((Or) filter).getFilters(), "OR", sh)); diff --git a/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/SimpleStringTranslator.java b/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/SimpleStringTranslator.java index 1aae68abc0..f108003535 100644 --- a/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/SimpleStringTranslator.java +++ b/src/com/vaadin/data/util/sqlcontainer/query/generator/filter/SimpleStringTranslator.java @@ -10,10 +10,12 @@ import com.vaadin.data.util.sqlcontainer.query.generator.StatementHelper; public class SimpleStringTranslator implements FilterTranslator { + @Override public boolean translatesFilter(Filter filter) { return filter instanceof SimpleStringFilter; } + @Override public String getWhereStringForFilter(Filter filter, StatementHelper sh) { SimpleStringFilter ssf = (SimpleStringFilter) filter; // Create a Like filter based on the SimpleStringFilter and execute the diff --git a/src/com/vaadin/data/validator/AbstractValidator.java b/src/com/vaadin/data/validator/AbstractValidator.java index 27eaaca485..8febe5338a 100644 --- a/src/com/vaadin/data/validator/AbstractValidator.java +++ b/src/com/vaadin/data/validator/AbstractValidator.java @@ -84,6 +84,7 @@ public abstract class AbstractValidator<T> implements Validator { */ protected abstract boolean isValidValue(T value); + @Override public void validate(Object value) throws InvalidValueException { // isValidType ensures that value can safely be cast to TYPE if (!isValidType(value) || !isValidValue((T) value)) { diff --git a/src/com/vaadin/data/validator/BeanValidator.java b/src/com/vaadin/data/validator/BeanValidator.java index 817df85248..816ff79b83 100644 --- a/src/com/vaadin/data/validator/BeanValidator.java +++ b/src/com/vaadin/data/validator/BeanValidator.java @@ -67,10 +67,12 @@ public class BeanValidator implements Validator { this.descriptor = descriptor; } + @Override public ConstraintDescriptor<?> getConstraintDescriptor() { return descriptor; } + @Override public Object getValidatedValue() { return value; } @@ -96,6 +98,7 @@ public class BeanValidator implements Validator { * * @see com.vaadin.data.Validator#validate(java.lang.Object) */ + @Override public void validate(final Object value) throws InvalidValueException { Set<?> violations = getJavaxBeanValidator().validateValue(beanClass, propertyName, value); diff --git a/src/com/vaadin/data/validator/CompositeValidator.java b/src/com/vaadin/data/validator/CompositeValidator.java index 956d773032..cad31c9d4d 100644 --- a/src/com/vaadin/data/validator/CompositeValidator.java +++ b/src/com/vaadin/data/validator/CompositeValidator.java @@ -101,6 +101,7 @@ public class CompositeValidator implements Validator { * @throws Validator.InvalidValueException * if the value is not valid. */ + @Override public void validate(Object value) throws Validator.InvalidValueException { switch (mode) { case AND: diff --git a/src/com/vaadin/data/validator/NullValidator.java b/src/com/vaadin/data/validator/NullValidator.java index 62b2580d48..551d88c776 100644 --- a/src/com/vaadin/data/validator/NullValidator.java +++ b/src/com/vaadin/data/validator/NullValidator.java @@ -43,6 +43,7 @@ public class NullValidator implements Validator { * @throws Validator.InvalidValueException * if the value was invalid. */ + @Override public void validate(Object value) throws Validator.InvalidValueException { if ((onlyNullAllowed && value != null) || (!onlyNullAllowed && value == null)) { diff --git a/src/com/vaadin/event/ActionManager.java b/src/com/vaadin/event/ActionManager.java index 08e9c85043..64fdeea69b 100644 --- a/src/com/vaadin/event/ActionManager.java +++ b/src/com/vaadin/event/ActionManager.java @@ -75,6 +75,7 @@ public class ActionManager implements Action.Container, Action.Handler, requestRepaint(); // this goes to the new viewer } + @Override public <T extends Action & Action.Listener> void addAction(T action) { if (ownActions == null) { ownActions = new HashSet<Action>(); @@ -84,6 +85,7 @@ public class ActionManager implements Action.Container, Action.Handler, } } + @Override public <T extends Action & Action.Listener> void removeAction(T action) { if (ownActions != null) { if (ownActions.remove(action)) { @@ -92,6 +94,7 @@ public class ActionManager implements Action.Container, Action.Handler, } } + @Override public void addActionHandler(Handler actionHandler) { if (actionHandler == this) { // don't add the actionHandler to itself @@ -109,6 +112,7 @@ public class ActionManager implements Action.Container, Action.Handler, } } + @Override public void removeActionHandler(Action.Handler actionHandler) { if (actionHandlers != null && actionHandlers.contains(actionHandler)) { @@ -206,6 +210,7 @@ public class ActionManager implements Action.Container, Action.Handler, } } + @Override public Action[] getActions(Object target, Object sender) { HashSet<Action> actions = new HashSet<Action>(); if (ownActions != null) { @@ -226,6 +231,7 @@ public class ActionManager implements Action.Container, Action.Handler, return actions.toArray(new Action[actions.size()]); } + @Override public void handleAction(Action action, Object sender, Object target) { if (actionHandlers != null) { Handler[] array = actionHandlers.toArray(new Handler[actionHandlers diff --git a/src/com/vaadin/event/EventRouter.java b/src/com/vaadin/event/EventRouter.java index 49b29de9bb..90c080b860 100644 --- a/src/com/vaadin/event/EventRouter.java +++ b/src/com/vaadin/event/EventRouter.java @@ -35,6 +35,7 @@ public class EventRouter implements MethodEventSource { * events generated by this component. Don't add a JavaDoc comment here, we * use the default documentation from implemented interface. */ + @Override public void addListener(Class<?> eventType, Object object, Method method) { if (listenerList == null) { listenerList = new LinkedHashSet<ListenerMethod>(); @@ -47,6 +48,7 @@ public class EventRouter implements MethodEventSource { * listen events generated by this component. Don't add a JavaDoc comment * here, we use the default documentation from implemented interface. */ + @Override public void addListener(Class<?> eventType, Object object, String methodName) { if (listenerList == null) { listenerList = new LinkedHashSet<ListenerMethod>(); @@ -59,6 +61,7 @@ public class EventRouter implements MethodEventSource { * a JavaDoc comment here, we use the default documentation from implemented * interface. */ + @Override public void removeListener(Class<?> eventType, Object target) { if (listenerList != null) { final Iterator<ListenerMethod> i = listenerList.iterator(); @@ -77,6 +80,7 @@ public class EventRouter implements MethodEventSource { * Don't add a JavaDoc comment here, we use the default documentation from * implemented interface. */ + @Override public void removeListener(Class<?> eventType, Object target, Method method) { if (listenerList != null) { final Iterator<ListenerMethod> i = listenerList.iterator(); @@ -95,6 +99,7 @@ public class EventRouter implements MethodEventSource { * Don't add a JavaDoc comment here, we use the default documentation from * implemented interface. */ + @Override public void removeListener(Class<?> eventType, Object target, String methodName) { diff --git a/src/com/vaadin/event/FieldEvents.java b/src/com/vaadin/event/FieldEvents.java index 20e9fabb36..8f101c1913 100644 --- a/src/com/vaadin/event/FieldEvents.java +++ b/src/com/vaadin/event/FieldEvents.java @@ -7,8 +7,8 @@ package com.vaadin.event; import java.io.Serializable; import java.lang.reflect.Method; -import com.vaadin.terminal.gwt.client.EventId; -import com.vaadin.terminal.gwt.client.communication.FieldRpc.FocusAndBlurServerRpc; +import com.vaadin.shared.EventId; +import com.vaadin.shared.communication.FieldRpc.FocusAndBlurServerRpc; import com.vaadin.tools.ReflectTools; import com.vaadin.ui.Component; import com.vaadin.ui.Component.Event; @@ -261,10 +261,12 @@ public interface FieldEvents { protected abstract void fireEvent(Event event); + @Override public void blur() { fireEvent(new BlurEvent(component)); } + @Override public void focus() { fireEvent(new FocusEvent(component)); } diff --git a/src/com/vaadin/event/ItemClickEvent.java b/src/com/vaadin/event/ItemClickEvent.java index bb41398e8d..0aa0e106c5 100644 --- a/src/com/vaadin/event/ItemClickEvent.java +++ b/src/com/vaadin/event/ItemClickEvent.java @@ -9,7 +9,7 @@ import java.lang.reflect.Method; import com.vaadin.data.Item; import com.vaadin.data.Property; import com.vaadin.event.MouseEvents.ClickEvent; -import com.vaadin.terminal.gwt.client.MouseEventDetails; +import com.vaadin.shared.MouseEventDetails; import com.vaadin.ui.Component; /** diff --git a/src/com/vaadin/event/LayoutEvents.java b/src/com/vaadin/event/LayoutEvents.java index 960fff00c0..602440ea07 100644 --- a/src/com/vaadin/event/LayoutEvents.java +++ b/src/com/vaadin/event/LayoutEvents.java @@ -7,8 +7,8 @@ import java.io.Serializable; import java.lang.reflect.Method; import com.vaadin.event.MouseEvents.ClickEvent; -import com.vaadin.terminal.gwt.client.Connector; -import com.vaadin.terminal.gwt.client.MouseEventDetails; +import com.vaadin.shared.Connector; +import com.vaadin.shared.MouseEventDetails; import com.vaadin.tools.ReflectTools; import com.vaadin.ui.Component; import com.vaadin.ui.ComponentContainer; diff --git a/src/com/vaadin/event/MouseEvents.java b/src/com/vaadin/event/MouseEvents.java index 2327b78f64..fafd44be89 100644 --- a/src/com/vaadin/event/MouseEvents.java +++ b/src/com/vaadin/event/MouseEvents.java @@ -6,7 +6,7 @@ package com.vaadin.event; import java.lang.reflect.Method; -import com.vaadin.terminal.gwt.client.MouseEventDetails; +import com.vaadin.shared.MouseEventDetails; import com.vaadin.tools.ReflectTools; import com.vaadin.ui.Component; diff --git a/src/com/vaadin/event/ShortcutListener.java b/src/com/vaadin/event/ShortcutListener.java index 0656ed0e1f..b760cfabe6 100644 --- a/src/com/vaadin/event/ShortcutListener.java +++ b/src/com/vaadin/event/ShortcutListener.java @@ -28,5 +28,6 @@ public abstract class ShortcutListener extends ShortcutAction implements super(shorthandCaption); } + @Override abstract public void handleAction(Object sender, Object target); } diff --git a/src/com/vaadin/event/TransferableImpl.java b/src/com/vaadin/event/TransferableImpl.java index 621ea95bc1..4c973571f7 100644 --- a/src/com/vaadin/event/TransferableImpl.java +++ b/src/com/vaadin/event/TransferableImpl.java @@ -24,18 +24,22 @@ public class TransferableImpl implements Transferable { this.rawVariables = rawVariables; } + @Override public Component getSourceComponent() { return sourceComponent; } + @Override public Object getData(String dataFlavor) { return rawVariables.get(dataFlavor); } + @Override public void setData(String dataFlavor, Object value) { rawVariables.put(dataFlavor, value); } + @Override public Collection<String> getDataFlavors() { return rawVariables.keySet(); } diff --git a/src/com/vaadin/event/dd/TargetDetailsImpl.java b/src/com/vaadin/event/dd/TargetDetailsImpl.java index 27afc32680..4a459777ed 100644 --- a/src/com/vaadin/event/dd/TargetDetailsImpl.java +++ b/src/com/vaadin/event/dd/TargetDetailsImpl.java @@ -29,6 +29,7 @@ public class TargetDetailsImpl implements TargetDetails { this.dropTarget = dropTarget; } + @Override public Object getData(String key) { return data.get(key); } @@ -37,6 +38,7 @@ public class TargetDetailsImpl implements TargetDetails { return data.put(key, value); } + @Override public DropTarget getTarget() { return dropTarget; } diff --git a/src/com/vaadin/event/dd/acceptcriteria/AcceptAll.java b/src/com/vaadin/event/dd/acceptcriteria/AcceptAll.java index 52ffab9263..1457ea9df3 100644 --- a/src/com/vaadin/event/dd/acceptcriteria/AcceptAll.java +++ b/src/com/vaadin/event/dd/acceptcriteria/AcceptAll.java @@ -29,6 +29,7 @@ public final class AcceptAll extends ClientSideCriterion { return singleton; } + @Override public boolean accept(DragAndDropEvent dragEvent) { return true; } diff --git a/src/com/vaadin/event/dd/acceptcriteria/And.java b/src/com/vaadin/event/dd/acceptcriteria/And.java index a0340a9cdb..4122d67160 100644 --- a/src/com/vaadin/event/dd/acceptcriteria/And.java +++ b/src/com/vaadin/event/dd/acceptcriteria/And.java @@ -41,6 +41,7 @@ public class And extends ClientSideCriterion { } } + @Override public boolean accept(DragAndDropEvent dragEvent) { for (ClientSideCriterion crit : criteria) { if (!crit.accept(dragEvent)) { diff --git a/src/com/vaadin/event/dd/acceptcriteria/ClientSideCriterion.java b/src/com/vaadin/event/dd/acceptcriteria/ClientSideCriterion.java index 0f4ae2990c..7d2c42ecb0 100644 --- a/src/com/vaadin/event/dd/acceptcriteria/ClientSideCriterion.java +++ b/src/com/vaadin/event/dd/acceptcriteria/ClientSideCriterion.java @@ -33,10 +33,12 @@ public abstract class ClientSideCriterion implements Serializable, * com.vaadin.event.dd.acceptCriteria.AcceptCriterion#isClientSideVerifiable * () */ + @Override public final boolean isClientSideVerifiable() { return true; } + @Override public void paint(PaintTarget target) throws PaintException { target.startTag("-ac"); target.addAttribute("name", getIdentifier()); @@ -51,6 +53,7 @@ public abstract class ClientSideCriterion implements Serializable, return getClass().getCanonicalName(); } + @Override public final void paintResponse(PaintTarget target) throws PaintException { // NOP, nothing to do as this is client side verified criterion } diff --git a/src/com/vaadin/event/dd/acceptcriteria/ContainsDataFlavor.java b/src/com/vaadin/event/dd/acceptcriteria/ContainsDataFlavor.java index 7eb04d9647..4c52698a4a 100644 --- a/src/com/vaadin/event/dd/acceptcriteria/ContainsDataFlavor.java +++ b/src/com/vaadin/event/dd/acceptcriteria/ContainsDataFlavor.java @@ -39,6 +39,7 @@ public class ContainsDataFlavor extends ClientSideCriterion { target.addAttribute("p", dataFlavorId); } + @Override public boolean accept(DragAndDropEvent dragEvent) { return dragEvent.getTransferable().getDataFlavors() .contains(dataFlavorId); diff --git a/src/com/vaadin/event/dd/acceptcriteria/Not.java b/src/com/vaadin/event/dd/acceptcriteria/Not.java index 85ff7e9bc9..1ed40a324d 100644 --- a/src/com/vaadin/event/dd/acceptcriteria/Not.java +++ b/src/com/vaadin/event/dd/acceptcriteria/Not.java @@ -31,6 +31,7 @@ public class Not extends ClientSideCriterion { acceptCriterion.paint(target); } + @Override public boolean accept(DragAndDropEvent dragEvent) { return !acceptCriterion.accept(dragEvent); } diff --git a/src/com/vaadin/event/dd/acceptcriteria/Or.java b/src/com/vaadin/event/dd/acceptcriteria/Or.java index 077e9114d8..6ad45c54af 100644 --- a/src/com/vaadin/event/dd/acceptcriteria/Or.java +++ b/src/com/vaadin/event/dd/acceptcriteria/Or.java @@ -39,6 +39,7 @@ public class Or extends ClientSideCriterion { } } + @Override public boolean accept(DragAndDropEvent dragEvent) { for (AcceptCriterion crit : criteria) { if (crit.accept(dragEvent)) { diff --git a/src/com/vaadin/event/dd/acceptcriteria/ServerSideCriterion.java b/src/com/vaadin/event/dd/acceptcriteria/ServerSideCriterion.java index 77840bc94f..47f06d434c 100644 --- a/src/com/vaadin/event/dd/acceptcriteria/ServerSideCriterion.java +++ b/src/com/vaadin/event/dd/acceptcriteria/ServerSideCriterion.java @@ -31,10 +31,12 @@ public abstract class ServerSideCriterion implements Serializable, private static final long serialVersionUID = 2128510128911628902L; + @Override public final boolean isClientSideVerifiable() { return false; } + @Override public void paint(PaintTarget target) throws PaintException { target.startTag("-ac"); target.addAttribute("name", getIdentifier()); @@ -45,6 +47,7 @@ public abstract class ServerSideCriterion implements Serializable, public void paintContent(PaintTarget target) { } + @Override public void paintResponse(PaintTarget target) throws PaintException { } diff --git a/src/com/vaadin/event/dd/acceptcriteria/SourceIs.java b/src/com/vaadin/event/dd/acceptcriteria/SourceIs.java index d7c47dc915..d4fd20c952 100644 --- a/src/com/vaadin/event/dd/acceptcriteria/SourceIs.java +++ b/src/com/vaadin/event/dd/acceptcriteria/SourceIs.java @@ -49,6 +49,7 @@ public class SourceIs extends ClientSideCriterion { target.addAttribute("c", paintedComponents); } + @Override public boolean accept(DragAndDropEvent dragEvent) { if (dragEvent.getTransferable() instanceof TransferableImpl) { Component sourceComponent = ((TransferableImpl) dragEvent diff --git a/src/com/vaadin/event/dd/acceptcriteria/SourceIsTarget.java b/src/com/vaadin/event/dd/acceptcriteria/SourceIsTarget.java index 454159b3da..a644b858e2 100644 --- a/src/com/vaadin/event/dd/acceptcriteria/SourceIsTarget.java +++ b/src/com/vaadin/event/dd/acceptcriteria/SourceIsTarget.java @@ -33,6 +33,7 @@ public class SourceIsTarget extends ClientSideCriterion { private SourceIsTarget() { } + @Override public boolean accept(DragAndDropEvent dragEvent) { if (dragEvent.getTransferable() instanceof TransferableImpl) { Component sourceComponent = ((TransferableImpl) dragEvent diff --git a/src/com/vaadin/event/dd/acceptcriteria/TargetDetailIs.java b/src/com/vaadin/event/dd/acceptcriteria/TargetDetailIs.java index 641fddc3ea..5df8f3f618 100644 --- a/src/com/vaadin/event/dd/acceptcriteria/TargetDetailIs.java +++ b/src/com/vaadin/event/dd/acceptcriteria/TargetDetailIs.java @@ -58,6 +58,7 @@ public class TargetDetailIs extends ClientSideCriterion { } } + @Override public boolean accept(DragAndDropEvent dragEvent) { Object data = dragEvent.getTargetDetails().getData(propertyName); return value.equals(data); diff --git a/src/com/vaadin/external/json/JSONException.java b/src/com/vaadin/external/json/JSONException.java index fecc38974e..895ffcb457 100644 --- a/src/com/vaadin/external/json/JSONException.java +++ b/src/com/vaadin/external/json/JSONException.java @@ -25,6 +25,7 @@ public class JSONException extends Exception { this.cause = cause; } + @Override public Throwable getCause() { return this.cause; } diff --git a/src/com/vaadin/external/json/JSONStringer.java b/src/com/vaadin/external/json/JSONStringer.java index e4ccc8e195..ae905cb15f 100644 --- a/src/com/vaadin/external/json/JSONStringer.java +++ b/src/com/vaadin/external/json/JSONStringer.java @@ -77,6 +77,7 @@ public class JSONStringer extends JSONWriter { * * @return The JSON text. */ + @Override public String toString() { return this.mode == 'd' ? this.writer.toString() : null; } diff --git a/src/com/vaadin/navigator/Navigator.java b/src/com/vaadin/navigator/Navigator.java index 3ff727b504..1813301fe6 100644 --- a/src/com/vaadin/navigator/Navigator.java +++ b/src/com/vaadin/navigator/Navigator.java @@ -14,6 +14,7 @@ import com.vaadin.terminal.Page; import com.vaadin.terminal.Page.FragmentChangedEvent; import com.vaadin.terminal.Page.FragmentChangedListener; import com.vaadin.ui.Component; +import com.vaadin.ui.ComponentContainer; import com.vaadin.ui.CssLayout; import com.vaadin.ui.CustomComponent; @@ -53,6 +54,7 @@ public class Navigator implements Serializable { setHeight("0px"); } + @Override public void navigateTo(String fragmentParameters) { // nothing to do } @@ -87,14 +89,17 @@ public class Navigator implements Serializable { page.addListener(this); } + @Override public String getFragment() { return page.getFragment(); } + @Override public void setFragment(String fragment) { page.setFragment(fragment, false); } + @Override public void fragmentChanged(FragmentChangedEvent event) { UriFragmentManager.this.navigator.navigateTo(getFragment()); } @@ -121,6 +126,7 @@ public class Navigator implements Serializable { setSizeFull(); } + @Override public void showView(View view) { if (view instanceof Component) { setCompositionRoot((Component) view); @@ -132,6 +138,41 @@ public class Navigator implements Serializable { } /** + * View display that replaces the contents of a {@link ComponentContainer} + * with the active {@link View}. + * + * All components of the container are removed before adding the new view to + * it. + * + * This display only supports views that are {@link Component}s themselves. + * Attempting to display a view that is not a component causes an exception + * to be thrown. + */ + public static class ComponentContainerViewDisplay implements ViewDisplay { + + private final ComponentContainer container; + + /** + * Create new {@link ViewDisplay} that updates a + * {@link ComponentContainer} to show the view. + */ + public ComponentContainerViewDisplay(ComponentContainer container) { + this.container = container; + } + + @Override + public void showView(View view) { + if (view instanceof Component) { + container.removeAllComponents(); + container.addComponent((Component) view); + } else { + throw new IllegalArgumentException("View is not a component: " + + view); + } + } + } + + /** * View provider which supports mapping a single view name to a single * pre-initialized view instance. * @@ -155,6 +196,7 @@ public class Navigator implements Serializable { this.view = view; } + @Override public String getViewName(String viewAndParameters) { if (null == viewAndParameters) { return null; @@ -165,6 +207,7 @@ public class Navigator implements Serializable { return null; } + @Override public View getView(String viewName) { if (this.viewName.equals(viewName)) { return view; @@ -215,6 +258,7 @@ public class Navigator implements Serializable { this.viewClass = viewClass; } + @Override public String getViewName(String viewAndParameters) { if (null == viewAndParameters) { return null; @@ -226,6 +270,7 @@ public class Navigator implements Serializable { return null; } + @Override public View getView(String viewName) { if (this.viewName.equals(viewName)) { try { @@ -268,31 +313,56 @@ public class Navigator implements Serializable { private List<ViewProvider> providers = new LinkedList<ViewProvider>(); /** - * Create a navigator that is tracking the active view using URI fragments. - * - * @param page - * whose URI fragments are used - * @param display - * where to display the views + * Create a navigator that is tracking the active view using URI fragments + * of the current {@link Page} and replacing the contents of a + * {@link ComponentContainer} with the active view. + * + * In case the container is not on the current page, use another + * {@link Navigator#Navigator(Page, ViewDisplay)} with an explicitly created + * {@link ComponentContainerViewDisplay}. + * + * All components of the container are removed each time before adding the + * active {@link View}. Views must implement {@link Component} when using + * this constructor. + * + * <p> + * After all {@link View}s and {@link ViewProvider}s have been registered, + * the application should trigger navigation to the current fragment using + * e.g. + * + * <pre> + * navigator.navigateTo(Page.getCurrent().getFragment()); + * </pre> + * + * @param container + * ComponentContainer whose contents should be replaced with the + * active view on view change */ - public Navigator(Page page, ViewDisplay display) { - this.display = display; - fragmentManager = new UriFragmentManager(page, this); - navigateTo(page.getFragment()); + public Navigator(ComponentContainer container) { + display = new ComponentContainerViewDisplay(container); + fragmentManager = new UriFragmentManager(Page.getCurrent(), this); } /** * Create a navigator that is tracking the active view using URI fragments. - * By default, a {@link SimpleViewDisplay} is used and can be obtained using - * {@link #getDisplay()}. + * + * <p> + * After all {@link View}s and {@link ViewProvider}s have been registered, + * the application should trigger navigation to the current fragment using + * e.g. + * + * <pre> + * navigator.navigateTo(Page.getCurrent().getFragment()); + * </pre> * * @param page * whose URI fragments are used + * @param display + * where to display the views */ - public Navigator(Page page) { - display = new SimpleViewDisplay(); + public Navigator(Page page, ViewDisplay display) { + this.display = display; fragmentManager = new UriFragmentManager(page, this); - navigateTo(page.getFragment()); } /** diff --git a/src/com/vaadin/terminal/gwt/client/AbstractFieldState.java b/src/com/vaadin/shared/AbstractFieldState.java index 3a66a01f23..33fc0ff92c 100644 --- a/src/com/vaadin/terminal/gwt/client/AbstractFieldState.java +++ b/src/com/vaadin/shared/AbstractFieldState.java @@ -1,9 +1,9 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client; +package com.vaadin.shared; -import com.vaadin.terminal.gwt.client.ui.TabIndexState; +import com.vaadin.shared.ui.TabIndexState; import com.vaadin.ui.AbstractField; /** @@ -121,6 +121,7 @@ public class AbstractFieldState extends ComponentState implements TabIndexState * * @see com.vaadin.terminal.gwt.client.ComponentState#getTabIndex() */ + @Override public int getTabIndex() { return tabIndex; } @@ -130,6 +131,7 @@ public class AbstractFieldState extends ComponentState implements TabIndexState * * @see com.vaadin.terminal.gwt.client.ui.TabIndexState#setTabIndex(int) */ + @Override public void setTabIndex(int tabIndex) { this.tabIndex = tabIndex; } diff --git a/src/com/vaadin/terminal/gwt/client/ComponentState.java b/src/com/vaadin/shared/ComponentState.java index a603368f44..c4269de676 100644 --- a/src/com/vaadin/terminal/gwt/client/ComponentState.java +++ b/src/com/vaadin/shared/ComponentState.java @@ -2,14 +2,14 @@ @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client; +package com.vaadin.shared; import java.util.HashSet; import java.util.List; import java.util.Set; -import com.vaadin.terminal.gwt.client.communication.SharedState; -import com.vaadin.terminal.gwt.client.communication.URLReference; +import com.vaadin.shared.communication.SharedState; +import com.vaadin.shared.communication.URLReference; import com.vaadin.ui.Component; /** diff --git a/src/com/vaadin/terminal/gwt/client/Connector.java b/src/com/vaadin/shared/Connector.java index 9b2fcf61f1..e09d4d51b7 100644 --- a/src/com/vaadin/terminal/gwt/client/Connector.java +++ b/src/com/vaadin/shared/Connector.java @@ -1,11 +1,12 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client; +package com.vaadin.shared; import java.io.Serializable; -import com.vaadin.terminal.gwt.client.communication.SharedState; +import com.vaadin.shared.communication.SharedState; +import com.vaadin.terminal.gwt.client.ServerConnector; import com.vaadin.terminal.gwt.server.ClientConnector; /** diff --git a/src/com/vaadin/terminal/gwt/client/EventId.java b/src/com/vaadin/shared/EventId.java index d3ef2e4e7e..616d37dcd0 100644 --- a/src/com/vaadin/terminal/gwt/client/EventId.java +++ b/src/com/vaadin/shared/EventId.java @@ -1,7 +1,7 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client; +package com.vaadin.shared; public interface EventId { public static final String BLUR = "blur"; diff --git a/src/com/vaadin/shared/JavaScriptConnectorState.java b/src/com/vaadin/shared/JavaScriptConnectorState.java new file mode 100644 index 0000000000..8371623e68 --- /dev/null +++ b/src/com/vaadin/shared/JavaScriptConnectorState.java @@ -0,0 +1,14 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ + +package com.vaadin.shared; + +import java.util.Map; +import java.util.Set; + +public interface JavaScriptConnectorState { + public Set<String> getCallbackNames(); + + public Map<String, Set<String>> getRpcInterfaces(); +}
\ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/client/JavaScriptExtensionState.java b/src/com/vaadin/shared/JavaScriptExtensionState.java index e7bfbc4bb2..35a7213239 100644 --- a/src/com/vaadin/terminal/gwt/client/JavaScriptExtensionState.java +++ b/src/com/vaadin/shared/JavaScriptExtensionState.java @@ -2,15 +2,14 @@ @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client; +package com.vaadin.shared; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; -import com.vaadin.terminal.gwt.client.JavaScriptConnectorHelper.JavaScriptConnectorState; -import com.vaadin.terminal.gwt.client.communication.SharedState; +import com.vaadin.shared.communication.SharedState; public class JavaScriptExtensionState extends SharedState implements JavaScriptConnectorState { @@ -18,6 +17,7 @@ public class JavaScriptExtensionState extends SharedState implements private Set<String> callbackNames = new HashSet<String>(); private Map<String, Set<String>> rpcInterfaces = new HashMap<String, Set<String>>(); + @Override public Set<String> getCallbackNames() { return callbackNames; } @@ -26,6 +26,7 @@ public class JavaScriptExtensionState extends SharedState implements this.callbackNames = callbackNames; } + @Override public Map<String, Set<String>> getRpcInterfaces() { return rpcInterfaces; } diff --git a/src/com/vaadin/terminal/gwt/client/MouseEventDetails.java b/src/com/vaadin/shared/MouseEventDetails.java index f5ff707eed..bc7ede4c60 100644 --- a/src/com/vaadin/terminal/gwt/client/MouseEventDetails.java +++ b/src/com/vaadin/shared/MouseEventDetails.java @@ -1,7 +1,7 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client; +package com.vaadin.shared; import java.io.Serializable; diff --git a/src/com/vaadin/terminal/gwt/client/VBrowserDetails.java b/src/com/vaadin/shared/VBrowserDetails.java index 6e0417149c..0cd9fe6436 100644 --- a/src/com/vaadin/terminal/gwt/client/VBrowserDetails.java +++ b/src/com/vaadin/shared/VBrowserDetails.java @@ -1,10 +1,11 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client; +package com.vaadin.shared; import java.io.Serializable; +import com.vaadin.terminal.gwt.client.BrowserInfo; import com.vaadin.terminal.gwt.server.WebBrowser; /** diff --git a/src/com/vaadin/terminal/gwt/client/communication/ClientRpc.java b/src/com/vaadin/shared/communication/ClientRpc.java index 45dbe69454..d49bc05260 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/ClientRpc.java +++ b/src/com/vaadin/shared/communication/ClientRpc.java @@ -2,7 +2,7 @@ @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.communication; +package com.vaadin.shared.communication; import java.io.Serializable; diff --git a/src/com/vaadin/terminal/gwt/client/communication/FieldRpc.java b/src/com/vaadin/shared/communication/FieldRpc.java index de464f1fb9..33e6f01028 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/FieldRpc.java +++ b/src/com/vaadin/shared/communication/FieldRpc.java @@ -1,7 +1,7 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.communication; +package com.vaadin.shared.communication; public class FieldRpc { public interface FocusServerRpc extends ServerRpc { diff --git a/src/com/vaadin/terminal/gwt/client/communication/MethodInvocation.java b/src/com/vaadin/shared/communication/MethodInvocation.java index e61775a640..589c7b5d9b 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/MethodInvocation.java +++ b/src/com/vaadin/shared/communication/MethodInvocation.java @@ -2,7 +2,7 @@ @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.communication; +package com.vaadin.shared.communication; import java.io.Serializable; import java.util.Arrays; diff --git a/src/com/vaadin/terminal/gwt/client/communication/ServerRpc.java b/src/com/vaadin/shared/communication/ServerRpc.java index 664c4a391c..5ee42a4bef 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/ServerRpc.java +++ b/src/com/vaadin/shared/communication/ServerRpc.java @@ -2,7 +2,7 @@ @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.communication; +package com.vaadin.shared.communication; import java.io.Serializable; diff --git a/src/com/vaadin/terminal/gwt/client/communication/SharedState.java b/src/com/vaadin/shared/communication/SharedState.java index b087907f9e..2882b1ed07 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/SharedState.java +++ b/src/com/vaadin/shared/communication/SharedState.java @@ -2,11 +2,11 @@ @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.communication; +package com.vaadin.shared.communication; import java.io.Serializable; -import com.vaadin.terminal.gwt.client.Connector; +import com.vaadin.shared.Connector; import com.vaadin.terminal.gwt.client.ServerConnector; import com.vaadin.terminal.gwt.client.ui.AbstractComponentConnector; diff --git a/src/com/vaadin/terminal/gwt/client/communication/URLReference.java b/src/com/vaadin/shared/communication/URLReference.java index 569c4eff47..a4868cdb57 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/URLReference.java +++ b/src/com/vaadin/shared/communication/URLReference.java @@ -1,7 +1,7 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.communication; +package com.vaadin.shared.communication; import java.io.Serializable; diff --git a/src/com/vaadin/terminal/gwt/client/communication/UidlValue.java b/src/com/vaadin/shared/communication/UidlValue.java index 2a21074037..0314488ef3 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/UidlValue.java +++ b/src/com/vaadin/shared/communication/UidlValue.java @@ -2,7 +2,7 @@ @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.communication; +package com.vaadin.shared.communication; import java.io.Serializable; diff --git a/src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/ExecuteJavaScriptRpc.java b/src/com/vaadin/shared/extension/javascriptmanager/ExecuteJavaScriptRpc.java index f1185586d5..097913c37f 100644 --- a/src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/ExecuteJavaScriptRpc.java +++ b/src/com/vaadin/shared/extension/javascriptmanager/ExecuteJavaScriptRpc.java @@ -2,9 +2,9 @@ @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.extensions.javascriptmanager; +package com.vaadin.shared.extension.javascriptmanager; -import com.vaadin.terminal.gwt.client.communication.ClientRpc; +import com.vaadin.shared.communication.ClientRpc; public interface ExecuteJavaScriptRpc extends ClientRpc { public void executeJavaScript(String script); diff --git a/src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/JavaScriptManagerState.java b/src/com/vaadin/shared/extension/javascriptmanager/JavaScriptManagerState.java index fc246aff04..85647d0abd 100644 --- a/src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/JavaScriptManagerState.java +++ b/src/com/vaadin/shared/extension/javascriptmanager/JavaScriptManagerState.java @@ -2,12 +2,12 @@ @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.extensions.javascriptmanager; +package com.vaadin.shared.extension.javascriptmanager; import java.util.HashSet; import java.util.Set; -import com.vaadin.terminal.gwt.client.communication.SharedState; +import com.vaadin.shared.communication.SharedState; public class JavaScriptManagerState extends SharedState { private Set<String> names = new HashSet<String>(); diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbstractLayoutState.java b/src/com/vaadin/shared/ui/AbstractLayoutState.java index fee5ea746a..9eaa11a9c6 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/AbstractLayoutState.java +++ b/src/com/vaadin/shared/ui/AbstractLayoutState.java @@ -1,9 +1,9 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui; +package com.vaadin.shared.ui; -import com.vaadin.terminal.gwt.client.ComponentState; +import com.vaadin.shared.ComponentState; public class AbstractLayoutState extends ComponentState { private int marginsBitmask; diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbstractMediaState.java b/src/com/vaadin/shared/ui/AbstractMediaState.java index 0ab3851671..8cee16575d 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/AbstractMediaState.java +++ b/src/com/vaadin/shared/ui/AbstractMediaState.java @@ -1,13 +1,13 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui; +package com.vaadin.shared.ui; import java.util.ArrayList; import java.util.List; -import com.vaadin.terminal.gwt.client.ComponentState; -import com.vaadin.terminal.gwt.client.communication.URLReference; +import com.vaadin.shared.ComponentState; +import com.vaadin.shared.communication.URLReference; public class AbstractMediaState extends ComponentState { private boolean showControls; diff --git a/src/com/vaadin/terminal/gwt/client/ui/AlignmentInfo.java b/src/com/vaadin/shared/ui/AlignmentInfo.java index 041ab6c1ad..ff800de646 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/AlignmentInfo.java +++ b/src/com/vaadin/shared/ui/AlignmentInfo.java @@ -2,7 +2,7 @@ @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui; +package com.vaadin.shared.ui; public final class AlignmentInfo { /** Bitmask values for client server communication */ diff --git a/src/com/vaadin/terminal/gwt/client/ui/ClickRpc.java b/src/com/vaadin/shared/ui/ClickRpc.java index 37d6443f55..61bde1a5e9 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/ClickRpc.java +++ b/src/com/vaadin/shared/ui/ClickRpc.java @@ -1,10 +1,10 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui; +package com.vaadin.shared.ui; -import com.vaadin.terminal.gwt.client.MouseEventDetails; -import com.vaadin.terminal.gwt.client.communication.ServerRpc; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.communication.ServerRpc; public interface ClickRpc extends ServerRpc { /** diff --git a/src/com/vaadin/terminal/gwt/client/ui/Connect.java b/src/com/vaadin/shared/ui/Connect.java index 0581bdb99c..aa60096eb9 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/Connect.java +++ b/src/com/vaadin/shared/ui/Connect.java @@ -1,14 +1,14 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui; +package com.vaadin.shared.ui; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import com.vaadin.terminal.gwt.client.Connector; +import com.vaadin.shared.Connector; import com.vaadin.terminal.gwt.server.ClientConnector; import com.vaadin.terminal.gwt.widgetsetutils.CustomWidgetMapGenerator; import com.vaadin.terminal.gwt.widgetsetutils.EagerWidgetMapGenerator; diff --git a/src/com/vaadin/terminal/gwt/client/ui/JavaScriptComponentState.java b/src/com/vaadin/shared/ui/JavaScriptComponentState.java index 6728f85ec9..d20b4701c2 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/JavaScriptComponentState.java +++ b/src/com/vaadin/shared/ui/JavaScriptComponentState.java @@ -2,15 +2,15 @@ @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui; +package com.vaadin.shared.ui; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; -import com.vaadin.terminal.gwt.client.ComponentState; -import com.vaadin.terminal.gwt.client.JavaScriptConnectorHelper.JavaScriptConnectorState; +import com.vaadin.shared.ComponentState; +import com.vaadin.shared.JavaScriptConnectorState; public class JavaScriptComponentState extends ComponentState implements JavaScriptConnectorState { @@ -18,6 +18,7 @@ public class JavaScriptComponentState extends ComponentState implements private Set<String> callbackNames = new HashSet<String>(); private Map<String, Set<String>> rpcInterfaces = new HashMap<String, Set<String>>(); + @Override public Set<String> getCallbackNames() { return callbackNames; } @@ -26,6 +27,7 @@ public class JavaScriptComponentState extends ComponentState implements this.callbackNames = callbackNames; } + @Override public Map<String, Set<String>> getRpcInterfaces() { return rpcInterfaces; } diff --git a/src/com/vaadin/terminal/gwt/client/ui/LayoutClickRpc.java b/src/com/vaadin/shared/ui/LayoutClickRpc.java index 5b76f398a9..48e62083b1 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/LayoutClickRpc.java +++ b/src/com/vaadin/shared/ui/LayoutClickRpc.java @@ -1,11 +1,11 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui; +package com.vaadin.shared.ui; -import com.vaadin.terminal.gwt.client.Connector; -import com.vaadin.terminal.gwt.client.MouseEventDetails; -import com.vaadin.terminal.gwt.client.communication.ServerRpc; +import com.vaadin.shared.Connector; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.communication.ServerRpc; public interface LayoutClickRpc extends ServerRpc { /** diff --git a/src/com/vaadin/shared/ui/MediaControl.java b/src/com/vaadin/shared/ui/MediaControl.java new file mode 100644 index 0000000000..0a608a1685 --- /dev/null +++ b/src/com/vaadin/shared/ui/MediaControl.java @@ -0,0 +1,24 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ + +package com.vaadin.shared.ui; + +import com.vaadin.shared.communication.ClientRpc; + +/** + * Server to client RPC interface for controlling playback of the media. + * + * @since 7.0 + */ +public interface MediaControl extends ClientRpc { + /** + * Start playing the media. + */ + public void play(); + + /** + * Pause playback of the media. + */ + public void pause(); +}
\ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/client/ui/TabIndexState.java b/src/com/vaadin/shared/ui/TabIndexState.java index 7ffb328add..774c9b33a0 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/TabIndexState.java +++ b/src/com/vaadin/shared/ui/TabIndexState.java @@ -1,7 +1,7 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui; +package com.vaadin.shared.ui; /** * Interface implemented by state classes that support tab indexes. diff --git a/src/com/vaadin/terminal/gwt/client/ui/VMarginInfo.java b/src/com/vaadin/shared/ui/VMarginInfo.java index 7ba1f4708c..b17a03626f 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VMarginInfo.java +++ b/src/com/vaadin/shared/ui/VMarginInfo.java @@ -2,7 +2,7 @@ @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui; +package com.vaadin.shared.ui; import java.io.Serializable; diff --git a/src/com/vaadin/shared/ui/absolutelayout/AbsoluteLayoutServerRpc.java b/src/com/vaadin/shared/ui/absolutelayout/AbsoluteLayoutServerRpc.java new file mode 100644 index 0000000000..7d1f75f833 --- /dev/null +++ b/src/com/vaadin/shared/ui/absolutelayout/AbsoluteLayoutServerRpc.java @@ -0,0 +1,11 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +package com.vaadin.shared.ui.absolutelayout; + +import com.vaadin.shared.communication.ServerRpc; +import com.vaadin.shared.ui.LayoutClickRpc; + +public interface AbsoluteLayoutServerRpc extends LayoutClickRpc, ServerRpc { + +}
\ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/client/ui/absolutelayout/AbsoluteLayoutState.java b/src/com/vaadin/shared/ui/absolutelayout/AbsoluteLayoutState.java index 4e1a43dd8b..f57b2c0d67 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/absolutelayout/AbsoluteLayoutState.java +++ b/src/com/vaadin/shared/ui/absolutelayout/AbsoluteLayoutState.java @@ -1,13 +1,13 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.absolutelayout; +package com.vaadin.shared.ui.absolutelayout; import java.util.HashMap; import java.util.Map; -import com.vaadin.terminal.gwt.client.Connector; -import com.vaadin.terminal.gwt.client.ui.AbstractLayoutState; +import com.vaadin.shared.Connector; +import com.vaadin.shared.ui.AbstractLayoutState; public class AbsoluteLayoutState extends AbstractLayoutState { // Maps each component to a position diff --git a/src/com/vaadin/terminal/gwt/client/ui/button/ButtonServerRpc.java b/src/com/vaadin/shared/ui/button/ButtonServerRpc.java index 4a379c9262..0e55b07aea 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/button/ButtonServerRpc.java +++ b/src/com/vaadin/shared/ui/button/ButtonServerRpc.java @@ -1,10 +1,10 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.button; +package com.vaadin.shared.ui.button; -import com.vaadin.terminal.gwt.client.MouseEventDetails; -import com.vaadin.terminal.gwt.client.communication.ServerRpc; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.communication.ServerRpc; /** * RPC interface for calls from client to server. diff --git a/src/com/vaadin/terminal/gwt/client/ui/button/ButtonState.java b/src/com/vaadin/shared/ui/button/ButtonState.java index 2daceea0e8..c423e18d46 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/button/ButtonState.java +++ b/src/com/vaadin/shared/ui/button/ButtonState.java @@ -2,10 +2,10 @@ @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.button; +package com.vaadin.shared.ui.button; -import com.vaadin.terminal.gwt.client.ComponentState; -import com.vaadin.terminal.gwt.client.ui.TabIndexState; +import com.vaadin.shared.ComponentState; +import com.vaadin.shared.ui.TabIndexState; import com.vaadin.ui.Button; /** @@ -102,6 +102,7 @@ public class ButtonState extends ComponentState implements TabIndexState { * * @see com.vaadin.terminal.gwt.client.ui.TabIndexState#getTabIndex() */ + @Override public int getTabIndex() { return tabIndex; } @@ -111,6 +112,7 @@ public class ButtonState extends ComponentState implements TabIndexState { * * @see com.vaadin.terminal.gwt.client.ui.TabIndexState#setTabIndex(int) */ + @Override public void setTabIndex(int tabIndex) { this.tabIndex = tabIndex; } diff --git a/src/com/vaadin/terminal/gwt/client/ui/checkbox/CheckBoxServerRpc.java b/src/com/vaadin/shared/ui/checkbox/CheckBoxServerRpc.java index 05091ff6ed..fafd9bf2ff 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/checkbox/CheckBoxServerRpc.java +++ b/src/com/vaadin/shared/ui/checkbox/CheckBoxServerRpc.java @@ -1,10 +1,10 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.checkbox; +package com.vaadin.shared.ui.checkbox; -import com.vaadin.terminal.gwt.client.MouseEventDetails; -import com.vaadin.terminal.gwt.client.communication.ServerRpc; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.communication.ServerRpc; public interface CheckBoxServerRpc extends ServerRpc { public void setChecked(boolean checked, MouseEventDetails mouseEventDetails); diff --git a/src/com/vaadin/terminal/gwt/client/ui/checkbox/CheckBoxState.java b/src/com/vaadin/shared/ui/checkbox/CheckBoxState.java index d6d51cad36..d43959327c 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/checkbox/CheckBoxState.java +++ b/src/com/vaadin/shared/ui/checkbox/CheckBoxState.java @@ -1,9 +1,9 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.checkbox; +package com.vaadin.shared.ui.checkbox; -import com.vaadin.terminal.gwt.client.AbstractFieldState; +import com.vaadin.shared.AbstractFieldState; public class CheckBoxState extends AbstractFieldState { private boolean checked = false; diff --git a/src/com/vaadin/shared/ui/csslayout/CssLayoutServerRpc.java b/src/com/vaadin/shared/ui/csslayout/CssLayoutServerRpc.java new file mode 100644 index 0000000000..0672aa32ce --- /dev/null +++ b/src/com/vaadin/shared/ui/csslayout/CssLayoutServerRpc.java @@ -0,0 +1,11 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +package com.vaadin.shared.ui.csslayout; + +import com.vaadin.shared.communication.ServerRpc; +import com.vaadin.shared.ui.LayoutClickRpc; + +public interface CssLayoutServerRpc extends LayoutClickRpc, ServerRpc { + +}
\ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/client/ui/csslayout/CssLayoutState.java b/src/com/vaadin/shared/ui/csslayout/CssLayoutState.java index 07a8c1804a..03b4a947f5 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/csslayout/CssLayoutState.java +++ b/src/com/vaadin/shared/ui/csslayout/CssLayoutState.java @@ -1,13 +1,13 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.csslayout; +package com.vaadin.shared.ui.csslayout; import java.util.HashMap; import java.util.Map; -import com.vaadin.terminal.gwt.client.Connector; -import com.vaadin.terminal.gwt.client.ui.AbstractLayoutState; +import com.vaadin.shared.Connector; +import com.vaadin.shared.ui.AbstractLayoutState; public class CssLayoutState extends AbstractLayoutState { private Map<Connector, String> childCss = new HashMap<Connector, String>(); diff --git a/src/com/vaadin/terminal/gwt/client/ui/customlayout/CustomLayoutState.java b/src/com/vaadin/shared/ui/customlayout/CustomLayoutState.java index 6b374a8099..4399e0ece1 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/customlayout/CustomLayoutState.java +++ b/src/com/vaadin/shared/ui/customlayout/CustomLayoutState.java @@ -1,13 +1,13 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.customlayout; +package com.vaadin.shared.ui.customlayout; import java.util.HashMap; import java.util.Map; -import com.vaadin.terminal.gwt.client.Connector; -import com.vaadin.terminal.gwt.client.ui.AbstractLayoutState; +import com.vaadin.shared.Connector; +import com.vaadin.shared.ui.AbstractLayoutState; public class CustomLayoutState extends AbstractLayoutState { Map<Connector, String> childLocations = new HashMap<Connector, String>(); diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/AcceptCriterion.java b/src/com/vaadin/shared/ui/dd/AcceptCriterion.java index 8a026e4d2e..19c2e5f273 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/AcceptCriterion.java +++ b/src/com/vaadin/shared/ui/dd/AcceptCriterion.java @@ -2,13 +2,15 @@ @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.dd; +package com.vaadin.shared.ui.dd; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import com.vaadin.terminal.gwt.client.ui.dd.VAcceptCriterion; + /** * An annotation type used to point the server side counterpart for client side * a {@link VAcceptCriterion} class. diff --git a/src/com/vaadin/shared/ui/dd/DragEventType.java b/src/com/vaadin/shared/ui/dd/DragEventType.java new file mode 100644 index 0000000000..e03b347ada --- /dev/null +++ b/src/com/vaadin/shared/ui/dd/DragEventType.java @@ -0,0 +1,9 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ + +package com.vaadin.shared.ui.dd; + +public enum DragEventType { + ENTER, LEAVE, OVER, DROP +}
\ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/HorizontalDropLocation.java b/src/com/vaadin/shared/ui/dd/HorizontalDropLocation.java index 5e90acd6f1..065b880953 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/HorizontalDropLocation.java +++ b/src/com/vaadin/shared/ui/dd/HorizontalDropLocation.java @@ -1,7 +1,7 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.dd; +package com.vaadin.shared.ui.dd; public enum HorizontalDropLocation { LEFT, RIGHT, CENTER diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VerticalDropLocation.java b/src/com/vaadin/shared/ui/dd/VerticalDropLocation.java index de392a0e98..2658921124 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VerticalDropLocation.java +++ b/src/com/vaadin/shared/ui/dd/VerticalDropLocation.java @@ -1,7 +1,7 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.dd; +package com.vaadin.shared.ui.dd; public enum VerticalDropLocation { TOP, BOTTOM, MIDDLE diff --git a/src/com/vaadin/shared/ui/embedded/EmbeddedServerRpc.java b/src/com/vaadin/shared/ui/embedded/EmbeddedServerRpc.java new file mode 100644 index 0000000000..27af1623b0 --- /dev/null +++ b/src/com/vaadin/shared/ui/embedded/EmbeddedServerRpc.java @@ -0,0 +1,10 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +package com.vaadin.shared.ui.embedded; + +import com.vaadin.shared.communication.ServerRpc; +import com.vaadin.shared.ui.ClickRpc; + +public interface EmbeddedServerRpc extends ClickRpc, ServerRpc { +}
\ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/client/ui/form/FormState.java b/src/com/vaadin/shared/ui/form/FormState.java index c1acc0971d..a3035491bf 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/form/FormState.java +++ b/src/com/vaadin/shared/ui/form/FormState.java @@ -1,10 +1,10 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.form; +package com.vaadin.shared.ui.form; -import com.vaadin.terminal.gwt.client.AbstractFieldState; -import com.vaadin.terminal.gwt.client.Connector; +import com.vaadin.shared.AbstractFieldState; +import com.vaadin.shared.Connector; public class FormState extends AbstractFieldState { private Connector layout; diff --git a/src/com/vaadin/shared/ui/gridlayout/GridLayoutServerRpc.java b/src/com/vaadin/shared/ui/gridlayout/GridLayoutServerRpc.java new file mode 100644 index 0000000000..110b9c33f9 --- /dev/null +++ b/src/com/vaadin/shared/ui/gridlayout/GridLayoutServerRpc.java @@ -0,0 +1,11 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +package com.vaadin.shared.ui.gridlayout; + +import com.vaadin.shared.communication.ServerRpc; +import com.vaadin.shared.ui.LayoutClickRpc; + +public interface GridLayoutServerRpc extends LayoutClickRpc, ServerRpc { + +}
\ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/client/ui/gridlayout/GridLayoutState.java b/src/com/vaadin/shared/ui/gridlayout/GridLayoutState.java index 109dc7dea6..9179a61d27 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/gridlayout/GridLayoutState.java +++ b/src/com/vaadin/shared/ui/gridlayout/GridLayoutState.java @@ -1,9 +1,9 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.gridlayout; +package com.vaadin.shared.ui.gridlayout; -import com.vaadin.terminal.gwt.client.ui.AbstractLayoutState; +import com.vaadin.shared.ui.AbstractLayoutState; public class GridLayoutState extends AbstractLayoutState { private boolean spacing = false; diff --git a/src/com/vaadin/shared/ui/label/ContentMode.java b/src/com/vaadin/shared/ui/label/ContentMode.java new file mode 100644 index 0000000000..a58f2cdebb --- /dev/null +++ b/src/com/vaadin/shared/ui/label/ContentMode.java @@ -0,0 +1,46 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +package com.vaadin.shared.ui.label; + +/** + * Content modes defining how the client should interpret a Label's value. + * + * @since 7.0.0 + */ +public enum ContentMode { + /** + * Content mode, where the label contains only plain text. + */ + TEXT, + + /** + * Content mode, where the label contains pre formatted text. In this mode + * newlines are preserved when rendered on the screen. + */ + PREFORMATTED, + + /** + * Content mode, where the label contains XHTML. Care should be taken to + * ensure + */ + XHTML, + + /** + * Content mode, where the label contains well-formed or well-balanced XML. + * This is handled in the same way as {@link #XHTML}. + * + * @deprecated Use {@link #XHTML} instead + */ + @Deprecated + XML, + + /** + * Legacy content mode, where the label contains RAW output. This is handled + * in exactly the same way as {@link #XHTML}. + * + * @deprecated Use {@link #XHTML} instead + */ + @Deprecated + RAW; +} diff --git a/src/com/vaadin/terminal/gwt/client/ui/label/LabelState.java b/src/com/vaadin/shared/ui/label/LabelState.java index 25bbca3c3d..0298e40179 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/label/LabelState.java +++ b/src/com/vaadin/shared/ui/label/LabelState.java @@ -1,9 +1,9 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.label; +package com.vaadin.shared.ui.label; -import com.vaadin.terminal.gwt.client.ComponentState; +import com.vaadin.shared.ComponentState; public class LabelState extends ComponentState { private ContentMode contentMode = ContentMode.TEXT; diff --git a/src/com/vaadin/shared/ui/orderedlayout/AbstractOrderedLayoutServerRpc.java b/src/com/vaadin/shared/ui/orderedlayout/AbstractOrderedLayoutServerRpc.java new file mode 100644 index 0000000000..3de8ec0220 --- /dev/null +++ b/src/com/vaadin/shared/ui/orderedlayout/AbstractOrderedLayoutServerRpc.java @@ -0,0 +1,12 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +package com.vaadin.shared.ui.orderedlayout; + +import com.vaadin.shared.communication.ServerRpc; +import com.vaadin.shared.ui.LayoutClickRpc; + +public interface AbstractOrderedLayoutServerRpc extends LayoutClickRpc, + ServerRpc { + +}
\ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/AbstractOrderedLayoutState.java b/src/com/vaadin/shared/ui/orderedlayout/AbstractOrderedLayoutState.java index 1d57358490..c18a128912 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/AbstractOrderedLayoutState.java +++ b/src/com/vaadin/shared/ui/orderedlayout/AbstractOrderedLayoutState.java @@ -1,14 +1,14 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.orderedlayout; +package com.vaadin.shared.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; +import com.vaadin.shared.Connector; +import com.vaadin.shared.ui.AbstractLayoutState; +import com.vaadin.shared.ui.AlignmentInfo; public class AbstractOrderedLayoutState extends AbstractLayoutState { private boolean spacing = false; diff --git a/src/com/vaadin/shared/ui/panel/PanelServerRpc.java b/src/com/vaadin/shared/ui/panel/PanelServerRpc.java new file mode 100644 index 0000000000..6ed4652070 --- /dev/null +++ b/src/com/vaadin/shared/ui/panel/PanelServerRpc.java @@ -0,0 +1,11 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +package com.vaadin.shared.ui.panel; + +import com.vaadin.shared.communication.ServerRpc; +import com.vaadin.shared.ui.ClickRpc; + +public interface PanelServerRpc extends ClickRpc, ServerRpc { + +}
\ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/client/ui/panel/PanelState.java b/src/com/vaadin/shared/ui/panel/PanelState.java index fc7921825f..ed31ed1ea3 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/panel/PanelState.java +++ b/src/com/vaadin/shared/ui/panel/PanelState.java @@ -1,9 +1,9 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.panel; +package com.vaadin.shared.ui.panel; -import com.vaadin.terminal.gwt.client.ComponentState; +import com.vaadin.shared.ComponentState; public class PanelState extends ComponentState { private int tabIndex; diff --git a/src/com/vaadin/terminal/gwt/client/ui/root/PageClientRpc.java b/src/com/vaadin/shared/ui/root/PageClientRpc.java index a02ecc8ded..c7d587938d 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/root/PageClientRpc.java +++ b/src/com/vaadin/shared/ui/root/PageClientRpc.java @@ -2,9 +2,9 @@ @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.root; +package com.vaadin.shared.ui.root; -import com.vaadin.terminal.gwt.client.communication.ClientRpc; +import com.vaadin.shared.communication.ClientRpc; public interface PageClientRpc extends ClientRpc { diff --git a/src/com/vaadin/shared/ui/root/RootServerRpc.java b/src/com/vaadin/shared/ui/root/RootServerRpc.java new file mode 100644 index 0000000000..2e670553b8 --- /dev/null +++ b/src/com/vaadin/shared/ui/root/RootServerRpc.java @@ -0,0 +1,11 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +package com.vaadin.shared.ui.root; + +import com.vaadin.shared.communication.ServerRpc; +import com.vaadin.shared.ui.ClickRpc; + +public interface RootServerRpc extends ClickRpc, ServerRpc { + +}
\ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/client/ui/root/RootState.java b/src/com/vaadin/shared/ui/root/RootState.java index 85d5e45022..26844cba32 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/root/RootState.java +++ b/src/com/vaadin/shared/ui/root/RootState.java @@ -1,10 +1,10 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.root; +package com.vaadin.shared.ui.root; -import com.vaadin.terminal.gwt.client.ComponentState; -import com.vaadin.terminal.gwt.client.Connector; +import com.vaadin.shared.ComponentState; +import com.vaadin.shared.Connector; public class RootState extends ComponentState { private Connector content; diff --git a/src/com/vaadin/terminal/gwt/client/ui/splitpanel/AbstractSplitPanelRpc.java b/src/com/vaadin/shared/ui/splitpanel/AbstractSplitPanelRpc.java index cc043838ff..e2ebcb0de3 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/splitpanel/AbstractSplitPanelRpc.java +++ b/src/com/vaadin/shared/ui/splitpanel/AbstractSplitPanelRpc.java @@ -1,10 +1,10 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.splitpanel; +package com.vaadin.shared.ui.splitpanel; -import com.vaadin.terminal.gwt.client.MouseEventDetails; -import com.vaadin.terminal.gwt.client.communication.ServerRpc; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.communication.ServerRpc; public interface AbstractSplitPanelRpc extends ServerRpc { diff --git a/src/com/vaadin/terminal/gwt/client/ui/splitpanel/AbstractSplitPanelState.java b/src/com/vaadin/shared/ui/splitpanel/AbstractSplitPanelState.java index db3a39d3a5..d94d5d8608 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/splitpanel/AbstractSplitPanelState.java +++ b/src/com/vaadin/shared/ui/splitpanel/AbstractSplitPanelState.java @@ -1,12 +1,12 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.splitpanel; +package com.vaadin.shared.ui.splitpanel; import java.io.Serializable; -import com.vaadin.terminal.gwt.client.ComponentState; -import com.vaadin.terminal.gwt.client.Connector; +import com.vaadin.shared.ComponentState; +import com.vaadin.shared.Connector; public class AbstractSplitPanelState extends ComponentState { diff --git a/src/com/vaadin/terminal/gwt/client/ui/textarea/TextAreaState.java b/src/com/vaadin/shared/ui/textarea/TextAreaState.java index 71bdd230b7..3b3bd42f87 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/textarea/TextAreaState.java +++ b/src/com/vaadin/shared/ui/textarea/TextAreaState.java @@ -1,9 +1,9 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.textarea; +package com.vaadin.shared.ui.textarea; -import com.vaadin.terminal.gwt.client.ui.textfield.AbstractTextFieldState; +import com.vaadin.shared.ui.textfield.AbstractTextFieldState; public class TextAreaState extends AbstractTextFieldState { diff --git a/src/com/vaadin/terminal/gwt/client/ui/textfield/AbstractTextFieldState.java b/src/com/vaadin/shared/ui/textfield/AbstractTextFieldState.java index d11b049f56..d980eccae2 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/textfield/AbstractTextFieldState.java +++ b/src/com/vaadin/shared/ui/textfield/AbstractTextFieldState.java @@ -1,9 +1,9 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.textfield; +package com.vaadin.shared.ui.textfield; -import com.vaadin.terminal.gwt.client.AbstractFieldState; +import com.vaadin.shared.AbstractFieldState; public class AbstractTextFieldState extends AbstractFieldState { /** diff --git a/src/com/vaadin/terminal/gwt/client/ui/video/VideoState.java b/src/com/vaadin/shared/ui/video/VideoState.java index f59d9ccac1..1dc8d07b7c 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/video/VideoState.java +++ b/src/com/vaadin/shared/ui/video/VideoState.java @@ -1,10 +1,10 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.video; +package com.vaadin.shared.ui.video; -import com.vaadin.terminal.gwt.client.communication.URLReference; -import com.vaadin.terminal.gwt.client.ui.AbstractMediaState; +import com.vaadin.shared.communication.URLReference; +import com.vaadin.shared.ui.AbstractMediaState; public class VideoState extends AbstractMediaState { private URLReference poster; diff --git a/src/com/vaadin/shared/ui/window/WindowServerRpc.java b/src/com/vaadin/shared/ui/window/WindowServerRpc.java new file mode 100644 index 0000000000..11abfae4be --- /dev/null +++ b/src/com/vaadin/shared/ui/window/WindowServerRpc.java @@ -0,0 +1,10 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +package com.vaadin.shared.ui.window; + +import com.vaadin.shared.communication.ServerRpc; +import com.vaadin.shared.ui.ClickRpc; + +public interface WindowServerRpc extends ClickRpc, ServerRpc { +}
\ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/client/ui/window/WindowState.java b/src/com/vaadin/shared/ui/window/WindowState.java index b057d76b16..428bd75167 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/window/WindowState.java +++ b/src/com/vaadin/shared/ui/window/WindowState.java @@ -1,9 +1,9 @@ /* @VaadinApache2LicenseForJavaFiles@ */ -package com.vaadin.terminal.gwt.client.ui.window; +package com.vaadin.shared.ui.window; -import com.vaadin.terminal.gwt.client.ui.panel.PanelState; +import com.vaadin.shared.ui.panel.PanelState; public class WindowState extends PanelState { private boolean modal = false; diff --git a/src/com/vaadin/terminal/AbstractClientConnector.java b/src/com/vaadin/terminal/AbstractClientConnector.java index 9de444d70e..9c68361382 100644 --- a/src/com/vaadin/terminal/AbstractClientConnector.java +++ b/src/com/vaadin/terminal/AbstractClientConnector.java @@ -19,9 +19,9 @@ import java.util.NoSuchElementException; import java.util.logging.Logger; import com.vaadin.Application; -import com.vaadin.terminal.gwt.client.communication.ClientRpc; -import com.vaadin.terminal.gwt.client.communication.ServerRpc; -import com.vaadin.terminal.gwt.client.communication.SharedState; +import com.vaadin.shared.communication.ClientRpc; +import com.vaadin.shared.communication.ServerRpc; +import com.vaadin.shared.communication.SharedState; import com.vaadin.terminal.gwt.server.ClientConnector; import com.vaadin.terminal.gwt.server.ClientMethodInvocation; import com.vaadin.terminal.gwt.server.RpcManager; @@ -69,6 +69,7 @@ public abstract class AbstractClientConnector implements ClientConnector { private ClientConnector parent; /* Documentation copied from interface */ + @Override public void requestRepaint() { Root root = getRoot(); if (root != null) { @@ -125,6 +126,7 @@ public abstract class AbstractClientConnector implements ClientConnector { registerRpc(implementation, type); } + @Override public SharedState getState() { if (null == sharedState) { sharedState = createState(); @@ -164,6 +166,7 @@ public abstract class AbstractClientConnector implements ClientConnector { * * @see com.vaadin.terminal.gwt.server.ClientConnector#getStateType() */ + @Override public Class<? extends SharedState> getStateType() { try { Method m = getClass().getMethod("getState", (Class[]) null); @@ -214,6 +217,7 @@ public abstract class AbstractClientConnector implements ClientConnector { this.connector = connector; } + @Override public Iterator<ClientConnector> iterator() { CombinedIterator<ClientConnector> iterator = new CombinedIterator<ClientConnector>(); iterator.addIterator(connector.getExtensions().iterator()); @@ -236,6 +240,7 @@ public abstract class AbstractClientConnector implements ClientConnector { rpcInterfaceName = rpcInterface.getName().replaceAll("\\$", "."); } + @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { addMethodInvocationToQueue(rpcInterfaceName, method, args); @@ -274,10 +279,12 @@ public abstract class AbstractClientConnector implements ClientConnector { * * @since 7.0 */ + @Override public RpcManager getRpcManager(Class<?> rpcInterface) { return rpcManagerMap.get(rpcInterface); } + @Override public List<ClientMethodInvocation> retrievePendingRpcCalls() { if (pendingInvocations.isEmpty()) { return Collections.emptyList(); @@ -288,6 +295,7 @@ public abstract class AbstractClientConnector implements ClientConnector { } } + @Override public String getConnectorId() { if (connectorId == null) { if (getApplication() == null) { @@ -322,7 +330,8 @@ public abstract class AbstractClientConnector implements ClientConnector { * @return the Root ancestor of this connector, or <code>null</code> if none * is found. */ - protected Root getRoot() { + @Override + public Root getRoot() { ClientConnector connector = this; while (connector != null) { if (connector instanceof Root) { @@ -337,6 +346,7 @@ public abstract class AbstractClientConnector implements ClientConnector { return Logger.getLogger(AbstractClientConnector.class.getName()); } + @Override public void requestRepaintAll() { requestRepaint(); @@ -354,6 +364,7 @@ public abstract class AbstractClientConnector implements ClientConnector { iterators.add(iterator); } + @Override public boolean hasNext() { for (Iterator<? extends T> i : iterators) { if (i.hasNext()) { @@ -363,6 +374,7 @@ public abstract class AbstractClientConnector implements ClientConnector { return false; } + @Override public T next() { for (Iterator<? extends T> i : iterators) { if (i.hasNext()) { @@ -372,6 +384,7 @@ public abstract class AbstractClientConnector implements ClientConnector { throw new NoSuchElementException(); } + @Override public void remove() { throw new UnsupportedOperationException(); } @@ -390,6 +403,7 @@ public abstract class AbstractClientConnector implements ClientConnector { return new AllChildrenIterable(connector); } + @Override public Collection<Extension> getExtensions() { return Collections.unmodifiableCollection(extensions); } @@ -416,12 +430,14 @@ public abstract class AbstractClientConnector implements ClientConnector { requestRepaint(); } + @Override public void removeExtension(Extension extension) { extension.setParent(null); extensions.remove(extension); requestRepaint(); } + @Override public void setParent(ClientConnector parent) { // If the parent is not changed, don't do anything @@ -448,10 +464,12 @@ public abstract class AbstractClientConnector implements ClientConnector { } } + @Override public ClientConnector getParent() { return parent; } + @Override public void attach() { requestRepaint(); @@ -471,6 +489,7 @@ public abstract class AbstractClientConnector implements ClientConnector { * <code>null</code> after this method is called. * </p> */ + @Override public void detach() { for (ClientConnector connector : getAllChildrenIterable(this)) { connector.detach(); @@ -479,6 +498,7 @@ public abstract class AbstractClientConnector implements ClientConnector { getRoot().getConnectorTracker().unregisterConnector(this); } + @Override public boolean isConnectorEnabled() { if (getParent() == null) { // No parent -> the component cannot receive updates from the client diff --git a/src/com/vaadin/terminal/AbstractErrorMessage.java b/src/com/vaadin/terminal/AbstractErrorMessage.java index 3f526f7339..f7cd0e6aad 100644 --- a/src/com/vaadin/terminal/AbstractErrorMessage.java +++ b/src/com/vaadin/terminal/AbstractErrorMessage.java @@ -68,6 +68,7 @@ public abstract class AbstractErrorMessage implements ErrorMessage { } /* Documented in interface */ + @Override public ErrorLevel getErrorLevel() { return level; } @@ -92,6 +93,7 @@ public abstract class AbstractErrorMessage implements ErrorMessage { causes.add(cause); } + @Override public String getFormattedHtmlMessage() { String result = null; switch (getMode()) { diff --git a/src/com/vaadin/terminal/AbstractJavaScriptExtension.java b/src/com/vaadin/terminal/AbstractJavaScriptExtension.java index bdcd948c74..df44c3edd5 100644 --- a/src/com/vaadin/terminal/AbstractJavaScriptExtension.java +++ b/src/com/vaadin/terminal/AbstractJavaScriptExtension.java @@ -4,7 +4,8 @@ package com.vaadin.terminal; -import com.vaadin.terminal.gwt.client.JavaScriptExtensionState; +import com.vaadin.shared.JavaScriptExtensionState; +import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.ui.JavaScriptCallback; /** @@ -34,9 +35,9 @@ import com.vaadin.ui.JavaScriptCallback; * the connector's parent. If <code>connectorId</code> is provided, the id of * the parent of the corresponding connector with the passed id is returned * instead.</li> - * <li><code>getWidgetElement([connectorId])</code> - returns the DOM Element - * that is the root of a connector's widget. <code>null</code> is returned if - * the connector can not be found or if the connector doesn't have a widget. If + * <li><code>getElement([connectorId])</code> - returns the DOM Element that is + * the root of a connector's widget. <code>null</code> is returned if the + * connector can not be found or if the connector doesn't have a widget. If * <code>connectorId</code> is not provided, the connector id of the current * connector will be used.</li> * <li><code>getState()</code> - returns an object corresponding to the shared @@ -63,6 +64,9 @@ import com.vaadin.ui.JavaScriptCallback; * exception when called. The scheme for conversion between Java types in the * RPC interface and the JavaScript values that should be passed to the * functions is described bellow.</li> + * <li><code>translateVaadinUri(uri)</code> - Translates a Vaadin URI to a URL + * that can be used in the browser. This is just way of accessing + * {@link ApplicationConnection#translateVaadinUri(String)}</li> * </ul> * The connector wrapper also supports these special functions: * <ul> @@ -139,8 +143,9 @@ public abstract class AbstractJavaScriptExtension extends AbstractExtension { /** * Invoke a named function that the connector JavaScript has added to the * JavaScript connector wrapper object. The arguments should only contain - * data types that can be represented in JavaScript, including primitive - * boxing types, arrays, String, List, Set, Map, Connector and JavaBeans. + * data types that can be represented in JavaScript including primitives, + * their boxed types, arrays, String, List, Set, Map, Connector and + * JavaBeans. * * @param name * the name of the function diff --git a/src/com/vaadin/terminal/ClassResource.java b/src/com/vaadin/terminal/ClassResource.java index e7419576f1..b74c8e7bb7 100644 --- a/src/com/vaadin/terminal/ClassResource.java +++ b/src/com/vaadin/terminal/ClassResource.java @@ -89,6 +89,7 @@ public class ClassResource implements ApplicationResource, Serializable { * * @see com.vaadin.terminal.Resource#getMIMEType() */ + @Override public String getMIMEType() { return FileTypeResolver.getMIMEType(resourceName); } @@ -98,6 +99,7 @@ public class ClassResource implements ApplicationResource, Serializable { * * @see com.vaadin.terminal.ApplicationResource#getApplication() */ + @Override public Application getApplication() { return application; } @@ -108,6 +110,7 @@ public class ClassResource implements ApplicationResource, Serializable { * @return the file name associated to this resource. * @see com.vaadin.terminal.ApplicationResource#getFilename() */ + @Override public String getFilename() { int index = 0; int next = 0; @@ -123,6 +126,7 @@ public class ClassResource implements ApplicationResource, Serializable { * * @see com.vaadin.terminal.ApplicationResource#getStream() */ + @Override public DownloadStream getStream() { final DownloadStream ds = new DownloadStream( associatedClass.getResourceAsStream(resourceName), @@ -133,6 +137,7 @@ public class ClassResource implements ApplicationResource, Serializable { } /* documented in superclass */ + @Override public int getBufferSize() { return bufferSize; } @@ -148,6 +153,7 @@ public class ClassResource implements ApplicationResource, Serializable { } /* documented in superclass */ + @Override public long getCacheTime() { return cacheTime; } diff --git a/src/com/vaadin/terminal/CombinedRequest.java b/src/com/vaadin/terminal/CombinedRequest.java index abf5e0412a..5b92feb39a 100644 --- a/src/com/vaadin/terminal/CombinedRequest.java +++ b/src/com/vaadin/terminal/CombinedRequest.java @@ -63,6 +63,7 @@ public class CombinedRequest implements WrappedRequest { } + @Override public String getParameter(String parameter) { String[] strings = getParameterMap().get(parameter); if (strings == null || strings.length == 0) { @@ -72,48 +73,60 @@ public class CombinedRequest implements WrappedRequest { } } + @Override public Map<String, String[]> getParameterMap() { return parameterMap; } + @Override public int getContentLength() { return secondRequest.getContentLength(); } + @Override public InputStream getInputStream() throws IOException { return secondRequest.getInputStream(); } + @Override public Object getAttribute(String name) { return secondRequest.getAttribute(name); } + @Override public void setAttribute(String name, Object value) { secondRequest.setAttribute(name, value); } + @Override public String getRequestPathInfo() { return secondRequest.getParameter("initialPath"); } + @Override public int getSessionMaxInactiveInterval() { return secondRequest.getSessionMaxInactiveInterval(); } + @Override public Object getSessionAttribute(String name) { return secondRequest.getSessionAttribute(name); } + @Override public void setSessionAttribute(String name, Object attribute) { secondRequest.setSessionAttribute(name, attribute); } + @Override public String getContentType() { return secondRequest.getContentType(); } + @Override public BrowserDetails getBrowserDetails() { return new BrowserDetails() { + @Override public String getUriFragment() { String fragment = secondRequest.getParameter("fr"); if (fragment == null) { @@ -123,10 +136,12 @@ public class CombinedRequest implements WrappedRequest { } } + @Override public String getWindowName() { return secondRequest.getParameter("wn"); } + @Override public WebBrowser getWebBrowser() { WebApplicationContext context = (WebApplicationContext) Application .getCurrent().getContext(); @@ -145,22 +160,27 @@ public class CombinedRequest implements WrappedRequest { return secondRequest; } + @Override public Locale getLocale() { return secondRequest.getLocale(); } + @Override public String getRemoteAddr() { return secondRequest.getRemoteAddr(); } + @Override public boolean isSecure() { return secondRequest.isSecure(); } + @Override public String getHeader(String name) { return secondRequest.getHeader(name); } + @Override public DeploymentConfiguration getDeploymentConfiguration() { return secondRequest.getDeploymentConfiguration(); } diff --git a/src/com/vaadin/terminal/DeploymentConfiguration.java b/src/com/vaadin/terminal/DeploymentConfiguration.java index 02a3f0200f..ddb42349d8 100644 --- a/src/com/vaadin/terminal/DeploymentConfiguration.java +++ b/src/com/vaadin/terminal/DeploymentConfiguration.java @@ -5,6 +5,10 @@ package com.vaadin.terminal; import java.io.Serializable; +import java.util.Properties; + +import javax.portlet.PortletContext; +import javax.servlet.ServletContext; /** * Provide deployment specific settings that are required outside terminal @@ -83,4 +87,27 @@ public interface DeploymentConfiguration extends Serializable { * @return the class loader to use, or <code>null</code> */ public ClassLoader getClassLoader(); + + /** + * Returns the MIME type of the specified file, or null if the MIME type is + * not known. The MIME type is determined by the configuration of the + * container, and may be specified in a deployment descriptor. Common MIME + * types are "text/html" and "image/gif". + * + * @param resourceName + * a String specifying the name of a file + * @return a String specifying the file's MIME type + * + * @see ServletContext#getMimeType(String) + * @see PortletContext#getMimeType(String) + */ + public String getMimeType(String resourceName); + + /** + * Gets the properties configured for the deployment, e.g. as init + * parameters to the servlet or portlet. + * + * @return properties for the application. + */ + public Properties getInitParameters(); } diff --git a/src/com/vaadin/terminal/ExternalResource.java b/src/com/vaadin/terminal/ExternalResource.java index 0abff91638..84fcc65a44 100644 --- a/src/com/vaadin/terminal/ExternalResource.java +++ b/src/com/vaadin/terminal/ExternalResource.java @@ -100,6 +100,7 @@ public class ExternalResource implements Resource, Serializable { * * @see com.vaadin.terminal.Resource#getMIMEType() */ + @Override public String getMIMEType() { if (mimeType == null) { mimeType = FileTypeResolver.getMIMEType(getURL().toString()); diff --git a/src/com/vaadin/terminal/FileResource.java b/src/com/vaadin/terminal/FileResource.java index 8dc3b00fd0..e3c9f0172a 100644 --- a/src/com/vaadin/terminal/FileResource.java +++ b/src/com/vaadin/terminal/FileResource.java @@ -61,6 +61,7 @@ public class FileResource implements ApplicationResource { * * @see com.vaadin.terminal.ApplicationResource#getStream() */ + @Override public DownloadStream getStream() { try { final DownloadStream ds = new DownloadStream(new FileInputStream( @@ -74,6 +75,7 @@ public class FileResource implements ApplicationResource { // Log the exception using the application error handler getApplication().getErrorHandler().terminalError(new ErrorEvent() { + @Override public Throwable getThrowable() { return e; } @@ -106,6 +108,7 @@ public class FileResource implements ApplicationResource { /** * @see com.vaadin.terminal.ApplicationResource#getApplication() */ + @Override public Application getApplication() { return application; } @@ -113,6 +116,7 @@ public class FileResource implements ApplicationResource { /** * @see com.vaadin.terminal.ApplicationResource#getFilename() */ + @Override public String getFilename() { return sourceFile.getName(); } @@ -120,6 +124,7 @@ public class FileResource implements ApplicationResource { /** * @see com.vaadin.terminal.Resource#getMIMEType() */ + @Override public String getMIMEType() { return FileTypeResolver.getMIMEType(sourceFile); } @@ -132,6 +137,7 @@ public class FileResource implements ApplicationResource { * * @return Cache time in milliseconds. */ + @Override public long getCacheTime() { return cacheTime; } @@ -150,6 +156,7 @@ public class FileResource implements ApplicationResource { } /* documented in superclass */ + @Override public int getBufferSize() { return bufferSize; } diff --git a/src/com/vaadin/terminal/JavaScriptCallbackHelper.java b/src/com/vaadin/terminal/JavaScriptCallbackHelper.java index 01db0267d9..131875a5a4 100644 --- a/src/com/vaadin/terminal/JavaScriptCallbackHelper.java +++ b/src/com/vaadin/terminal/JavaScriptCallbackHelper.java @@ -14,8 +14,8 @@ import java.util.Set; import com.vaadin.external.json.JSONArray; import com.vaadin.external.json.JSONException; +import com.vaadin.shared.JavaScriptConnectorState; import com.vaadin.terminal.gwt.client.JavaScriptConnectorHelper; -import com.vaadin.terminal.gwt.client.JavaScriptConnectorHelper.JavaScriptConnectorState; import com.vaadin.tools.ReflectTools; import com.vaadin.ui.AbstractJavaScriptComponent; import com.vaadin.ui.JavaScript.JavaScriptCallbackRpc; @@ -65,6 +65,7 @@ public class JavaScriptCallbackHelper implements Serializable { private void ensureRpc() { if (javascriptCallbackRpc == null) { javascriptCallbackRpc = new JavaScriptCallbackRpc() { + @Override public void call(String name, JSONArray arguments) { JavaScriptCallback callback = callbacks.get(name); try { diff --git a/src/com/vaadin/terminal/Page.java b/src/com/vaadin/terminal/Page.java index 8ccb243a1e..a068e7573e 100644 --- a/src/com/vaadin/terminal/Page.java +++ b/src/com/vaadin/terminal/Page.java @@ -12,9 +12,9 @@ import java.util.LinkedList; import java.util.List; import com.vaadin.event.EventRouter; +import com.vaadin.shared.ui.root.PageClientRpc; import com.vaadin.terminal.WrappedRequest.BrowserDetails; import com.vaadin.terminal.gwt.client.ui.notification.VNotification; -import com.vaadin.terminal.gwt.client.ui.root.PageClientRpc; import com.vaadin.terminal.gwt.client.ui.root.VRoot; import com.vaadin.terminal.gwt.server.WebApplicationContext; import com.vaadin.terminal.gwt.server.WebBrowser; diff --git a/src/com/vaadin/terminal/StreamResource.java b/src/com/vaadin/terminal/StreamResource.java index 1e13169292..1afd91dc08 100644 --- a/src/com/vaadin/terminal/StreamResource.java +++ b/src/com/vaadin/terminal/StreamResource.java @@ -79,6 +79,7 @@ public class StreamResource implements ApplicationResource { /** * @see com.vaadin.terminal.Resource#getMIMEType() */ + @Override public String getMIMEType() { if (MIMEType != null) { return MIMEType; @@ -123,6 +124,7 @@ public class StreamResource implements ApplicationResource { * * @return the filename. */ + @Override public String getFilename() { return filename; } @@ -140,6 +142,7 @@ public class StreamResource implements ApplicationResource { /** * @see com.vaadin.terminal.ApplicationResource#getApplication() */ + @Override public Application getApplication() { return application; } @@ -147,6 +150,7 @@ public class StreamResource implements ApplicationResource { /** * @see com.vaadin.terminal.ApplicationResource#getStream() */ + @Override public DownloadStream getStream() { final StreamSource ss = getStreamSource(); if (ss == null) { @@ -176,6 +180,7 @@ public class StreamResource implements ApplicationResource { } /* documented in superclass */ + @Override public int getBufferSize() { return bufferSize; } @@ -191,6 +196,7 @@ public class StreamResource implements ApplicationResource { } /* documented in superclass */ + @Override public long getCacheTime() { return cacheTime; } diff --git a/src/com/vaadin/terminal/ThemeResource.java b/src/com/vaadin/terminal/ThemeResource.java index d456047653..41674b2373 100644 --- a/src/com/vaadin/terminal/ThemeResource.java +++ b/src/com/vaadin/terminal/ThemeResource.java @@ -89,6 +89,7 @@ public class ThemeResource implements Resource { /** * @see com.vaadin.terminal.Resource#getMIMEType() */ + @Override public String getMIMEType() { return FileTypeResolver.getMIMEType(getResourceId()); } diff --git a/src/com/vaadin/terminal/gwt/DefaultWidgetSet.gwt.xml b/src/com/vaadin/terminal/gwt/DefaultWidgetSet.gwt.xml index 697bf992e9..278d92f38f 100644 --- a/src/com/vaadin/terminal/gwt/DefaultWidgetSet.gwt.xml +++ b/src/com/vaadin/terminal/gwt/DefaultWidgetSet.gwt.xml @@ -6,93 +6,8 @@ <!-- Hint for WidgetSetBuilder not to automatically update the file --> <!-- WS Compiler: manually edited --> - <inherits name="com.google.gwt.user.User" /> - - <inherits name="com.google.gwt.http.HTTP" /> - - <inherits name="com.google.gwt.json.JSON" /> - - <inherits - name="com.vaadin.terminal.gwt.DefaultWidgetSetBrowserSpecificOverrides" /> - - <source path="client" /> - - <!-- TODO only for development --> - <replace-with class="com.vaadin.terminal.gwt.client.ui.VerticalBoxLayoutConnector"> - <when-type-is class="com.vaadin.terminal.gwt.client.ui.orderedlayout.VerticalLayoutConnector" /> - </replace-with> - <replace-with class="com.vaadin.terminal.gwt.client.ui.HorizontalBoxLayoutConnector"> - <when-type-is class="com.vaadin.terminal.gwt.client.ui.orderedlayout.HorizontalLayoutConnector" /> - </replace-with> - - <!-- Use own Scheduler implementation to be able to track if commands are - running --> - <replace-with class="com.vaadin.terminal.gwt.client.VSchedulerImpl"> - <when-type-is class="com.google.gwt.core.client.impl.SchedulerImpl" /> - </replace-with> - - - <!-- Generators for serializators for classes used in communication between - server and client --> - <generate-with - class="com.vaadin.terminal.gwt.widgetsetutils.SerializerMapGenerator"> - <when-type-is - class="com.vaadin.terminal.gwt.client.communication.SerializerMap" /> - </generate-with> - - <replace-with class="com.vaadin.terminal.gwt.client.VDebugConsole"> - <when-type-is class="com.vaadin.terminal.gwt.client.Console" /> - </replace-with> - - <generate-with - class="com.vaadin.terminal.gwt.widgetsetutils.EagerWidgetMapGenerator"> - <when-type-is class="com.vaadin.terminal.gwt.client.WidgetMap" /> - </generate-with> - - <generate-with - class="com.vaadin.terminal.gwt.widgetsetutils.AcceptCriteriaFactoryGenerator"> - <when-type-is - class="com.vaadin.terminal.gwt.client.ui.dd.VAcceptCriterionFactory" /> - </generate-with> - - <!-- Generate client side proxies for client to server RPC interfaces --> - <generate-with - class="com.vaadin.terminal.gwt.widgetsetutils.RpcProxyGenerator"> - <when-type-assignable - class="com.vaadin.terminal.gwt.client.communication.ServerRpc" /> - </generate-with> - - <!-- Generate client side proxies for client to server RPC interfaces --> - <generate-with - class="com.vaadin.terminal.gwt.widgetsetutils.RpcProxyCreatorGenerator"> - <when-type-assignable - class="com.vaadin.terminal.gwt.client.communication.RpcProxy.RpcProxyCreator" /> - </generate-with> - - <!-- Generate client side RPC manager for server to client RPC --> - <generate-with - class="com.vaadin.terminal.gwt.widgetsetutils.GeneratedRpcMethodProviderGenerator"> - <when-type-assignable - class="com.vaadin.terminal.gwt.client.communication.GeneratedRpcMethodProvider" /> - </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> + <inherits name="com.vaadin.Vaadin" /> <entry-point class="com.vaadin.terminal.gwt.client.ApplicationConfiguration" /> - <!-- Use the new cross site linker to get a nocache.js without document.write --> - <add-linker name="xsiframe" /> - - <set-configuration-property name="devModeRedirectEnabled" value="true" /> - </module> diff --git a/src/com/vaadin/terminal/gwt/DefaultWidgetSetBrowserSpecificOverrides.gwt.xml b/src/com/vaadin/terminal/gwt/VaadinBrowserSpecificOverrides.gwt.xml index b5ab61df64..b5ab61df64 100644 --- a/src/com/vaadin/terminal/gwt/DefaultWidgetSetBrowserSpecificOverrides.gwt.xml +++ b/src/com/vaadin/terminal/gwt/VaadinBrowserSpecificOverrides.gwt.xml diff --git a/src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java b/src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java index 960b0a8b0e..71707e723a 100644 --- a/src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java +++ b/src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java @@ -23,6 +23,8 @@ import com.vaadin.terminal.gwt.client.ui.UnknownComponentConnector; public class ApplicationConfiguration implements EntryPoint { + public static final String PORTLET_RESOUCE_URL_BASE = "portletAppURLBase"; + /** * Helper class for reading configuration options from the bootstap * javascript @@ -205,8 +207,6 @@ public class ApplicationConfiguration implements EntryPoint { private ErrorMessage communicationError; private ErrorMessage authorizationError; private boolean useDebugIdInDom = true; - private boolean usePortletURLs = false; - private String portletUidlURLBase; private HashMap<Integer, String> unknownComponents; @@ -218,7 +218,7 @@ public class ApplicationConfiguration implements EntryPoint { static// TODO consider to make this hashmap per application LinkedList<Command> callbacks = new LinkedList<Command>(); - private static int widgetsLoading; + private static int dependenciesLoading; private static ArrayList<ApplicationConnection> runningApplications = new ArrayList<ApplicationConnection>(); @@ -226,11 +226,12 @@ public class ApplicationConfiguration implements EntryPoint { private Map<Integer, String> tagToServerSideClassName = new HashMap<Integer, String>(); public boolean usePortletURLs() { - return usePortletURLs; + return getPortletResourceUrl() != null; } - public String getPortletUidlURLBase() { - return portletUidlURLBase; + public String getPortletResourceUrl() { + return getJsoConfiguration(id) + .getConfigString(PORTLET_RESOUCE_URL_BASE); } public String getRootPanelId() { @@ -319,12 +320,6 @@ public class ApplicationConfiguration implements EntryPoint { useDebugIdInDom = jsoConfiguration.getConfigBoolean("useDebugIdInDom") != Boolean.FALSE; // null -> false - usePortletURLs = jsoConfiguration.getConfigBoolean("usePortletURLs") == Boolean.TRUE; - - portletUidlURLBase = jsoConfiguration - .getConfigString("portletUidlURLBase"); - - // null -> false standalone = jsoConfiguration.getConfigBoolean("standalone") == Boolean.TRUE; communicationError = jsoConfiguration.getConfigError("comErrMsg"); @@ -348,6 +343,7 @@ public class ApplicationConfiguration implements EntryPoint { public static void startApplication(final String applicationId) { Scheduler.get().scheduleDeferred(new ScheduledCommand() { + @Override public void execute() { ApplicationConfiguration appConf = getConfigFromDOM(applicationId); ApplicationConnection a = GWT @@ -454,26 +450,26 @@ public class ApplicationConfiguration implements EntryPoint { * * @param c */ - static void runWhenWidgetsLoaded(Command c) { - if (widgetsLoading == 0) { + static void runWhenDependenciesLoaded(Command c) { + if (dependenciesLoading == 0) { c.execute(); } else { callbacks.add(c); } } - static void startWidgetLoading() { - widgetsLoading++; + static void startDependencyLoading() { + dependenciesLoading++; } - static void endWidgetLoading() { - widgetsLoading--; - if (widgetsLoading == 0 && !callbacks.isEmpty()) { + static void endDependencyLoading() { + dependenciesLoading--; + if (dependenciesLoading == 0 && !callbacks.isEmpty()) { for (Command cmd : callbacks) { cmd.execute(); } callbacks.clear(); - } else if (widgetsLoading == 0 && deferredWidgetLoader != null) { + } else if (dependenciesLoading == 0 && deferredWidgetLoader != null) { deferredWidgetLoader.trigger(); } @@ -534,7 +530,7 @@ public class ApplicationConfiguration implements EntryPoint { } private boolean isBusy() { - if (widgetsLoading > 0) { + if (dependenciesLoading > 0) { communicationFree = 0; return true; } @@ -553,6 +549,7 @@ public class ApplicationConfiguration implements EntryPoint { private static DeferredWidgetLoader deferredWidgetLoader; + @Override public void onModuleLoad() { // Prepare VConsole for debugging @@ -571,6 +568,7 @@ public class ApplicationConfiguration implements EntryPoint { */ GWT.setUncaughtExceptionHandler(new UncaughtExceptionHandler() { + @Override public void onUncaughtException(Throwable e) { /* * Note in case of null console (without ?debug) we eat @@ -581,6 +579,11 @@ public class ApplicationConfiguration implements EntryPoint { } }); + if (SuperDevMode.enableBasedOnParameter()) { + // Do not start any application as super dev mode will refresh the + // page once done compiling + return; + } registerCallback(GWT.getModuleName()); deferredWidgetLoader = new DeferredWidgetLoader(); } diff --git a/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java b/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java index f0470c8ee8..fb7af1404c 100644 --- a/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java +++ b/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java @@ -27,6 +27,7 @@ import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.http.client.RequestCallback; import com.google.gwt.http.client.RequestException; import com.google.gwt.http.client.Response; +import com.google.gwt.http.client.URL; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONString; @@ -35,21 +36,23 @@ import com.google.gwt.regexp.shared.RegExp; 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.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.HasWidgets; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.ComponentState; +import com.vaadin.shared.communication.MethodInvocation; +import com.vaadin.shared.communication.SharedState; +import com.vaadin.shared.communication.UidlValue; import com.vaadin.terminal.gwt.client.ApplicationConfiguration.ErrorMessage; +import com.vaadin.terminal.gwt.client.ResourceLoader.ResourceLoadEvent; +import com.vaadin.terminal.gwt.client.ResourceLoader.ResourceLoadListener; import com.vaadin.terminal.gwt.client.communication.HasJavaScriptConnectorHelper; import com.vaadin.terminal.gwt.client.communication.JsonDecoder; import com.vaadin.terminal.gwt.client.communication.JsonEncoder; -import com.vaadin.terminal.gwt.client.communication.MethodInvocation; import com.vaadin.terminal.gwt.client.communication.RpcManager; import com.vaadin.terminal.gwt.client.communication.SerializerMap; -import com.vaadin.terminal.gwt.client.communication.SharedState; import com.vaadin.terminal.gwt.client.communication.StateChangeEvent; import com.vaadin.terminal.gwt.client.communication.Type; -import com.vaadin.terminal.gwt.client.communication.UidlValue; import com.vaadin.terminal.gwt.client.extensions.AbstractExtensionConnector; import com.vaadin.terminal.gwt.client.ui.AbstractComponentConnector; import com.vaadin.terminal.gwt.client.ui.VContextMenu; @@ -75,6 +78,19 @@ import com.vaadin.terminal.gwt.server.AbstractCommunicationManager; * Entry point classes (widgetsets) define <code>onModuleLoad()</code>. */ public class ApplicationConnection { + public static final String APP_REQUEST_PATH = "APP/"; + + public static final String UIDL_REQUEST_PATH = "UIDL/"; + + public static final String APP_PROTOCOL_PREFIX = "app://"; + + public static final String V_RESOURCE_PATH = "v-resourcePath"; + + public static final String CONNECTOR_PROTOCOL_PREFIX = "connector://"; + + public static final String CONNECTOR_RESOURCE_PREFIX = APP_REQUEST_PATH + + "CONNECTOR"; + // This indicates the whole page is generated by us (not embedded) public static final String GENERATED_BODY_CLASSNAME = "v-generated-body"; @@ -131,7 +147,7 @@ public class ApplicationConnection { */ public static final String UIDL_REFRESH_TOKEN = "Vaadin-Refresh"; - private final boolean debugLogging = false; + private final boolean debugLogging = true || false; // will hold the UIDL security key (for XSS protection) once received private String uidlSecurityKey = "init"; @@ -506,12 +522,7 @@ public class ApplicationConnection { final String payload = uidlSecurityKey + VAR_BURST_SEPARATOR + requestData; VConsole.log("Making UIDL Request with params: " + payload); - String uri; - if (configuration.usePortletURLs()) { - uri = configuration.getPortletUidlURLBase(); - } else { - uri = getAppUri() + "UIDL"; - } + String uri = translateVaadinUri(APP_PROTOCOL_PREFIX + UIDL_REQUEST_PATH); if (extraParams != null && extraParams.length() > 0) { uri = addGetParameters(uri, extraParams); @@ -538,11 +549,13 @@ public class ApplicationConnection { final boolean synchronous) { if (!synchronous) { RequestCallback requestCallback = new RequestCallback() { + @Override public void onError(Request request, Throwable exception) { showCommunicationError(exception.getMessage(), -1); endRequest(); } + @Override public void onResponseReceived(Request request, Response response) { VConsole.log("Server visit took " @@ -868,6 +881,7 @@ public class ApplicationConnection { } // deferring to avoid flickering Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { if (!hasActiveRequest()) { hideLoadingIndicator(); @@ -1067,6 +1081,14 @@ public class ApplicationConnection { json.getValueMap("typeMappings"), widgetSet); } + VConsole.log("Handling resource dependencies"); + if (json.containsKey("scriptDependencies")) { + loadScriptDependencies(json.getJSStringArray("scriptDependencies")); + } + if (json.containsKey("styleDependencies")) { + loadStyleDependencies(json.getJSStringArray("styleDependencies")); + } + handleUIDLDuration.logDuration( " * Handling type mappings from server completed", 10); /* @@ -1077,6 +1099,7 @@ public class ApplicationConnection { } Command c = new Command() { + @Override public void execute() { handleUIDLDuration.logDuration(" * Loading widgets completed", 10); @@ -1608,7 +1631,72 @@ public class ApplicationConnection { } }; - ApplicationConfiguration.runWhenWidgetsLoaded(c); + ApplicationConfiguration.runWhenDependenciesLoaded(c); + } + + private void loadStyleDependencies(JsArrayString dependencies) { + // Assuming no reason to interpret in a defined order + ResourceLoadListener resourceLoadListener = new ResourceLoadListener() { + @Override + public void onLoad(ResourceLoadEvent event) { + ApplicationConfiguration.endDependencyLoading(); + } + + @Override + public void onError(ResourceLoadEvent event) { + VConsole.error(event.getResourceUrl() + + " could not be loaded, or the load detection failed because the stylesheet is empty."); + // The show must go on + onLoad(event); + } + }; + ResourceLoader loader = ResourceLoader.get(); + for (int i = 0; i < dependencies.length(); i++) { + String url = translateVaadinUri(dependencies.get(i)); + ApplicationConfiguration.startDependencyLoading(); + loader.loadStylesheet(url, resourceLoadListener); + } + } + + private void loadScriptDependencies(final JsArrayString dependencies) { + if (dependencies.length() == 0) { + return; + } + + // Listener that loads the next when one is completed + ResourceLoadListener resourceLoadListener = new ResourceLoadListener() { + @Override + public void onLoad(ResourceLoadEvent event) { + if (dependencies.length() != 0) { + String url = translateVaadinUri(dependencies.shift()); + ApplicationConfiguration.startDependencyLoading(); + // Load next in chain (hopefully already preloaded) + event.getResourceLoader().loadScript(url, this); + } + // Call start for next before calling end for current + ApplicationConfiguration.endDependencyLoading(); + } + + @Override + public void onError(ResourceLoadEvent event) { + VConsole.error(event.getResourceUrl() + " could not be loaded."); + // The show must go on + onLoad(event); + } + }; + + ResourceLoader loader = ResourceLoader.get(); + + // Start chain by loading first + String url = translateVaadinUri(dependencies.shift()); + ApplicationConfiguration.startDependencyLoading(); + loader.loadScript(url, resourceLoadListener); + + // Preload all remaining + for (int i = 0; i < dependencies.length(); i++) { + String preloadUrl = translateVaadinUri(dependencies.get(i)); + loader.preloadResource(preloadUrl, null); + } } // Redirect browser, null reloads current page @@ -1669,6 +1757,7 @@ public class ApplicationConnection { } private final ScheduledCommand sendPendingCommand = new ScheduledCommand() { + @Override public void execute() { deferedSendPending = false; doSendPendingVariableChanges(); @@ -2214,8 +2303,42 @@ public class ApplicationConnection { } uidlUri = themeUri + uidlUri.substring(7); } - if (uidlUri.startsWith("app://")) { - uidlUri = getAppUri() + uidlUri.substring(6); + + if (uidlUri.startsWith(CONNECTOR_PROTOCOL_PREFIX)) { + // getAppUri *should* always end with / + // substring *should* always start with / (connector:///foo.bar + // without connector://) + uidlUri = APP_PROTOCOL_PREFIX + CONNECTOR_RESOURCE_PREFIX + + uidlUri.substring(CONNECTOR_PROTOCOL_PREFIX.length()); + // Let translation of app:// urls take care of the rest + } + if (uidlUri.startsWith(APP_PROTOCOL_PREFIX)) { + String relativeUrl = uidlUri + .substring(APP_PROTOCOL_PREFIX.length()); + if (getConfiguration().usePortletURLs()) { + // Should put path in v-resourcePath parameter and append query + // params to base portlet url + String[] parts = relativeUrl.split("\\?", 2); + String path = parts[0]; + + String url = getConfiguration().getPortletResourceUrl(); + + // If there's a "?" followed by something, append it as a query + // string to the base URL + if (parts.length > 1) { + String appUrlParams = parts[1]; + url = addGetParameters(url, appUrlParams); + } + if (!path.startsWith("/")) { + path = '/' + path; + } + String pathParam = V_RESOURCE_PATH + "=" + + URL.encodeQueryString(path); + url = addGetParameters(url, pathParam); + uidlUri = url; + } else { + uidlUri = getAppUri() + relativeUrl; + } } return uidlUri; } @@ -2242,6 +2365,7 @@ public class ApplicationConnection { this.url = url; } + @Override public void notificationHidden(HideEvent event) { redirect(url); } @@ -2250,57 +2374,8 @@ public class ApplicationConnection { /* Extended title handling */ - /** - * Data showed in tooltips are stored centrilized as it may be needed in - * varios place: caption, layouts, and in owner components themselves. - * - * Updating TooltipInfo is done in updateComponent method. - * - */ - public TooltipInfo getTooltipTitleInfo(ComponentConnector titleOwner, - Object key) { - if (null == titleOwner) { - return null; - } - return connectorMap.getTooltipInfo(titleOwner, key); - } - private final VTooltip tooltip = new VTooltip(this); - /** - * Component may want to delegate Tooltip handling to client. Layouts add - * Tooltip (description, errors) to caption, but some components may want - * them to appear one other elements too. - * - * Events wanted by this handler are same as in Tooltip.TOOLTIP_EVENTS - * - * @param event - * @param owner - */ - public void handleTooltipEvent(Event event, ComponentConnector owner) { - tooltip.handleTooltipEvent(event, owner, null); - - } - - /** - * Component may want to delegate Tooltip handling to client. Layouts add - * Tooltip (description, errors) to caption, but some components may want - * them to appear one other elements too. - * - * Events wanted by this handler are same as in Tooltip.TOOLTIP_EVENTS - * - * @param event - * @param owner - * @param key - * the key for tooltip if this is "additional" tooltip, null for - * components "main tooltip" - */ - public void handleTooltipEvent(Event event, ComponentConnector owner, - Object key) { - tooltip.handleTooltipEvent(event, owner, key); - - } - private ConnectorMap connectorMap = GWT.create(ConnectorMap.class); protected String getUidlSecurityKey() { @@ -2328,34 +2403,6 @@ public class ApplicationConnection { } /** - * If component has several tooltips in addition to the one provided by - * {@link com.vaadin.ui.AbstractComponent}, component can register them with - * this method. - * <p> - * Component must also pipe events to - * {@link #handleTooltipEvent(Event, ComponentConnector, Object)} method. - * <p> - * This method can also be used to deregister tooltips by using null as - * tooltip - * - * @param paintable - * Paintable "owning" this tooltip - * @param key - * key assosiated with given tooltip. Can be any object. For - * example a related dom element. Same key must be given for - * {@link #handleTooltipEvent(Event, ComponentConnector, Object)} - * method. - * - * @param tooltip - * the TooltipInfo object containing details shown in tooltip, - * null if deregistering tooltip - */ - public void registerTooltip(ComponentConnector paintable, Object key, - TooltipInfo tooltip) { - connectorMap.registerTooltip(paintable, key, tooltip); - } - - /** * Gets the {@link ApplicationConfiguration} for the current application. * * @see ApplicationConfiguration @@ -2437,15 +2484,15 @@ public class ApplicationConnection { // connectorMap.unregisterConnector(p); } + /** + * Get VTooltip instance related to application connection + * + * @return VTooltip instance + */ public VTooltip getVTooltip() { return tooltip; } - @Deprecated - public void handleTooltipEvent(Event event, Widget owner, Object key) { - handleTooltipEvent(event, getConnectorMap().getConnector(owner), key); - } - /** * Method provided for backwards compatibility. Duties previously done by * this method is now handled by the state change event handler in @@ -2474,17 +2521,6 @@ public class ApplicationConnection { } @Deprecated - public void handleTooltipEvent(Event event, Widget owner) { - handleTooltipEvent(event, getConnectorMap().getConnector(owner)); - - } - - @Deprecated - public void registerTooltip(Widget owner, Object key, TooltipInfo info) { - registerTooltip(getConnectorMap().getConnector(owner), key, info); - } - - @Deprecated public boolean hasEventListeners(Widget widget, String eventIdentifier) { return hasEventListeners(getConnectorMap().getConnector(widget), eventIdentifier); diff --git a/src/com/vaadin/terminal/gwt/client/BrowserInfo.java b/src/com/vaadin/terminal/gwt/client/BrowserInfo.java index 82cf925ec1..32bb0b8eed 100644 --- a/src/com/vaadin/terminal/gwt/client/BrowserInfo.java +++ b/src/com/vaadin/terminal/gwt/client/BrowserInfo.java @@ -5,6 +5,7 @@ package com.vaadin.terminal.gwt.client; import com.google.gwt.user.client.ui.RootPanel; +import com.vaadin.shared.VBrowserDetails; /** * Class used to query information about web browser. diff --git a/src/com/vaadin/terminal/gwt/client/ComponentConnector.java b/src/com/vaadin/terminal/gwt/client/ComponentConnector.java index 4e6a690a3c..e57a188b47 100644 --- a/src/com/vaadin/terminal/gwt/client/ComponentConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ComponentConnector.java @@ -4,7 +4,9 @@ package com.vaadin.terminal.gwt.client; +import com.google.gwt.dom.client.Element; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.ComponentState; /** * An interface used by client-side widgets or paintable parts to receive @@ -21,6 +23,7 @@ public interface ComponentConnector extends ServerConnector { * * @see com.vaadin.terminal.gwt.client.VPaintable#getState() */ + @Override public ComponentState getState(); /** @@ -104,4 +107,14 @@ public interface ComponentConnector extends ServerConnector { */ public void setWidgetEnabled(boolean widgetEnabled); + /** + * Gets the tooltip info for the given element. + * + * @param element + * The element to lookup a tooltip for + * @return The tooltip for the element or null if no tooltip is defined for + * this element. + */ + public TooltipInfo getTooltipInfo(Element element); + } diff --git a/src/com/vaadin/terminal/gwt/client/ComponentLocator.java b/src/com/vaadin/terminal/gwt/client/ComponentLocator.java index 0e7a0c1d1c..8df9dc41b9 100644 --- a/src/com/vaadin/terminal/gwt/client/ComponentLocator.java +++ b/src/com/vaadin/terminal/gwt/client/ComponentLocator.java @@ -12,7 +12,9 @@ import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.HasWidgets; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.Widget; -import com.vaadin.terminal.gwt.client.communication.SharedState; +import com.vaadin.shared.ComponentState; +import com.vaadin.shared.Connector; +import com.vaadin.shared.communication.SharedState; import com.vaadin.terminal.gwt.client.ui.SubPartAware; import com.vaadin.terminal.gwt.client.ui.VBoxLayout; import com.vaadin.terminal.gwt.client.ui.gridlayout.VGridLayout; diff --git a/src/com/vaadin/terminal/gwt/client/ConnectorMap.java b/src/com/vaadin/terminal/gwt/client/ConnectorMap.java index efb50b5e00..8bc4a4aacf 100644 --- a/src/com/vaadin/terminal/gwt/client/ConnectorMap.java +++ b/src/com/vaadin/terminal/gwt/client/ConnectorMap.java @@ -200,49 +200,11 @@ public class ConnectorMap { return idToConnector.size(); } - /** - * FIXME: Should be moved to VAbstractPaintableWidget - * - * @param paintable - * @return - */ - @Deprecated - public TooltipInfo getTooltipInfo(ComponentConnector paintable, Object key) { - ComponentDetail componentDetail = getComponentDetail(paintable); - if (componentDetail == null) { - return null; - } - return componentDetail.getTooltipInfo(key); - } - - @Deprecated - public TooltipInfo getWidgetTooltipInfo(Widget widget, Object key) { - ComponentConnector connector = getConnector(widget); - if (connector == null) { - return null; - } - return getTooltipInfo(connector, key); - } - public Collection<? extends ServerConnector> getConnectors() { return Collections.unmodifiableCollection(idToConnector.values()); } /** - * FIXME: Should not be here - * - * @param componentConnector - * @return - */ - @Deprecated - public void registerTooltip(ComponentConnector componentConnector, - Object key, TooltipInfo tooltip) { - getComponentDetail(componentConnector).putAdditionalTooltip(key, - tooltip); - - } - - /** * Tests if the widget is the root widget of a {@link ComponentConnector}. * * @param widget diff --git a/src/com/vaadin/terminal/gwt/client/EventHelper.java b/src/com/vaadin/terminal/gwt/client/EventHelper.java index 95f5125f1b..208768a0c1 100644 --- a/src/com/vaadin/terminal/gwt/client/EventHelper.java +++ b/src/com/vaadin/terminal/gwt/client/EventHelper.java @@ -3,8 +3,8 @@ */ package com.vaadin.terminal.gwt.client; -import static com.vaadin.terminal.gwt.client.EventId.BLUR; -import static com.vaadin.terminal.gwt.client.EventId.FOCUS; +import static com.vaadin.shared.EventId.BLUR; +import static com.vaadin.shared.EventId.FOCUS; import com.google.gwt.event.dom.client.BlurEvent; import com.google.gwt.event.dom.client.BlurHandler; diff --git a/src/com/vaadin/terminal/gwt/client/JavaScriptConnectorHelper.java b/src/com/vaadin/terminal/gwt/client/JavaScriptConnectorHelper.java index bd62a759cb..69b8e00603 100644 --- a/src/com/vaadin/terminal/gwt/client/JavaScriptConnectorHelper.java +++ b/src/com/vaadin/terminal/gwt/client/JavaScriptConnectorHelper.java @@ -15,18 +15,13 @@ import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.json.client.JSONArray; import com.google.gwt.user.client.Element; -import com.vaadin.terminal.gwt.client.communication.MethodInvocation; +import com.vaadin.shared.JavaScriptConnectorState; +import com.vaadin.shared.communication.MethodInvocation; import com.vaadin.terminal.gwt.client.communication.StateChangeEvent; import com.vaadin.terminal.gwt.client.communication.StateChangeEvent.StateChangeHandler; public class JavaScriptConnectorHelper { - public interface JavaScriptConnectorState { - public Set<String> getCallbackNames(); - - public Map<String, Set<String>> getRpcInterfaces(); - } - private final ServerConnector connector; private final JavaScriptObject nativeState = JavaScriptObject .createObject(); @@ -49,6 +44,7 @@ public class JavaScriptConnectorHelper { public void init() { connector.addStateChangeHandler(new StateChangeHandler() { + @Override public void onStateChanged(StateChangeEvent stateChangeEvent) { JavaScriptObject wrapper = getConnectorWrapper(); JavaScriptConnectorState state = getConnectorState(); @@ -149,8 +145,9 @@ public class JavaScriptConnectorHelper { private JavaScriptObject getConnectorWrapper() { if (connectorWrapper == null) { - connectorWrapper = createConnectorWrapper(this, nativeState, - rpcMap, connector.getConnectorId(), rpcObjects); + connectorWrapper = createConnectorWrapper(this, + connector.getConnection(), nativeState, rpcMap, + connector.getConnectorId(), rpcObjects); } return connectorWrapper; @@ -165,9 +162,9 @@ public class JavaScriptConnectorHelper { }-*/; private static native JavaScriptObject createConnectorWrapper( - JavaScriptConnectorHelper h, JavaScriptObject nativeState, - JavaScriptObject registeredRpc, String connectorId, - Map<String, JavaScriptObject> rpcObjects) + JavaScriptConnectorHelper h, ApplicationConnection c, + JavaScriptObject nativeState, JavaScriptObject registeredRpc, + String connectorId, Map<String, JavaScriptObject> rpcObjects) /*-{ return { 'getConnectorId': function() { @@ -185,7 +182,7 @@ public class JavaScriptConnectorHelper { } return rpcObjects.@java.util.Map::get(Ljava/lang/Object;)(iface); }), - 'getWidgetElement': $entry(function(connectorId) { + 'getElement': $entry(function(connectorId) { return h.@com.vaadin.terminal.gwt.client.JavaScriptConnectorHelper::getWidgetElement(Ljava/lang/String;)(connectorId); }), 'registerRpc': function(iface, rpcHandler) { @@ -199,6 +196,9 @@ public class JavaScriptConnectorHelper { } registeredRpc[iface].push(rpcHandler); }, + 'translateVaadinUri': $entry(function(uri) { + return c.@com.vaadin.terminal.gwt.client.ApplicationConnection::translateVaadinUri(Ljava/lang/String;)(uri); + }), }; }-*/; @@ -238,8 +238,8 @@ public class JavaScriptConnectorHelper { return connector; } - return ConnectorMap.get(connector.getConnection()) - .getConnector(connectorId); + return ConnectorMap.get(connector.getConnection()).getConnector( + connectorId); } private void fireRpc(String iface, String method, @@ -331,9 +331,9 @@ public class JavaScriptConnectorHelper { invokeCallback(getConnectorWrapper(), callbackName, arguments); } else { JavaScriptObject arguments = parametersJson.getJavaScriptObject(); - invokeJsRpc(rpcMap, iface, method, arguments); + invokeJsRpc(rpcMap, iface, method, arguments, getConnectorWrapper()); // Also invoke wildcard interface - invokeJsRpc(rpcMap, "", method, arguments); + invokeJsRpc(rpcMap, "", method, arguments, getConnectorWrapper()); } } @@ -344,7 +344,8 @@ public class JavaScriptConnectorHelper { }-*/; private static native void invokeJsRpc(JavaScriptObject rpcMap, - String interfaceName, String methodName, JavaScriptObject parameters) + String interfaceName, String methodName, + JavaScriptObject parameters, JavaScriptObject connector) /*-{ var targets = rpcMap[interfaceName]; if (!targets) { @@ -352,7 +353,7 @@ public class JavaScriptConnectorHelper { } for(var i = 0; i < targets.length; i++) { var target = targets[i]; - target[methodName].apply(target, parameters); + target[methodName].apply(connector, parameters); } }-*/; diff --git a/src/com/vaadin/terminal/gwt/client/JavaScriptExtension.java b/src/com/vaadin/terminal/gwt/client/JavaScriptExtension.java index 2a97e4a770..a2170b9ab9 100644 --- a/src/com/vaadin/terminal/gwt/client/JavaScriptExtension.java +++ b/src/com/vaadin/terminal/gwt/client/JavaScriptExtension.java @@ -4,10 +4,11 @@ package com.vaadin.terminal.gwt.client; +import com.vaadin.shared.JavaScriptExtensionState; +import com.vaadin.shared.ui.Connect; import com.vaadin.terminal.AbstractJavaScriptExtension; import com.vaadin.terminal.gwt.client.communication.HasJavaScriptConnectorHelper; import com.vaadin.terminal.gwt.client.extensions.AbstractExtensionConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; @Connect(AbstractJavaScriptExtension.class) public final class JavaScriptExtension extends AbstractExtensionConnector @@ -21,6 +22,7 @@ public final class JavaScriptExtension extends AbstractExtensionConnector helper.init(); } + @Override public JavaScriptConnectorHelper getJavascriptConnectorHelper() { return helper; } diff --git a/src/com/vaadin/terminal/gwt/client/MouseEventDetailsBuilder.java b/src/com/vaadin/terminal/gwt/client/MouseEventDetailsBuilder.java index 58dd488351..d39f98a024 100644 --- a/src/com/vaadin/terminal/gwt/client/MouseEventDetailsBuilder.java +++ b/src/com/vaadin/terminal/gwt/client/MouseEventDetailsBuilder.java @@ -6,6 +6,7 @@ package com.vaadin.terminal.gwt.client; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.user.client.Event; +import com.vaadin.shared.MouseEventDetails; /** * Helper class for constructing a MouseEventDetails object from a diff --git a/src/com/vaadin/terminal/gwt/client/NullConsole.java b/src/com/vaadin/terminal/gwt/client/NullConsole.java index 2d15ffd46c..7db513ca82 100644 --- a/src/com/vaadin/terminal/gwt/client/NullConsole.java +++ b/src/com/vaadin/terminal/gwt/client/NullConsole.java @@ -15,39 +15,48 @@ import com.google.gwt.core.client.GWT; */ public class NullConsole implements Console { + @Override public void dirUIDL(ValueMap u, ApplicationConfiguration cnf) { } + @Override public void error(String msg) { GWT.log(msg); } + @Override public void log(String msg) { GWT.log(msg); } + @Override public void printObject(Object msg) { GWT.log(msg.toString()); } + @Override public void printLayoutProblems(ValueMap meta, ApplicationConnection applicationConnection, Set<ComponentConnector> zeroHeightComponents, Set<ComponentConnector> zeroWidthComponents) { } + @Override public void log(Throwable e) { GWT.log(e.getMessage(), e); } + @Override public void error(Throwable e) { // Borrow exception handling from VDebugConsole VDebugConsole.handleError(e, this); } + @Override public void setQuietMode(boolean quietDebugMode) { } + @Override public void init() { } diff --git a/src/com/vaadin/terminal/gwt/client/ResourceLoader.java b/src/com/vaadin/terminal/gwt/client/ResourceLoader.java new file mode 100644 index 0000000000..21577ce87e --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ResourceLoader.java @@ -0,0 +1,540 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ + +package com.vaadin.terminal.gwt.client; + +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import com.google.gwt.core.client.Duration; +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.RepeatingCommand; +import com.google.gwt.dom.client.AnchorElement; +import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.LinkElement; +import com.google.gwt.dom.client.NodeList; +import com.google.gwt.dom.client.ObjectElement; +import com.google.gwt.dom.client.ScriptElement; +import com.google.gwt.user.client.Timer; + +/** + * ResourceLoader lets you dynamically include external scripts and styles on + * the page and lets you know when the resource has been loaded. + * + * You can also preload resources, allowing them to get cached by the browser + * without being evaluated. This enables downloading multiple resources at once + * while still controlling in which order e.g. scripts are executed. + * + * @author Vaadin Ltd + * @version @VERSION@ + * @since 7.0.0 + */ +public class ResourceLoader { + /** + * Event fired when a resource has been loaded. + */ + public static class ResourceLoadEvent { + private ResourceLoader loader; + private String resourceUrl; + private final boolean preload; + + /** + * Creates a new event. + * + * @param loader + * the resource loader that has loaded the resource + * @param resourceUrl + * the url of the loaded resource + * @param preload + * true if the resource has only been preloaded, false if + * it's fully loaded + */ + public ResourceLoadEvent(ResourceLoader loader, String resourceUrl, + boolean preload) { + this.loader = loader; + this.resourceUrl = resourceUrl; + this.preload = preload; + } + + /** + * Gets the resource loader that has fired this event + * + * @return the resource loader + */ + public ResourceLoader getResourceLoader() { + return loader; + } + + /** + * Gets the absolute url of the loaded resource. + * + * @return the absolute url of the loaded resource + */ + public String getResourceUrl() { + return resourceUrl; + } + + /** + * Returns true if the resource has been preloaded, false if it's fully + * loaded + * + * @see ResourceLoader#preloadResource(String, ResourceLoadListener) + * + * @return true if the resource has been preloaded, false if it's fully + * loaded + */ + public boolean isPreload() { + return preload; + } + } + + /** + * Event listener that gets notified when a resource has been loaded + */ + public interface ResourceLoadListener { + /** + * Notifies this ResourceLoadListener that a resource has been loaded. + * Some browsers do not support any way of detecting load errors. In + * these cases, onLoad will be called regardless of the status. + * + * @see ResourceLoadEvent + * + * @param event + * a resource load event with information about the loaded + * resource + */ + public void onLoad(ResourceLoadEvent event); + + /** + * Notifies this ResourceLoadListener that a resource could not be + * loaded, e.g. because the file could not be found or because the + * server did not respond. Some browsers do not support any way of + * detecting load errors. In these cases, onLoad will be called + * regardless of the status. + * + * @see ResourceLoadEvent + * + * @param event + * a resource load event with information about the resource + * that could not be loaded. + */ + public void onError(ResourceLoadEvent event); + } + + private static final ResourceLoader INSTANCE = GWT + .create(ResourceLoader.class); + + private ApplicationConnection connection; + + private final Set<String> loadedResources = new HashSet<String>(); + private final Set<String> preloadedResources = new HashSet<String>(); + + private final Map<String, Collection<ResourceLoadListener>> loadListeners = new HashMap<String, Collection<ResourceLoadListener>>(); + private final Map<String, Collection<ResourceLoadListener>> preloadListeners = new HashMap<String, Collection<ResourceLoadListener>>(); + + private final Element head; + + /** + * Creates a new resource loader. You should generally not create you own + * resource loader, but instead use {@link ResourceLoader#get()} to get an + * instance. + */ + protected ResourceLoader() { + Document document = Document.get(); + head = document.getElementsByTagName("head").getItem(0); + + // detect already loaded scripts and stylesheets + NodeList<Element> scripts = document.getElementsByTagName("script"); + for (int i = 0; i < scripts.getLength(); i++) { + ScriptElement element = ScriptElement.as(scripts.getItem(i)); + String src = element.getSrc(); + if (src != null && src.length() != 0) { + loadedResources.add(src); + } + } + + NodeList<Element> links = document.getElementsByTagName("link"); + for (int i = 0; i < links.getLength(); i++) { + LinkElement linkElement = LinkElement.as(links.getItem(i)); + String rel = linkElement.getRel(); + String href = linkElement.getHref(); + if ("stylesheet".equalsIgnoreCase(rel) && href != null + && href.length() != 0) { + loadedResources.add(href); + } + } + } + + /** + * Returns the default ResourceLoader + * + * @return the default ResourceLoader + */ + public static ResourceLoader get() { + return INSTANCE; + } + + /** + * Load a script and notify a listener when the script is loaded. Calling + * this method when the script is currently loading or already loaded + * doesn't cause the script to be loaded again, but the listener will still + * be notified when appropriate. + * + * + * @param scriptUrl + * the url of the script to load + * @param resourceLoadListener + * the listener that will get notified when the script is loaded + */ + public void loadScript(final String scriptUrl, + final ResourceLoadListener resourceLoadListener) { + final String url = getAbsoluteUrl(scriptUrl); + ResourceLoadEvent event = new ResourceLoadEvent(this, url, false); + if (loadedResources.contains(url)) { + if (resourceLoadListener != null) { + resourceLoadListener.onLoad(event); + } + return; + } + + if (preloadListeners.containsKey(url)) { + // Preload going on, continue when preloaded + preloadResource(url, new ResourceLoadListener() { + @Override + public void onLoad(ResourceLoadEvent event) { + loadScript(url, resourceLoadListener); + } + + @Override + public void onError(ResourceLoadEvent event) { + // Preload failed -> signal error to own listener + if (resourceLoadListener != null) { + resourceLoadListener.onError(event); + } + } + }); + return; + } + + if (addListener(url, resourceLoadListener, loadListeners)) { + ScriptElement scriptTag = Document.get().createScriptElement(); + scriptTag.setSrc(url); + scriptTag.setType("text/javascript"); + addOnloadHandler(scriptTag, new ResourceLoadListener() { + @Override + public void onLoad(ResourceLoadEvent event) { + fireLoad(event); + } + + @Override + public void onError(ResourceLoadEvent event) { + fireError(event); + } + }, event); + head.appendChild(scriptTag); + } + } + + private static String getAbsoluteUrl(String url) { + AnchorElement a = Document.get().createAnchorElement(); + a.setHref(url); + return a.getHref(); + } + + /** + * Download a resource and notify a listener when the resource is loaded + * without attempting to interpret the resource. When a resource has been + * preloaded, it will be present in the browser's cache (provided the HTTP + * headers allow caching), making a subsequent load operation complete + * without having to wait for the resource to be downloaded again. + * + * Calling this method when the resource is currently loading, currently + * preloading, already preloaded or already loaded doesn't cause the + * resource to be preloaded again, but the listener will still be notified + * when appropriate. + * + * @param url + * the url of the resource to preload + * @param resourceLoadListener + * the listener that will get notified when the resource is + * preloaded + */ + public void preloadResource(String url, + ResourceLoadListener resourceLoadListener) { + url = getAbsoluteUrl(url); + ResourceLoadEvent event = new ResourceLoadEvent(this, url, true); + if (loadedResources.contains(url) || preloadedResources.contains(url)) { + // Already loaded or preloaded -> just fire listener + if (resourceLoadListener != null) { + resourceLoadListener.onLoad(event); + } + return; + } + + if (addListener(url, resourceLoadListener, preloadListeners) + && !loadListeners.containsKey(url)) { + // Inject loader element if this is the first time this is preloaded + // AND the resources isn't already being loaded in the normal way + + Element element = getPreloadElement(url); + addOnloadHandler(element, new ResourceLoadListener() { + @Override + public void onLoad(ResourceLoadEvent event) { + fireLoad(event); + } + + @Override + public void onError(ResourceLoadEvent event) { + fireError(event); + } + }, event); + + // TODO Remove object when loaded (without causing spinner in FF) + Document.get().getBody().appendChild(element); + } + } + + private static Element getPreloadElement(String url) { + if (BrowserInfo.get().isIE()) { + ScriptElement element = Document.get().createScriptElement(); + element.setSrc(url); + element.setType("text/cache"); + return element; + } else { + ObjectElement element = Document.get().createObjectElement(); + element.setData(url); + element.setType("text/plain"); + element.setHeight("0px"); + element.setWidth("0px"); + return element; + } + } + + private native void addOnloadHandler(Element element, + ResourceLoadListener listener, ResourceLoadEvent event) + /*-{ + element.onload = $entry(function() { + element.onload = null; + element.onerror = null; + element.onreadystatechange = null; + listener.@com.vaadin.terminal.gwt.client.ResourceLoader.ResourceLoadListener::onLoad(Lcom/vaadin/terminal/gwt/client/ResourceLoader$ResourceLoadEvent;)(event); + }); + element.onerror = $entry(function() { + element.onload = null; + element.onerror = null; + element.onreadystatechange = null; + listener.@com.vaadin.terminal.gwt.client.ResourceLoader.ResourceLoadListener::onError(Lcom/vaadin/terminal/gwt/client/ResourceLoader$ResourceLoadEvent;)(event); + }); + element.onreadystatechange = function() { + if ("loaded" === element.readyState || "complete" === element.readyState ) { + element.onload(arguments[0]); + } + }; + }-*/; + + /** + * Load a stylesheet and notify a listener when the stylesheet is loaded. + * Calling this method when the stylesheet is currently loading or already + * loaded doesn't cause the stylesheet to be loaded again, but the listener + * will still be notified when appropriate. + * + * @param stylesheetUrl + * the url of the stylesheet to load + * @param resourceLoadListener + * the listener that will get notified when the stylesheet is + * loaded + */ + public void loadStylesheet(final String stylesheetUrl, + final ResourceLoadListener resourceLoadListener) { + final String url = getAbsoluteUrl(stylesheetUrl); + final ResourceLoadEvent event = new ResourceLoadEvent(this, url, false); + if (loadedResources.contains(url)) { + if (resourceLoadListener != null) { + resourceLoadListener.onLoad(event); + } + return; + } + + if (preloadListeners.containsKey(url)) { + // Preload going on, continue when preloaded + preloadResource(url, new ResourceLoadListener() { + @Override + public void onLoad(ResourceLoadEvent event) { + loadStylesheet(url, resourceLoadListener); + } + + @Override + public void onError(ResourceLoadEvent event) { + // Preload failed -> signal error to own listener + if (resourceLoadListener != null) { + resourceLoadListener.onError(event); + } + } + }); + return; + } + + if (addListener(url, resourceLoadListener, loadListeners)) { + LinkElement linkElement = Document.get().createLinkElement(); + linkElement.setRel("stylesheet"); + linkElement.setType("text/css"); + linkElement.setHref(url); + + if (BrowserInfo.get().isSafari()) { + // Safari doesn't fire any events for link elements + // See http://www.phpied.com/when-is-a-stylesheet-really-loaded/ + Scheduler.get().scheduleFixedPeriod(new RepeatingCommand() { + private final Duration duration = new Duration(); + + @Override + public boolean execute() { + int styleSheetLength = getStyleSheetLength(url); + if (getStyleSheetLength(url) > 0) { + fireLoad(event); + return false; // Stop repeating + } else if (styleSheetLength == 0) { + // "Loaded" empty sheet -> most likely 404 error + fireError(event); + return true; + } else if (duration.elapsedMillis() > 60 * 1000) { + fireError(event); + return false; + } else { + return true; // Continue repeating + } + } + }, 10); + } else { + addOnloadHandler(linkElement, new ResourceLoadListener() { + @Override + public void onLoad(ResourceLoadEvent event) { + // Chrome && IE fires load for errors, must check + // stylesheet data + if (BrowserInfo.get().isChrome() + || BrowserInfo.get().isIE()) { + int styleSheetLength = getStyleSheetLength(url); + // Error if there's an empty stylesheet + if (styleSheetLength == 0) { + fireError(event); + return; + } + } + fireLoad(event); + } + + @Override + public void onError(ResourceLoadEvent event) { + fireError(event); + } + }, event); + if (BrowserInfo.get().isOpera()) { + // Opera onerror never fired, assume error if no onload in x + // seconds + new Timer() { + @Override + public void run() { + if (!loadedResources.contains(url)) { + fireError(event); + } + } + }.schedule(5 * 1000); + } + } + + head.appendChild(linkElement); + } + } + + private static native int getStyleSheetLength(String url) + /*-{ + for(var i = 0; i < $doc.styleSheets.length; i++) { + if ($doc.styleSheets[i].href === url) { + var sheet = $doc.styleSheets[i]; + try { + var rules = sheet.cssRules + if (rules === undefined) { + rules = sheet.rules; + } + + if (rules === null) { + // Style sheet loaded, but can't access length because of XSS -> assume there's something there + return 1; + } + + // Return length so we can distinguish 0 (probably 404 error) from normal case. + return rules.length; + } catch (err) { + return 1; + } + } + } + // No matching stylesheet found -> not yet loaded + return -1; + }-*/; + + private static boolean addListener(String url, + ResourceLoadListener listener, + Map<String, Collection<ResourceLoadListener>> listenerMap) { + Collection<ResourceLoadListener> listeners = listenerMap.get(url); + if (listeners == null) { + listeners = new HashSet<ResourceLoader.ResourceLoadListener>(); + listeners.add(listener); + listenerMap.put(url, listeners); + return true; + } else { + listeners.add(listener); + return false; + } + } + + private void fireError(ResourceLoadEvent event) { + String resource = event.getResourceUrl(); + + Collection<ResourceLoadListener> listeners; + if (event.isPreload()) { + // Also fire error for load listeners + fireError(new ResourceLoadEvent(this, resource, false)); + listeners = preloadListeners.remove(resource); + } else { + listeners = loadListeners.remove(resource); + } + if (listeners != null && !listeners.isEmpty()) { + for (ResourceLoadListener listener : listeners) { + if (listener != null) { + listener.onError(event); + } + } + } + } + + private void fireLoad(ResourceLoadEvent event) { + String resource = event.getResourceUrl(); + Collection<ResourceLoadListener> listeners; + if (event.isPreload()) { + preloadedResources.add(resource); + listeners = preloadListeners.remove(resource); + } else { + if (preloadListeners.containsKey(resource)) { + // Also fire preload events for potential listeners + fireLoad(new ResourceLoadEvent(this, resource, true)); + } + preloadedResources.remove(resource); + loadedResources.add(resource); + listeners = loadListeners.remove(resource); + } + if (listeners != null && !listeners.isEmpty()) { + for (ResourceLoadListener listener : listeners) { + if (listener != null) { + listener.onLoad(event); + } + } + } + } + +} diff --git a/src/com/vaadin/terminal/gwt/client/ServerConnector.java b/src/com/vaadin/terminal/gwt/client/ServerConnector.java index fcf5100c8e..a0f08b92b9 100644 --- a/src/com/vaadin/terminal/gwt/client/ServerConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ServerConnector.java @@ -8,7 +8,8 @@ import java.util.List; 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.shared.Connector; +import com.vaadin.shared.communication.ClientRpc; import com.vaadin.terminal.gwt.client.communication.StateChangeEvent.StateChangeHandler; /** @@ -102,6 +103,7 @@ public interface ServerConnector extends Connector { * @return The parent of this connector, as set by * {@link #setParent(ServerConnector)}. */ + @Override public ServerConnector getParent(); /** diff --git a/src/com/vaadin/terminal/gwt/client/SimpleTree.java b/src/com/vaadin/terminal/gwt/client/SimpleTree.java index 350e0d707d..506d990aac 100644 --- a/src/com/vaadin/terminal/gwt/client/SimpleTree.java +++ b/src/com/vaadin/terminal/gwt/client/SimpleTree.java @@ -49,6 +49,7 @@ public class SimpleTree extends ComplexPanel { getElement().appendChild(children); addDomHandler(new ClickHandler() { + @Override public void onClick(ClickEvent event) { if (event.getNativeEvent().getEventTarget().cast() == handle) { if (children.getStyle().getDisplay().intern() == Display.NONE diff --git a/src/com/vaadin/terminal/gwt/client/SuperDevMode.java b/src/com/vaadin/terminal/gwt/client/SuperDevMode.java new file mode 100644 index 0000000000..e435b3c6ed --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/SuperDevMode.java @@ -0,0 +1,253 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +package com.vaadin.terminal.gwt.client; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.JavaScriptObject; +import com.google.gwt.http.client.UrlBuilder; +import com.google.gwt.jsonp.client.JsonpRequestBuilder; +import com.google.gwt.storage.client.Storage; +import com.google.gwt.user.client.Window.Location; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.vaadin.terminal.gwt.client.ui.notification.VNotification; +import com.vaadin.terminal.gwt.client.ui.notification.VNotification.EventListener; +import com.vaadin.terminal.gwt.client.ui.notification.VNotification.HideEvent; + +/** + * Class that enables SuperDevMode using a ?superdevmode parameter in the url. + * + * @author Vaadin Ltd + * @version @VERSION@ + * @since 7.0 + * + */ +public class SuperDevMode { + + private static final int COMPILE_TIMEOUT_IN_SECONDS = 60; + protected static final String SKIP_RECOMPILE = "VaadinSuperDevMode_skip_recompile"; + + public static class RecompileResult extends JavaScriptObject { + protected RecompileResult() { + + } + + public final native boolean ok() + /*-{ + return this.status == "ok"; + }-*/; + } + + private static void recompileWidgetsetAndStartInDevMode( + final String serverUrl) { + VConsole.log("Recompiling widgetset using<br/>" + serverUrl + + "<br/>and then reloading in super dev mode"); + VNotification n = new VNotification(); + n.show("<b>Recompiling widgetset, this should not take too long</b>", + VNotification.CENTERED, VNotification.STYLE_SYSTEM); + + JsonpRequestBuilder b = new JsonpRequestBuilder(); + b.setCallbackParam("_callback"); + b.setTimeout(COMPILE_TIMEOUT_IN_SECONDS * 1000); + b.requestObject(serverUrl + "recompile/" + GWT.getModuleName() + "?" + + getRecompileParameters(GWT.getModuleName()), + new AsyncCallback<RecompileResult>() { + + @Override + public void onSuccess(RecompileResult result) { + VConsole.log("JSONP compile call successful"); + + if (!result.ok()) { + VConsole.log("* result: " + result); + failed(); + return; + } + + setSession( + getSuperDevModeHookKey(), + getSuperDevWidgetSetUrl(GWT.getModuleName(), + serverUrl)); + setSession(SKIP_RECOMPILE, "1"); + + VConsole.log("* result: OK. Reloading"); + Location.reload(); + } + + @Override + public void onFailure(Throwable caught) { + VConsole.error("JSONP compile call failed"); + // Don't log exception as they are shown as + // notifications + VConsole.error(Util.getSimpleName(caught) + ": " + + caught.getMessage()); + failed(); + + } + + private void failed() { + VNotification n = new VNotification(); + n.addEventListener(new EventListener() { + + @Override + public void notificationHidden(HideEvent event) { + recompileWidgetsetAndStartInDevMode(serverUrl); + } + }); + n.show("Recompilation failed.<br/>" + + "Make sure CodeServer is running, " + + "check its output and click to retry", + VNotification.CENTERED, + VNotification.STYLE_SYSTEM); + } + }); + + } + + protected static String getSuperDevWidgetSetUrl(String widgetsetName, + String serverUrl) { + return serverUrl + GWT.getModuleName() + "/" + GWT.getModuleName() + + ".nocache.js"; + } + + private native static String getRecompileParameters(String moduleName) + /*-{ + var prop_map = $wnd.__gwt_activeModules[moduleName].bindings(); + + // convert map to URL parameter string + var props = []; + for (var key in prop_map) { + props.push(encodeURIComponent(key) + '=' + encodeURIComponent(prop_map[key])) + } + + return props.join('&') + '&'; + }-*/; + + private static void setSession(String key, String value) { + Storage.getSessionStorageIfSupported().setItem(key, value); + } + + private static String getSession(String key) { + return Storage.getSessionStorageIfSupported().getItem(key); + } + + private static void removeSession(String key) { + Storage.getSessionStorageIfSupported().removeItem(key); + } + + protected static void disableDevModeAndReload() { + removeSession(getSuperDevModeHookKey()); + redirect(false); + } + + protected static void redirect(boolean devModeOn) { + UrlBuilder createUrlBuilder = Location.createUrlBuilder(); + if (!devModeOn) { + createUrlBuilder.removeParameter("superdevmode"); + } else { + createUrlBuilder.setParameter("superdevmode", ""); + } + + Location.assign(createUrlBuilder.buildString()); + + } + + private static String getSuperDevModeHookKey() { + String widgetsetName = GWT.getModuleName(); + final String superDevModeKey = "__gwtDevModeHook:" + widgetsetName; + return superDevModeKey; + } + + private static boolean hasSession(String key) { + return getSession(key) != null; + } + + /** + * The URL of the code server. The default URL (http://localhost:9876/) will + * be used if this is empty or null. + * + * @param serverUrl + * The url of the code server or null to use the default + * @return true if recompile started, false if we are running in + * SuperDevMode + */ + protected static boolean recompileIfNeeded(String serverUrl) { + if (serverUrl == null || "".equals(serverUrl)) { + serverUrl = "http://localhost:9876/"; + } else { + serverUrl = "http://" + serverUrl + "/"; + } + + if (hasSession(SKIP_RECOMPILE)) { + VConsole.log("Running in SuperDevMode"); + // When we get here, we are running in super dev mode + + // Remove the flag so next reload will recompile + removeSession(SKIP_RECOMPILE); + + // Remove the gwt flag so we will not end up in dev mode if we + // remove the url parameter manually + removeSession(getSuperDevModeHookKey()); + + return false; + } + + recompileWidgetsetAndStartInDevMode(serverUrl); + return true; + } + + protected static boolean isSuperDevModeEnabledInModule() { + String moduleName = GWT.getModuleName(); + return isSuperDevModeEnabledInModule(moduleName); + } + + protected native static boolean isSuperDevModeEnabledInModule( + String moduleName) + /*-{ + if (!$wnd.__gwt_activeModules) + return false; + var mod = $wnd.__gwt_activeModules[moduleName]; + if (!mod) + return false; + + if (mod.superdevmode) { + // Running in super dev mode already, it is supported + return true; + } + + return !!mod.canRedirect; + }-*/; + + /** + * Enables SuperDevMode if the url contains the "superdevmode" parameter. + * <p> + * The caller should not continue initialization of the application if this + * method returns true. The application will be restarted once compilation + * is done and then this method will return false. + * </p> + * + * @return true if a recompile operation has started and the page will be + * reloaded once it is done, false if no recompilation will be done. + */ + public static boolean enableBasedOnParameter() { + String superDevModeParameter = Location.getParameter("superdevmode"); + if (superDevModeParameter != null) { + // Need to check the recompile flag also because if we are running + // in super dev mode, as a result of the recompile, the enabled + // check will fail... + if (!isSuperDevModeEnabledInModule()) { + showError("SuperDevMode is not enabled for this module/widgetset.<br/>" + + "Ensure that your module definition (.gwt.xml) contains <br/>" + + "<add-linker name="xsiframe"/><br/>" + + "<set-configuration-property name="devModeRedirectEnabled" value="true" /><br/>"); + return false; + } + return SuperDevMode.recompileIfNeeded(superDevModeParameter); + } + return false; + } + + private static void showError(String message) { + VNotification n = new VNotification(); + n.show(message, VNotification.CENTERED_TOP, VNotification.STYLE_SYSTEM); + } +} diff --git a/src/com/vaadin/terminal/gwt/client/TooltipInfo.java b/src/com/vaadin/terminal/gwt/client/TooltipInfo.java index fb33a56c56..712d263695 100644 --- a/src/com/vaadin/terminal/gwt/client/TooltipInfo.java +++ b/src/com/vaadin/terminal/gwt/client/TooltipInfo.java @@ -16,6 +16,11 @@ public class TooltipInfo { setTitle(tooltip); } + public TooltipInfo(String tooltip, String errorMessage) { + setTitle(tooltip); + setErrorMessage(errorMessage); + } + public String getTitle() { return title; } @@ -32,4 +37,18 @@ public class TooltipInfo { errorMessageHtml = errorMessage; } + /** + * Checks is a message has been defined for the tooltip. + * + * @return true if title or error message is present, false if both are + * empty + */ + public boolean hasMessage() { + return (title != null && !title.isEmpty()) + || (errorMessageHtml != null && !errorMessageHtml.isEmpty()); + } + + public boolean equals(TooltipInfo other) { + return (other != null && other.title == title && other.errorMessageHtml == errorMessageHtml); + } } diff --git a/src/com/vaadin/terminal/gwt/client/UIDL.java b/src/com/vaadin/terminal/gwt/client/UIDL.java index a523016b60..e662e08b3f 100644 --- a/src/com/vaadin/terminal/gwt/client/UIDL.java +++ b/src/com/vaadin/terminal/gwt/client/UIDL.java @@ -283,10 +283,12 @@ public final class UIDL extends JavaScriptObject { int index = -1; + @Override public void remove() { throw new UnsupportedOperationException(); } + @Override public Object next() { if (hasNext()) { @@ -308,6 +310,7 @@ public final class UIDL extends JavaScriptObject { return null; } + @Override public boolean hasNext() { int count = getChildCount(); return count > index + 1; diff --git a/src/com/vaadin/terminal/gwt/client/Util.java b/src/com/vaadin/terminal/gwt/client/Util.java index d3cb54160d..a27c77fa45 100644 --- a/src/com/vaadin/terminal/gwt/client/Util.java +++ b/src/com/vaadin/terminal/gwt/client/Util.java @@ -27,8 +27,10 @@ import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.HasWidgets; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.ComponentState; +import com.vaadin.shared.communication.MethodInvocation; import com.vaadin.terminal.gwt.client.RenderInformation.FloatSize; -import com.vaadin.terminal.gwt.client.communication.MethodInvocation; +import com.vaadin.terminal.gwt.client.ui.VOverlay; public class Util { @@ -446,6 +448,7 @@ public class Util { elem.getStyle().setProperty("overflow", "hidden"); Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { // Dough, Safari scroll auto means actually just a moped elem.getStyle().setProperty("overflow", originalOverflow); @@ -642,34 +645,47 @@ public class Util { */ public static ComponentConnector getConnectorForElement( ApplicationConnection client, Widget parent, Element element) { + + Element browseElement = element; Element rootElement = parent.getElement(); - while (element != null && element != rootElement) { - ComponentConnector paintable = ConnectorMap.get(client) - .getConnector(element); - if (paintable == null) { - String ownerPid = VCaption.getCaptionOwnerPid(element); + + while (browseElement != null && browseElement != rootElement) { + + ComponentConnector connector = ConnectorMap.get(client) + .getConnector(browseElement); + + if (connector == null) { + String ownerPid = VCaption.getCaptionOwnerPid(browseElement); if (ownerPid != null) { - paintable = (ComponentConnector) ConnectorMap.get(client) + connector = (ComponentConnector) ConnectorMap.get(client) .getConnector(ownerPid); } } - if (paintable != null) { + if (connector != null) { // check that inside the rootElement - while (element != null && element != rootElement) { - element = (Element) element.getParentElement(); + while (browseElement != null && browseElement != rootElement) { + browseElement = (Element) browseElement.getParentElement(); } - if (element != rootElement) { + if (browseElement != rootElement) { return null; } else { - return paintable; + return connector; } } - element = (Element) element.getParentElement(); + browseElement = (Element) browseElement.getParentElement(); } - return null; + // No connector found, element is possibly inside a VOverlay + // If the overlay has an owner, try to find the owner's connector + VOverlay overlay = findWidget(element, VOverlay.class); + if (overlay != null && overlay.getOwner() != null) { + return getConnectorForElement(client, RootPanel.get(), overlay + .getOwner().getElement()); + } else { + return null; + } } /** @@ -818,30 +834,29 @@ public class Util { ServerConnector connector = ConnectorMap.get(c).getConnector(id); if (connector != null) { VConsole.log("\t" + id + " (" + connector.getClass() + ") :"); - for (MethodInvocation invocation : invocations) { - Object[] parameters = invocation.getParameters(); - String formattedParams = null; - if (ApplicationConnection.UPDATE_VARIABLE_METHOD - .equals(invocation.getMethodName()) - && parameters.length == 2) { - // name, value - Object value = parameters[1]; - // TODO paintables inside lists/maps get rendered as - // components in the debug console - String formattedValue = value instanceof ServerConnector ? ((ServerConnector) value) - .getConnectorId() : String.valueOf(value); - formattedParams = parameters[0] + " : " + formattedValue; - } - if (null == formattedParams) { - formattedParams = (null != parameters) ? Arrays - .toString(parameters) : null; - } - VConsole.log("\t\t" + invocation.getInterfaceName() + "." - + invocation.getMethodName() + "(" + formattedParams - + ")"); - } } else { - VConsole.log("\t" + id + ": Warning: no corresponding connector!"); + VConsole.log("\t" + id + + ": Warning: no corresponding connector for id " + id); + } + for (MethodInvocation invocation : invocations) { + Object[] parameters = invocation.getParameters(); + String formattedParams = null; + if (ApplicationConnection.UPDATE_VARIABLE_METHOD.equals(invocation + .getMethodName()) && parameters.length == 2) { + // name, value + Object value = parameters[1]; + // TODO paintables inside lists/maps get rendered as + // components in the debug console + String formattedValue = value instanceof ServerConnector ? ((ServerConnector) value) + .getConnectorId() : String.valueOf(value); + formattedParams = parameters[0] + " : " + formattedValue; + } + if (null == formattedParams) { + formattedParams = (null != parameters) ? Arrays + .toString(parameters) : null; + } + VConsole.log("\t\t" + invocation.getInterfaceName() + "." + + invocation.getMethodName() + "(" + formattedParams + ")"); } } @@ -1007,6 +1022,7 @@ public class Util { } Scheduler.get().scheduleDeferred(new ScheduledCommand() { + @Override public void execute() { try { target.dispatchEvent(createMouseDownEvent); diff --git a/src/com/vaadin/terminal/gwt/client/VCaption.java b/src/com/vaadin/terminal/gwt/client/VCaption.java index 6f3fcf2c3a..85acc215b7 100644 --- a/src/com/vaadin/terminal/gwt/client/VCaption.java +++ b/src/com/vaadin/terminal/gwt/client/VCaption.java @@ -8,6 +8,8 @@ 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.HTML; +import com.vaadin.shared.AbstractFieldState; +import com.vaadin.shared.ComponentState; import com.vaadin.terminal.gwt.client.ui.AbstractFieldConnector; import com.vaadin.terminal.gwt.client.ui.Icon; @@ -35,6 +37,8 @@ public class VCaption extends HTML { ICON, CAPTION, REQUIRED, ERROR } + private TooltipInfo tooltipInfo = null; + /** * Creates a caption that is not linked to a {@link ComponentConnector}. * @@ -74,8 +78,6 @@ public class VCaption extends HTML { } setStyleName(CLASSNAME); - sinkEvents(VTooltip.TOOLTIP_EVENTS); - } /** @@ -345,9 +347,6 @@ public class VCaption extends HTML { public void onBrowserEvent(Event event) { super.onBrowserEvent(event); final Element target = DOM.eventGetTarget(event); - if (client != null && owner != null && target != getElement()) { - client.handleTooltipEvent(event, owner); - } if (DOM.eventGetType(event) == Event.ONLOAD && icon.getElement() == target) { @@ -555,6 +554,26 @@ public class VCaption extends HTML { } } + /** + * Sets the tooltip that should be shown for the caption + * + * @param tooltipInfo + * The tooltip that should be shown or null if no tooltip should + * be shown + */ + public void setTooltipInfo(TooltipInfo tooltipInfo) { + this.tooltipInfo = tooltipInfo; + } + + /** + * Returns the tooltip that should be shown for the caption + * + * @return The tooltip to show or null if no tooltip should be shown + */ + public TooltipInfo getTooltipInfo() { + return tooltipInfo; + } + protected Element getTextElement() { return captionText; } diff --git a/src/com/vaadin/terminal/gwt/client/VConsole.java b/src/com/vaadin/terminal/gwt/client/VConsole.java index dee8529a84..a221b42d67 100644 --- a/src/com/vaadin/terminal/gwt/client/VConsole.java +++ b/src/com/vaadin/terminal/gwt/client/VConsole.java @@ -57,35 +57,49 @@ public class VConsole { } public static void log(String msg) { - impl.log(msg); + if (impl != null) { + impl.log(msg); + } } public static void log(Throwable e) { - impl.log(e); + if (impl != null) { + impl.log(e); + } } public static void error(Throwable e) { - impl.error(e); + if (impl != null) { + impl.error(e); + } } public static void error(String msg) { - impl.error(msg); + if (impl != null) { + impl.error(msg); + } } public static void printObject(Object msg) { - impl.printObject(msg); + if (impl != null) { + impl.printObject(msg); + } } public static void dirUIDL(ValueMap u, ApplicationConfiguration cnf) { - impl.dirUIDL(u, cnf); + if (impl != null) { + impl.dirUIDL(u, cnf); + } } public static void printLayoutProblems(ValueMap meta, ApplicationConnection applicationConnection, Set<ComponentConnector> zeroHeightComponents, Set<ComponentConnector> zeroWidthComponents) { - impl.printLayoutProblems(meta, applicationConnection, - zeroHeightComponents, zeroWidthComponents); + if (impl != null) { + impl.printLayoutProblems(meta, applicationConnection, + zeroHeightComponents, zeroWidthComponents); + } } } diff --git a/src/com/vaadin/terminal/gwt/client/VDebugConsole.java b/src/com/vaadin/terminal/gwt/client/VDebugConsole.java index 09e939336e..a7bd943912 100644 --- a/src/com/vaadin/terminal/gwt/client/VDebugConsole.java +++ b/src/com/vaadin/terminal/gwt/client/VDebugConsole.java @@ -24,6 +24,8 @@ import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.MouseOutEvent; import com.google.gwt.event.dom.client.MouseOutHandler; +import com.google.gwt.event.logical.shared.ValueChangeEvent; +import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.event.shared.UmbrellaException; import com.google.gwt.http.client.Request; @@ -33,6 +35,7 @@ import com.google.gwt.http.client.RequestException; import com.google.gwt.http.client.Response; import com.google.gwt.http.client.UrlBuilder; import com.google.gwt.i18n.client.DateTimeFormat; +import com.google.gwt.storage.client.Storage; import com.google.gwt.user.client.Cookies; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; @@ -81,6 +84,7 @@ public class VDebugConsole extends VOverlay implements Console { this.label = label; } + @Override public void onPreviewNativeEvent(NativePreviewEvent event) { if (event.getTypeInt() == Event.ONKEYDOWN && event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ESCAPE) { @@ -160,7 +164,8 @@ public class VDebugConsole extends VOverlay implements Console { private Button savePosition = new Button("S"); private Button highlight = new Button("H"); private Button connectorStats = new Button("CS"); - private CheckBox hostedMode = new CheckBox("GWT"); + private CheckBox devMode = new CheckBox("Dev"); + private CheckBox superDevMode = new CheckBox("SDev"); private CheckBox autoScroll = new CheckBox("Autoscroll "); private HorizontalPanel actions; private boolean collapsed = false; @@ -195,6 +200,7 @@ public class VDebugConsole extends VOverlay implements Console { private EventPreview dragpreview = new EventPreview() { + @Override public boolean onEventPreview(Event event) { onBrowserEvent(event); return false; @@ -342,6 +348,7 @@ public class VDebugConsole extends VOverlay implements Console { * * @see com.vaadin.terminal.gwt.client.Console#log(java.lang.String) */ + @Override public void log(String msg) { if (msg == null) { msg = "null"; @@ -358,6 +365,7 @@ public class VDebugConsole extends VOverlay implements Console { private List<String> msgQueue = new LinkedList<String>(); private ScheduledCommand doSend = new ScheduledCommand() { + @Override public void execute() { if (!msgQueue.isEmpty()) { RequestBuilder requestBuilder = new RequestBuilder( @@ -371,12 +379,14 @@ public class VDebugConsole extends VOverlay implements Console { requestBuilder.sendRequest(requestData, new RequestCallback() { + @Override public void onResponseReceived(Request request, Response response) { // TODO Auto-generated method stub } + @Override public void onError(Request request, Throwable exception) { // TODO Auto-generated method stub @@ -434,6 +444,7 @@ public class VDebugConsole extends VOverlay implements Console { * * @see com.vaadin.terminal.gwt.client.Console#error(java.lang.String) */ + @Override public void error(String msg) { if (msg == null) { msg = "null"; @@ -462,6 +473,7 @@ public class VDebugConsole extends VOverlay implements Console { * @see com.vaadin.terminal.gwt.client.Console#printObject(java.lang. * Object) */ + @Override public void printObject(Object msg) { String str; if (msg == null) { @@ -479,6 +491,7 @@ public class VDebugConsole extends VOverlay implements Console { * @see com.vaadin.terminal.gwt.client.Console#dirUIDL(com.vaadin * .terminal.gwt.client.UIDL) */ + @Override public void dirUIDL(ValueMap u, ApplicationConfiguration conf) { if (panel.isAttached()) { VUIDLBrowser vuidlBrowser = new VUIDLBrowser(u, conf); @@ -518,6 +531,7 @@ public class VDebugConsole extends VOverlay implements Console { } }-*/; + @Override public void printLayoutProblems(ValueMap meta, ApplicationConnection ac, Set<ComponentConnector> zeroHeightComponents, Set<ComponentConnector> zeroWidthComponents) { @@ -572,6 +586,7 @@ public class VDebugConsole extends VOverlay implements Console { final CheckBox emphasisInUi = new CheckBox( "Emphasize components parent in UI (the actual component is not visible)"); emphasisInUi.addClickHandler(new ClickHandler() { + @Override public void onClick(ClickEvent event) { Element element2 = layout.getElement(); Widget.setStyleName(element2, "invalidlayout", @@ -605,6 +620,7 @@ public class VDebugConsole extends VOverlay implements Console { } final CheckBox emphasisInUi = new CheckBox("Emphasize component in UI"); emphasisInUi.addClickHandler(new ClickHandler() { + @Override public void onClick(ClickEvent event) { if (paintable != null) { Element element2 = paintable.getWidget().getElement(); @@ -630,6 +646,7 @@ public class VDebugConsole extends VOverlay implements Console { root.add(errorNode); } + @Override public void log(Throwable e) { if (e instanceof UmbrellaException) { UmbrellaException ue = (UmbrellaException) e; @@ -642,6 +659,7 @@ public class VDebugConsole extends VOverlay implements Console { GWT.log(e.getMessage(), e); } + @Override public void error(Throwable e) { handleError(e, this); } @@ -673,6 +691,7 @@ public class VDebugConsole extends VOverlay implements Console { } } + @Override public void init() { panel = new FlowPanel(); if (!quietMode) { @@ -717,33 +736,8 @@ public class VDebugConsole extends VOverlay implements Console { savePosition .setTitle("Saves the position and size of debug console to a cookie"); actions.add(autoScroll); - actions.add(hostedMode); - if (Location.getParameter("gwt.codesvr") != null) { - hostedMode.setValue(true); - } - hostedMode.addClickHandler(new ClickHandler() { - public void onClick(ClickEvent event) { - if (hostedMode.getValue()) { - addHMParameter(); - } else { - removeHMParameter(); - } - } - - private void addHMParameter() { - UrlBuilder createUrlBuilder = Location.createUrlBuilder(); - createUrlBuilder.setParameter("gwt.codesvr", - "localhost:9997"); - Location.assign(createUrlBuilder.buildString()); - } - - private void removeHMParameter() { - UrlBuilder createUrlBuilder = Location.createUrlBuilder(); - createUrlBuilder.removeParameter("gwt.codesvr"); - Location.assign(createUrlBuilder.buildString()); - - } - }); + addDevMode(); + addSuperDevMode(); autoScroll .setTitle("Automatically scroll so that new messages are visible"); @@ -753,6 +747,7 @@ public class VDebugConsole extends VOverlay implements Console { panel.add(new HTML("<i>" + help + "</i>")); clear.addClickHandler(new ClickHandler() { + @Override public void onClick(ClickEvent event) { int width = panel.getOffsetWidth(); int height = panel.getOffsetHeight(); @@ -765,6 +760,7 @@ public class VDebugConsole extends VOverlay implements Console { }); restart.addClickHandler(new ClickHandler() { + @Override public void onClick(ClickEvent event) { String queryString = Window.Location.getQueryString(); @@ -792,6 +788,7 @@ public class VDebugConsole extends VOverlay implements Console { }); forceLayout.addClickHandler(new ClickHandler() { + @Override public void onClick(ClickEvent event) { for (ApplicationConnection applicationConnection : ApplicationConfiguration .getRunningApplications()) { @@ -801,6 +798,7 @@ public class VDebugConsole extends VOverlay implements Console { }); analyzeLayout.addClickHandler(new ClickHandler() { + @Override public void onClick(ClickEvent event) { List<ApplicationConnection> runningApplications = ApplicationConfiguration .getRunningApplications(); @@ -816,6 +814,7 @@ public class VDebugConsole extends VOverlay implements Console { + " all non committed variables form client side."); savePosition.addClickHandler(new ClickHandler() { + @Override public void onClick(ClickEvent event) { String pos = getAbsoluteLeft() + "," + getAbsoluteTop() + "," + getOffsetWidth() + "," + getOffsetHeight() @@ -826,6 +825,7 @@ public class VDebugConsole extends VOverlay implements Console { highlight.addClickHandler(new ClickHandler() { + @Override public void onClick(ClickEvent event) { final Label label = new Label("--"); log("<i>Use mouse to select a component or click ESC to exit highlight mode.</i>"); @@ -840,6 +840,7 @@ public class VDebugConsole extends VOverlay implements Console { } connectorStats.addClickHandler(new ClickHandler() { + @Override public void onClick(ClickEvent event) { for (ApplicationConnection a : ApplicationConfiguration .getRunningApplications()) { @@ -861,6 +862,56 @@ public class VDebugConsole extends VOverlay implements Console { } + private void addSuperDevMode() { + final Storage sessionStorage = Storage.getSessionStorageIfSupported(); + if (sessionStorage == null) { + return; + } + actions.add(superDevMode); + if (Location.getParameter("superdevmode") != null) { + superDevMode.setValue(true); + } + superDevMode.addValueChangeHandler(new ValueChangeHandler<Boolean>() { + + @Override + public void onValueChange(ValueChangeEvent<Boolean> event) { + SuperDevMode.redirect(event.getValue()); + } + + }); + + } + + private void addDevMode() { + actions.add(devMode); + if (Location.getParameter("gwt.codesvr") != null) { + devMode.setValue(true); + } + devMode.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + if (devMode.getValue()) { + addHMParameter(); + } else { + removeHMParameter(); + } + } + + private void addHMParameter() { + UrlBuilder createUrlBuilder = Location.createUrlBuilder(); + createUrlBuilder.setParameter("gwt.codesvr", "localhost:9997"); + Location.assign(createUrlBuilder.buildString()); + } + + private void removeHMParameter() { + UrlBuilder createUrlBuilder = Location.createUrlBuilder(); + createUrlBuilder.removeParameter("gwt.codesvr"); + Location.assign(createUrlBuilder.buildString()); + + } + }); + } + protected void dumpConnectorInfo(ApplicationConnection a) { RootConnector root = a.getRootConnector(); log("================"); @@ -924,6 +975,7 @@ public class VDebugConsole extends VOverlay implements Console { } }; simpleTree.addDomHandler(new MouseOutHandler() { + @Override public void onMouseOut(MouseOutEvent event) { VUIDLBrowser.deHiglight(); } @@ -945,6 +997,7 @@ public class VDebugConsole extends VOverlay implements Console { return Util.getConnectorString(connector); } + @Override public void setQuietMode(boolean quietDebugMode) { quietMode = quietDebugMode; } diff --git a/src/com/vaadin/terminal/gwt/client/VSchedulerImpl.java b/src/com/vaadin/terminal/gwt/client/VSchedulerImpl.java index 65d5d6a9a2..6f5e5854b2 100644 --- a/src/com/vaadin/terminal/gwt/client/VSchedulerImpl.java +++ b/src/com/vaadin/terminal/gwt/client/VSchedulerImpl.java @@ -19,6 +19,7 @@ public class VSchedulerImpl extends SchedulerImpl { super.scheduleDeferred(cmd); super.scheduleDeferred(new ScheduledCommand() { + @Override public void execute() { deferredCommandTrackers--; } diff --git a/src/com/vaadin/terminal/gwt/client/VTooltip.java b/src/com/vaadin/terminal/gwt/client/VTooltip.java index 70f4a0de0a..a3523c2013 100644 --- a/src/com/vaadin/terminal/gwt/client/VTooltip.java +++ b/src/com/vaadin/terminal/gwt/client/VTooltip.java @@ -3,12 +3,20 @@ */ package com.vaadin.terminal.gwt.client; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.dom.client.KeyDownEvent; +import com.google.gwt.event.dom.client.KeyDownHandler; +import com.google.gwt.event.dom.client.MouseMoveEvent; +import com.google.gwt.event.dom.client.MouseMoveHandler; 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.Timer; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.RootPanel; +import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.ui.VOverlay; /** @@ -27,15 +35,12 @@ public class VTooltip extends VOverlay { private static final int QUICK_OPEN_DELAY = 100; VErrorMessage em = new VErrorMessage(); Element description = DOM.createDiv(); - private ComponentConnector tooltipOwner; private boolean closing = false; private boolean opening = false; private ApplicationConnection ac; // Open next tooltip faster. Disabled after 2 sec of showTooltip-silence. private boolean justClosed = false; - // If this is "additional" tooltip, this field contains the key for it - private Object tooltipKey; public VTooltip(ApplicationConnection client) { super(false, false, true); @@ -78,6 +83,7 @@ public class VTooltip extends VOverlay { // first to 0,0 position so that the calculation goes correctly. setPopupPosition(0, 0); setPopupPositionAndShow(new PositionCallback() { + @Override public void setPosition(int offsetWidth, int offsetHeight) { if (offsetWidth > MAX_WIDTH) { @@ -115,51 +121,30 @@ public class VTooltip extends VOverlay { } } - public void showTooltip(ComponentConnector owner, Event event, Object key) { - if (closing && tooltipOwner == owner && tooltipKey == key) { - // return to same tooltip, cancel closing - closeTimer.cancel(); - closing = false; - justClosedTimer.cancel(); - justClosed = false; - return; - } + private void showTooltip() { - if (closing) { + // Close current tooltip + if (isShowing()) { closeNow(); } - updatePosition(event); - - if (opening) { - showTimer.cancel(); - } - tooltipOwner = owner; - tooltipKey = key; - // Schedule timer for showing the tooltip according to if it was // recently closed or not. - if (justClosed) { - showTimer.schedule(QUICK_OPEN_DELAY); - } else { - showTimer.schedule(OPEN_DELAY); - } + int timeout = justClosed ? QUICK_OPEN_DELAY : OPEN_DELAY; + showTimer.schedule(timeout); opening = true; } private void closeNow() { - if (closing) { - hide(); - tooltipOwner = null; - setWidth(""); - closing = false; - } + hide(); + setWidth(""); + closing = false; } private Timer showTimer = new Timer() { @Override public void run() { - TooltipInfo info = ac.getTooltipTitleInfo(tooltipOwner, tooltipKey); + TooltipInfo info = tooltipEventHandler.getTooltipInfo(); if (null != info) { show(info); } @@ -187,7 +172,6 @@ public class VTooltip extends VOverlay { if (opening) { showTimer.cancel(); opening = false; - tooltipOwner = null; } if (!isAttached()) { return; @@ -209,24 +193,6 @@ public class VTooltip extends VOverlay { public void updatePosition(Event event) { tooltipEventMouseX = DOM.eventGetClientX(event); tooltipEventMouseY = DOM.eventGetClientY(event); - - } - - public void handleTooltipEvent(Event event, ComponentConnector owner, - Object key) { - final int type = DOM.eventGetType(event); - if ((VTooltip.TOOLTIP_EVENTS & type) == type) { - if (type == Event.ONMOUSEOVER) { - showTooltip(owner, event, key); - } else if (type == Event.ONMOUSEMOVE) { - updatePosition(event); - } else { - hideTooltip(); - } - } else { - // non-tooltip event, hide tooltip - hideTooltip(); - } } @Override @@ -235,17 +201,152 @@ public class VTooltip extends VOverlay { // cancel closing event if tooltip is mouseovered; the user might want // to scroll of cut&paste - switch (type) { - case Event.ONMOUSEOVER: + if (type == Event.ONMOUSEOVER) { + // Cancel closing so tooltip stays open and user can copy paste the + // tooltip closeTimer.cancel(); closing = false; - break; - case Event.ONMOUSEOUT: + } + } + + /** + * Replace current open tooltip with new content + */ + public void replaceCurrentTooltip() { + if (closing) { + closeTimer.cancel(); + closeNow(); + } + + TooltipInfo info = tooltipEventHandler.getTooltipInfo(); + if (null != info) { + show(info); + } + opening = false; + } + + private class TooltipEventHandler implements MouseMoveHandler, + ClickHandler, KeyDownHandler { + + /** + * Current element hovered + */ + private com.google.gwt.dom.client.Element currentElement = null; + + /** + * Current tooltip active + */ + private TooltipInfo currentTooltipInfo = null; + + /** + * Get current active tooltip information + * + * @return Current active tooltip information or null + */ + public TooltipInfo getTooltipInfo() { + return currentTooltipInfo; + } + + /** + * Locate connector and it's tooltip for given element + * + * @param element + * Element used in search + * @return true if connector and tooltip found + */ + private boolean resolveConnector(Element element) { + + ComponentConnector connector = Util.getConnectorForElement(ac, + RootPanel.get(), element); + + // Try to find first connector with proper tooltip info + TooltipInfo info = null; + while (connector != null) { + + info = connector.getTooltipInfo(element); + + if (info != null && info.hasMessage()) { + break; + } + + if (!(connector.getParent() instanceof ComponentConnector)) { + connector = null; + info = null; + break; + } + connector = (ComponentConnector) connector.getParent(); + } + + if (connector != null && info != null) { + currentTooltipInfo = info; + return true; + } + + return false; + } + + /** + * Handle hide event + * + * @param event + * Event causing hide + */ + private void handleHideEvent() { hideTooltip(); - break; - default: - // NOP + currentTooltipInfo = null; + } + + @Override + public void onMouseMove(MouseMoveEvent mme) { + Event event = Event.as(mme.getNativeEvent()); + com.google.gwt.dom.client.Element element = Element.as(event + .getEventTarget()); + + // We can ignore move event if it's handled by move or over already + if (currentElement == element) { + return; + } + currentElement = element; + + boolean connectorAndTooltipFound = resolveConnector((com.google.gwt.user.client.Element) element); + if (!connectorAndTooltipFound) { + if (isShowing()) { + handleHideEvent(); + } else { + currentTooltipInfo = null; + } + } else { + updatePosition(event); + if (isShowing()) { + replaceCurrentTooltip(); + } else { + showTooltip(); + } + } + } + + @Override + public void onClick(ClickEvent event) { + handleHideEvent(); + } + + @Override + public void onKeyDown(KeyDownEvent event) { + handleHideEvent(); } } + private final TooltipEventHandler tooltipEventHandler = new TooltipEventHandler(); + + /** + * Connects DOM handlers to widget that are needed for tooltip presentation. + * + * @param widget + * Widget which DOM handlers are connected + */ + public void connectHandlersToWidget(Widget widget) { + widget.addDomHandler(tooltipEventHandler, MouseMoveEvent.getType()); + widget.addDomHandler(tooltipEventHandler, ClickEvent.getType()); + widget.addDomHandler(tooltipEventHandler, KeyDownEvent.getType()); + } } diff --git a/src/com/vaadin/terminal/gwt/client/VUIDLBrowser.java b/src/com/vaadin/terminal/gwt/client/VUIDLBrowser.java index 4230eda298..745d66c444 100644 --- a/src/com/vaadin/terminal/gwt/client/VUIDLBrowser.java +++ b/src/com/vaadin/terminal/gwt/client/VUIDLBrowser.java @@ -22,16 +22,29 @@ import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.MouseOutEvent; import com.google.gwt.event.dom.client.MouseOutHandler; +import com.google.gwt.json.client.JSONArray; +import com.google.gwt.json.client.JSONObject; +import com.google.gwt.json.client.JSONValue; +import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.ui.UnknownComponentConnector; import com.vaadin.terminal.gwt.client.ui.window.VWindow; +/** + * TODO Rename to something more Vaadin7-ish? + */ public class VUIDLBrowser extends SimpleTree { - private static final String HELP = "Shift click handle to open recursively. Click components to hightlight them on client side. Shift click components to highlight them also on the server side."; + private static final String HELP = "Shift click handle to open recursively. " + + " Click components to highlight them on client side." + + " Shift click components to highlight them also on the server side."; private ApplicationConfiguration conf; private String highlightedPid; + /** + * TODO Should probably take ApplicationConnection instead of + * ApplicationConfiguration + */ public VUIDLBrowser(final UIDL uidl, ApplicationConfiguration conf) { this.conf = conf; final UIDLItem root = new UIDLItem(uidl, conf); @@ -47,9 +60,18 @@ public class VUIDLBrowser extends SimpleTree { Set<String> keySet = u.getKeySet(); for (String key : keySet) { if (key.equals("state")) { - // TODO print updated shared states + + ValueMap stateJson = u.getValueMap(key); + SimpleTree stateChanges = new SimpleTree("Shared state"); + + for (String stateKey : stateJson.getKeySet()) { + stateChanges.add(new SharedStateItem(stateKey, stateJson + .getValueMap(stateKey))); + } + add(stateChanges); + } else if (key.equals("changes")) { - JsArray<UIDL> jsValueMapArray = u.getJSValueMapArray("changes") + JsArray<UIDL> jsValueMapArray = u.getJSValueMapArray(key) .cast(); for (int i = 0; i < jsValueMapArray.length(); i++) { UIDL uidl = jsValueMapArray.get(i); @@ -68,12 +90,107 @@ public class VUIDLBrowser extends SimpleTree { setTitle(HELP); } - class UIDLItem extends SimpleTree { + /** + * A debug view of a server-originated component state change. + */ + abstract class StateChangeItem extends SimpleTree { + + protected StateChangeItem() { + setTitle(HELP); + + addDomHandler(new MouseOutHandler() { + @Override + public void onMouseOut(MouseOutEvent event) { + deHiglight(); + } + }, MouseOutEvent.getType()); + } + + @Override + protected void select(ClickEvent event) { + ComponentConnector connector = getConnector(); + highlight(connector); + if (event != null && event.getNativeEvent().getShiftKey()) { + connector.getConnection().highlightComponent(connector); + } + super.select(event); + } + + /** + * Returns the Connector associated with this state change. + */ + protected ComponentConnector getConnector() { + List<ApplicationConnection> runningApplications = ApplicationConfiguration + .getRunningApplications(); + + // TODO this does not work properly with multiple application on + // same host page + for (ApplicationConnection applicationConnection : runningApplications) { + ServerConnector connector = ConnectorMap.get( + applicationConnection).getConnector(getConnectorId()); + if (connector instanceof ComponentConnector) { + return (ComponentConnector) connector; + } + } + return new UnknownComponentConnector(); + } + + protected abstract String getConnectorId(); + } + + /** + * A debug view of a Vaadin 7 style shared state change. + */ + class SharedStateItem extends StateChangeItem { + + private String connectorId; + + SharedStateItem(String connectorId, ValueMap stateChanges) { + this.connectorId = connectorId; + setText(connectorId); + dir(new JSONObject(stateChanges), this); + } + + @Override + protected String getConnectorId() { + return connectorId; + } + + private void dir(String key, JSONValue value, SimpleTree tree) { + if (value.isObject() != null) { + SimpleTree subtree = new SimpleTree(key + "=object"); + tree.add(subtree); + dir(value.isObject(), subtree); + } else if (value.isArray() != null) { + SimpleTree subtree = new SimpleTree(key + "=array"); + dir(value.isArray(), subtree); + tree.add(subtree); + } else { + tree.add(new HTML(key + "=" + value)); + } + } + + private void dir(JSONObject state, SimpleTree tree) { + for (String key : state.keySet()) { + dir(key, state.get(key), tree); + } + } + + private void dir(JSONArray array, SimpleTree tree) { + for (int i = 0; i < array.size(); ++i) { + dir("" + i, array.get(i), tree); + } + } + } + + /** + * A debug view of a Vaadin 6 style hierarchical component state change. + */ + class UIDLItem extends StateChangeItem { private UIDL uidl; UIDLItem(UIDL uidl, ApplicationConfiguration conf) { - setTitle(HELP); this.uidl = uidl; try { String name = uidl.getTag(); @@ -87,13 +204,11 @@ public class VUIDLBrowser extends SimpleTree { } catch (Exception e) { setText(uidl.toString()); } + } - addDomHandler(new MouseOutHandler() { - public void onMouseOut(MouseOutEvent event) { - deHiglight(); - } - }, MouseOutEvent.getType()); - + @Override + protected String getConnectorId() { + return uidl.getId(); } private String getNodeName(UIDL uidl, ApplicationConfiguration conf, @@ -118,26 +233,6 @@ public class VUIDLBrowser extends SimpleTree { super.open(recursive); } - @Override - protected void select(ClickEvent event) { - List<ApplicationConnection> runningApplications = ApplicationConfiguration - .getRunningApplications(); - - // TODO this does not work properly with multiple application on - // same - // host page - for (ApplicationConnection applicationConnection : runningApplications) { - ComponentConnector paintable = (ComponentConnector) ConnectorMap - .get(applicationConnection).getConnector(uidl.getId()); - highlight(paintable); - if (event != null && event.getNativeEvent().getShiftKey()) { - applicationConnection.highlightComponent(paintable); - } - } - - super.select(event); - } - public void dir() { remove(0); @@ -218,6 +313,7 @@ public class VUIDLBrowser extends SimpleTree { if (highlightedPid != null && highlightedPid.equals(uidl.getId())) { getElement().getStyle().setBackgroundColor("#fdd"); Scheduler.get().scheduleDeferred(new ScheduledCommand() { + @Override public void execute() { getElement().scrollIntoView(); } diff --git a/src/com/vaadin/terminal/gwt/client/WidgetLoader.java b/src/com/vaadin/terminal/gwt/client/WidgetLoader.java index 16e99716a0..749a8343c8 100644 --- a/src/com/vaadin/terminal/gwt/client/WidgetLoader.java +++ b/src/com/vaadin/terminal/gwt/client/WidgetLoader.java @@ -8,13 +8,15 @@ import com.google.gwt.core.client.RunAsyncCallback; /** A helper class used by WidgetMap implementation. Used by the generated code. */ abstract class WidgetLoader implements RunAsyncCallback { + @Override public void onFailure(Throwable reason) { - ApplicationConfiguration.endWidgetLoading(); + ApplicationConfiguration.endDependencyLoading(); } + @Override public void onSuccess() { addInstantiator(); - ApplicationConfiguration.endWidgetLoading(); + ApplicationConfiguration.endDependencyLoading(); } abstract void addInstantiator(); diff --git a/src/com/vaadin/terminal/gwt/client/communication/InitializableServerRpc.java b/src/com/vaadin/terminal/gwt/client/communication/InitializableServerRpc.java index 0270de316e..f1b6b44b7d 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/InitializableServerRpc.java +++ b/src/com/vaadin/terminal/gwt/client/communication/InitializableServerRpc.java @@ -3,6 +3,7 @@ */ package com.vaadin.terminal.gwt.client.communication; +import com.vaadin.shared.communication.ServerRpc; import com.vaadin.terminal.gwt.client.ServerConnector; /** diff --git a/src/com/vaadin/terminal/gwt/client/communication/JsonDecoder.java b/src/com/vaadin/terminal/gwt/client/communication/JsonDecoder.java index 23a2c30cd0..7268acdfc5 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/JsonDecoder.java +++ b/src/com/vaadin/terminal/gwt/client/communication/JsonDecoder.java @@ -16,8 +16,8 @@ import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONString; import com.google.gwt.json.client.JSONValue; +import com.vaadin.shared.Connector; import com.vaadin.terminal.gwt.client.ApplicationConnection; -import com.vaadin.terminal.gwt.client.Connector; import com.vaadin.terminal.gwt.client.ConnectorMap; /** diff --git a/src/com/vaadin/terminal/gwt/client/communication/JsonEncoder.java b/src/com/vaadin/terminal/gwt/client/communication/JsonEncoder.java index 925f0b6272..404f1238e0 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/JsonEncoder.java +++ b/src/com/vaadin/terminal/gwt/client/communication/JsonEncoder.java @@ -17,8 +17,9 @@ import com.google.gwt.json.client.JSONNumber; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONString; import com.google.gwt.json.client.JSONValue; +import com.vaadin.shared.Connector; +import com.vaadin.shared.communication.UidlValue; import com.vaadin.terminal.gwt.client.ApplicationConnection; -import com.vaadin.terminal.gwt.client.Connector; /** * Encoder for converting RPC parameters and other values to JSON for transfer diff --git a/src/com/vaadin/terminal/gwt/client/communication/RpcManager.java b/src/com/vaadin/terminal/gwt/client/communication/RpcManager.java index 07d6292ce2..b1c91fe049 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/RpcManager.java +++ b/src/com/vaadin/terminal/gwt/client/communication/RpcManager.java @@ -11,6 +11,8 @@ import java.util.Map; import com.google.gwt.core.client.GWT; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONString; +import com.vaadin.shared.communication.ClientRpc; +import com.vaadin.shared.communication.MethodInvocation; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.ConnectorMap; import com.vaadin.terminal.gwt.client.ServerConnector; diff --git a/src/com/vaadin/terminal/gwt/client/communication/RpcMethod.java b/src/com/vaadin/terminal/gwt/client/communication/RpcMethod.java index abdcf73e2c..ce9c5b468b 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/RpcMethod.java +++ b/src/com/vaadin/terminal/gwt/client/communication/RpcMethod.java @@ -3,6 +3,8 @@ */ package com.vaadin.terminal.gwt.client.communication; +import com.vaadin.shared.communication.ClientRpc; + public abstract class RpcMethod { private String interfaceName; private String methodName; diff --git a/src/com/vaadin/terminal/gwt/client/communication/RpcProxy.java b/src/com/vaadin/terminal/gwt/client/communication/RpcProxy.java index 113ec1f1b1..996c148f4f 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/RpcProxy.java +++ b/src/com/vaadin/terminal/gwt/client/communication/RpcProxy.java @@ -4,6 +4,7 @@ package com.vaadin.terminal.gwt.client.communication; import com.google.gwt.core.client.GWT; +import com.vaadin.shared.communication.ServerRpc; import com.vaadin.terminal.gwt.client.ServerConnector; /** 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 bab0f385ed..f39cad1899 100644 --- a/src/com/vaadin/terminal/gwt/client/communication/URLReference_Serializer.java +++ b/src/com/vaadin/terminal/gwt/client/communication/URLReference_Serializer.java @@ -6,6 +6,7 @@ package com.vaadin.terminal.gwt.client.communication; import com.google.gwt.core.client.GWT; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONValue; +import com.vaadin.shared.communication.URLReference; import com.vaadin.terminal.gwt.client.ApplicationConnection; public class URLReference_Serializer implements JSONSerializer<URLReference> { @@ -13,6 +14,7 @@ public class URLReference_Serializer implements JSONSerializer<URLReference> { // setURL() -> uRL as first char becomes lower case... private static final String URL_FIELD = "uRL"; + @Override public URLReference deserialize(Type type, JSONValue jsonValue, ApplicationConnection connection) { URLReference reference = GWT.create(URLReference.class); @@ -27,6 +29,7 @@ public class URLReference_Serializer implements JSONSerializer<URLReference> { return reference; } + @Override public JSONValue serialize(URLReference value, ApplicationConnection connection) { JSONObject json = new JSONObject(); diff --git a/src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/JavaScriptManagerConnector.java b/src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/JavaScriptManagerConnector.java index 8656783a86..d5849096fa 100644 --- a/src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/JavaScriptManagerConnector.java +++ b/src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/JavaScriptManagerConnector.java @@ -10,10 +10,12 @@ import java.util.Set; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.json.client.JSONArray; -import com.vaadin.terminal.gwt.client.communication.MethodInvocation; +import com.vaadin.shared.communication.MethodInvocation; +import com.vaadin.shared.extension.javascriptmanager.ExecuteJavaScriptRpc; +import com.vaadin.shared.extension.javascriptmanager.JavaScriptManagerState; +import com.vaadin.shared.ui.Connect; import com.vaadin.terminal.gwt.client.communication.StateChangeEvent; import com.vaadin.terminal.gwt.client.extensions.AbstractExtensionConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.ui.JavaScript; @Connect(JavaScript.class) @@ -23,6 +25,7 @@ public class JavaScriptManagerConnector extends AbstractExtensionConnector { @Override protected void init() { registerRpc(ExecuteJavaScriptRpc.class, new ExecuteJavaScriptRpc() { + @Override public void executeJavaScript(String Script) { eval(Script); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbstractClickEventHandler.java b/src/com/vaadin/terminal/gwt/client/ui/AbstractClickEventHandler.java index e0ca798682..9de465e4a5 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/AbstractClickEventHandler.java +++ b/src/com/vaadin/terminal/gwt/client/ui/AbstractClickEventHandler.java @@ -53,6 +53,7 @@ public abstract class AbstractClickEventHandler implements MouseDownHandler, */ private final NativePreviewHandler mouseUpPreviewHandler = new NativePreviewHandler() { + @Override public void onPreviewNativeEvent(NativePreviewEvent event) { if (event.getTypeInt() == Event.ONMOUSEUP) { mouseUpEventPreviewRegistration.removeHandler(); @@ -144,6 +145,7 @@ public abstract class AbstractClickEventHandler implements MouseDownHandler, * popping up if there is a listener for right clicks. */ + @Override public void onContextMenu(ContextMenuEvent event) { if (hasEventListener() && shouldFireEvent(event)) { // Prevent showing the browser's context menu when there is a right @@ -152,6 +154,7 @@ public abstract class AbstractClickEventHandler implements MouseDownHandler, } } + @Override public void onMouseDown(MouseDownEvent event) { /* * When getting a mousedown event, we must detect where the @@ -163,6 +166,7 @@ public abstract class AbstractClickEventHandler implements MouseDownHandler, .addNativePreviewHandler(mouseUpPreviewHandler); } + @Override public void onMouseUp(MouseUpEvent event) { /* * Only fire a click if the mouseup hits the same element as the @@ -208,6 +212,7 @@ public abstract class AbstractClickEventHandler implements MouseDownHandler, * double click will result in two click events and one double click event. */ + @Override public void onDoubleClick(DoubleClickEvent event) { if (hasEventListener() && shouldFireEvent(event)) { fireClick(event.getNativeEvent()); diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbstractComponentConnector.java b/src/com/vaadin/terminal/gwt/client/ui/AbstractComponentConnector.java index a621c488be..ba3a53691a 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/AbstractComponentConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/AbstractComponentConnector.java @@ -3,18 +3,20 @@ */ package com.vaadin.terminal.gwt.client.ui; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; import java.util.Set; +import com.google.gwt.dom.client.Element; import com.google.gwt.user.client.ui.Focusable; import com.google.gwt.user.client.ui.HasEnabled; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.ComponentState; +import com.vaadin.shared.Connector; +import com.vaadin.shared.ui.TabIndexState; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ComponentContainerConnector; -import com.vaadin.terminal.gwt.client.ComponentState; -import com.vaadin.terminal.gwt.client.Connector; import com.vaadin.terminal.gwt.client.ConnectorMap; import com.vaadin.terminal.gwt.client.LayoutManager; import com.vaadin.terminal.gwt.client.ServerConnector; @@ -23,6 +25,7 @@ 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.StateChangeEvent; +import com.vaadin.terminal.gwt.client.ui.datefield.PopupDateFieldConnector; import com.vaadin.terminal.gwt.client.ui.root.RootConnector; public abstract class AbstractComponentConnector extends AbstractConnector @@ -33,7 +36,11 @@ public abstract class AbstractComponentConnector extends AbstractConnector private String lastKnownWidth = ""; private String lastKnownHeight = ""; - List<String> styleNames; + /** + * The style names from getState().getStyles() which are currently applied + * to the widget. + */ + protected List<String> styleNames = new ArrayList<String>(); /** * Default constructor @@ -41,6 +48,16 @@ public abstract class AbstractComponentConnector extends AbstractConnector public AbstractComponentConnector() { } + @Override + protected void init() { + super.init(); + + getConnection().getVTooltip().connectHandlersToWidget(getWidget()); + + // Set v-connector style names for the widget + getWidget().setStyleName("v-connector", true); + } + /** * Creates and returns the widget for this VPaintableWidget. This method * should only be called once when initializing the paintable. @@ -57,6 +74,7 @@ public abstract class AbstractComponentConnector extends AbstractConnector * * @return The widget associated with this paintable */ + @Override public Widget getWidget() { if (widget == null) { widget = createWidget(); @@ -100,19 +118,7 @@ public abstract class AbstractComponentConnector extends AbstractConnector super.onStateChanged(stateChangeEvent); // Style names - // String styleName = getStyleNames(getWidget().getStylePrimaryName()); - // getWidget().setStyleName(styleName); - updateStyleNames(); - - // Update tooltip - TooltipInfo tooltipInfo = paintableMap.getTooltipInfo(this, null); - if (getState().hasDescription()) { - tooltipInfo.setTitle(getState().getDescription()); - } else { - tooltipInfo.setTitle(null); - } - // add error info to tooltip if present - tooltipInfo.setErrorMessage(getState().getErrorMessage()); + updateWidgetStyleNames(); // Set captions if (delegateCaptionHandling()) { @@ -134,13 +140,16 @@ public abstract class AbstractComponentConnector extends AbstractConnector updateComponentSize(); } + @Override public void setWidgetEnabled(boolean widgetEnabled) { + // add or remove v-disabled style name from the widget + setWidgetStyleName(ApplicationConnection.DISABLED_CLASSNAME, + !widgetEnabled); + if (getWidget() instanceof HasEnabled) { // set widget specific enabled state ((HasEnabled) getWidget()).setEnabled(widgetEnabled); - // add or remove v-disabled style name from the widget - getWidget().setStyleName(ApplicationConnection.DISABLED_CLASSNAME, - !widgetEnabled); + // make sure the caption has or has not v-disabled style if (delegateCaptionHandling()) { ServerConnector parent = getParent(); @@ -190,18 +199,22 @@ public abstract class AbstractComponentConnector extends AbstractConnector widget.setWidth(newWidth); } + @Override public boolean isRelativeHeight() { return getState().getHeight().endsWith("%"); } + @Override public boolean isRelativeWidth() { return getState().getWidth().endsWith("%"); } + @Override public boolean isUndefinedHeight() { return getState().getHeight().length() == 0; } + @Override public boolean isUndefinedWidth() { return getState().getWidth().length() == 0; } @@ -213,111 +226,118 @@ public abstract class AbstractComponentConnector extends AbstractConnector * com.vaadin.terminal.gwt.client.ComponentConnector#delegateCaptionHandling * () */ + @Override public boolean delegateCaptionHandling() { return true; } /** - * Generates the style name for the widget based on the given primary style - * name and the shared state. + * Updates the user defined, read-only and error style names for the widget + * based the shared state. User defined style names are prefixed with the + * primary style name of the widget returned by {@link #getWidget()} * <p> * This method can be overridden to provide additional style names for the - * component + * component, for example see + * {@link AbstractFieldConnector#updateWidgetStyleNames()} * </p> - * - * @param primaryStyleName - * The primary style name to use when generating the final style - * names - * @return The style names, settable using - * {@link Widget#setStyleName(String)} */ - protected String getStyleNames(String primaryStyleName) { + protected void updateWidgetStyleNames() { ComponentState state = getState(); - StringBuilder styleBuf = new StringBuilder(); - styleBuf.append(primaryStyleName); - styleBuf.append(" v-connector"); + String primaryStyleName = getWidget().getStylePrimaryName(); - // Uses connector methods to enable connectors to take hierarchy or - // multiple state variables into account - if (!isEnabled()) { - styleBuf.append(" "); - styleBuf.append(ApplicationConnection.DISABLED_CLASSNAME); - } - if (isReadOnly()) { - styleBuf.append(" "); - styleBuf.append("v-readonly"); - } + // should be in AbstractFieldConnector ? + // add / remove read-only style name + setWidgetStyleName("v-readonly", isReadOnly()); + + // add / remove error style name + setWidgetStyleNameWithPrefix(primaryStyleName, + ApplicationConnection.ERROR_CLASSNAME_EXT, + null != state.getErrorMessage()); - // add additional styles as css classes, prefixed with component default - // stylename + // add additional user defined style names as class names, prefixed with + // component default class name. remove nonexistent style names. if (state.hasStyles()) { - for (String style : state.getStyles()) { - styleBuf.append(" "); - styleBuf.append(primaryStyleName); - styleBuf.append("-"); - styleBuf.append(style); - styleBuf.append(" "); - styleBuf.append(style); + // add new style names + List<String> newStyles = new ArrayList<String>(); + newStyles.addAll(state.getStyles()); + newStyles.removeAll(styleNames); + for (String newStyle : newStyles) { + setWidgetStyleName(newStyle, true); + setWidgetStyleNameWithPrefix(primaryStyleName + "-", newStyle, + true); } + // remove nonexistent style names + styleNames.removeAll(state.getStyles()); + for (String oldStyle : styleNames) { + setWidgetStyleName(oldStyle, false); + setWidgetStyleNameWithPrefix(primaryStyleName + "-", oldStyle, + false); + } + styleNames.clear(); + styleNames.addAll(state.getStyles()); + } else { + // remove all old style names + for (String oldStyle : styleNames) { + setWidgetStyleName(oldStyle, false); + setWidgetStyleNameWithPrefix(primaryStyleName + "-", oldStyle, + false); + } + styleNames.clear(); } - // add error classname to components w/ error - if (null != state.getErrorMessage()) { - styleBuf.append(" "); - styleBuf.append(primaryStyleName); - styleBuf.append(ApplicationConnection.ERROR_CLASSNAME_EXT); - } - - return styleBuf.toString(); } - protected void updateStyleNames() { - Widget widget = getWidget(); - - widget.addStyleName("v"); - - // Disabled - if (!isEnabled()) { - widget.addStyleName(ApplicationConnection.DISABLED_CLASSNAME); - } else { - widget.removeStyleName(ApplicationConnection.DISABLED_CLASSNAME); - } - - // Read-only - if (isReadOnly()) { - widget.addStyleName("v-readonly"); - } else { - widget.removeStyleName("v-readonly"); - } + /** + * This is used to add / remove state related style names from the widget. + * <p> + * Override this method for example if the style name given here should be + * updated in another widget in addition to the one returned by the + * {@link #getWidget()}. + * </p> + * + * @param styleName + * the style name to be added or removed + * @param add + * <code>true</code> to add the given style, <code>false</code> + * to remove it + */ + protected void setWidgetStyleName(String styleName, boolean add) { + getWidget().setStyleName(styleName, add); + } - // Error - if (null != getState().getErrorMessage()) { - widget.addStyleDependentName("error"); + /** + * This is used to add / remove state related prefixed style names from the + * widget. + * <p> + * Override this method if the prefixed style name given here should be + * updated in another widget in addition to the one returned by the + * <code>Connector</code>'s {@link #getWidget()}, or if the prefix should be + * different. For example see + * {@link PopupDateFieldConnector#setWidgetStyleNameWithPrefix(String, String, boolean)} + * </p> + * + * @param styleName + * the style name to be added or removed + * @param add + * <code>true</code> to add the given style, <code>false</code> + * to remove it + * @deprecated This will be removed once styles are no longer added with + * prefixes. + */ + @Deprecated + protected void setWidgetStyleNameWithPrefix(String prefix, + String styleName, boolean add) { + if (!styleName.startsWith("-")) { + if (!prefix.endsWith("-")) { + prefix += "-"; + } } else { - widget.removeStyleDependentName("error"); - } - - // Additional style names - List<String> newStyleNames = getState().getStyles(); - if (newStyleNames == null) { - newStyleNames = new LinkedList<String>(); - } - if (styleNames != null) { - // Remove previous styles which are no longer in the current list - for (String style : styleNames) { - if (!newStyleNames.contains(style)) { - widget.removeStyleName(style); - widget.removeStyleDependentName(style); - } + if (prefix.endsWith("-")) { + styleName.replaceFirst("-", ""); } } - // Add any new styles - for (String style : newStyleNames) { - widget.addStyleName(style); - widget.addStyleDependentName(style); - } - styleNames = newStyleNames; + getWidget().setStyleName(prefix + styleName, add); } /* @@ -325,11 +345,13 @@ public abstract class AbstractComponentConnector extends AbstractConnector * * @see com.vaadin.terminal.gwt.client.ComponentConnector#isReadOnly() */ + @Override @Deprecated public boolean isReadOnly() { return getState().isReadOnly(); } + @Override public LayoutManager getLayoutManager() { return LayoutManager.get(getConnection()); } @@ -343,6 +365,7 @@ public abstract class AbstractComponentConnector extends AbstractConnector * @return true if an event listener has been registered with the given * event identifier on the server side, false otherwise */ + @Override public boolean hasEventListener(String eventIdentifier) { Set<String> reg = getState().getRegisteredEventListeners(); return (reg != null && reg.contains(eventIdentifier)); @@ -368,4 +391,17 @@ public abstract class AbstractComponentConnector extends AbstractConnector + ") has been unregistered. Widget was removed."); } } + + /* + * (non-Javadoc) + * + * @see + * com.vaadin.terminal.gwt.client.ComponentConnector#getTooltipInfo(com. + * google.gwt.dom.client.Element) + */ + @Override + public TooltipInfo getTooltipInfo(Element element) { + return new TooltipInfo(getState().getDescription(), getState() + .getErrorMessage()); + } } diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbstractComponentContainerConnector.java b/src/com/vaadin/terminal/gwt/client/ui/AbstractComponentContainerConnector.java index c6bfba5023..6b294e65b8 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/AbstractComponentContainerConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/AbstractComponentContainerConnector.java @@ -35,6 +35,7 @@ public abstract class AbstractComponentContainerConnector extends * @see * com.vaadin.terminal.gwt.client.ComponentContainerConnector#getChildren() */ + @Override public List<ComponentConnector> getChildComponents() { if (childComponents == null) { return Collections.emptyList(); @@ -50,6 +51,7 @@ public abstract class AbstractComponentContainerConnector extends * com.vaadin.terminal.gwt.client.ComponentContainerConnector#setChildren * (java.util.Collection) */ + @Override public void setChildComponents(List<ComponentConnector> childComponents) { this.childComponents = childComponents; } @@ -61,6 +63,7 @@ public abstract class AbstractComponentContainerConnector extends * connectorHierarchyChanged * (com.vaadin.terminal.gwt.client.ConnectorHierarchyChangedEvent) */ + @Override public void onConnectorHierarchyChange(ConnectorHierarchyChangeEvent event) { if (debugLogging) { VConsole.log("Hierarchy changed for " @@ -79,6 +82,7 @@ public abstract class AbstractComponentContainerConnector extends } } + @Override public HandlerRegistration addConnectorHierarchyChangeHandler( ConnectorHierarchyChangeHandler handler) { return ensureHandlerManager().addHandler( diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbstractConnector.java b/src/com/vaadin/terminal/gwt/client/ui/AbstractConnector.java index d34529ee4e..4efd2f5c2f 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/AbstractConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/AbstractConnector.java @@ -13,12 +13,12 @@ import java.util.Map; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HandlerManager; import com.google.web.bindery.event.shared.HandlerRegistration; +import com.vaadin.shared.communication.ClientRpc; +import com.vaadin.shared.communication.SharedState; import com.vaadin.terminal.gwt.client.ApplicationConnection; 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; @@ -57,6 +57,7 @@ public abstract class AbstractConnector implements ServerConnector, * * @see com.vaadin.terminal.gwt.client.VPaintable#getConnection() */ + @Override public final ApplicationConnection getConnection() { return connection; } @@ -66,6 +67,7 @@ public abstract class AbstractConnector implements ServerConnector, * * @see com.vaadin.terminal.gwt.client.Connector#getId() */ + @Override public String getConnectorId() { return id; } @@ -78,6 +80,7 @@ public abstract class AbstractConnector implements ServerConnector, * <p> * Connector classes should override {@link #init()} instead of this method. */ + @Override public final void doInit(String connectorId, ApplicationConnection connection) { this.connection = connection; @@ -140,6 +143,7 @@ public abstract class AbstractConnector implements ServerConnector, } } + @Override public <T extends ClientRpc> Collection<T> getRpcImplementations( String rpcInterfaceId) { if (null == rpcImplementations) { @@ -148,6 +152,7 @@ public abstract class AbstractConnector implements ServerConnector, return (Collection<T>) rpcImplementations.get(rpcInterfaceId); } + @Override public void fireEvent(GwtEvent<?> event) { if (handlerManager != null) { handlerManager.fireEvent(event); @@ -162,11 +167,13 @@ public abstract class AbstractConnector implements ServerConnector, return handlerManager; } + @Override public HandlerRegistration addStateChangeHandler(StateChangeHandler handler) { return ensureHandlerManager() .addHandler(StateChangeEvent.TYPE, handler); } + @Override public void removeStateChangeHandler(StateChangeHandler handler) { ensureHandlerManager().removeHandler(StateChangeEvent.TYPE, handler); } @@ -186,6 +193,7 @@ public abstract class AbstractConnector implements ServerConnector, * * @see com.vaadin.terminal.gwt.client.ServerConnector#onUnregister() */ + @Override public void onUnregister() { if (debugLogging) { VConsole.log("Unregistered connector " @@ -201,6 +209,7 @@ public abstract class AbstractConnector implements ServerConnector, * * @return the current shared state (never null) */ + @Override public SharedState getState() { if (state == null) { state = createState(); @@ -221,14 +230,17 @@ public abstract class AbstractConnector implements ServerConnector, return ConnectorStateFactory.createState(getClass()); } + @Override public ServerConnector getParent() { return parent; } + @Override public void setParent(ServerConnector parent) { this.parent = parent; } + @Override public List<ServerConnector> getChildren() { if (children == null) { return Collections.emptyList(); @@ -236,10 +248,12 @@ public abstract class AbstractConnector implements ServerConnector, return children; } + @Override public void setChildren(List<ServerConnector> children) { this.children = children; } + @Override public boolean isEnabled() { if (!getState().isEnabled()) { return false; @@ -252,6 +266,7 @@ public abstract class AbstractConnector implements ServerConnector, } } + @Override public void updateEnabledState(boolean enabledState) { if (lastEnabledState == enabledState) { return; diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbstractFieldConnector.java b/src/com/vaadin/terminal/gwt/client/ui/AbstractFieldConnector.java index 4be0f02c2a..4611b5a4ed 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/AbstractFieldConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/AbstractFieldConnector.java @@ -3,7 +3,7 @@ */ package com.vaadin.terminal.gwt.client.ui; -import com.vaadin.terminal.gwt.client.AbstractFieldState; +import com.vaadin.shared.AbstractFieldState; import com.vaadin.terminal.gwt.client.ApplicationConnection; public abstract class AbstractFieldConnector extends AbstractComponentConnector { @@ -35,20 +35,15 @@ public abstract class AbstractFieldConnector extends AbstractComponentConnector } @Override - protected String getStyleNames(String primaryStyleName) { - String styleNames = super.getStyleNames(primaryStyleName); + protected void updateWidgetStyleNames() { + super.updateWidgetStyleNames(); - if (isModified()) { - // add modified classname to Fields - styleNames += " " + ApplicationConnection.MODIFIED_CLASSNAME; - } + // add / remove modified style name to Fields + setWidgetStyleName(ApplicationConnection.MODIFIED_CLASSNAME, + isModified()); - if (isRequired()) { - // add required classname to Fields - styleNames += " " + primaryStyleName - + ApplicationConnection.REQUIRED_CLASSNAME_EXT; - } - - return styleNames; + // add / remove error style name to Fields + setWidgetStyleNameWithPrefix(getWidget().getStylePrimaryName(), + ApplicationConnection.REQUIRED_CLASSNAME_EXT, isRequired()); } } diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbstractLayoutConnector.java b/src/com/vaadin/terminal/gwt/client/ui/AbstractLayoutConnector.java index 175e67807f..cd059357a8 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/AbstractLayoutConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/AbstractLayoutConnector.java @@ -3,6 +3,8 @@ */ package com.vaadin.terminal.gwt.client.ui; +import com.vaadin.shared.ui.AbstractLayoutState; + public abstract class AbstractLayoutConnector extends AbstractComponentContainerConnector { diff --git a/src/com/vaadin/terminal/gwt/client/ui/Action.java b/src/com/vaadin/terminal/gwt/client/ui/Action.java index ca13cfc7f3..1a92e30f3f 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/Action.java +++ b/src/com/vaadin/terminal/gwt/client/ui/Action.java @@ -25,6 +25,7 @@ public abstract class Action implements Command { /** * Executed when action fired */ + @Override public abstract void execute(); public String getHTML() { diff --git a/src/com/vaadin/terminal/gwt/client/ui/ClickEventHandler.java b/src/com/vaadin/terminal/gwt/client/ui/ClickEventHandler.java index 758f798ef2..b7b6b13d3c 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/ClickEventHandler.java +++ b/src/com/vaadin/terminal/gwt/client/ui/ClickEventHandler.java @@ -4,8 +4,8 @@ package com.vaadin.terminal.gwt.client.ui; import com.google.gwt.dom.client.NativeEvent; +import com.vaadin.shared.MouseEventDetails; import com.vaadin.terminal.gwt.client.ComponentConnector; -import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.MouseEventDetailsBuilder; public abstract class ClickEventHandler extends AbstractClickEventHandler { diff --git a/src/com/vaadin/terminal/gwt/client/ui/ConnectorClassBasedFactory.java b/src/com/vaadin/terminal/gwt/client/ui/ConnectorClassBasedFactory.java index 051ebdc6df..79dc138df9 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/ConnectorClassBasedFactory.java +++ b/src/com/vaadin/terminal/gwt/client/ui/ConnectorClassBasedFactory.java @@ -6,7 +6,7 @@ package com.vaadin.terminal.gwt.client.ui; import java.util.HashMap; import java.util.Map; -import com.vaadin.terminal.gwt.client.Connector; +import com.vaadin.shared.Connector; public abstract class ConnectorClassBasedFactory<T> { public interface Creator<T> { diff --git a/src/com/vaadin/terminal/gwt/client/ui/ConnectorStateFactory.java b/src/com/vaadin/terminal/gwt/client/ui/ConnectorStateFactory.java index 86e651a0a5..535fd29dfe 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/ConnectorStateFactory.java +++ b/src/com/vaadin/terminal/gwt/client/ui/ConnectorStateFactory.java @@ -4,8 +4,8 @@ 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; +import com.vaadin.shared.Connector; +import com.vaadin.shared.communication.SharedState; public abstract class ConnectorStateFactory extends ConnectorClassBasedFactory<SharedState> { diff --git a/src/com/vaadin/terminal/gwt/client/ui/ConnectorWidgetFactory.java b/src/com/vaadin/terminal/gwt/client/ui/ConnectorWidgetFactory.java index 063d9f03a1..03d2069a94 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/ConnectorWidgetFactory.java +++ b/src/com/vaadin/terminal/gwt/client/ui/ConnectorWidgetFactory.java @@ -15,6 +15,7 @@ public abstract class ConnectorWidgetFactory extends // TODO Move to generator { addCreator(TextFieldConnector.class, new Creator<Widget>() { + @Override public Widget create() { return GWT.create(VTextField.class); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/FocusableFlexTable.java b/src/com/vaadin/terminal/gwt/client/ui/FocusableFlexTable.java index fc97bafc46..2fac234587 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/FocusableFlexTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/FocusableFlexTable.java @@ -42,6 +42,7 @@ public class FocusableFlexTable extends FlexTable implements HasFocusHandlers, * com.google.gwt.event.dom.client.HasFocusHandlers#addFocusHandler(com. * google.gwt.event.dom.client.FocusHandler) */ + @Override public HandlerRegistration addFocusHandler(FocusHandler handler) { return addDomHandler(handler, FocusEvent.getType()); } @@ -53,6 +54,7 @@ public class FocusableFlexTable extends FlexTable implements HasFocusHandlers, * com.google.gwt.event.dom.client.HasBlurHandlers#addBlurHandler(com.google * .gwt.event.dom.client.BlurHandler) */ + @Override public HandlerRegistration addBlurHandler(BlurHandler handler) { return addDomHandler(handler, BlurEvent.getType()); } @@ -64,6 +66,7 @@ public class FocusableFlexTable extends FlexTable implements HasFocusHandlers, * com.google.gwt.event.dom.client.HasKeyDownHandlers#addKeyDownHandler( * com.google.gwt.event.dom.client.KeyDownHandler) */ + @Override public HandlerRegistration addKeyDownHandler(KeyDownHandler handler) { return addDomHandler(handler, KeyDownEvent.getType()); } @@ -75,6 +78,7 @@ public class FocusableFlexTable extends FlexTable implements HasFocusHandlers, * com.google.gwt.event.dom.client.HasKeyPressHandlers#addKeyPressHandler * (com.google.gwt.event.dom.client.KeyPressHandler) */ + @Override public HandlerRegistration addKeyPressHandler(KeyPressHandler handler) { return addDomHandler(handler, KeyPressEvent.getType()); } @@ -99,6 +103,7 @@ public class FocusableFlexTable extends FlexTable implements HasFocusHandlers, * * @see com.vaadin.terminal.gwt.client.Focusable#focus() */ + @Override public void focus() { setFocus(true); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/FocusableFlowPanel.java b/src/com/vaadin/terminal/gwt/client/ui/FocusableFlowPanel.java index 831add049b..258fe441af 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/FocusableFlowPanel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/FocusableFlowPanel.java @@ -39,6 +39,7 @@ public class FocusableFlowPanel extends FlowPanel implements HasFocusHandlers, * com.google.gwt.event.dom.client.HasFocusHandlers#addFocusHandler(com. * google.gwt.event.dom.client.FocusHandler) */ + @Override public HandlerRegistration addFocusHandler(FocusHandler handler) { return addDomHandler(handler, FocusEvent.getType()); } @@ -50,6 +51,7 @@ public class FocusableFlowPanel extends FlowPanel implements HasFocusHandlers, * com.google.gwt.event.dom.client.HasBlurHandlers#addBlurHandler(com.google * .gwt.event.dom.client.BlurHandler) */ + @Override public HandlerRegistration addBlurHandler(BlurHandler handler) { return addDomHandler(handler, BlurEvent.getType()); } @@ -61,6 +63,7 @@ public class FocusableFlowPanel extends FlowPanel implements HasFocusHandlers, * com.google.gwt.event.dom.client.HasKeyDownHandlers#addKeyDownHandler( * com.google.gwt.event.dom.client.KeyDownHandler) */ + @Override public HandlerRegistration addKeyDownHandler(KeyDownHandler handler) { return addDomHandler(handler, KeyDownEvent.getType()); } @@ -72,6 +75,7 @@ public class FocusableFlowPanel extends FlowPanel implements HasFocusHandlers, * com.google.gwt.event.dom.client.HasKeyPressHandlers#addKeyPressHandler * (com.google.gwt.event.dom.client.KeyPressHandler) */ + @Override public HandlerRegistration addKeyPressHandler(KeyPressHandler handler) { return addDomHandler(handler, KeyPressEvent.getType()); } @@ -94,6 +98,7 @@ public class FocusableFlowPanel extends FlowPanel implements HasFocusHandlers, /** * Focus the panel */ + @Override public void focus() { setFocus(true); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/FocusableScrollPanel.java b/src/com/vaadin/terminal/gwt/client/ui/FocusableScrollPanel.java index ef1ea8521b..0ba42eb861 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/FocusableScrollPanel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/FocusableScrollPanel.java @@ -110,6 +110,7 @@ public class FocusableScrollPanel extends SimpleFocusablePanel implements } } + @Override public HandlerRegistration addScrollHandler(ScrollHandler handler) { return addDomHandler(handler, ScrollEvent.getType()); } @@ -168,8 +169,10 @@ public class FocusableScrollPanel extends SimpleFocusablePanel implements } } + @Override public void onScroll(ScrollEvent event) { Scheduler.get().scheduleDeferred(new ScheduledCommand() { + @Override public void execute() { focusElement.getStyle().setTop(getScrollPosition(), Unit.PX); focusElement.getStyle().setLeft(getHorizontalScrollPosition(), diff --git a/src/com/vaadin/terminal/gwt/client/ui/JavaScriptComponentConnector.java b/src/com/vaadin/terminal/gwt/client/ui/JavaScriptComponentConnector.java index bb062a6677..380d96115c 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/JavaScriptComponentConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/JavaScriptComponentConnector.java @@ -3,6 +3,8 @@ */ package com.vaadin.terminal.gwt.client.ui; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.JavaScriptComponentState; import com.vaadin.terminal.gwt.client.JavaScriptConnectorHelper; import com.vaadin.terminal.gwt.client.communication.HasJavaScriptConnectorHelper; import com.vaadin.ui.AbstractJavaScriptComponent; @@ -31,6 +33,7 @@ public final class JavaScriptComponentConnector extends helper.init(); } + @Override public JavaScriptConnectorHelper getJavascriptConnectorHelper() { return helper; } diff --git a/src/com/vaadin/terminal/gwt/client/ui/LayoutClickEventHandler.java b/src/com/vaadin/terminal/gwt/client/ui/LayoutClickEventHandler.java index 7a5d85e34b..9aafaa0bbf 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/LayoutClickEventHandler.java +++ b/src/com/vaadin/terminal/gwt/client/ui/LayoutClickEventHandler.java @@ -5,8 +5,9 @@ package com.vaadin.terminal.gwt.client.ui; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.user.client.Element; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.LayoutClickRpc; import com.vaadin.terminal.gwt.client.ComponentConnector; -import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.MouseEventDetailsBuilder; public abstract class LayoutClickEventHandler extends AbstractClickEventHandler { diff --git a/src/com/vaadin/terminal/gwt/client/ui/MediaBaseConnector.java b/src/com/vaadin/terminal/gwt/client/ui/MediaBaseConnector.java index 42027f911b..ccf90b2285 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/MediaBaseConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/MediaBaseConnector.java @@ -3,39 +3,25 @@ */ package com.vaadin.terminal.gwt.client.ui; +import com.vaadin.shared.communication.URLReference; +import com.vaadin.shared.ui.AbstractMediaState; +import com.vaadin.shared.ui.MediaControl; 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 { - /** - * Server to client RPC interface for controlling playback of the media. - * - * @since 7.0 - */ - public static interface MediaControl extends ClientRpc { - /** - * Start playing the media. - */ - public void play(); - - /** - * Pause playback of the media. - */ - public void pause(); - } - @Override protected void init() { super.init(); registerRpc(MediaControl.class, new MediaControl() { + @Override public void play() { getWidget().play(); } + @Override public void pause() { getWidget().pause(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/ShortcutActionHandler.java b/src/com/vaadin/terminal/gwt/client/ui/ShortcutActionHandler.java index 37e9ab4a69..40454345bc 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/ShortcutActionHandler.java +++ b/src/com/vaadin/terminal/gwt/client/ui/ShortcutActionHandler.java @@ -149,6 +149,7 @@ public class ShortcutActionHandler { } else { shakeTarget(et); Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { shakeTarget(et); } @@ -156,6 +157,7 @@ public class ShortcutActionHandler { } Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { if (finalTarget != null) { client.updateVariable(paintableId, "actiontarget", @@ -187,6 +189,7 @@ public class ShortcutActionHandler { // deferred. Will cause a small flickering, so not doing it for all // browsers. Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { focus(e); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/SimpleFocusablePanel.java b/src/com/vaadin/terminal/gwt/client/ui/SimpleFocusablePanel.java index 9baa1db007..ec62b82ce1 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/SimpleFocusablePanel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/SimpleFocusablePanel.java @@ -36,18 +36,22 @@ public class SimpleFocusablePanel extends SimplePanel implements setTabIndex(0); } + @Override public HandlerRegistration addFocusHandler(FocusHandler handler) { return addDomHandler(handler, FocusEvent.getType()); } + @Override public HandlerRegistration addBlurHandler(BlurHandler handler) { return addDomHandler(handler, BlurEvent.getType()); } + @Override public HandlerRegistration addKeyDownHandler(KeyDownHandler handler) { return addDomHandler(handler, KeyDownEvent.getType()); } + @Override public HandlerRegistration addKeyPressHandler(KeyPressHandler handler) { return addDomHandler(handler, KeyPressEvent.getType()); } @@ -64,6 +68,7 @@ public class SimpleFocusablePanel extends SimplePanel implements } } + @Override public void focus() { setFocus(true); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java b/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java index 7302f9f2ac..16c32acecc 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java +++ b/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java @@ -121,6 +121,7 @@ public class TouchScrollDelegate implements NativePreviewHandler { setElements(scrollables); } + @Override public void onTouchStart(TouchStartEvent event) { assert delegate != null; delegate.onTouchStart(event); @@ -593,6 +594,7 @@ public class TouchScrollDelegate implements NativePreviewHandler { - scrolledElement.getClientHeight(); } + @Override public void onPreviewNativeEvent(NativePreviewEvent event) { int typeInt = event.getTypeInt(); if (transitionOn) { diff --git a/src/com/vaadin/terminal/gwt/client/ui/TreeImages.java b/src/com/vaadin/terminal/gwt/client/ui/TreeImages.java index 37f8889463..221a409511 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/TreeImages.java +++ b/src/com/vaadin/terminal/gwt/client/ui/TreeImages.java @@ -15,6 +15,7 @@ public interface TreeImages extends com.google.gwt.user.client.ui.TreeImages { * @gwt.resource com/vaadin/terminal/gwt/public/default/tree/img/expanded * .png */ + @Override AbstractImagePrototype treeOpen(); /** @@ -24,6 +25,7 @@ public interface TreeImages extends com.google.gwt.user.client.ui.TreeImages { * @gwt.resource com/vaadin/terminal/gwt/public/default/tree/img/collapsed * .png */ + @Override AbstractImagePrototype treeClosed(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/UnknownComponentConnector.java b/src/com/vaadin/terminal/gwt/client/ui/UnknownComponentConnector.java index 0cccec6481..83ac97458e 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/UnknownComponentConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/UnknownComponentConnector.java @@ -4,7 +4,6 @@ package com.vaadin.terminal.gwt.client.ui; - public class UnknownComponentConnector extends AbstractComponentConnector { @Override diff --git a/src/com/vaadin/terminal/gwt/client/ui/VContextMenu.java b/src/com/vaadin/terminal/gwt/client/ui/VContextMenu.java index 692e13bd94..607abe893a 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VContextMenu.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VContextMenu.java @@ -46,6 +46,7 @@ public class VContextMenu extends VOverlay implements SubPartAware { private VLazyExecutor delayedImageLoadExecutioner = new VLazyExecutor(100, new ScheduledCommand() { + @Override public void execute() { imagesLoaded(); } @@ -103,6 +104,7 @@ public class VContextMenu extends VOverlay implements SubPartAware { Util.sinkOnloadForImages(menu.getElement()); setPopupPositionAndShow(new PositionCallback() { + @Override public void setPosition(int offsetWidth, int offsetHeight) { // mac FF gets bad width due GWT popups overflow hacks, // re-determine width @@ -129,6 +131,7 @@ public class VContextMenu extends VOverlay implements SubPartAware { * the positioning has been done. */ Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { // Focus the menu. menu.setFocus(true); @@ -186,18 +189,22 @@ public class VContextMenu extends VOverlay implements SubPartAware { return super.getItems().get(index); } + @Override public HandlerRegistration addFocusHandler(FocusHandler handler) { return addDomHandler(handler, FocusEvent.getType()); } + @Override public HandlerRegistration addBlurHandler(BlurHandler handler) { return addDomHandler(handler, BlurEvent.getType()); } + @Override public HandlerRegistration addKeyDownHandler(KeyDownHandler handler) { return addDomHandler(handler, KeyDownEvent.getType()); } + @Override public HandlerRegistration addKeyPressHandler(KeyPressHandler handler) { return addDomHandler(handler, KeyPressEvent.getType()); } @@ -215,6 +222,7 @@ public class VContextMenu extends VOverlay implements SubPartAware { setFocus(true); } + @Override public void onLoad(LoadEvent event) { // Handle icon onload events to ensure shadow is resized correctly delayedImageLoadExecutioner.trigger(); @@ -222,6 +230,7 @@ public class VContextMenu extends VOverlay implements SubPartAware { } + @Override public Element getSubPartElement(String subPart) { int index = Integer.parseInt(subPart.substring(6)); // ApplicationConnection.getConsole().log( @@ -232,6 +241,7 @@ public class VContextMenu extends VOverlay implements SubPartAware { return item.getElement().getFirstChildElement().cast(); } + @Override public String getSubPartName(Element subElement) { if (getElement().isOrHasChild(subElement)) { com.google.gwt.dom.client.Element e = subElement; diff --git a/src/com/vaadin/terminal/gwt/client/ui/VOverlay.java b/src/com/vaadin/terminal/gwt/client/ui/VOverlay.java index df655ef959..f2f13d1f35 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VOverlay.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VOverlay.java @@ -6,7 +6,10 @@ package com.vaadin.terminal.gwt.client.ui; import com.google.gwt.animation.client.Animation; import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.IFrameElement; import com.google.gwt.dom.client.Style; +import com.google.gwt.dom.client.Style.BorderStyle; +import com.google.gwt.dom.client.Style.Position; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.logical.shared.CloseEvent; import com.google.gwt.event.logical.shared.CloseHandler; @@ -14,6 +17,7 @@ import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.RootPanel; +import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.BrowserInfo; /** @@ -23,6 +27,49 @@ import com.vaadin.terminal.gwt.client.BrowserInfo; */ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> { + public static class PositionAndSize { + private int left, top, width, height; + + public int getLeft() { + return left; + } + + public void setLeft(int left) { + this.left = left; + } + + public int getTop() { + return top; + } + + public void setTop(int top) { + this.top = top; + } + + public int getWidth() { + return width; + } + + public void setWidth(int width) { + this.width = width; + } + + public int getHeight() { + return height; + } + + public void setHeight(int height) { + this.height = height; + } + + public void setAnimationFromCenterProgress(double progress) { + left += (int) (width * (1.0 - progress) / 2.0); + top += (int) (height * (1.0 - progress) / 2.0); + width = (int) (width * progress); + height = (int) (height * progress); + } + } + /* * The z-index value from where all overlays live. This can be overridden in * any extending class. @@ -45,6 +92,18 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> { */ private Element shadow; + /* + * Creator of VOverlow (widget that made the instance, not the layout + * parent) + */ + private Widget owner; + + /** + * The shim iframe behind the overlay, allowing PDFs and applets to be + * covered by overlays. + */ + private IFrameElement shimElement; + /** * The HTML snippet that is used to render the actual shadow. In consists of * nine different DIV-elements with the following class names: @@ -66,6 +125,11 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> { */ private static final String SHADOW_HTML = "<div class=\"top-left\"></div><div class=\"top\"></div><div class=\"top-right\"></div><div class=\"left\"></div><div class=\"center\"></div><div class=\"right\"></div><div class=\"bottom-left\"></div><div class=\"bottom\"></div><div class=\"bottom-right\"></div>"; + /** + * Matches {@link PopupPanel}.ANIMATION_DURATION + */ + private static final int POPUP_PANEL_ANIMATION_DURATION = 200; + private boolean sinkShadowEvents = false; public VOverlay() { @@ -116,9 +180,15 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> { return shadow != null; } + private void removeShim() { + if (shimElement != null) { + shimElement.removeFromParent(); + } + } + private void removeShadowIfPresent() { if (isShadowAttached()) { - shadow.getParentElement().removeChild(shadow); + shadow.removeFromParent(); // Remove event listener from the shadow unsinkShadowEvents(); @@ -129,6 +199,10 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> { return isShadowEnabled() && shadow.getParentElement() != null; } + private boolean isShimAttached() { + return shimElement != null && shimElement.hasParentElement(); + } + private void adjustZIndex() { setZIndex(Z_INDEX); } @@ -156,7 +230,46 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> { style.setMarginLeft(-adjustByRelativeLeftBodyMargin(), Unit.PX); style.setMarginTop(-adjustByRelativeTopBodyMargin(), Unit.PX); super.setPopupPosition(left, top); - updateShadowSizeAndPosition(isAnimationEnabled() ? 0 : 1); + sizeOrPositionUpdated(isAnimationEnabled() ? 0 : 1); + } + + private IFrameElement getShimElement() { + if (shimElement == null) { + shimElement = Document.get().createIFrameElement(); + + // Insert shim iframe before the main overlay element. It does not + // matter if it is in front or behind the shadow as we cannot put a + // shim behind the shadow due to its transparency. + shimElement.getStyle().setPosition(Position.ABSOLUTE); + shimElement.getStyle().setBorderStyle(BorderStyle.NONE); + shimElement.setFrameBorder(0); + shimElement.setMarginHeight(0); + } + return shimElement; + } + + private int getActualTop() { + int y = getAbsoluteTop(); + + /* This is needed for IE7 at least */ + // Account for the difference between absolute position and the + // body's positioning context. + y -= Document.get().getBodyOffsetTop(); + y -= adjustByRelativeTopBodyMargin(); + + return y; + } + + private int getActualLeft() { + int x = getAbsoluteLeft(); + + /* This is needed for IE7 at least */ + // Account for the difference between absolute position and the + // body's positioning context. + x -= Document.get().getBodyOffsetLeft(); + x -= adjustByRelativeLeftBodyMargin(); + + return x; } private static int adjustByRelativeTopBodyMargin() { @@ -189,13 +302,10 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> { @Override public void show() { super.show(); - if (isShadowEnabled()) { - if (isAnimationEnabled()) { - ShadowAnimation sa = new ShadowAnimation(); - sa.run(200); - } else { - updateShadowSizeAndPosition(1.0); - } + if (isAnimationEnabled()) { + new ResizeAnimation().run(POPUP_PANEL_ANIMATION_DURATION); + } else { + sizeOrPositionUpdated(1.0); } } @@ -205,6 +315,7 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> { // Always ensure shadow is removed when the overlay is removed. removeShadowIfPresent(); + removeShim(); } @Override @@ -219,13 +330,13 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> { @Override public void setWidth(String width) { super.setWidth(width); - updateShadowSizeAndPosition(1.0); + sizeOrPositionUpdated(1.0); } @Override public void setHeight(String height) { super.setHeight(height); - updateShadowSizeAndPosition(1.0); + sizeOrPositionUpdated(1.0); } /** @@ -244,28 +355,29 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> { } } - /* + /** * Extending classes should always call this method after they change the * size of overlay without using normal 'setWidth(String)' and * 'setHeight(String)' methods (if not calling super.setWidth/Height). + * */ - public void updateShadowSizeAndPosition() { - updateShadowSizeAndPosition(1.0); + public void sizeOrPositionUpdated() { + sizeOrPositionUpdated(1.0); } /** - * Recalculates proper position and dimensions for the shadow element. Can - * be used to animate the shadow, using the 'progress' parameter (used to - * animate the shadow in sync with GWT PopupPanel's default animation - * 'PopupPanel.AnimationType.CENTER'). + * Recalculates proper position and dimensions for the shadow and shim + * elements. Can be used to animate the related elements, using the + * 'progress' parameter (used to animate the shadow in sync with GWT + * PopupPanel's default animation 'PopupPanel.AnimationType.CENTER'). * * @param progress * A value between 0.0 and 1.0, indicating the progress of the * animation (0=start, 1=end). */ - private void updateShadowSizeAndPosition(final double progress) { + private void sizeOrPositionUpdated(final double progress) { // Don't do anything if overlay element is not attached - if (!isAttached() || shadow == null) { + if (!isAttached()) { return; } // Calculate proper z-index @@ -288,37 +400,26 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> { getOffsetWidth(); } - int x = getAbsoluteLeft(); - int y = getAbsoluteTop(); + PositionAndSize positionAndSize = new PositionAndSize(); + positionAndSize.left = getActualLeft(); + positionAndSize.top = getActualTop(); + positionAndSize.width = getOffsetWidth(); + positionAndSize.height = getOffsetHeight(); - /* This is needed for IE7 at least */ - // Account for the difference between absolute position and the - // body's positioning context. - x -= Document.get().getBodyOffsetLeft(); - y -= Document.get().getBodyOffsetTop(); - x -= adjustByRelativeLeftBodyMargin(); - y -= adjustByRelativeTopBodyMargin(); - - int width = getOffsetWidth(); - int height = getOffsetHeight(); - - if (width < 0) { - width = 0; + if (positionAndSize.width < 0) { + positionAndSize.width = 0; } - if (height < 0) { - height = 0; + if (positionAndSize.height < 0) { + positionAndSize.height = 0; } - // Animate the shadow size - x += (int) (width * (1.0 - progress) / 2.0); - y += (int) (height * (1.0 - progress) / 2.0); - width = (int) (width * progress); - height = (int) (height * progress); + // Animate the size + positionAndSize.setAnimationFromCenterProgress(progress); // Opera needs some shaking to get parts of the shadow showing // properly // (ticket #2704) - if (BrowserInfo.get().isOpera()) { + if (BrowserInfo.get().isOpera() && isShadowEnabled()) { // Clear the height of all middle elements DOM.getChild(shadow, 3).getStyle().setProperty("height", "auto"); DOM.getChild(shadow, 4).getStyle().setProperty("height", "auto"); @@ -326,15 +427,17 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> { } // Update correct values - DOM.setStyleAttribute(shadow, "zIndex", zIndex); - DOM.setStyleAttribute(shadow, "width", width + "px"); - DOM.setStyleAttribute(shadow, "height", height + "px"); - DOM.setStyleAttribute(shadow, "top", y + "px"); - DOM.setStyleAttribute(shadow, "left", x + "px"); - DOM.setStyleAttribute(shadow, "display", progress < 0.9 ? "none" : ""); + if (isShadowEnabled()) { + updateSizeAndPosition(shadow, positionAndSize); + DOM.setStyleAttribute(shadow, "zIndex", zIndex); + DOM.setStyleAttribute(shadow, "display", progress < 0.9 ? "none" + : ""); + } + updateSizeAndPosition((Element) Element.as(getShimElement()), + positionAndSize); // Opera fix, part 2 (ticket #2704) - if (BrowserInfo.get().isOpera()) { + if (BrowserInfo.get().isOpera() && isShadowEnabled()) { // We'll fix the height of all the middle elements DOM.getChild(shadow, 3) .getStyle() @@ -351,20 +454,33 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> { } // Attach to dom if not there already - if (!isShadowAttached()) { + if (isShadowEnabled() && !isShadowAttached()) { RootPanel.get().getElement().insertBefore(shadow, getElement()); sinkShadowEvents(); } + if (!isShimAttached()) { + RootPanel.get().getElement() + .insertBefore(shimElement, getElement()); + } + + } + private void updateSizeAndPosition(Element e, + PositionAndSize positionAndSize) { + e.getStyle().setLeft(positionAndSize.left, Unit.PX); + e.getStyle().setTop(positionAndSize.top, Unit.PX); + e.getStyle().setWidth(positionAndSize.width, Unit.PX); + e.getStyle().setHeight(positionAndSize.height, Unit.PX); } - protected class ShadowAnimation extends Animation { + protected class ResizeAnimation extends Animation { @Override protected void onUpdate(double progress) { - updateShadowSizeAndPosition(progress); + sizeOrPositionUpdated(progress); } } + @Override public void onClose(CloseEvent<PopupPanel> event) { removeShadowIfPresent(); } @@ -414,4 +530,25 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> { protected boolean isSinkShadowEvents() { return sinkShadowEvents; } + + /** + * Get owner (Widget that made this VOverlay, not the layout parent) of + * VOverlay + * + * @return Owner (creator) or null if not defined + */ + public Widget getOwner() { + return owner; + } + + /** + * Set owner (Widget that made this VOverlay, not the layout parent) of + * VOverlay + * + * @param owner + * Owner (creator) of VOverlay + */ + public void setOwner(Widget owner) { + this.owner = owner; + } } diff --git a/src/com/vaadin/terminal/gwt/client/ui/Vaadin6Connector.java b/src/com/vaadin/terminal/gwt/client/ui/Vaadin6Connector.java index 7fccdafd2a..f2f0125c86 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/Vaadin6Connector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/Vaadin6Connector.java @@ -10,6 +10,7 @@ import com.vaadin.terminal.gwt.client.UIDL; public abstract class Vaadin6Connector extends AbstractComponentConnector implements Paintable { + @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { ((Paintable) getWidget()).updateFromUIDL(uidl, client); } 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 91436f5353..188d464b84 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/absolutelayout/AbsoluteLayoutConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/absolutelayout/AbsoluteLayoutConnector.java @@ -10,6 +10,10 @@ 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.shared.ui.Connect; +import com.vaadin.shared.ui.LayoutClickRpc; +import com.vaadin.shared.ui.absolutelayout.AbsoluteLayoutServerRpc; +import com.vaadin.shared.ui.absolutelayout.AbsoluteLayoutState; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ConnectorHierarchyChangeEvent; import com.vaadin.terminal.gwt.client.DirectionalManagedLayout; @@ -18,9 +22,7 @@ import com.vaadin.terminal.gwt.client.VCaption; import com.vaadin.terminal.gwt.client.communication.RpcProxy; import com.vaadin.terminal.gwt.client.communication.StateChangeEvent; import com.vaadin.terminal.gwt.client.ui.AbstractComponentContainerConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.LayoutClickEventHandler; -import com.vaadin.terminal.gwt.client.ui.LayoutClickRpc; import com.vaadin.terminal.gwt.client.ui.absolutelayout.VAbsoluteLayout.AbsoluteWrapper; import com.vaadin.ui.AbsoluteLayout; @@ -68,6 +70,7 @@ public class AbsoluteLayoutConnector extends element); } + @Override public void updateCaption(ComponentConnector component) { VAbsoluteLayout absoluteLayoutWidget = getWidget(); AbsoluteWrapper componentWrapper = getWrapper(component); @@ -147,6 +150,7 @@ public class AbsoluteLayoutConnector extends } } + @Override public void layoutVertically() { VAbsoluteLayout layout = getWidget(); for (ComponentConnector paintable : getChildComponents()) { @@ -179,6 +183,7 @@ public class AbsoluteLayoutConnector extends } } + @Override public void layoutHorizontally() { VAbsoluteLayout layout = getWidget(); for (ComponentConnector paintable : getChildComponents()) { diff --git a/src/com/vaadin/terminal/gwt/client/ui/absolutelayout/AbsoluteLayoutServerRpc.java b/src/com/vaadin/terminal/gwt/client/ui/absolutelayout/AbsoluteLayoutServerRpc.java deleted file mode 100644 index d626eb5b6c..0000000000 --- a/src/com/vaadin/terminal/gwt/client/ui/absolutelayout/AbsoluteLayoutServerRpc.java +++ /dev/null @@ -1,11 +0,0 @@ -/* -@VaadinApache2LicenseForJavaFiles@ - */ -package com.vaadin.terminal.gwt.client.ui.absolutelayout; - -import com.vaadin.terminal.gwt.client.communication.ServerRpc; -import com.vaadin.terminal.gwt.client.ui.LayoutClickRpc; - -public interface AbsoluteLayoutServerRpc extends LayoutClickRpc, ServerRpc { - -}
\ No newline at end of file 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 f022e97973..7ff1257da3 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/accordion/AccordionConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/accordion/AccordionConnector.java @@ -5,10 +5,10 @@ package com.vaadin.terminal.gwt.client.ui.accordion; import java.util.Iterator; +import com.vaadin.shared.ui.Connect; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.UIDL; -import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.SimpleManagedLayout; import com.vaadin.terminal.gwt.client.ui.accordion.VAccordion.StackItem; import com.vaadin.terminal.gwt.client.ui.layout.MayScrollChildren; @@ -57,10 +57,12 @@ public class AccordionConnector extends TabsheetBaseConnector implements return (VAccordion) super.getWidget(); } + @Override public void updateCaption(ComponentConnector component) { /* Accordion does not render its children's captions */ } + @Override public void layout() { VAccordion accordion = getWidget(); diff --git a/src/com/vaadin/terminal/gwt/client/ui/accordion/VAccordion.java b/src/com/vaadin/terminal/gwt/client/ui/accordion/VAccordion.java index b83d5afb00..d9320787e8 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/accordion/VAccordion.java +++ b/src/com/vaadin/terminal/gwt/client/ui/accordion/VAccordion.java @@ -434,6 +434,7 @@ public class VAccordion extends VTabsheetBase { } } + @Override public void onClick(ClickEvent event) { onSelectTab(this); } 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 1c7feb132a..6b713c229c 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,9 @@ 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.shared.ui.Connect; import com.vaadin.terminal.gwt.client.BrowserInfo; 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; 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 d79aa96ac6..0cec6ce96b 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/button/ButtonConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/button/ButtonConnector.java @@ -12,15 +12,17 @@ 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.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.communication.FieldRpc.FocusAndBlurServerRpc; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.Connect.LoadStyle; +import com.vaadin.shared.ui.button.ButtonServerRpc; +import com.vaadin.shared.ui.button.ButtonState; import com.vaadin.terminal.gwt.client.EventHelper; -import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.MouseEventDetailsBuilder; -import com.vaadin.terminal.gwt.client.communication.FieldRpc.FocusAndBlurServerRpc; import com.vaadin.terminal.gwt.client.communication.RpcProxy; 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.terminal.gwt.client.ui.Icon; import com.vaadin.ui.Button; @@ -103,18 +105,21 @@ public class ButtonConnector extends AbstractComponentConnector implements return (ButtonState) super.getState(); } + @Override public void onFocus(FocusEvent event) { // EventHelper.updateFocusHandler ensures that this is called only when // there is a listener on server side focusBlurProxy.focus(); } + @Override public void onBlur(BlurEvent event) { // EventHelper.updateFocusHandler ensures that this is called only when // there is a listener on server side focusBlurProxy.blur(); } + @Override public void onClick(ClickEvent event) { if (getState().isDisableOnClick()) { getWidget().setEnabled(false); diff --git a/src/com/vaadin/terminal/gwt/client/ui/button/VButton.java b/src/com/vaadin/terminal/gwt/client/ui/button/VButton.java index 0cd8bc54f4..3232338f62 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/button/VButton.java +++ b/src/com/vaadin/terminal/gwt/client/ui/button/VButton.java @@ -18,7 +18,6 @@ import com.google.gwt.user.client.ui.FocusWidget; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.BrowserInfo; import com.vaadin.terminal.gwt.client.Util; -import com.vaadin.terminal.gwt.client.VTooltip; import com.vaadin.terminal.gwt.client.ui.Icon; public class VButton extends FocusWidget implements ClickHandler { @@ -90,7 +89,6 @@ public class VButton extends FocusWidget implements ClickHandler { setTabIndex(0); sinkEvents(Event.ONCLICK | Event.MOUSEEVENTS | Event.FOCUSEVENTS | Event.KEYEVENTS); - sinkEvents(VTooltip.TOOLTIP_EVENTS); setStyleName(CLASSNAME); @@ -128,9 +126,6 @@ public class VButton extends FocusWidget implements ClickHandler { * -onload event handler added (for icon handling) */ public void onBrowserEvent(Event event) { - if (client != null) { - client.handleTooltipEvent(event, this); - } if (DOM.eventGetType(event) == Event.ONLOAD) { Util.notifyParentOfSizeChange(this, true); } @@ -286,6 +281,7 @@ public class VButton extends FocusWidget implements ClickHandler { * com.google.gwt.event.dom.client.ClickHandler#onClick(com.google.gwt.event * .dom.client.ClickEvent) */ + @Override public void onClick(ClickEvent event) { if (BrowserInfo.get().isSafari()) { VButton.this.setFocus(true); 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 bc405b793b..c7e827bc74 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/checkbox/CheckBoxConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/checkbox/CheckBoxConnector.java @@ -12,15 +12,17 @@ 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.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.communication.FieldRpc.FocusAndBlurServerRpc; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.checkbox.CheckBoxServerRpc; +import com.vaadin.shared.ui.checkbox.CheckBoxState; import com.vaadin.terminal.gwt.client.EventHelper; -import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.MouseEventDetailsBuilder; import com.vaadin.terminal.gwt.client.VTooltip; -import com.vaadin.terminal.gwt.client.communication.FieldRpc.FocusAndBlurServerRpc; import com.vaadin.terminal.gwt.client.communication.RpcProxy; import com.vaadin.terminal.gwt.client.communication.StateChangeEvent; import com.vaadin.terminal.gwt.client.ui.AbstractFieldConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.Icon; import com.vaadin.ui.CheckBox; @@ -114,18 +116,21 @@ public class CheckBoxConnector extends AbstractFieldConnector implements return (VCheckBox) super.getWidget(); } + @Override public void onFocus(FocusEvent event) { // EventHelper.updateFocusHandler ensures that this is called only when // there is a listener on server side focusBlurRpc.focus(); } + @Override public void onBlur(BlurEvent event) { // EventHelper.updateFocusHandler ensures that this is called only when // there is a listener on server side focusBlurRpc.blur(); } + @Override public void onClick(ClickEvent event) { if (!isEnabled()) { return; diff --git a/src/com/vaadin/terminal/gwt/client/ui/checkbox/VCheckBox.java b/src/com/vaadin/terminal/gwt/client/ui/checkbox/VCheckBox.java index fd90796ea5..a6eec2de8a 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/checkbox/VCheckBox.java +++ b/src/com/vaadin/terminal/gwt/client/ui/checkbox/VCheckBox.java @@ -31,7 +31,6 @@ public class VCheckBox extends com.google.gwt.user.client.ui.CheckBox implements public VCheckBox() { setStyleName(CLASSNAME); - sinkEvents(VTooltip.TOOLTIP_EVENTS); Element el = DOM.getFirstChild(getElement()); while (el != null) { DOM.sinkEvents(el, @@ -53,9 +52,6 @@ public class VCheckBox extends com.google.gwt.user.client.ui.CheckBox implements if (event.getTypeInt() == Event.ONLOAD) { Util.notifyParentOfSizeChange(this, true); } - if (client != null) { - client.handleTooltipEvent(event, this); - } } } 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 ff153d30c9..0fa71bb7a6 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/combobox/ComboBoxConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/combobox/ComboBoxConnector.java @@ -5,12 +5,12 @@ package com.vaadin.terminal.gwt.client.ui.combobox; import java.util.Iterator; +import com.vaadin.shared.ui.Connect; 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.ui.AbstractFieldConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.SimpleManagedLayout; import com.vaadin.terminal.gwt.client.ui.combobox.VFilterSelect.FilterSelectSuggestion; import com.vaadin.terminal.gwt.client.ui.menubar.MenuItem; @@ -27,6 +27,7 @@ public class ComboBoxConnector extends AbstractFieldConnector implements * com.vaadin.terminal.gwt.client.Paintable#updateFromUIDL(com.vaadin.terminal * .gwt.client.UIDL, com.vaadin.terminal.gwt.client.ApplicationConnection) */ + @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { // Save details getWidget().client = client; @@ -230,6 +231,7 @@ public class ComboBoxConnector extends AbstractFieldConnector implements return (VFilterSelect) super.getWidget(); } + @Override public void layout() { VFilterSelect widget = getWidget(); if (widget.initDone) { diff --git a/src/com/vaadin/terminal/gwt/client/ui/combobox/VFilterSelect.java b/src/com/vaadin/terminal/gwt/client/ui/combobox/VFilterSelect.java index 8c5d521445..6e24a74e04 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/combobox/VFilterSelect.java +++ b/src/com/vaadin/terminal/gwt/client/ui/combobox/VFilterSelect.java @@ -44,17 +44,16 @@ import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.PopupPanel.PositionCallback; import com.google.gwt.user.client.ui.SuggestOracle.Suggestion; import com.google.gwt.user.client.ui.TextBox; +import com.vaadin.shared.ComponentState; +import com.vaadin.shared.EventId; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.BrowserInfo; import com.vaadin.terminal.gwt.client.ComponentConnector; -import com.vaadin.terminal.gwt.client.ComponentState; import com.vaadin.terminal.gwt.client.ConnectorMap; -import com.vaadin.terminal.gwt.client.EventId; import com.vaadin.terminal.gwt.client.Focusable; 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.VTooltip; import com.vaadin.terminal.gwt.client.ui.Field; import com.vaadin.terminal.gwt.client.ui.SubPartAware; import com.vaadin.terminal.gwt.client.ui.VLazyExecutor; @@ -102,6 +101,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, * specified) and the caption of the item */ + @Override public String getDisplayString() { final StringBuffer sb = new StringBuffer(); if (iconUri != null) { @@ -125,6 +125,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, * Get a string that represents this item. This is used in the text box. */ + @Override public String getReplacementString() { return caption; } @@ -151,6 +152,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, * Executes a selection of this item. */ + @Override public void execute() { onSuggestionSelected(this); } @@ -455,6 +457,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, * (int, int) */ + @Override public void setPosition(int offsetWidth, int offsetHeight) { int top = -1; @@ -592,6 +595,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, private VLazyExecutor delayedImageLoadExecutioner = new VLazyExecutor( 100, new ScheduledCommand() { + @Override public void execute() { if (suggestionPopup.isVisible() && suggestionPopup.isAttached()) { @@ -749,6 +753,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, private static final String SUBPART_PREFIX = "item"; + @Override public Element getSubPartElement(String subPart) { int index = Integer.parseInt(subPart.substring(SUBPART_PREFIX .length())); @@ -758,6 +763,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, return item.getElement(); } + @Override public String getSubPartName(Element subElement) { if (!getElement().isOrHasChild(subElement)) { return null; @@ -780,6 +786,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, return null; } + @Override public void onLoad(LoadEvent event) { // Handle icon onload events to ensure shadow is resized // correctly @@ -824,21 +831,6 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, * The text box where the filter is written */ protected final TextBox tb = new TextBox() { - /* - * (non-Javadoc) - * - * @see - * com.google.gwt.user.client.ui.TextBoxBase#onBrowserEvent(com.google - * .gwt.user.client.Event) - */ - - @Override - public void onBrowserEvent(Event event) { - super.onBrowserEvent(event); - if (client != null) { - client.handleTooltipEvent(event, VFilterSelect.this); - } - } // Overridden to avoid selecting text when text input is disabled @Override @@ -869,9 +861,6 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, @Override public void onBrowserEvent(Event event) { super.onBrowserEvent(event); - if (client != null) { - client.handleTooltipEvent(event, VFilterSelect.this); - } /* * Prevent the keyboard focus from leaving the textfield by @@ -961,6 +950,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, selectedItemIcon.setStyleName("v-icon"); selectedItemIcon.addLoadHandler(new LoadHandler() { + @Override public void onLoad(LoadEvent event) { if (BrowserInfo.get().isIE8()) { // IE8 needs some help to discover it should reposition the @@ -972,8 +962,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, } }); - tb.sinkEvents(VTooltip.TOOLTIP_EVENTS); - popupOpener.sinkEvents(VTooltip.TOOLTIP_EVENTS | Event.ONMOUSEDOWN); + popupOpener.sinkEvents(Event.ONMOUSEDOWN); panel.add(tb); panel.add(popupOpener); initWidget(panel); @@ -1214,6 +1203,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, * .event.dom.client.KeyDownEvent) */ + @Override public void onKeyDown(KeyDownEvent event) { if (enabled && !readonly) { int keyCode = event.getNativeKeyCode(); @@ -1376,6 +1366,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, * The KeyUpEvent of the key depressed */ + @Override public void onKeyUp(KeyUpEvent event) { if (enabled && !readonly) { switch (event.getNativeKeyCode()) { @@ -1424,6 +1415,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, * Listener for popupopener */ + @Override public void onClick(ClickEvent event) { if (textInputEnabled && event.getNativeEvent().getEventTarget().cast() == tb @@ -1488,6 +1480,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, * .dom.client.FocusEvent) */ + @Override public void onFocus(FocusEvent event) { /* @@ -1525,6 +1518,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, * .dom.client.BlurEvent) */ + @Override public void onBlur(BlurEvent event) { if (BrowserInfo.get().isIE() && preventNextBlurEventInIE) { @@ -1582,6 +1576,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, * @see com.vaadin.terminal.gwt.client.Focusable#focus() */ + @Override public void focus() { focused = true; if (prompting && !readonly) { @@ -1690,6 +1685,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, suggestionPopup.hide(); } + @Override public Element getSubPartElement(String subPart) { if ("textbox".equals(subPart)) { return this.tb.getElement(); @@ -1699,6 +1695,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler, return null; } + @Override public String getSubPartName(Element subElement) { if (tb.getElement().isOrHasChild(subElement)) { return "textbox"; 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 4d341bddfc..7d07172cd1 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/csslayout/CssLayoutConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/csslayout/CssLayoutConnector.java @@ -9,6 +9,11 @@ import java.util.Map; import com.google.gwt.dom.client.Style; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.LayoutClickRpc; +import com.vaadin.shared.ui.VMarginInfo; +import com.vaadin.shared.ui.csslayout.CssLayoutServerRpc; +import com.vaadin.shared.ui.csslayout.CssLayoutState; import com.vaadin.terminal.gwt.client.BrowserInfo; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ConnectorHierarchyChangeEvent; @@ -17,10 +22,7 @@ import com.vaadin.terminal.gwt.client.VCaption; 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.Connect; import com.vaadin.terminal.gwt.client.ui.LayoutClickEventHandler; -import com.vaadin.terminal.gwt.client.ui.LayoutClickRpc; -import com.vaadin.terminal.gwt.client.ui.VMarginInfo; import com.vaadin.terminal.gwt.client.ui.csslayout.VCssLayout.FlowPane; import com.vaadin.ui.CssLayout; @@ -137,6 +139,7 @@ public class CssLayoutConnector extends AbstractLayoutConnector { return (VCssLayout) super.getWidget(); } + @Override public void updateCaption(ComponentConnector child) { Widget childWidget = child.getWidget(); FlowPane cssLayoutWidgetContainer = getWidget().panel; diff --git a/src/com/vaadin/terminal/gwt/client/ui/csslayout/CssLayoutServerRpc.java b/src/com/vaadin/terminal/gwt/client/ui/csslayout/CssLayoutServerRpc.java deleted file mode 100644 index 7ba89d4c4c..0000000000 --- a/src/com/vaadin/terminal/gwt/client/ui/csslayout/CssLayoutServerRpc.java +++ /dev/null @@ -1,11 +0,0 @@ -/* -@VaadinApache2LicenseForJavaFiles@ - */ -package com.vaadin.terminal.gwt.client.ui.csslayout; - -import com.vaadin.terminal.gwt.client.communication.ServerRpc; -import com.vaadin.terminal.gwt.client.ui.LayoutClickRpc; - -public interface CssLayoutServerRpc extends LayoutClickRpc, ServerRpc { - -}
\ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/client/ui/csslayout/VCssLayout.java b/src/com/vaadin/terminal/gwt/client/ui/csslayout/VCssLayout.java index 7076120388..53f8ca6c8a 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/csslayout/VCssLayout.java +++ b/src/com/vaadin/terminal/gwt/client/ui/csslayout/VCssLayout.java @@ -9,8 +9,8 @@ import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.ui.VMarginInfo; import com.vaadin.terminal.gwt.client.StyleConstants; -import com.vaadin.terminal.gwt.client.ui.VMarginInfo; public class VCssLayout extends SimplePanel { public static final String TAGNAME = "csslayout"; 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 5001711d6c..f7740a9205 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/customcomponent/CustomComponentConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/customcomponent/CustomComponentConnector.java @@ -3,11 +3,11 @@ */ package com.vaadin.terminal.gwt.client.ui.customcomponent; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.Connect.LoadStyle; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ConnectorHierarchyChangeEvent; import com.vaadin.terminal.gwt.client.ui.AbstractComponentContainerConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; -import com.vaadin.terminal.gwt.client.ui.Connect.LoadStyle; import com.vaadin.ui.CustomComponent; @Connect(value = CustomComponent.class, loadStyle = LoadStyle.EAGER) @@ -19,6 +19,7 @@ public class CustomComponentConnector extends return (VCustomComponent) super.getWidget(); } + @Override public void updateCaption(ComponentConnector component) { // NOP, custom component dont render composition roots caption } 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 09045df6eb..b4f42c36aa 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/customfield/CustomFieldConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/customfield/CustomFieldConnector.java @@ -4,9 +4,9 @@ package com.vaadin.terminal.gwt.client.ui.customfield; import com.google.gwt.core.client.GWT; -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.shared.AbstractFieldState; +import com.vaadin.shared.communication.SharedState; +import com.vaadin.shared.ui.Connect; import com.vaadin.terminal.gwt.client.ui.customcomponent.CustomComponentConnector; import com.vaadin.ui.CustomField; 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 f8861caf92..9d973227d1 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/customlayout/CustomLayoutConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/customlayout/CustomLayoutConnector.java @@ -5,17 +5,21 @@ package com.vaadin.terminal.gwt.client.ui.customlayout; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.customlayout.CustomLayoutState; +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.Paintable; +import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.communication.StateChangeEvent; import com.vaadin.terminal.gwt.client.ui.AbstractLayoutConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.SimpleManagedLayout; import com.vaadin.ui.CustomLayout; @Connect(CustomLayout.class) public class CustomLayoutConnector extends AbstractLayoutConnector implements - SimpleManagedLayout { + SimpleManagedLayout, Paintable { @Override public CustomLayoutState getState() { @@ -102,11 +106,19 @@ public class CustomLayoutConnector extends AbstractLayoutConnector implements return (VCustomLayout) super.getWidget(); } + @Override public void updateCaption(ComponentConnector paintable) { getWidget().updateCaption(paintable); } + @Override public void layout() { getWidget().iLayoutJS(DOM.getFirstChild(getWidget().getElement())); } + + @Override + public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { + // Not interested in anything from the UIDL - just implementing the + // interface to avoid some warning (#8688) + } } 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 b55f480bac..159b5bc414 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/datefield/AbstractDateFieldConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/datefield/AbstractDateFieldConnector.java @@ -15,6 +15,7 @@ import com.vaadin.terminal.gwt.client.ui.AbstractFieldConnector; public class AbstractDateFieldConnector extends AbstractFieldConnector implements Paintable { + @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { if (!isRealUpdate(uidl)) { return; @@ -63,15 +64,23 @@ public class AbstractDateFieldConnector extends AbstractFieldConnector newResolution = VDateField.RESOLUTION_YEAR; } + // Remove old stylename that indicates current resolution + setWidgetStyleName( + VDateField.CLASSNAME + + "-" + + VDateField + .resolutionToString(getWidget().currentResolution), + false); + getWidget().currentResolution = newResolution; // Add stylename that indicates current resolution - getWidget() - .addStyleName( - VDateField.CLASSNAME - + "-" - + VDateField - .resolutionToString(getWidget().currentResolution)); + setWidgetStyleName( + VDateField.CLASSNAME + + "-" + + VDateField + .resolutionToString(getWidget().currentResolution), + true); final int year = uidl.getIntVariable("year"); final int month = (getWidget().currentResolution >= VDateField.RESOLUTION_MONTH) ? uidl 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 7cd9c110ba..304c75322a 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/datefield/InlineDateFieldConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/datefield/InlineDateFieldConnector.java @@ -5,10 +5,10 @@ package com.vaadin.terminal.gwt.client.ui.datefield; import java.util.Date; +import com.vaadin.shared.ui.Connect; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.DateTimeService; import com.vaadin.terminal.gwt.client.UIDL; -import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.datefield.VCalendarPanel.FocusChangeListener; import com.vaadin.terminal.gwt.client.ui.datefield.VCalendarPanel.TimeChangeListener; import com.vaadin.ui.InlineDateField; @@ -40,6 +40,7 @@ public class InlineDateFieldConnector extends AbstractDateFieldConnector { if (getWidget().currentResolution > VDateField.RESOLUTION_DAY) { getWidget().calendarPanel .setTimeChangeListener(new TimeChangeListener() { + @Override public void changed(int hour, int min, int sec, int msec) { Date d = getWidget().getDate(); if (d == null) { @@ -64,6 +65,7 @@ public class InlineDateFieldConnector extends AbstractDateFieldConnector { if (getWidget().currentResolution <= VDateField.RESOLUTION_MONTH) { getWidget().calendarPanel .setFocusChangeListener(new FocusChangeListener() { + @Override public void focusChanged(Date date) { Date date2 = new Date(); if (getWidget().calendarPanel.getDate() != null) { 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 e169d83b48..a8c8ada1d9 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/datefield/PopupDateFieldConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/datefield/PopupDateFieldConnector.java @@ -6,10 +6,10 @@ package com.vaadin.terminal.gwt.client.ui.datefield; import java.util.Date; +import com.vaadin.shared.ui.Connect; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.DateTimeService; import com.vaadin.terminal.gwt.client.UIDL; -import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.datefield.VCalendarPanel.FocusChangeListener; import com.vaadin.terminal.gwt.client.ui.datefield.VCalendarPanel.TimeChangeListener; import com.vaadin.ui.DateField; @@ -35,14 +35,6 @@ public class PopupDateFieldConnector extends TextualDateConnector { super.updateFromUIDL(uidl, client); - String popupStyleNames = getStyleNames(VPopupCalendar.POPUP_PRIMARY_STYLE_NAME); - popupStyleNames += " " - + VDateField.CLASSNAME - + "-" - + VPopupCalendar - .resolutionToString(getWidget().currentResolution); - getWidget().popup.setStyleName(popupStyleNames); - getWidget().calendar.setDateTimeService(getWidget() .getDateTimeService()); getWidget().calendar.setShowISOWeekNumbers(getWidget() @@ -61,6 +53,7 @@ public class PopupDateFieldConnector extends TextualDateConnector { if (getWidget().currentResolution <= VPopupCalendar.RESOLUTION_MONTH) { getWidget().calendar .setFocusChangeListener(new FocusChangeListener() { + @Override public void focusChanged(Date date) { getWidget().updateValue(date); getWidget().buildDate(); @@ -76,6 +69,7 @@ public class PopupDateFieldConnector extends TextualDateConnector { if (getWidget().currentResolution > VPopupCalendar.RESOLUTION_DAY) { getWidget().calendar .setTimeChangeListener(new TimeChangeListener() { + @Override public void changed(int hour, int min, int sec, int msec) { Date d = getWidget().getDate(); if (d == null) { @@ -114,4 +108,30 @@ public class PopupDateFieldConnector extends TextualDateConnector { public VPopupCalendar getWidget() { return (VPopupCalendar) super.getWidget(); } + + @Override + protected void setWidgetStyleName(String styleName, boolean add) { + super.setWidgetStyleName(styleName, add); + + // update the style change to popup calendar widget + getWidget().popup.setStyleName(styleName, add); + } + + @Override + protected void setWidgetStyleNameWithPrefix(String prefix, + String styleName, boolean add) { + super.setWidgetStyleNameWithPrefix(prefix, styleName, add); + + // update the style change to popup calendar widget with the correct + // prefix + if (!styleName.startsWith("-")) { + getWidget().popup.setStyleName( + VPopupCalendar.POPUP_PRIMARY_STYLE_NAME + "-" + styleName, + add); + } else { + getWidget().popup.setStyleName( + VPopupCalendar.POPUP_PRIMARY_STYLE_NAME + styleName, add); + } + } + } diff --git a/src/com/vaadin/terminal/gwt/client/ui/datefield/VCalendarPanel.java b/src/com/vaadin/terminal/gwt/client/ui/datefield/VCalendarPanel.java index acfff60d53..e4e25a5a2e 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/datefield/VCalendarPanel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/datefield/VCalendarPanel.java @@ -121,6 +121,7 @@ public class VCalendarPanel extends FocusableFlexTable implements * com.google.gwt.event.dom.client.ClickHandler#onClick(com.google.gwt * .event.dom.client.ClickEvent) */ + @Override public void onClick(ClickEvent event) { Day day = (Day) event.getSource(); focusDay(day.getDate()); @@ -718,6 +719,7 @@ public class VCalendarPanel extends FocusableFlexTable implements * com.google.gwt.event.dom.client.KeyDownHandler#onKeyDown(com.google.gwt * .event.dom.client.KeyDownEvent) */ + @Override public void onKeyDown(KeyDownEvent event) { handleKeyPress(event); } @@ -729,6 +731,7 @@ public class VCalendarPanel extends FocusableFlexTable implements * com.google.gwt.event.dom.client.KeyPressHandler#onKeyPress(com.google * .gwt.event.dom.client.KeyPressEvent) */ + @Override public void onKeyPress(KeyPressEvent event) { handleKeyPress(event); } @@ -1124,6 +1127,7 @@ public class VCalendarPanel extends FocusableFlexTable implements * com.google.gwt.event.dom.client.MouseOutHandler#onMouseOut(com.google * .gwt.event.dom.client.MouseOutEvent) */ + @Override public void onMouseOut(MouseOutEvent event) { if (mouseTimer != null) { mouseTimer.cancel(); @@ -1137,6 +1141,7 @@ public class VCalendarPanel extends FocusableFlexTable implements * com.google.gwt.event.dom.client.MouseDownHandler#onMouseDown(com.google * .gwt.event.dom.client.MouseDownEvent) */ + @Override public void onMouseDown(MouseDownEvent event) { // Allow user to click-n-hold for fast-forward or fast-rewind. // Timer is first used for a 500ms delay after mousedown. After that has @@ -1169,6 +1174,7 @@ public class VCalendarPanel extends FocusableFlexTable implements * com.google.gwt.event.dom.client.MouseUpHandler#onMouseUp(com.google.gwt * .event.dom.client.MouseUpEvent) */ + @Override public void onMouseUp(MouseUpEvent event) { if (mouseTimer != null) { mouseTimer.cancel(); @@ -1354,6 +1360,7 @@ public class VCalendarPanel extends FocusableFlexTable implements ListBox lastDropDown = getLastDropDown(); lastDropDown.addKeyDownHandler(new KeyDownHandler() { + @Override public void onKeyDown(KeyDownEvent event) { boolean shiftKey = event.getNativeEvent().getShiftKey(); if (shiftKey) { @@ -1439,6 +1446,7 @@ public class VCalendarPanel extends FocusableFlexTable implements * com.google.gwt.event.dom.client.ChangeHandler#onChange(com.google.gwt * .event.dom.client.ChangeEvent) */ + @Override public void onChange(ChangeEvent event) { /* * Value from dropdowns gets always set for the value. Like year and @@ -1589,6 +1597,7 @@ public class VCalendarPanel extends FocusableFlexTable implements * com.google.gwt.event.dom.client.BlurHandler#onBlur(com.google.gwt.event * .dom.client.BlurEvent) */ + @Override public void onBlur(final BlurEvent event) { if (event.getSource() instanceof VCalendarPanel) { hasFocus = false; @@ -1603,6 +1612,7 @@ public class VCalendarPanel extends FocusableFlexTable implements * com.google.gwt.event.dom.client.FocusHandler#onFocus(com.google.gwt.event * .dom.client.FocusEvent) */ + @Override public void onFocus(FocusEvent event) { if (event.getSource() instanceof VCalendarPanel) { hasFocus = true; @@ -1627,6 +1637,7 @@ public class VCalendarPanel extends FocusableFlexTable implements private static final String SUBPART_DAY = "day"; private static final String SUBPART_MONTH_YEAR_HEADER = "header"; + @Override public String getSubPartName(Element subElement) { if (contains(nextMonth, subElement)) { return SUBPART_NEXT_MONTH; @@ -1685,6 +1696,7 @@ public class VCalendarPanel extends FocusableFlexTable implements return w.getElement().isOrHasChild(subElement); } + @Override public Element getSubPartElement(String subPart) { if (SUBPART_NEXT_MONTH.equals(subPart)) { return nextMonth.getElement(); diff --git a/src/com/vaadin/terminal/gwt/client/ui/datefield/VDateField.java b/src/com/vaadin/terminal/gwt/client/ui/datefield/VDateField.java index d169b1b47e..614c4febdd 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/datefield/VDateField.java +++ b/src/com/vaadin/terminal/gwt/client/ui/datefield/VDateField.java @@ -6,11 +6,9 @@ package com.vaadin.terminal.gwt.client.ui.datefield; import java.util.Date; -import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.FlowPanel; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.DateTimeService; -import com.vaadin.terminal.gwt.client.VTooltip; import com.vaadin.terminal.gwt.client.ui.Field; public class VDateField extends FlowPanel implements Field { @@ -66,15 +64,6 @@ public class VDateField extends FlowPanel implements Field { public VDateField() { setStyleName(CLASSNAME); dts = new DateTimeService(); - sinkEvents(VTooltip.TOOLTIP_EVENTS); - } - - @Override - public void onBrowserEvent(Event event) { - super.onBrowserEvent(event); - if (client != null) { - client.handleTooltipEvent(event, this); - } } /* diff --git a/src/com/vaadin/terminal/gwt/client/ui/datefield/VDateFieldCalendar.java b/src/com/vaadin/terminal/gwt/client/ui/datefield/VDateFieldCalendar.java index 84b3c678eb..e411fb3013 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/datefield/VDateFieldCalendar.java +++ b/src/com/vaadin/terminal/gwt/client/ui/datefield/VDateFieldCalendar.java @@ -23,16 +23,19 @@ public class VDateFieldCalendar extends VDateField { calendarPanel = new VCalendarPanel(); add(calendarPanel); calendarPanel.setSubmitListener(new SubmitListener() { + @Override public void onSubmit() { updateValueFromPanel(); } + @Override public void onCancel() { // TODO Auto-generated method stub } }); calendarPanel.setFocusOutListener(new FocusOutListener() { + @Override public boolean onFocusOut(DomEvent<?> event) { updateValueFromPanel(); return false; diff --git a/src/com/vaadin/terminal/gwt/client/ui/datefield/VPopupCalendar.java b/src/com/vaadin/terminal/gwt/client/ui/datefield/VPopupCalendar.java index 7011e5358b..de6ebf29af 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/datefield/VPopupCalendar.java +++ b/src/com/vaadin/terminal/gwt/client/ui/datefield/VPopupCalendar.java @@ -66,6 +66,7 @@ public class VPopupCalendar extends VTextualDate implements Field, calendar = GWT.create(VCalendarPanel.class); calendar.setFocusOutListener(new FocusOutListener() { + @Override public boolean onFocusOut(DomEvent<?> event) { event.preventDefault(); closeCalendarPanel(); @@ -74,6 +75,7 @@ public class VPopupCalendar extends VTextualDate implements Field, }); calendar.setSubmitListener(new SubmitListener() { + @Override public void onSubmit() { // Update internal value and send valuechange event if immediate updateValue(calendar.getDate()); @@ -84,6 +86,7 @@ public class VPopupCalendar extends VTextualDate implements Field, closeCalendarPanel(); } + @Override public void onCancel() { closeCalendarPanel(); } @@ -164,6 +167,7 @@ public class VPopupCalendar extends VTextualDate implements Field, popup.setWidth(""); popup.setHeight(""); popup.setPopupPositionAndShow(new PositionCallback() { + @Override public void setPosition(int offsetWidth, int offsetHeight) { final int w = offsetWidth; final int h = offsetHeight; @@ -232,6 +236,7 @@ public class VPopupCalendar extends VTextualDate implements Field, * com.google.gwt.event.dom.client.ClickHandler#onClick(com.google.gwt.event * .dom.client.ClickEvent) */ + @Override public void onClick(ClickEvent event) { if (event.getSource() == calendarToggle && isEnabled()) { openCalendarPanel(); @@ -245,6 +250,7 @@ public class VPopupCalendar extends VTextualDate implements Field, * com.google.gwt.event.logical.shared.CloseHandler#onClose(com.google.gwt * .event.logical.shared.CloseEvent) */ + @Override public void onClose(CloseEvent<PopupPanel> event) { if (event.getSource() == popup) { buildDate(); diff --git a/src/com/vaadin/terminal/gwt/client/ui/datefield/VTextualDate.java b/src/com/vaadin/terminal/gwt/client/ui/datefield/VTextualDate.java index db4eca152a..8c252ddc69 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/datefield/VTextualDate.java +++ b/src/com/vaadin/terminal/gwt/client/ui/datefield/VTextualDate.java @@ -14,7 +14,7 @@ import com.google.gwt.event.dom.client.FocusEvent; import com.google.gwt.event.dom.client.FocusHandler; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.TextBox; -import com.vaadin.terminal.gwt.client.EventId; +import com.vaadin.shared.EventId; import com.vaadin.terminal.gwt.client.Focusable; import com.vaadin.terminal.gwt.client.LocaleNotLoadedException; import com.vaadin.terminal.gwt.client.LocaleService; @@ -50,6 +50,7 @@ public class VTextualDate extends VDateField implements Field, ChangeHandler, text.addStyleName(CLASSNAME + "-textfield"); text.addChangeHandler(this); text.addFocusHandler(new FocusHandler() { + @Override public void onFocus(FocusEvent event) { text.addStyleName(VTextField.CLASSNAME + "-" + VTextField.CLASSNAME_FOCUS); @@ -66,6 +67,7 @@ public class VTextualDate extends VDateField implements Field, ChangeHandler, } }); text.addBlurHandler(new BlurHandler() { + @Override public void onBlur(BlurEvent event) { text.removeStyleName(VTextField.CLASSNAME + "-" + VTextField.CLASSNAME_FOCUS); @@ -168,6 +170,7 @@ public class VTextualDate extends VDateField implements Field, ChangeHandler, } } + @Override @SuppressWarnings("deprecation") public void onChange(ChangeEvent event) { if (!text.getText().equals("")) { @@ -291,6 +294,7 @@ public class VTextualDate extends VDateField implements Field, ChangeHandler, return format.trim(); } + @Override public void focus() { text.setFocus(true); } @@ -315,6 +319,7 @@ public class VTextualDate extends VDateField implements Field, ChangeHandler, private final String TEXTFIELD_ID = "field"; + @Override public Element getSubPartElement(String subPart) { if (subPart.equals(TEXTFIELD_ID)) { return text.getElement(); @@ -323,6 +328,7 @@ public class VTextualDate extends VDateField implements Field, ChangeHandler, return null; } + @Override public String getSubPartName(Element subElement) { if (text.getElement().isOrHasChild(subElement)) { return TEXTFIELD_ID; diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/DDUtil.java b/src/com/vaadin/terminal/gwt/client/ui/dd/DDUtil.java index 97f5eb86fd..f9ec8a2f48 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/DDUtil.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/DDUtil.java @@ -6,6 +6,8 @@ package com.vaadin.terminal.gwt.client.ui.dd; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Window; +import com.vaadin.shared.ui.dd.HorizontalDropLocation; +import com.vaadin.shared.ui.dd.VerticalDropLocation; import com.vaadin.terminal.gwt.client.Util; public class DDUtil { diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VAbstractDropHandler.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VAbstractDropHandler.java index ce47c7d13a..ce0533ac1f 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VAbstractDropHandler.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VAbstractDropHandler.java @@ -47,6 +47,7 @@ public abstract class VAbstractDropHandler implements VDropHandler { /** * Default implementation does nothing. */ + @Override public void dragOver(VDragEvent drag) { } @@ -55,6 +56,7 @@ public abstract class VAbstractDropHandler implements VDropHandler { * Default implementation does nothing. Implementors should clean possible * emphasis or drag icons here. */ + @Override public void dragLeave(VDragEvent drag) { } @@ -73,8 +75,10 @@ public abstract class VAbstractDropHandler implements VDropHandler { * implementation. * */ + @Override public void dragEnter(final VDragEvent drag) { validate(new VAcceptCallback() { + @Override public void accepted(VDragEvent event) { dragAccepted(drag); } @@ -94,6 +98,7 @@ public abstract class VAbstractDropHandler implements VDropHandler { protected void validate(final VAcceptCallback cb, final VDragEvent event) { Command checkCriteria = new Command() { + @Override public void execute() { acceptCriteria.accept(event, criterioUIDL, cb); } @@ -109,12 +114,14 @@ public abstract class VAbstractDropHandler implements VDropHandler { * can't be verified on client or if {@link AcceptCriterion} are met on * client. */ + @Override public boolean drop(VDragEvent drag) { if (acceptCriteria.needsServerSideCheck(drag, criterioUIDL)) { return true; } else { validated = false; acceptCriteria.accept(drag, criterioUIDL, new VAcceptCallback() { + @Override public void accepted(VDragEvent event) { validated = true; } @@ -129,6 +136,7 @@ public abstract class VAbstractDropHandler implements VDropHandler { * side counterpart of the Paintable is expected to implement * {@link DropTarget} interface. */ + @Override public abstract ComponentConnector getConnector(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VAcceptAll.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VAcceptAll.java index a864a93c2a..7ce0d69727 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VAcceptAll.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VAcceptAll.java @@ -7,6 +7,7 @@ package com.vaadin.terminal.gwt.client.ui.dd; import com.vaadin.event.dd.acceptcriteria.AcceptAll; +import com.vaadin.shared.ui.dd.AcceptCriterion; import com.vaadin.terminal.gwt.client.UIDL; @AcceptCriterion(AcceptAll.class) diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VAcceptCriterion.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VAcceptCriterion.java index 0d71e23903..b1a88166ec 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VAcceptCriterion.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VAcceptCriterion.java @@ -19,6 +19,7 @@ public abstract class VAcceptCriterion { final VAcceptCallback callback) { if (needsServerSideCheck(drag, configuration)) { VDragEventServerCallback acceptCallback = new VDragEventServerCallback() { + @Override public void handleResponse(boolean accepted, UIDL response) { if (accepted) { callback.accepted(drag); diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VAnd.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VAnd.java index 19399d7d4a..2f0cdc2a80 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VAnd.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VAnd.java @@ -7,6 +7,7 @@ package com.vaadin.terminal.gwt.client.ui.dd; import com.vaadin.event.dd.acceptcriteria.And; +import com.vaadin.shared.ui.dd.AcceptCriterion; import com.vaadin.terminal.gwt.client.UIDL; @AcceptCriterion(And.class) @@ -33,6 +34,7 @@ final public class VAnd extends VAcceptCriterion implements VAcceptCallback { return true; } + @Override public void accepted(VDragEvent event) { b1 = true; } diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VContainsDataFlavor.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VContainsDataFlavor.java index 3cd341eefd..7c5d9f769a 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VContainsDataFlavor.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VContainsDataFlavor.java @@ -7,6 +7,7 @@ package com.vaadin.terminal.gwt.client.ui.dd; import com.vaadin.event.dd.acceptcriteria.ContainsDataFlavor; +import com.vaadin.shared.ui.dd.AcceptCriterion; import com.vaadin.terminal.gwt.client.UIDL; @AcceptCriterion(ContainsDataFlavor.class) diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java index 2f404a3028..bc98860716 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java @@ -22,9 +22,10 @@ import com.google.gwt.user.client.Event.NativePreviewHandler; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.dd.DragEventType; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.ComponentConnector; -import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.MouseEventDetailsBuilder; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.Util; @@ -48,6 +49,7 @@ public class VDragAndDropManager { private final class DefaultDragAndDropEventHandler implements NativePreviewHandler { + @Override public void onPreviewNativeEvent(NativePreviewEvent event) { NativeEvent nativeEvent = event.getNativeEvent(); @@ -223,10 +225,6 @@ public class VDragAndDropManager { } - public enum DragEventType { - ENTER, LEAVE, OVER, DROP - } - public static final String DD_SERVICE = "DD"; private static VDragAndDropManager instance; @@ -307,6 +305,7 @@ public class VDragAndDropManager { final Command startDrag = new Command() { + @Override public void execute() { isStarted = true; addActiveDragSourceStyleName(); @@ -352,6 +351,7 @@ public class VDragAndDropManager { deferredStartRegistration = Event .addNativePreviewHandler(new NativePreviewHandler() { + @Override public void onPreviewNativeEvent( NativePreviewEvent event) { int typeInt = event.getTypeInt(); @@ -509,6 +509,7 @@ public class VDragAndDropManager { final ApplicationConnection client = currentDropHandler .getApplicationConnection(); Scheduler.get().scheduleFixedDelay(new RepeatingCommand() { + @Override public boolean execute() { if (!client.hasActiveRequest()) { removeActiveDragSourceStyleName(dragSource); diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VDragSourceIs.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VDragSourceIs.java index b6af81085f..ffb923f3e0 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VDragSourceIs.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VDragSourceIs.java @@ -4,6 +4,7 @@ package com.vaadin.terminal.gwt.client.ui.dd; import com.vaadin.event.dd.acceptcriteria.SourceIs; +import com.vaadin.shared.ui.dd.AcceptCriterion; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ConnectorMap; import com.vaadin.terminal.gwt.client.UIDL; diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VIsOverId.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VIsOverId.java index 5dad4873ea..d0055d48dd 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VIsOverId.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VIsOverId.java @@ -6,6 +6,7 @@ */ package com.vaadin.terminal.gwt.client.ui.dd; +import com.vaadin.shared.ui.dd.AcceptCriterion; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ConnectorMap; import com.vaadin.terminal.gwt.client.UIDL; diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VItemIdIs.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VItemIdIs.java index ca4d0e900d..67f323a950 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VItemIdIs.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VItemIdIs.java @@ -6,6 +6,7 @@ */ package com.vaadin.terminal.gwt.client.ui.dd; +import com.vaadin.shared.ui.dd.AcceptCriterion; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.ui.AbstractSelect; diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VLazyInitItemIdentifiers.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VLazyInitItemIdentifiers.java index e3bed02642..bfda603d58 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VLazyInitItemIdentifiers.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VLazyInitItemIdentifiers.java @@ -8,6 +8,7 @@ package com.vaadin.terminal.gwt.client.ui.dd; import java.util.HashSet; +import com.vaadin.shared.ui.dd.AcceptCriterion; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.ui.Table; import com.vaadin.ui.Tree; @@ -48,6 +49,7 @@ public class VLazyInitItemIdentifiers extends VAcceptCriterion { VDragEventServerCallback acceptCallback = new VDragEventServerCallback() { + @Override public void handleResponse(boolean accepted, UIDL response) { hashSet = new HashSet<String>(); String[] stringArrayAttribute = response diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VNot.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VNot.java index e4d2dff606..8355afc625 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VNot.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VNot.java @@ -7,6 +7,7 @@ package com.vaadin.terminal.gwt.client.ui.dd; import com.vaadin.event.dd.acceptcriteria.Not; +import com.vaadin.shared.ui.dd.AcceptCriterion; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.VConsole; @@ -33,6 +34,7 @@ final public class VNot extends VAcceptCriterion { b1 = false; VAcceptCallback accept1cb = new VAcceptCallback() { + @Override public void accepted(VDragEvent event) { b1 = true; } diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VOr.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VOr.java index 91ba4bf0c4..46bf28b42a 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VOr.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VOr.java @@ -7,6 +7,7 @@ package com.vaadin.terminal.gwt.client.ui.dd; import com.vaadin.event.dd.acceptcriteria.Or; +import com.vaadin.shared.ui.dd.AcceptCriterion; import com.vaadin.terminal.gwt.client.UIDL; /** @@ -41,6 +42,7 @@ final public class VOr extends VAcceptCriterion implements VAcceptCallback { return false; // not used here } + @Override public void accepted(VDragEvent event) { accepted = true; } diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VServerAccept.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VServerAccept.java index 64c2da5320..42d4d90ae4 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VServerAccept.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VServerAccept.java @@ -7,6 +7,7 @@ package com.vaadin.terminal.gwt.client.ui.dd; import com.vaadin.event.dd.acceptcriteria.ServerSideCriterion; +import com.vaadin.shared.ui.dd.AcceptCriterion; import com.vaadin.terminal.gwt.client.UIDL; @AcceptCriterion(ServerSideCriterion.class) @@ -16,6 +17,7 @@ final public class VServerAccept extends VAcceptCriterion { final VAcceptCallback callback) { VDragEventServerCallback acceptCallback = new VDragEventServerCallback() { + @Override public void handleResponse(boolean accepted, UIDL response) { if (accepted) { callback.accepted(drag); diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VSourceIsTarget.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VSourceIsTarget.java index 2365eabe22..dcb2f405fa 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VSourceIsTarget.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VSourceIsTarget.java @@ -7,6 +7,7 @@ package com.vaadin.terminal.gwt.client.ui.dd; import com.vaadin.event.dd.acceptcriteria.SourceIsTarget; +import com.vaadin.shared.ui.dd.AcceptCriterion; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.UIDL; diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VTargetDetailIs.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VTargetDetailIs.java index 610d555745..e67d81387c 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VTargetDetailIs.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VTargetDetailIs.java @@ -7,6 +7,7 @@ package com.vaadin.terminal.gwt.client.ui.dd; import com.vaadin.event.dd.acceptcriteria.TargetDetailIs; +import com.vaadin.shared.ui.dd.AcceptCriterion; import com.vaadin.terminal.gwt.client.UIDL; @AcceptCriterion(TargetDetailIs.class) diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VTargetInSubtree.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VTargetInSubtree.java index 56478b2b95..14bca0ed91 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VTargetInSubtree.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VTargetInSubtree.java @@ -7,6 +7,7 @@ package com.vaadin.terminal.gwt.client.ui.dd; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.ui.dd.AcceptCriterion; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.ui.tree.VTree; import com.vaadin.terminal.gwt.client.ui.tree.VTree.TreeNode; 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 2a78cc4433..6914b451fa 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/draganddropwrapper/DragAndDropWrapperConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/draganddropwrapper/DragAndDropWrapperConnector.java @@ -6,10 +6,10 @@ package com.vaadin.terminal.gwt.client.ui.draganddropwrapper; import java.util.HashMap; import java.util.Set; +import com.vaadin.shared.ui.Connect; 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.ui.Connect; import com.vaadin.terminal.gwt.client.ui.customcomponent.CustomComponentConnector; import com.vaadin.ui.DragAndDropWrapper; @@ -17,6 +17,7 @@ import com.vaadin.ui.DragAndDropWrapper; public class DragAndDropWrapperConnector extends CustomComponentConnector implements Paintable { + @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { getWidget().client = client; if (isRealUpdate(uidl) && !uidl.hasAttribute("hidden")) { diff --git a/src/com/vaadin/terminal/gwt/client/ui/draganddropwrapper/VDragAndDropWrapper.java b/src/com/vaadin/terminal/gwt/client/ui/draganddropwrapper/VDragAndDropWrapper.java index 4c36e92bbb..e77055764e 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/draganddropwrapper/VDragAndDropWrapper.java +++ b/src/com/vaadin/terminal/gwt/client/ui/draganddropwrapper/VDragAndDropWrapper.java @@ -22,6 +22,8 @@ import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.xhr.client.ReadyStateChangeHandler; import com.google.gwt.xhr.client.XMLHttpRequest; +import com.vaadin.shared.ui.dd.HorizontalDropLocation; +import com.vaadin.shared.ui.dd.VerticalDropLocation; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ConnectorMap; @@ -29,11 +31,9 @@ import com.vaadin.terminal.gwt.client.LayoutManager; import com.vaadin.terminal.gwt.client.MouseEventDetailsBuilder; import com.vaadin.terminal.gwt.client.Util; import com.vaadin.terminal.gwt.client.VConsole; -import com.vaadin.terminal.gwt.client.VTooltip; import com.vaadin.terminal.gwt.client.ValueMap; import com.vaadin.terminal.gwt.client.ui.customcomponent.VCustomComponent; import com.vaadin.terminal.gwt.client.ui.dd.DDUtil; -import com.vaadin.terminal.gwt.client.ui.dd.HorizontalDropLocation; import com.vaadin.terminal.gwt.client.ui.dd.VAbstractDropHandler; import com.vaadin.terminal.gwt.client.ui.dd.VAcceptCallback; import com.vaadin.terminal.gwt.client.ui.dd.VDragAndDropManager; @@ -43,7 +43,6 @@ import com.vaadin.terminal.gwt.client.ui.dd.VHasDropHandler; import com.vaadin.terminal.gwt.client.ui.dd.VHtml5DragEvent; import com.vaadin.terminal.gwt.client.ui.dd.VHtml5File; import com.vaadin.terminal.gwt.client.ui.dd.VTransferable; -import com.vaadin.terminal.gwt.client.ui.dd.VerticalDropLocation; /** * @@ -64,12 +63,12 @@ public class VDragAndDropWrapper extends VCustomComponent implements public VDragAndDropWrapper() { super(); - sinkEvents(VTooltip.TOOLTIP_EVENTS); hookHtml5Events(getElement()); setStyleName(CLASSNAME); addDomHandler(new MouseDownHandler() { + @Override public void onMouseDown(MouseDownEvent event) { if (startDrag(event.getNativeEvent())) { event.preventDefault(); // prevent text selection @@ -79,6 +78,7 @@ public class VDragAndDropWrapper extends VCustomComponent implements addDomHandler(new TouchStartHandler() { + @Override public void onTouchStart(TouchStartEvent event) { if (startDrag(event.getNativeEvent())) { /* @@ -92,16 +92,6 @@ public class VDragAndDropWrapper extends VCustomComponent implements sinkEvents(Event.TOUCHEVENTS); } - @Override - public void onBrowserEvent(Event event) { - super.onBrowserEvent(event); - - if (hasTooltip && client != null) { - // Override child tooltips if the wrapper has a tooltip defined - client.handleTooltipEvent(event, this); - } - } - /** * Starts a drag and drop operation from mousedown or touchstart event if * required conditions are met. @@ -178,6 +168,7 @@ public class VDragAndDropWrapper extends VCustomComponent implements private ReadyStateChangeHandler readyStateChangeHandler = new ReadyStateChangeHandler() { + @Override public void onReadyStateChange(XMLHttpRequest xhr) { if (xhr.getReadyState() == XMLHttpRequest.DONE) { // visit server for possible @@ -194,6 +185,7 @@ public class VDragAndDropWrapper extends VCustomComponent implements void startNextUpload() { Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { if (!uploading) { if (fileIds.size() > 0) { @@ -425,6 +417,7 @@ public class VDragAndDropWrapper extends VCustomComponent implements files.add(file); } + @Override public VDropHandler getDropHandler() { return dropHandler; } @@ -463,6 +456,7 @@ public class VDragAndDropWrapper extends VCustomComponent implements currentlyValid = false; validate(new VAcceptCallback() { + @Override public void accepted(VDragEvent event) { dragAccepted(drag); } @@ -507,6 +501,7 @@ public class VDragAndDropWrapper extends VCustomComponent implements VDragAndDropWrapper.this); } + @Override public ApplicationConnection getApplicationConnection() { return client; } 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 af3ad67db4..a1851d9c84 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/embedded/EmbeddedConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/embedded/EmbeddedConnector.java @@ -15,8 +15,10 @@ 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.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.embedded.EmbeddedServerRpc; import com.vaadin.terminal.gwt.client.ApplicationConnection; -import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.Paintable; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.VConsole; @@ -24,7 +26,6 @@ import com.vaadin.terminal.gwt.client.VTooltip; import com.vaadin.terminal.gwt.client.communication.RpcProxy; import com.vaadin.terminal.gwt.client.ui.AbstractComponentConnector; import com.vaadin.terminal.gwt.client.ui.ClickEventHandler; -import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.ui.Embedded; @Connect(Embedded.class) @@ -41,6 +42,7 @@ public class EmbeddedConnector extends AbstractComponentConnector implements rpc = RpcProxy.create(EmbeddedServerRpc.class, this); } + @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { if (!isRealUpdate(uidl)) { return; @@ -54,6 +56,16 @@ public class EmbeddedConnector extends AbstractComponentConnector implements clickEventHandler.handleEventHandlerRegistration(); if (uidl.hasAttribute("type")) { + // remove old style name related to type + if (getWidget().type != null) { + getWidget().removeStyleName( + VEmbedded.CLASSNAME + "-" + getWidget().type); + } + // remove old style name related to mime type + if (getWidget().mimetype != null) { + getWidget().removeStyleName( + VEmbedded.CLASSNAME + "-" + getWidget().mimetype); + } getWidget().type = uidl.getStringAttribute("type"); if (getWidget().type.equals("image")) { getWidget().addStyleName(VEmbedded.CLASSNAME + "-image"); @@ -118,13 +130,25 @@ public class EmbeddedConnector extends AbstractComponentConnector implements VConsole.log("Unknown Embedded type '" + getWidget().type + "'"); } } else if (uidl.hasAttribute("mimetype")) { + // remove old style name related to type + if (getWidget().type != null) { + getWidget().removeStyleName( + VEmbedded.CLASSNAME + "-" + getWidget().type); + } + // remove old style name related to mime type + if (getWidget().mimetype != null) { + getWidget().removeStyleName( + VEmbedded.CLASSNAME + "-" + getWidget().mimetype); + } final String mime = uidl.getStringAttribute("mimetype"); if (mime.equals("application/x-shockwave-flash")) { + getWidget().mimetype = "flash"; // Handle embedding of Flash getWidget().addStyleName(VEmbedded.CLASSNAME + "-flash"); getWidget().setHTML(getWidget().createFlashEmbed(uidl)); } else if (mime.equals("image/svg+xml")) { + getWidget().mimetype = "svg"; getWidget().addStyleName(VEmbedded.CLASSNAME + "-svg"); String data; Map<String, String> parameters = VEmbedded.getParameters(uidl); diff --git a/src/com/vaadin/terminal/gwt/client/ui/embedded/EmbeddedServerRpc.java b/src/com/vaadin/terminal/gwt/client/ui/embedded/EmbeddedServerRpc.java deleted file mode 100644 index 7f36c812bc..0000000000 --- a/src/com/vaadin/terminal/gwt/client/ui/embedded/EmbeddedServerRpc.java +++ /dev/null @@ -1,10 +0,0 @@ -/* -@VaadinApache2LicenseForJavaFiles@ - */ -package com.vaadin.terminal.gwt.client.ui.embedded; - -import com.vaadin.terminal.gwt.client.communication.ServerRpc; -import com.vaadin.terminal.gwt.client.ui.ClickRpc; - -public interface EmbeddedServerRpc extends ClickRpc, ServerRpc { -}
\ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/client/ui/embedded/VEmbedded.java b/src/com/vaadin/terminal/gwt/client/ui/embedded/VEmbedded.java index 203e7362f3..1d2a5a156a 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/embedded/VEmbedded.java +++ b/src/com/vaadin/terminal/gwt/client/ui/embedded/VEmbedded.java @@ -26,6 +26,7 @@ public class VEmbedded extends HTML { protected Element browserElement; protected String type; + protected String mimetype; protected ApplicationConnection client; @@ -232,8 +233,6 @@ public class VEmbedded extends HTML { VConsole.log("Embeddable onload"); Util.notifyParentOfSizeChange(this, true); } - - client.handleTooltipEvent(event, this); } } 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 981c753dd1..e31de1f85d 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/form/FormConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/form/FormConnector.java @@ -6,13 +6,14 @@ package com.vaadin.terminal.gwt.client.ui.form; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.KeyDownEvent; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.form.FormState; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.ComponentConnector; 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.ui.AbstractComponentContainerConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.Icon; import com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler; import com.vaadin.terminal.gwt.client.ui.layout.ElementResizeEvent; @@ -25,6 +26,7 @@ public class FormConnector extends AbstractComponentContainerConnector implements Paintable, MayScrollChildren { private final ElementResizeListener footerResizeListener = new ElementResizeListener() { + @Override public void onElementResize(ElementResizeEvent e) { VForm form = getWidget(); @@ -57,6 +59,7 @@ public class FormConnector extends AbstractComponentContainerConnector return false; } + @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { getWidget().client = client; getWidget().id = uidl.getId(); @@ -180,6 +183,7 @@ public class FormConnector extends AbstractComponentContainerConnector } } + @Override public void updateCaption(ComponentConnector component) { // NOP form don't render caption for neither field layout nor footer // layout diff --git a/src/com/vaadin/terminal/gwt/client/ui/form/VForm.java b/src/com/vaadin/terminal/gwt/client/ui/form/VForm.java index 81f24a8e7e..823b0e83ae 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/form/VForm.java +++ b/src/com/vaadin/terminal/gwt/client/ui/form/VForm.java @@ -62,6 +62,7 @@ public class VForm extends ComplexPanel implements KeyDownHandler { fieldSet.appendChild(footerContainer); } + @Override public void onKeyDown(KeyDownEvent event) { shortcutHandler.handleKeyboardEvent(Event.as(event.getNativeEvent())); } 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 ca21947a6c..567513d7fe 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/formlayout/FormLayoutConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/formlayout/FormLayoutConnector.java @@ -3,18 +3,21 @@ */ package com.vaadin.terminal.gwt.client.ui.formlayout; +import com.google.gwt.dom.client.Element; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.VMarginInfo; +import com.vaadin.shared.ui.orderedlayout.AbstractOrderedLayoutState; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ConnectorHierarchyChangeEvent; +import com.vaadin.terminal.gwt.client.TooltipInfo; +import com.vaadin.terminal.gwt.client.Util; import com.vaadin.terminal.gwt.client.communication.StateChangeEvent; import com.vaadin.terminal.gwt.client.ui.AbstractFieldConnector; import com.vaadin.terminal.gwt.client.ui.AbstractLayoutConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; -import com.vaadin.terminal.gwt.client.ui.VMarginInfo; import com.vaadin.terminal.gwt.client.ui.formlayout.VFormLayout.Caption; import com.vaadin.terminal.gwt.client.ui.formlayout.VFormLayout.ErrorFlag; import com.vaadin.terminal.gwt.client.ui.formlayout.VFormLayout.VFormLayoutTable; -import com.vaadin.terminal.gwt.client.ui.orderedlayout.AbstractOrderedLayoutState; import com.vaadin.ui.FormLayout; @Connect(FormLayout.class) @@ -76,6 +79,7 @@ public class FormLayoutConnector extends AbstractLayoutConnector { } + @Override public void updateCaption(ComponentConnector component) { getWidget().table.updateCaption(component.getWidget(), component.getState(), component.isEnabled()); @@ -96,4 +100,36 @@ public class FormLayoutConnector extends AbstractLayoutConnector { return (VFormLayout) super.getWidget(); } + @Override + public TooltipInfo getTooltipInfo(Element element) { + TooltipInfo info = null; + + if (element != getWidget().getElement()) { + Object node = Util.findWidget( + (com.google.gwt.user.client.Element) element, + VFormLayout.Caption.class); + + if (node != null) { + VFormLayout.Caption caption = (VFormLayout.Caption) node; + info = caption.getOwner().getTooltipInfo(element); + } else { + + node = Util.findWidget( + (com.google.gwt.user.client.Element) element, + VFormLayout.ErrorFlag.class); + + if (node != null) { + VFormLayout.ErrorFlag flag = (VFormLayout.ErrorFlag) node; + info = flag.getOwner().getTooltipInfo(element); + } + } + } + + if (info == null) { + info = super.getTooltipInfo(element); + } + + return info; + } + } diff --git a/src/com/vaadin/terminal/gwt/client/ui/formlayout/VFormLayout.java b/src/com/vaadin/terminal/gwt/client/ui/formlayout/VFormLayout.java index 8a859c409c..9ecab6352c 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/formlayout/VFormLayout.java +++ b/src/com/vaadin/terminal/gwt/client/ui/formlayout/VFormLayout.java @@ -12,21 +12,20 @@ import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; 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.FlexTable; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.ComponentState; +import com.vaadin.shared.ui.VMarginInfo; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.BrowserInfo; import com.vaadin.terminal.gwt.client.ComponentConnector; -import com.vaadin.terminal.gwt.client.ComponentState; import com.vaadin.terminal.gwt.client.Focusable; import com.vaadin.terminal.gwt.client.StyleConstants; import com.vaadin.terminal.gwt.client.VTooltip; import com.vaadin.terminal.gwt.client.ui.AbstractFieldConnector; import com.vaadin.terminal.gwt.client.ui.Icon; -import com.vaadin.terminal.gwt.client.ui.VMarginInfo; /** * Two col Layout that places caption on left col and field on right col @@ -88,6 +87,7 @@ public class VFormLayout extends SimplePanel { * com.google.gwt.event.dom.client.ClickHandler#onClick(com.google.gwt * .event.dom.client.ClickEvent) */ + @Override public void onClick(ClickEvent event) { Caption caption = (Caption) event.getSource(); if (caption.getOwner() != null) { @@ -215,8 +215,6 @@ public class VFormLayout extends SimplePanel { public Caption(ComponentConnector component) { super(); owner = component; - - sinkEvents(VTooltip.TOOLTIP_EVENTS); } private void setStyles(String[] styles) { @@ -324,12 +322,6 @@ public class VFormLayout extends SimplePanel { public ComponentConnector getOwner() { return owner; } - - @Override - public void onBrowserEvent(Event event) { - super.onBrowserEvent(event); - owner.getConnection().handleTooltipEvent(event, owner); - } } class ErrorFlag extends HTML { @@ -345,6 +337,10 @@ public class VFormLayout extends SimplePanel { this.owner = owner; } + public ComponentConnector getOwner() { + return owner; + } + public void updateError(String errorMessage, boolean hideErrors) { boolean showError = null != errorMessage; if (hideErrors) { @@ -366,13 +362,5 @@ public class VFormLayout extends SimplePanel { } } - @Override - public void onBrowserEvent(Event event) { - super.onBrowserEvent(event); - if (owner != null) { - owner.getConnection().handleTooltipEvent(event, owner); - } - } - } } 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 2cd82313c2..07e481d31d 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/gridlayout/GridLayoutConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/gridlayout/GridLayoutConnector.java @@ -7,6 +7,12 @@ import java.util.Iterator; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.ui.AlignmentInfo; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.LayoutClickRpc; +import com.vaadin.shared.ui.VMarginInfo; +import com.vaadin.shared.ui.gridlayout.GridLayoutServerRpc; +import com.vaadin.shared.ui.gridlayout.GridLayoutState; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ConnectorHierarchyChangeEvent; @@ -18,11 +24,7 @@ import com.vaadin.terminal.gwt.client.VCaption; import com.vaadin.terminal.gwt.client.communication.RpcProxy; import com.vaadin.terminal.gwt.client.communication.StateChangeEvent; import com.vaadin.terminal.gwt.client.ui.AbstractComponentContainerConnector; -import com.vaadin.terminal.gwt.client.ui.AlignmentInfo; -import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.LayoutClickEventHandler; -import com.vaadin.terminal.gwt.client.ui.LayoutClickRpc; -import com.vaadin.terminal.gwt.client.ui.VMarginInfo; import com.vaadin.terminal.gwt.client.ui.gridlayout.VGridLayout.Cell; import com.vaadin.terminal.gwt.client.ui.layout.VLayoutSlot; import com.vaadin.ui.GridLayout; @@ -51,6 +53,7 @@ public class GridLayoutConnector extends AbstractComponentContainerConnector @Override public void init() { + super.init(); rpc = RpcProxy.create(GridLayoutServerRpc.class, this); getLayoutManager().registerDependency(this, getWidget().spacingMeasureElement); @@ -82,6 +85,7 @@ public class GridLayoutConnector extends AbstractComponentContainerConnector } + @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { VGridLayout layout = getWidget(); layout.client = client; @@ -185,6 +189,7 @@ public class GridLayoutConnector extends AbstractComponentContainerConnector } + @Override public void updateCaption(ComponentConnector childConnector) { if (!childConnector.delegateCaptionHandling()) { // Check not required by interface but by workarounds in this class @@ -223,10 +228,12 @@ public class GridLayoutConnector extends AbstractComponentContainerConnector return (VGridLayout) super.getWidget(); } + @Override public void layoutVertically() { getWidget().updateHeight(); } + @Override public void layoutHorizontally() { getWidget().updateWidth(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/gridlayout/GridLayoutServerRpc.java b/src/com/vaadin/terminal/gwt/client/ui/gridlayout/GridLayoutServerRpc.java deleted file mode 100644 index cd8df297ec..0000000000 --- a/src/com/vaadin/terminal/gwt/client/ui/gridlayout/GridLayoutServerRpc.java +++ /dev/null @@ -1,11 +0,0 @@ -/* -@VaadinApache2LicenseForJavaFiles@ - */ -package com.vaadin.terminal.gwt.client.ui.gridlayout; - -import com.vaadin.terminal.gwt.client.communication.ServerRpc; -import com.vaadin.terminal.gwt.client.ui.LayoutClickRpc; - -public interface GridLayoutServerRpc extends LayoutClickRpc, ServerRpc { - -}
\ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/client/ui/gridlayout/VGridLayout.java b/src/com/vaadin/terminal/gwt/client/ui/gridlayout/VGridLayout.java index 7629e09cac..1ea84d46cd 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/gridlayout/VGridLayout.java +++ b/src/com/vaadin/terminal/gwt/client/ui/gridlayout/VGridLayout.java @@ -16,6 +16,8 @@ import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.ComplexPanel; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.ui.AlignmentInfo; +import com.vaadin.shared.ui.VMarginInfo; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ConnectorMap; @@ -23,8 +25,6 @@ import com.vaadin.terminal.gwt.client.LayoutManager; 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.ui.AlignmentInfo; -import com.vaadin.terminal.gwt.client.ui.VMarginInfo; import com.vaadin.terminal.gwt.client.ui.layout.ComponentConnectorLayoutSlot; import com.vaadin.terminal.gwt.client.ui.layout.VLayoutSlot; diff --git a/src/com/vaadin/terminal/gwt/client/ui/helloworldfeature/GreetAgainRpc.java b/src/com/vaadin/terminal/gwt/client/ui/helloworldfeature/GreetAgainRpc.java deleted file mode 100644 index 0bfb8f3c32..0000000000 --- a/src/com/vaadin/terminal/gwt/client/ui/helloworldfeature/GreetAgainRpc.java +++ /dev/null @@ -1,12 +0,0 @@ -/* -@VaadinApache2LicenseForJavaFiles@ - */ -package com.vaadin.terminal.gwt.client.ui.helloworldfeature; - -import com.vaadin.terminal.gwt.client.communication.ClientRpc; - -public interface GreetAgainRpc extends ClientRpc { - - public void greetAgain(); - -} diff --git a/src/com/vaadin/terminal/gwt/client/ui/helloworldfeature/HelloWorldExtensionConnector.java b/src/com/vaadin/terminal/gwt/client/ui/helloworldfeature/HelloWorldExtensionConnector.java deleted file mode 100644 index ff444fece5..0000000000 --- a/src/com/vaadin/terminal/gwt/client/ui/helloworldfeature/HelloWorldExtensionConnector.java +++ /dev/null @@ -1,48 +0,0 @@ -/* -@VaadinApache2LicenseForJavaFiles@ - */ -package com.vaadin.terminal.gwt.client.ui.helloworldfeature; - -import com.google.gwt.user.client.Window; -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.RpcProxy; -import com.vaadin.terminal.gwt.client.ui.AbstractConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; -import com.vaadin.ui.HelloWorldExtension; - -@Connect(HelloWorldExtension.class) -public class HelloWorldExtensionConnector extends AbstractConnector { - HelloWorldRpc rpc = RpcProxy.create(HelloWorldRpc.class, this); - - @Override - public HelloWorldState getState() { - return (HelloWorldState) super.getState(); - } - - @Override - protected void init() { - registerRpc(GreetAgainRpc.class, new GreetAgainRpc() { - public void greetAgain() { - greet(); - } - }); - } - - @Override - public void setParent(ServerConnector parent) { - super.setParent(parent); - greet(); - } - - private void greet() { - String msg = getState().getGreeting() + " from " - + Util.getConnectorString(this) + " attached to " - + Util.getConnectorString(getParent()); - VConsole.log(msg); - - String response = Window.prompt(msg, ""); - rpc.onMessageSent(response); - } -} diff --git a/src/com/vaadin/terminal/gwt/client/ui/helloworldfeature/HelloWorldRpc.java b/src/com/vaadin/terminal/gwt/client/ui/helloworldfeature/HelloWorldRpc.java deleted file mode 100644 index 0289713390..0000000000 --- a/src/com/vaadin/terminal/gwt/client/ui/helloworldfeature/HelloWorldRpc.java +++ /dev/null @@ -1,10 +0,0 @@ -/* -@VaadinApache2LicenseForJavaFiles@ - */ -package com.vaadin.terminal.gwt.client.ui.helloworldfeature; - -import com.vaadin.terminal.gwt.client.communication.ServerRpc; - -public interface HelloWorldRpc extends ServerRpc { - public void onMessageSent(String message); -} diff --git a/src/com/vaadin/terminal/gwt/client/ui/helloworldfeature/HelloWorldState.java b/src/com/vaadin/terminal/gwt/client/ui/helloworldfeature/HelloWorldState.java deleted file mode 100644 index 9524a5e9aa..0000000000 --- a/src/com/vaadin/terminal/gwt/client/ui/helloworldfeature/HelloWorldState.java +++ /dev/null @@ -1,18 +0,0 @@ -/* -@VaadinApache2LicenseForJavaFiles@ - */ -package com.vaadin.terminal.gwt.client.ui.helloworldfeature; - -import com.vaadin.terminal.gwt.client.communication.SharedState; - -public class HelloWorldState extends SharedState { - private String greeting = "Hello world"; - - public String getGreeting() { - return greeting; - } - - public void setGreeting(String greeting) { - this.greeting = greeting; - } -} diff --git a/src/com/vaadin/terminal/gwt/client/ui/label/ContentMode.java b/src/com/vaadin/terminal/gwt/client/ui/label/ContentMode.java deleted file mode 100644 index 4892c7e6bd..0000000000 --- a/src/com/vaadin/terminal/gwt/client/ui/label/ContentMode.java +++ /dev/null @@ -1,48 +0,0 @@ -/* -@VaadinApache2LicenseForJavaFiles@ - */ -package com.vaadin.terminal.gwt.client.ui.label; - -/** - * Content modes defining how the client should interpret a Label's value. - * - * @since 7.0.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 e64f9fffea..4c6c71e037 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/label/LabelConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/label/LabelConnector.java @@ -5,11 +5,12 @@ package com.vaadin.terminal.gwt.client.ui.label; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.PreElement; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.Connect.LoadStyle; +import com.vaadin.shared.ui.label.LabelState; 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) diff --git a/src/com/vaadin/terminal/gwt/client/ui/label/VLabel.java b/src/com/vaadin/terminal/gwt/client/ui/label/VLabel.java index f47b8437b7..f0c170c6b0 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/label/VLabel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/label/VLabel.java @@ -28,7 +28,6 @@ public class VLabel extends HTML { public VLabel(String text) { super(text); setStyleName(CLASSNAME); - sinkEvents(VTooltip.TOOLTIP_EVENTS); } @Override @@ -39,9 +38,6 @@ public class VLabel extends HTML { event.stopPropagation(); return; } - if (connection != null) { - connection.handleTooltipEvent(event, this); - } } @Override diff --git a/src/com/vaadin/terminal/gwt/client/ui/layout/LayoutDependencyTree.java b/src/com/vaadin/terminal/gwt/client/ui/layout/LayoutDependencyTree.java index 18843057f3..cb0ed697c9 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/layout/LayoutDependencyTree.java +++ b/src/com/vaadin/terminal/gwt/client/ui/layout/LayoutDependencyTree.java @@ -10,9 +10,9 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import com.vaadin.shared.ComponentState; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ComponentContainerConnector; -import com.vaadin.terminal.gwt.client.ComponentState; import com.vaadin.terminal.gwt.client.ServerConnector; import com.vaadin.terminal.gwt.client.Util; import com.vaadin.terminal.gwt.client.VConsole; diff --git a/src/com/vaadin/terminal/gwt/client/ui/layout/VLayoutSlot.java b/src/com/vaadin/terminal/gwt/client/ui/layout/VLayoutSlot.java index 034fe35649..5b2b1fc49b 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/layout/VLayoutSlot.java +++ b/src/com/vaadin/terminal/gwt/client/ui/layout/VLayoutSlot.java @@ -10,8 +10,8 @@ import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.ui.AlignmentInfo; import com.vaadin.terminal.gwt.client.VCaption; -import com.vaadin.terminal.gwt.client.ui.AlignmentInfo; public abstract class VLayoutSlot { 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 c002d2dd50..5ef641470d 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/link/LinkConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/link/LinkConnector.java @@ -5,11 +5,11 @@ package com.vaadin.terminal.gwt.client.ui.link; import com.google.gwt.user.client.DOM; +import com.vaadin.shared.ui.Connect; 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.ui.AbstractComponentConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.Icon; import com.vaadin.ui.Link; @@ -22,6 +22,7 @@ public class LinkConnector extends AbstractComponentConnector implements return false; } + @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { if (!isRealUpdate(uidl)) { diff --git a/src/com/vaadin/terminal/gwt/client/ui/link/VLink.java b/src/com/vaadin/terminal/gwt/client/ui/link/VLink.java index 68fe5d9292..4df3220ef1 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/link/VLink.java +++ b/src/com/vaadin/terminal/gwt/client/ui/link/VLink.java @@ -13,7 +13,6 @@ import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.HTML; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.Util; -import com.vaadin.terminal.gwt.client.VTooltip; import com.vaadin.terminal.gwt.client.ui.Icon; public class VLink extends HTML implements ClickHandler { @@ -51,10 +50,10 @@ public class VLink extends HTML implements ClickHandler { getElement().appendChild(anchor); anchor.appendChild(captionElement); addClickHandler(this); - sinkEvents(VTooltip.TOOLTIP_EVENTS); setStyleName(CLASSNAME); } + @Override public void onClick(ClickEvent event) { if (enabled) { if (target == null) { @@ -101,9 +100,6 @@ public class VLink extends HTML implements ClickHandler { if (event.getTypeInt() == Event.ONLOAD) { Util.notifyParentOfSizeChange(this, true); } - if (client != null) { - client.handleTooltipEvent(event, this); - } if (target == captionElement || target == anchor || (icon != null && target == icon.getElement())) { super.onBrowserEvent(event); 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 8a4553d983..678847226b 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/listselect/ListSelectConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/listselect/ListSelectConnector.java @@ -4,7 +4,7 @@ package com.vaadin.terminal.gwt.client.ui.listselect; -import com.vaadin.terminal.gwt.client.ui.Connect; +import com.vaadin.shared.ui.Connect; import com.vaadin.terminal.gwt.client.ui.optiongroup.OptionGroupBaseConnector; import com.vaadin.ui.ListSelect; diff --git a/src/com/vaadin/terminal/gwt/client/ui/listselect/TooltipListBox.java b/src/com/vaadin/terminal/gwt/client/ui/listselect/TooltipListBox.java deleted file mode 100644 index abecd844da..0000000000 --- a/src/com/vaadin/terminal/gwt/client/ui/listselect/TooltipListBox.java +++ /dev/null @@ -1,41 +0,0 @@ -/* -@VaadinApache2LicenseForJavaFiles@ - */ -package com.vaadin.terminal.gwt.client.ui.listselect; - -import com.google.gwt.user.client.Event; -import com.google.gwt.user.client.ui.ListBox; -import com.google.gwt.user.client.ui.Widget; -import com.vaadin.terminal.gwt.client.ApplicationConnection; -import com.vaadin.terminal.gwt.client.VTooltip; - -/** - * Extended ListBox to listen tooltip events and forward them to generic - * handler. - */ -public class TooltipListBox extends ListBox { - private ApplicationConnection client; - private Widget widget; - - public TooltipListBox(boolean isMultiselect) { - super(isMultiselect); - sinkEvents(VTooltip.TOOLTIP_EVENTS); - } - - public void setClient(ApplicationConnection client) { - this.client = client; - } - - public void setSelect(Widget widget) { - this.widget = widget; - } - - @Override - public void onBrowserEvent(Event event) { - super.onBrowserEvent(event); - if (client != null) { - client.handleTooltipEvent(event, widget); - } - } - -}
\ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/client/ui/listselect/VListSelect.java b/src/com/vaadin/terminal/gwt/client/ui/listselect/VListSelect.java index e338897841..6f3f876fb7 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/listselect/VListSelect.java +++ b/src/com/vaadin/terminal/gwt/client/ui/listselect/VListSelect.java @@ -8,6 +8,7 @@ import java.util.ArrayList; import java.util.Iterator; import com.google.gwt.event.dom.client.ChangeEvent; +import com.google.gwt.user.client.ui.ListBox; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.ui.optiongroup.VOptionGroupBase; @@ -17,23 +18,25 @@ public class VListSelect extends VOptionGroupBase { private static final int VISIBLE_COUNT = 10; - protected TooltipListBox select; + protected ListBox select; private int lastSelectedIndex = -1; public VListSelect() { - super(new TooltipListBox(true), CLASSNAME); - select = (TooltipListBox) optionsContainer; - select.setSelect(this); + super(new ListBox(true), CLASSNAME); + select = getOptionsContainer(); select.addChangeHandler(this); select.addClickHandler(this); select.setStyleName(CLASSNAME + "-select"); select.setVisibleItemCount(VISIBLE_COUNT); } + protected ListBox getOptionsContainer() { + return (ListBox) optionsContainer; + } + @Override protected void buildOptions(UIDL uidl) { - select.setClient(client); select.setMultipleSelect(isMultiselect()); select.setEnabled(!isDisabled() && !isReadonly()); select.clear(); @@ -99,9 +102,10 @@ public class VListSelect extends VOptionGroupBase { @Override protected void setTabIndex(int tabIndex) { - ((TooltipListBox) optionsContainer).setTabIndex(tabIndex); + getOptionsContainer().setTabIndex(tabIndex); } + @Override public void focus() { select.setFocus(true); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/menubar/MenuBar.java b/src/com/vaadin/terminal/gwt/client/ui/menubar/MenuBar.java index 7bee870387..5cb3fb83b4 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/menubar/MenuBar.java +++ b/src/com/vaadin/terminal/gwt/client/ui/menubar/MenuBar.java @@ -246,6 +246,7 @@ public class MenuBar extends Widget implements PopupListener { } } + @Override public void onPopupClosed(PopupPanel sender, boolean autoClosed) { // If the menu popup was auto-closed, close all of its parents as well. if (autoClosed) { 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 d1f77aa0ff..2a8923bbc0 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/menubar/MenuBarConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/menubar/MenuBarConnector.java @@ -7,14 +7,16 @@ import java.util.Iterator; import java.util.Stack; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Element; import com.google.gwt.user.client.Command; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.Connect.LoadStyle; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.Paintable; +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.ui.AbstractComponentConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; -import com.vaadin.terminal.gwt.client.ui.Connect.LoadStyle; import com.vaadin.terminal.gwt.client.ui.Icon; import com.vaadin.terminal.gwt.client.ui.SimpleManagedLayout; import com.vaadin.terminal.gwt.client.ui.menubar.VMenuBar.CustomMenuItem; @@ -29,6 +31,7 @@ public class MenuBarConnector extends AbstractComponentConnector implements * This method is called when the page is loaded for the first time, and * every time UI changes in the component are received from the server. */ + @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { if (!isRealUpdate(uidl)) { return; @@ -105,6 +108,7 @@ public class MenuBarConnector extends AbstractComponentConnector implements // Construct a command that fires onMenuClick(int) with the // item's id-number cmd = new Command() { + @Override public void execute() { getWidget().hostReference.onMenuClick(itemId); } @@ -120,6 +124,7 @@ public class MenuBarConnector extends AbstractComponentConnector implements iteratorStack.push(itr); itr = item.getChildIterator(); currentMenu = new VMenuBar(true, currentMenu); + client.getVTooltip().connectHandlersToWidget(currentMenu); // this is the top-level style that also propagates to items - // any item specific styles are set above in // currentItem.updateFromUIDL(item, client) @@ -157,7 +162,30 @@ public class MenuBarConnector extends AbstractComponentConnector implements return (VMenuBar) super.getWidget(); } + @Override public void layout() { getWidget().iLayout(); } + + @Override + public TooltipInfo getTooltipInfo(Element element) { + TooltipInfo info = null; + + // Check content of widget to find tooltip for element + if (element != getWidget().getElement()) { + + CustomMenuItem item = getWidget().getMenuItemWithElement( + (com.google.gwt.user.client.Element) element); + if (item != null) { + info = item.getTooltip(); + } + } + + // Use default tooltip if nothing found from DOM three + if (info == null) { + info = super.getTooltipInfo(element); + } + + return info; + } } diff --git a/src/com/vaadin/terminal/gwt/client/ui/menubar/MenuItem.java b/src/com/vaadin/terminal/gwt/client/ui/menubar/MenuItem.java index af79ba7c5e..7f150d9a5f 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/menubar/MenuItem.java +++ b/src/com/vaadin/terminal/gwt/client/ui/menubar/MenuItem.java @@ -121,6 +121,7 @@ public class MenuItem extends UIObject implements HasHTML { return command; } + @Override public String getHTML() { return DOM.getInnerHTML(getElement()); } @@ -143,6 +144,7 @@ public class MenuItem extends UIObject implements HasHTML { return subMenu; } + @Override public String getText() { return DOM.getInnerText(getElement()); } @@ -157,6 +159,7 @@ public class MenuItem extends UIObject implements HasHTML { command = cmd; } + @Override public void setHTML(String html) { DOM.setInnerHTML(getElement(), html); } @@ -171,6 +174,7 @@ public class MenuItem extends UIObject implements HasHTML { this.subMenu = subMenu; } + @Override public void setText(String text) { DOM.setInnerText(getElement(), text); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/menubar/VMenuBar.java b/src/com/vaadin/terminal/gwt/client/ui/menubar/VMenuBar.java index e48483cb02..47bda81362 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/menubar/VMenuBar.java +++ b/src/com/vaadin/terminal/gwt/client/ui/menubar/VMenuBar.java @@ -36,7 +36,6 @@ import com.vaadin.terminal.gwt.client.LayoutManager; 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.VTooltip; import com.vaadin.terminal.gwt.client.ui.Icon; import com.vaadin.terminal.gwt.client.ui.SimpleFocusablePanel; import com.vaadin.terminal.gwt.client.ui.SubPartAware; @@ -89,11 +88,10 @@ public class VMenuBar extends SimpleFocusablePanel implements boolean enabled = true; - private String width = "notinited"; - private VLazyExecutor iconLoadedExecutioner = new VLazyExecutor(100, new ScheduledCommand() { + @Override public void execute() { iLayout(true); } @@ -140,8 +138,6 @@ public class VMenuBar extends SimpleFocusablePanel implements sinkEvents(Event.ONCLICK | Event.ONMOUSEOVER | Event.ONMOUSEOUT | Event.ONLOAD); - - sinkEvents(VTooltip.TOOLTIP_EVENTS); } @Override @@ -340,15 +336,6 @@ public class VMenuBar extends SimpleFocusablePanel implements } } - // Handle tooltips - if (targetItem == null && client != null) { - // Handle root menubar tooltips - client.handleTooltipEvent(e, this); - } else if (targetItem != null) { - // Handle item tooltips - targetItem.onBrowserEvent(e); - } - if (targetItem != null) { switch (DOM.eventGetType(e)) { @@ -537,6 +524,22 @@ public class VMenuBar extends SimpleFocusablePanel implements final int shadowSpace = 10; popup = new VOverlay(true, false, true); + + // Setting owner and handlers to support tooltips. Needed for tooltip + // handling of overlay widgets (will direct queries to parent menu) + if (parentMenu == null) { + popup.setOwner(this); + } else { + VMenuBar parent = parentMenu; + while (parent.getParentMenu() != null) { + parent = parent.getParentMenu(); + } + popup.setOwner(parent); + } + if (client != null) { + client.getVTooltip().connectHandlersToWidget(popup); + } + popup.setStyleName(CLASSNAME + "-popup"); popup.setWidget(item.getSubMenu()); popup.addCloseHandler(this); @@ -600,7 +603,7 @@ public class VMenuBar extends SimpleFocusablePanel implements // popup style.setWidth(contentWidth + Util.getNativeScrollbarSize(), Unit.PX); - popup.updateShadowSizeAndPosition(); + popup.sizeOrPositionUpdated(); } } return top; @@ -633,6 +636,7 @@ public class VMenuBar extends SimpleFocusablePanel implements /** * Listener method, fired when this menu is closed */ + @Override public void onClose(CloseEvent<PopupPanel> event) { hideChildren(); if (event.isAutoClosed()) { @@ -720,9 +724,7 @@ public class VMenuBar extends SimpleFocusablePanel implements * A class to hold information on menu items * */ - protected static class CustomMenuItem extends Widget implements HasHTML { - - private ApplicationConnection client; + public static class CustomMenuItem extends Widget implements HasHTML { protected String html = null; protected Command command = null; @@ -732,6 +734,7 @@ public class VMenuBar extends SimpleFocusablePanel implements protected boolean isSeparator = false; protected boolean checkable = false; protected boolean checked = false; + protected String description = null; /** * Default menu item {@link Widget} constructor for GWT.create(). @@ -761,7 +764,6 @@ public class VMenuBar extends SimpleFocusablePanel implements setSelected(false); setStyleName(CLASSNAME + "-menuitem"); - sinkEvents(VTooltip.TOOLTIP_EVENTS); } public void setSelected(boolean selected) { @@ -849,10 +851,12 @@ public class VMenuBar extends SimpleFocusablePanel implements return command; } + @Override public String getHTML() { return html; } + @Override public void setHTML(String html) { this.html = html; DOM.setInnerHTML(getElement(), html); @@ -862,10 +866,12 @@ public class VMenuBar extends SimpleFocusablePanel implements Util.sinkOnloadForImages(getElement()); } + @Override public String getText() { return html; } + @Override public void setText(String text) { setHTML(Util.escapeHTML(text)); } @@ -898,7 +904,6 @@ public class VMenuBar extends SimpleFocusablePanel implements } public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { - this.client = client; setSeparator(uidl.hasAttribute("separator")); setEnabled(!uidl.hasAttribute(ATTRIBUTE_ITEM_DISABLED)); @@ -918,32 +923,17 @@ public class VMenuBar extends SimpleFocusablePanel implements } if (uidl.hasAttribute(ATTRIBUTE_ITEM_DESCRIPTION)) { - String description = uidl + description = uidl .getStringAttribute(ATTRIBUTE_ITEM_DESCRIPTION); - TooltipInfo info = new TooltipInfo(description); - - VMenuBar root = findRootMenu(); - client.registerTooltip(root, this, info); } } - @Override - public void onBrowserEvent(Event event) { - super.onBrowserEvent(event); - if (client != null) { - client.handleTooltipEvent(event, findRootMenu(), this); + public TooltipInfo getTooltip() { + if (description == null) { + return null; } - } - private VMenuBar findRootMenu() { - VMenuBar menubar = getParentMenu(); - - // Traverse up until root menu is found - while (menubar.getParentMenu() != null) { - menubar = menubar.getParentMenu(); - } - - return menubar; + return new TooltipInfo(description); } /** @@ -1064,6 +1054,7 @@ public class VMenuBar extends SimpleFocusablePanel implements * com.google.gwt.event.dom.client.KeyPressHandler#onKeyPress(com.google * .gwt.event.dom.client.KeyPressEvent) */ + @Override public void onKeyPress(KeyPressEvent event) { if (handleNavigation(event.getNativeEvent().getKeyCode(), event.isControlKeyDown() || event.isMetaKeyDown(), @@ -1079,6 +1070,7 @@ public class VMenuBar extends SimpleFocusablePanel implements * com.google.gwt.event.dom.client.KeyDownHandler#onKeyDown(com.google.gwt * .event.dom.client.KeyDownEvent) */ + @Override public void onKeyDown(KeyDownEvent event) { if (handleNavigation(event.getNativeEvent().getKeyCode(), event.isControlKeyDown() || event.isMetaKeyDown(), @@ -1399,12 +1391,14 @@ public class VMenuBar extends SimpleFocusablePanel implements * com.google.gwt.event.dom.client.FocusHandler#onFocus(com.google.gwt.event * .dom.client.FocusEvent) */ + @Override public void onFocus(FocusEvent event) { } private final String SUBPART_PREFIX = "item"; + @Override public Element getSubPartElement(String subPart) { int index = Integer .parseInt(subPart.substring(SUBPART_PREFIX.length())); @@ -1413,6 +1407,7 @@ public class VMenuBar extends SimpleFocusablePanel implements return item.getElement(); } + @Override public String getSubPartName(Element subElement) { if (!getElement().isOrHasChild(subElement)) { return null; @@ -1435,4 +1430,28 @@ public class VMenuBar extends SimpleFocusablePanel implements return null; } + /** + * Get menu item with given DOM element + * + * @param element + * Element used in search + * @return Menu item or null if not found + */ + public CustomMenuItem getMenuItemWithElement(Element element) { + for (int i = 0; i < items.size(); i++) { + CustomMenuItem item = items.get(i); + if (DOM.isOrHasChild(item.getElement(), element)) { + return item; + } + + if (item.getSubMenu() != null) { + item = item.getSubMenu().getMenuItemWithElement(element); + if (item != null) { + return item; + } + } + } + + return null; + } } 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 c010fba711..73de87c276 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/nativebutton/NativeButtonConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/nativebutton/NativeButtonConnector.java @@ -9,15 +9,15 @@ 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.vaadin.shared.communication.FieldRpc.FocusAndBlurServerRpc; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.button.ButtonServerRpc; +import com.vaadin.shared.ui.button.ButtonState; import com.vaadin.terminal.gwt.client.EventHelper; -import com.vaadin.terminal.gwt.client.communication.FieldRpc.FocusAndBlurServerRpc; import com.vaadin.terminal.gwt.client.communication.RpcProxy; 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.Icon; -import com.vaadin.terminal.gwt.client.ui.button.ButtonServerRpc; -import com.vaadin.terminal.gwt.client.ui.button.ButtonState; import com.vaadin.ui.NativeButton; @Connect(NativeButton.class) @@ -107,12 +107,14 @@ public class NativeButtonConnector extends AbstractComponentConnector implements return (ButtonState) super.getState(); } + @Override public void onFocus(FocusEvent event) { // EventHelper.updateFocusHandler ensures that this is called only when // there is a listener on server side focusBlurRpc.focus(); } + @Override public void onBlur(BlurEvent 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/nativebutton/VNativeButton.java b/src/com/vaadin/terminal/gwt/client/ui/nativebutton/VNativeButton.java index dd6e741126..d58fd2a995 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/nativebutton/VNativeButton.java +++ b/src/com/vaadin/terminal/gwt/client/ui/nativebutton/VNativeButton.java @@ -10,14 +10,13 @@ import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.Button; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.button.ButtonServerRpc; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.BrowserInfo; -import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.MouseEventDetailsBuilder; import com.vaadin.terminal.gwt.client.Util; -import com.vaadin.terminal.gwt.client.VTooltip; import com.vaadin.terminal.gwt.client.ui.Icon; -import com.vaadin.terminal.gwt.client.ui.button.ButtonServerRpc; public class VNativeButton extends Button implements ClickHandler { @@ -54,7 +53,6 @@ public class VNativeButton extends Button implements ClickHandler { addClickHandler(this); - sinkEvents(VTooltip.TOOLTIP_EVENTS); sinkEvents(Event.ONMOUSEDOWN); sinkEvents(Event.ONMOUSEUP); } @@ -87,10 +85,6 @@ public class VNativeButton extends Button implements ClickHandler { } clickPending = false; } - - if (client != null) { - client.handleTooltipEvent(event, this); - } } @Override @@ -106,6 +100,7 @@ public class VNativeButton extends Button implements ClickHandler { * com.google.gwt.event.dom.client.ClickHandler#onClick(com.google.gwt.event * .dom.client.ClickEvent) */ + @Override public void onClick(ClickEvent event) { if (paintableId == null || client == null) { return; 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 8f57e0c37f..8a00afa056 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/nativeselect/NativeSelectConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/nativeselect/NativeSelectConnector.java @@ -4,7 +4,7 @@ package com.vaadin.terminal.gwt.client.ui.nativeselect; -import com.vaadin.terminal.gwt.client.ui.Connect; +import com.vaadin.shared.ui.Connect; import com.vaadin.terminal.gwt.client.ui.optiongroup.OptionGroupBaseConnector; import com.vaadin.ui.NativeSelect; diff --git a/src/com/vaadin/terminal/gwt/client/ui/nativeselect/VNativeSelect.java b/src/com/vaadin/terminal/gwt/client/ui/nativeselect/VNativeSelect.java index 54f5e9aff5..ea5292724d 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/nativeselect/VNativeSelect.java +++ b/src/com/vaadin/terminal/gwt/client/ui/nativeselect/VNativeSelect.java @@ -8,32 +8,34 @@ import java.util.ArrayList; import java.util.Iterator; import com.google.gwt.event.dom.client.ChangeEvent; +import com.google.gwt.user.client.ui.ListBox; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.ui.Field; -import com.vaadin.terminal.gwt.client.ui.listselect.TooltipListBox; import com.vaadin.terminal.gwt.client.ui.optiongroup.VOptionGroupBase; public class VNativeSelect extends VOptionGroupBase implements Field { public static final String CLASSNAME = "v-select"; - protected TooltipListBox select; + protected ListBox select; private boolean firstValueIsTemporaryNullItem = false; public VNativeSelect() { - super(new TooltipListBox(false), CLASSNAME); - select = (TooltipListBox) optionsContainer; - select.setSelect(this); + super(new ListBox(false), CLASSNAME); + select = getOptionsContainer(); select.setVisibleItemCount(1); select.addChangeHandler(this); select.setStyleName(CLASSNAME + "-select"); } + protected ListBox getOptionsContainer() { + return (ListBox) optionsContainer; + } + @Override protected void buildOptions(UIDL uidl) { - select.setClient(client); select.setEnabled(!isDisabled() && !isReadonly()); select.clear(); firstValueIsTemporaryNullItem = false; @@ -103,9 +105,10 @@ public class VNativeSelect extends VOptionGroupBase implements Field { @Override protected void setTabIndex(int tabIndex) { - ((TooltipListBox) optionsContainer).setTabIndex(tabIndex); + getOptionsContainer().setTabIndex(tabIndex); } + @Override public void focus() { select.setFocus(true); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/notification/VNotification.java b/src/com/vaadin/terminal/gwt/client/ui/notification/VNotification.java index fb853b8a55..1309155443 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/notification/VNotification.java +++ b/src/com/vaadin/terminal/gwt/client/ui/notification/VNotification.java @@ -163,6 +163,7 @@ public class VNotification extends VOverlay { super.show(); notifications.add(this); setPosition(position); + sizeOrPositionUpdated(); /** * Android 4 fails to render notifications correctly without a little * nudge (#8551) diff --git a/src/com/vaadin/terminal/gwt/client/ui/optiongroup/OptionGroupBaseConnector.java b/src/com/vaadin/terminal/gwt/client/ui/optiongroup/OptionGroupBaseConnector.java index 3658126a97..a4dd72906d 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/optiongroup/OptionGroupBaseConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/optiongroup/OptionGroupBaseConnector.java @@ -14,6 +14,7 @@ import com.vaadin.terminal.gwt.client.ui.textfield.VTextField; public abstract class OptionGroupBaseConnector extends AbstractFieldConnector implements Paintable { + @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { // Save details 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 e6064bd03f..caf85348d4 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/optiongroup/OptionGroupConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/optiongroup/OptionGroupConnector.java @@ -9,10 +9,10 @@ import java.util.ArrayList; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.EventId; +import com.vaadin.shared.ui.Connect; import com.vaadin.terminal.gwt.client.ApplicationConnection; -import com.vaadin.terminal.gwt.client.EventId; import com.vaadin.terminal.gwt.client.UIDL; -import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.ui.OptionGroup; @Connect(OptionGroup.class) diff --git a/src/com/vaadin/terminal/gwt/client/ui/optiongroup/VOptionGroup.java b/src/com/vaadin/terminal/gwt/client/ui/optiongroup/VOptionGroup.java index d6e6949242..a6cdf7e888 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/optiongroup/VOptionGroup.java +++ b/src/com/vaadin/terminal/gwt/client/ui/optiongroup/VOptionGroup.java @@ -25,8 +25,8 @@ import com.google.gwt.user.client.ui.Focusable; import com.google.gwt.user.client.ui.Panel; import com.google.gwt.user.client.ui.RadioButton; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.EventId; import com.vaadin.terminal.gwt.client.ApplicationConnection; -import com.vaadin.terminal.gwt.client.EventId; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.Util; import com.vaadin.terminal.gwt.client.ui.Icon; @@ -51,6 +51,7 @@ public class VOptionGroup extends VOptionGroupBase implements FocusHandler, protected List<HandlerRegistration> blurHandlers = null; private final LoadHandler iconLoadHandler = new LoadHandler() { + @Override public void onLoad(LoadEvent event) { Util.notifyParentOfSizeChange(VOptionGroup.this, true); } @@ -154,6 +155,7 @@ public class VOptionGroup extends VOptionGroupBase implements FocusHandler, } } + @Override public void focus() { Iterator<Widget> iterator = panel.iterator(); if (iterator.hasNext()) { @@ -161,6 +163,7 @@ public class VOptionGroup extends VOptionGroupBase implements FocusHandler, } } + @Override public void onFocus(FocusEvent arg0) { if (!blurOccured) { // no blur occured before this focus event @@ -178,10 +181,12 @@ public class VOptionGroup extends VOptionGroupBase implements FocusHandler, } } + @Override public void onBlur(BlurEvent arg0) { blurOccured = true; if (sendBlurEvents) { Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { // check whether blurOccured still is true and then send the // event out to the server diff --git a/src/com/vaadin/terminal/gwt/client/ui/optiongroup/VOptionGroupBase.java b/src/com/vaadin/terminal/gwt/client/ui/optiongroup/VOptionGroupBase.java index a512f024b8..d128d7deb1 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/optiongroup/VOptionGroupBase.java +++ b/src/com/vaadin/terminal/gwt/client/ui/optiongroup/VOptionGroupBase.java @@ -126,6 +126,7 @@ public abstract class VOptionGroupBase extends Composite implements Field, abstract protected void setTabIndex(int tabIndex); + @Override public void onClick(ClickEvent event) { if (event.getSource() == newItemButton && !newItemField.getText().equals("")) { @@ -135,6 +136,7 @@ public abstract class VOptionGroupBase extends Composite implements Field, } } + @Override public void onChange(ChangeEvent event) { if (multiselect) { client.updateVariable(paintableId, "selected", getSelectedItems(), @@ -145,6 +147,7 @@ public abstract class VOptionGroupBase extends Composite implements Field, } } + @Override public void onKeyPress(KeyPressEvent event) { if (event.getSource() == newItemField && event.getCharCode() == KeyCodes.KEY_ENTER) { 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 9a89553fd2..e1bf217691 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/AbstractOrderedLayoutConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/AbstractOrderedLayoutConnector.java @@ -9,6 +9,11 @@ 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.shared.ui.AlignmentInfo; +import com.vaadin.shared.ui.LayoutClickRpc; +import com.vaadin.shared.ui.VMarginInfo; +import com.vaadin.shared.ui.orderedlayout.AbstractOrderedLayoutServerRpc; +import com.vaadin.shared.ui.orderedlayout.AbstractOrderedLayoutState; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ConnectorHierarchyChangeEvent; import com.vaadin.terminal.gwt.client.DirectionalManagedLayout; @@ -18,10 +23,7 @@ import com.vaadin.terminal.gwt.client.VCaption; 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; -import com.vaadin.terminal.gwt.client.ui.LayoutClickRpc; -import com.vaadin.terminal.gwt.client.ui.VMarginInfo; import com.vaadin.terminal.gwt.client.ui.layout.ComponentConnectorLayoutSlot; import com.vaadin.terminal.gwt.client.ui.layout.VLayoutSlot; @@ -48,6 +50,7 @@ public abstract class AbstractOrderedLayoutConnector extends @Override public void init() { + super.init(); rpc = RpcProxy.create(AbstractOrderedLayoutServerRpc.class, this); getLayoutManager().registerDependency(this, getWidget().spacingMeasureElement); @@ -72,6 +75,7 @@ public abstract class AbstractOrderedLayoutConnector extends return (AbstractOrderedLayoutState) super.getState(); } + @Override public void updateCaption(ComponentConnector component) { VMeasuringOrderedLayout layout = getWidget(); if (VCaption.isNeeded(component.getState())) { @@ -262,6 +266,7 @@ public abstract class AbstractOrderedLayoutConnector extends } } + @Override public void layoutHorizontally() { if (getWidget().isVertical) { layoutSecondaryDirection(); @@ -270,6 +275,7 @@ public abstract class AbstractOrderedLayoutConnector extends } } + @Override public void layoutVertically() { if (getWidget().isVertical) { layoutPrimaryDirection(); diff --git a/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/AbstractOrderedLayoutServerRpc.java b/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/AbstractOrderedLayoutServerRpc.java deleted file mode 100644 index 5a29eacada..0000000000 --- a/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/AbstractOrderedLayoutServerRpc.java +++ /dev/null @@ -1,12 +0,0 @@ -/* -@VaadinApache2LicenseForJavaFiles@ - */ -package com.vaadin.terminal.gwt.client.ui.orderedlayout; - -import com.vaadin.terminal.gwt.client.communication.ServerRpc; -import com.vaadin.terminal.gwt.client.ui.LayoutClickRpc; - -public interface AbstractOrderedLayoutServerRpc extends LayoutClickRpc, - ServerRpc { - -}
\ No newline at end of file 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 3b0014c0f0..459bd474d1 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/HorizontalLayoutConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/HorizontalLayoutConnector.java @@ -3,8 +3,8 @@ */ package com.vaadin.terminal.gwt.client.ui.orderedlayout; -import com.vaadin.terminal.gwt.client.ui.Connect; -import com.vaadin.terminal.gwt.client.ui.Connect.LoadStyle; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.Connect.LoadStyle; import com.vaadin.ui.HorizontalLayout; @Connect(value = HorizontalLayout.class, loadStyle = LoadStyle.EAGER) diff --git a/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/VMeasuringOrderedLayout.java b/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/VMeasuringOrderedLayout.java index de55ca98e6..4bb1c66e86 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/VMeasuringOrderedLayout.java +++ b/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/VMeasuringOrderedLayout.java @@ -15,8 +15,8 @@ import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.ComplexPanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.WidgetCollection; +import com.vaadin.shared.ui.VMarginInfo; import com.vaadin.terminal.gwt.client.VCaption; -import com.vaadin.terminal.gwt.client.ui.VMarginInfo; import com.vaadin.terminal.gwt.client.ui.layout.VLayoutSlot; public class VMeasuringOrderedLayout extends ComplexPanel { 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 42a762864e..a481283156 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/VerticalLayoutConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/orderedlayout/VerticalLayoutConnector.java @@ -3,8 +3,8 @@ */ package com.vaadin.terminal.gwt.client.ui.orderedlayout; -import com.vaadin.terminal.gwt.client.ui.Connect; -import com.vaadin.terminal.gwt.client.ui.Connect.LoadStyle; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.Connect.LoadStyle; import com.vaadin.ui.VerticalLayout; @Connect(value = VerticalLayout.class, loadStyle = LoadStyle.EAGER) 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 d9096526f3..fd4761de5e 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/panel/PanelConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/panel/PanelConnector.java @@ -7,17 +7,19 @@ import com.google.gwt.dom.client.NativeEvent; 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.shared.MouseEventDetails; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.panel.PanelServerRpc; +import com.vaadin.shared.ui.panel.PanelState; 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.LayoutManager; -import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.Paintable; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.communication.RpcProxy; import com.vaadin.terminal.gwt.client.ui.AbstractComponentContainerConnector; import com.vaadin.terminal.gwt.client.ui.ClickEventHandler; -import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.PostLayoutListener; import com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler; import com.vaadin.terminal.gwt.client.ui.SimpleManagedLayout; @@ -46,6 +48,7 @@ public class PanelConnector extends AbstractComponentContainerConnector @Override public void init() { + super.init(); rpc = RpcProxy.create(PanelServerRpc.class, this); VPanel panel = getWidget(); LayoutManager layoutManager = getLayoutManager(); @@ -70,6 +73,7 @@ public class PanelConnector extends AbstractComponentContainerConnector return false; } + @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { if (isRealUpdate(uidl)) { @@ -164,6 +168,7 @@ public class PanelConnector extends AbstractComponentContainerConnector getWidget().contentNode.setTabIndex(getState().getTabIndex()); } + @Override public void updateCaption(ComponentConnector component) { // NOP: layouts caption, errors etc not rendered in Panel } @@ -173,6 +178,7 @@ public class PanelConnector extends AbstractComponentContainerConnector return (VPanel) super.getWidget(); } + @Override public void layout() { updateSizes(); } @@ -199,6 +205,7 @@ public class PanelConnector extends AbstractComponentContainerConnector panel.scrollLeft = panel.contentNode.getScrollLeft(); } + @Override public void postLayout() { VPanel panel = getWidget(); if (uidlScrollTop != null) { diff --git a/src/com/vaadin/terminal/gwt/client/ui/panel/PanelServerRpc.java b/src/com/vaadin/terminal/gwt/client/ui/panel/PanelServerRpc.java deleted file mode 100644 index 9b59344aec..0000000000 --- a/src/com/vaadin/terminal/gwt/client/ui/panel/PanelServerRpc.java +++ /dev/null @@ -1,11 +0,0 @@ -/* -@VaadinApache2LicenseForJavaFiles@ - */ -package com.vaadin.terminal.gwt.client.ui.panel; - -import com.vaadin.terminal.gwt.client.communication.ServerRpc; -import com.vaadin.terminal.gwt.client.ui.ClickRpc; - -public interface PanelServerRpc extends ClickRpc, ServerRpc { - -}
\ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/client/ui/panel/VPanel.java b/src/com/vaadin/terminal/gwt/client/ui/panel/VPanel.java index 6a06367acd..8764d61c3a 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/panel/VPanel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/panel/VPanel.java @@ -100,6 +100,7 @@ public class VPanel extends SimplePanel implements ShortcutActionHandlerOwner, * @see com.vaadin.terminal.gwt.client.Focusable#focus() */ + @Override public void focus() { setFocus(true); @@ -167,13 +168,10 @@ public class VPanel extends SimplePanel implements ShortcutActionHandlerOwner, client.updateVariable(id, "scrollTop", scrollTop, false); client.updateVariable(id, "scrollLeft", scrollLeft, false); } - } else if (captionNode.isOrHasChild(target)) { - if (client != null) { - client.handleTooltipEvent(event, this); - } } } + @Override public ShortcutActionHandler getShortcutActionHandler() { return shortcutHandler; } 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 c4c5954c33..55d645f12e 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/passwordfield/PasswordFieldConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/passwordfield/PasswordFieldConnector.java @@ -4,7 +4,7 @@ package com.vaadin.terminal.gwt.client.ui.passwordfield; -import com.vaadin.terminal.gwt.client.ui.Connect; +import com.vaadin.shared.ui.Connect; import com.vaadin.terminal.gwt.client.ui.textfield.TextFieldConnector; import com.vaadin.ui.PasswordField; 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 c5117fdddb..19b35821c7 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/popupview/PopupViewConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/popupview/PopupViewConnector.java @@ -3,6 +3,7 @@ */ package com.vaadin.terminal.gwt.client.ui.popupview; +import com.vaadin.shared.ui.Connect; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.Paintable; @@ -10,7 +11,6 @@ import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.VCaption; import com.vaadin.terminal.gwt.client.VCaptionWrapper; import com.vaadin.terminal.gwt.client.ui.AbstractComponentContainerConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.PostLayoutListener; import com.vaadin.ui.PopupView; @@ -31,6 +31,7 @@ public class PopupViewConnector extends AbstractComponentContainerConnector * @see com.vaadin.terminal.gwt.client.ComponentConnector#updateFromUIDL(com.vaadin.terminal.gwt.client.UIDL, * com.vaadin.terminal.gwt.client.ApplicationConnection) */ + @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { if (!isRealUpdate(uidl)) { return; @@ -81,6 +82,7 @@ public class PopupViewConnector extends AbstractComponentContainerConnector } }// updateFromUIDL + @Override public void updateCaption(ComponentConnector component) { if (VCaption.isNeeded(component.getState())) { if (getWidget().popup.captionWrapper != null) { @@ -104,6 +106,7 @@ public class PopupViewConnector extends AbstractComponentContainerConnector return (VPopupView) super.getWidget(); } + @Override public void postLayout() { if (centerAfterLayout) { centerAfterLayout = false; diff --git a/src/com/vaadin/terminal/gwt/client/ui/popupview/VPopupView.java b/src/com/vaadin/terminal/gwt/client/ui/popupview/VPopupView.java index da48975726..6efcd8f417 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/popupview/VPopupView.java +++ b/src/com/vaadin/terminal/gwt/client/ui/popupview/VPopupView.java @@ -10,6 +10,8 @@ import java.util.Set; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyCodes; +import com.google.gwt.event.dom.client.KeyDownEvent; +import com.google.gwt.event.dom.client.KeyDownHandler; import com.google.gwt.event.logical.shared.CloseEvent; import com.google.gwt.event.logical.shared.CloseHandler; import com.google.gwt.user.client.DOM; @@ -26,7 +28,9 @@ import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.VCaptionWrapper; -import com.vaadin.terminal.gwt.client.VTooltip; +import com.vaadin.terminal.gwt.client.VConsole; +import com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler; +import com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler.ShortcutActionHandlerOwner; import com.vaadin.terminal.gwt.client.ui.VOverlay; import com.vaadin.terminal.gwt.client.ui.richtextarea.VRichTextArea; @@ -60,6 +64,7 @@ public class VPopupView extends HTML { // When we click to open the popup... addClickHandler(new ClickHandler() { + @Override public void onClick(ClickEvent event) { updateState(true); } @@ -67,13 +72,13 @@ public class VPopupView extends HTML { // ..and when we close it popup.addCloseHandler(new CloseHandler<PopupPanel>() { + @Override public void onClose(CloseEvent<PopupPanel> event) { updateState(false); } }); popup.setAnimationEnabled(true); - sinkEvents(VTooltip.TOOLTIP_EVENTS); } /** @@ -183,8 +188,23 @@ public class VPopupView extends HTML { private final Set<Element> activeChildren = new HashSet<Element>(); private boolean hiding = false; + private ShortcutActionHandler shortcutActionHandler; + public CustomPopup() { super(true, false, true); // autoHide, not modal, dropshadow + + // Delegate popup keyboard events to the relevant handler. The + // events do not propagate automatically because the popup is + // directly attached to the RootPanel. + addDomHandler(new KeyDownHandler() { + @Override + public void onKeyDown(KeyDownEvent event) { + if (shortcutActionHandler != null) { + shortcutActionHandler.handleKeyboardEvent(Event + .as(event.getNativeEvent())); + } + } + }, KeyDownEvent.getType()); } // For some reason ONMOUSEOUT events are not always received, so we have @@ -227,18 +247,33 @@ public class VPopupView extends HTML { @Override public void hide(boolean autoClosed) { + VConsole.log("Hiding popupview"); hiding = true; syncChildren(); if (popupComponentWidget != null && popupComponentWidget != loading) { remove(popupComponentWidget); } hasHadMouseOver = false; + shortcutActionHandler = null; super.hide(autoClosed); } @Override public void show() { hiding = false; + + // Find the shortcut action handler that should handle keyboard + // events from the popup. The events do not propagate automatically + // because the popup is directly attached to the RootPanel. + Widget widget = VPopupView.this; + while (shortcutActionHandler == null && widget != null) { + if (widget instanceof ShortcutActionHandlerOwner) { + shortcutActionHandler = ((ShortcutActionHandlerOwner) widget) + .getShortcutActionHandler(); + } + widget = widget.getParent(); + } + super.show(); } @@ -337,12 +372,4 @@ public class VPopupView extends HTML { }// class CustomPopup - @Override - public void onBrowserEvent(Event event) { - super.onBrowserEvent(event); - if (client != null) { - client.handleTooltipEvent(event, this); - } - } - }// class VPopupView 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 9d0532fae3..cdb0174a49 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/progressindicator/ProgressIndicatorConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/progressindicator/ProgressIndicatorConnector.java @@ -5,17 +5,18 @@ package com.vaadin.terminal.gwt.client.ui.progressindicator; import com.google.gwt.user.client.DOM; +import com.vaadin.shared.ui.Connect; 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.ui.AbstractFieldConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.ui.ProgressIndicator; @Connect(ProgressIndicator.class) public class ProgressIndicatorConnector extends AbstractFieldConnector implements Paintable { + @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { if (!isRealUpdate(uidl)) { 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 db52640088..66781eb645 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/richtextarea/RichTextAreaConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/richtextarea/RichTextAreaConnector.java @@ -4,12 +4,12 @@ package com.vaadin.terminal.gwt.client.ui.richtextarea; import com.google.gwt.user.client.Event; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.Connect.LoadStyle; 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.ui.AbstractFieldConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; -import com.vaadin.terminal.gwt.client.ui.Connect.LoadStyle; import com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler.BeforeShortcutActionListener; import com.vaadin.ui.RichTextArea; @@ -17,6 +17,7 @@ import com.vaadin.ui.RichTextArea; public class RichTextAreaConnector extends AbstractFieldConnector implements Paintable, BeforeShortcutActionListener { + @Override public void updateFromUIDL(final UIDL uidl, ApplicationConnection client) { getWidget().client = client; getWidget().id = uidl.getId(); @@ -59,6 +60,7 @@ public class RichTextAreaConnector extends AbstractFieldConnector implements } + @Override public void onBeforeShortcutAction(Event e) { getWidget().synchronizeContentToServer(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/richtextarea/VRichTextArea.java b/src/com/vaadin/terminal/gwt/client/ui/richtextarea/VRichTextArea.java index eb062a3799..f9b399caac 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/richtextarea/VRichTextArea.java +++ b/src/com/vaadin/terminal/gwt/client/ui/richtextarea/VRichTextArea.java @@ -31,6 +31,7 @@ import com.vaadin.terminal.gwt.client.Util; import com.vaadin.terminal.gwt.client.ui.Field; import com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler; import com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler.ShortcutActionHandlerOwner; +import com.vaadin.terminal.gwt.client.ui.TouchScrollDelegate; /** * This class implements a basic client side rich text editor component. @@ -85,6 +86,7 @@ public class VRichTextArea extends Composite implements Field, ChangeHandler, initWidget(fp); setStyleName(CLASSNAME); + TouchScrollDelegate.enableTouchScrolling(html, html.getElement()); } private void createRTAComponents() { @@ -160,6 +162,7 @@ public class VRichTextArea extends Composite implements Field, ChangeHandler, } // TODO is this really used, or does everything go via onBlur() only? + @Override public void onChange(ChangeEvent event) { synchronizeContentToServer(); } @@ -177,6 +180,7 @@ public class VRichTextArea extends Composite implements Field, ChangeHandler, } } + @Override public void onBlur(BlurEvent event) { synchronizeContentToServer(); // TODO notify possible server side blur/focus listeners @@ -242,6 +246,7 @@ public class VRichTextArea extends Composite implements Field, ChangeHandler, * delay the height setting so the DOM has had time to stabilize. */ Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { int editorHeight = getOffsetHeight() - getExtraVerticalPixels() @@ -281,9 +286,11 @@ public class VRichTextArea extends Composite implements Field, ChangeHandler, } } + @Override public void onKeyPress(KeyPressEvent event) { if (maxLength >= 0) { Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { if (rta.getHTML().length() > maxLength) { rta.setHTML(rta.getHTML().substring(0, maxLength)); @@ -293,6 +300,7 @@ public class VRichTextArea extends Composite implements Field, ChangeHandler, } } + @Override public void onKeyDown(KeyDownEvent event) { // delegate to closest shortcut action handler // throw event from the iframe forward to the shortcuthandler @@ -320,14 +328,17 @@ public class VRichTextArea extends Composite implements Field, ChangeHandler, return hasShortcutActionHandler; } + @Override public int getTabIndex() { return rta.getTabIndex(); } + @Override public void setAccessKey(char key) { rta.setAccessKey(key); } + @Override public void setFocus(boolean focused) { /* * Similar issue as with selectAll. Focusing must happen before possible @@ -342,6 +353,7 @@ public class VRichTextArea extends Composite implements Field, ChangeHandler, }.schedule(300); } + @Override public void setTabIndex(int index) { rta.setTabIndex(index); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/richtextarea/VRichTextToolbar.java b/src/com/vaadin/terminal/gwt/client/ui/richtextarea/VRichTextToolbar.java index 1e1805efdf..d86c7a4bf5 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/richtextarea/VRichTextToolbar.java +++ b/src/com/vaadin/terminal/gwt/client/ui/richtextarea/VRichTextToolbar.java @@ -172,6 +172,7 @@ public class VRichTextToolbar extends Composite { private class EventHandler implements ClickHandler, ChangeHandler, KeyUpHandler { + @Override @SuppressWarnings("deprecation") public void onChange(ChangeEvent event) { Object sender = event.getSource(); @@ -193,6 +194,7 @@ public class VRichTextToolbar extends Composite { } } + @Override @SuppressWarnings("deprecation") public void onClick(ClickEvent event) { Object sender = event.getSource(); @@ -249,6 +251,7 @@ public class VRichTextToolbar extends Composite { } } + @Override public void onKeyUp(KeyUpEvent event) { if (event.getSource() == richText) { // We use the RichTextArea's onKeyUp event to update the toolbar 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 1a62e566ad..7b5097ff77 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/root/RootConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/root/RootConnector.java @@ -19,13 +19,18 @@ import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.Widget; import com.google.web.bindery.event.shared.HandlerRegistration; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.Connect.LoadStyle; +import com.vaadin.shared.ui.root.PageClientRpc; +import com.vaadin.shared.ui.root.RootServerRpc; +import com.vaadin.shared.ui.root.RootState; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.BrowserInfo; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ConnectorHierarchyChangeEvent; import com.vaadin.terminal.gwt.client.ConnectorMap; import com.vaadin.terminal.gwt.client.Focusable; -import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.Paintable; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.VConsole; @@ -34,8 +39,6 @@ import com.vaadin.terminal.gwt.client.communication.StateChangeEvent; import com.vaadin.terminal.gwt.client.communication.StateChangeEvent.StateChangeHandler; import com.vaadin.terminal.gwt.client.ui.AbstractComponentContainerConnector; import com.vaadin.terminal.gwt.client.ui.ClickEventHandler; -import com.vaadin.terminal.gwt.client.ui.Connect; -import com.vaadin.terminal.gwt.client.ui.Connect.LoadStyle; import com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler; import com.vaadin.terminal.gwt.client.ui.layout.MayScrollChildren; import com.vaadin.terminal.gwt.client.ui.notification.VNotification; @@ -51,6 +54,7 @@ public class RootConnector extends AbstractComponentContainerConnector private HandlerRegistration childStateChangeHandlerRegistration; private final StateChangeHandler childStateChangeHandler = new StateChangeHandler() { + @Override public void onStateChanged(StateChangeEvent stateChangeEvent) { // TODO Should use a more specific handler that only reacts to // size changes @@ -62,12 +66,14 @@ public class RootConnector extends AbstractComponentContainerConnector protected void init() { super.init(); registerRpc(PageClientRpc.class, new PageClientRpc() { + @Override public void setTitle(String title) { com.google.gwt.user.client.Window.setTitle(title); } }); } + @Override public void updateFromUIDL(final UIDL uidl, ApplicationConnection client) { ConnectorMap paintableMap = ConnectorMap.get(getConnection()); getWidget().rendering = true; @@ -118,6 +124,7 @@ public class RootConnector extends AbstractComponentContainerConnector // to finish rendering this window in case this is a download // (and window stays open). Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { VRoot.goTo(url); } @@ -182,6 +189,7 @@ public class RootConnector extends AbstractComponentContainerConnector if (uidl.hasAttribute("focused")) { // set focused component when render phase is finished Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { ComponentConnector paintable = (ComponentConnector) uidl .getPaintableAttribute("focused", getConnection()); @@ -246,6 +254,11 @@ public class RootConnector extends AbstractComponentContainerConnector getWidget().currentFragment, false); } + if (firstPaint) { + // Queue the initial window size to be sent with the following + // request. + getWidget().sendClientResized(); + } getWidget().rendering = false; } @@ -288,6 +301,7 @@ public class RootConnector extends AbstractComponentContainerConnector }; + @Override public void updateCaption(ComponentConnector component) { // NOP The main view never draws caption for its layout } @@ -407,6 +421,7 @@ public class RootConnector extends AbstractComponentContainerConnector } Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { componentConnector.getWidget().getElement().scrollIntoView(); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/root/RootServerRpc.java b/src/com/vaadin/terminal/gwt/client/ui/root/RootServerRpc.java deleted file mode 100644 index 389500949d..0000000000 --- a/src/com/vaadin/terminal/gwt/client/ui/root/RootServerRpc.java +++ /dev/null @@ -1,11 +0,0 @@ -/* -@VaadinApache2LicenseForJavaFiles@ - */ -package com.vaadin.terminal.gwt.client.ui.root; - -import com.vaadin.terminal.gwt.client.communication.ServerRpc; -import com.vaadin.terminal.gwt.client.ui.ClickRpc; - -public interface RootServerRpc extends ClickRpc, ServerRpc { - -}
\ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/client/ui/root/VRoot.java b/src/com/vaadin/terminal/gwt/client/ui/root/VRoot.java index 0af8919280..fddb76e755 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/root/VRoot.java +++ b/src/com/vaadin/terminal/gwt/client/ui/root/VRoot.java @@ -123,6 +123,7 @@ public class VRoot extends SimplePanel implements ResizeHandler, */ private final ValueChangeHandler<String> historyChangeHandler = new ValueChangeHandler<String>() { + @Override public void onValueChange(ValueChangeEvent<String> event) { String newFragment = event.getValue(); @@ -138,6 +139,7 @@ public class VRoot extends SimplePanel implements ResizeHandler, private VLazyExecutor delayedResizeExecutor = new VLazyExecutor(200, new ScheduledCommand() { + @Override public void execute() { performSizeCheck(); } @@ -361,6 +363,7 @@ public class VRoot extends SimplePanel implements ResizeHandler, * .gwt.event.logical.shared.ResizeEvent) */ + @Override public void onResize(ResizeEvent event) { triggerSizeChangeCheck(); } @@ -395,7 +398,7 @@ public class VRoot extends SimplePanel implements ResizeHandler, /** * Send new dimensions to the server. */ - private void sendClientResized() { + void sendClientResized() { Element parentElement = getElement().getParentElement(); int viewHeight = parentElement.getClientHeight(); int viewWidth = parentElement.getClientWidth(); @@ -416,6 +419,7 @@ public class VRoot extends SimplePanel implements ResizeHandler, $wnd.location = url; }-*/; + @Override public void onWindowClosing(Window.ClosingEvent event) { // Change focus on this window in order to ensure that all state is // collected from textfields @@ -435,10 +439,12 @@ public class VRoot extends SimplePanel implements ResizeHandler, } }-*/; + @Override public ShortcutActionHandler getShortcutActionHandler() { return actionHandler; } + @Override public void focus() { getElement().focus(); } 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 6fd7f8b6aa..f8588dbf3f 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/slider/SliderConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/slider/SliderConnector.java @@ -5,17 +5,18 @@ package com.vaadin.terminal.gwt.client.ui.slider; import com.google.gwt.core.client.Scheduler; import com.google.gwt.user.client.Command; +import com.vaadin.shared.ui.Connect; 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.ui.AbstractFieldConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.ui.Slider; @Connect(Slider.class) public class SliderConnector extends AbstractFieldConnector implements Paintable { + @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { getWidget().client = client; @@ -51,6 +52,7 @@ public class SliderConnector extends AbstractFieldConnector implements if (!getWidget().vertical) { // Draw handle with a delay to allow base to gain maximum width Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { getWidget().buildHandle(); getWidget().setValue(getWidget().value, false); diff --git a/src/com/vaadin/terminal/gwt/client/ui/slider/VSlider.java b/src/com/vaadin/terminal/gwt/client/ui/slider/VSlider.java index 5c7ee7a784..06608c95fe 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/slider/VSlider.java +++ b/src/com/vaadin/terminal/gwt/client/ui/slider/VSlider.java @@ -18,7 +18,6 @@ import com.vaadin.terminal.gwt.client.BrowserInfo; import com.vaadin.terminal.gwt.client.ContainerResizedListener; import com.vaadin.terminal.gwt.client.Util; import com.vaadin.terminal.gwt.client.VConsole; -import com.vaadin.terminal.gwt.client.VTooltip; import com.vaadin.terminal.gwt.client.ui.Field; import com.vaadin.terminal.gwt.client.ui.SimpleFocusablePanel; import com.vaadin.terminal.gwt.client.ui.VLazyExecutor; @@ -79,6 +78,7 @@ public class VSlider extends SimpleFocusablePanel implements Field, private VLazyExecutor delayedValueUpdater = new VLazyExecutor(100, new ScheduledCommand() { + @Override public void execute() { updateValueToServer(); acceleration = 1; @@ -114,8 +114,6 @@ public class VSlider extends SimpleFocusablePanel implements Field, feedbackPopup.addStyleName(CLASSNAME + "-feedback"); feedbackPopup.setWidget(feedback); - - sinkEvents(VTooltip.TOOLTIP_EVENTS); } void setFeedbackValue(double value) { @@ -162,6 +160,7 @@ public class VSlider extends SimpleFocusablePanel implements Field, DOM.setStyleAttribute(base, styleAttribute, MIN_SIZE + "px"); Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { final Element p = DOM.getParent(getElement()); if (DOM.getElementPropertyInt(p, domProperty) > (MIN_SIZE + 5)) { @@ -291,9 +290,6 @@ public class VSlider extends SimpleFocusablePanel implements Field, event.preventDefault(); // avoid simulated events event.stopPropagation(); } - if (client != null) { - client.handleTooltipEvent(event, this); - } } private void processMouseWheelEvent(final Event event) { @@ -422,6 +418,7 @@ public class VSlider extends SimpleFocusablePanel implements Field, } } + @Override public void iLayout() { if (vertical) { setHeight(); 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 e33755bc9b..f82718e4ea 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/splitpanel/AbstractSplitPanelConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/splitpanel/AbstractSplitPanelConnector.java @@ -14,16 +14,18 @@ import com.google.gwt.event.shared.HandlerRegistration; 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.shared.MouseEventDetails; +import com.vaadin.shared.ui.splitpanel.AbstractSplitPanelRpc; +import com.vaadin.shared.ui.splitpanel.AbstractSplitPanelState; +import com.vaadin.shared.ui.splitpanel.AbstractSplitPanelState.SplitterState; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ConnectorHierarchyChangeEvent; import com.vaadin.terminal.gwt.client.LayoutManager; -import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.communication.RpcProxy; import com.vaadin.terminal.gwt.client.communication.StateChangeEvent; import com.vaadin.terminal.gwt.client.ui.AbstractComponentContainerConnector; import com.vaadin.terminal.gwt.client.ui.ClickEventHandler; import com.vaadin.terminal.gwt.client.ui.SimpleManagedLayout; -import com.vaadin.terminal.gwt.client.ui.splitpanel.AbstractSplitPanelState.SplitterState; import com.vaadin.terminal.gwt.client.ui.splitpanel.VAbstractSplitPanel.SplitterMoveHandler; import com.vaadin.terminal.gwt.client.ui.splitpanel.VAbstractSplitPanel.SplitterMoveHandler.SplitterMoveEvent; @@ -41,6 +43,7 @@ public abstract class AbstractSplitPanelConnector extends getWidget().addHandler(new SplitterMoveHandler() { + @Override public void splitterMoved(SplitterMoveEvent event) { String position = getWidget().getSplitterPosition(); float pos = 0; @@ -61,6 +64,7 @@ public abstract class AbstractSplitPanelConnector extends }, SplitterMoveEvent.TYPE); } + @Override public void updateCaption(ComponentConnector component) { // TODO Implement caption handling } @@ -145,6 +149,7 @@ public abstract class AbstractSplitPanelConnector extends getWidget().makeScrollable(); } + @Override public void layout() { VAbstractSplitPanel splitPanel = getWidget(); splitPanel.setSplitPosition(splitPanel.position); 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 92c942e04b..8c2c4d24cd 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/splitpanel/HorizontalSplitPanelConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/splitpanel/HorizontalSplitPanelConnector.java @@ -3,8 +3,8 @@ */ package com.vaadin.terminal.gwt.client.ui.splitpanel; -import com.vaadin.terminal.gwt.client.ui.Connect; -import com.vaadin.terminal.gwt.client.ui.Connect.LoadStyle; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.Connect.LoadStyle; import com.vaadin.ui.HorizontalSplitPanel; @Connect(value = HorizontalSplitPanel.class, loadStyle = LoadStyle.EAGER) diff --git a/src/com/vaadin/terminal/gwt/client/ui/splitpanel/VAbstractSplitPanel.java b/src/com/vaadin/terminal/gwt/client/ui/splitpanel/VAbstractSplitPanel.java index e2f30c6676..a20c0476a5 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/splitpanel/VAbstractSplitPanel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/splitpanel/VAbstractSplitPanel.java @@ -125,12 +125,14 @@ public class VAbstractSplitPanel extends ComplexPanel { makeScrollable(); addDomHandler(new TouchCancelHandler() { + @Override public void onTouchCancel(TouchCancelEvent event) { // TODO When does this actually happen?? VConsole.log("TOUCH CANCEL"); } }, TouchCancelEvent.getType()); addDomHandler(new TouchStartHandler() { + @Override public void onTouchStart(TouchStartEvent event) { Node target = event.getTouches().get(0).getTarget().cast(); if (splitter.isOrHasChild(target)) { @@ -139,6 +141,7 @@ public class VAbstractSplitPanel extends ComplexPanel { } }, TouchStartEvent.getType()); addDomHandler(new TouchMoveHandler() { + @Override public void onTouchMove(TouchMoveEvent event) { if (resizing) { onMouseMove(Event.as(event.getNativeEvent())); @@ -146,6 +149,7 @@ public class VAbstractSplitPanel extends ComplexPanel { } }, TouchMoveEvent.getType()); addDomHandler(new TouchEndHandler() { + @Override public void onTouchEnd(TouchEndEvent event) { if (resizing) { onMouseUp(Event.as(event.getNativeEvent())); @@ -251,23 +255,22 @@ public class VAbstractSplitPanel extends ComplexPanel { * @return */ private float convertToPercentage(String pos) { - float posAsFloat = 0; - - if (pos.indexOf("px") > 0) { - int posAsInt = Integer.parseInt(pos.substring(0, pos.length() - 2)); + if (pos.endsWith("px")) { + float pixelPosition = Float.parseFloat(pos.substring(0, + pos.length() - 2)); int offsetLength = orientation == ORIENTATION_HORIZONTAL ? getOffsetWidth() : getOffsetHeight(); - // 100% needs special handling - if (posAsInt + getSplitterSize() >= offsetLength) { - posAsInt = offsetLength; + // Take splitter size into account at the edge + if (pixelPosition + getSplitterSize() >= offsetLength) { + return 100; } - posAsFloat = ((float) posAsInt / (float) offsetLength * 100); + return pixelPosition / offsetLength * 100; } else { - posAsFloat = Float.parseFloat(pos.substring(0, pos.length() - 1)); + assert pos.endsWith("%"); + return Float.parseFloat(pos.substring(0, pos.length() - 1)); } - return posAsFloat; } /** 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 5015fcc60c..048136c1c9 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/splitpanel/VerticalSplitPanelConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/splitpanel/VerticalSplitPanelConnector.java @@ -4,8 +4,8 @@ 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.shared.ui.Connect; +import com.vaadin.shared.ui.Connect.LoadStyle; import com.vaadin.ui.VerticalSplitPanel; @Connect(value = VerticalSplitPanel.class, loadStyle = LoadStyle.EAGER) 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 ada0f2424f..7721a3d763 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/table/TableConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/table/TableConnector.java @@ -7,20 +7,22 @@ import java.util.Iterator; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.ScheduledCommand; +import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.Style.Position; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.ui.Widget; -import com.vaadin.terminal.gwt.client.AbstractFieldState; +import com.vaadin.shared.AbstractFieldState; +import com.vaadin.shared.ui.Connect; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.BrowserInfo; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.DirectionalManagedLayout; import com.vaadin.terminal.gwt.client.Paintable; import com.vaadin.terminal.gwt.client.ServerConnector; +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.ui.AbstractComponentContainerConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.PostLayoutListener; import com.vaadin.terminal.gwt.client.ui.table.VScrollTable.ContextMenuDetails; import com.vaadin.terminal.gwt.client.ui.table.VScrollTable.VScrollTableBody.VScrollTableRow; @@ -42,6 +44,7 @@ public class TableConnector extends AbstractComponentContainerConnector * com.vaadin.terminal.gwt.client.Paintable#updateFromUIDL(com.vaadin.terminal * .gwt.client.UIDL, com.vaadin.terminal.gwt.client.ApplicationConnection) */ + @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { getWidget().rendering = true; @@ -178,6 +181,7 @@ public class TableConnector extends AbstractComponentContainerConnector // *shouldn't* have changed (unless the number of rows // or the height of the widget has also changed) Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { Util.runWebkitOverflowAutoFix(getWidget().scrollBodyPanel .getElement()); @@ -244,6 +248,20 @@ public class TableConnector extends AbstractComponentContainerConnector } } + /* + * If the server has (re)initialized the rows, our selectionRangeStart + * row will point to an index that the server knows nothing about, + * causing problems if doing multi selection with shift. The field will + * be cleared a little later when the row focus has been restored. + * (#8584) + */ + if (uidl.hasAttribute(VScrollTable.ATTRIBUTE_KEY_MAPPER_RESET) + && uidl.getBooleanAttribute(VScrollTable.ATTRIBUTE_KEY_MAPPER_RESET) + && getWidget().selectionRangeStart != null) { + assert !getWidget().selectionRangeStart.isAttached(); + getWidget().selectionRangeStart = getWidget().focusedRow; + } + getWidget().tabIndex = uidl.hasAttribute("tabindex") ? uidl .getIntAttribute("tabindex") : 0; getWidget().setProperTabIndex(); @@ -265,23 +283,28 @@ public class TableConnector extends AbstractComponentContainerConnector return (VScrollTable) super.getWidget(); } + @Override public void updateCaption(ComponentConnector component) { // NOP, not rendered } + @Override public void layoutVertically() { getWidget().updateHeight(); } + @Override public void layoutHorizontally() { getWidget().updateWidth(); } + @Override public void postLayout() { VScrollTable table = getWidget(); if (table.sizeNeedsInit) { table.sizeInit(); Scheduler.get().scheduleFinally(new ScheduledCommand() { + @Override public void execute() { getLayoutManager().setNeedsMeasure(TableConnector.this); ServerConnector parent = getParent(); @@ -328,4 +351,27 @@ public class TableConnector extends AbstractComponentContainerConnector } } + @Override + public TooltipInfo getTooltipInfo(Element element) { + + TooltipInfo info = null; + + if (element != getWidget().getElement()) { + Object node = Util.findWidget( + (com.google.gwt.user.client.Element) element, + VScrollTableRow.class); + + if (node != null) { + VScrollTableRow row = (VScrollTableRow) node; + info = row.getTooltip(element); + } + } + + if (info == null) { + info = super.getTooltipInfo(element); + } + + return info; + } + } diff --git a/src/com/vaadin/terminal/gwt/client/ui/table/VScrollTable.java b/src/com/vaadin/terminal/gwt/client/ui/table/VScrollTable.java index c4a57f5c8b..8a58c28c5b 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/table/VScrollTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/table/VScrollTable.java @@ -11,6 +11,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.Set; import com.google.gwt.core.client.JavaScriptObject; @@ -59,13 +60,14 @@ import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.UIObject; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.ComponentState; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.dd.VerticalDropLocation; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.BrowserInfo; import com.vaadin.terminal.gwt.client.ComponentConnector; -import com.vaadin.terminal.gwt.client.ComponentState; import com.vaadin.terminal.gwt.client.ConnectorMap; import com.vaadin.terminal.gwt.client.Focusable; -import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.MouseEventDetailsBuilder; import com.vaadin.terminal.gwt.client.TooltipInfo; import com.vaadin.terminal.gwt.client.UIDL; @@ -84,7 +86,6 @@ import com.vaadin.terminal.gwt.client.ui.dd.VDragAndDropManager; import com.vaadin.terminal.gwt.client.ui.dd.VDragEvent; import com.vaadin.terminal.gwt.client.ui.dd.VHasDropHandler; import com.vaadin.terminal.gwt.client.ui.dd.VTransferable; -import com.vaadin.terminal.gwt.client.ui.dd.VerticalDropLocation; import com.vaadin.terminal.gwt.client.ui.embedded.VEmbedded; import com.vaadin.terminal.gwt.client.ui.label.VLabel; import com.vaadin.terminal.gwt.client.ui.table.VScrollTable.VScrollTableBody.VScrollTableRow; @@ -130,6 +131,12 @@ public class VScrollTable extends FlowPanel implements HasWidgets, } } + /** + * Tell the client that old keys are no longer valid because the server has + * cleared its key map. + */ + public static final String ATTRIBUTE_KEY_MAPPER_RESET = "clearKeyMap"; + private static final String ROW_HEADER_COLUMN_KEY = "0"; public static final String CLASSNAME = "v-table"; @@ -215,7 +222,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, /* * Helper to store selection range start in when using the keyboard */ - private VScrollTableRow selectionRangeStart; + VScrollTableRow selectionRangeStart; /* * Flag for notifying when the selection has changed and should be sent to @@ -241,6 +248,19 @@ public class VScrollTable extends FlowPanel implements HasWidgets, private Set<String> noncollapsibleColumns; /** + * The last known row height used to preserve the height of a table with + * custom row heights and a fixed page length after removing the last row + * from the table. + * + * A new VScrollTableBody instance is created every time the number of rows + * changes causing {@link VScrollTableBody#rowHeight} to be discarded and + * the height recalculated by {@link VScrollTableBody#getRowHeight(boolean)} + * to avoid some rounding problems, e.g. round(2 * 19.8) / 2 = 20 but + * round(3 * 19.8) / 3 = 19.66. + */ + private double lastKnownRowHeight = Double.NaN; + + /** * Represents a select range of rows */ private class SelectionRange { @@ -327,6 +347,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, private KeyPressHandler navKeyPressHandler = new KeyPressHandler() { + @Override public void onKeyPress(KeyPressEvent keyPressEvent) { // This is used for Firefox only, since Firefox auto-repeat // works correctly only if we use a key press handler, other @@ -364,6 +385,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, private KeyUpHandler navKeyUpHandler = new KeyUpHandler() { + @Override public void onKeyUp(KeyUpEvent keyUpEvent) { NativeEvent event = keyUpEvent.getNativeEvent(); int keyCode = event.getKeyCode(); @@ -391,6 +413,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, private KeyDownHandler navKeyDownHandler = new KeyDownHandler() { + @Override public void onKeyDown(KeyDownEvent keyDownEvent) { NativeEvent event = keyDownEvent.getNativeEvent(); // This is not used for Firefox @@ -519,6 +542,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, scrollBodyPanel.sinkEvents(Event.ONCONTEXTMENU); scrollBodyPanel.addDomHandler(new ContextMenuHandler() { + @Override public void onContextMenu(ContextMenuEvent event) { handleBodyContextMenu(event); } @@ -539,6 +563,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, // closes. See #8526. client.getContextMenu().addCloseHandler(new CloseHandler<PopupPanel>() { + @Override public void onClose(CloseEvent<PopupPanel> event) { contextMenu = null; } @@ -1848,6 +1873,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, // Deferred due to some Firefox oddities Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { scrollBodyPanel .setScrollPosition(measureRowHeightOffset(firstvisible)); @@ -1883,6 +1909,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, scrollBody.reLayoutComponents(); Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { Util.runWebkitOverflowAutoFix(scrollBodyPanel.getElement()); } @@ -2214,6 +2241,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, } else { Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { int tdWidth = width + scrollBody.getCellExtraWidth(); @@ -2812,6 +2840,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, Scheduler.get().scheduleDeferred( new ScheduledCommand() { + @Override public void execute() { setColWidth(colIx, newWidth, true); } @@ -2840,6 +2869,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, // Recalculate the column sizings if any column has changed Scheduler.get().scheduleDeferred(new ScheduledCommand() { + @Override public void execute() { triggerLazyColumnAdjustment(true); } @@ -2951,6 +2981,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, visibleCells.add(newIndex, hCell); } + @Override public Iterator<Widget> iterator() { return visibleCells.iterator(); } @@ -3100,6 +3131,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, * Returns columns as Action array for column select popup */ + @Override public Action[] getActions() { Object[] cols; if (columnReordering && columnOrder != null) { @@ -3138,10 +3170,12 @@ public class VScrollTable extends FlowPanel implements HasWidgets, return actions; } + @Override public ApplicationConnection getClient() { return client; } + @Override public String getPaintableId() { return paintableId; } @@ -3287,20 +3321,15 @@ public class VScrollTable extends FlowPanel implements HasWidgets, DOM.setStyleAttribute(captionContainer, "width", ""); setWidth(""); } else { - /* * Reduce width with one pixel for the right border since the * footers does not have any spacers between them. */ - int borderWidths = 1; + final int borderWidths = 1; // Set the container width (check for negative value) - if (w - borderWidths >= 0) { - captionContainer.getStyle().setPropertyPx("width", - w - borderWidths); - } else { - captionContainer.getStyle().setPropertyPx("width", 0); - } + captionContainer.getStyle().setPropertyPx("width", + Math.max(w - borderWidths, 0)); /* * if we already have tBody, set the header width properly, if @@ -3308,22 +3337,18 @@ public class VScrollTable extends FlowPanel implements HasWidgets, * unless TD width is not explicitly set. */ if (scrollBody != null) { - /* - * Reduce with one since footer does not have any spacers, - * instead a 1 pixel border. - */ int tdWidth = width + scrollBody.getCellExtraWidth() - borderWidths; - setWidth(tdWidth + "px"); + setWidth(Math.max(tdWidth, 0) + "px"); } else { Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { - int borderWidths = 1; int tdWidth = width + scrollBody.getCellExtraWidth() - borderWidths; - setWidth(tdWidth + "px"); + setWidth(Math.max(tdWidth, 0) + "px"); } }); } @@ -3582,6 +3607,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, * @see com.google.gwt.user.client.ui.HasWidgets#iterator() */ + @Override public Iterator<Widget> iterator() { return visibleCells.iterator(); } @@ -4120,6 +4146,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, renderedRows.add(actualIx, row); } + @Override public Iterator<Widget> iterator() { return renderedRows.iterator(); } @@ -4194,14 +4221,6 @@ public class VScrollTable extends FlowPanel implements HasWidgets, private void unlinkRowAtActualIndex(int index) { final VScrollTableRow toBeRemoved = (VScrollTableRow) renderedRows .get(index); - // Unregister row tooltip - client.registerTooltip(VScrollTable.this, toBeRemoved.getElement(), - null); - for (int i = 0; i < toBeRemoved.getElement().getChildCount(); i++) { - // Unregister cell tooltips - Element td = toBeRemoved.getElement().getChild(i).cast(); - client.registerTooltip(VScrollTable.this, td, null); - } tBodyElement.removeChild(toBeRemoved.getElement()); orphan(toBeRemoved); renderedRows.remove(index); @@ -4244,13 +4263,27 @@ public class VScrollTable extends FlowPanel implements HasWidgets, if (tBodyMeasurementsDone && !forceUpdate) { return rowHeight; } else { - if (tBodyElement.getRows().getLength() > 0) { int tableHeight = getTableHeight(); int rowCount = tBodyElement.getRows().getLength(); rowHeight = tableHeight / (double) rowCount; } else { - if (isAttached()) { + // Special cases if we can't just measure the current rows + if (!Double.isNaN(lastKnownRowHeight)) { + // Use previous value if available + if (BrowserInfo.get().isIE()) { + /* + * IE needs to reflow the table element at this + * point to work correctly (e.g. + * com.vaadin.tests.components.table. + * ContainerSizeChange) - the other code paths + * already trigger reflows, but here it must be done + * explicitly. + */ + getTableHeight(); + } + rowHeight = lastKnownRowHeight; + } else if (isAttached()) { // measure row height by adding a dummy row VScrollTableRow scrollTableRow = new VScrollTableRow(); tBodyElement.appendChild(scrollTableRow.getElement()); @@ -4261,6 +4294,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, return DEFAULT_ROW_HEIGHT; } } + lastKnownRowHeight = rowHeight; tBodyMeasurementsDone = true; return rowHeight; } @@ -4423,6 +4457,8 @@ public class VScrollTable extends FlowPanel implements HasWidgets, private Timer dragTouchTimeout; private int touchStartY; private int touchStartX; + private TooltipInfo tooltipInfo = null; + private Map<TableCellElement, TooltipInfo> cellToolTips = new HashMap<TableCellElement, TooltipInfo>(); private boolean isDragging = false; private VScrollTableRow(int rowKey) { @@ -4450,11 +4486,9 @@ public class VScrollTable extends FlowPanel implements HasWidgets, String rowDescription = uidl.getStringAttribute("rowdescr"); if (rowDescription != null && !rowDescription.equals("")) { - TooltipInfo info = new TooltipInfo(rowDescription); - client.registerTooltip(VScrollTable.this, rowElement, info); + tooltipInfo = new TooltipInfo(rowDescription); } else { - // Remove possibly previously set tooltip - client.registerTooltip(VScrollTable.this, rowElement, null); + tooltipInfo = null; } tHead.getColumnAlignments(); @@ -4480,6 +4514,10 @@ public class VScrollTable extends FlowPanel implements HasWidgets, } } + public TooltipInfo getTooltipInfo() { + return tooltipInfo; + } + /** * Add a dummy row, used for measurements if Table is empty. */ @@ -4665,10 +4703,9 @@ public class VScrollTable extends FlowPanel implements HasWidgets, if (description != null && !description.equals("")) { TooltipInfo info = new TooltipInfo(description); - client.registerTooltip(VScrollTable.this, td, info); + cellToolTips.put(td, info); } else { - // Remove possibly previously set tooltip - client.registerTooltip(VScrollTable.this, td, null); + cellToolTips.remove(td); } td.appendChild(container); @@ -4718,6 +4755,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, childWidgets.add(w); } + @Override public Iterator<Widget> iterator() { return childWidgets.iterator(); } @@ -4776,39 +4814,22 @@ public class VScrollTable extends FlowPanel implements HasWidgets, return true; } - private void handleTooltips(final Event event, Element target) { + public TooltipInfo getTooltip( + com.google.gwt.dom.client.Element target) { + + TooltipInfo info = null; + if (target.hasTagName("TD")) { - // Table cell (td) - Element container = target.getFirstChildElement().cast(); - Element widget = container.getFirstChildElement().cast(); - - boolean containsWidget = false; - for (Widget w : childWidgets) { - if (widget == w.getElement()) { - containsWidget = true; - break; - } - } - if (!containsWidget) { - // Only text nodes has tooltips - if (ConnectorMap.get(client).getWidgetTooltipInfo( - VScrollTable.this, target) != null) { - // Cell has description, use it - client.handleTooltipEvent(event, VScrollTable.this, - target); - } else { - // Cell might have row description, use row - // description - client.handleTooltipEvent(event, VScrollTable.this, - target.getParentElement()); - } - } + TableCellElement td = (TableCellElement) target.cast(); + info = cellToolTips.get(td); + } - } else { - // Table row (tr) - client.handleTooltipEvent(event, VScrollTable.this, target); + if (info == null) { + info = tooltipInfo; } + + return info; } /** @@ -4953,9 +4974,6 @@ public class VScrollTable extends FlowPanel implements HasWidgets, } boolean targetCellOrRowFound = targetTdOrTr != null; - if (targetCellOrRowFound) { - handleTooltips(event, targetTdOrTr); - } switch (type) { case Event.ONDBLCLICK: @@ -5430,6 +5448,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, * @see com.vaadin.terminal.gwt.client.ui.IActionOwner#getActions () */ + @Override public Action[] getActions() { if (actionKeys == null) { return new Action[] {}; @@ -5453,10 +5472,12 @@ public class VScrollTable extends FlowPanel implements HasWidgets, return actions; } + @Override public ApplicationConnection getClient() { return client; } + @Override public String getPaintableId() { return paintableId; } @@ -5507,6 +5528,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, // widths. Scheduler.get().scheduleDeferred(new ScheduledCommand() { + @Override public void execute() { if (showRowHeaders) { setCellWidth(0, tHead.getHeaderCell(0).getWidth()); @@ -5824,7 +5846,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, if (isDynamicHeight() && totalRows == pageLength) { // fix body height (may vary if lazy loading is offhorizontal // scrollbar appears/disappears) - int bodyHeight = Util.getRequiredHeight(scrollBody); + int bodyHeight = scrollBody.getRequiredHeight(); boolean needsSpaceForHorizontalScrollbar = (availW < usedMinimumWidth); if (needsSpaceForHorizontalScrollbar) { bodyHeight += Util.getNativeScrollbarSize(); @@ -5838,6 +5860,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, scrollBody.reLayoutComponents(); Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { Util.runWebkitOverflowAutoFix(scrollBodyPanel.getElement()); } @@ -5959,6 +5982,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, // #7607. Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { Util.runWebkitOverflowAutoFix(scrollBodyPanel.getElement()); } @@ -5989,6 +6013,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, if (visible) { Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { scrollBodyPanel .setScrollPosition(measureRowHeightOffset(firstRowInViewPort)); @@ -6023,6 +6048,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, * user scrolls */ + @Override public void onScroll(ScrollEvent event) { scrollLeft = scrollBodyPanel.getElement().getScrollLeft(); scrollTop = scrollBodyPanel.getScrollPosition(); @@ -6052,6 +6078,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, // value available soon. Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { onScroll(null); } @@ -6132,6 +6159,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, return (int) Math.ceil(scrollTop / scrollBody.getRowHeight()); } + @Override public VScrollTableDropHandler getDropHandler() { return dropHandler; } @@ -6212,6 +6240,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, final TableDDDetails newDetails = dropDetails; VAcceptCallback cb = new VAcceptCallback() { + @Override public void accepted(VDragEvent event) { if (newDetails.equals(dropDetails)) { dragAccepted(event); @@ -6288,6 +6317,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, return ConnectorMap.get(client).getConnector(VScrollTable.this); } + @Override public ApplicationConnection getApplicationConnection() { return client; } @@ -6619,6 +6649,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, * .dom.client.FocusEvent) */ + @Override public void onFocus(FocusEvent event) { if (isFocusable()) { hasFocus = true; @@ -6640,6 +6671,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, * .dom.client.BlurEvent) */ + @Override public void onBlur(BlurEvent event) { hasFocus = false; navKeyDown = false; @@ -6713,6 +6745,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, * @see com.vaadin.terminal.gwt.client.Focusable#focus() */ + @Override public void focus() { if (isFocusable()) { scrollBodyPanel.focus(); @@ -6794,6 +6827,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, public void lazyRevertFocusToRow(final VScrollTableRow currentlyFocusedRow) { Scheduler.get().scheduleFinally(new ScheduledCommand() { + @Override public void execute() { if (currentlyFocusedRow != null) { setRowFocus(currentlyFocusedRow); @@ -6806,6 +6840,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, }); } + @Override public Action[] getActions() { if (bodyActionKeys == null) { return new Action[] {}; @@ -6821,10 +6856,12 @@ public class VScrollTable extends FlowPanel implements HasWidgets, return actions; } + @Override public ApplicationConnection getClient() { return client; } + @Override public String getPaintableId() { return paintableId; } diff --git a/src/com/vaadin/terminal/gwt/client/ui/tabsheet/TabsheetBaseConnector.java b/src/com/vaadin/terminal/gwt/client/ui/tabsheet/TabsheetBaseConnector.java index e16e84d112..ea0bea6b04 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/tabsheet/TabsheetBaseConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/tabsheet/TabsheetBaseConnector.java @@ -22,6 +22,7 @@ public abstract class TabsheetBaseConnector extends public static final String ATTRIBUTE_TAB_CAPTION = "caption"; public static final String ATTRIBUTE_TAB_ICON = "icon"; + @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { getWidget().client = client; 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 08d4679dc5..ce19f1e02a 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/tabsheet/TabsheetConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/tabsheet/TabsheetConnector.java @@ -3,13 +3,14 @@ */ package com.vaadin.terminal.gwt.client.ui.tabsheet; -import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Element; import com.google.gwt.user.client.DOM; -import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.ui.Connect; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.ComponentConnector; +import com.vaadin.terminal.gwt.client.TooltipInfo; import com.vaadin.terminal.gwt.client.UIDL; -import com.vaadin.terminal.gwt.client.ui.Connect; +import com.vaadin.terminal.gwt.client.Util; import com.vaadin.terminal.gwt.client.ui.SimpleManagedLayout; import com.vaadin.terminal.gwt.client.ui.layout.MayScrollChildren; import com.vaadin.ui.TabSheet; @@ -67,10 +68,12 @@ public class TabsheetConnector extends TabsheetBaseConnector implements return (VTabsheet) super.getWidget(); } + @Override public void updateCaption(ComponentConnector component) { /* Tabsheet does not render its children's captions */ } + @Override public void layout() { VTabsheet tabsheet = getWidget(); @@ -97,4 +100,29 @@ public class TabsheetConnector extends TabsheetBaseConnector implements } + @Override + public TooltipInfo getTooltipInfo(Element element) { + + TooltipInfo info = null; + + // Find a tooltip for the tab, if the element is a tab + if (element != getWidget().getElement()) { + Object node = Util.findWidget( + (com.google.gwt.user.client.Element) element, + VTabsheet.TabCaption.class); + + if (node != null) { + VTabsheet.TabCaption caption = (VTabsheet.TabCaption) node; + info = caption.getTooltipInfo(); + } + } + + // If not tab tooltip was found, use the default + if (info == null) { + info = super.getTooltipInfo(element); + } + + return info; + } + } diff --git a/src/com/vaadin/terminal/gwt/client/ui/tabsheet/VTabsheet.java b/src/com/vaadin/terminal/gwt/client/ui/tabsheet/VTabsheet.java index aba5a41f9a..1f6314050e 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/tabsheet/VTabsheet.java +++ b/src/com/vaadin/terminal/gwt/client/ui/tabsheet/VTabsheet.java @@ -34,12 +34,12 @@ import com.google.gwt.user.client.ui.ComplexPanel; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.impl.FocusImpl; +import com.vaadin.shared.ComponentState; +import com.vaadin.shared.EventId; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.BrowserInfo; import com.vaadin.terminal.gwt.client.ComponentConnector; -import com.vaadin.terminal.gwt.client.ComponentState; import com.vaadin.terminal.gwt.client.ConnectorMap; -import com.vaadin.terminal.gwt.client.EventId; import com.vaadin.terminal.gwt.client.Focusable; import com.vaadin.terminal.gwt.client.TooltipInfo; import com.vaadin.terminal.gwt.client.UIDL; @@ -212,14 +212,17 @@ public class VTabsheet extends VTabsheetBase implements Focusable, tabCaption.setWidth(tabCaption.getRequiredWidth() + "px"); } + @Override public HandlerRegistration addFocusHandler(FocusHandler handler) { return addDomHandler(handler, FocusEvent.getType()); } + @Override public HandlerRegistration addBlurHandler(BlurHandler handler) { return addDomHandler(handler, BlurEvent.getType()); } + @Override public HandlerRegistration addKeyDownHandler(KeyDownHandler handler) { return addDomHandler(handler, KeyDownEvent.getType()); } @@ -233,7 +236,7 @@ public class VTabsheet extends VTabsheetBase implements Focusable, } } - private static class TabCaption extends VCaption { + public static class TabCaption extends VCaption { private boolean closable = false; private Element closeButton; @@ -248,16 +251,11 @@ public class VTabsheet extends VTabsheetBase implements Focusable, public boolean updateCaption(UIDL uidl) { if (uidl.hasAttribute(TabsheetBaseConnector.ATTRIBUTE_TAB_DESCRIPTION)) { - TooltipInfo tooltipInfo = new TooltipInfo(); - tooltipInfo - .setTitle(uidl - .getStringAttribute(TabsheetBaseConnector.ATTRIBUTE_TAB_DESCRIPTION)); - tooltipInfo - .setErrorMessage(uidl - .getStringAttribute(TabsheetBaseConnector.ATTRIBUTE_TAB_ERROR_MESSAGE)); - client.registerTooltip(getTabsheet(), getElement(), tooltipInfo); + setTooltipInfo(new TooltipInfo( + uidl.getStringAttribute(TabsheetBaseConnector.ATTRIBUTE_TAB_DESCRIPTION), + uidl.getStringAttribute(TabsheetBaseConnector.ATTRIBUTE_TAB_ERROR_MESSAGE))); } else { - client.registerTooltip(getTabsheet(), getElement(), null); + setTooltipInfo(null); } // TODO need to call this instead of super because the caption does @@ -292,7 +290,6 @@ public class VTabsheet extends VTabsheetBase implements Focusable, if (event.getTypeInt() == Event.ONLOAD) { getTabsheet().tabSizeMightHaveChanged(getTab()); } - client.handleTooltipEvent(event, getTabsheet(), getElement()); } public Tab getTab() { @@ -362,6 +359,7 @@ public class VTabsheet extends VTabsheetBase implements Focusable, setElement(el); } + @Override public void onClose(VCloseEvent event) { Tab tab = event.getTab(); if (!tab.isEnabledOnServer()) { @@ -397,6 +395,7 @@ public class VTabsheet extends VTabsheetBase implements Focusable, return t; } + @Override public void onClick(ClickEvent event) { TabCaption caption = (TabCaption) event.getSource(); Element targetElement = event.getNativeEvent().getEventTarget() @@ -691,24 +690,27 @@ public class VTabsheet extends VTabsheetBase implements Focusable, @Override public void onBrowserEvent(Event event) { + if (event.getTypeInt() == Event.ONCLICK) { + // Tab scrolling + if (isScrolledTabs() && DOM.eventGetTarget(event) == scrollerPrev) { + int newFirstIndex = tb.scrollLeft(scrollerIndex); + if (newFirstIndex != -1) { + scrollerIndex = newFirstIndex; + updateTabScroller(); + } + return; + } else if (isClippedTabs() + && DOM.eventGetTarget(event) == scrollerNext) { + int newFirstIndex = tb.scrollRight(scrollerIndex); - // Tab scrolling - if (isScrolledTabs() && DOM.eventGetTarget(event) == scrollerPrev) { - int newFirstIndex = tb.scrollLeft(scrollerIndex); - if (newFirstIndex != -1) { - scrollerIndex = newFirstIndex; - updateTabScroller(); - } - } else if (isClippedTabs() && DOM.eventGetTarget(event) == scrollerNext) { - int newFirstIndex = tb.scrollRight(scrollerIndex); - - if (newFirstIndex != -1) { - scrollerIndex = newFirstIndex; - updateTabScroller(); + if (newFirstIndex != -1) { + scrollerIndex = newFirstIndex; + updateTabScroller(); + } + return; } - } else { - super.onBrowserEvent(event); } + super.onBrowserEvent(event); } /** @@ -1034,6 +1036,7 @@ public class VTabsheet extends VTabsheetBase implements Focusable, style.setProperty("whiteSpace", "normal"); Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { style.setProperty("whiteSpace", ""); } @@ -1118,6 +1121,7 @@ public class VTabsheet extends VTabsheetBase implements Focusable, } } + @Override public void onBlur(BlurEvent event) { if (focusedTab != null && event.getSource() instanceof Tab) { focusedTab = null; @@ -1127,6 +1131,7 @@ public class VTabsheet extends VTabsheetBase implements Focusable, } } + @Override public void onFocus(FocusEvent event) { if (focusedTab == null && event.getSource() instanceof Tab) { focusedTab = (Tab) event.getSource(); @@ -1136,6 +1141,7 @@ public class VTabsheet extends VTabsheetBase implements Focusable, } } + @Override public void focus() { tb.getTab(activeTabIndex).focus(); } @@ -1144,6 +1150,7 @@ public class VTabsheet extends VTabsheetBase implements Focusable, tb.getTab(activeTabIndex).blur(); } + @Override public void onKeyDown(KeyDownEvent event) { if (event.getSource() instanceof Tab) { int keycode = event.getNativeEvent().getKeyCode(); 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 a235ca5389..cdf648d3ec 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/textarea/TextAreaConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/textarea/TextAreaConnector.java @@ -4,8 +4,9 @@ package com.vaadin.terminal.gwt.client.ui.textarea; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.textarea.TextAreaState; 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; 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 aede1ef002..c0f6deab53 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/textarea/VTextArea.java +++ b/src/com/vaadin/terminal/gwt/client/ui/textarea/VTextArea.java @@ -57,6 +57,7 @@ public class VTextArea extends VTextField { public void onBrowserEvent(Event event) { if (getMaxLength() >= 0 && event.getTypeInt() == Event.ONKEYUP) { Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { if (getText().length() > getMaxLength()) { setText(getText().substring(0, getMaxLength())); 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 04bf029b05..d98d27942a 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/textfield/TextFieldConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/textfield/TextFieldConnector.java @@ -7,12 +7,13 @@ package com.vaadin.terminal.gwt.client.ui.textfield; import com.google.gwt.core.client.Scheduler; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Event; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.Connect.LoadStyle; +import com.vaadin.shared.ui.textfield.AbstractTextFieldState; 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.ui.AbstractFieldConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; -import com.vaadin.terminal.gwt.client.ui.Connect.LoadStyle; import com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler.BeforeShortcutActionListener; import com.vaadin.ui.TextField; @@ -25,6 +26,7 @@ public class TextFieldConnector extends AbstractFieldConnector implements return (AbstractTextFieldState) super.getState(); } + @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { // Save details getWidget().client = client; @@ -83,6 +85,7 @@ public class TextFieldConnector extends AbstractFieldConnector implements * Gecko defers setting the text so we need to defer the selection. */ Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { getWidget().setSelectionRange(pos, length); } @@ -95,6 +98,7 @@ public class TextFieldConnector extends AbstractFieldConnector implements return (VTextField) super.getWidget(); } + @Override public void onBeforeShortcutAction(Event e) { getWidget().valueChange(false); } 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 aeae165f60..7f8e549550 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/textfield/VTextField.java +++ b/src/com/vaadin/terminal/gwt/client/ui/textfield/VTextField.java @@ -18,11 +18,10 @@ import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.TextBoxBase; +import com.vaadin.shared.EventId; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.BrowserInfo; -import com.vaadin.terminal.gwt.client.EventId; import com.vaadin.terminal.gwt.client.Util; -import com.vaadin.terminal.gwt.client.VTooltip; import com.vaadin.terminal.gwt.client.ui.Field; /** @@ -88,7 +87,6 @@ public class VTextField extends TextBoxBase implements Field, ChangeHandler, } addFocusHandler(this); addBlurHandler(this); - sinkEvents(VTooltip.TOOLTIP_EVENTS); } /* @@ -107,9 +105,6 @@ public class VTextField extends TextBoxBase implements Field, ChangeHandler, @Override public void onBrowserEvent(Event event) { super.onBrowserEvent(event); - if (client != null) { - client.handleTooltipEvent(event, this); - } if (listenTextChangeEvents && (event.getTypeInt() & TEXTCHANGE_EVENTS) == event @@ -279,6 +274,7 @@ public class VTextField extends TextBoxBase implements Field, ChangeHandler, return maxLength; } + @Override public void onChange(ChangeEvent event) { valueChange(false); } @@ -305,7 +301,7 @@ public class VTextField extends TextBoxBase implements Field, ChangeHandler, if (!prompting && newText != null && !newText.equals(valueBeforeEdit)) { sendValueChange = immediate; - client.updateVariable(paintableId, "text", getText(), false); + client.updateVariable(paintableId, "text", newText, false); valueBeforeEdit = newText; valueBeforeEditIsSynced = true; } @@ -354,6 +350,7 @@ public class VTextField extends TextBoxBase implements Field, ChangeHandler, } } + @Override public void onFocus(FocusEvent event) { addStyleDependentName(CLASSNAME_FOCUS); if (prompting) { @@ -367,7 +364,13 @@ public class VTextField extends TextBoxBase implements Field, ChangeHandler, } } + @Override public void onBlur(BlurEvent event) { + // this is called twice on Chrome when e.g. changing tab while prompting + // field focused - do not change settings on the second time + if (focusedTextField != this) { + return; + } removeStyleDependentName(CLASSNAME_FOCUS); focusedTextField = null; String text = getText(); @@ -392,6 +395,7 @@ public class VTextField extends TextBoxBase implements Field, ChangeHandler, setWidth(columns + "em"); } + @Override public void onKeyDown(KeyDownEvent event) { if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) { valueChange(false); 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 e4afa32143..def63edae9 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/tree/TreeConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/tree/TreeConnector.java @@ -3,16 +3,20 @@ */ package com.vaadin.terminal.gwt.client.ui.tree; +import java.util.HashMap; import java.util.Iterator; +import java.util.Map; -import com.vaadin.terminal.gwt.client.AbstractFieldState; +import com.google.gwt.dom.client.Element; +import com.vaadin.shared.AbstractFieldState; +import com.vaadin.shared.ui.Connect; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.BrowserInfo; import com.vaadin.terminal.gwt.client.Paintable; 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.ui.AbstractComponentConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.tree.VTree.TreeNode; import com.vaadin.ui.Tree; @@ -27,6 +31,9 @@ public class TreeConnector extends AbstractComponentConnector implements public static final String ATTRIBUTE_ACTION_CAPTION = "caption"; public static final String ATTRIBUTE_ACTION_ICON = ATTRIBUTE_NODE_ICON; + protected final Map<TreeNode, TooltipInfo> tooltipMap = new HashMap<TreeNode, TooltipInfo>(); + + @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { if (!isRealUpdate(uidl)) { return; @@ -62,6 +69,8 @@ public class TreeConnector extends AbstractComponentConnector implements getWidget().body.clear(); // clear out any references to nodes that no longer are attached getWidget().clearNodeToKeyMap(); + tooltipMap.clear(); + TreeNode childTree = null; UIDL childUidl = null; for (final Iterator<?> i = uidl.getChildIterator(); i.hasNext();) { @@ -74,6 +83,7 @@ public class TreeConnector extends AbstractComponentConnector implements continue; } childTree = getWidget().new TreeNode(); + getConnection().getVTooltip().connectHandlersToWidget(childTree); updateNodeFromUIDL(childTree, childUidl); getWidget().body.add(childTree); childTree.addStyleDependentName("root"); @@ -193,13 +203,8 @@ public class TreeConnector extends AbstractComponentConnector implements } String description = uidl.getStringAttribute("descr"); - if (description != null && getConnection() != null) { - // Set tooltip - TooltipInfo info = new TooltipInfo(description); - getConnection().registerTooltip(this, nodeKey, info); - } else { - // Remove possible previous tooltip - getConnection().registerTooltip(this, nodeKey, null); + if (description != null) { + tooltipMap.put(treeNode, new TooltipInfo(description)); } if (uidl.getBooleanAttribute("expanded") && !treeNode.getState()) { @@ -228,6 +233,7 @@ public class TreeConnector extends AbstractComponentConnector implements continue; } final TreeNode childTree = getWidget().new TreeNode(); + getConnection().getVTooltip().connectHandlersToWidget(childTree); updateNodeFromUIDL(childTree, childUidl); containerNode.childNodeContainer.add(childTree); if (!i.hasNext()) { @@ -250,4 +256,32 @@ public class TreeConnector extends AbstractComponentConnector implements return (AbstractFieldState) super.getState(); } + @Override + public TooltipInfo getTooltipInfo(Element element) { + + TooltipInfo info = null; + + // Try to find a tooltip for a node + if (element != getWidget().getElement()) { + Object node = Util.findWidget( + (com.google.gwt.user.client.Element) element, + TreeNode.class); + + if (node != null) { + TreeNode tnode = (TreeNode) node; + if (tnode.isCaptionElement(element)) { + info = tooltipMap.get(tnode); + } + } + } + + // If no tooltip found for the node or if the target was not a node, use + // the default tooltip + if (info == null) { + info = super.getTooltipInfo(element); + } + + return info; + } + } diff --git a/src/com/vaadin/terminal/gwt/client/ui/tree/VTree.java b/src/com/vaadin/terminal/gwt/client/ui/tree/VTree.java index 6f19cba957..f5fe6bce1a 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/tree/VTree.java +++ b/src/com/vaadin/terminal/gwt/client/ui/tree/VTree.java @@ -37,15 +37,15 @@ import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.UIObject; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.dd.VerticalDropLocation; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.BrowserInfo; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ConnectorMap; -import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.MouseEventDetailsBuilder; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.Util; -import com.vaadin.terminal.gwt.client.VTooltip; import com.vaadin.terminal.gwt.client.ui.Action; import com.vaadin.terminal.gwt.client.ui.ActionOwner; import com.vaadin.terminal.gwt.client.ui.FocusElementPanel; @@ -61,7 +61,6 @@ import com.vaadin.terminal.gwt.client.ui.dd.VDragEvent; import com.vaadin.terminal.gwt.client.ui.dd.VDropHandler; import com.vaadin.terminal.gwt.client.ui.dd.VHasDropHandler; import com.vaadin.terminal.gwt.client.ui.dd.VTransferable; -import com.vaadin.terminal.gwt.client.ui.dd.VerticalDropLocation; /** * @@ -127,6 +126,7 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, public VLazyExecutor iconLoaded = new VLazyExecutor(50, new ScheduledCommand() { + @Override public void execute() { Util.notifyParentOfSizeChange(VTree.this, true); } @@ -146,6 +146,7 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, */ sinkEvents(Event.ONCONTEXTMENU); addDomHandler(new ContextMenuHandler() { + @Override public void onContextMenu(ContextMenuEvent event) { handleBodyContextMenu(event); } @@ -334,6 +335,7 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, } if (newKey != null) { validate(new VAcceptCallback() { + @Override public void accepted(VDragEvent event) { VerticalDropLocation curDetail = (VerticalDropLocation) event .getDropDetails().get("detail"); @@ -377,6 +379,7 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, return ConnectorMap.get(client).getConnector(VTree.this); } + @Override public ApplicationConnection getApplicationConnection() { return client; } @@ -420,6 +423,7 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, */ private void sendSelectionToServer() { Command command = new Command() { + @Override public void execute() { client.updateVariable(paintableId, "selected", selectedIds.toArray(new String[selectedIds.size()]), @@ -587,6 +591,7 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, } ScheduledCommand command = new ScheduledCommand() { + @Override public void execute() { if (multiSelectMode == MULTISELECT_MODE_SIMPLE @@ -656,12 +661,7 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, return; } - if (target == nodeCaptionSpan) { - client.handleTooltipEvent(event, VTree.this, key); - } - - final boolean inCaption = target == nodeCaptionSpan - || (icon != null && target == icon.getElement()); + final boolean inCaption = isCaptionElement(target); if (inCaption && client .hasEventListeners(VTree.this, ITEM_CLICK_EVENT_ID) @@ -751,6 +751,18 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, } } + /** + * Checks if the given element is the caption or the icon. + * + * @param target + * The element to check + * @return true if the element is the caption or the icon + */ + public boolean isCaptionElement(com.google.gwt.dom.client.Element target) { + return (target == nodeCaptionSpan || (icon != null && target == icon + .getElement())); + } + private void fireClick(final Event evt) { /* * Ensure we have focus in tree before sending variables. Otherwise @@ -770,6 +782,7 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, final MouseEventDetails details = MouseEventDetailsBuilder .buildMouseEventDetails(evt); ScheduledCommand command = new ScheduledCommand() { + @Override public void execute() { // Determine if we should send the event immediately to the // server. We do not want to send the event if there is a @@ -825,7 +838,6 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, + "-caption"); Element wrapper = DOM.createDiv(); nodeCaptionSpan = DOM.createSpan(); - DOM.sinkEvents(nodeCaptionSpan, VTooltip.TOOLTIP_EVENTS); DOM.appendChild(getElement(), nodeCaptionDiv); DOM.appendChild(nodeCaptionDiv, wrapper); DOM.appendChild(wrapper, nodeCaptionSpan); @@ -914,6 +926,7 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, return nodes; } + @Override public Action[] getActions() { if (actionKeys == null) { return new Action[] {}; @@ -930,10 +943,12 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, return actions; } + @Override public ApplicationConnection getClient() { return client; } + @Override public String getPaintableId() { return paintableId; } @@ -1071,6 +1086,7 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, } + @Override public VDropHandler getDropHandler() { return dropHandler; } @@ -1480,6 +1496,7 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, node.scrollIntoView(); } else { Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { focusedNode.scrollIntoView(); } @@ -1505,6 +1522,7 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, * com.google.gwt.event.dom.client.FocusHandler#onFocus(com.google.gwt.event * .dom.client.FocusEvent) */ + @Override public void onFocus(FocusEvent event) { treeHasFocus = true; // If no node has focus, focus the first item in the tree @@ -1524,6 +1542,7 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, * com.google.gwt.event.dom.client.BlurHandler#onBlur(com.google.gwt.event * .dom.client.BlurEvent) */ + @Override public void onBlur(BlurEvent event) { treeHasFocus = false; if (focusedNode != null) { @@ -1538,6 +1557,7 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, * com.google.gwt.event.dom.client.KeyPressHandler#onKeyPress(com.google * .gwt.event.dom.client.KeyPressEvent) */ + @Override public void onKeyPress(KeyPressEvent event) { NativeEvent nativeEvent = event.getNativeEvent(); int keyCode = nativeEvent.getKeyCode(); @@ -1561,6 +1581,7 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, * com.google.gwt.event.dom.client.KeyDownHandler#onKeyDown(com.google.gwt * .event.dom.client.KeyDownEvent) */ + @Override public void onKeyDown(KeyDownEvent event) { if (handleKeyNavigation(event.getNativeEvent().getKeyCode(), event.isControlKeyDown() || event.isMetaKeyDown(), @@ -1941,6 +1962,7 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, * com.vaadin.terminal.gwt.client.ui.SubPartAware#getSubPartElement(java * .lang.String) */ + @Override public Element getSubPartElement(String subPart) { if ("fe".equals(subPart)) { if (BrowserInfo.get().isOpera() && focusedNode != null) { @@ -1994,6 +2016,7 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, * com.vaadin.terminal.gwt.client.ui.SubPartAware#getSubPartName(com.google * .gwt.user.client.Element) */ + @Override public String getSubPartName(Element subElement) { // Supported identifiers: // @@ -2044,6 +2067,7 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, return locator; } + @Override public Action[] getActions() { if (bodyActionKeys == null) { return new Action[] {}; @@ -2059,10 +2083,12 @@ public class VTree extends FocusElementPanel implements VHasDropHandler, return actions; } + @Override public ApplicationConnection getClient() { return client; } + @Override public String getPaintableId() { return paintableId; } 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 59910c1b3e..06e916fbc9 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/treetable/TreeTableConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/treetable/TreeTableConnector.java @@ -3,9 +3,9 @@ */ package com.vaadin.terminal.gwt.client.ui.treetable; +import com.vaadin.shared.ui.Connect; 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.FocusableScrollPanel; import com.vaadin.terminal.gwt.client.ui.table.TableConnector; import com.vaadin.terminal.gwt.client.ui.table.VScrollTable.VScrollTableBody.VScrollTableRow; 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 9a8e0e9ce1..c03dff9507 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/treetable/VTreeTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/treetable/VTreeTable.java @@ -97,7 +97,7 @@ public class VTreeTable extends VScrollTable { } class VTreeTableScrollBody extends VScrollTable.VScrollTableBody { - private int identWidth = -1; + private int indentWidth = -1; VTreeTableScrollBody() { super(); @@ -165,7 +165,7 @@ public class VTreeTable extends VScrollTable { container.insertFirst(treeSpacer); depth = rowUidl.hasAttribute("depth") ? rowUidl .getIntAttribute("depth") : 0; - setIdent(); + setIndent(); isTreeCellAdded = true; return true; } @@ -202,18 +202,19 @@ public class VTreeTable extends VScrollTable { } - private void setIdent() { - if (getIdentWidth() > 0 && depth != 0) { - treeSpacer.getStyle().setWidth( - (depth + 1) * getIdentWidth(), Unit.PX); + private void setIndent() { + if (getIndentWidth() > 0) { + treeSpacer.getParentElement().getStyle() + .setPaddingLeft(getIndent(), Unit.PX); + treeSpacer.getStyle().setWidth(getIndent(), Unit.PX); } } @Override protected void onAttach() { super.onAttach(); - if (getIdentWidth() < 0) { - detectIdent(this); + if (getIndentWidth() < 0) { + detectIndent(this); } } @@ -227,6 +228,19 @@ public class VTreeTable extends VScrollTable { return consumedSpace; } + @Override + protected void setCellWidth(int cellIx, int width) { + if (cellIx == colIndexOfHierarchy + (showRowHeaders ? 1 : 0)) { + // take indentation padding into account if this is the + // hierarchy column + width = Math.max(width - getIndent(), 0); + } + super.setCellWidth(cellIx, width); + } + + private int getIndent() { + return (depth + 1) * getIndentWidth(); + } } protected class VTreeTableGeneratedRow extends VTreeTableRow { @@ -257,6 +271,7 @@ public class VTreeTable extends VScrollTable { // widths. Scheduler.get().scheduleDeferred(new ScheduledCommand() { + @Override public void execute() { if (showRowHeaders) { setCellWidth(0, tHead.getHeaderCell(0).getWidth()); @@ -353,20 +368,20 @@ public class VTreeTable extends VScrollTable { } } - private int getIdentWidth() { - return identWidth; + private int getIndentWidth() { + return indentWidth; } - private void detectIdent(VTreeTableRow vTreeTableRow) { - identWidth = vTreeTableRow.treeSpacer.getOffsetWidth(); - if (identWidth == 0) { - identWidth = -1; + private void detectIndent(VTreeTableRow vTreeTableRow) { + indentWidth = vTreeTableRow.treeSpacer.getOffsetWidth(); + if (indentWidth == 0) { + indentWidth = -1; return; } Iterator<Widget> iterator = iterator(); while (iterator.hasNext()) { VTreeTableRow next = (VTreeTableRow) iterator.next(); - next.setIdent(); + next.setIndent(); } } 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 a77319920c..2ce6bf2129 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/twincolselect/TwinColSelectConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/twincolselect/TwinColSelectConnector.java @@ -4,10 +4,10 @@ package com.vaadin.terminal.gwt.client.ui.twincolselect; +import com.vaadin.shared.ui.Connect; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.DirectionalManagedLayout; import com.vaadin.terminal.gwt.client.UIDL; -import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.optiongroup.OptionGroupBaseConnector; import com.vaadin.ui.TwinColSelect; @@ -29,6 +29,7 @@ public class TwinColSelectConnector extends OptionGroupBaseConnector implements @Override protected void init() { + super.init(); getLayoutManager().registerDependency(this, getWidget().captionWrapper.getElement()); } @@ -44,6 +45,7 @@ public class TwinColSelectConnector extends OptionGroupBaseConnector implements return (VTwinColSelect) super.getWidget(); } + @Override public void layoutVertically() { if (isUndefinedHeight()) { getWidget().clearInternalHeights(); @@ -52,6 +54,7 @@ public class TwinColSelectConnector extends OptionGroupBaseConnector implements } } + @Override public void layoutHorizontally() { if (isUndefinedWidth()) { getWidget().clearInternalWidths(); diff --git a/src/com/vaadin/terminal/gwt/client/ui/twincolselect/VTwinColSelect.java b/src/com/vaadin/terminal/gwt/client/ui/twincolselect/VTwinColSelect.java index 8f1ea09b8f..1a2deae3b4 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/twincolselect/VTwinColSelect.java +++ b/src/com/vaadin/terminal/gwt/client/ui/twincolselect/VTwinColSelect.java @@ -409,6 +409,7 @@ public class VTwinColSelect extends VOptionGroupBase implements KeyDownHandler, remove.setTabIndex(tabIndex); } + @Override public void focus() { options.setFocus(true); } @@ -430,6 +431,7 @@ public class VTwinColSelect extends VOptionGroupBase implements KeyDownHandler, * com.google.gwt.event.dom.client.KeyDownHandler#onKeyDown(com.google.gwt * .event.dom.client.KeyDownEvent) */ + @Override public void onKeyDown(KeyDownEvent event) { int keycode = event.getNativeKeyCode(); @@ -493,6 +495,7 @@ public class VTwinColSelect extends VOptionGroupBase implements KeyDownHandler, * com.google.gwt.event.dom.client.MouseDownHandler#onMouseDown(com.google * .gwt.event.dom.client.MouseDownEvent) */ + @Override public void onMouseDown(MouseDownEvent event) { // Ensure that items are deselected when selecting // from a different source. See #3699 for details. @@ -515,6 +518,7 @@ public class VTwinColSelect extends VOptionGroupBase implements KeyDownHandler, * com.google.gwt.event.dom.client.DoubleClickHandler#onDoubleClick(com. * google.gwt.event.dom.client.DoubleClickEvent) */ + @Override public void onDoubleClick(DoubleClickEvent event) { if (event.getSource() == options) { addItem(); @@ -539,6 +543,7 @@ public class VTwinColSelect extends VOptionGroupBase implements KeyDownHandler, private static final String SUBPART_ADD_BUTTON = "add"; private static final String SUBPART_REMOVE_BUTTON = "remove"; + @Override public Element getSubPartElement(String subPart) { if (SUBPART_OPTION_SELECT.equals(subPart)) { return options.getElement(); @@ -568,6 +573,7 @@ public class VTwinColSelect extends VOptionGroupBase implements KeyDownHandler, return null; } + @Override public String getSubPartName(Element subElement) { if (optionsCaption != null && optionsCaption.getElement().isOrHasChild(subElement)) { 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 153d99229b..af31491060 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/upload/UploadConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/upload/UploadConnector.java @@ -4,18 +4,19 @@ package com.vaadin.terminal.gwt.client.ui.upload; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.Connect.LoadStyle; 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.ui.AbstractComponentConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; -import com.vaadin.terminal.gwt.client.ui.Connect.LoadStyle; import com.vaadin.ui.Upload; @Connect(value = Upload.class, loadStyle = LoadStyle.LAZY) public class UploadConnector extends AbstractComponentConnector implements Paintable { + @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { if (!isRealUpdate(uidl)) { return; diff --git a/src/com/vaadin/terminal/gwt/client/ui/upload/VUpload.java b/src/com/vaadin/terminal/gwt/client/ui/upload/VUpload.java index 4fe53fb89c..5cf2f2fe25 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/upload/VUpload.java +++ b/src/com/vaadin/terminal/gwt/client/ui/upload/VUpload.java @@ -24,7 +24,6 @@ import com.google.gwt.user.client.ui.SimplePanel; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.BrowserInfo; import com.vaadin.terminal.gwt.client.VConsole; -import com.vaadin.terminal.gwt.client.VTooltip; import com.vaadin.terminal.gwt.client.ui.button.VButton; /** @@ -116,6 +115,7 @@ public class VUpload extends SimplePanel { panel.add(fu); submitButton = new VButton(); submitButton.addClickHandler(new ClickHandler() { + @Override public void onClick(ClickEvent event) { if (immediate) { // fire click on upload (eg. focused button and hit space) @@ -128,16 +128,6 @@ public class VUpload extends SimplePanel { panel.add(submitButton); setStyleName(CLASSNAME); - - sinkEvents(VTooltip.TOOLTIP_EVENTS); - } - - @Override - public void onBrowserEvent(Event event) { - if ((event.getTypeInt() & VTooltip.TOOLTIP_EVENTS) > 0) { - client.handleTooltipEvent(event, this); - } - super.onBrowserEvent(event); } private static native void setEncoding(Element form, String encoding) @@ -214,6 +204,7 @@ public class VUpload extends SimplePanel { private void onSubmitComplete() { /* Needs to be run dereferred to avoid various browser issues. */ Scheduler.get().scheduleDeferred(new Command() { + @Override public void execute() { if (submitted) { if (client != null) { 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 ddf8df66ff..d0c126832a 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/video/VideoConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/video/VideoConnector.java @@ -3,9 +3,10 @@ */ package com.vaadin.terminal.gwt.client.ui.video; +import com.vaadin.shared.communication.URLReference; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.video.VideoState; 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; diff --git a/src/com/vaadin/terminal/gwt/client/ui/window/VWindow.java b/src/com/vaadin/terminal/gwt/client/ui/window/VWindow.java index 8fd84a9ea6..8ac0d0662b 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/window/VWindow.java +++ b/src/com/vaadin/terminal/gwt/client/ui/window/VWindow.java @@ -26,12 +26,12 @@ import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.HasWidgets; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.EventId; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.BrowserInfo; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ConnectorMap; import com.vaadin.terminal.gwt.client.Console; -import com.vaadin.terminal.gwt.client.EventId; import com.vaadin.terminal.gwt.client.Focusable; import com.vaadin.terminal.gwt.client.LayoutManager; import com.vaadin.terminal.gwt.client.Util; @@ -146,6 +146,7 @@ public class VWindow extends VOverlay implements ShortcutActionHandlerOwner, private VLazyExecutor delayedContentsSizeUpdater = new VLazyExecutor(200, new ScheduledCommand() { + @Override public void execute() { updateContentsSize(); } @@ -266,6 +267,7 @@ public class VWindow extends VOverlay implements ShortcutActionHandlerOwner, orderingDefered = true; Scheduler.get().scheduleFinally(new Command() { + @Override public void execute() { doServerSideOrdering(); VNotification.bringNotificationsToFront(); @@ -279,6 +281,7 @@ public class VWindow extends VOverlay implements ShortcutActionHandlerOwner, VWindow[] array = windowOrder.toArray(new VWindow[windowOrder.size()]); Arrays.sort(array, new Comparator<VWindow>() { + @Override public int compare(VWindow o1, VWindow o2) { /* * Order by modality, then by bringtofront sequence. @@ -552,11 +555,6 @@ public class VWindow extends VOverlay implements ShortcutActionHandlerOwner, final Element target = DOM.eventGetTarget(event); - if (client != null && header.isOrHasChild(target)) { - // Handle window caption tooltips - client.handleTooltipEvent(event, this); - } - if (resizing || resizeBox == target) { onResizeEvent(event); bubble = false; @@ -856,10 +854,12 @@ public class VWindow extends VOverlay implements ShortcutActionHandlerOwner, true); } + @Override public ShortcutActionHandler getShortcutActionHandler() { return shortcutHandler; } + @Override public void onScroll(ScrollEvent event) { client.updateVariable(id, "scrollTop", contentPanel.getScrollPosition(), false); @@ -868,6 +868,7 @@ public class VWindow extends VOverlay implements ShortcutActionHandlerOwner, } + @Override public void onKeyDown(KeyDownEvent event) { if (shortcutHandler != null) { shortcutHandler @@ -876,18 +877,21 @@ public class VWindow extends VOverlay implements ShortcutActionHandlerOwner, } } + @Override public void onBlur(BlurEvent event) { if (client.hasEventListeners(this, EventId.BLUR)) { client.updateVariable(id, EventId.BLUR, "", true); } } + @Override public void onFocus(FocusEvent event) { if (client.hasEventListeners(this, EventId.FOCUS)) { client.updateVariable(id, EventId.FOCUS, "", true); } } + @Override public void focus() { contentPanel.focus(); } 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 83de039f0b..bae4f804fc 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/window/WindowConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/window/WindowConnector.java @@ -12,18 +12,20 @@ import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.window.WindowServerRpc; +import com.vaadin.shared.ui.window.WindowState; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.BrowserInfo; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ConnectorHierarchyChangeEvent; import com.vaadin.terminal.gwt.client.LayoutManager; -import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.Paintable; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.communication.RpcProxy; import com.vaadin.terminal.gwt.client.ui.AbstractComponentContainerConnector; import com.vaadin.terminal.gwt.client.ui.ClickEventHandler; -import com.vaadin.terminal.gwt.client.ui.Connect; import com.vaadin.terminal.gwt.client.ui.PostLayoutListener; import com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler; import com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler.BeforeShortcutActionListener; @@ -72,6 +74,7 @@ public class WindowConnector extends AbstractComponentContainerConnector lm.unregisterDependency(this, window.footer); } + @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { getWidget().id = getConnectorId(); getWidget().client = client; @@ -180,10 +183,12 @@ public class WindowConnector extends AbstractComponentContainerConnector } } + @Override public void updateCaption(ComponentConnector component) { // NOP, window has own caption, layout caption not rendered } + @Override public void onBeforeShortcutAction(Event e) { // NOP, nothing to update just avoid workaround ( causes excess // blur/focus ) @@ -210,6 +215,7 @@ public class WindowConnector extends AbstractComponentContainerConnector getWidget().contentPanel.setWidget(newChildWidget); } + @Override public void layout() { LayoutManager lm = getLayoutManager(); VWindow window = getWidget(); @@ -274,13 +280,14 @@ public class WindowConnector extends AbstractComponentContainerConnector } } + @Override public void postLayout() { minWidthChecked = false; VWindow window = getWidget(); if (window.centered) { window.center(); } - window.updateShadowSizeAndPosition(); + window.sizeOrPositionUpdated(); } @Override diff --git a/src/com/vaadin/terminal/gwt/client/ui/window/WindowServerRpc.java b/src/com/vaadin/terminal/gwt/client/ui/window/WindowServerRpc.java deleted file mode 100644 index 4723c55786..0000000000 --- a/src/com/vaadin/terminal/gwt/client/ui/window/WindowServerRpc.java +++ /dev/null @@ -1,10 +0,0 @@ -/* -@VaadinApache2LicenseForJavaFiles@ - */ -package com.vaadin.terminal.gwt.client.ui.window; - -import com.vaadin.terminal.gwt.client.communication.ServerRpc; -import com.vaadin.terminal.gwt.client.ui.ClickRpc; - -public interface WindowServerRpc extends ClickRpc, ServerRpc { -}
\ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java b/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java index c2f887674a..363f7e4869 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java @@ -25,7 +25,6 @@ import javax.portlet.ActionResponse; import javax.portlet.EventRequest; import javax.portlet.EventResponse; import javax.portlet.GenericPortlet; -import javax.portlet.MimeResponse; import javax.portlet.PortletConfig; import javax.portlet.PortletContext; import javax.portlet.PortletException; @@ -64,6 +63,8 @@ import com.vaadin.ui.Root; public abstract class AbstractApplicationPortlet extends GenericPortlet implements Constants { + public static final String RESOURCE_URL_ID = "APP"; + public static class WrappedHttpAndPortletRequest extends WrappedPortletRequest { @@ -175,15 +176,12 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet this.portlet = portlet; } + @Override public void criticalNotification(WrappedRequest request, WrappedResponse response, String cap, String msg, String details, String outOfSyncURL) throws IOException { - PortletRequest portletRequest = WrappedPortletRequest.cast(request) - .getPortletRequest(); - PortletResponse portletResponse = ((WrappedPortletResponse) response) - .getPortletResponse(); - portlet.criticalNotification(portletRequest, - (MimeResponse) portletResponse, cap, msg, details, + portlet.criticalNotification(WrappedPortletRequest.cast(request), + (WrappedPortletResponse) response, cap, msg, details, outOfSyncURL); } } @@ -207,19 +205,19 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet // TODO Can we close the application when the portlet is removed? Do we know // when the portlet is removed? - private Properties applicationProperties; - private boolean productionMode = false; - private DeploymentConfiguration deploymentConfiguration = new DeploymentConfiguration() { - + private DeploymentConfiguration deploymentConfiguration = new AbstractDeploymentConfiguration( + getClass()) { + @Override public String getConfiguredWidgetset(WrappedRequest request) { String widgetset = getApplicationOrSystemProperty( PARAMETER_WIDGETSET, null); if (widgetset == null) { - // If no widgetset defined for the application, check the portal + // If no widgetset defined for the application, check the + // portal // property widgetset = WrappedPortletRequest.cast(request) .getPortalProperty(PORTAL_PARAMETER_VAADIN_WIDGETSET); @@ -233,6 +231,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet return widgetset; } + @Override public String getConfiguredTheme(WrappedRequest request) { // is the default theme defined by the portal? @@ -247,12 +246,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet return themeName; } - public String getApplicationOrSystemProperty(String propertyName, - String defaultValue) { - return AbstractApplicationPortlet.this - .getApplicationOrSystemProperty(propertyName, defaultValue); - } - + @Override public boolean isStandalone(WrappedRequest request) { return false; } @@ -272,6 +266,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet * be a VAADIN directory). Does not end with a slash (/). */ + @Override public String getStaticFileLocation(WrappedRequest request) { String staticFileLocation = WrappedPortletRequest.cast(request) .getPortalProperty( @@ -289,17 +284,17 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet } } - public ClassLoader getClassLoader() { - // Custom class loaders not currently supported in portlets (see - // #8574) - return null; + @Override + public String getMimeType(String resourceName) { + return getPortletContext().getMimeType(resourceName); } }; @Override public void init(PortletConfig config) throws PortletException { super.init(config); - applicationProperties = new Properties(); + Properties applicationProperties = getDeploymentConfiguration() + .getInitParameters(); // Read default parameters from the context final PortletContext context = config.getPortletContext(); @@ -323,7 +318,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet } private void checkCrossSiteProtection() { - if (getApplicationOrSystemProperty( + if (getDeploymentConfiguration().getApplicationOrSystemProperty( SERVLET_PARAMETER_DISABLE_XSRF_PROTECTION, "false").equals( "true")) { /* @@ -338,8 +333,8 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet // TODO Identical code in AbstractApplicationServlet -> refactor // Check if the application is in production mode. // We are in production mode if productionMode=true - if (getApplicationOrSystemProperty(SERVLET_PARAMETER_PRODUCTION_MODE, - "false").equals("true")) { + if (getDeploymentConfiguration().getApplicationOrSystemProperty( + SERVLET_PARAMETER_PRODUCTION_MODE, "false").equals("true")) { productionMode = true; } @@ -350,101 +345,27 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet } } - /** - * Gets an application property value. - * - * @param parameterName - * the Name or the parameter. - * @return String value or null if not found - */ - protected String getApplicationProperty(String parameterName) { - - String val = applicationProperties.getProperty(parameterName); - if (val != null) { - return val; - } - - // Try lower case application properties for backward compatibility with - // 3.0.2 and earlier - val = applicationProperties.getProperty(parameterName.toLowerCase()); - - return val; - } - - /** - * Gets an system property value. - * - * @param parameterName - * the Name or the parameter. - * @return String value or null if not found - */ - protected String getSystemProperty(String parameterName) { - String val = null; - - String pkgName; - final Package pkg = getClass().getPackage(); - if (pkg != null) { - pkgName = pkg.getName(); - } else { - final String className = getClass().getName(); - pkgName = new String(className.toCharArray(), 0, - className.lastIndexOf('.')); - } - val = System.getProperty(pkgName + "." + parameterName); - if (val != null) { - return val; - } - - // Try lowercased system properties - val = System.getProperty(pkgName + "." + parameterName.toLowerCase()); - return val; - } - - /** - * Gets an application or system property value. - * - * @param parameterName - * the Name or the parameter. - * @param defaultValue - * the Default to be used. - * @return String value or default if not found - */ - protected String getApplicationOrSystemProperty(String parameterName, - String defaultValue) { - - String val = null; - - // Try application properties - val = getApplicationProperty(parameterName); - if (val != null) { - return val; - } - - // Try system properties - val = getSystemProperty(parameterName); - if (val != null) { - return val; - } - - return defaultValue; - } - protected enum RequestType { - FILE_UPLOAD, UIDL, RENDER, STATIC_FILE, APPLICATION_RESOURCE, DUMMY, EVENT, ACTION, UNKNOWN, BROWSER_DETAILS; + FILE_UPLOAD, UIDL, RENDER, STATIC_FILE, APPLICATION_RESOURCE, DUMMY, EVENT, ACTION, UNKNOWN, BROWSER_DETAILS, CONNECTOR_RESOURCE; } - protected RequestType getRequestType(PortletRequest request) { + protected RequestType getRequestType(WrappedPortletRequest wrappedRequest) { + PortletRequest request = wrappedRequest.getPortletRequest(); if (request instanceof RenderRequest) { return RequestType.RENDER; } else if (request instanceof ResourceRequest) { ResourceRequest resourceRequest = (ResourceRequest) request; - if (isUIDLRequest(resourceRequest)) { + if (ServletPortletHelper.isUIDLRequest(wrappedRequest)) { return RequestType.UIDL; - } else if (isBrowserDetailsRequeset(resourceRequest)) { + } else if (isBrowserDetailsRequest(resourceRequest)) { return RequestType.BROWSER_DETAILS; - } else if (isFileUploadRequest(resourceRequest)) { + } else if (ServletPortletHelper.isFileUploadRequest(wrappedRequest)) { return RequestType.FILE_UPLOAD; - } else if (isApplicationResourceRequest(resourceRequest)) { + } else if (ServletPortletHelper + .isConnectorResourceRequest(wrappedRequest)) { + return RequestType.CONNECTOR_RESOURCE; + } else if (ServletPortletHelper + .isApplicationResourceRequest(wrappedRequest)) { return RequestType.APPLICATION_RESOURCE; } else if (isDummyRequest(resourceRequest)) { return RequestType.DUMMY; @@ -459,30 +380,16 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet return RequestType.UNKNOWN; } - private boolean isBrowserDetailsRequeset(ResourceRequest request) { + private boolean isBrowserDetailsRequest(ResourceRequest request) { return request.getResourceID() != null && request.getResourceID().equals("browserDetails"); } - private boolean isApplicationResourceRequest(ResourceRequest request) { - return request.getResourceID() != null - && request.getResourceID().startsWith("APP"); - } - - private boolean isUIDLRequest(ResourceRequest request) { - return request.getResourceID() != null - && request.getResourceID().equals("UIDL"); - } - private boolean isDummyRequest(ResourceRequest request) { return request.getResourceID() != null && request.getResourceID().equals("DUMMY"); } - private boolean isFileUploadRequest(ResourceRequest request) { - return "UPLOAD".equals(request.getResourceID()); - } - /** * Returns true if the servlet is running in production mode. Production * mode disables all debug facilities. @@ -506,7 +413,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet WrappedPortletResponse wrappedResponse = new WrappedPortletResponse( response, getDeploymentConfiguration()); - RequestType requestType = getRequestType(request); + RequestType requestType = getRequestType(wrappedRequest); if (requestType == RequestType.UNKNOWN) { handleUnknownRequest(request, response); @@ -554,6 +461,12 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet PortletCommunicationManager applicationManager = applicationContext .getApplicationManager(application); + if (requestType == RequestType.CONNECTOR_RESOURCE) { + applicationManager.serveConnectorResource(wrappedRequest, + wrappedResponse); + return; + } + /* Update browser information from request */ applicationContext.getBrowser().updateRequestDetails( wrappedRequest); @@ -638,8 +551,10 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet /* Handle the request */ if (requestType == RequestType.FILE_UPLOAD) { - applicationManager.handleFileUpload(root, wrappedRequest, - wrappedResponse); + // Root is resolved in handleFileUpload by + // PortletCommunicationManager + applicationManager.handleFileUpload(application, + wrappedRequest, wrappedResponse); return; } else if (requestType == RequestType.BROWSER_DETAILS) { applicationManager.handleBrowserDetailsRequest( @@ -673,7 +588,8 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet getLogger() .fine("General security exception, the security key was probably incorrect."); } catch (final Throwable e) { - handleServiceException(request, response, application, e); + handleServiceException(wrappedRequest, wrappedResponse, + application, e); } finally { // Notifies transaction end try { @@ -727,7 +643,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet } - private DeploymentConfiguration getDeploymentConfiguration() { + protected DeploymentConfiguration getDeploymentConfiguration() { return deploymentConfiguration; } @@ -871,7 +787,8 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet application.setLocale(locale); // No application URL when running inside a portlet application.start(new ApplicationStartEvent(null, - applicationProperties, context, isProductionMode())); + getDeploymentConfiguration().getInitParameters(), + context, isProductionMode())); } } @@ -995,11 +912,6 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet } } - protected ClassLoader getClassLoader() throws PortletException { - // TODO Add support for custom class loader - return getClass().getClassLoader(); - } - /** * Get system messages from the current application class * @@ -1031,16 +943,16 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet return Application.getSystemMessages(); } - private void handleServiceException(PortletRequest request, - PortletResponse response, Application application, Throwable e) - throws IOException, PortletException { + private void handleServiceException(WrappedPortletRequest request, + WrappedPortletResponse response, Application application, + Throwable e) throws IOException, PortletException { // TODO Check that this error handler is working when running inside a // portlet // if this was an UIDL request, response UIDL back to client if (getRequestType(request) == RequestType.UIDL) { Application.SystemMessages ci = getSystemMessages(); - criticalNotification(request, (ResourceResponse) response, + criticalNotification(request, response, ci.getInternalErrorCaption(), ci.getInternalErrorMessage(), null, ci.getInternalErrorURL()); if (application != null) { @@ -1065,6 +977,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet this.throwable = throwable; } + @Override public Throwable getThrowable() { return throwable; } @@ -1093,9 +1006,9 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet * @throws IOException * if the writing failed due to input/output error. */ - void criticalNotification(PortletRequest request, MimeResponse response, - String caption, String message, String details, String url) - throws IOException { + void criticalNotification(WrappedPortletRequest request, + WrappedPortletResponse response, String caption, String message, + String details, String url) throws IOException { // clients JS app is still running, but server application either // no longer exists or it might fail to perform reasonably. @@ -1121,7 +1034,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet // Set the response type response.setContentType("application/json; charset=UTF-8"); - final OutputStream out = response.getPortletOutputStream(); + final OutputStream out = response.getOutputStream(); final PrintWriter outWriter = new PrintWriter(new BufferedWriter( new OutputStreamWriter(out, "UTF-8"))); outWriter.print("for(;;);[{\"changes\":[], \"meta\" : {" diff --git a/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java b/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java index f7e46a7ca9..a0e807801e 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java @@ -10,7 +10,6 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.Serializable; -import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.MalformedURLException; @@ -74,6 +73,7 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements this.servlet = servlet; } + @Override public void criticalNotification(WrappedRequest request, WrappedResponse response, String cap, String msg, String details, String outOfSyncURL) throws IOException { @@ -87,16 +87,16 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements // TODO Move some (all?) of the constants to a separate interface (shared // with portlet) - private Properties applicationProperties; - private boolean productionMode = false; private final String resourcePath = null; private int resourceCacheTime = 3600; - private DeploymentConfiguration deploymentConfiguration = new DeploymentConfiguration() { + private DeploymentConfiguration deploymentConfiguration = new AbstractDeploymentConfiguration( + getClass()) { + @Override public String getStaticFileLocation(WrappedRequest request) { HttpServletRequest servletRequest = WrappedHttpServletRequest .cast(request); @@ -104,38 +104,30 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements .getStaticFilesLocation(servletRequest); } + @Override public String getConfiguredWidgetset(WrappedRequest request) { return getApplicationOrSystemProperty( AbstractApplicationServlet.PARAMETER_WIDGETSET, AbstractApplicationServlet.DEFAULT_WIDGETSET); } + @Override public String getConfiguredTheme(WrappedRequest request) { // Use the default return AbstractApplicationServlet.getDefaultTheme(); } - public String getApplicationOrSystemProperty(String propertyName, - String defaultValue) { - return AbstractApplicationServlet.this - .getApplicationOrSystemProperty(propertyName, defaultValue); - } - + @Override public boolean isStandalone(WrappedRequest request) { return true; } - public ClassLoader getClassLoader() { - try { - return AbstractApplicationServlet.this.getClassLoader(); - } catch (ServletException e) { - throw new RuntimeException(e); - } + @Override + public String getMimeType(String resourceName) { + return getServletContext().getMimeType(resourceName); } }; - static final String UPLOAD_URL_PREFIX = "APP/UPLOAD/"; - /** * Called by the servlet container to indicate to a servlet that the servlet * is being placed into service. @@ -148,11 +140,11 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements * servlet's normal operation. */ @Override - @SuppressWarnings("unchecked") public void init(javax.servlet.ServletConfig servletConfig) throws javax.servlet.ServletException { super.init(servletConfig); - applicationProperties = new Properties(); + Properties applicationProperties = getDeploymentConfiguration() + .getInitParameters(); // Read default parameters from server.xml final ServletContext context = servletConfig.getServletContext(); @@ -177,7 +169,7 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements } private void checkCrossSiteProtection() { - if (getApplicationOrSystemProperty( + if (getDeploymentConfiguration().getApplicationOrSystemProperty( SERVLET_PARAMETER_DISABLE_XSRF_PROTECTION, "false").equals( "true")) { /* @@ -191,8 +183,8 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements private void checkProductionMode() { // Check if the application is in production mode. // We are in production mode if productionMode=true - if (getApplicationOrSystemProperty(SERVLET_PARAMETER_PRODUCTION_MODE, - "false").equals("true")) { + if (getDeploymentConfiguration().getApplicationOrSystemProperty( + SERVLET_PARAMETER_PRODUCTION_MODE, "false").equals("true")) { productionMode = true; } @@ -206,8 +198,9 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements private void checkResourceCacheTime() { // Check if the browser caching time has been set in web.xml try { - String rct = getApplicationOrSystemProperty( - SERVLET_PARAMETER_RESOURCE_CACHE_TIME, "3600"); + String rct = getDeploymentConfiguration() + .getApplicationOrSystemProperty( + SERVLET_PARAMETER_RESOURCE_CACHE_TIME, "3600"); resourceCacheTime = Integer.parseInt(rct); } catch (NumberFormatException nfe) { // Default is 1h @@ -217,85 +210,6 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements } /** - * Gets an application property value. - * - * @param parameterName - * the Name or the parameter. - * @return String value or null if not found - */ - protected String getApplicationProperty(String parameterName) { - - String val = applicationProperties.getProperty(parameterName); - if (val != null) { - return val; - } - - // Try lower case application properties for backward compatibility with - // 3.0.2 and earlier - val = applicationProperties.getProperty(parameterName.toLowerCase()); - - return val; - } - - /** - * Gets an system property value. - * - * @param parameterName - * the Name or the parameter. - * @return String value or null if not found - */ - protected String getSystemProperty(String parameterName) { - String val = null; - - String pkgName; - final Package pkg = getClass().getPackage(); - if (pkg != null) { - pkgName = pkg.getName(); - } else { - final String className = getClass().getName(); - pkgName = new String(className.toCharArray(), 0, - className.lastIndexOf('.')); - } - val = System.getProperty(pkgName + "." + parameterName); - if (val != null) { - return val; - } - - // Try lowercased system properties - val = System.getProperty(pkgName + "." + parameterName.toLowerCase()); - return val; - } - - /** - * Gets an application or system property value. - * - * @param parameterName - * the Name or the parameter. - * @param defaultValue - * the Default to be used. - * @return String value or default if not found - */ - String getApplicationOrSystemProperty(String parameterName, - String defaultValue) { - - String val = null; - - // Try application properties - val = getApplicationProperty(parameterName); - if (val != null) { - return val; - } - - // Try system properties - val = getSystemProperty(parameterName); - if (val != null) { - return val; - } - - return defaultValue; - } - - /** * Returns true if the servlet is running in production mode. Production * mode disables all debug facilities. * @@ -396,6 +310,11 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements CommunicationManager applicationManager = webApplicationContext .getApplicationManager(application, this); + if (requestType == RequestType.CONNECTOR_RESOURCE) { + applicationManager.serveConnectorResource(request, response); + return; + } + /* Update browser information from the request */ webApplicationContext.getBrowser().updateRequestDetails(request); @@ -421,11 +340,9 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements /* Handle the request */ if (requestType == RequestType.FILE_UPLOAD) { - Root root = application.getRootForRequest(request); - if (root == null) { - throw new ServletException(ERROR_NO_ROOT_FOUND); - } - applicationManager.handleFileUpload(root, request, response); + // Root is resolved in communication manager + applicationManager.handleFileUpload(application, request, + response); return; } else if (requestType == RequestType.UIDL) { Root root = application.getRootForRequest(request); @@ -536,8 +453,8 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements * @throws IOException */ private boolean ensureCookiesEnabled(RequestType requestType, - HttpServletRequest request, HttpServletResponse response) - throws IOException { + WrappedHttpServletRequest request, + WrappedHttpServletResponse response) throws IOException { if (requestType == RequestType.UIDL && !isRepaintAll(request)) { // In all other but the first UIDL request a cookie should be // returned by the browser. @@ -554,30 +471,6 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements return true; } - protected ClassLoader getClassLoader() throws ServletException { - // Gets custom class loader - final String classLoaderName = getApplicationOrSystemProperty( - "ClassLoader", null); - ClassLoader classLoader; - if (classLoaderName == null) { - classLoader = getClass().getClassLoader(); - } else { - try { - final Class<?> classLoaderClass = getClass().getClassLoader() - .loadClass(classLoaderName); - final Constructor<?> c = classLoaderClass - .getConstructor(new Class[] { ClassLoader.class }); - classLoader = (ClassLoader) c - .newInstance(new Object[] { getClass().getClassLoader() }); - } catch (final Exception e) { - throw new ServletException( - "Could not find specified class loader: " - + classLoaderName, e); - } - } - return classLoader; - } - /** * Send a notification to client's application. Used to notify client of * critical errors, session expiration and more. Server has no knowledge of @@ -602,11 +495,11 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements * @throws IOException * if the writing failed due to input/output error. */ - protected void criticalNotification(HttpServletRequest request, + protected void criticalNotification(WrappedHttpServletRequest request, HttpServletResponse response, String caption, String message, String details, String url) throws IOException { - if (isUIDLRequest(request)) { + if (ServletPortletHelper.isUIDLRequest(request)) { if (caption != null) { caption = "\"" + JsonPaintTarget.escapeJSON(caption) + "\""; @@ -828,9 +721,9 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements return newApplication; } - private void handleServiceException(HttpServletRequest request, - HttpServletResponse response, Application application, Throwable e) - throws IOException, ServletException { + private void handleServiceException(WrappedHttpServletRequest request, + WrappedHttpServletResponse response, Application application, + Throwable e) throws IOException, ServletException { // if this was an UIDL request, response UIDL back to client if (getRequestType(request) == RequestType.UIDL) { Application.SystemMessages ci = getSystemMessages(); @@ -883,8 +776,9 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements return DEFAULT_THEME_NAME; } - void handleServiceSessionExpired(HttpServletRequest request, - HttpServletResponse response) throws IOException, ServletException { + void handleServiceSessionExpired(WrappedHttpServletRequest request, + WrappedHttpServletResponse response) throws IOException, + ServletException { if (isOnUnloadRequest(request)) { /* @@ -924,8 +818,10 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements } - private void handleServiceSecurityException(HttpServletRequest request, - HttpServletResponse response) throws IOException, ServletException { + private void handleServiceSecurityException( + WrappedHttpServletRequest request, + WrappedHttpServletResponse response) throws IOException, + ServletException { if (isOnUnloadRequest(request)) { /* * Request was an unload request (e.g. window close event) and the @@ -991,8 +887,8 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements Locale locale = request.getLocale(); application.setLocale(locale); application.start(new ApplicationStartEvent(applicationUrl, - applicationProperties, webApplicationContext, - isProductionMode())); + getDeploymentConfiguration().getInitParameters(), + webApplicationContext, isProductionMode())); } } @@ -1054,7 +950,8 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements // strip leading "/" otherwise stream from JAR wont work filename = filename.substring(1); - resourceUrl = getClassLoader().getResource(filename); + resourceUrl = getDeploymentConfiguration().getClassLoader() + .getResource(filename); if (resourceUrl == null) { // cannot serve requested file @@ -1250,22 +1147,22 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements } protected enum RequestType { - FILE_UPLOAD, BROWSER_DETAILS, UIDL, OTHER, STATIC_FILE, APPLICATION_RESOURCE; + FILE_UPLOAD, BROWSER_DETAILS, UIDL, OTHER, STATIC_FILE, APPLICATION_RESOURCE, CONNECTOR_RESOURCE; } - protected RequestType getRequestType(HttpServletRequest request) { - if (isFileUploadRequest(request)) { + protected RequestType getRequestType(WrappedHttpServletRequest request) { + if (ServletPortletHelper.isFileUploadRequest(request)) { return RequestType.FILE_UPLOAD; + } else if (ServletPortletHelper.isConnectorResourceRequest(request)) { + return RequestType.CONNECTOR_RESOURCE; } else if (isBrowserDetailsRequest(request)) { return RequestType.BROWSER_DETAILS; - } else if (isUIDLRequest(request)) { + } else if (ServletPortletHelper.isUIDLRequest(request)) { return RequestType.UIDL; } else if (isStaticResourceRequest(request)) { return RequestType.STATIC_FILE; - } else if (isApplicationRequest(request)) { + } else if (ServletPortletHelper.isApplicationResourceRequest(request)) { return RequestType.APPLICATION_RESOURCE; - } else if (request.getHeader("FileId") != null) { - return RequestType.FILE_UPLOAD; } return RequestType.OTHER; @@ -1276,14 +1173,6 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements && request.getParameter("browserDetails") != null; } - private boolean isApplicationRequest(HttpServletRequest request) { - String path = getRequestPathInfo(request); - if (path != null && path.startsWith("/APP/")) { - return true; - } - return false; - } - private boolean isStaticResourceRequest(HttpServletRequest request) { String pathInfo = request.getPathInfo(); if (pathInfo == null || pathInfo.length() <= 10) { @@ -1301,37 +1190,6 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements return false; } - private boolean isUIDLRequest(HttpServletRequest request) { - String pathInfo = getRequestPathInfo(request); - - if (pathInfo == null) { - return false; - } - - String compare = AJAX_UIDL_URI; - - if (pathInfo.startsWith(compare + "/") || pathInfo.endsWith(compare)) { - return true; - } - - return false; - } - - private boolean isFileUploadRequest(HttpServletRequest request) { - String pathInfo = getRequestPathInfo(request); - - if (pathInfo == null) { - return false; - } - - if (pathInfo.startsWith("/" + UPLOAD_URL_PREFIX)) { - return true; - } - - return false; - - } - private boolean isOnUnloadRequest(HttpServletRequest request) { return request.getParameter(ApplicationConnection.PARAM_UNLOADBURST) != null; } @@ -1410,8 +1268,9 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements HttpServletRequest request) { String staticFileLocation; // if property is defined in configurations, use that - staticFileLocation = getApplicationOrSystemProperty( - PARAMETER_VAADIN_RESOURCES, null); + staticFileLocation = getDeploymentConfiguration() + .getApplicationOrSystemProperty(PARAMETER_VAADIN_RESOURCES, + null); if (staticFileLocation != null) { return staticFileLocation; } @@ -1682,6 +1541,7 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements this.throwable = throwable; } + @Override public Throwable getThrowable() { return throwable; } diff --git a/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java b/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java index 7cad8e3a33..ba1b3cadb6 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java @@ -18,6 +18,8 @@ import java.io.StringWriter; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Type; +import java.net.URI; +import java.net.URISyntaxException; import java.security.GeneralSecurityException; import java.text.CharacterIterator; import java.text.DateFormat; @@ -42,13 +44,21 @@ import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; +import javax.servlet.http.HttpServletResponse; + import com.vaadin.Application; import com.vaadin.Application.SystemMessages; import com.vaadin.RootRequiresMoreInformationException; import com.vaadin.Version; +import com.vaadin.annotations.JavaScript; +import com.vaadin.annotations.StyleSheet; import com.vaadin.external.json.JSONArray; import com.vaadin.external.json.JSONException; import com.vaadin.external.json.JSONObject; +import com.vaadin.shared.Connector; +import com.vaadin.shared.communication.MethodInvocation; +import com.vaadin.shared.communication.SharedState; +import com.vaadin.shared.communication.UidlValue; import com.vaadin.terminal.AbstractClientConnector; import com.vaadin.terminal.CombinedRequest; import com.vaadin.terminal.LegacyPaint; @@ -65,10 +75,6 @@ import com.vaadin.terminal.VariableOwner; import com.vaadin.terminal.WrappedRequest; import com.vaadin.terminal.WrappedResponse; import com.vaadin.terminal.gwt.client.ApplicationConnection; -import com.vaadin.terminal.gwt.client.Connector; -import com.vaadin.terminal.gwt.client.communication.MethodInvocation; -import com.vaadin.terminal.gwt.client.communication.SharedState; -import com.vaadin.terminal.gwt.client.communication.UidlValue; import com.vaadin.terminal.gwt.server.BootstrapHandler.BootstrapContext; import com.vaadin.terminal.gwt.server.ComponentSizeValidator.InvalidLayout; import com.vaadin.terminal.gwt.server.RpcManager.RpcInvocationException; @@ -154,6 +160,12 @@ public abstract class AbstractCommunicationManager implements Serializable { private Connector highlightedConnector; + private Map<String, Class<?>> connectorResourceContexts = new HashMap<String, Class<?>>(); + + private Map<String, Map<String, StreamVariable>> pidToNameToStreamVariable; + + private Map<StreamVariable, String> streamVariableToSeckey; + /** * TODO New constructor - document me! * @@ -204,7 +216,7 @@ public abstract class AbstractCommunicationManager implements Serializable { */ protected void doHandleSimpleMultipartFileUpload(WrappedRequest request, WrappedResponse response, StreamVariable streamVariable, - String variableName, Connector owner, String boundary) + String variableName, ClientConnector owner, String boundary) throws IOException { // multipart parsing, supports only one file for request, but that is // fine for our current terminal @@ -267,14 +279,16 @@ public abstract class AbstractCommunicationManager implements Serializable { final String mimeType = rawMimeType; try { - /* - * safe cast as in GWT terminal all variable owners are expected to - * be components. - */ - Component component = (Component) owner; - if (component.isReadOnly()) { + // TODO Shouldn't this check connectorEnabled? + if (owner == null) { throw new UploadException( - "Warning: file upload ignored because the componente was read-only"); + "File upload ignored because the connector for the stream variable was not found"); + } + if (owner instanceof Component) { + if (((Component) owner).isReadOnly()) { + throw new UploadException( + "Warning: file upload ignored because the componente was read-only"); + } } boolean forgetVariable = streamToReceiver(simpleMultiPartReader, streamVariable, filename, mimeType, contentLength); @@ -303,7 +317,7 @@ public abstract class AbstractCommunicationManager implements Serializable { */ protected void doHandleXhrFilePost(WrappedRequest request, WrappedResponse response, StreamVariable streamVariable, - String variableName, Connector owner, int contentLength) + String variableName, ClientConnector owner, int contentLength) throws IOException { // These are unknown in filexhr ATM, maybe add to Accept header that @@ -497,10 +511,11 @@ public abstract class AbstractCommunicationManager implements Serializable { * found * @throws IOException * @throws InvalidUIDLSecurityKeyException + * @throws JSONException */ public void handleUidlRequest(WrappedRequest request, WrappedResponse response, Callback callback, Root root) - throws IOException, InvalidUIDLSecurityKeyException { + throws IOException, InvalidUIDLSecurityKeyException, JSONException { checkWidgetsetVersion(request); requestThemeName = request.getParameter("theme"); @@ -623,6 +638,23 @@ public abstract class AbstractCommunicationManager implements Serializable { // Remove connectors that have been detached from the application during // handling of the request root.getConnectorTracker().cleanConnectorMap(); + + if (pidToNameToStreamVariable != null) { + Iterator<String> iterator = pidToNameToStreamVariable.keySet() + .iterator(); + while (iterator.hasNext()) { + String connectorId = iterator.next(); + if (root.getConnectorTracker().getConnector(connectorId) == null) { + // Owner is no longer attached to the application + Map<String, StreamVariable> removed = pidToNameToStreamVariable + .get(connectorId); + for (String key : removed.keySet()) { + streamVariableToSeckey.remove(removed.get(key)); + } + iterator.remove(); + } + } + } } protected void highlightConnector(Connector highlightedConnector) { @@ -696,11 +728,12 @@ public abstract class AbstractCommunicationManager implements Serializable { * @param analyzeLayouts * @throws PaintException * @throws IOException + * @throws JSONException */ private void paintAfterVariableChanges(WrappedRequest request, WrappedResponse response, Callback callback, boolean repaintAll, final PrintWriter outWriter, Root root, boolean analyzeLayouts) - throws PaintException, IOException { + throws PaintException, IOException, JSONException { // Removes application if it has stopped during variable changes if (!application.isRunning()) { @@ -764,7 +797,7 @@ public abstract class AbstractCommunicationManager implements Serializable { @SuppressWarnings("unchecked") public void writeUidlResponse(WrappedRequest request, boolean repaintAll, final PrintWriter outWriter, Root root, boolean analyzeLayouts) - throws PaintException { + throws PaintException, JSONException { ArrayList<ClientConnector> dirtyVisibleConnectors = new ArrayList<ClientConnector>(); Application application = root.getApplication(); // Paints components @@ -1095,10 +1128,14 @@ public abstract class AbstractCommunicationManager implements Serializable { boolean typeMappingsOpen = false; ClientCache clientCache = getClientCache(root); + List<Class<? extends ClientConnector>> newConnectorTypes = new ArrayList<Class<? extends ClientConnector>>(); + for (Class<? extends ClientConnector> class1 : usedClientConnectors) { if (clientCache.cache(class1)) { // client does not know the mapping key for this type, send // mapping to client + newConnectorTypes.add(class1); + if (!typeMappingsOpen) { typeMappingsOpen = true; outWriter.print(", \"typeMappings\" : { "); @@ -1142,6 +1179,58 @@ public abstract class AbstractCommunicationManager implements Serializable { } } + /* + * Ensure super classes come before sub classes to get script dependency + * order right. Sub class @JavaScript might assume that @JavaScript + * defined by super class is already loaded. + */ + Collections.sort(newConnectorTypes, new Comparator<Class<?>>() { + @Override + public int compare(Class<?> o1, Class<?> o2) { + // TODO optimize using Class.isAssignableFrom? + return hierarchyDepth(o1) - hierarchyDepth(o2); + } + + private int hierarchyDepth(Class<?> type) { + if (type == Object.class) { + return 0; + } else { + return hierarchyDepth(type.getSuperclass()) + 1; + } + } + }); + + List<String> scriptDependencies = new ArrayList<String>(); + List<String> styleDependencies = new ArrayList<String>(); + + for (Class<? extends ClientConnector> class1 : newConnectorTypes) { + JavaScript jsAnnotation = class1.getAnnotation(JavaScript.class); + if (jsAnnotation != null) { + for (String resource : jsAnnotation.value()) { + scriptDependencies.add(registerResource(resource, class1)); + } + } + + StyleSheet styleAnnotation = class1.getAnnotation(StyleSheet.class); + if (styleAnnotation != null) { + for (String resource : styleAnnotation.value()) { + styleDependencies.add(registerResource(resource, class1)); + } + } + } + + // Include script dependencies in output if there are any + if (!scriptDependencies.isEmpty()) { + outWriter.print(", \"scriptDependencies\": " + + new JSONArray(scriptDependencies).toString()); + } + + // Include style dependencies in output if there are any + if (!styleDependencies.isEmpty()) { + outWriter.print(", \"styleDependencies\": " + + new JSONArray(styleDependencies).toString()); + } + // add any pending locale definitions requested by the client printLocaleDeclarations(outWriter); @@ -1153,6 +1242,54 @@ public abstract class AbstractCommunicationManager implements Serializable { } /** + * Resolves a resource URI, registering the URI with this + * {@code AbstractCommunicationManager} if needed and returns a fully + * qualified URI. + */ + private String registerResource(String resourceUri, Class<?> context) { + try { + URI uri = new URI(resourceUri); + String protocol = uri.getScheme(); + + if ("connector".equals(protocol)) { + // Strip initial slash + String resourceName = uri.getPath().substring(1); + return registerConnectorResource(resourceName, context); + } + + if (protocol != null || uri.getHost() != null) { + return resourceUri; + } + + // Bare path interpreted as connector resource + return registerConnectorResource(resourceUri, context); + } catch (URISyntaxException e) { + getLogger().log(Level.WARNING, + "Could not parse resource url " + resourceUri, e); + return resourceUri; + } + } + + private String registerConnectorResource(String name, Class<?> context) { + synchronized (connectorResourceContexts) { + // Add to map of names accepted by serveConnectorResource + if (connectorResourceContexts.containsKey(name)) { + Class<?> oldContext = connectorResourceContexts.get(name); + if (oldContext != context) { + getLogger().warning( + "Resource " + name + " defined by both " + context + + " and " + oldContext + ". Resource from " + + oldContext + " will be used."); + } + } else { + connectorResourceContexts.put(name, context); + } + } + + return ApplicationConnection.CONNECTOR_PROTOCOL_PREFIX + "/" + name; + } + + /** * Adds the performance timing data (used by TestBench 3) to the UIDL * response. */ @@ -1194,6 +1331,7 @@ public abstract class AbstractCommunicationManager implements Serializable { // before children start calling e.g. updateCaption Collections.sort(paintables, new Comparator<Component>() { + @Override public int compare(Component c1, Component c2) { int depth1 = 0; while (c1.getParent() != null) { @@ -1280,14 +1418,17 @@ public abstract class AbstractCommunicationManager implements Serializable { private static class NullIterator<E> implements Iterator<E> { + @Override public boolean hasNext() { return false; } + @Override public E next() { return null; } + @Override public void remove() { } @@ -1380,7 +1521,7 @@ public abstract class AbstractCommunicationManager implements Serializable { private boolean handleVariables(WrappedRequest request, WrappedResponse response, Callback callback, Application application2, Root root) throws IOException, - InvalidUIDLSecurityKeyException { + InvalidUIDLSecurityKeyException, JSONException { boolean success = true; String changes = getRequestPayload(request); @@ -1761,6 +1902,7 @@ public abstract class AbstractCommunicationManager implements Serializable { this.throwable = throwable; } + @Override public Throwable getThrowable() { return throwable; } @@ -2162,10 +2304,57 @@ public abstract class AbstractCommunicationManager implements Serializable { } - abstract String getStreamVariableTargetUrl(Connector owner, String name, - StreamVariable value); + public String getStreamVariableTargetUrl(ClientConnector owner, + String name, StreamVariable value) { + /* + * We will use the same APP/* URI space as ApplicationResources but + * prefix url with UPLOAD + * + * eg. APP/UPLOAD/[ROOTID]/[PID]/[NAME]/[SECKEY] + * + * SECKEY is created on each paint to make URL's unpredictable (to + * prevent CSRF attacks). + * + * NAME and PID from URI forms a key to fetch StreamVariable when + * handling post + */ + String paintableId = owner.getConnectorId(); + int rootId = owner.getRoot().getRootId(); + String key = rootId + "/" + paintableId + "/" + name; + + if (pidToNameToStreamVariable == null) { + pidToNameToStreamVariable = new HashMap<String, Map<String, StreamVariable>>(); + } + Map<String, StreamVariable> nameToStreamVariable = pidToNameToStreamVariable + .get(paintableId); + if (nameToStreamVariable == null) { + nameToStreamVariable = new HashMap<String, StreamVariable>(); + pidToNameToStreamVariable.put(paintableId, nameToStreamVariable); + } + nameToStreamVariable.put(name, value); + + if (streamVariableToSeckey == null) { + streamVariableToSeckey = new HashMap<StreamVariable, String>(); + } + String seckey = streamVariableToSeckey.get(value); + if (seckey == null) { + seckey = UUID.randomUUID().toString(); + streamVariableToSeckey.put(value, seckey); + } + + return ApplicationConnection.APP_PROTOCOL_PREFIX + + ServletPortletHelper.UPLOAD_URL_PREFIX + key + "/" + seckey; + + } - abstract protected void cleanStreamVariable(Connector owner, String name); + public void cleanStreamVariable(ClientConnector owner, String name) { + Map<String, StreamVariable> nameToStreamVar = pidToNameToStreamVariable + .get(owner.getConnectorId()); + nameToStreamVar.remove(name); + if (nameToStreamVar.isEmpty()) { + pidToNameToStreamVariable.remove(owner.getConnectorId()); + } + } /** * Gets the bootstrap handler that should be used for generating the pages @@ -2256,9 +2445,11 @@ public abstract class AbstractCommunicationManager implements Serializable { * @return a string with the initial UIDL message * @throws PaintException * if an exception occurs while painting + * @throws JSONException + * if an exception occurs while encoding output */ protected String getInitialUIDL(WrappedRequest request, Root root) - throws PaintException { + throws PaintException, JSONException { // TODO maybe unify writeUidlResponse()? StringWriter sWriter = new StringWriter(); PrintWriter pWriter = new PrintWriter(sWriter); @@ -2274,6 +2465,176 @@ public abstract class AbstractCommunicationManager implements Serializable { } /** + * Serve a connector resource from the classpath if the resource has + * previously been registered by calling + * {@link #registerResource(String, Class)}. Sending arbitrary files from + * the classpath is prevented by only accepting resource names that have + * explicitly been registered. Resources can currently only be registered by + * including a {@link JavaScript} or {@link StyleSheet} annotation on a + * Connector class. + * + * @param request + * @param response + * + * @throws IOException + */ + public void serveConnectorResource(WrappedRequest request, + WrappedResponse response) throws IOException { + + String pathInfo = request.getRequestPathInfo(); + // + 2 to also remove beginning and ending slashes + String resourceName = pathInfo + .substring(ApplicationConnection.CONNECTOR_RESOURCE_PREFIX + .length() + 2); + + final String mimetype = response.getDeploymentConfiguration() + .getMimeType(resourceName); + + // Security check: avoid accidentally serving from the root of the + // classpath instead of relative to the context class + if (resourceName.startsWith("/")) { + getLogger().warning( + "Connector resource request starting with / rejected: " + + resourceName); + response.sendError(HttpServletResponse.SC_NOT_FOUND, resourceName); + return; + } + + // Check that the resource name has been registered + Class<?> context; + synchronized (connectorResourceContexts) { + context = connectorResourceContexts.get(resourceName); + } + + // Security check: don't serve resource if the name hasn't been + // registered in the map + if (context == null) { + getLogger().warning( + "Connector resource request for unknown resource rejected: " + + resourceName); + response.sendError(HttpServletResponse.SC_NOT_FOUND, resourceName); + return; + } + + // Resolve file relative to the location of the context class + InputStream in = context.getResourceAsStream(resourceName); + if (in == null) { + getLogger().warning( + resourceName + " defined by " + context.getName() + + " not found. Verify that the file " + + context.getPackage().getName().replace('.', '/') + + '/' + resourceName + + " is available on the classpath."); + response.sendError(HttpServletResponse.SC_NOT_FOUND, resourceName); + return; + } + + // TODO Check and set cache headers + + OutputStream out = null; + try { + if (mimetype != null) { + response.setContentType(mimetype); + } + + out = response.getOutputStream(); + + final byte[] buffer = new byte[Constants.DEFAULT_BUFFER_SIZE]; + + int bytesRead = 0; + while ((bytesRead = in.read(buffer)) > 0) { + out.write(buffer, 0, bytesRead); + } + out.flush(); + } finally { + try { + in.close(); + } catch (Exception e) { + // Do nothing + } + if (out != null) { + try { + out.close(); + } catch (Exception e) { + // Do nothing + } + } + } + } + + /** + * Handles file upload request submitted via Upload component. + * + * @param root + * The root for this request + * + * @see #getStreamVariableTargetUrl(ReceiverOwner, String, StreamVariable) + * + * @param request + * @param response + * @throws IOException + * @throws InvalidUIDLSecurityKeyException + */ + public void handleFileUpload(Application application, + WrappedRequest request, WrappedResponse response) + throws IOException, InvalidUIDLSecurityKeyException { + + /* + * URI pattern: APP/UPLOAD/[ROOTID]/[PID]/[NAME]/[SECKEY] See + * #createReceiverUrl + */ + + String pathInfo = request.getRequestPathInfo(); + // strip away part until the data we are interested starts + int startOfData = pathInfo + .indexOf(ServletPortletHelper.UPLOAD_URL_PREFIX) + + ServletPortletHelper.UPLOAD_URL_PREFIX.length(); + String uppUri = pathInfo.substring(startOfData); + String[] parts = uppUri.split("/", 4); // 0= rootid, 1 = cid, 2= name, 3 + // = sec key + String rootId = parts[0]; + String connectorId = parts[1]; + String variableName = parts[2]; + Root root = application.getRootById(Integer.parseInt(rootId)); + Root.setCurrent(root); + + StreamVariable streamVariable = getStreamVariable(connectorId, + variableName); + String secKey = streamVariableToSeckey.get(streamVariable); + if (secKey.equals(parts[3])) { + + ClientConnector source = getConnector(root, connectorId); + String contentType = request.getContentType(); + if (contentType.contains("boundary")) { + // Multipart requests contain boundary string + doHandleSimpleMultipartFileUpload(request, response, + streamVariable, variableName, source, + contentType.split("boundary=")[1]); + } else { + // if boundary string does not exist, the posted file is from + // XHR2.post(File) + doHandleXhrFilePost(request, response, streamVariable, + variableName, source, request.getContentLength()); + } + } else { + throw new InvalidUIDLSecurityKeyException( + "Security key in upload post did not match!"); + } + + } + + public StreamVariable getStreamVariable(String connectorId, + String variableName) { + Map<String, StreamVariable> map = pidToNameToStreamVariable + .get(connectorId); + if (map == null) { + return null; + } + StreamVariable streamVariable = map.get(variableName); + return streamVariable; + } + + /** * Stream that extracts content from another stream until the boundary * string is encountered. * diff --git a/src/com/vaadin/terminal/gwt/server/AbstractDeploymentConfiguration.java b/src/com/vaadin/terminal/gwt/server/AbstractDeploymentConfiguration.java new file mode 100644 index 0000000000..1ac090ad76 --- /dev/null +++ b/src/com/vaadin/terminal/gwt/server/AbstractDeploymentConfiguration.java @@ -0,0 +1,121 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ + +package com.vaadin.terminal.gwt.server; + +import java.lang.reflect.Constructor; +import java.util.Properties; + +import com.vaadin.terminal.DeploymentConfiguration; + +public abstract class AbstractDeploymentConfiguration implements + DeploymentConfiguration { + + private final Class<?> systemPropertyBaseClass; + private final Properties applicationProperties = new Properties(); + + public AbstractDeploymentConfiguration(Class<?> systemPropertyBaseClass) { + this.systemPropertyBaseClass = systemPropertyBaseClass; + } + + @Override + public String getApplicationOrSystemProperty(String propertyName, + String defaultValue) { + + String val = null; + + // Try application properties + val = getApplicationProperty(propertyName); + if (val != null) { + return val; + } + + // Try system properties + val = getSystemProperty(propertyName); + if (val != null) { + return val; + } + + return defaultValue; + } + + /** + * Gets an system property value. + * + * @param parameterName + * the Name or the parameter. + * @return String value or null if not found + */ + protected String getSystemProperty(String parameterName) { + String val = null; + + String pkgName; + final Package pkg = systemPropertyBaseClass.getPackage(); + if (pkg != null) { + pkgName = pkg.getName(); + } else { + final String className = systemPropertyBaseClass.getName(); + pkgName = new String(className.toCharArray(), 0, + className.lastIndexOf('.')); + } + val = System.getProperty(pkgName + "." + parameterName); + if (val != null) { + return val; + } + + // Try lowercased system properties + val = System.getProperty(pkgName + "." + parameterName.toLowerCase()); + return val; + } + + @Override + public ClassLoader getClassLoader() { + final String classLoaderName = getApplicationOrSystemProperty( + "ClassLoader", null); + ClassLoader classLoader; + if (classLoaderName == null) { + classLoader = getClass().getClassLoader(); + } else { + try { + final Class<?> classLoaderClass = getClass().getClassLoader() + .loadClass(classLoaderName); + final Constructor<?> c = classLoaderClass + .getConstructor(new Class[] { ClassLoader.class }); + classLoader = (ClassLoader) c + .newInstance(new Object[] { getClass().getClassLoader() }); + } catch (final Exception e) { + throw new RuntimeException( + "Could not find specified class loader: " + + classLoaderName, e); + } + } + return classLoader; + } + + /** + * Gets an application property value. + * + * @param parameterName + * the Name or the parameter. + * @return String value or null if not found + */ + protected String getApplicationProperty(String parameterName) { + + String val = applicationProperties.getProperty(parameterName); + if (val != null) { + return val; + } + + // Try lower case application properties for backward compatibility with + // 3.0.2 and earlier + val = applicationProperties.getProperty(parameterName.toLowerCase()); + + return val; + } + + @Override + public Properties getInitParameters() { + return applicationProperties; + } +} diff --git a/src/com/vaadin/terminal/gwt/server/AbstractStreamingEvent.java b/src/com/vaadin/terminal/gwt/server/AbstractStreamingEvent.java index 43b175cc36..d3474e736e 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractStreamingEvent.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractStreamingEvent.java @@ -15,10 +15,12 @@ abstract class AbstractStreamingEvent implements StreamingEvent { private final long contentLength; private final long bytesReceived; + @Override public final String getFileName() { return filename; } + @Override public final String getMimeType() { return type; } @@ -31,10 +33,12 @@ abstract class AbstractStreamingEvent implements StreamingEvent { this.bytesReceived = bytesReceived; } + @Override public final long getContentLength() { return contentLength; } + @Override public final long getBytesReceived() { return bytesReceived; } diff --git a/src/com/vaadin/terminal/gwt/server/AbstractWebApplicationContext.java b/src/com/vaadin/terminal/gwt/server/AbstractWebApplicationContext.java index bf4ea860a8..3a33621d10 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractWebApplicationContext.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractWebApplicationContext.java @@ -24,6 +24,7 @@ import javax.servlet.http.HttpSessionBindingListener; import com.vaadin.Application; import com.vaadin.service.ApplicationContext; import com.vaadin.terminal.ApplicationResource; +import com.vaadin.terminal.gwt.client.ApplicationConnection; /** * Base class for web application contexts (including portlet contexts) that @@ -45,12 +46,14 @@ public abstract class AbstractWebApplicationContext implements private long lastRequestTime = -1; + @Override public void addTransactionListener(TransactionListener listener) { if (listener != null) { listeners.add(listener); } } + @Override public void removeTransactionListener(TransactionListener listener) { listeners.remove(listener); } @@ -119,6 +122,7 @@ public abstract class AbstractWebApplicationContext implements /** * @see javax.servlet.http.HttpSessionBindingListener#valueBound(HttpSessionBindingEvent) */ + @Override public void valueBound(HttpSessionBindingEvent arg0) { // We are not interested in bindings } @@ -126,6 +130,7 @@ public abstract class AbstractWebApplicationContext implements /** * @see javax.servlet.http.HttpSessionBindingListener#valueUnbound(HttpSessionBindingEvent) */ + @Override public void valueUnbound(HttpSessionBindingEvent event) { // If we are going to be unbound from the session, the session must be // closing @@ -160,6 +165,7 @@ public abstract class AbstractWebApplicationContext implements return browser; } + @Override public Collection<Application> getApplications() { return Collections.unmodifiableCollection(applications); } @@ -169,12 +175,14 @@ public abstract class AbstractWebApplicationContext implements applicationToAjaxAppMgrMap.remove(application); } + @Override public String generateApplicationResourceURL(ApplicationResource resource, String mapKey) { final String filename = resource.getFilename(); if (filename == null) { - return "app://APP/" + mapKey + "/"; + return ApplicationConnection.APP_PROTOCOL_PREFIX + + ApplicationConnection.APP_REQUEST_PATH + mapKey + "/"; } else { // #7738 At least Tomcat and JBoss refuses requests containing // encoded slashes or backslashes in URLs. Application resource URLs @@ -182,7 +190,9 @@ public abstract class AbstractWebApplicationContext implements // in the future. String encodedFileName = urlEncode(filename).replace("%2F", "/") .replace("%5C", "\\"); - return "app://APP/" + mapKey + "/" + encodedFileName; + return ApplicationConnection.APP_PROTOCOL_PREFIX + + ApplicationConnection.APP_REQUEST_PATH + mapKey + "/" + + encodedFileName; } } @@ -197,6 +207,7 @@ public abstract class AbstractWebApplicationContext implements } } + @Override public boolean isApplicationResourceURL(URL context, String relativeUri) { // If the relative uri is null, we are ready if (relativeUri == null) { @@ -214,6 +225,7 @@ public abstract class AbstractWebApplicationContext implements return (prefix.equals("APP")); } + @Override public String getURLKey(URL context, String relativeUri) { final int index = relativeUri.indexOf('/'); final int next = relativeUri.indexOf('/', index + 1); diff --git a/src/com/vaadin/terminal/gwt/server/ApplicationPortlet2.java b/src/com/vaadin/terminal/gwt/server/ApplicationPortlet2.java index 7a46a07e6c..788c48267e 100644 --- a/src/com/vaadin/terminal/gwt/server/ApplicationPortlet2.java +++ b/src/com/vaadin/terminal/gwt/server/ApplicationPortlet2.java @@ -23,10 +23,8 @@ public class ApplicationPortlet2 extends AbstractApplicationPortlet { public void init(PortletConfig config) throws PortletException { super.init(config); try { - applicationClass = ServletPortletHelper.getApplicationClass( - config.getInitParameter("application"), - config.getInitParameter(Application.ROOT_PARAMETER), - getClassLoader()); + applicationClass = ServletPortletHelper + .getApplicationClass(getDeploymentConfiguration()); } catch (ApplicationClassException e) { throw new PortletException(e); } diff --git a/src/com/vaadin/terminal/gwt/server/ApplicationResourceHandler.java b/src/com/vaadin/terminal/gwt/server/ApplicationResourceHandler.java index 7cf66d5fcf..42726c933e 100644 --- a/src/com/vaadin/terminal/gwt/server/ApplicationResourceHandler.java +++ b/src/com/vaadin/terminal/gwt/server/ApplicationResourceHandler.java @@ -21,6 +21,7 @@ public class ApplicationResourceHandler implements RequestHandler { private static final Pattern APP_RESOURCE_PATTERN = Pattern .compile("^/?APP/(\\d+)/.*"); + @Override public boolean handleRequest(Application application, WrappedRequest request, WrappedResponse response) throws IOException { diff --git a/src/com/vaadin/terminal/gwt/server/ApplicationServlet.java b/src/com/vaadin/terminal/gwt/server/ApplicationServlet.java index 2c4d38ef24..1af49e0da0 100644 --- a/src/com/vaadin/terminal/gwt/server/ApplicationServlet.java +++ b/src/com/vaadin/terminal/gwt/server/ApplicationServlet.java @@ -41,14 +41,12 @@ public class ApplicationServlet extends AbstractApplicationServlet { throws javax.servlet.ServletException { super.init(servletConfig); - // Loads the application class using the same class loader - // as the servlet itself + // Loads the application class using the classloader defined in the + // deployment configuration try { - applicationClass = ServletPortletHelper.getApplicationClass( - servletConfig.getInitParameter("application"), - servletConfig.getInitParameter(Application.ROOT_PARAMETER), - getClassLoader()); + applicationClass = ServletPortletHelper + .getApplicationClass(getDeploymentConfiguration()); } catch (ApplicationClassException e) { throw new ServletException(e); } diff --git a/src/com/vaadin/terminal/gwt/server/BootstrapHandler.java b/src/com/vaadin/terminal/gwt/server/BootstrapHandler.java index 69f033c8cd..4038b8f1bc 100644 --- a/src/com/vaadin/terminal/gwt/server/BootstrapHandler.java +++ b/src/com/vaadin/terminal/gwt/server/BootstrapHandler.java @@ -9,10 +9,6 @@ import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Serializable; import java.io.Writer; -import java.lang.annotation.Annotation; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletResponse; @@ -20,7 +16,6 @@ import javax.servlet.http.HttpServletResponse; import com.vaadin.Application; import com.vaadin.RootRequiresMoreInformationException; import com.vaadin.Version; -import com.vaadin.annotations.LoadScripts; import com.vaadin.external.json.JSONException; import com.vaadin.external.json.JSONObject; import com.vaadin.terminal.DeploymentConfiguration; @@ -118,6 +113,7 @@ public abstract class BootstrapHandler implements RequestHandler { } + @Override public boolean handleRequest(Application application, WrappedRequest request, WrappedResponse response) throws IOException { @@ -490,50 +486,6 @@ public abstract class BootstrapHandler implements RequestHandler { page.write("<title>" + AbstractApplicationServlet.safeEscapeForHtml(title) + "</title>\n"); - - if (root != null) { - List<LoadScripts> loadScriptsAnnotations = getAnnotationsFor( - root.getClass(), LoadScripts.class); - Collections.reverse(loadScriptsAnnotations); - // Begin from the end as a class might requests scripts that depend - // on script loaded by a super class - for (int i = loadScriptsAnnotations.size() - 1; i >= 0; i--) { - LoadScripts loadScripts = loadScriptsAnnotations.get(i); - String[] value = loadScripts.value(); - if (value != null) { - for (String script : value) { - page.write("<script type='text/javascript' src='"); - page.write(script); - page.write("'></script>\n"); - } - } - } - - } - } - - private static <T extends Annotation> List<T> getAnnotationsFor( - Class<?> type, Class<T> annotationType) { - List<T> list = new ArrayList<T>(); - // Find from the class hierarchy - Class<?> currentType = type; - while (currentType != Object.class) { - T annotation = currentType.getAnnotation(annotationType); - if (annotation != null) { - list.add(annotation); - } - currentType = currentType.getSuperclass(); - } - - // Find from an implemented interface - for (Class<?> iface : type.getInterfaces()) { - T annotation = iface.getAnnotation(annotationType); - if (annotation != null) { - list.add(annotation); - } - } - - return list; } /** @@ -645,8 +597,10 @@ public abstract class BootstrapHandler implements RequestHandler { * @return a string with the initial UIDL message * @throws PaintException * if an exception occurs while painting the components + * @throws JSONException + * if an exception occurs while formatting the output */ protected abstract String getInitialUIDL(WrappedRequest request, Root root) - throws PaintException; + throws PaintException, JSONException; } diff --git a/src/com/vaadin/terminal/gwt/server/ChangeVariablesErrorEvent.java b/src/com/vaadin/terminal/gwt/server/ChangeVariablesErrorEvent.java index b6576dce9f..8f0c80332f 100644 --- a/src/com/vaadin/terminal/gwt/server/ChangeVariablesErrorEvent.java +++ b/src/com/vaadin/terminal/gwt/server/ChangeVariablesErrorEvent.java @@ -23,6 +23,7 @@ public class ChangeVariablesErrorEvent implements ComponentErrorEvent { this.variableChanges = variableChanges; } + @Override public Throwable getThrowable() { return throwable; } diff --git a/src/com/vaadin/terminal/gwt/server/ClientConnector.java b/src/com/vaadin/terminal/gwt/server/ClientConnector.java index dfdd58879d..4f74cfe4bb 100644 --- a/src/com/vaadin/terminal/gwt/server/ClientConnector.java +++ b/src/com/vaadin/terminal/gwt/server/ClientConnector.java @@ -6,12 +6,13 @@ package com.vaadin.terminal.gwt.server; import java.util.Collection; import java.util.List; +import com.vaadin.shared.Connector; +import com.vaadin.shared.communication.SharedState; import com.vaadin.terminal.AbstractClientConnector; import com.vaadin.terminal.Extension; -import com.vaadin.terminal.gwt.client.Connector; -import com.vaadin.terminal.gwt.client.communication.SharedState; import com.vaadin.ui.Component; import com.vaadin.ui.ComponentContainer; +import com.vaadin.ui.Root; /** * Interface implemented by all connectors that are capable of communicating @@ -47,6 +48,7 @@ public interface ClientConnector extends Connector, RpcTarget { */ public Class<? extends SharedState> getStateType(); + @Override public ClientConnector getParent(); /** @@ -136,4 +138,12 @@ public interface ClientConnector extends Connector, RpcTarget { * the extension to remove. */ public void removeExtension(Extension extension); + + /** + * Returns the root this connector is attached to + * + * @return The Root this connector is attached to or null if it is not + * attached to any Root + */ + public Root getRoot(); } diff --git a/src/com/vaadin/terminal/gwt/server/ClientMethodInvocation.java b/src/com/vaadin/terminal/gwt/server/ClientMethodInvocation.java index ad9484723b..64ea288665 100644 --- a/src/com/vaadin/terminal/gwt/server/ClientMethodInvocation.java +++ b/src/com/vaadin/terminal/gwt/server/ClientMethodInvocation.java @@ -61,6 +61,7 @@ public class ClientMethodInvocation implements Serializable, return sequenceNumber; } + @Override public int compareTo(ClientMethodInvocation o) { if (null == o) { return 0; diff --git a/src/com/vaadin/terminal/gwt/server/CommunicationManager.java b/src/com/vaadin/terminal/gwt/server/CommunicationManager.java index cc2981dc45..3cc3a8cb64 100644 --- a/src/com/vaadin/terminal/gwt/server/CommunicationManager.java +++ b/src/com/vaadin/terminal/gwt/server/CommunicationManager.java @@ -4,22 +4,15 @@ package com.vaadin.terminal.gwt.server; -import java.io.IOException; import java.io.InputStream; import java.net.URL; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.UUID; import javax.servlet.ServletContext; import com.vaadin.Application; +import com.vaadin.external.json.JSONException; import com.vaadin.terminal.PaintException; -import com.vaadin.terminal.StreamVariable; import com.vaadin.terminal.WrappedRequest; -import com.vaadin.terminal.WrappedResponse; -import com.vaadin.terminal.gwt.client.Connector; import com.vaadin.ui.Root; /** @@ -58,142 +51,6 @@ public class CommunicationManager extends AbstractCommunicationManager { super(application); } - /** - * Handles file upload request submitted via Upload component. - * - * @param root - * The root for this request - * - * @see #getStreamVariableTargetUrl(ReceiverOwner, String, StreamVariable) - * - * @param request - * @param response - * @throws IOException - * @throws InvalidUIDLSecurityKeyException - */ - public void handleFileUpload(Root root, WrappedRequest request, - WrappedResponse response) throws IOException, - InvalidUIDLSecurityKeyException { - - /* - * URI pattern: APP/UPLOAD/[PID]/[NAME]/[SECKEY] See #createReceiverUrl - */ - - String pathInfo = request.getRequestPathInfo(); - // strip away part until the data we are interested starts - int startOfData = pathInfo - .indexOf(AbstractApplicationServlet.UPLOAD_URL_PREFIX) - + AbstractApplicationServlet.UPLOAD_URL_PREFIX.length(); - String uppUri = pathInfo.substring(startOfData); - String[] parts = uppUri.split("/", 3); // 0 = pid, 1= name, 2 = sec key - String variableName = parts[1]; - String connectorId = parts[0]; - - StreamVariable streamVariable = pidToNameToStreamVariable.get( - connectorId).get(variableName); - String secKey = streamVariableToSeckey.get(streamVariable); - if (secKey.equals(parts[2])) { - - Connector source = getConnector(root, connectorId); - String contentType = request.getContentType(); - if (contentType.contains("boundary")) { - // Multipart requests contain boundary string - doHandleSimpleMultipartFileUpload(request, response, - streamVariable, variableName, source, - contentType.split("boundary=")[1]); - } else { - // if boundary string does not exist, the posted file is from - // XHR2.post(File) - doHandleXhrFilePost(request, response, streamVariable, - variableName, source, request.getContentLength()); - } - } else { - throw new InvalidUIDLSecurityKeyException( - "Security key in upload post did not match!"); - } - - } - - @Override - protected void postPaint(Root root) { - super.postPaint(root); - - if (pidToNameToStreamVariable != null) { - Iterator<String> iterator = pidToNameToStreamVariable.keySet() - .iterator(); - while (iterator.hasNext()) { - String connectorId = iterator.next(); - if (root.getConnectorTracker().getConnector(connectorId) == null) { - // Owner is no longer attached to the application - Map<String, StreamVariable> removed = pidToNameToStreamVariable - .get(connectorId); - for (String key : removed.keySet()) { - streamVariableToSeckey.remove(removed.get(key)); - } - iterator.remove(); - } - } - } - - } - - private Map<String, Map<String, StreamVariable>> pidToNameToStreamVariable; - - private Map<StreamVariable, String> streamVariableToSeckey; - - @Override - String getStreamVariableTargetUrl(Connector owner, String name, - StreamVariable value) { - /* - * We will use the same APP/* URI space as ApplicationResources but - * prefix url with UPLOAD - * - * eg. APP/UPLOAD/[PID]/[NAME]/[SECKEY] - * - * SECKEY is created on each paint to make URL's unpredictable (to - * prevent CSRF attacks). - * - * NAME and PID from URI forms a key to fetch StreamVariable when - * handling post - */ - String paintableId = owner.getConnectorId(); - String key = paintableId + "/" + name; - - if (pidToNameToStreamVariable == null) { - pidToNameToStreamVariable = new HashMap<String, Map<String, StreamVariable>>(); - } - Map<String, StreamVariable> nameToStreamVariable = pidToNameToStreamVariable - .get(paintableId); - if (nameToStreamVariable == null) { - nameToStreamVariable = new HashMap<String, StreamVariable>(); - pidToNameToStreamVariable.put(paintableId, nameToStreamVariable); - } - nameToStreamVariable.put(name, value); - - if (streamVariableToSeckey == null) { - streamVariableToSeckey = new HashMap<StreamVariable, String>(); - } - String seckey = streamVariableToSeckey.get(value); - if (seckey == null) { - seckey = UUID.randomUUID().toString(); - streamVariableToSeckey.put(value, seckey); - } - - return "app://" + AbstractApplicationServlet.UPLOAD_URL_PREFIX + key - + "/" + seckey; - - } - - @Override - protected void cleanStreamVariable(Connector owner, String name) { - Map<String, StreamVariable> nameToStreamVar = pidToNameToStreamVariable - .get(owner.getConnectorId()); - nameToStreamVar.remove("name"); - if (nameToStreamVar.isEmpty()) { - pidToNameToStreamVariable.remove(owner.getConnectorId()); - } - } - @Override protected BootstrapHandler createBootstrapHandler() { return new BootstrapHandler() { @@ -245,7 +102,7 @@ public class CommunicationManager extends AbstractCommunicationManager { @Override protected String getInitialUIDL(WrappedRequest request, Root root) - throws PaintException { + throws PaintException, JSONException { return CommunicationManager.this.getInitialUIDL(request, root); } }; diff --git a/src/com/vaadin/terminal/gwt/server/Constants.java b/src/com/vaadin/terminal/gwt/server/Constants.java index 9e6b2c775b..7efb0205ac 100644 --- a/src/com/vaadin/terminal/gwt/server/Constants.java +++ b/src/com/vaadin/terminal/gwt/server/Constants.java @@ -54,8 +54,6 @@ public interface Constants { static final int MAX_BUFFER_SIZE = 64 * 1024; - static final String AJAX_UIDL_URI = "/UIDL"; - final String THEME_DIRECTORY_PATH = "VAADIN/themes/"; static final int DEFAULT_THEME_CACHETIME = 1000 * 60 * 60 * 24; diff --git a/src/com/vaadin/terminal/gwt/server/DragAndDropService.java b/src/com/vaadin/terminal/gwt/server/DragAndDropService.java index 0e8d1c0152..efb5666efa 100644 --- a/src/com/vaadin/terminal/gwt/server/DragAndDropService.java +++ b/src/com/vaadin/terminal/gwt/server/DragAndDropService.java @@ -19,13 +19,14 @@ import com.vaadin.event.dd.DropTarget; import com.vaadin.event.dd.TargetDetails; import com.vaadin.event.dd.TargetDetailsImpl; import com.vaadin.event.dd.acceptcriteria.AcceptCriterion; +import com.vaadin.shared.communication.SharedState; +import com.vaadin.shared.ui.dd.DragEventType; import com.vaadin.terminal.Extension; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.VariableOwner; -import com.vaadin.terminal.gwt.client.communication.SharedState; import com.vaadin.terminal.gwt.client.ui.dd.VDragAndDropManager; -import com.vaadin.terminal.gwt.client.ui.dd.VDragAndDropManager.DragEventType; import com.vaadin.ui.Component; +import com.vaadin.ui.Root; public class DragAndDropService implements VariableOwner, ClientConnector { @@ -43,6 +44,7 @@ public class DragAndDropService implements VariableOwner, ClientConnector { this.manager = manager; } + @Override public void changeVariables(Object source, Map<String, Object> variables) { Object owner = variables.get("dhowner"); @@ -181,10 +183,12 @@ public class DragAndDropService implements VariableOwner, ClientConnector { return transferable; } + @Override public boolean isEnabled() { return isConnectorEnabled(); } + @Override public boolean isImmediate() { return true; } @@ -218,68 +222,82 @@ public class DragAndDropService implements VariableOwner, ClientConnector { return false; } + @Override public SharedState getState() { // TODO Auto-generated method stub return null; } + @Override public String getConnectorId() { return VDragAndDropManager.DD_SERVICE; } + @Override public boolean isConnectorEnabled() { // Drag'n'drop can't be disabled return true; } + @Override public List<ClientMethodInvocation> retrievePendingRpcCalls() { return null; } + @Override public RpcManager getRpcManager(Class<?> rpcInterface) { // TODO Use rpc for drag'n'drop return null; } + @Override public Class<? extends SharedState> getStateType() { return SharedState.class; } + @Override public void requestRepaint() { // TODO Auto-generated method stub } + @Override public ClientConnector getParent() { // TODO Auto-generated method stub return null; } + @Override public void requestRepaintAll() { // TODO Auto-generated method stub } + @Override public void setParent(ClientConnector parent) { // TODO Auto-generated method stub } + @Override public void attach() { // TODO Auto-generated method stub } + @Override public void detach() { // TODO Auto-generated method stub } + @Override public Collection<Extension> getExtensions() { // TODO Auto-generated method stub return Collections.emptySet(); } + @Override public void removeExtension(Extension extension) { // TODO Auto-generated method stub } @@ -287,4 +305,9 @@ public class DragAndDropService implements VariableOwner, ClientConnector { private Logger getLogger() { return Logger.getLogger(DragAndDropService.class.getName()); } + + @Override + public Root getRoot() { + return null; + } } diff --git a/src/com/vaadin/terminal/gwt/server/GAEApplicationServlet.java b/src/com/vaadin/terminal/gwt/server/GAEApplicationServlet.java index a6032fa98d..cc12c9cc43 100644 --- a/src/com/vaadin/terminal/gwt/server/GAEApplicationServlet.java +++ b/src/com/vaadin/terminal/gwt/server/GAEApplicationServlet.java @@ -121,8 +121,9 @@ public class GAEApplicationServlet extends ApplicationServlet { // appengine session expires-parameter private static final String PROPERTY_APPENGINE_EXPIRES = "_expires"; - protected void sendDeadlineExceededNotification(HttpServletRequest request, - HttpServletResponse response) throws IOException { + protected void sendDeadlineExceededNotification( + WrappedHttpServletRequest request, + WrappedHttpServletResponse response) throws IOException { criticalNotification( request, response, @@ -131,8 +132,9 @@ public class GAEApplicationServlet extends ApplicationServlet { "", null); } - protected void sendNotSerializableNotification(HttpServletRequest request, - HttpServletResponse response) throws IOException { + protected void sendNotSerializableNotification( + WrappedHttpServletRequest request, + WrappedHttpServletResponse response) throws IOException { criticalNotification( request, response, @@ -142,8 +144,9 @@ public class GAEApplicationServlet extends ApplicationServlet { + "?restartApplication"); } - protected void sendCriticalErrorNotification(HttpServletRequest request, - HttpServletResponse response) throws IOException { + protected void sendCriticalErrorNotification( + WrappedHttpServletRequest request, + WrappedHttpServletResponse response) throws IOException { criticalNotification( request, response, @@ -154,8 +157,13 @@ public class GAEApplicationServlet extends ApplicationServlet { } @Override - protected void service(HttpServletRequest request, - HttpServletResponse response) throws ServletException, IOException { + protected void service(HttpServletRequest unwrappedRequest, + HttpServletResponse unwrappedResponse) throws ServletException, + IOException { + WrappedHttpServletRequest request = new WrappedHttpServletRequest( + unwrappedRequest, getDeploymentConfiguration()); + WrappedHttpServletResponse response = new WrappedHttpServletResponse( + unwrappedResponse, getDeploymentConfiguration()); if (isCleanupRequest(request)) { cleanDatastore(); diff --git a/src/com/vaadin/terminal/gwt/server/JsonCodec.java b/src/com/vaadin/terminal/gwt/server/JsonCodec.java index d3a2ef56f8..8199bc6ada 100644 --- a/src/com/vaadin/terminal/gwt/server/JsonCodec.java +++ b/src/com/vaadin/terminal/gwt/server/JsonCodec.java @@ -9,10 +9,12 @@ import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.io.Serializable; import java.lang.reflect.Array; +import java.lang.reflect.GenericArrayType; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.lang.reflect.WildcardType; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -27,9 +29,9 @@ import java.util.Set; import com.vaadin.external.json.JSONArray; import com.vaadin.external.json.JSONException; import com.vaadin.external.json.JSONObject; -import com.vaadin.terminal.gwt.client.Connector; +import com.vaadin.shared.Connector; +import com.vaadin.shared.communication.UidlValue; import com.vaadin.terminal.gwt.client.communication.JsonEncoder; -import com.vaadin.terminal.gwt.client.communication.UidlValue; import com.vaadin.ui.Component; import com.vaadin.ui.ConnectorTracker; @@ -100,8 +102,10 @@ public class JsonCodec implements Serializable { private static Class<?> getClassForType(Type type) { if (type instanceof ParameterizedType) { return (Class<?>) (((ParameterizedType) type).getRawType()); - } else { + } else if (type instanceof Class<?>) { return (Class<?>) type; + } else { + return null; } } @@ -138,7 +142,13 @@ public class JsonCodec implements Serializable { && ((Class<?>) targetType).isArray()) { // Legacy Object[] and String[] handled elsewhere, this takes care // of generic arrays - return decodeArray((Class<?>) targetType, (JSONArray) value, + Class<?> componentType = ((Class<?>) targetType).getComponentType(); + return decodeArray(componentType, (JSONArray) value, + connectorTracker); + } else if (targetType instanceof GenericArrayType) { + Type componentType = ((GenericArrayType) targetType) + .getGenericComponentType(); + return decodeArray(componentType, (JSONArray) value, connectorTracker); } else if (targetType == JSONObject.class || targetType == JSONArray.class) { @@ -149,10 +159,10 @@ public class JsonCodec implements Serializable { } } - private static Object decodeArray(Class<?> targetType, JSONArray value, + private static Object decodeArray(Type componentType, JSONArray value, ConnectorTracker connectorTracker) throws JSONException { - Class<?> componentType = targetType.getComponentType(); - Object array = Array.newInstance(componentType, value.length()); + Class<?> componentClass = getClassForType(componentType); + Object array = Array.newInstance(componentClass, value.length()); for (int i = 0; i < value.length(); i++) { Object decodedValue = decodeInternalOrCustomType(componentType, value.get(i), connectorTracker); @@ -513,6 +523,11 @@ public class JsonCodec implements Serializable { throw new IllegalArgumentException("type must be defined"); } + if (valueType instanceof WildcardType) { + throw new IllegalStateException( + "Can not serialize type with wildcard: " + valueType); + } + if (null == value) { return encodeNull(); } @@ -540,7 +555,15 @@ public class JsonCodec implements Serializable { return jsonArray; } else if (valueType instanceof Class<?> && ((Class<?>) valueType).isArray()) { - JSONArray jsonArray = encodeArrayContents(value, connectorTracker); + JSONArray jsonArray = encodeArrayContents( + ((Class<?>) valueType).getComponentType(), value, + connectorTracker); + return jsonArray; + } else if (valueType instanceof GenericArrayType) { + Type componentType = ((GenericArrayType) valueType) + .getGenericComponentType(); + JSONArray jsonArray = encodeArrayContents(componentType, value, + connectorTracker); return jsonArray; } else if (value instanceof Map) { Object jsonMap = encodeMap(valueType, (Map<?, ?>) value, @@ -643,10 +666,10 @@ public class JsonCodec implements Serializable { return e.name(); } - private static JSONArray encodeArrayContents(Object array, - ConnectorTracker connectorTracker) throws JSONException { + private static JSONArray encodeArrayContents(Type componentType, + Object array, ConnectorTracker connectorTracker) + throws JSONException { JSONArray jsonArray = new JSONArray(); - Class<?> componentType = array.getClass().getComponentType(); for (int i = 0; i < Array.getLength(array); i++) { jsonArray.put(encode(Array.get(array, i), null, componentType, connectorTracker)); diff --git a/src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java b/src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java index 70ab452e4e..5a830ddb63 100644 --- a/src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java +++ b/src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java @@ -15,16 +15,11 @@ import java.util.Stack; import java.util.Vector; import java.util.logging.Logger; -import com.vaadin.Application; -import com.vaadin.terminal.ApplicationResource; -import com.vaadin.terminal.ExternalResource; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.PaintTarget; import com.vaadin.terminal.Resource; import com.vaadin.terminal.StreamVariable; -import com.vaadin.terminal.ThemeResource; import com.vaadin.terminal.VariableOwner; -import com.vaadin.terminal.gwt.client.Connector; import com.vaadin.ui.Alignment; import com.vaadin.ui.Component; import com.vaadin.ui.CustomLayout; @@ -104,6 +99,7 @@ public class JsonPaintTarget implements PaintTarget { cacheEnabled = cachingRequired; } + @Override public void startTag(String tagName) throws PaintException { startTag(tagName, false); } @@ -160,6 +156,7 @@ public class JsonPaintTarget implements PaintTarget { * if the paint operation failed. */ + @Override public void endTag(String tagName) throws PaintException { // In case of null data output nothing: if (tagName == null) { @@ -327,59 +324,46 @@ public class JsonPaintTarget implements PaintTarget { * */ + @Override public void addText(String str) throws PaintException { tag.addData("\"" + escapeJSON(str) + "\""); } + @Override public void addAttribute(String name, boolean value) throws PaintException { tag.addAttribute("\"" + name + "\":" + (value ? "true" : "false")); } - @SuppressWarnings("deprecation") + @Override public void addAttribute(String name, Resource value) throws PaintException { - - if (value instanceof ExternalResource) { - addAttribute(name, ((ExternalResource) value).getURL()); - - } else if (value instanceof ApplicationResource) { - final ApplicationResource r = (ApplicationResource) value; - final Application a = r.getApplication(); - if (a == null) { - throw new PaintException( - "Application not specified for resorce " - + value.getClass().getName()); - } - final String uri = a.getRelativeLocation(r); - addAttribute(name, uri); - - } else if (value instanceof ThemeResource) { - final String uri = "theme://" - + ((ThemeResource) value).getResourceId(); - addAttribute(name, uri); - } else { - throw new PaintException("Ajax adapter does not " - + "support resources of type: " - + value.getClass().getName()); + if (value == null) { + throw new NullPointerException(); } - + ResourceReference reference = ResourceReference.create(value); + addAttribute(name, reference.getURL()); } + @Override public void addAttribute(String name, int value) throws PaintException { tag.addAttribute("\"" + name + "\":" + String.valueOf(value)); } + @Override public void addAttribute(String name, long value) throws PaintException { tag.addAttribute("\"" + name + "\":" + String.valueOf(value)); } + @Override public void addAttribute(String name, float value) throws PaintException { tag.addAttribute("\"" + name + "\":" + String.valueOf(value)); } + @Override public void addAttribute(String name, double value) throws PaintException { tag.addAttribute("\"" + name + "\":" + String.valueOf(value)); } + @Override public void addAttribute(String name, String value) throws PaintException { // In case of null data output nothing: if ((value == null) || (name == null)) { @@ -399,12 +383,14 @@ public class JsonPaintTarget implements PaintTarget { } + @Override public void addAttribute(String name, Component value) throws PaintException { final String id = value.getConnectorId(); addAttribute(name, id); } + @Override public void addAttribute(String name, Map<?, ?> value) throws PaintException { @@ -442,6 +428,7 @@ public class JsonPaintTarget implements PaintTarget { tag.addAttribute(sb.toString()); } + @Override public void addAttribute(String name, Object[] values) { // In case of null data output nothing: if ((values == null) || (name == null)) { @@ -462,41 +449,49 @@ public class JsonPaintTarget implements PaintTarget { tag.addAttribute(buf.toString()); } + @Override public void addVariable(VariableOwner owner, String name, String value) throws PaintException { tag.addVariable(new StringVariable(owner, name, escapeJSON(value))); } + @Override public void addVariable(VariableOwner owner, String name, Component value) throws PaintException { tag.addVariable(new StringVariable(owner, name, value.getConnectorId())); } + @Override public void addVariable(VariableOwner owner, String name, int value) throws PaintException { tag.addVariable(new IntVariable(owner, name, value)); } + @Override public void addVariable(VariableOwner owner, String name, long value) throws PaintException { tag.addVariable(new LongVariable(owner, name, value)); } + @Override public void addVariable(VariableOwner owner, String name, float value) throws PaintException { tag.addVariable(new FloatVariable(owner, name, value)); } + @Override public void addVariable(VariableOwner owner, String name, double value) throws PaintException { tag.addVariable(new DoubleVariable(owner, name, value)); } + @Override public void addVariable(VariableOwner owner, String name, boolean value) throws PaintException { tag.addVariable(new BooleanVariable(owner, name, value)); } + @Override public void addVariable(VariableOwner owner, String name, String[] value) throws PaintException { tag.addVariable(new ArrayVariable(owner, name, value)); @@ -516,6 +511,7 @@ public class JsonPaintTarget implements PaintTarget { * if the paint operation failed. */ + @Override public void addUploadStreamVariable(VariableOwner owner, String name) throws PaintException { startTag("uploadstream"); @@ -536,6 +532,7 @@ public class JsonPaintTarget implements PaintTarget { * if the paint operation failed. */ + @Override public void addSection(String sectionTagName, String sectionData) throws PaintException { tag.addData("{\"" + sectionTagName + "\":\"" + escapeJSON(sectionData) @@ -551,6 +548,7 @@ public class JsonPaintTarget implements PaintTarget { * if the paint operation failed. */ + @Override public void addUIDL(String xml) throws PaintException { // Ensure that the target is open @@ -585,6 +583,7 @@ public class JsonPaintTarget implements PaintTarget { * String) */ + @Override public void addXMLSection(String sectionTagName, String sectionData, String namespace) throws PaintException { @@ -650,6 +649,7 @@ public class JsonPaintTarget implements PaintTarget { * .Paintable, java.lang.String) */ + @Override public PaintStatus startPaintable(Component connector, String tagName) throws PaintException { boolean topLevelPaintable = openPaintables.isEmpty(); @@ -676,6 +676,7 @@ public class JsonPaintTarget implements PaintTarget { return PaintStatus.PAINTING; } + @Override public void endPaintable(Component paintable) throws PaintException { getLogger().fine( "endPaintable for " + paintable.getClass().getName() + "@" @@ -699,6 +700,7 @@ public class JsonPaintTarget implements PaintTarget { * @see com.vaadin.terminal.PaintTarget#addCharacterData(java.lang.String ) */ + @Override public void addCharacterData(String text) throws PaintException { if (text != null) { tag.addData(text); @@ -968,6 +970,7 @@ public class JsonPaintTarget implements PaintTarget { return usedResources; } + @Override @SuppressWarnings("unchecked") public String getTag(ClientConnector clientConnector) { Class<? extends ClientConnector> clientConnectorClass = clientConnector @@ -990,10 +993,11 @@ public class JsonPaintTarget implements PaintTarget { return usedClientConnectors; } + @Override public void addVariable(VariableOwner owner, String name, StreamVariable value) throws PaintException { - String url = manager.getStreamVariableTargetUrl((Connector) owner, - name, value); + String url = manager.getStreamVariableTargetUrl( + (ClientConnector) owner, name, value); if (url != null) { addVariable(owner, name, url); } // else { //NOP this was just a cleanup by component } @@ -1006,6 +1010,7 @@ public class JsonPaintTarget implements PaintTarget { * @see com.vaadin.terminal.PaintTarget#isFullRepaint() */ + @Override public boolean isFullRepaint() { return !cacheEnabled; } diff --git a/src/com/vaadin/terminal/gwt/server/LegacyChangeVariablesInvocation.java b/src/com/vaadin/terminal/gwt/server/LegacyChangeVariablesInvocation.java index 42fa3ab5a5..9dba05d2c1 100644 --- a/src/com/vaadin/terminal/gwt/server/LegacyChangeVariablesInvocation.java +++ b/src/com/vaadin/terminal/gwt/server/LegacyChangeVariablesInvocation.java @@ -6,8 +6,8 @@ package com.vaadin.terminal.gwt.server; import java.util.HashMap; import java.util.Map; +import com.vaadin.shared.communication.MethodInvocation; import com.vaadin.terminal.gwt.client.ApplicationConnection; -import com.vaadin.terminal.gwt.client.communication.MethodInvocation; public class LegacyChangeVariablesInvocation extends MethodInvocation { private Map<String, Object> variableChanges = new HashMap<String, Object>(); diff --git a/src/com/vaadin/terminal/gwt/server/PortletApplicationContext2.java b/src/com/vaadin/terminal/gwt/server/PortletApplicationContext2.java index de4f918b75..70505ab5f9 100644 --- a/src/com/vaadin/terminal/gwt/server/PortletApplicationContext2.java +++ b/src/com/vaadin/terminal/gwt/server/PortletApplicationContext2.java @@ -28,13 +28,12 @@ import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import javax.portlet.ResourceRequest; import javax.portlet.ResourceResponse; -import javax.portlet.ResourceURL; import javax.portlet.StateAwareResponse; import javax.servlet.http.HttpSessionBindingListener; import javax.xml.namespace.QName; import com.vaadin.Application; -import com.vaadin.terminal.ApplicationResource; +import com.vaadin.terminal.ExternalResource; import com.vaadin.ui.Root; /** @@ -63,6 +62,7 @@ public class PortletApplicationContext2 extends AbstractWebApplicationContext { private final Map<String, String> sharedParameterActionNameMap = new HashMap<String, String>(); private final Map<String, String> sharedParameterActionValueMap = new HashMap<String, String>(); + @Override public File getBaseDirectory() { String resultPath = session.getPortletContext().getRealPath("/"); if (resultPath != null) { @@ -253,27 +253,6 @@ public class PortletApplicationContext2 extends AbstractWebApplicationContext { this.response = response; } - @Override - public String generateApplicationResourceURL(ApplicationResource resource, - String mapKey) { - if (response instanceof MimeResponse) { - ResourceURL resourceURL = ((MimeResponse) response) - .createResourceURL(); - final String filename = resource.getFilename(); - if (filename == null) { - resourceURL.setResourceID("APP/" + mapKey + "/"); - } else { - resourceURL.setResourceID("APP/" + mapKey + "/" - + urlEncode(filename)); - } - return resourceURL.toString(); - } else { - // in a background thread or otherwise outside a request - // TODO exception ?? - return null; - } - } - /** * Creates a new action URL. * @@ -324,9 +303,7 @@ public class PortletApplicationContext2 extends AbstractWebApplicationContext { if (actionUrl != null) { eventActionDestinationMap.put(actionKey, name); eventActionValueMap.put(actionKey, value); - throw new RuntimeException( - "Root.open has not yet been implemented"); - // root.open(new ExternalResource(actionUrl.toString())); + root.getPage().open(new ExternalResource(actionUrl.toString())); } else { // this should never happen as we already know the response is a // MimeResponse @@ -372,9 +349,7 @@ public class PortletApplicationContext2 extends AbstractWebApplicationContext { if (actionUrl != null) { sharedParameterActionNameMap.put(actionKey, name); sharedParameterActionValueMap.put(actionKey, value); - throw new RuntimeException( - "Root.open has not yet been implemented"); - // root.open(new ExternalResource(actionUrl.toString())); + root.getPage().open(new ExternalResource(actionUrl.toString())); } else { // this should never happen as we already know the response is a // MimeResponse diff --git a/src/com/vaadin/terminal/gwt/server/PortletCommunicationManager.java b/src/com/vaadin/terminal/gwt/server/PortletCommunicationManager.java index d3fbf4d988..edd970a31f 100644 --- a/src/com/vaadin/terminal/gwt/server/PortletCommunicationManager.java +++ b/src/com/vaadin/terminal/gwt/server/PortletCommunicationManager.java @@ -5,9 +5,6 @@ package com.vaadin.terminal.gwt.server; import java.io.IOException; import java.io.InputStream; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; import javax.portlet.MimeResponse; import javax.portlet.PortletContext; @@ -22,10 +19,9 @@ import com.vaadin.external.json.JSONException; import com.vaadin.external.json.JSONObject; import com.vaadin.terminal.DeploymentConfiguration; import com.vaadin.terminal.PaintException; -import com.vaadin.terminal.StreamVariable; import com.vaadin.terminal.WrappedRequest; import com.vaadin.terminal.WrappedResponse; -import com.vaadin.terminal.gwt.client.Connector; +import com.vaadin.terminal.gwt.client.ApplicationConfiguration; import com.vaadin.ui.Root; /** @@ -37,131 +33,10 @@ import com.vaadin.ui.Root; @SuppressWarnings("serial") public class PortletCommunicationManager extends AbstractCommunicationManager { - private transient MimeResponse currentMimeResponse; - public PortletCommunicationManager(Application application) { super(application); } - public void handleFileUpload(Root root, WrappedRequest request, - WrappedResponse response) throws IOException { - String contentType = request.getContentType(); - String name = request.getParameter("name"); - String ownerId = request.getParameter("rec-owner"); - Connector owner = getConnector(root, ownerId); - StreamVariable streamVariable = ownerToNameToStreamVariable.get(owner) - .get(name); - - if (contentType.contains("boundary")) { - doHandleSimpleMultipartFileUpload(request, response, - streamVariable, name, owner, - contentType.split("boundary=")[1]); - } else { - doHandleXhrFilePost(request, response, streamVariable, name, owner, - request.getContentLength()); - } - - } - - @Override - protected void postPaint(Root root) { - super.postPaint(root); - - Application application = root.getApplication(); - if (ownerToNameToStreamVariable != null) { - Iterator<Connector> iterator = ownerToNameToStreamVariable.keySet() - .iterator(); - while (iterator.hasNext()) { - Connector owner = iterator.next(); - if (getConnector(root, owner.getConnectorId()) == null) { - // Owner is no longer attached to the application - iterator.remove(); - } - } - } - } - - @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 { - setCurrentMimeReponse(response); - super.handleUidlRequest(request, response, callback, root); - 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; - - @Override - String getStreamVariableTargetUrl(Connector owner, String name, - StreamVariable value) { - if (ownerToNameToStreamVariable == null) { - ownerToNameToStreamVariable = new HashMap<Connector, Map<String, StreamVariable>>(); - } - Map<String, StreamVariable> nameToReceiver = ownerToNameToStreamVariable - .get(owner); - if (nameToReceiver == null) { - nameToReceiver = new HashMap<String, StreamVariable>(); - ownerToNameToStreamVariable.put(owner, nameToReceiver); - } - nameToReceiver.put(name, value); - ResourceURL resurl = createResourceURL(); - resurl.setResourceID("UPLOAD"); - resurl.setParameter("name", name); - resurl.setParameter("rec-owner", owner.getConnectorId()); - resurl.setProperty("name", name); - resurl.setProperty("rec-owner", owner.getConnectorId()); - 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 - .get(owner); - map.remove(name); - if (map.isEmpty()) { - ownerToNameToStreamVariable.remove(owner); - } - } - @Override protected BootstrapHandler createBootstrapHandler() { return new BootstrapHandler() { @@ -211,12 +86,14 @@ public class PortletCommunicationManager extends AbstractCommunicationManager { * some other things */ JSONObject defaults = super.getDefaultParameters(context); - defaults.put("usePortletURLs", true); - ResourceURL uidlUrlBase = getRenderResponse(context) + ResourceURL portletResourceUrl = getRenderResponse(context) .createResourceURL(); - uidlUrlBase.setResourceID("UIDL"); - defaults.put("portletUidlURLBase", uidlUrlBase.toString()); + portletResourceUrl + .setResourceID(AbstractApplicationPortlet.RESOURCE_URL_ID); + defaults.put(ApplicationConfiguration.PORTLET_RESOUCE_URL_BASE, + portletResourceUrl.toString()); + defaults.put("pathInfo", ""); return defaults; @@ -253,7 +130,7 @@ public class PortletCommunicationManager extends AbstractCommunicationManager { @Override protected String getInitialUIDL(WrappedRequest request, Root root) - throws PaintException { + throws PaintException, JSONException { return PortletCommunicationManager.this.getInitialUIDL(request, root); } diff --git a/src/com/vaadin/terminal/gwt/server/ResourceReference.java b/src/com/vaadin/terminal/gwt/server/ResourceReference.java index 56f2bed896..2104ad4b87 100644 --- a/src/com/vaadin/terminal/gwt/server/ResourceReference.java +++ b/src/com/vaadin/terminal/gwt/server/ResourceReference.java @@ -4,11 +4,11 @@ package com.vaadin.terminal.gwt.server; import com.vaadin.Application; +import com.vaadin.shared.communication.URLReference; import com.vaadin.terminal.ApplicationResource; import com.vaadin.terminal.ExternalResource; import com.vaadin.terminal.Resource; import com.vaadin.terminal.ThemeResource; -import com.vaadin.terminal.gwt.client.communication.URLReference; public class ResourceReference extends URLReference { @@ -48,4 +48,20 @@ public class ResourceReference extends URLReference { } } + + public static ResourceReference create(Resource resource) { + if (resource == null) { + return null; + } else { + return new ResourceReference(resource); + } + } + + public static Resource getResource(URLReference reference) { + if (reference == null) { + return null; + } + assert reference instanceof ResourceReference; + return ((ResourceReference) reference).getResource(); + } } diff --git a/src/com/vaadin/terminal/gwt/server/RestrictedRenderResponse.java b/src/com/vaadin/terminal/gwt/server/RestrictedRenderResponse.java index c4ef3fc8e5..9fdffbf9a5 100644 --- a/src/com/vaadin/terminal/gwt/server/RestrictedRenderResponse.java +++ b/src/com/vaadin/terminal/gwt/server/RestrictedRenderResponse.java @@ -34,112 +34,137 @@ class RestrictedRenderResponse implements RenderResponse, Serializable { this.response = response; } + @Override public void addProperty(String key, String value) { response.addProperty(key, value); } + @Override public PortletURL createActionURL() { return response.createActionURL(); } + @Override public PortletURL createRenderURL() { return response.createRenderURL(); } + @Override public String encodeURL(String path) { return response.encodeURL(path); } + @Override public void flushBuffer() throws IOException { // NOP // TODO throw? } + @Override public int getBufferSize() { return response.getBufferSize(); } + @Override public String getCharacterEncoding() { return response.getCharacterEncoding(); } + @Override public String getContentType() { return response.getContentType(); } + @Override public Locale getLocale() { return response.getLocale(); } + @Override public String getNamespace() { return response.getNamespace(); } + @Override public OutputStream getPortletOutputStream() throws IOException { // write forbidden return null; } + @Override public PrintWriter getWriter() throws IOException { // write forbidden return null; } + @Override public boolean isCommitted() { return response.isCommitted(); } + @Override public void reset() { // NOP // TODO throw? } + @Override public void resetBuffer() { // NOP // TODO throw? } + @Override public void setBufferSize(int size) { // NOP // TODO throw? } + @Override public void setContentType(String type) { // NOP // TODO throw? } + @Override public void setProperty(String key, String value) { response.setProperty(key, value); } + @Override public void setTitle(String title) { response.setTitle(title); } + @Override public void setNextPossiblePortletModes(Collection<PortletMode> portletModes) { // NOP // TODO throw? } + @Override public ResourceURL createResourceURL() { return response.createResourceURL(); } + @Override public CacheControl getCacheControl() { return response.getCacheControl(); } + @Override public void addProperty(Cookie cookie) { // NOP // TODO throw? } + @Override public void addProperty(String key, Element element) { // NOP // TODO throw? } + @Override public Element createElement(String tagName) throws DOMException { // NOP return null; diff --git a/src/com/vaadin/terminal/gwt/server/ServerRpcManager.java b/src/com/vaadin/terminal/gwt/server/ServerRpcManager.java index d9931a9610..1c7af82a36 100644 --- a/src/com/vaadin/terminal/gwt/server/ServerRpcManager.java +++ b/src/com/vaadin/terminal/gwt/server/ServerRpcManager.java @@ -12,7 +12,7 @@ import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; -import com.vaadin.terminal.gwt.client.Connector; +import com.vaadin.shared.Connector; /** * Server side RPC manager that handles RPC calls coming from the client. @@ -111,6 +111,7 @@ public class ServerRpcManager<T> implements RpcManager { * @param invocation * method invocation to perform */ + @Override public void applyInvocation(ServerRpcMethodInvocation invocation) throws RpcInvocationException { Method method = invocation.getMethod(); diff --git a/src/com/vaadin/terminal/gwt/server/ServerRpcMethodInvocation.java b/src/com/vaadin/terminal/gwt/server/ServerRpcMethodInvocation.java index 95565c4379..ff81a27596 100644 --- a/src/com/vaadin/terminal/gwt/server/ServerRpcMethodInvocation.java +++ b/src/com/vaadin/terminal/gwt/server/ServerRpcMethodInvocation.java @@ -7,8 +7,8 @@ import java.lang.reflect.Method; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import com.vaadin.terminal.gwt.client.communication.MethodInvocation; -import com.vaadin.terminal.gwt.client.communication.ServerRpc; +import com.vaadin.shared.communication.MethodInvocation; +import com.vaadin.shared.communication.ServerRpc; public class ServerRpcMethodInvocation extends MethodInvocation { diff --git a/src/com/vaadin/terminal/gwt/server/ServletPortletHelper.java b/src/com/vaadin/terminal/gwt/server/ServletPortletHelper.java index 9b1e60e621..b2b962b0fd 100644 --- a/src/com/vaadin/terminal/gwt/server/ServletPortletHelper.java +++ b/src/com/vaadin/terminal/gwt/server/ServletPortletHelper.java @@ -3,6 +3,9 @@ package com.vaadin.terminal.gwt.server; import java.io.Serializable; import com.vaadin.Application; +import com.vaadin.terminal.DeploymentConfiguration; +import com.vaadin.terminal.WrappedRequest; +import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.ui.Root; /* @@ -10,6 +13,8 @@ import com.vaadin.ui.Root; */ class ServletPortletHelper implements Serializable { + public static final String UPLOAD_URL_PREFIX = "APP/UPLOAD/"; + public static class ApplicationClassException extends Exception { public ApplicationClassException(String message, Throwable cause) { @@ -22,8 +27,15 @@ class ServletPortletHelper implements Serializable { } static Class<? extends Application> getApplicationClass( - String applicationParameter, String rootParameter, - ClassLoader classLoader) throws ApplicationClassException { + DeploymentConfiguration deploymentConfiguration) + throws ApplicationClassException { + String applicationParameter = deploymentConfiguration + .getInitParameters().getProperty("application"); + String rootParameter = deploymentConfiguration + .getInitParameters().getProperty( + Application.ROOT_PARAMETER); + ClassLoader classLoader = deploymentConfiguration.getClassLoader(); + if (applicationParameter == null) { // Validate the parameter value @@ -70,4 +82,40 @@ class ServletPortletHelper implements Serializable { + " doesn't have a public no-args constructor"); } } + + private static boolean hasPathPrefix(WrappedRequest request, String prefix) { + String pathInfo = request.getRequestPathInfo(); + + if (pathInfo == null) { + return false; + } + + if (!prefix.startsWith("/")) { + prefix = '/' + prefix; + } + + if (pathInfo.startsWith(prefix)) { + return true; + } + + return false; + } + + public static boolean isFileUploadRequest(WrappedRequest request) { + return hasPathPrefix(request, UPLOAD_URL_PREFIX); + } + + public static boolean isConnectorResourceRequest(WrappedRequest request) { + return hasPathPrefix(request, + ApplicationConnection.CONNECTOR_RESOURCE_PREFIX + "/"); + } + + public static boolean isUIDLRequest(WrappedRequest request) { + return hasPathPrefix(request, ApplicationConnection.UIDL_REQUEST_PATH); + } + + public static boolean isApplicationResourceRequest(WrappedRequest request) { + return hasPathPrefix(request, ApplicationConnection.APP_REQUEST_PATH); + } + } diff --git a/src/com/vaadin/terminal/gwt/server/StreamingErrorEventImpl.java b/src/com/vaadin/terminal/gwt/server/StreamingErrorEventImpl.java index 7418867fc8..6ab3df2789 100644 --- a/src/com/vaadin/terminal/gwt/server/StreamingErrorEventImpl.java +++ b/src/com/vaadin/terminal/gwt/server/StreamingErrorEventImpl.java @@ -17,6 +17,7 @@ final class StreamingErrorEventImpl extends AbstractStreamingEvent implements this.exception = exception; } + @Override public final Exception getException() { return exception; } diff --git a/src/com/vaadin/terminal/gwt/server/StreamingStartEventImpl.java b/src/com/vaadin/terminal/gwt/server/StreamingStartEventImpl.java index 6a7844abd0..274d05e111 100644 --- a/src/com/vaadin/terminal/gwt/server/StreamingStartEventImpl.java +++ b/src/com/vaadin/terminal/gwt/server/StreamingStartEventImpl.java @@ -16,6 +16,7 @@ final class StreamingStartEventImpl extends AbstractStreamingEvent implements super(filename, type, contentLength, 0); } + @Override public void disposeStreamVariable() { disposed = true; } diff --git a/src/com/vaadin/terminal/gwt/server/UnsupportedBrowserHandler.java b/src/com/vaadin/terminal/gwt/server/UnsupportedBrowserHandler.java index 334a7acf8d..5248af595e 100644 --- a/src/com/vaadin/terminal/gwt/server/UnsupportedBrowserHandler.java +++ b/src/com/vaadin/terminal/gwt/server/UnsupportedBrowserHandler.java @@ -26,6 +26,7 @@ public class UnsupportedBrowserHandler implements RequestHandler { /** Cookie used to ignore browser checks */ public static final String FORCE_LOAD_COOKIE = "vaadinforceload=1"; + @Override public boolean handleRequest(Application application, WrappedRequest request, WrappedResponse response) throws IOException { diff --git a/src/com/vaadin/terminal/gwt/server/WebApplicationContext.java b/src/com/vaadin/terminal/gwt/server/WebApplicationContext.java index 8a1ea792f5..36c08b2ed9 100644 --- a/src/com/vaadin/terminal/gwt/server/WebApplicationContext.java +++ b/src/com/vaadin/terminal/gwt/server/WebApplicationContext.java @@ -111,6 +111,7 @@ public class WebApplicationContext extends AbstractWebApplicationContext { * * @see com.vaadin.service.ApplicationContext#getBaseDirectory() */ + @Override public File getBaseDirectory() { final String realPath = ApplicationServlet.getResourcePath( session.getServletContext(), "/"); diff --git a/src/com/vaadin/terminal/gwt/server/WebBrowser.java b/src/com/vaadin/terminal/gwt/server/WebBrowser.java index 38b5409594..4b92b12b66 100644 --- a/src/com/vaadin/terminal/gwt/server/WebBrowser.java +++ b/src/com/vaadin/terminal/gwt/server/WebBrowser.java @@ -7,9 +7,9 @@ package com.vaadin.terminal.gwt.server; import java.util.Date; import java.util.Locale; +import com.vaadin.shared.VBrowserDetails; import com.vaadin.terminal.Terminal; import com.vaadin.terminal.WrappedRequest; -import com.vaadin.terminal.gwt.client.VBrowserDetails; /** * Class that provides information about the web browser the user is using. @@ -42,6 +42,7 @@ public class WebBrowser implements Terminal { * @return Always returns null. */ + @Override public String getDefaultTheme() { return null; } @@ -52,6 +53,7 @@ public class WebBrowser implements Terminal { * @see com.vaadin.terminal.Terminal#getScreenHeight() */ + @Override public int getScreenHeight() { return screenHeight; } @@ -62,6 +64,7 @@ public class WebBrowser implements Terminal { * @see com.vaadin.terminal.Terminal#getScreenWidth() */ + @Override public int getScreenWidth() { return screenWidth; } diff --git a/src/com/vaadin/terminal/gwt/server/WrappedHttpServletRequest.java b/src/com/vaadin/terminal/gwt/server/WrappedHttpServletRequest.java index 0774a79990..cf58f398af 100644 --- a/src/com/vaadin/terminal/gwt/server/WrappedHttpServletRequest.java +++ b/src/com/vaadin/terminal/gwt/server/WrappedHttpServletRequest.java @@ -41,18 +41,22 @@ public class WrappedHttpServletRequest extends HttpServletRequestWrapper this.deploymentConfiguration = deploymentConfiguration; } + @Override public String getRequestPathInfo() { return getPathInfo(); } + @Override public int getSessionMaxInactiveInterval() { return getSession().getMaxInactiveInterval(); } + @Override public Object getSessionAttribute(String name) { return getSession().getAttribute(name); } + @Override public void setSessionAttribute(String name, Object attribute) { getSession().setAttribute(name, attribute); } @@ -66,20 +70,25 @@ public class WrappedHttpServletRequest extends HttpServletRequestWrapper return this; } + @Override public DeploymentConfiguration getDeploymentConfiguration() { return deploymentConfiguration; } + @Override public BrowserDetails getBrowserDetails() { return new BrowserDetails() { + @Override public String getUriFragment() { return null; } + @Override public String getWindowName() { return null; } + @Override public WebBrowser getWebBrowser() { WebApplicationContext context = (WebApplicationContext) Application .getCurrent().getContext(); diff --git a/src/com/vaadin/terminal/gwt/server/WrappedHttpServletResponse.java b/src/com/vaadin/terminal/gwt/server/WrappedHttpServletResponse.java index 14a391b21f..32b2f352a8 100644 --- a/src/com/vaadin/terminal/gwt/server/WrappedHttpServletResponse.java +++ b/src/com/vaadin/terminal/gwt/server/WrappedHttpServletResponse.java @@ -47,6 +47,7 @@ public class WrappedHttpServletResponse extends HttpServletResponseWrapper return this; } + @Override public void setCacheTime(long milliseconds) { doSetCacheTime(this, milliseconds); } @@ -67,6 +68,7 @@ public class WrappedHttpServletResponse extends HttpServletResponseWrapper } } + @Override public DeploymentConfiguration getDeploymentConfiguration() { return deploymentConfiguration; } diff --git a/src/com/vaadin/terminal/gwt/server/WrappedPortletRequest.java b/src/com/vaadin/terminal/gwt/server/WrappedPortletRequest.java index 85d8d5c69c..a3fa172034 100644 --- a/src/com/vaadin/terminal/gwt/server/WrappedPortletRequest.java +++ b/src/com/vaadin/terminal/gwt/server/WrappedPortletRequest.java @@ -17,6 +17,7 @@ import com.vaadin.Application; import com.vaadin.terminal.CombinedRequest; import com.vaadin.terminal.DeploymentConfiguration; import com.vaadin.terminal.WrappedRequest; +import com.vaadin.terminal.gwt.client.ApplicationConnection; /** * Wrapper for {@link PortletRequest} and its subclasses. @@ -46,10 +47,12 @@ public class WrappedPortletRequest implements WrappedRequest { this.deploymentConfiguration = deploymentConfiguration; } + @Override public Object getAttribute(String name) { return request.getAttribute(name); } + @Override public int getContentLength() { try { return ((ClientDataRequest) request).getContentLength(); @@ -59,6 +62,7 @@ public class WrappedPortletRequest implements WrappedRequest { } } + @Override public InputStream getInputStream() throws IOException { try { return ((ClientDataRequest) request).getPortletInputStream(); @@ -68,34 +72,48 @@ public class WrappedPortletRequest implements WrappedRequest { } } + @Override public String getParameter(String name) { return request.getParameter(name); } + @Override public Map<String, String[]> getParameterMap() { return request.getParameterMap(); } + @Override public void setAttribute(String name, Object o) { request.setAttribute(name, o); } + @Override public String getRequestPathInfo() { if (request instanceof ResourceRequest) { - return ((ResourceRequest) request).getResourceID(); + ResourceRequest resourceRequest = (ResourceRequest) request; + String resourceID = resourceRequest.getResourceID(); + if (AbstractApplicationPortlet.RESOURCE_URL_ID.equals(resourceID)) { + String resourcePath = resourceRequest + .getParameter(ApplicationConnection.V_RESOURCE_PATH); + return resourcePath; + } + return resourceID; } else { return null; } } + @Override public int getSessionMaxInactiveInterval() { return request.getPortletSession().getMaxInactiveInterval(); } + @Override public Object getSessionAttribute(String name) { return request.getPortletSession().getAttribute(name); } + @Override public void setSessionAttribute(String name, Object attribute) { request.getPortletSession().setAttribute(name, attribute); } @@ -109,6 +127,7 @@ public class WrappedPortletRequest implements WrappedRequest { return request; } + @Override public String getContentType() { try { return ((ResourceRequest) request).getContentType(); @@ -118,16 +137,20 @@ public class WrappedPortletRequest implements WrappedRequest { } } + @Override public BrowserDetails getBrowserDetails() { return new BrowserDetails() { + @Override public String getUriFragment() { return null; } + @Override public String getWindowName() { return null; } + @Override public WebBrowser getWebBrowser() { PortletApplicationContext2 context = (PortletApplicationContext2) Application .getCurrent().getContext(); @@ -136,18 +159,22 @@ public class WrappedPortletRequest implements WrappedRequest { }; } + @Override public Locale getLocale() { return request.getLocale(); } + @Override public String getRemoteAddr() { return null; } + @Override public boolean isSecure() { return request.isSecure(); } + @Override public String getHeader(String string) { return null; } @@ -164,6 +191,7 @@ public class WrappedPortletRequest implements WrappedRequest { return request.getPortalContext().getProperty(name); } + @Override public DeploymentConfiguration getDeploymentConfiguration() { return deploymentConfiguration; } diff --git a/src/com/vaadin/terminal/gwt/server/WrappedPortletResponse.java b/src/com/vaadin/terminal/gwt/server/WrappedPortletResponse.java index 8824396352..f7ecf26f3c 100644 --- a/src/com/vaadin/terminal/gwt/server/WrappedPortletResponse.java +++ b/src/com/vaadin/terminal/gwt/server/WrappedPortletResponse.java @@ -53,6 +53,7 @@ public class WrappedPortletResponse implements WrappedResponse { this.deploymentConfiguration = deploymentConfiguration; } + @Override public OutputStream getOutputStream() throws IOException { return ((MimeResponse) response).getPortletOutputStream(); } @@ -66,36 +67,44 @@ public class WrappedPortletResponse implements WrappedResponse { return response; } + @Override public void setContentType(String type) { ((MimeResponse) response).setContentType(type); } + @Override public PrintWriter getWriter() throws IOException { return ((MimeResponse) response).getWriter(); } + @Override public void setStatus(int responseStatus) { response.setProperty(ResourceResponse.HTTP_STATUS_CODE, Integer.toString(responseStatus)); } + @Override public void setHeader(String name, String value) { response.setProperty(name, value); } + @Override public void setDateHeader(String name, long timestamp) { response.setProperty(name, HTTP_DATE_FORMAT.format(new Date(timestamp))); } + @Override public void setCacheTime(long milliseconds) { WrappedHttpServletResponse.doSetCacheTime(this, milliseconds); } + @Override public void sendError(int errorCode, String message) throws IOException { setStatus(errorCode); getWriter().write(message); } + @Override public DeploymentConfiguration getDeploymentConfiguration() { return deploymentConfiguration; } diff --git a/src/com/vaadin/terminal/gwt/widgetsetutils/AcceptCriteriaFactoryGenerator.java b/src/com/vaadin/terminal/gwt/widgetsetutils/AcceptCriteriaFactoryGenerator.java index 6d90a51761..e5e2ee1f2c 100644 --- a/src/com/vaadin/terminal/gwt/widgetsetutils/AcceptCriteriaFactoryGenerator.java +++ b/src/com/vaadin/terminal/gwt/widgetsetutils/AcceptCriteriaFactoryGenerator.java @@ -15,7 +15,7 @@ import com.google.gwt.core.ext.typeinfo.JClassType; 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.ui.dd.AcceptCriterion; +import com.vaadin.shared.ui.dd.AcceptCriterion; import com.vaadin.terminal.gwt.client.ui.dd.VAcceptCriterion; import com.vaadin.terminal.gwt.client.ui.dd.VAcceptCriterionFactory; diff --git a/src/com/vaadin/terminal/gwt/widgetsetutils/ClassPathExplorer.java b/src/com/vaadin/terminal/gwt/widgetsetutils/ClassPathExplorer.java index 1c5b736492..6ee30183c1 100644 --- a/src/com/vaadin/terminal/gwt/widgetsetutils/ClassPathExplorer.java +++ b/src/com/vaadin/terminal/gwt/widgetsetutils/ClassPathExplorer.java @@ -49,6 +49,7 @@ public class ClassPathExplorer { * File filter that only accepts directories. */ private final static FileFilter DIRECTORIES_ONLY = new FileFilter() { + @Override public boolean accept(File f) { if (f.exists() && f.isDirectory()) { return true; diff --git a/src/com/vaadin/terminal/gwt/widgetsetutils/CustomWidgetMapGenerator.java b/src/com/vaadin/terminal/gwt/widgetsetutils/CustomWidgetMapGenerator.java index f0f3df20b0..89045c63b2 100644 --- a/src/com/vaadin/terminal/gwt/widgetsetutils/CustomWidgetMapGenerator.java +++ b/src/com/vaadin/terminal/gwt/widgetsetutils/CustomWidgetMapGenerator.java @@ -6,10 +6,10 @@ package com.vaadin.terminal.gwt.widgetsetutils; import java.util.Collection; import java.util.HashSet; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.Connect.LoadStyle; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ServerConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; -import com.vaadin.terminal.gwt.client.ui.Connect.LoadStyle; /** * An abstract helper class that can be used to easily build a widgetset with diff --git a/src/com/vaadin/terminal/gwt/widgetsetutils/EagerWidgetMapGenerator.java b/src/com/vaadin/terminal/gwt/widgetsetutils/EagerWidgetMapGenerator.java index 084e1c3857..4ff0592ede 100644 --- a/src/com/vaadin/terminal/gwt/widgetsetutils/EagerWidgetMapGenerator.java +++ b/src/com/vaadin/terminal/gwt/widgetsetutils/EagerWidgetMapGenerator.java @@ -3,8 +3,8 @@ */ package com.vaadin.terminal.gwt.widgetsetutils; +import com.vaadin.shared.ui.Connect.LoadStyle; import com.vaadin.terminal.gwt.client.ServerConnector; -import com.vaadin.terminal.gwt.client.ui.Connect.LoadStyle; /** * WidgetMap generator that builds a widgetset that packs all included widgets diff --git a/src/com/vaadin/terminal/gwt/widgetsetutils/GeneratedRpcMethodProviderGenerator.java b/src/com/vaadin/terminal/gwt/widgetsetutils/GeneratedRpcMethodProviderGenerator.java index b1d69b178b..e11a12a3b5 100644 --- a/src/com/vaadin/terminal/gwt/widgetsetutils/GeneratedRpcMethodProviderGenerator.java +++ b/src/com/vaadin/terminal/gwt/widgetsetutils/GeneratedRpcMethodProviderGenerator.java @@ -21,7 +21,7 @@ import com.google.gwt.core.ext.typeinfo.JType; 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.communication.ClientRpc; +import com.vaadin.shared.communication.ClientRpc; import com.vaadin.terminal.gwt.client.communication.GeneratedRpcMethodProvider; import com.vaadin.terminal.gwt.client.communication.RpcManager; import com.vaadin.terminal.gwt.client.communication.RpcMethod; diff --git a/src/com/vaadin/terminal/gwt/widgetsetutils/LazyWidgetMapGenerator.java b/src/com/vaadin/terminal/gwt/widgetsetutils/LazyWidgetMapGenerator.java index f8366beb46..28f3dab482 100644 --- a/src/com/vaadin/terminal/gwt/widgetsetutils/LazyWidgetMapGenerator.java +++ b/src/com/vaadin/terminal/gwt/widgetsetutils/LazyWidgetMapGenerator.java @@ -3,8 +3,8 @@ */ package com.vaadin.terminal.gwt.widgetsetutils; +import com.vaadin.shared.ui.Connect.LoadStyle; import com.vaadin.terminal.gwt.client.ServerConnector; -import com.vaadin.terminal.gwt.client.ui.Connect.LoadStyle; /** * WidgetMap generator that builds a widgetset that optimizes the transferred diff --git a/src/com/vaadin/terminal/gwt/widgetsetutils/RpcProxyCreatorGenerator.java b/src/com/vaadin/terminal/gwt/widgetsetutils/RpcProxyCreatorGenerator.java index 040715fccf..8a6c374187 100644 --- a/src/com/vaadin/terminal/gwt/widgetsetutils/RpcProxyCreatorGenerator.java +++ b/src/com/vaadin/terminal/gwt/widgetsetutils/RpcProxyCreatorGenerator.java @@ -16,10 +16,10 @@ import com.google.gwt.core.ext.typeinfo.JClassType; 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.shared.communication.ServerRpc; import com.vaadin.terminal.gwt.client.ServerConnector; import com.vaadin.terminal.gwt.client.communication.InitializableServerRpc; import com.vaadin.terminal.gwt.client.communication.RpcProxy.RpcProxyCreator; -import com.vaadin.terminal.gwt.client.communication.ServerRpc; public class RpcProxyCreatorGenerator extends Generator { @@ -31,13 +31,13 @@ public class RpcProxyCreatorGenerator extends Generator { assert (typeOracle != null); JClassType requestedType = typeOracle.findType(requestedClassName); - String packageName = requestedType.getPackage().getName(); - String className = requestedType.getSimpleSourceName() + "Impl"; if (requestedType == null) { logger.log(TreeLogger.ERROR, "Unable to find metadata for type '" + requestedClassName + "'", null); throw new UnableToCompleteException(); } + String packageName = requestedType.getPackage().getName(); + String className = requestedType.getSimpleSourceName() + "Impl"; createType(logger, ctx, packageName, className); return packageName + "." + className; diff --git a/src/com/vaadin/terminal/gwt/widgetsetutils/RpcProxyGenerator.java b/src/com/vaadin/terminal/gwt/widgetsetutils/RpcProxyGenerator.java index d9bc8bc832..7a908e5b4d 100644 --- a/src/com/vaadin/terminal/gwt/widgetsetutils/RpcProxyGenerator.java +++ b/src/com/vaadin/terminal/gwt/widgetsetutils/RpcProxyGenerator.java @@ -17,11 +17,11 @@ import com.google.gwt.core.ext.typeinfo.JParameter; 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.shared.communication.MethodInvocation; +import com.vaadin.shared.communication.ServerRpc; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.ServerConnector; import com.vaadin.terminal.gwt.client.communication.InitializableServerRpc; -import com.vaadin.terminal.gwt.client.communication.MethodInvocation; -import com.vaadin.terminal.gwt.client.communication.ServerRpc; /** * GWT generator that creates client side proxy classes for making RPC calls diff --git a/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerMapGenerator.java b/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerMapGenerator.java index 5e151323a0..3f1ad24066 100644 --- a/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerMapGenerator.java +++ b/src/com/vaadin/terminal/gwt/widgetsetutils/SerializerMapGenerator.java @@ -22,17 +22,17 @@ import com.google.gwt.core.ext.typeinfo.JClassType; import com.google.gwt.core.ext.typeinfo.JMethod; import com.google.gwt.core.ext.typeinfo.JParameterizedType; 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.json.client.JSONObject; +import com.google.gwt.json.client.JSONValue; import com.google.gwt.user.rebind.ClassSourceFileComposerFactory; import com.google.gwt.user.rebind.SourceWriter; +import com.vaadin.shared.communication.ClientRpc; +import com.vaadin.shared.communication.ServerRpc; +import com.vaadin.shared.communication.SharedState; import com.vaadin.terminal.gwt.client.ApplicationConnection; -import com.vaadin.terminal.gwt.client.ConnectorMap; -import com.vaadin.terminal.gwt.client.communication.ClientRpc; import com.vaadin.terminal.gwt.client.communication.JSONSerializer; import com.vaadin.terminal.gwt.client.communication.SerializerMap; -import com.vaadin.terminal.gwt.client.communication.ServerRpc; -import com.vaadin.terminal.gwt.client.communication.SharedState; /** * GWT generator that creates a {@link SerializerMap} implementation (mapper @@ -43,6 +43,7 @@ import com.vaadin.terminal.gwt.client.communication.SharedState; */ public class SerializerMapGenerator extends Generator { + private static final String FAIL_IF_NOT_SERIALIZABLE = "vFailIfNotSerializable"; private String packageName; private String className; @@ -54,7 +55,7 @@ public class SerializerMapGenerator extends Generator { TypeOracle typeOracle = context.getTypeOracle(); Set<JClassType> typesNeedingSerializers = findTypesNeedingSerializers( typeOracle, logger); - warnIfNotJavaSerializable(typesNeedingSerializers, typeOracle, + checkForUnserializableTypes(typesNeedingSerializers, typeOracle, logger); Set<JClassType> typesWithExistingSerializers = findTypesWithExistingSerializers( typeOracle, logger); @@ -90,10 +91,11 @@ public class SerializerMapGenerator extends Generator { * @param typesNeedingSerializers * @param typeOracle * @param logger + * @throws UnableToCompleteException */ - private void warnIfNotJavaSerializable( + private void checkForUnserializableTypes( Set<JClassType> typesNeedingSerializers, TypeOracle typeOracle, - TreeLogger logger) { + TreeLogger logger) throws UnableToCompleteException { JClassType javaSerializable = typeOracle.findType(Serializable.class .getName()); for (JClassType type : typesNeedingSerializers) { @@ -103,33 +105,59 @@ public class SerializerMapGenerator extends Generator { } boolean serializable = type.isAssignableTo(javaSerializable); if (!serializable) { + boolean abortCompile = "true".equals(System + .getProperty(FAIL_IF_NOT_SERIALIZABLE)); logger.log( - Type.ERROR, + abortCompile ? Type.ERROR : Type.WARN, type + " is used in RPC or shared state but does not implement " + Serializable.class.getName() - + ". Communication will work but the Application on server side cannot be serialized if it refers to objects of this type."); + + ". Communication will work but the Application on server side cannot be serialized if it refers to objects of this type. " + + "If the system property " + + FAIL_IF_NOT_SERIALIZABLE + + " is set to \"true\", this causes the compilation to fail instead of just emitting a warning."); + if (abortCompile) { + throw new UnableToCompleteException(); + } } } } private Set<JClassType> findTypesWithExistingSerializers( - TypeOracle typeOracle, TreeLogger logger) { + TypeOracle typeOracle, TreeLogger logger) + throws UnableToCompleteException { JClassType serializerInterface = typeOracle .findType(JSONSerializer.class.getName()); + JType[] deserializeParamTypes = new JType[] { + typeOracle + .findType(com.vaadin.terminal.gwt.client.communication.Type.class + .getName()), + typeOracle.findType(JSONValue.class.getName()), + typeOracle.findType(ApplicationConnection.class.getName()) }; + String deserializeMethodName = "deserialize"; + try { + serializerInterface.getMethod(deserializeMethodName, + deserializeParamTypes); + } catch (NotFoundException e) { + logger.log(Type.ERROR, "Could not find " + deserializeMethodName + + " in " + serializerInterface); + throw new UnableToCompleteException(); + } + Set<JClassType> types = new HashSet<JClassType>(); for (JClassType serializer : serializerInterface.getSubtypes()) { - JType[] deserializeParamTypes = new JType[] { - typeOracle.findType(JSONObject.class.getName()), - typeOracle.findType(ConnectorMap.class.getName()), - typeOracle.findType(ApplicationConnection.class.getName()) }; - JMethod deserializeMethod = serializer.findMethod("deserialize", - deserializeParamTypes); + JMethod deserializeMethod = serializer.findMethod( + deserializeMethodName, deserializeParamTypes); if (deserializeMethod == null) { + logger.log(Type.DEBUG, "Could not find " + + deserializeMethodName + " in " + serializer); continue; } + JType returnType = deserializeMethod.getReturnType(); + logger.log(Type.DEBUG, "Found " + deserializeMethodName + + " with return type " + returnType + " in " + serializer); - types.add(deserializeMethod.getReturnType().isClass()); + types.add(returnType.isClass()); } return types; } diff --git a/src/com/vaadin/terminal/gwt/widgetsetutils/WidgetMapGenerator.java b/src/com/vaadin/terminal/gwt/widgetsetutils/WidgetMapGenerator.java index b264a9c7fe..0d062ec4ff 100644 --- a/src/com/vaadin/terminal/gwt/widgetsetutils/WidgetMapGenerator.java +++ b/src/com/vaadin/terminal/gwt/widgetsetutils/WidgetMapGenerator.java @@ -22,10 +22,10 @@ import com.google.gwt.core.ext.typeinfo.JClassType; 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.Connector; +import com.vaadin.shared.Connector; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.Connect.LoadStyle; import com.vaadin.terminal.gwt.client.ServerConnector; -import com.vaadin.terminal.gwt.client.ui.Connect; -import com.vaadin.terminal.gwt.client.ui.Connect.LoadStyle; import com.vaadin.terminal.gwt.client.ui.UnknownComponentConnector; import com.vaadin.terminal.gwt.client.ui.root.RootConnector; import com.vaadin.terminal.gwt.server.ClientConnector; diff --git a/src/com/vaadin/tools/WidgetsetCompiler.java b/src/com/vaadin/tools/WidgetsetCompiler.java index 407f0e2387..ecc1946e60 100644 --- a/src/com/vaadin/tools/WidgetsetCompiler.java +++ b/src/com/vaadin/tools/WidgetsetCompiler.java @@ -31,7 +31,8 @@ import com.vaadin.terminal.gwt.widgetsetutils.WidgetSetBuilder; * included in the classpath, as well as the gwt-dev-[platform].jar and other * relevant JARs. * - * @deprecated with Java 6, can use com.google.gwt.dev.Compiler directly (also in Eclipse plug-in etc.) + * @deprecated with Java 6, can use com.google.gwt.dev.Compiler directly (also + * in Eclipse plug-in etc.) */ @Deprecated public class WidgetsetCompiler { @@ -50,6 +51,7 @@ public class WidgetsetCompiler { // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6316197) Runnable runCompiler = new Runnable() { + @Override public void run() { try { // GWTCompiler.main(args); diff --git a/src/com/vaadin/ui/AbsoluteLayout.java b/src/com/vaadin/ui/AbsoluteLayout.java index 7d8c402fc9..1c84ca2865 100644 --- a/src/com/vaadin/ui/AbsoluteLayout.java +++ b/src/com/vaadin/ui/AbsoluteLayout.java @@ -12,12 +12,12 @@ 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.shared.Connector; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.absolutelayout.AbsoluteLayoutServerRpc; +import com.vaadin.shared.ui.absolutelayout.AbsoluteLayoutState; import com.vaadin.terminal.Sizeable; -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.absolutelayout.AbsoluteLayoutServerRpc; -import com.vaadin.terminal.gwt.client.ui.absolutelayout.AbsoluteLayoutState; /** * AbsoluteLayout is a layout implementation that mimics html absolute @@ -30,6 +30,7 @@ public class AbsoluteLayout extends AbstractLayout implements private AbsoluteLayoutServerRpc rpc = new AbsoluteLayoutServerRpc() { + @Override public void layoutClick(MouseEventDetails mouseDetails, Connector clickedConnector) { fireEvent(LayoutClickEvent.createEvent(AbsoluteLayout.this, @@ -56,6 +57,7 @@ public class AbsoluteLayout extends AbstractLayout implements * Gets an iterator for going through all components enclosed in the * absolute layout. */ + @Override public Iterator<Component> getComponentIterator() { return componentToCoordinates.keySet().iterator(); } @@ -66,6 +68,7 @@ public class AbsoluteLayout extends AbstractLayout implements * * @return the number of contained components */ + @Override public int getComponentCount() { return componentToCoordinates.size(); } @@ -74,6 +77,7 @@ public class AbsoluteLayout extends AbstractLayout implements * Replaces one component with another one. The new component inherits the * old components position. */ + @Override public void replaceComponent(Component oldComponent, Component newComponent) { ComponentPosition position = getPosition(oldComponent); removeComponent(oldComponent); @@ -612,12 +616,14 @@ public class AbsoluteLayout extends AbstractLayout implements } + @Override public void addListener(LayoutClickListener listener) { addListener(LayoutClickEventHandler.LAYOUT_CLICK_EVENT_IDENTIFIER, LayoutClickEvent.class, listener, LayoutClickListener.clickMethod); } + @Override public void removeListener(LayoutClickListener listener) { removeListener(LayoutClickEventHandler.LAYOUT_CLICK_EVENT_IDENTIFIER, LayoutClickEvent.class, listener); diff --git a/src/com/vaadin/ui/AbstractComponent.java b/src/com/vaadin/ui/AbstractComponent.java index ba0e5db89c..e7cb38256c 100644 --- a/src/com/vaadin/ui/AbstractComponent.java +++ b/src/com/vaadin/ui/AbstractComponent.java @@ -20,11 +20,11 @@ import com.vaadin.event.ActionManager; import com.vaadin.event.EventRouter; import com.vaadin.event.MethodEventSource; import com.vaadin.event.ShortcutListener; +import com.vaadin.shared.ComponentState; import com.vaadin.terminal.AbstractClientConnector; import com.vaadin.terminal.ErrorMessage; import com.vaadin.terminal.Resource; import com.vaadin.terminal.Terminal; -import com.vaadin.terminal.gwt.client.ComponentState; import com.vaadin.terminal.gwt.server.ClientConnector; import com.vaadin.terminal.gwt.server.ComponentSizeValidator; import com.vaadin.terminal.gwt.server.ResourceReference; @@ -101,10 +101,12 @@ public abstract class AbstractComponent extends AbstractClientConnector /* Get/Set component properties */ + @Override public void setDebugId(String id) { getState().setDebugId(id); } + @Override public String getDebugId() { return getState().getDebugId(); } @@ -141,6 +143,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * Gets the component's style. Don't add a JavaDoc comment here, we use the * default documentation from implemented interface. */ + @Override public String getStyleName() { String s = ""; if (getState().getStyles() != null) { @@ -159,6 +162,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * Sets the component's style. Don't add a JavaDoc comment here, we use the * default documentation from implemented interface. */ + @Override public void setStyleName(String style) { if (style == null || "".equals(style)) { getState().setStyles(null); @@ -179,6 +183,7 @@ public abstract class AbstractComponent extends AbstractClientConnector requestRepaint(); } + @Override public void addStyleName(String style) { if (style == null || "".equals(style)) { return; @@ -201,6 +206,7 @@ public abstract class AbstractComponent extends AbstractClientConnector } } + @Override public void removeStyleName(String style) { if (getState().getStyles() != null) { String[] styleParts = style.split(" +"); @@ -217,6 +223,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * Get's the component's caption. Don't add a JavaDoc comment here, we use * the default documentation from implemented interface. */ + @Override public String getCaption() { return getState().getCaption(); } @@ -229,6 +236,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * @param caption * the new caption <code>String</code> for the component. */ + @Override public void setCaption(String caption) { getState().setCaption(caption); requestRepaint(); @@ -238,6 +246,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * Don't add a JavaDoc comment here, we use the default documentation from * implemented interface. */ + @Override public Locale getLocale() { if (locale != null) { return locale; @@ -283,13 +292,9 @@ public abstract class AbstractComponent extends AbstractClientConnector * Gets the component's icon resource. Don't add a JavaDoc comment here, we * use the default documentation from implemented interface. */ + @Override public Resource getIcon() { - ResourceReference ref = ((ResourceReference) getState().getIcon()); - if (ref == null) { - return null; - } else { - return ref.getResource(); - } + return ResourceReference.getResource(getState().getIcon()); } /** @@ -299,12 +304,9 @@ public abstract class AbstractComponent extends AbstractClientConnector * @param icon * the icon to be shown with the component's caption. */ + @Override public void setIcon(Resource icon) { - if (icon == null) { - getState().setIcon(null); - } else { - getState().setIcon(new ResourceReference(icon)); - } + getState().setIcon(ResourceReference.create(icon)); requestRepaint(); } @@ -313,6 +315,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * * @see com.vaadin.ui.Component#isEnabled() */ + @Override public boolean isEnabled() { return getState().isEnabled(); } @@ -322,6 +325,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * * @see com.vaadin.ui.Component#setEnabled(boolean) */ + @Override public void setEnabled(boolean enabled) { if (getState().isEnabled() != enabled) { getState().setEnabled(enabled); @@ -377,6 +381,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * * @see com.vaadin.ui.Component#isVisible() */ + @Override public boolean isVisible() { return getState().isVisible(); } @@ -386,6 +391,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * * @see com.vaadin.ui.Component#setVisible(boolean) */ + @Override public void setVisible(boolean visible) { if (getState().isVisible() == visible) { return; @@ -566,6 +572,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * Tests if the component is in read-only mode. Don't add a JavaDoc comment * here, we use the default documentation from implemented interface. */ + @Override public boolean isReadOnly() { return getState().isReadOnly(); } @@ -574,6 +581,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * Sets the component's read-only mode. Don't add a JavaDoc comment here, we * use the default documentation from implemented interface. */ + @Override public void setReadOnly(boolean readOnly) { getState().setReadOnly(readOnly); requestRepaint(); @@ -704,6 +712,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * * @see com.vaadin.ui.Component#updateState() */ + @Override public void updateState() { // TODO This logic should be on the client side and the state should // simply be a data object with "width" and "height". @@ -863,6 +872,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * @param method * the activation method. */ + @Override public void addListener(Class<?> eventType, Object target, Method method) { if (eventRouter == null) { eventRouter = new EventRouter(); @@ -904,6 +914,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * @param methodName * the name of the activation method. */ + @Override public void addListener(Class<?> eventType, Object target, String methodName) { if (eventRouter == null) { eventRouter = new EventRouter(); @@ -929,6 +940,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * the target object that has registered to listen to events of * type <code>eventType</code> with one or more methods. */ + @Override public void removeListener(Class<?> eventType, Object target) { if (eventRouter != null) { eventRouter.removeListener(eventType, target); @@ -954,6 +966,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * the method owned by <code>target</code> that's registered to * listen to events of type <code>eventType</code>. */ + @Override public void removeListener(Class<?> eventType, Object target, Method method) { if (eventRouter != null) { eventRouter.removeListener(eventType, target, method); @@ -988,6 +1001,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * the name of the method owned by <code>target</code> that's * registered to listen to events of type <code>eventType</code>. */ + @Override public void removeListener(Class<?> eventType, Object target, String methodName) { if (eventRouter != null) { @@ -1032,6 +1046,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * Don't add a JavaDoc comment here, we use the default documentation from * implemented interface. */ + @Override public void addListener(Component.Listener listener) { addListener(Component.Event.class, listener, COMPONENT_EVENT_METHOD); } @@ -1041,6 +1056,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * JavaDoc comment here, we use the default documentation from implemented * interface. */ + @Override public void removeListener(Component.Listener listener) { removeListener(Component.Event.class, listener, COMPONENT_EVENT_METHOD); } @@ -1090,6 +1106,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * * @see com.vaadin.terminal.Sizeable#getHeight() */ + @Override public float getHeight() { return height; } @@ -1099,6 +1116,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * * @see com.vaadin.terminal.Sizeable#getHeightUnits() */ + @Override public Unit getHeightUnits() { return heightUnit; } @@ -1108,6 +1126,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * * @see com.vaadin.terminal.Sizeable#getWidth() */ + @Override public float getWidth() { return width; } @@ -1117,6 +1136,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * * @see com.vaadin.terminal.Sizeable#getWidthUnits() */ + @Override public Unit getWidthUnits() { return widthUnit; } @@ -1126,6 +1146,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * * @see com.vaadin.terminal.Sizeable#setHeight(float, Unit) */ + @Override public void setHeight(float height, Unit unit) { if (unit == null) { throw new IllegalArgumentException("Unit can not be null"); @@ -1141,6 +1162,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * * @see com.vaadin.terminal.Sizeable#setSizeFull() */ + @Override public void setSizeFull() { setWidth(100, Unit.PERCENTAGE); setHeight(100, Unit.PERCENTAGE); @@ -1151,6 +1173,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * * @see com.vaadin.terminal.Sizeable#setSizeUndefined() */ + @Override public void setSizeUndefined() { setWidth(-1, Unit.PIXELS); setHeight(-1, Unit.PIXELS); @@ -1161,6 +1184,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * * @see com.vaadin.terminal.Sizeable#setWidth(float, Unit) */ + @Override public void setWidth(float width, Unit unit) { if (unit == null) { throw new IllegalArgumentException("Unit can not be null"); @@ -1176,6 +1200,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * * @see com.vaadin.terminal.Sizeable#setWidth(java.lang.String) */ + @Override public void setWidth(String width) { Size size = parseStringSize(width); if (size != null) { @@ -1190,6 +1215,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * * @see com.vaadin.terminal.Sizeable#setHeight(java.lang.String) */ + @Override public void setHeight(String height) { Size size = parseStringSize(height); if (size != null) { diff --git a/src/com/vaadin/ui/AbstractComponentContainer.java b/src/com/vaadin/ui/AbstractComponentContainer.java index 8ef458b704..bc27242bb8 100644 --- a/src/com/vaadin/ui/AbstractComponentContainer.java +++ b/src/com/vaadin/ui/AbstractComponentContainer.java @@ -38,6 +38,7 @@ public abstract class AbstractComponentContainer extends AbstractComponent * Removes all components from the container. This should probably be * re-implemented in extending classes for a more powerful implementation. */ + @Override public void removeAllComponents() { final LinkedList<Component> l = new LinkedList<Component>(); @@ -57,6 +58,7 @@ public abstract class AbstractComponentContainer extends AbstractComponent * add a JavaDoc comment here, we use the default documentation from * implemented interface. */ + @Override public void moveComponentsFrom(ComponentContainer source) { final LinkedList<Component> components = new LinkedList<Component>(); for (final Iterator<Component> i = source.getComponentIterator(); i @@ -93,24 +95,28 @@ public abstract class AbstractComponentContainer extends AbstractComponent } /* documented in interface */ + @Override public void addListener(ComponentAttachListener listener) { addListener(ComponentContainer.ComponentAttachEvent.class, listener, COMPONENT_ATTACHED_METHOD); } /* documented in interface */ + @Override public void addListener(ComponentDetachListener listener) { addListener(ComponentContainer.ComponentDetachEvent.class, listener, COMPONENT_DETACHED_METHOD); } /* documented in interface */ + @Override public void removeListener(ComponentAttachListener listener) { removeListener(ComponentContainer.ComponentAttachEvent.class, listener, COMPONENT_ATTACHED_METHOD); } /* documented in interface */ + @Override public void removeListener(ComponentDetachListener listener) { removeListener(ComponentContainer.ComponentDetachEvent.class, listener, COMPONENT_DETACHED_METHOD); @@ -147,6 +153,7 @@ public abstract class AbstractComponentContainer extends AbstractComponent * * @see com.vaadin.ui.ComponentContainer#addComponent(Component) */ + @Override public void addComponent(Component c) { if (c instanceof ComponentContainer) { // Make sure we're not adding the component inside it's own content @@ -177,6 +184,7 @@ public abstract class AbstractComponentContainer extends AbstractComponent * * @see com.vaadin.ui.ComponentContainer#removeComponent(Component) */ + @Override public void removeComponent(Component c) { if (c.getParent() == this) { c.setParent(null); @@ -325,6 +333,7 @@ public abstract class AbstractComponentContainer extends AbstractComponent true); } + @Override public Iterator<Component> iterator() { return getComponentIterator(); } @@ -335,6 +344,7 @@ public abstract class AbstractComponentContainer extends AbstractComponent * @see * com.vaadin.ui.HasComponents#isComponentVisible(com.vaadin.ui.Component) */ + @Override public boolean isComponentVisible(Component childComponent) { return true; } diff --git a/src/com/vaadin/ui/AbstractField.java b/src/com/vaadin/ui/AbstractField.java index ce62fb43ed..6fe7f54df5 100644 --- a/src/com/vaadin/ui/AbstractField.java +++ b/src/com/vaadin/ui/AbstractField.java @@ -25,10 +25,10 @@ import com.vaadin.data.util.converter.ConverterUtil; import com.vaadin.event.Action; import com.vaadin.event.ShortcutAction; import com.vaadin.event.ShortcutListener; +import com.vaadin.shared.AbstractFieldState; import com.vaadin.terminal.AbstractErrorMessage; import com.vaadin.terminal.CompositeErrorMessage; import com.vaadin.terminal.ErrorMessage; -import com.vaadin.terminal.gwt.client.AbstractFieldState; /** * <p> @@ -178,6 +178,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * * @return the type of the Field */ + @Override public abstract Class<? extends T> getType(); /** @@ -206,6 +207,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * * @see com.vaadin.data.BufferedValidatable#isInvalidCommitted() */ + @Override public boolean isInvalidCommitted() { return invalidCommitted; } @@ -215,6 +217,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * * @see com.vaadin.data.BufferedValidatable#setInvalidCommitted(boolean) */ + @Override public void setInvalidCommitted(boolean isCommitted) { invalidCommitted = isCommitted; } @@ -223,6 +226,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * Saves the current value to the data source Don't add a JavaDoc comment * here, we use the default documentation from the implemented interface. */ + @Override public void commit() throws Buffered.SourceException, InvalidValueException { if (dataSource != null && !dataSource.isReadOnly()) { if ((isInvalidCommitted() || isValid())) { @@ -271,6 +275,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * Updates the value from the data source. Don't add a JavaDoc comment here, * we use the default documentation from the implemented interface. */ + @Override public void discard() throws Buffered.SourceException { if (dataSource != null) { @@ -343,6 +348,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * comment here, we use the default documentation from the implemented * interface. */ + @Override public boolean isModified() { return getState().isModified(); } @@ -356,6 +362,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * Tests if the field is in write-through mode. Don't add a JavaDoc comment * here, we use the default documentation from the implemented interface. */ + @Override public boolean isWriteThrough() { return writeThroughMode; } @@ -381,6 +388,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * setReadThrough(true), setWriteThrough(true) equals * setBuffered(false) */ + @Override @Deprecated public void setWriteThrough(boolean writeThrough) throws Buffered.SourceException, InvalidValueException { @@ -397,6 +405,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * Tests if the field is in read-through mode. Don't add a JavaDoc comment * here, we use the default documentation from the implemented interface. */ + @Override public boolean isReadThrough() { return readThroughMode; } @@ -420,6 +429,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * setReadThrough(true), setWriteThrough(true) equals * setBuffered(false) */ + @Override @Deprecated public void setReadThrough(boolean readThrough) throws Buffered.SourceException { @@ -452,6 +462,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * @param buffered * true if buffered mode should be turned on, false otherwise */ + @Override public void setBuffered(boolean buffered) { setReadThrough(!buffered); setWriteThrough(!buffered); @@ -464,6 +475,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * * @return true if buffered mode is on, false otherwise */ + @Override public boolean isBuffered() { return !isReadThrough() && !isWriteThrough(); } @@ -517,6 +529,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * * @return the current value of the field. */ + @Override public T getValue() { return getFieldValue(); } @@ -528,6 +541,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * the New value of the field. * @throws Property.ReadOnlyException */ + @Override public void setValue(Object newFieldValue) throws Property.ReadOnlyException, Converter.ConversionException { // This check is needed as long as setValue accepts Object instead of T @@ -644,6 +658,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * @return the current data source as a Property, or <code>null</code> if * none defined. */ + @Override public Property getPropertyDataSource() { return dataSource; } @@ -686,6 +701,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * @param newDataSource * the new data source Property. */ + @Override public void setPropertyDataSource(Property newDataSource) { // Saves the old value @@ -863,6 +879,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * @param validator * the new validator to be added. */ + @Override public void addValidator(Validator validator) { if (validators == null) { validators = new LinkedList<Validator>(); @@ -877,6 +894,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * @return the Unmodifiable collection that holds all validators for the * field. */ + @Override public Collection<Validator> getValidators() { if (validators == null || validators.isEmpty()) { return null; @@ -890,6 +908,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * @param validator * the validator to remove. */ + @Override public void removeValidator(Validator validator) { if (validators != null) { validators.remove(validator); @@ -919,6 +938,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * current value is valid or if the field is empty and not required, * <code>false</code> otherwise. */ + @Override public boolean isValid() { try { @@ -943,6 +963,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * * @see com.vaadin.data.Validatable#validate() */ + @Override public void validate() throws Validator.InvalidValueException { if (isRequired() && isEmpty()) { @@ -1014,6 +1035,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * @return true iff the invalid values are allowed. * @see com.vaadin.data.Validatable#isInvalidAllowed() */ + @Override public boolean isInvalidAllowed() { return invalidAllowed; } @@ -1031,6 +1053,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * * @see com.vaadin.data.Validatable#setInvalidAllowed(boolean) */ + @Override public void setInvalidAllowed(boolean invalidAllowed) throws UnsupportedOperationException { this.invalidAllowed = invalidAllowed; @@ -1103,6 +1126,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * Adds a value change listener for the field. Don't add a JavaDoc comment * here, we use the default documentation from the implemented interface. */ + @Override public void addListener(Property.ValueChangeListener listener) { addListener(AbstractField.ValueChangeEvent.class, listener, VALUE_CHANGE_METHOD); @@ -1113,6 +1137,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * comment here, we use the default documentation from the implemented * interface. */ + @Override public void removeListener(Property.ValueChangeListener listener) { removeListener(AbstractField.ValueChangeEvent.class, listener, VALUE_CHANGE_METHOD); @@ -1152,6 +1177,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * * @see Property.ReadOnlyStatusChangeListener */ + @Override public void readOnlyStatusChange(Property.ReadOnlyStatusChangeEvent event) { getState().setPropertyReadOnly(event.getProperty().isReadOnly()); requestRepaint(); @@ -1184,6 +1210,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * * @return the Source of the event. */ + @Override public Property getProperty() { return (Property) getSource(); } @@ -1194,6 +1221,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * JavaDoc comment here, we use the default documentation from the * implemented interface. */ + @Override public void addListener(Property.ReadOnlyStatusChangeListener listener) { addListener(Property.ReadOnlyStatusChangeEvent.class, listener, READ_ONLY_STATUS_CHANGE_METHOD); @@ -1204,6 +1232,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * JavaDoc comment here, we use the default documentation from the * implemented interface. */ + @Override public void removeListener(Property.ReadOnlyStatusChangeListener listener) { removeListener(Property.ReadOnlyStatusChangeEvent.class, listener, READ_ONLY_STATUS_CHANGE_METHOD); @@ -1228,6 +1257,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * the value change event telling the data source contents have * changed. */ + @Override public void valueChange(Property.ValueChangeEvent event) { if (isReadThrough()) { if (committingValueToDataSource) { @@ -1271,6 +1301,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * * @see com.vaadin.ui.Component.Focusable#getTabIndex() */ + @Override public int getTabIndex() { return getState().getTabIndex(); } @@ -1280,6 +1311,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * * @see com.vaadin.ui.Component.Focusable#setTabIndex(int) */ + @Override public void setTabIndex(int tabIndex) { getState().setTabIndex(tabIndex); requestRepaint(); @@ -1362,6 +1394,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * @return <code>true</code> if the field is required, otherwise * <code>false</code>. */ + @Override public boolean isRequired() { return getState().isRequired(); } @@ -1381,6 +1414,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements * @param required * Is the field required. */ + @Override public void setRequired(boolean required) { getState().setRequired(required); requestRepaint(); @@ -1395,11 +1429,13 @@ public abstract class AbstractField<T> extends AbstractComponent implements * @param requiredMessage * Message to be shown when this field is required, but empty. */ + @Override public void setRequiredError(String requiredMessage) { requiredError = requiredMessage; requestRepaint(); } + @Override public String getRequiredError() { return requiredError; } diff --git a/src/com/vaadin/ui/AbstractJavaScriptComponent.java b/src/com/vaadin/ui/AbstractJavaScriptComponent.java index 95c45f55f9..3668669d16 100644 --- a/src/com/vaadin/ui/AbstractJavaScriptComponent.java +++ b/src/com/vaadin/ui/AbstractJavaScriptComponent.java @@ -3,8 +3,9 @@ */ package com.vaadin.ui; +import com.vaadin.shared.ui.JavaScriptComponentState; import com.vaadin.terminal.JavaScriptCallbackHelper; -import com.vaadin.terminal.gwt.client.ui.JavaScriptComponentState; +import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.ui.JavaScriptWidget; /** @@ -37,9 +38,9 @@ import com.vaadin.terminal.gwt.client.ui.JavaScriptWidget; * the connector's parent. If <code>connectorId</code> is provided, the id of * the parent of the corresponding connector with the passed id is returned * instead.</li> - * <li><code>getWidgetElement([connectorId])</code> - returns the DOM Element - * that is the root of a connector's widget. <code>null</code> is returned if - * the connector can not be found or if the connector doesn't have a widget. If + * <li><code>getElement([connectorId])</code> - returns the DOM Element that is + * the root of a connector's widget. <code>null</code> is returned if the + * connector can not be found or if the connector doesn't have a widget. If * <code>connectorId</code> is not provided, the connector id of the current * connector will be used.</li> * <li><code>getState()</code> - returns an object corresponding to the shared @@ -66,6 +67,9 @@ import com.vaadin.terminal.gwt.client.ui.JavaScriptWidget; * exception when called. The scheme for conversion between Java types in the * RPC interface and the JavaScript values that should be passed to the * functions is described bellow.</li> + * <li><code>translateVaadinUri(uri)</code> - Translates a Vaadin URI to a URL + * that can be used in the browser. This is just way of accessing + * {@link ApplicationConnection#translateVaadinUri(String)}</li> * </ul> * The connector wrapper also supports these special functions: * <ul> @@ -110,7 +114,7 @@ import com.vaadin.terminal.gwt.client.ui.JavaScriptWidget; * @version @VERSION@ * @since 7.0.0 */ -public class AbstractJavaScriptComponent extends AbstractComponent { +public abstract class AbstractJavaScriptComponent extends AbstractComponent { private JavaScriptCallbackHelper callbackHelper = new JavaScriptCallbackHelper( this); @@ -142,8 +146,9 @@ public class AbstractJavaScriptComponent extends AbstractComponent { /** * Invoke a named function that the connector JavaScript has added to the * JavaScript connector wrapper object. The arguments should only contain - * data types that can be represented in JavaScript, including primitive - * boxing types, arrays, String, List, Set, Map, Connector and JavaBeans. + * data types that can be represented in JavaScript including primitives, + * their boxed types, arrays, String, List, Set, Map, Connector and + * JavaBeans. * * @param name * the name of the function diff --git a/src/com/vaadin/ui/AbstractLayout.java b/src/com/vaadin/ui/AbstractLayout.java index 4876b40265..7b3a537d06 100644 --- a/src/com/vaadin/ui/AbstractLayout.java +++ b/src/com/vaadin/ui/AbstractLayout.java @@ -4,7 +4,7 @@ package com.vaadin.ui; -import com.vaadin.terminal.gwt.client.ui.AbstractLayoutState; +import com.vaadin.shared.ui.AbstractLayoutState; import com.vaadin.ui.Layout.MarginHandler; /** @@ -32,6 +32,7 @@ public abstract class AbstractLayout extends AbstractComponentContainer * * @see com.vaadin.ui.Layout#setMargin(boolean) */ + @Override public void setMargin(boolean enabled) { margins.setMargins(enabled); getState().setMarginsBitmask(margins.getBitMask()); @@ -43,6 +44,7 @@ public abstract class AbstractLayout extends AbstractComponentContainer * * @see com.vaadin.ui.Layout.MarginHandler#getMargin() */ + @Override public MarginInfo getMargin() { return margins; } @@ -52,6 +54,7 @@ public abstract class AbstractLayout extends AbstractComponentContainer * * @see com.vaadin.ui.Layout.MarginHandler#setMargin(MarginInfo) */ + @Override public void setMargin(MarginInfo marginInfo) { margins.setMargins(marginInfo); getState().setMarginsBitmask(margins.getBitMask()); @@ -63,6 +66,7 @@ public abstract class AbstractLayout extends AbstractComponentContainer * * @see com.vaadin.ui.Layout#setMargin(boolean, boolean, boolean, boolean) */ + @Override public void setMargin(boolean topEnabled, boolean rightEnabled, boolean bottomEnabled, boolean leftEnabled) { margins.setMargins(topEnabled, rightEnabled, bottomEnabled, leftEnabled); diff --git a/src/com/vaadin/ui/AbstractMedia.java b/src/com/vaadin/ui/AbstractMedia.java index 760d9878ca..71b2e38ef3 100644 --- a/src/com/vaadin/ui/AbstractMedia.java +++ b/src/com/vaadin/ui/AbstractMedia.java @@ -7,10 +7,10 @@ package com.vaadin.ui; import java.util.ArrayList; import java.util.List; +import com.vaadin.shared.communication.URLReference; +import com.vaadin.shared.ui.AbstractMediaState; +import com.vaadin.shared.ui.MediaControl; import com.vaadin.terminal.Resource; -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; /** @@ -18,7 +18,7 @@ import com.vaadin.terminal.gwt.server.ResourceReference; * * @author Vaadin Ltd */ -public class AbstractMedia extends AbstractComponent { +public abstract class AbstractMedia extends AbstractComponent { @Override public AbstractMediaState getState() { diff --git a/src/com/vaadin/ui/AbstractOrderedLayout.java b/src/com/vaadin/ui/AbstractOrderedLayout.java index 2cd6fc2a9a..0581d0a279 100644 --- a/src/com/vaadin/ui/AbstractOrderedLayout.java +++ b/src/com/vaadin/ui/AbstractOrderedLayout.java @@ -10,13 +10,13 @@ import java.util.LinkedList; import com.vaadin.event.LayoutEvents.LayoutClickEvent; import com.vaadin.event.LayoutEvents.LayoutClickListener; import com.vaadin.event.LayoutEvents.LayoutClickNotifier; +import com.vaadin.shared.Connector; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.orderedlayout.AbstractOrderedLayoutServerRpc; +import com.vaadin.shared.ui.orderedlayout.AbstractOrderedLayoutState; +import com.vaadin.shared.ui.orderedlayout.AbstractOrderedLayoutState.ChildComponentData; import com.vaadin.terminal.Sizeable; -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 @@ -24,6 +24,7 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements private AbstractOrderedLayoutServerRpc rpc = new AbstractOrderedLayoutServerRpc() { + @Override public void layoutClick(MouseEventDetails mouseDetails, Connector clickedConnector) { fireEvent(LayoutClickEvent.createEvent(AbstractOrderedLayout.this, @@ -157,6 +158,7 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements * * @return the Iterator of the components inside the container. */ + @Override public Iterator<Component> getComponentIterator() { return components.iterator(); } @@ -167,11 +169,13 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements * * @return the number of contained components */ + @Override public int getComponentCount() { return components.size(); } /* Documented in superclass */ + @Override public void replaceComponent(Component oldComponent, Component newComponent) { // Gets the locations @@ -220,12 +224,14 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements * @see com.vaadin.ui.Layout.AlignmentHandler#setComponentAlignment(com * .vaadin.ui.Component, int, int) */ + @Override public void setComponentAlignment(Component childComponent, int horizontalAlignment, int verticalAlignment) { Alignment a = new Alignment(horizontalAlignment + verticalAlignment); setComponentAlignment(childComponent, a); } + @Override public void setComponentAlignment(Component childComponent, Alignment alignment) { ChildComponentData childData = getState().getChildData().get( @@ -247,6 +253,7 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements * @see com.vaadin.ui.Layout.AlignmentHandler#getComponentAlignment(com * .vaadin.ui.Component) */ + @Override public Alignment getComponentAlignment(Component childComponent) { ChildComponentData childData = getState().getChildData().get( childComponent); @@ -263,6 +270,7 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements * * @see com.vaadin.ui.Layout.SpacingHandler#setSpacing(boolean) */ + @Override public void setSpacing(boolean spacing) { getState().setSpacing(spacing); requestRepaint(); @@ -273,6 +281,7 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements * * @see com.vaadin.ui.Layout.SpacingHandler#isSpacing() */ + @Override public boolean isSpacing() { return getState().isSpacing(); } @@ -334,12 +343,14 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements return childData.getExpandRatio(); } + @Override public void addListener(LayoutClickListener listener) { addListener(LayoutClickEventHandler.LAYOUT_CLICK_EVENT_IDENTIFIER, LayoutClickEvent.class, listener, LayoutClickListener.clickMethod); } + @Override public void removeListener(LayoutClickListener listener) { removeListener(LayoutClickEventHandler.LAYOUT_CLICK_EVENT_IDENTIFIER, LayoutClickEvent.class, listener); diff --git a/src/com/vaadin/ui/AbstractSelect.java b/src/com/vaadin/ui/AbstractSelect.java index 6a927251af..0a97ceb649 100644 --- a/src/com/vaadin/ui/AbstractSelect.java +++ b/src/com/vaadin/ui/AbstractSelect.java @@ -27,12 +27,12 @@ import com.vaadin.event.dd.TargetDetailsImpl; import com.vaadin.event.dd.acceptcriteria.ClientSideCriterion; import com.vaadin.event.dd.acceptcriteria.ContainsDataFlavor; import com.vaadin.event.dd.acceptcriteria.TargetDetailIs; +import com.vaadin.shared.ui.dd.VerticalDropLocation; import com.vaadin.terminal.KeyMapper; 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.dd.VerticalDropLocation; import com.vaadin.ui.AbstractSelect.ItemCaptionMode; /** @@ -320,6 +320,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * @throws PaintException * if the paint operation failed. */ + @Override public void paintContent(PaintTarget target) throws PaintException { // Paints select attributes @@ -422,6 +423,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * @see com.vaadin.ui.AbstractComponent#changeVariables(java.lang.Object, * java.util.Map) */ + @Override public void changeVariables(Object source, Map<String, Object> variables) { // New option entered (and it is allowed) @@ -434,7 +436,8 @@ public abstract class AbstractSelect extends AbstractField<Object> implements // Selection change if (variables.containsKey("selected")) { - final String[] ka = (String[]) variables.get("selected"); + final String[] clientSideSelectedKeys = (String[]) variables + .get("selected"); // Multiselect mode if (isMultiSelect()) { @@ -442,19 +445,20 @@ public abstract class AbstractSelect extends AbstractField<Object> implements // TODO Optimize by adding repaintNotNeeded when applicable // Converts the key-array to id-set - final LinkedList<Object> s = new LinkedList<Object>(); - for (int i = 0; i < ka.length; i++) { - final Object id = itemIdMapper.get(ka[i]); + final LinkedList<Object> acceptedSelections = new LinkedList<Object>(); + for (int i = 0; i < clientSideSelectedKeys.length; i++) { + final Object id = itemIdMapper + .get(clientSideSelectedKeys[i]); if (!isNullSelectionAllowed() && (id == null || id == getNullSelectionItemId())) { // skip empty selection if nullselection is not allowed requestRepaint(); } else if (id != null && containsId(id)) { - s.add(id); + acceptedSelections.add(id); } } - if (!isNullSelectionAllowed() && s.size() < 1) { + if (!isNullSelectionAllowed() && acceptedSelections.size() < 1) { // empty selection not allowed, keep old value requestRepaint(); return; @@ -462,27 +466,32 @@ public abstract class AbstractSelect extends AbstractField<Object> implements // Limits the deselection to the set of visible items // (non-visible items can not be deselected) - final Collection<?> visible = getVisibleItemIds(); - if (visible != null) { + Collection<?> visibleNotSelected = getVisibleItemIds(); + if (visibleNotSelected != null) { + visibleNotSelected = new HashSet<Object>(visibleNotSelected); + // Don't remove those that will be added to preserve order + visibleNotSelected.removeAll(acceptedSelections); + @SuppressWarnings("unchecked") Set<Object> newsel = (Set<Object>) getValue(); if (newsel == null) { - newsel = new HashSet<Object>(); + newsel = new LinkedHashSet<Object>(); } else { - newsel = new HashSet<Object>(newsel); + newsel = new LinkedHashSet<Object>(newsel); } - newsel.removeAll(visible); - newsel.addAll(s); + newsel.removeAll(visibleNotSelected); + newsel.addAll(acceptedSelections); setValue(newsel, true); } } else { // Single select mode if (!isNullSelectionAllowed() - && (ka.length == 0 || ka[0] == null || ka[0] == getNullSelectionItemId())) { + && (clientSideSelectedKeys.length == 0 + || clientSideSelectedKeys[0] == null || clientSideSelectedKeys[0] == getNullSelectionItemId())) { requestRepaint(); return; } - if (ka.length == 0) { + if (clientSideSelectedKeys.length == 0) { // Allows deselection only if the deselected item is // visible final Object current = getValue(); @@ -491,7 +500,8 @@ public abstract class AbstractSelect extends AbstractField<Object> implements setValue(null, true); } } else { - final Object id = itemIdMapper.get(ka[0]); + final Object id = itemIdMapper + .get(clientSideSelectedKeys[0]); if (!isNullSelectionAllowed() && id == null) { requestRepaint(); } else if (id != null @@ -542,6 +552,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * */ public class DefaultNewItemHandler implements NewItemHandler { + @Override public void addNewItem(String newItemCaption) { // Checks for readonly if (isReadOnly()) { @@ -672,10 +683,10 @@ public abstract class AbstractSelect extends AbstractField<Object> implements if (isMultiSelect()) { if (newValue == null) { - super.setValue(new HashSet<Object>(), repaintIsNotNeeded); + super.setValue(new LinkedHashSet<Object>(), repaintIsNotNeeded); } else if (Collection.class.isAssignableFrom(newValue.getClass())) { - super.setValue(new HashSet<Object>((Collection<?>) newValue), - repaintIsNotNeeded); + super.setValue(new LinkedHashSet<Object>( + (Collection<?>) newValue), repaintIsNotNeeded); } } else if (newValue == null || items.containsId(newValue)) { super.setValue(newValue, repaintIsNotNeeded); @@ -692,6 +703,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * the item id. * @return the item from the container. */ + @Override public Item getItem(Object itemId) { return items.getItem(itemId); } @@ -701,6 +713,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * * @return the Collection of item ids. */ + @Override public Collection<?> getItemIds() { return items.getItemIds(); } @@ -710,6 +723,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * * @return the Collection of property ids. */ + @Override public Collection<?> getContainerPropertyIds() { return items.getContainerPropertyIds(); } @@ -721,6 +735,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * the Id identifying the property. * @see com.vaadin.data.Container#getType(java.lang.Object) */ + @Override public Class<?> getType(Object propertyId) { return items.getType(propertyId); } @@ -732,6 +747,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * * @see com.vaadin.data.Container#size() */ + @Override public int size() { return items.size(); } @@ -742,6 +758,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * @param itemId * the Id the of item to be tested. */ + @Override public boolean containsId(Object itemId) { if (itemId != null) { return items.containsId(itemId); @@ -756,6 +773,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * * @see com.vaadin.data.Container#getContainerProperty(Object, Object) */ + @Override public Property<?> getContainerProperty(Object itemId, Object propertyId) { return items.getContainerProperty(itemId, propertyId); } @@ -771,6 +789,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * @see com.vaadin.data.Container#addContainerProperty(java.lang.Object, * java.lang.Class, java.lang.Object) */ + @Override public boolean addContainerProperty(Object propertyId, Class<?> type, Object defaultValue) throws UnsupportedOperationException { @@ -791,6 +810,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * @return True if the operation succeeded. * @see com.vaadin.data.Container#removeAllItems() */ + @Override public boolean removeAllItems() throws UnsupportedOperationException { final boolean retval = items.removeAllItems(); @@ -812,6 +832,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * @return the Id of the created item or null in case of failure. * @see com.vaadin.data.Container#addItem() */ + @Override public Object addItem() throws UnsupportedOperationException { final Object retval = items.addItem(); @@ -836,6 +857,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * @return the Created item with the given id, or null in case of failure. * @see com.vaadin.data.Container#addItem(java.lang.Object) */ + @Override public Item addItem(Object itemId) throws UnsupportedOperationException { final Item retval = items.addItem(itemId); @@ -851,6 +873,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * * @see com.vaadin.data.Container#removeItem(java.lang.Object) */ + @Override public boolean removeItem(Object itemId) throws UnsupportedOperationException { @@ -873,6 +896,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * @return True if the operation succeeded. * @see com.vaadin.data.Container#removeContainerProperty(java.lang.Object) */ + @Override public boolean removeContainerProperty(Object propertyId) throws UnsupportedOperationException { @@ -896,6 +920,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * @param newDataSource * the new data source. */ + @Override public void setContainerDataSource(Container newDataSource) { if (newDataSource == null) { newDataSource = new IndexedContainer(); @@ -950,6 +975,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * * @see com.vaadin.data.Container.Viewer#getContainerDataSource() */ + @Override public Container getContainerDataSource() { return items; } @@ -1432,6 +1458,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * * @see com.vaadin.data.Container.PropertySetChangeListener#containerPropertySetChange(com.vaadin.data.Container.PropertySetChangeEvent) */ + @Override public void containerPropertySetChange( Container.PropertySetChangeEvent event) { firePropertySetChange(); @@ -1442,6 +1469,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * * @see com.vaadin.data.Container.PropertySetChangeNotifier#addListener(com.vaadin.data.Container.PropertySetChangeListener) */ + @Override public void addListener(Container.PropertySetChangeListener listener) { if (propertySetEventListeners == null) { propertySetEventListeners = new LinkedHashSet<Container.PropertySetChangeListener>(); @@ -1454,6 +1482,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * * @see com.vaadin.data.Container.PropertySetChangeNotifier#removeListener(com.vaadin.data.Container.PropertySetChangeListener) */ + @Override public void removeListener(Container.PropertySetChangeListener listener) { if (propertySetEventListeners != null) { propertySetEventListeners.remove(listener); @@ -1468,6 +1497,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * * @see com.vaadin.data.Container.ItemSetChangeNotifier#addListener(com.vaadin.data.Container.ItemSetChangeListener) */ + @Override public void addListener(Container.ItemSetChangeListener listener) { if (itemSetEventListeners == null) { itemSetEventListeners = new LinkedHashSet<Container.ItemSetChangeListener>(); @@ -1480,6 +1510,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * * @see com.vaadin.data.Container.ItemSetChangeNotifier#removeListener(com.vaadin.data.Container.ItemSetChangeListener) */ + @Override public void removeListener(Container.ItemSetChangeListener listener) { if (itemSetEventListeners != null) { itemSetEventListeners.remove(listener); @@ -1516,6 +1547,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * * @see com.vaadin.data.Container.ItemSetChangeListener#containerItemSetChange(com.vaadin.data.Container.ItemSetChangeEvent) */ + @Override public void containerItemSetChange(Container.ItemSetChangeEvent event) { // Clears the item id mapping table itemIdMapper.removeAll(); @@ -1566,6 +1598,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * * @see com.vaadin.data.Container.ItemSetChangeEvent#getContainer() */ + @Override public Container getContainer() { return AbstractSelect.this; } @@ -1583,6 +1616,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements * * @see com.vaadin.data.Container.PropertySetChangeEvent#getContainer() */ + @Override public Container getContainer() { return AbstractSelect.this; } @@ -1778,10 +1812,12 @@ public abstract class AbstractSelect extends AbstractField<Object> implements captionChangeNotifiers.clear(); } + @Override public void valueChange(com.vaadin.data.Property.ValueChangeEvent event) { requestRepaint(); } + @Override public void itemPropertySetChange( com.vaadin.data.Item.PropertySetChangeEvent event) { requestRepaint(); @@ -1809,6 +1845,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements super(select, itemId); } + @Override public boolean accept(DragAndDropEvent dragEvent) { AbstractSelectTargetDetails dropTargetData = (AbstractSelectTargetDetails) dragEvent .getTargetDetails(); @@ -1875,6 +1912,7 @@ public abstract class AbstractSelect extends AbstractField<Object> implements super(select, itemId); } + @Override public boolean accept(DragAndDropEvent dragEvent) { DataBoundTransferable transferable = (DataBoundTransferable) dragEvent .getTransferable(); diff --git a/src/com/vaadin/ui/AbstractSplitPanel.java b/src/com/vaadin/ui/AbstractSplitPanel.java index 876d39f2ae..90dc38ff65 100644 --- a/src/com/vaadin/ui/AbstractSplitPanel.java +++ b/src/com/vaadin/ui/AbstractSplitPanel.java @@ -10,12 +10,12 @@ import java.util.Iterator; import com.vaadin.event.ComponentEventListener; import com.vaadin.event.MouseEvents.ClickEvent; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.splitpanel.AbstractSplitPanelRpc; +import com.vaadin.shared.ui.splitpanel.AbstractSplitPanelState; +import com.vaadin.shared.ui.splitpanel.AbstractSplitPanelState.SplitterState; import com.vaadin.terminal.Sizeable; -import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.ui.ClickEventHandler; -import com.vaadin.terminal.gwt.client.ui.splitpanel.AbstractSplitPanelRpc; -import com.vaadin.terminal.gwt.client.ui.splitpanel.AbstractSplitPanelState; -import com.vaadin.terminal.gwt.client.ui.splitpanel.AbstractSplitPanelState.SplitterState; import com.vaadin.tools.ReflectTools; /** @@ -38,11 +38,13 @@ public abstract class AbstractSplitPanel extends AbstractComponentContainer { private AbstractSplitPanelRpc rpc = new AbstractSplitPanelRpc() { + @Override public void splitterClick(MouseEventDetails mouseDetails) { fireEvent(new SplitterClickEvent(AbstractSplitPanel.this, mouseDetails)); } + @Override public void setSplitterPosition(float position) { getSplitterState().setPosition(position); } @@ -63,6 +65,7 @@ public abstract class AbstractSplitPanel extends AbstractComponentContainer { int i = 0; + @Override public boolean hasNext() { if (i < getComponentCount()) { return true; @@ -70,6 +73,7 @@ public abstract class AbstractSplitPanel extends AbstractComponentContainer { return false; } + @Override public Component next() { if (!hasNext()) { return null; @@ -84,6 +88,7 @@ public abstract class AbstractSplitPanel extends AbstractComponentContainer { return null; } + @Override public void remove() { if (i == 1) { if (getFirstComponent() != null) { @@ -211,6 +216,7 @@ public abstract class AbstractSplitPanel extends AbstractComponentContainer { * @see com.vaadin.ui.ComponentContainer#getComponentIterator() */ + @Override public Iterator<Component> getComponentIterator() { return new ComponentIterator(); } @@ -222,6 +228,7 @@ public abstract class AbstractSplitPanel extends AbstractComponentContainer { * @return the number of contained components (zero, one or two) */ + @Override public int getComponentCount() { int count = 0; if (getFirstComponent() != null) { @@ -235,6 +242,7 @@ public abstract class AbstractSplitPanel extends AbstractComponentContainer { /* Documented in superclass */ + @Override public void replaceComponent(Component oldComponent, Component newComponent) { if (oldComponent == getFirstComponent()) { setFirstComponent(newComponent); diff --git a/src/com/vaadin/ui/AbstractTextField.java b/src/com/vaadin/ui/AbstractTextField.java index d584374bda..2326c07d97 100644 --- a/src/com/vaadin/ui/AbstractTextField.java +++ b/src/com/vaadin/ui/AbstractTextField.java @@ -15,10 +15,10 @@ import com.vaadin.event.FieldEvents.FocusNotifier; import com.vaadin.event.FieldEvents.TextChangeEvent; import com.vaadin.event.FieldEvents.TextChangeListener; import com.vaadin.event.FieldEvents.TextChangeNotifier; +import com.vaadin.shared.ui.textfield.AbstractTextFieldState; 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 @@ -95,6 +95,7 @@ public abstract class AbstractTextField extends AbstractField<String> implements getState().setText(value); } + @Override public void paintContent(PaintTarget target) throws PaintException { if (selectionPosition != -1) { @@ -123,6 +124,7 @@ public abstract class AbstractTextField extends AbstractField<String> implements } + @Override public void changeVariables(Object source, Map<String, Object> variables) { changingVariables = true; @@ -498,11 +500,13 @@ public abstract class AbstractTextField extends AbstractField<String> implements LAZY } + @Override public void addListener(TextChangeListener listener) { addListener(TextChangeListener.EVENT_ID, TextChangeEvent.class, listener, TextChangeListener.EVENT_METHOD); } + @Override public void removeListener(TextChangeListener listener) { removeListener(TextChangeListener.EVENT_ID, TextChangeEvent.class, listener); @@ -645,20 +649,24 @@ public abstract class AbstractTextField extends AbstractField<String> implements return lastKnownCursorPosition; } + @Override public void addListener(FocusListener listener) { addListener(FocusEvent.EVENT_ID, FocusEvent.class, listener, FocusListener.focusMethod); } + @Override public void removeListener(FocusListener listener) { removeListener(FocusEvent.EVENT_ID, FocusEvent.class, listener); } + @Override public void addListener(BlurListener listener) { addListener(BlurEvent.EVENT_ID, BlurEvent.class, listener, BlurListener.blurMethod); } + @Override public void removeListener(BlurListener listener) { removeListener(BlurEvent.EVENT_ID, BlurEvent.class, listener); } diff --git a/src/com/vaadin/ui/Alignment.java b/src/com/vaadin/ui/Alignment.java index eb9e75e4d2..0d73da8504 100644 --- a/src/com/vaadin/ui/Alignment.java +++ b/src/com/vaadin/ui/Alignment.java @@ -5,7 +5,7 @@ package com.vaadin.ui; import java.io.Serializable; -import com.vaadin.terminal.gwt.client.ui.AlignmentInfo.Bits; +import com.vaadin.shared.ui.AlignmentInfo.Bits; /** * Class containing information about alignment of a component. Use the diff --git a/src/com/vaadin/ui/Button.java b/src/com/vaadin/ui/Button.java index 0abc50f26f..0cb667d527 100644 --- a/src/com/vaadin/ui/Button.java +++ b/src/com/vaadin/ui/Button.java @@ -18,9 +18,9 @@ import com.vaadin.event.ShortcutAction; import com.vaadin.event.ShortcutAction.KeyCode; import com.vaadin.event.ShortcutAction.ModifierKey; import com.vaadin.event.ShortcutListener; -import com.vaadin.terminal.gwt.client.MouseEventDetails; -import com.vaadin.terminal.gwt.client.ui.button.ButtonServerRpc; -import com.vaadin.terminal.gwt.client.ui.button.ButtonState; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.button.ButtonServerRpc; +import com.vaadin.shared.ui.button.ButtonState; import com.vaadin.tools.ReflectTools; import com.vaadin.ui.Component.Focusable; @@ -39,10 +39,12 @@ public class Button extends AbstractComponent implements private ButtonServerRpc rpc = new ButtonServerRpc() { + @Override public void click(MouseEventDetails mouseEventDetails) { fireClick(mouseEventDetails); } + @Override public void disableOnClick() { // Could be optimized so the button is not repainted because of // this (client side has already disabled the button) @@ -332,20 +334,24 @@ public class Button extends AbstractComponent implements fireEvent(new Button.ClickEvent(this, details)); } + @Override public void addListener(BlurListener listener) { addListener(BlurEvent.EVENT_ID, BlurEvent.class, listener, BlurListener.blurMethod); } + @Override public void removeListener(BlurListener listener) { removeListener(BlurEvent.EVENT_ID, BlurEvent.class, listener); } + @Override public void addListener(FocusListener listener) { addListener(FocusEvent.EVENT_ID, FocusEvent.class, listener, FocusListener.focusMethod); } + @Override public void removeListener(FocusListener listener) { removeListener(FocusEvent.EVENT_ID, FocusEvent.class, listener); @@ -474,6 +480,7 @@ public class Button extends AbstractComponent implements * * @see com.vaadin.ui.Component.Focusable#getTabIndex() */ + @Override public int getTabIndex() { return getState().getTabIndex(); } @@ -483,6 +490,7 @@ public class Button extends AbstractComponent implements * * @see com.vaadin.ui.Component.Focusable#setTabIndex(int) */ + @Override public void setTabIndex(int tabIndex) { getState().setTabIndex(tabIndex); requestRepaint(); diff --git a/src/com/vaadin/ui/CheckBox.java b/src/com/vaadin/ui/CheckBox.java index 147a270059..30ac9b4626 100644 --- a/src/com/vaadin/ui/CheckBox.java +++ b/src/com/vaadin/ui/CheckBox.java @@ -10,14 +10,15 @@ import com.vaadin.event.FieldEvents.BlurListener; import com.vaadin.event.FieldEvents.FocusAndBlurServerRpcImpl; import com.vaadin.event.FieldEvents.FocusEvent; import com.vaadin.event.FieldEvents.FocusListener; -import com.vaadin.terminal.gwt.client.MouseEventDetails; -import com.vaadin.terminal.gwt.client.ui.checkbox.CheckBoxServerRpc; -import com.vaadin.terminal.gwt.client.ui.checkbox.CheckBoxState; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.checkbox.CheckBoxServerRpc; +import com.vaadin.shared.ui.checkbox.CheckBoxState; public class CheckBox extends AbstractField<Boolean> { private CheckBoxServerRpc rpc = new CheckBoxServerRpc() { + @Override public void setChecked(boolean checked, MouseEventDetails mouseEventDetails) { if (isReadOnly()) { diff --git a/src/com/vaadin/ui/Component.java b/src/com/vaadin/ui/Component.java index 81e0319880..a2c257ab68 100644 --- a/src/com/vaadin/ui/Component.java +++ b/src/com/vaadin/ui/Component.java @@ -11,11 +11,11 @@ import java.util.Locale; import com.vaadin.Application; import com.vaadin.event.FieldEvents; +import com.vaadin.shared.ComponentState; import com.vaadin.terminal.ErrorMessage; import com.vaadin.terminal.Resource; import com.vaadin.terminal.Sizeable; import com.vaadin.terminal.VariableOwner; -import com.vaadin.terminal.gwt.client.ComponentState; import com.vaadin.terminal.gwt.server.ClientConnector; /** @@ -305,6 +305,7 @@ public interface Component extends ClientConnector, Sizeable, Serializable { * * @return the parent component */ + @Override public HasComponents getParent(); /** @@ -507,6 +508,7 @@ public interface Component extends ClientConnector, Sizeable, Serializable { * @return the Root of the component or <code>null</code> if it is not * attached to a Root */ + @Override public Root getRoot(); /** @@ -520,8 +522,8 @@ public interface Component extends ClientConnector, Sizeable, Serializable { * <p> * Getting a null value is often a problem in constructors of regular * components and in the initializers of custom composite components. A - * standard workaround is to use {@link Application#getCurrent()} - * to retrieve the application instance that the current request relates to. + * standard workaround is to use {@link Application#getCurrent()} to + * retrieve the application instance that the current request relates to. * Another way is to move the problematic initialization to * {@link #attach()}, as described in the documentation of the method. * </p> @@ -585,6 +587,7 @@ public interface Component extends ClientConnector, Sizeable, Serializable { * } * </pre> */ + @Override public void attach(); /** @@ -620,6 +623,7 @@ public interface Component extends ClientConnector, Sizeable, Serializable { * * @since 7.0 */ + @Override public ComponentState getState(); /** diff --git a/src/com/vaadin/ui/ConnectorTracker.java b/src/com/vaadin/ui/ConnectorTracker.java index 75a75ad22a..e3d1bf86db 100644 --- a/src/com/vaadin/ui/ConnectorTracker.java +++ b/src/com/vaadin/ui/ConnectorTracker.java @@ -17,7 +17,7 @@ import com.vaadin.terminal.gwt.client.ServerConnector; import com.vaadin.terminal.gwt.server.ClientConnector; /** - * A class which takes care of book keeping of {@link ClientConnector}s for one + * A class which takes care of book keeping of {@link ClientConnector}s for a * Root. * <p> * Provides {@link #getConnector(String)} which can be used to lookup a @@ -53,6 +53,14 @@ public class ConnectorTracker implements Serializable { return Logger.getLogger(ConnectorTracker.class.getName()); } + /** + * Creates a new ConnectorTracker for the given root. A tracker is always + * attached to a root and the root cannot be changed during the lifetime of + * a {@link ConnectorTracker}. + * + * @param root + * The root to attach to. Cannot be null. + */ public ConnectorTracker(Root root) { this.root = root; } @@ -144,61 +152,134 @@ public class ConnectorTracker implements Serializable { while (iterator.hasNext()) { String connectorId = iterator.next(); ClientConnector connector = connectorIdToConnector.get(connectorId); - if (connector instanceof Component) { - Component component = (Component) connector; - if (component.getRoot() != root) { - // If component is no longer part of this application, - // remove it from the map. If it is re-attached to the - // application at some point it will be re-added through - // registerConnector(connector) - iterator.remove(); - } + if (getRootForConnector(connector) != root) { + // If connector is no longer part of this root, + // remove it from the map. If it is re-attached to the + // application at some point it will be re-added through + // registerConnector(connector) + + // This code should never be called as cleanup should take place + // in detach() + getLogger() + .warning( + "cleanConnectorMap unregistered connector " + + getConnectorAndParentInfo(connector) + + "). This should have been done when the connector was detached."); + iterator.remove(); } } } + /** + * Finds the root that the connector is attached to. + * + * @param connector + * The connector to lookup + * @return The root the connector is attached to or null if it is not + * attached to any root. + */ + private Root getRootForConnector(ClientConnector connector) { + if (connector == null) { + return null; + } + if (connector instanceof Component) { + return ((Component) connector).getRoot(); + } + + return getRootForConnector(connector.getParent()); + } + + /** + * Mark the connector as dirty. + * + * @see #getDirtyConnectors() + * + * @param connector + * The connector that should be marked clean. + */ public void markDirty(ClientConnector connector) { if (getLogger().isLoggable(Level.FINE)) { if (!dirtyConnectors.contains(connector)) { - getLogger() - .fine(getDebugInfo(connector) + " " + "is now dirty"); + getLogger().fine( + getConnectorAndParentInfo(connector) + " " + + "is now dirty"); } } dirtyConnectors.add(connector); } + /** + * Mark the connector as clean. + * + * @param connector + * The connector that should be marked clean. + */ public void markClean(ClientConnector connector) { if (getLogger().isLoggable(Level.FINE)) { if (dirtyConnectors.contains(connector)) { getLogger().fine( - getDebugInfo(connector) + " " + "is no longer dirty"); + getConnectorAndParentInfo(connector) + " " + + "is no longer dirty"); } } dirtyConnectors.remove(connector); } - private String getDebugInfo(ClientConnector connector) { - String message = getObjectString(connector); + /** + * Returns {@link #getConnectorString(ClientConnector)} for the connector + * and its parent (if it has a parent). + * + * @param connector + * The connector + * @return A string describing the connector and its parent + */ + private String getConnectorAndParentInfo(ClientConnector connector) { + String message = getConnectorString(connector); if (connector.getParent() != null) { - message += " (parent: " + getObjectString(connector.getParent()) + message += " (parent: " + getConnectorString(connector.getParent()) + ")"; } return message; } - private String getObjectString(Object connector) { - return connector.getClass().getName() + "@" - + Integer.toHexString(connector.hashCode()); + /** + * Returns a string with the connector name and id. Useful mostly for + * debugging and logging. + * + * @param connector + * The connector + * @return A string that describes the connector + */ + private String getConnectorString(ClientConnector connector) { + if (connector == null) { + return "(null)"; + } + + String connectorId; + try { + connectorId = connector.getConnectorId(); + } catch (RuntimeException e) { + // This happens if the connector is not attached to the application. + // SHOULD not happen in this case but theoretically can. + connectorId = "@" + Integer.toHexString(connector.hashCode()); + } + return connector.getClass().getName() + "(" + connectorId + ")"; } + /** + * Mark all connectors in this root as dirty. + */ public void markAllConnectorsDirty() { markConnectorsDirtyRecursively(root); getLogger().fine("All connectors are now dirty"); } + /** + * Mark all connectors in this root as clean. + */ public void markAllConnectorsClean() { dirtyConnectors.clear(); getLogger().fine("All connectors are now clean"); @@ -222,6 +303,16 @@ public class ConnectorTracker implements Serializable { } } + /** + * Returns a collection of all connectors which have been marked as dirty. + * <p> + * The state and pending RPC calls for dirty connectors are sent to the + * client in the following request. + * </p> + * + * @return A collection of all dirty connectors for this root. This list may + * contain invisible connectors. + */ public Collection<ClientConnector> getDirtyConnectors() { return dirtyConnectors; } diff --git a/src/com/vaadin/ui/CssLayout.java b/src/com/vaadin/ui/CssLayout.java index e8ec6bd041..356f0a3843 100644 --- a/src/com/vaadin/ui/CssLayout.java +++ b/src/com/vaadin/ui/CssLayout.java @@ -9,11 +9,11 @@ import java.util.LinkedList; import com.vaadin.event.LayoutEvents.LayoutClickEvent; import com.vaadin.event.LayoutEvents.LayoutClickListener; import com.vaadin.event.LayoutEvents.LayoutClickNotifier; -import com.vaadin.terminal.gwt.client.Connector; -import com.vaadin.terminal.gwt.client.MouseEventDetails; +import com.vaadin.shared.Connector; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.csslayout.CssLayoutServerRpc; +import com.vaadin.shared.ui.csslayout.CssLayoutState; import com.vaadin.terminal.gwt.client.ui.LayoutClickEventHandler; -import com.vaadin.terminal.gwt.client.ui.csslayout.CssLayoutServerRpc; -import com.vaadin.terminal.gwt.client.ui.csslayout.CssLayoutState; /** * CssLayout is a layout component that can be used in browser environment only. @@ -60,6 +60,7 @@ public class CssLayout extends AbstractLayout implements LayoutClickNotifier { private CssLayoutServerRpc rpc = new CssLayoutServerRpc() { + @Override public void layoutClick(MouseEventDetails mouseDetails, Connector clickedConnector) { fireEvent(LayoutClickEvent.createEvent(CssLayout.this, @@ -167,6 +168,7 @@ public class CssLayout extends AbstractLayout implements LayoutClickNotifier { * * @return the Iterator of the components inside the container. */ + @Override public Iterator<Component> getComponentIterator() { return components.iterator(); } @@ -177,6 +179,7 @@ public class CssLayout extends AbstractLayout implements LayoutClickNotifier { * * @return the number of contained components */ + @Override public int getComponentCount() { return components.size(); } @@ -223,6 +226,7 @@ public class CssLayout extends AbstractLayout implements LayoutClickNotifier { } /* Documented in superclass */ + @Override public void replaceComponent(Component oldComponent, Component newComponent) { // Gets the locations @@ -264,12 +268,14 @@ public class CssLayout extends AbstractLayout implements LayoutClickNotifier { } } + @Override public void addListener(LayoutClickListener listener) { addListener(LayoutClickEventHandler.LAYOUT_CLICK_EVENT_IDENTIFIER, LayoutClickEvent.class, listener, LayoutClickListener.clickMethod); } + @Override public void removeListener(LayoutClickListener listener) { removeListener(LayoutClickEventHandler.LAYOUT_CLICK_EVENT_IDENTIFIER, LayoutClickEvent.class, listener); diff --git a/src/com/vaadin/ui/CustomComponent.java b/src/com/vaadin/ui/CustomComponent.java index 98d650f6db..40b5dcd636 100644 --- a/src/com/vaadin/ui/CustomComponent.java +++ b/src/com/vaadin/ui/CustomComponent.java @@ -100,20 +100,24 @@ public class CustomComponent extends AbstractComponentContainer { Serializable { boolean first = getCompositionRoot() != null; + @Override public boolean hasNext() { return first; } + @Override public Component next() { first = false; return root; } + @Override public void remove() { throw new UnsupportedOperationException(); } } + @Override public Iterator<Component> getComponentIterator() { return new ComponentIterator(); } @@ -124,6 +128,7 @@ public class CustomComponent extends AbstractComponentContainer { * * @return the number of contained components (zero or one) */ + @Override public int getComponentCount() { return (root != null ? 1 : 0); } @@ -134,6 +139,7 @@ public class CustomComponent extends AbstractComponentContainer { * @see com.vaadin.ui.ComponentContainer#replaceComponent(com.vaadin.ui.Component, * com.vaadin.ui.Component) */ + @Override public void replaceComponent(Component oldComponent, Component newComponent) { throw new UnsupportedOperationException(); } diff --git a/src/com/vaadin/ui/CustomField.java b/src/com/vaadin/ui/CustomField.java index 0998c11612..ab3797a58c 100644 --- a/src/com/vaadin/ui/CustomField.java +++ b/src/com/vaadin/ui/CustomField.java @@ -123,28 +123,34 @@ public abstract class CustomField<T> extends AbstractField<T> implements Serializable { boolean first = (root != null); + @Override public boolean hasNext() { return first; } + @Override public Component next() { first = false; return getContent(); } + @Override public void remove() { throw new UnsupportedOperationException(); } } + @Override public Iterator<Component> getComponentIterator() { return new ComponentIterator(); } + @Override public Iterator<Component> iterator() { return getComponentIterator(); } + @Override public int getComponentCount() { return (null != getContent()) ? 1 : 0; } @@ -163,22 +169,27 @@ public abstract class CustomField<T> extends AbstractField<T> implements // TODO remove these methods when ComponentContainer interface is cleaned up + @Override public void addComponent(Component c) { throw new UnsupportedOperationException(); } + @Override public void removeComponent(Component c) { throw new UnsupportedOperationException(); } + @Override public void removeAllComponents() { throw new UnsupportedOperationException(); } + @Override public void replaceComponent(Component oldComponent, Component newComponent) { throw new UnsupportedOperationException(); } + @Override public void moveComponentsFrom(ComponentContainer source) { throw new UnsupportedOperationException(); } @@ -197,24 +208,29 @@ public abstract class CustomField<T> extends AbstractField<T> implements } } + @Override public void addListener(ComponentAttachListener listener) { addListener(ComponentContainer.ComponentAttachEvent.class, listener, COMPONENT_ATTACHED_METHOD); } + @Override public void removeListener(ComponentAttachListener listener) { removeListener(ComponentContainer.ComponentAttachEvent.class, listener, COMPONENT_ATTACHED_METHOD); } + @Override public void addListener(ComponentDetachListener listener) { // content never detached } + @Override public void removeListener(ComponentDetachListener listener) { // content never detached } + @Override public boolean isComponentVisible(Component childComponent) { return true; } diff --git a/src/com/vaadin/ui/CustomLayout.java b/src/com/vaadin/ui/CustomLayout.java index 97cea1c49d..d7830603f0 100644 --- a/src/com/vaadin/ui/CustomLayout.java +++ b/src/com/vaadin/ui/CustomLayout.java @@ -12,10 +12,10 @@ import java.util.Iterator; import java.util.Map; import java.util.Set; +import com.vaadin.shared.ui.customlayout.CustomLayoutState; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.PaintTarget; import com.vaadin.terminal.Vaadin6Component; -import com.vaadin.terminal.gwt.client.ui.customlayout.CustomLayoutState; import com.vaadin.terminal.gwt.server.JsonPaintTarget; /** @@ -185,6 +185,7 @@ public class CustomLayout extends AbstractLayout implements Vaadin6Component { * * @return the Iterator of the components inside the container. */ + @Override public Iterator<Component> getComponentIterator() { return slots.values().iterator(); } @@ -195,6 +196,7 @@ public class CustomLayout extends AbstractLayout implements Vaadin6Component { * * @return the number of contained components */ + @Override public int getComponentCount() { return slots.values().size(); } @@ -212,6 +214,7 @@ public class CustomLayout extends AbstractLayout implements Vaadin6Component { } /* Documented in superclass */ + @Override public void replaceComponent(Component oldComponent, Component newComponent) { // Gets the locations @@ -305,10 +308,12 @@ public class CustomLayout extends AbstractLayout implements Vaadin6Component { "CustomLayout does not support margins."); } + @Override public void changeVariables(Object source, Map<String, Object> variables) { // Nothing to see here } + @Override public void paintContent(PaintTarget target) throws PaintException { // Workaround to make the CommunicationManager read the template file // and send it to the client diff --git a/src/com/vaadin/ui/DateField.java b/src/com/vaadin/ui/DateField.java index 55ff67229c..d0a22f3c29 100644 --- a/src/com/vaadin/ui/DateField.java +++ b/src/com/vaadin/ui/DateField.java @@ -286,6 +286,7 @@ public class DateField extends AbstractField<Date> implements * Paints this component. Don't add a JavaDoc comment here, we use the * default documentation from implemented interface. */ + @Override public void paintContent(PaintTarget target) throws PaintException { // Adds the locale as attribute @@ -339,6 +340,7 @@ public class DateField extends AbstractField<Date> implements * comment here, we use the default documentation from implemented * interface. */ + @Override public void changeVariables(Object source, Map<String, Object> variables) { if (!isReadOnly() @@ -729,20 +731,24 @@ public class DateField extends AbstractField<Date> implements return lenient; } + @Override public void addListener(FocusListener listener) { addListener(FocusEvent.EVENT_ID, FocusEvent.class, listener, FocusListener.focusMethod); } + @Override public void removeListener(FocusListener listener) { removeListener(FocusEvent.EVENT_ID, FocusEvent.class, listener); } + @Override public void addListener(BlurListener listener) { addListener(BlurEvent.EVENT_ID, BlurEvent.class, listener, BlurListener.blurMethod); } + @Override public void removeListener(BlurListener listener) { removeListener(BlurEvent.EVENT_ID, BlurEvent.class, listener); } diff --git a/src/com/vaadin/ui/DefaultFieldFactory.java b/src/com/vaadin/ui/DefaultFieldFactory.java index 9d096094e3..e17f08c1c6 100644 --- a/src/com/vaadin/ui/DefaultFieldFactory.java +++ b/src/com/vaadin/ui/DefaultFieldFactory.java @@ -35,6 +35,7 @@ public class DefaultFieldFactory implements FormFieldFactory, TableFieldFactory protected DefaultFieldFactory() { } + @Override public Field<?> createField(Item item, Object propertyId, Component uiContext) { Class<?> type = item.getItemProperty(propertyId).getType(); @@ -43,6 +44,7 @@ public class DefaultFieldFactory implements FormFieldFactory, TableFieldFactory return field; } + @Override public Field<?> createField(Container container, Object itemId, Object propertyId, Component uiContext) { Property<?> containerProperty = container.getContainerProperty(itemId, diff --git a/src/com/vaadin/ui/DragAndDropWrapper.java b/src/com/vaadin/ui/DragAndDropWrapper.java index b623197a4c..67229a45fe 100644 --- a/src/com/vaadin/ui/DragAndDropWrapper.java +++ b/src/com/vaadin/ui/DragAndDropWrapper.java @@ -17,13 +17,13 @@ import com.vaadin.event.dd.DropHandler; import com.vaadin.event.dd.DropTarget; import com.vaadin.event.dd.TargetDetails; import com.vaadin.event.dd.TargetDetailsImpl; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.dd.HorizontalDropLocation; +import com.vaadin.shared.ui.dd.VerticalDropLocation; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.PaintTarget; import com.vaadin.terminal.StreamVariable; import com.vaadin.terminal.Vaadin6Component; -import com.vaadin.terminal.gwt.client.MouseEventDetails; -import com.vaadin.terminal.gwt.client.ui.dd.HorizontalDropLocation; -import com.vaadin.terminal.gwt.client.ui.dd.VerticalDropLocation; import com.vaadin.terminal.gwt.client.ui.draganddropwrapper.VDragAndDropWrapper; @SuppressWarnings("serial") @@ -214,10 +214,12 @@ public class DragAndDropWrapper extends CustomComponent implements DropTarget, requestRepaint(); } + @Override public void changeVariables(Object source, Map<String, Object> variables) { // TODO Remove once Vaadin6Component is no longer implemented } + @Override public void paintContent(PaintTarget target) throws PaintException { target.addAttribute(VDragAndDropWrapper.DRAG_START_MODE, dragStartMode.ordinal()); @@ -249,6 +251,7 @@ public class DragAndDropWrapper extends CustomComponent implements DropTarget, private DropHandler dropHandler; + @Override public DropHandler getDropHandler() { return dropHandler; } @@ -258,11 +261,13 @@ public class DragAndDropWrapper extends CustomComponent implements DropTarget, requestRepaint(); } + @Override public TargetDetails translateDropTargetDetails( Map<String, Object> clientVariables) { return new WrapperTargetDetails(clientVariables); } + @Override public Transferable getTransferable(final Map<String, Object> rawVariables) { return new WrapperTransferable(this, rawVariables); } @@ -286,6 +291,7 @@ public class DragAndDropWrapper extends CustomComponent implements DropTarget, private boolean listenProgressOfUploadedFile; + @Override public OutputStream getOutputStream() { if (file.getStreamVariable() == null) { return null; @@ -293,15 +299,18 @@ public class DragAndDropWrapper extends CustomComponent implements DropTarget, return file.getStreamVariable().getOutputStream(); } + @Override public boolean listenProgress() { return file.getStreamVariable().listenProgress(); } + @Override public void onProgress(StreamingProgressEvent event) { file.getStreamVariable().onProgress( new ReceivingEventWrapper(event)); } + @Override public void streamingStarted(StreamingStartEvent event) { listenProgressOfUploadedFile = file.getStreamVariable() != null; if (listenProgressOfUploadedFile) { @@ -315,6 +324,7 @@ public class DragAndDropWrapper extends CustomComponent implements DropTarget, event.disposeStreamVariable(); } + @Override public void streamingFinished(StreamingEndEvent event) { if (listenProgressOfUploadedFile) { file.getStreamVariable().streamingFinished( @@ -322,6 +332,7 @@ public class DragAndDropWrapper extends CustomComponent implements DropTarget, } } + @Override public void streamingFailed(final StreamingErrorEvent event) { if (listenProgressOfUploadedFile) { file.getStreamVariable().streamingFailed( @@ -329,6 +340,7 @@ public class DragAndDropWrapper extends CustomComponent implements DropTarget, } } + @Override public boolean isInterrupted() { return file.getStreamVariable().isInterrupted(); } @@ -348,14 +360,17 @@ public class DragAndDropWrapper extends CustomComponent implements DropTarget, wrappedEvent = e; } + @Override public String getMimeType() { return file.getType(); } + @Override public String getFileName() { return file.getFileName(); } + @Override public long getContentLength() { return file.getFileSize(); } @@ -364,6 +379,7 @@ public class DragAndDropWrapper extends CustomComponent implements DropTarget, return ProxyReceiver.this; } + @Override public Exception getException() { if (wrappedEvent instanceof StreamingErrorEvent) { return ((StreamingErrorEvent) wrappedEvent).getException(); @@ -371,6 +387,7 @@ public class DragAndDropWrapper extends CustomComponent implements DropTarget, return null; } + @Override public long getBytesReceived() { return wrappedEvent.getBytesReceived(); } @@ -379,6 +396,7 @@ public class DragAndDropWrapper extends CustomComponent implements DropTarget, * Calling this method has no effect. DD files are receive only once * anyway. */ + @Override public void disposeStreamVariable() { } diff --git a/src/com/vaadin/ui/Embedded.java b/src/com/vaadin/ui/Embedded.java index 1bcd984666..6088c5aa66 100644 --- a/src/com/vaadin/ui/Embedded.java +++ b/src/com/vaadin/ui/Embedded.java @@ -10,14 +10,14 @@ import java.util.Map; import com.vaadin.event.MouseEvents.ClickEvent; import com.vaadin.event.MouseEvents.ClickListener; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.embedded.EmbeddedServerRpc; 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.MouseEventDetails; import com.vaadin.terminal.gwt.client.ui.ClickEventHandler; import com.vaadin.terminal.gwt.client.ui.embedded.EmbeddedConnector; -import com.vaadin.terminal.gwt.client.ui.embedded.EmbeddedServerRpc; /** * Component for embedding external objects. @@ -81,6 +81,7 @@ public class Embedded extends AbstractComponent implements Vaadin6Component { private String altText; private EmbeddedServerRpc rpc = new EmbeddedServerRpc() { + @Override public void click(MouseEventDetails mouseDetails) { fireEvent(new ClickEvent(Embedded.this, mouseDetails)); } @@ -120,6 +121,7 @@ public class Embedded extends AbstractComponent implements Vaadin6Component { /** * Invoked when the component state should be painted. */ + @Override public void paintContent(PaintTarget target) throws PaintException { switch (type) { @@ -521,6 +523,7 @@ public class Embedded extends AbstractComponent implements Vaadin6Component { ClickEvent.class, listener); } + @Override public void changeVariables(Object source, Map<String, Object> variables) { // TODO Remove once Vaadin6Component is no longer implemented } diff --git a/src/com/vaadin/ui/Field.java b/src/com/vaadin/ui/Field.java index 3a66db47b0..6dc40d192f 100644 --- a/src/com/vaadin/ui/Field.java +++ b/src/com/vaadin/ui/Field.java @@ -89,6 +89,7 @@ public interface Field<T> extends Component, BufferedValidatable, Property<T>, * * @return the Source Property of the event. */ + @Override public Property getProperty() { return (Property) getSource(); } diff --git a/src/com/vaadin/ui/Form.java b/src/com/vaadin/ui/Form.java index 796ad17448..fbc4d5a8e6 100644 --- a/src/com/vaadin/ui/Form.java +++ b/src/com/vaadin/ui/Form.java @@ -24,6 +24,7 @@ import com.vaadin.event.Action; import com.vaadin.event.Action.Handler; import com.vaadin.event.Action.ShortcutNotifier; import com.vaadin.event.ActionManager; +import com.vaadin.shared.ui.form.FormState; import com.vaadin.terminal.AbstractErrorMessage; import com.vaadin.terminal.CompositeErrorMessage; import com.vaadin.terminal.ErrorMessage; @@ -31,7 +32,6 @@ import com.vaadin.terminal.PaintException; import com.vaadin.terminal.PaintTarget; import com.vaadin.terminal.UserError; import com.vaadin.terminal.Vaadin6Component; -import com.vaadin.terminal.gwt.client.ui.form.FormState; /** * Form component provides easy way of creating and managing sets fields. @@ -126,6 +126,7 @@ public class Form extends AbstractField<Object> implements Item.Editor, * See e.g. DateField#notifyFormOfValidityChange(). */ private final ValueChangeListener fieldValueChangeListener = new ValueChangeListener() { + @Override public void valueChange(com.vaadin.data.Property.ValueChangeEvent event) { requestRepaint(); } @@ -194,12 +195,14 @@ public class Form extends AbstractField<Object> implements Item.Editor, } /* Documented in interface */ + @Override public void paintContent(PaintTarget target) throws PaintException { if (ownActionManager != null) { ownActionManager.paintActions(null, target); } } + @Override public void changeVariables(Object source, Map<String, Object> variables) { // Actions if (ownActionManager != null) { @@ -467,6 +470,7 @@ public class Form extends AbstractField<Object> implements Item.Editor, * * @see com.vaadin.data.Item#addItemProperty(Object, Property) */ + @Override public boolean addItemProperty(Object id, Property property) { // Checks inputs @@ -598,6 +602,7 @@ public class Form extends AbstractField<Object> implements Item.Editor, * * @see com.vaadin.data.Item#getItemProperty(Object) */ + @Override public Property<?> getItemProperty(Object id) { final Field<?> field = fields.get(id); if (field == null) { @@ -624,6 +629,7 @@ public class Form extends AbstractField<Object> implements Item.Editor, } /* Documented in interface */ + @Override public Collection<?> getItemPropertyIds() { return Collections.unmodifiableCollection(propertyIds); } @@ -633,6 +639,7 @@ public class Form extends AbstractField<Object> implements Item.Editor, * * @see com.vaadin.data.Item#removeItemProperty(Object) */ + @Override public boolean removeItemProperty(Object id) { ownProperties.remove(id); @@ -687,6 +694,7 @@ public class Form extends AbstractField<Object> implements Item.Editor, } /* Documented in the interface */ + @Override public Item getItemDataSource() { return itemDatasource; } @@ -701,6 +709,7 @@ public class Form extends AbstractField<Object> implements Item.Editor, * * @see com.vaadin.data.Item.Viewer#setItemDataSource(Item) */ + @Override public void setItemDataSource(Item newDataSource) { setItemDataSource(newDataSource, newDataSource != null ? newDataSource.getItemPropertyIds() @@ -1301,10 +1310,12 @@ public class Form extends AbstractField<Object> implements Item.Editor, return ownActionManager; } + @Override public void addActionHandler(Handler actionHandler) { getOwnActionManager().addActionHandler(actionHandler); } + @Override public void removeActionHandler(Handler actionHandler) { if (ownActionManager != null) { ownActionManager.removeActionHandler(actionHandler); @@ -1320,11 +1331,13 @@ public class Form extends AbstractField<Object> implements Item.Editor, } } + @Override public <T extends Action & com.vaadin.event.Action.Listener> void addAction( T action) { getOwnActionManager().addAction(action); } + @Override public <T extends Action & com.vaadin.event.Action.Listener> void removeAction( T action) { if (ownActionManager != null) { @@ -1332,6 +1345,7 @@ public class Form extends AbstractField<Object> implements Item.Editor, } } + @Override public Iterator<Component> iterator() { return getComponentIterator(); } @@ -1345,6 +1359,7 @@ public class Form extends AbstractField<Object> implements Item.Editor, int i = 0; + @Override public boolean hasNext() { if (i < getComponentCount()) { return true; @@ -1352,6 +1367,7 @@ public class Form extends AbstractField<Object> implements Item.Editor, return false; } + @Override public Component next() { if (!hasNext()) { return null; @@ -1365,6 +1381,7 @@ public class Form extends AbstractField<Object> implements Item.Editor, return null; } + @Override public void remove() { if (i == 1) { if (getLayout() != null) { @@ -1379,6 +1396,7 @@ public class Form extends AbstractField<Object> implements Item.Editor, } } + @Override public Iterator<Component> getComponentIterator() { return new ComponentIterator(); } @@ -1395,6 +1413,7 @@ public class Form extends AbstractField<Object> implements Item.Editor, return count; } + @Override public boolean isComponentVisible(Component childComponent) { return true; }; diff --git a/src/com/vaadin/ui/GridLayout.java b/src/com/vaadin/ui/GridLayout.java index 0ab729ce5c..2391a9cd3a 100644 --- a/src/com/vaadin/ui/GridLayout.java +++ b/src/com/vaadin/ui/GridLayout.java @@ -15,15 +15,15 @@ import java.util.Map.Entry; import com.vaadin.event.LayoutEvents.LayoutClickEvent; import com.vaadin.event.LayoutEvents.LayoutClickListener; import com.vaadin.event.LayoutEvents.LayoutClickNotifier; +import com.vaadin.shared.Connector; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.gridlayout.GridLayoutServerRpc; +import com.vaadin.shared.ui.gridlayout.GridLayoutState; import com.vaadin.terminal.LegacyPaint; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.PaintTarget; 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.gridlayout.GridLayoutServerRpc; -import com.vaadin.terminal.gwt.client.ui.gridlayout.GridLayoutState; /** * A layout where the components are laid out on a grid using cell coordinates. @@ -58,6 +58,7 @@ public class GridLayout extends AbstractLayout implements private GridLayoutServerRpc rpc = new GridLayoutServerRpc() { + @Override public void layoutClick(MouseEventDetails mouseDetails, Connector clickedConnector) { fireEvent(LayoutClickEvent.createEvent(GridLayout.this, @@ -417,6 +418,7 @@ public class GridLayout extends AbstractLayout implements * * @return the Iterator of the components inside the layout. */ + @Override public Iterator<Component> getComponentIterator() { return Collections.unmodifiableCollection(components).iterator(); } @@ -427,10 +429,12 @@ public class GridLayout extends AbstractLayout implements * * @return the number of contained components */ + @Override public int getComponentCount() { return components.size(); } + @Override public void changeVariables(Object source, Map<String, Object> variables) { // TODO Remove once Vaadin6Component is no longer implemented } @@ -443,6 +447,7 @@ public class GridLayout extends AbstractLayout implements * @throws PaintException * if the paint operation failed. */ + @Override public void paintContent(PaintTarget target) throws PaintException { // TODO refactor attribute names in future release. target.addAttribute("structuralChange", structuralChange); @@ -668,6 +673,7 @@ public class GridLayout extends AbstractLayout implements * @see com.vaadin.ui.Layout.AlignmentHandler#getComponentAlignment(com * .vaadin.ui.Component) */ + @Override public Alignment getComponentAlignment(Component childComponent) { Alignment alignment = componentToAlignment.get(childComponent); if (alignment == null) { @@ -1094,6 +1100,7 @@ public class GridLayout extends AbstractLayout implements } /* Documented in superclass */ + @Override public void replaceComponent(Component oldComponent, Component newComponent) { // Gets the locations @@ -1143,6 +1150,7 @@ public class GridLayout extends AbstractLayout implements * @see com.vaadin.ui.Layout.AlignmentHandler#setComponentAlignment(com * .vaadin.ui.Component, int, int) */ + @Override public void setComponentAlignment(Component childComponent, int horizontalAlignment, int verticalAlignment) { componentToAlignment.put(childComponent, new Alignment( @@ -1150,6 +1158,7 @@ public class GridLayout extends AbstractLayout implements requestRepaint(); } + @Override public void setComponentAlignment(Component childComponent, Alignment alignment) { componentToAlignment.put(childComponent, alignment); @@ -1161,6 +1170,7 @@ public class GridLayout extends AbstractLayout implements * * @see com.vaadin.ui.Layout.SpacingHandler#setSpacing(boolean) */ + @Override public void setSpacing(boolean spacing) { getState().setSpacing(spacing); requestRepaint(); @@ -1171,6 +1181,7 @@ public class GridLayout extends AbstractLayout implements * * @see com.vaadin.ui.Layout.SpacingHandler#isSpacing() */ + @Override public boolean isSpacing() { return getState().isSpacing(); } @@ -1388,12 +1399,14 @@ public class GridLayout extends AbstractLayout implements return null; } + @Override public void addListener(LayoutClickListener listener) { addListener(LayoutClickEventHandler.LAYOUT_CLICK_EVENT_IDENTIFIER, LayoutClickEvent.class, listener, LayoutClickListener.clickMethod); } + @Override public void removeListener(LayoutClickListener listener) { removeListener(LayoutClickEventHandler.LAYOUT_CLICK_EVENT_IDENTIFIER, LayoutClickEvent.class, listener); diff --git a/src/com/vaadin/ui/HelloWorldExtension.java b/src/com/vaadin/ui/HelloWorldExtension.java deleted file mode 100644 index e705954f2e..0000000000 --- a/src/com/vaadin/ui/HelloWorldExtension.java +++ /dev/null @@ -1,38 +0,0 @@ -/* -@VaadinApache2LicenseForJavaFiles@ - */ -package com.vaadin.ui; - -import com.vaadin.terminal.AbstractExtension; -import com.vaadin.terminal.gwt.client.ui.helloworldfeature.GreetAgainRpc; -import com.vaadin.terminal.gwt.client.ui.helloworldfeature.HelloWorldRpc; -import com.vaadin.terminal.gwt.client.ui.helloworldfeature.HelloWorldState; - -public class HelloWorldExtension extends AbstractExtension { - - public HelloWorldExtension() { - registerRpc(new HelloWorldRpc() { - public void onMessageSent(String message) { - Notification.show(message); - } - }); - } - - @Override - public HelloWorldState getState() { - return (HelloWorldState) super.getState(); - } - - public void setGreeting(String greeting) { - getState().setGreeting(greeting); - requestRepaint(); - } - - public String getGreeting() { - return getState().getGreeting(); - } - - public void greetAgain() { - getRpcProxy(GreetAgainRpc.class).greetAgain(); - } -} diff --git a/src/com/vaadin/ui/JavaScript.java b/src/com/vaadin/ui/JavaScript.java index d256717711..53efb62965 100644 --- a/src/com/vaadin/ui/JavaScript.java +++ b/src/com/vaadin/ui/JavaScript.java @@ -9,11 +9,11 @@ import java.util.Map; import com.vaadin.external.json.JSONArray; import com.vaadin.external.json.JSONException; +import com.vaadin.shared.communication.ServerRpc; +import com.vaadin.shared.extension.javascriptmanager.ExecuteJavaScriptRpc; +import com.vaadin.shared.extension.javascriptmanager.JavaScriptManagerState; import com.vaadin.terminal.AbstractExtension; import com.vaadin.terminal.Page; -import com.vaadin.terminal.gwt.client.communication.ServerRpc; -import com.vaadin.terminal.gwt.client.extensions.javascriptmanager.ExecuteJavaScriptRpc; -import com.vaadin.terminal.gwt.client.extensions.javascriptmanager.JavaScriptManagerState; /** * Provides access to JavaScript functionality in the web browser. To get an @@ -41,6 +41,7 @@ public class JavaScript extends AbstractExtension { */ public JavaScript() { registerRpc(new JavaScriptCallbackRpc() { + @Override public void call(String name, JSONArray arguments) { JavaScriptCallback callback = callbacks.get(name); // TODO handle situation if name is not registered @@ -115,6 +116,16 @@ public class JavaScript extends AbstractExtension { } /** + * Executes the given JavaScript code in the browser. + * + * @param script + * The JavaScript code to run. + */ + public static void eval(String script) { + getCurrent().execute(script); + } + + /** * Get the JavaScript object for the current Page, or null if there is no * current page. * diff --git a/src/com/vaadin/ui/Label.java b/src/com/vaadin/ui/Label.java index e1c64605d7..7e50a37805 100644 --- a/src/com/vaadin/ui/Label.java +++ b/src/com/vaadin/ui/Label.java @@ -5,12 +5,13 @@ package com.vaadin.ui; import java.lang.reflect.Method; +import java.util.logging.Logger; import com.vaadin.data.Property; import com.vaadin.data.util.converter.Converter; import com.vaadin.data.util.converter.ConverterUtil; -import com.vaadin.terminal.gwt.client.ui.label.ContentMode; -import com.vaadin.terminal.gwt.client.ui.label.LabelState; +import com.vaadin.shared.ui.label.ContentMode; +import com.vaadin.shared.ui.label.LabelState; /** * Label component for showing non-editable short texts. @@ -41,6 +42,9 @@ public class Label extends AbstractComponent implements Property<String>, Property.Viewer, Property.ValueChangeListener, Property.ValueChangeNotifier, Comparable<Label> { + private static final Logger logger = Logger + .getLogger(Label.class.getName()); + /** * @deprecated From 7.0, use {@link ContentMode#TEXT} instead */ @@ -142,11 +146,15 @@ public class Label extends AbstractComponent implements Property<String>, } /** - * Gets the value of the label. Value of the label is the XML contents of - * the label. + * Gets the value of the label. + * <p> + * The value of the label is the text that is shown to the end user. + * Depending on the {@link ContentMode} it is plain text or markup. + * </p> * - * @return the Value of the label. + * @return the value of the label. */ + @Override public String getValue() { if (getPropertyDataSource() == null) { // Use internal value if we are running without a data source @@ -163,6 +171,7 @@ public class Label extends AbstractComponent implements Property<String>, * @param newStringValue * the New value of the label. */ + @Override public void setValue(Object newStringValue) { if (newStringValue != null && newStringValue.getClass() != String.class) { throw new Converter.ConversionException("Value of type " @@ -179,15 +188,20 @@ public class Label extends AbstractComponent implements Property<String>, } /** + * Returns the value displayed by this label. + * * @see java.lang.Object#toString() - * @deprecated use the data source value or {@link #getStringValue()} - * instead + * @deprecated As of 7.0.0, use {@link #getValue()} to get the value of the + * label or {@link #getPropertyDataSource()} .getValue() to get + * the value of the data source. */ @Deprecated @Override public String toString() { - throw new UnsupportedOperationException( - "Use getValue() instead of Label.toString()"); + logger.warning("You are using Label.toString() to get the value for a " + + getClass().getSimpleName() + + ". This is not recommended and will not be supported in future versions."); + return getValue(); } /** @@ -195,6 +209,7 @@ public class Label extends AbstractComponent implements Property<String>, * * @see com.vaadin.data.Property#getType() */ + @Override public Class<String> getType() { return String.class; } @@ -205,6 +220,7 @@ public class Label extends AbstractComponent implements Property<String>, * @return the data source property. * @see com.vaadin.data.Property.Viewer#getPropertyDataSource() */ + @Override public Property getPropertyDataSource() { return dataSource; } @@ -216,6 +232,7 @@ public class Label extends AbstractComponent implements Property<String>, * the new data source Property * @see com.vaadin.data.Property.Viewer#setPropertyDataSource(com.vaadin.data.Property) */ + @Override public void setPropertyDataSource(Property newDataSource) { // Stops listening the old data source changes if (dataSource != null @@ -312,6 +329,7 @@ public class Label extends AbstractComponent implements Property<String>, * * @see com.vaadin.data.Property.ValueChangeEvent#getProperty() */ + @Override public Property getProperty() { return (Property) getSource(); } @@ -324,6 +342,7 @@ public class Label extends AbstractComponent implements Property<String>, * the Listener to be added. * @see com.vaadin.data.Property.ValueChangeNotifier#addListener(com.vaadin.data.Property.ValueChangeListener) */ + @Override public void addListener(Property.ValueChangeListener listener) { addListener(Label.ValueChangeEvent.class, listener, VALUE_CHANGE_METHOD); } @@ -335,6 +354,7 @@ public class Label extends AbstractComponent implements Property<String>, * the Listener to be removed. * @see com.vaadin.data.Property.ValueChangeNotifier#removeListener(com.vaadin.data.Property.ValueChangeListener) */ + @Override public void removeListener(Property.ValueChangeListener listener) { removeListener(Label.ValueChangeEvent.class, listener, VALUE_CHANGE_METHOD); @@ -353,6 +373,7 @@ public class Label extends AbstractComponent implements Property<String>, * * @see com.vaadin.data.Property.ValueChangeListener#valueChange(Property.ValueChangeEvent) */ + @Override public void valueChange(Property.ValueChangeEvent event) { // Update the internal value from the data source getState().setText(getValue()); @@ -397,6 +418,7 @@ public class Label extends AbstractComponent implements Property<String>, * less than, equal to, or greater than the specified object. * @see java.lang.Comparable#compareTo(java.lang.Object) */ + @Override public int compareTo(Label other) { String thisValue = getComparableValue(); diff --git a/src/com/vaadin/ui/Layout.java b/src/com/vaadin/ui/Layout.java index 67bfaa75ff..d083f9afdc 100644 --- a/src/com/vaadin/ui/Layout.java +++ b/src/com/vaadin/ui/Layout.java @@ -6,8 +6,8 @@ package com.vaadin.ui; import java.io.Serializable; -import com.vaadin.terminal.gwt.client.ui.AlignmentInfo.Bits; -import com.vaadin.terminal.gwt.client.ui.VMarginInfo; +import com.vaadin.shared.ui.VMarginInfo; +import com.vaadin.shared.ui.AlignmentInfo.Bits; /** * Extension to the {@link ComponentContainer} interface which adds the diff --git a/src/com/vaadin/ui/Link.java b/src/com/vaadin/ui/Link.java index db0dc58e6b..fd105f3255 100644 --- a/src/com/vaadin/ui/Link.java +++ b/src/com/vaadin/ui/Link.java @@ -96,6 +96,7 @@ public class Link extends AbstractComponent implements Vaadin6Component { * @throws PaintException * if the paint operation failed. */ + @Override public void paintContent(PaintTarget target) throws PaintException { if (resource != null) { @@ -234,6 +235,7 @@ public class Link extends AbstractComponent implements Vaadin6Component { requestRepaint(); } + @Override public void changeVariables(Object source, Map<String, Object> variables) { // TODO Remove once Vaadin6Component is no longer implemented } diff --git a/src/com/vaadin/ui/LoginForm.java b/src/com/vaadin/ui/LoginForm.java index 1d5203bc6b..db7e5f9dd9 100644 --- a/src/com/vaadin/ui/LoginForm.java +++ b/src/com/vaadin/ui/LoginForm.java @@ -48,33 +48,40 @@ public class LoginForm extends CustomComponent { private ApplicationResource loginPage = new ApplicationResource() { + @Override public Application getApplication() { return LoginForm.this.getApplication(); } + @Override public int getBufferSize() { return getLoginHTML().length; } + @Override public long getCacheTime() { return -1; } + @Override public String getFilename() { return "login"; } + @Override public DownloadStream getStream() { return new DownloadStream(new ByteArrayInputStream(getLoginHTML()), getMIMEType(), getFilename()); } + @Override public String getMIMEType() { return "text/html; charset=utf-8"; } }; private final RequestHandler requestHandler = new RequestHandler() { + @Override public boolean handleRequest(Application application, WrappedRequest request, WrappedResponse response) throws IOException { @@ -84,7 +91,7 @@ public class LoginForm extends CustomComponent { response.setContentType("text/html; charset=utf-8"); response.getWriter() .write("<html><body>Login form handled." - + "<script type='text/javascript'>top.vaadin.forceSync();" + + "<script type='text/javascript'>parent.parent.vaadin.forceSync();" + "</script></body></html>"); Map<String, String[]> parameters = request.getParameterMap(); diff --git a/src/com/vaadin/ui/MenuBar.java b/src/com/vaadin/ui/MenuBar.java index f94bd7ea64..5b5dc13e20 100644 --- a/src/com/vaadin/ui/MenuBar.java +++ b/src/com/vaadin/ui/MenuBar.java @@ -39,6 +39,7 @@ public class MenuBar extends AbstractComponent implements Vaadin6Component { private boolean htmlContentAllowed; /** Paint (serialise) the component for the client. */ + @Override public void paintContent(PaintTarget target) throws PaintException { target.addAttribute(VMenuBar.OPEN_ROOT_MENU_ON_HOWER, openRootOnHover); @@ -125,6 +126,7 @@ public class MenuBar extends AbstractComponent implements Vaadin6Component { } /** Deserialize changes received from client. */ + @Override public void changeVariables(Object source, Map<String, Object> variables) { Stack<MenuItem> items = new Stack<MenuItem>(); boolean found = false; diff --git a/src/com/vaadin/ui/Notification.java b/src/com/vaadin/ui/Notification.java index 0358283cb4..502e5ff788 100644 --- a/src/com/vaadin/ui/Notification.java +++ b/src/com/vaadin/ui/Notification.java @@ -76,8 +76,7 @@ public class Notification implements Serializable { /** * Creates a "humanized" notification message. * - * Care should be taken to to avoid XSS vulnerabilities as the caption is by - * default rendered as html. + * The caption is rendered as plain text with HTML automatically escaped. * * @param caption * The message to show @@ -89,8 +88,7 @@ public class Notification implements Serializable { /** * Creates a notification message of the specified type. * - * Care should be taken to to avoid XSS vulnerabilities as the caption is by - * default rendered as html. + * The caption is rendered as plain text with HTML automatically escaped. * * @param caption * The message to show @@ -105,8 +103,8 @@ public class Notification implements Serializable { * Creates a "humanized" notification message with a bigger caption and * smaller description. * - * Care should be taken to to avoid XSS vulnerabilities as the caption and - * description are by default rendered as html. + * The caption and description are rendered as plain text with HTML + * automatically escaped. * * @param caption * The message caption @@ -121,8 +119,8 @@ public class Notification implements Serializable { * Creates a notification message of the specified type, with a bigger * caption and smaller description. * - * Care should be taken to to avoid XSS vulnerabilities as the caption and - * description are by default rendered as html. + * The caption and description are rendered as plain text with HTML + * automatically escaped. * * @param caption * The message caption @@ -132,7 +130,7 @@ public class Notification implements Serializable { * The type of message */ public Notification(String caption, String description, int type) { - this(caption, description, type, true); + this(caption, description, type, false); } /** @@ -335,8 +333,7 @@ public class Notification implements Serializable { * Shows a notification message on the middle of the current page. The * message automatically disappears ("humanized message"). * - * Care should be taken to to avoid XSS vulnerabilities as the caption is - * rendered as html. + * The caption is rendered as plain text with HTML automatically escaped. * * @see #Notification(String) * @see #show(Page) @@ -354,8 +351,7 @@ public class Notification implements Serializable { * defined in {@link Notification}, for instance * Notification.TYPE_WARNING_MESSAGE. * - * Care should be taken to to avoid XSS vulnerabilities as the caption is - * rendered as html. + * The caption is rendered as plain text with HTML automatically escaped. * * @see #Notification(String, int) * @see #show(Page) diff --git a/src/com/vaadin/ui/OptionGroup.java b/src/com/vaadin/ui/OptionGroup.java index a4aaf7ec99..e3bcdd61b7 100644 --- a/src/com/vaadin/ui/OptionGroup.java +++ b/src/com/vaadin/ui/OptionGroup.java @@ -75,20 +75,24 @@ public class OptionGroup extends AbstractSelect implements } } + @Override public void addListener(BlurListener listener) { addListener(BlurEvent.EVENT_ID, BlurEvent.class, listener, BlurListener.blurMethod); } + @Override public void removeListener(BlurListener listener) { removeListener(BlurEvent.EVENT_ID, BlurEvent.class, listener); } + @Override public void addListener(FocusListener listener) { addListener(FocusEvent.EVENT_ID, FocusEvent.class, listener, FocusListener.focusMethod); } + @Override public void removeListener(FocusListener listener) { removeListener(FocusEvent.EVENT_ID, FocusEvent.class, listener); diff --git a/src/com/vaadin/ui/Panel.java b/src/com/vaadin/ui/Panel.java index c339100cda..3c26b73f09 100644 --- a/src/com/vaadin/ui/Panel.java +++ b/src/com/vaadin/ui/Panel.java @@ -13,14 +13,14 @@ import com.vaadin.event.Action.Handler; import com.vaadin.event.ActionManager; import com.vaadin.event.MouseEvents.ClickEvent; import com.vaadin.event.MouseEvents.ClickListener; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.panel.PanelServerRpc; +import com.vaadin.shared.ui.panel.PanelState; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.PaintTarget; import com.vaadin.terminal.Scrollable; import com.vaadin.terminal.Vaadin6Component; -import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.ui.ClickEventHandler; -import com.vaadin.terminal.gwt.client.ui.panel.PanelServerRpc; -import com.vaadin.terminal.gwt.client.ui.panel.PanelState; import com.vaadin.ui.Component.Focusable; /** @@ -49,6 +49,7 @@ public class Panel extends AbstractComponentContainer implements Scrollable, protected ActionManager actionManager; private PanelServerRpc rpc = new PanelServerRpc() { + @Override public void click(MouseEventDetails mouseDetails) { fireEvent(new ClickEvent(Panel.this, mouseDetails)); } @@ -188,6 +189,7 @@ public class Panel extends AbstractComponentContainer implements Scrollable, * com.vaadin.terminal.Vaadin6Component#paintContent(com.vaadin.terminal * .PaintTarget) */ + @Override public void paintContent(PaintTarget target) throws PaintException { if (actionManager != null) { actionManager.paintActions(null, target); @@ -229,6 +231,7 @@ public class Panel extends AbstractComponentContainer implements Scrollable, * @return the Iterator of the components inside the container. * @see com.vaadin.ui.ComponentContainer#getComponentIterator() */ + @Override public Iterator<Component> getComponentIterator() { return Collections.singleton((Component) content).iterator(); } @@ -239,6 +242,7 @@ public class Panel extends AbstractComponentContainer implements Scrollable, * * @see com.vaadin.terminal.VariableOwner#changeVariables(Object, Map) */ + @Override @SuppressWarnings("unchecked") public void changeVariables(Object source, Map<String, Object> variables) { // Get new size @@ -277,6 +281,7 @@ public class Panel extends AbstractComponentContainer implements Scrollable, * * @see com.vaadin.terminal.Scrollable#setScrollable(boolean) */ + @Override public int getScrollLeft() { return getState().getScrollLeft(); } @@ -286,6 +291,7 @@ public class Panel extends AbstractComponentContainer implements Scrollable, * * @see com.vaadin.terminal.Scrollable#setScrollable(boolean) */ + @Override public int getScrollTop() { return getState().getScrollTop(); } @@ -295,6 +301,7 @@ public class Panel extends AbstractComponentContainer implements Scrollable, * * @see com.vaadin.terminal.Scrollable#setScrollLeft(int) */ + @Override public void setScrollLeft(int scrollLeft) { if (scrollLeft < 0) { throw new IllegalArgumentException( @@ -309,6 +316,7 @@ public class Panel extends AbstractComponentContainer implements Scrollable, * * @see com.vaadin.terminal.Scrollable#setScrollTop(int) */ + @Override public void setScrollTop(int scrollTop) { if (scrollTop < 0) { throw new IllegalArgumentException( @@ -319,6 +327,7 @@ public class Panel extends AbstractComponentContainer implements Scrollable, } /* Documented in superclass */ + @Override public void replaceComponent(Component oldComponent, Component newComponent) { content.replaceComponent(oldComponent, newComponent); @@ -329,6 +338,7 @@ public class Panel extends AbstractComponentContainer implements Scrollable, * * @see com.vaadin.ui.ComponentContainer.ComponentAttachListener#componentAttachedToContainer(com.vaadin.ui.ComponentContainer.ComponentAttachEvent) */ + @Override public void componentAttachedToContainer(ComponentAttachEvent event) { if (event.getContainer() == content) { fireComponentAttachEvent(event.getAttachedComponent()); @@ -340,6 +350,7 @@ public class Panel extends AbstractComponentContainer implements Scrollable, * * @see com.vaadin.ui.ComponentContainer.ComponentDetachListener#componentDetachedFromContainer(com.vaadin.ui.ComponentContainer.ComponentDetachEvent) */ + @Override public void componentDetachedFromContainer(ComponentDetachEvent event) { if (event.getContainer() == content) { fireComponentDetachEvent(event.getDetachedComponent()); @@ -367,11 +378,13 @@ public class Panel extends AbstractComponentContainer implements Scrollable, return actionManager; } + @Override public <T extends Action & com.vaadin.event.Action.Listener> void addAction( T action) { getActionManager().addAction(action); } + @Override public <T extends Action & com.vaadin.event.Action.Listener> void removeAction( T action) { if (actionManager != null) { @@ -379,10 +392,12 @@ public class Panel extends AbstractComponentContainer implements Scrollable, } } + @Override public void addActionHandler(Handler actionHandler) { getActionManager().addActionHandler(actionHandler); } + @Override public void removeActionHandler(Handler actionHandler) { if (actionManager != null) { actionManager.removeActionHandler(actionHandler); @@ -429,6 +444,7 @@ public class Panel extends AbstractComponentContainer implements Scrollable, /** * {@inheritDoc} */ + @Override public int getTabIndex() { return getState().getTabIndex(); } @@ -436,6 +452,7 @@ public class Panel extends AbstractComponentContainer implements Scrollable, /** * {@inheritDoc} */ + @Override public void setTabIndex(int tabIndex) { getState().setTabIndex(tabIndex); requestRepaint(); @@ -455,6 +472,7 @@ public class Panel extends AbstractComponentContainer implements Scrollable, * * @see com.vaadin.ui.ComponentContainer#getComponentCount() */ + @Override public int getComponentCount() { // This is so wrong... (#2924) return content.getComponentCount(); diff --git a/src/com/vaadin/ui/PopupView.java b/src/com/vaadin/ui/PopupView.java index 911d926053..766181b50f 100644 --- a/src/com/vaadin/ui/PopupView.java +++ b/src/com/vaadin/ui/PopupView.java @@ -58,10 +58,12 @@ public class PopupView extends AbstractComponentContainer implements first = (component == null); } + @Override public boolean hasNext() { return !first; } + @Override public Component next() { if (!first) { first = true; @@ -71,6 +73,7 @@ public class PopupView extends AbstractComponentContainer implements } } + @Override public void remove() { throw new UnsupportedOperationException(); } @@ -90,10 +93,12 @@ public class PopupView extends AbstractComponentContainer implements */ public PopupView(final java.lang.String small, final Component large) { this(new PopupView.Content() { + @Override public java.lang.String getMinimizedValueAsHTML() { return small; } + @Override public Component getPopupComponent() { return large; } @@ -223,6 +228,7 @@ public class PopupView extends AbstractComponentContainer implements * * @see com.vaadin.ui.ComponentContainer#getComponentIterator() */ + @Override public Iterator<Component> getComponentIterator() { return new SingleComponentIterator(visibleComponent); } @@ -233,6 +239,7 @@ public class PopupView extends AbstractComponentContainer implements * * @return the number of contained components (zero or one) */ + @Override public int getComponentCount() { return (visibleComponent != null ? 1 : 0); } @@ -280,6 +287,7 @@ public class PopupView extends AbstractComponentContainer implements * com.vaadin.ui.Component) * @throws UnsupportedOperationException */ + @Override public void replaceComponent(Component oldComponent, Component newComponent) throws UnsupportedOperationException { @@ -307,6 +315,7 @@ public class PopupView extends AbstractComponentContainer implements * * @see com.vaadin.ui.AbstractComponent#paintContent(com.vaadin.terminal.PaintTarget) */ + @Override public void paintContent(PaintTarget target) throws PaintException { String html = content.getMinimizedValueAsHTML(); if (html == null) { @@ -331,6 +340,7 @@ public class PopupView extends AbstractComponentContainer implements * @see com.vaadin.ui.AbstractComponent#changeVariables(java.lang.Object, * java.util.Map) */ + @Override public void changeVariables(Object source, Map<String, Object> variables) { if (variables.containsKey("popupVisibility")) { setPopupVisible(((Boolean) variables.get("popupVisibility")) diff --git a/src/com/vaadin/ui/ProgressIndicator.java b/src/com/vaadin/ui/ProgressIndicator.java index 4d585cfdd7..fef54a267c 100644 --- a/src/com/vaadin/ui/ProgressIndicator.java +++ b/src/com/vaadin/ui/ProgressIndicator.java @@ -111,6 +111,7 @@ public class ProgressIndicator extends AbstractField<Number> implements * @throws PaintException * if the Paint Operation fails. */ + @Override public void paintContent(PaintTarget target) throws PaintException { target.addAttribute("indeterminate", indeterminate); target.addAttribute("pollinginterval", pollingInterval); @@ -247,6 +248,7 @@ public class ProgressIndicator extends AbstractField<Number> implements return pollingInterval; } + @Override public void changeVariables(Object source, Map<String, Object> variables) { // TODO Remove once Vaadin6Component is no longer implemented diff --git a/src/com/vaadin/ui/RichTextArea.java b/src/com/vaadin/ui/RichTextArea.java index 16d4761b40..cec952926b 100644 --- a/src/com/vaadin/ui/RichTextArea.java +++ b/src/com/vaadin/ui/RichTextArea.java @@ -103,6 +103,7 @@ public class RichTextArea extends AbstractField<String> implements setCaption(caption); } + @Override public void paintContent(PaintTarget target) throws PaintException { if (selectAll) { target.addAttribute("selectAll", true); @@ -185,6 +186,7 @@ public class RichTextArea extends AbstractField<String> implements } } + @Override public void changeVariables(Object source, Map<String, Object> variables) { // Sets the text if (variables.containsKey("text") && !isReadOnly()) { diff --git a/src/com/vaadin/ui/Root.java b/src/com/vaadin/ui/Root.java index 7ae687be79..bd4842632b 100644 --- a/src/com/vaadin/ui/Root.java +++ b/src/com/vaadin/ui/Root.java @@ -20,6 +20,9 @@ import com.vaadin.event.Action.Handler; import com.vaadin.event.ActionManager; import com.vaadin.event.MouseEvents.ClickEvent; import com.vaadin.event.MouseEvents.ClickListener; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.root.RootServerRpc; +import com.vaadin.shared.ui.root.RootState; import com.vaadin.terminal.Page; import com.vaadin.terminal.Page.BrowserWindowResizeEvent; import com.vaadin.terminal.Page.BrowserWindowResizeListener; @@ -29,9 +32,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.MouseEventDetails; -import com.vaadin.terminal.gwt.client.ui.root.RootServerRpc; -import com.vaadin.terminal.gwt.client.ui.root.RootState; import com.vaadin.terminal.gwt.client.ui.root.VRoot; import com.vaadin.ui.Window.CloseListener; @@ -419,6 +419,7 @@ public abstract class Root extends AbstractComponentContainer implements private Page page = new Page(this); private RootServerRpc rpc = new RootServerRpc() { + @Override public void click(MouseEventDetails mouseDetails) { fireEvent(new ClickEvent(Root.this, mouseDetails)); } @@ -502,6 +503,7 @@ public abstract class Root extends AbstractComponentContainer implements return this; } + @Override public void replaceComponent(Component oldComponent, Component newComponent) { throw new UnsupportedOperationException(); } @@ -511,6 +513,7 @@ public abstract class Root extends AbstractComponentContainer implements return application; } + @Override public void paintContent(PaintTarget target) throws PaintException { page.paintContent(target); @@ -550,6 +553,7 @@ public abstract class Root extends AbstractComponentContainer implements fireEvent(new ClickEvent(this, mouseDetails)); } + @Override @SuppressWarnings("unchecked") public void changeVariables(Object source, Map<String, Object> variables) { if (variables.containsKey(CLICK_EVENT_ID)) { @@ -578,6 +582,7 @@ public abstract class Root extends AbstractComponentContainer implements * * @see com.vaadin.ui.ComponentContainer#getComponentIterator() */ + @Override public Iterator<Component> getComponentIterator() { // TODO could directly create some kind of combined iterator instead of // creating a new ArrayList @@ -597,6 +602,7 @@ public abstract class Root extends AbstractComponentContainer implements * * @see com.vaadin.ui.ComponentContainer#getComponentCount() */ + @Override public int getComponentCount() { return windows.size() + (getContent() == null ? 0 : 1); } @@ -956,11 +962,13 @@ public abstract class Root extends AbstractComponentContainer implements return actionManager; } + @Override public <T extends Action & com.vaadin.event.Action.Listener> void addAction( T action) { getActionManager().addAction(action); } + @Override public <T extends Action & com.vaadin.event.Action.Listener> void removeAction( T action) { if (actionManager != null) { @@ -968,10 +976,12 @@ public abstract class Root extends AbstractComponentContainer implements } } + @Override public void addActionHandler(Handler actionHandler) { getActionManager().addActionHandler(actionHandler); } + @Override public void removeActionHandler(Handler actionHandler) { if (actionManager != null) { actionManager.removeActionHandler(actionHandler); @@ -1071,11 +1081,14 @@ public abstract class Root extends AbstractComponentContainer implements * @param caption * The message * - * @deprecated As of 7.0, use Notification.show instead + * @deprecated As of 7.0, use Notification.show instead but be aware that + * Notification.show does not allow HTML. */ @Deprecated public void showNotification(String caption) { - getPage().showNotification(new Notification(caption)); + Notification notification = new Notification(caption); + notification.setHtmlContentAllowed(true);// Backwards compatibility + getPage().showNotification(notification); } /** @@ -1094,11 +1107,14 @@ public abstract class Root extends AbstractComponentContainer implements * @param type * The message type * - * @deprecated As of 7.0, use Notification.show instead + * @deprecated As of 7.0, use Notification.show instead but be aware that + * Notification.show does not allow HTML. */ @Deprecated public void showNotification(String caption, int type) { - getPage().showNotification(new Notification(caption, type)); + Notification notification = new Notification(caption, type); + notification.setHtmlContentAllowed(true);// Backwards compatibility + getPage().showNotification(notification); } /** @@ -1117,11 +1133,14 @@ public abstract class Root extends AbstractComponentContainer implements * @param description * The message description * - * @deprecated As of 7.0, use Notification.show instead + * @deprecated As of 7.0, use new Notification(...).show(Page) instead but + * be aware that HTML by default not allowed. */ @Deprecated public void showNotification(String caption, String description) { - getPage().showNotification(new Notification(caption, description)); + Notification notification = new Notification(caption, description); + notification.setHtmlContentAllowed(true);// Backwards compatibility + getPage().showNotification(notification); } /** @@ -1143,12 +1162,14 @@ public abstract class Root extends AbstractComponentContainer implements * @param type * The message type * - * @deprecated As of 7.0, use Notification.show instead + * @deprecated As of 7.0, use new Notification(...).show(Page) instead but + * be aware that HTML by default not allowed. */ @Deprecated public void showNotification(String caption, String description, int type) { - getPage() - .showNotification(new Notification(caption, description, type)); + Notification notification = new Notification(caption, description, type); + notification.setHtmlContentAllowed(true);// Backwards compatibility + getPage().showNotification(notification); } /** @@ -1173,7 +1194,7 @@ public abstract class Root extends AbstractComponentContainer implements * Whether html in the caption and description should be * displayed as html or as plain text * - * @deprecated As of 7.0, use Notification.show instead + * @deprecated As of 7.0, use new Notification(...).show(Page). */ @Deprecated public void showNotification(String caption, String description, int type, diff --git a/src/com/vaadin/ui/Select.java b/src/com/vaadin/ui/Select.java index 5398f11391..f60935c64b 100644 --- a/src/com/vaadin/ui/Select.java +++ b/src/com/vaadin/ui/Select.java @@ -677,10 +677,12 @@ public class Select extends AbstractSelect implements AbstractSelect.Filtering, super.requestRepaint(); } + @Override public void setFilteringMode(int filteringMode) { this.filteringMode = filteringMode; } + @Override public int getFilteringMode() { return filteringMode; } @@ -719,20 +721,24 @@ public class Select extends AbstractSelect implements AbstractSelect.Filtering, return columns; } + @Override public void addListener(BlurListener listener) { addListener(BlurEvent.EVENT_ID, BlurEvent.class, listener, BlurListener.blurMethod); } + @Override public void removeListener(BlurListener listener) { removeListener(BlurEvent.EVENT_ID, BlurEvent.class, listener); } + @Override public void addListener(FocusListener listener) { addListener(FocusEvent.EVENT_ID, FocusEvent.class, listener, FocusListener.focusMethod); } + @Override public void removeListener(FocusListener listener) { removeListener(FocusEvent.EVENT_ID, FocusEvent.class, listener); diff --git a/src/com/vaadin/ui/Slider.java b/src/com/vaadin/ui/Slider.java index dc5dc0be98..94afe4e2bd 100644 --- a/src/com/vaadin/ui/Slider.java +++ b/src/com/vaadin/ui/Slider.java @@ -278,6 +278,7 @@ public class Slider extends AbstractField<Double> implements Vaadin6Component { super.setValue(newFieldValue); } + @Override public void paintContent(PaintTarget target) throws PaintException { target.addAttribute("min", min); @@ -307,6 +308,7 @@ public class Slider extends AbstractField<Double> implements Vaadin6Component { * @param source * @param variables */ + @Override public void changeVariables(Object source, Map<String, Object> variables) { if (variables.containsKey("value")) { final Object value = variables.get("value"); diff --git a/src/com/vaadin/ui/TabSheet.java b/src/com/vaadin/ui/TabSheet.java index 061809de67..c52e9394c0 100644 --- a/src/com/vaadin/ui/TabSheet.java +++ b/src/com/vaadin/ui/TabSheet.java @@ -109,6 +109,7 @@ public class TabSheet extends AbstractComponentContainer implements Focusable, setImmediate(true); setCloseHandler(new CloseHandler() { + @Override public void onTabClose(TabSheet tabsheet, Component c) { tabsheet.removeComponent(c); } @@ -122,6 +123,7 @@ public class TabSheet extends AbstractComponentContainer implements Focusable, * @return the unmodifiable Iterator of the tab content components */ + @Override public Iterator<Component> getComponentIterator() { return Collections.unmodifiableList(components).iterator(); } @@ -133,6 +135,7 @@ public class TabSheet extends AbstractComponentContainer implements Focusable, * @return the number of contained components */ + @Override public int getComponentCount() { return components.size(); } @@ -366,6 +369,7 @@ public class TabSheet extends AbstractComponentContainer implements Focusable, * if the paint operation failed. */ + @Override public void paintContent(PaintTarget target) throws PaintException { if (areTabsHidden()) { @@ -691,6 +695,7 @@ public class TabSheet extends AbstractComponentContainer implements Focusable, // inherits javadoc + @Override public void changeVariables(Object source, Map<String, Object> variables) { if (variables.containsKey("selected")) { setSelectedTab(keyMapper.get((String) variables.get("selected"))); @@ -728,6 +733,7 @@ public class TabSheet extends AbstractComponentContainer implements Focusable, * {@inheritDoc} */ + @Override public void replaceComponent(Component oldComponent, Component newComponent) { if (selected == oldComponent) { @@ -1083,28 +1089,34 @@ public class TabSheet extends AbstractComponentContainer implements Focusable, * Returns the tab caption. Can never be null. */ + @Override public String getCaption() { return caption; } + @Override public void setCaption(String caption) { this.caption = caption; requestRepaint(); } + @Override public Resource getIcon() { return icon; } + @Override public void setIcon(Resource icon) { this.icon = icon; requestRepaint(); } + @Override public boolean isEnabled() { return enabled; } + @Override public void setEnabled(boolean enabled) { this.enabled = enabled; if (updateSelection()) { @@ -1113,10 +1125,12 @@ public class TabSheet extends AbstractComponentContainer implements Focusable, requestRepaint(); } + @Override public boolean isVisible() { return visible; } + @Override public void setVisible(boolean visible) { this.visible = visible; if (updateSelection()) { @@ -1125,10 +1139,12 @@ public class TabSheet extends AbstractComponentContainer implements Focusable, requestRepaint(); } + @Override public boolean isClosable() { return closable; } + @Override public void setClosable(boolean closable) { this.closable = closable; requestRepaint(); @@ -1138,24 +1154,29 @@ public class TabSheet extends AbstractComponentContainer implements Focusable, } + @Override public String getDescription() { return description; } + @Override public void setDescription(String description) { this.description = description; requestRepaint(); } + @Override public ErrorMessage getComponentError() { return componentError; } + @Override public void setComponentError(ErrorMessage componentError) { this.componentError = componentError; requestRepaint(); } + @Override public Component getComponent() { for (Map.Entry<Component, Tab> entry : tabs.entrySet()) { if (entry.getValue() == this) { @@ -1165,11 +1186,13 @@ public class TabSheet extends AbstractComponentContainer implements Focusable, return null; } + @Override public void setStyleName(String styleName) { this.styleName = styleName; requestRepaint(); } + @Override public String getStyleName() { return styleName; } @@ -1245,29 +1268,35 @@ public class TabSheet extends AbstractComponentContainer implements Focusable, super.focus(); } + @Override public int getTabIndex() { return tabIndex; } + @Override public void setTabIndex(int tabIndex) { this.tabIndex = tabIndex; requestRepaint(); } + @Override public void addListener(BlurListener listener) { addListener(BlurEvent.EVENT_ID, BlurEvent.class, listener, BlurListener.blurMethod); } + @Override public void removeListener(BlurListener listener) { removeListener(BlurEvent.EVENT_ID, BlurEvent.class, listener); } + @Override public void addListener(FocusListener listener) { addListener(FocusEvent.EVENT_ID, FocusEvent.class, listener, FocusListener.focusMethod); } + @Override public void removeListener(FocusListener listener) { removeListener(FocusEvent.EVENT_ID, FocusEvent.class, listener); diff --git a/src/com/vaadin/ui/Table.java b/src/com/vaadin/ui/Table.java index a1cc4f95fe..39b7fb7473 100644 --- a/src/com/vaadin/ui/Table.java +++ b/src/com/vaadin/ui/Table.java @@ -40,12 +40,12 @@ import com.vaadin.event.dd.DragSource; import com.vaadin.event.dd.DropHandler; import com.vaadin.event.dd.DropTarget; import com.vaadin.event.dd.acceptcriteria.ServerSideCriterion; +import com.vaadin.shared.MouseEventDetails; import com.vaadin.terminal.KeyMapper; import com.vaadin.terminal.LegacyPaint; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.PaintTarget; import com.vaadin.terminal.Resource; -import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.ui.table.VScrollTable; /** @@ -538,6 +538,13 @@ public class Table extends AbstractSelect implements Action.Container, private HashMap<Object, Converter<String, Object>> propertyValueConverters = new HashMap<Object, Converter<String, Object>>(); + /** + * Set to true if the client-side should be informed that the key mapper has + * been reset so it can avoid sending back references to keys that are no + * longer present. + */ + private boolean keyMapperReset; + /* Table constructors */ /** @@ -1587,9 +1594,10 @@ public class Table extends AbstractSelect implements Action.Container, // Collects the basic facts about the table page final int pagelen = getPageLength(); - int firstIndex = getCurrentPageFirstItemIndex(); int rows, totalRows; rows = totalRows = size(); + int firstIndex = Math + .min(getCurrentPageFirstItemIndex(), totalRows - 1); if (rows > 0 && firstIndex >= 0) { rows -= firstIndex; } @@ -2409,8 +2417,9 @@ public class Table extends AbstractSelect implements Action.Container, * The end key * @return */ - private Set<Object> getItemIdsInRange(Object itemId, final int length) { - HashSet<Object> ids = new HashSet<Object>(); + private LinkedHashSet<Object> getItemIdsInRange(Object itemId, + final int length) { + LinkedHashSet<Object> ids = new LinkedHashSet<Object>(); for (int i = 0; i < length; i++) { assert itemId != null; // should not be null unless client-server // are out of sync @@ -2430,21 +2439,15 @@ public class Table extends AbstractSelect implements Action.Container, final String[] ka = (String[]) variables.get("selected"); final String[] ranges = (String[]) variables.get("selectedRanges"); - Set<Object> renderedItemIds = getCurrentlyRenderedItemIds(); + Set<Object> renderedButNotSelectedItemIds = getCurrentlyRenderedItemIds(); @SuppressWarnings("unchecked") - HashSet<Object> newValue = new HashSet<Object>( + HashSet<Object> newValue = new LinkedHashSet<Object>( (Collection<Object>) getValue()); if (variables.containsKey("clearSelections")) { // the client side has instructed to swipe all previous selections newValue.clear(); - } else { - /* - * first clear all selections that are currently rendered rows (the - * ones that the client side counterpart is aware of) - */ - newValue.removeAll(renderedItemIds); } /* @@ -2461,6 +2464,7 @@ public class Table extends AbstractSelect implements Action.Container, requestRepaint(); } else if (id != null && containsId(id)) { newValue.add(id); + renderedButNotSelectedItemIds.remove(id); } } @@ -2470,9 +2474,17 @@ public class Table extends AbstractSelect implements Action.Container, String[] split = range.split("-"); Object startItemId = itemIdMapper.get(split[0]); int length = Integer.valueOf(split[1]); - newValue.addAll(getItemIdsInRange(startItemId, length)); + LinkedHashSet<Object> itemIdsInRange = getItemIdsInRange( + startItemId, length); + newValue.addAll(itemIdsInRange); + renderedButNotSelectedItemIds.removeAll(itemIdsInRange); } } + /* + * finally clear all currently rendered rows (the ones that the client + * side counterpart is aware of) that the client didn't send as selected + */ + newValue.removeAll(renderedButNotSelectedItemIds); if (!isNullSelectionAllowed() && newValue.isEmpty()) { // empty selection not allowed, keep old value @@ -2885,6 +2897,11 @@ public class Table extends AbstractSelect implements Action.Container, paintVisibleColumns(target); + if (keyMapperReset) { + keyMapperReset = false; + target.addAttribute(VScrollTable.ATTRIBUTE_KEY_MAPPER_RESET, true); + } + if (dropHandler != null) { dropHandler.getAcceptCriterion().paint(target); } @@ -3681,6 +3698,7 @@ public class Table extends AbstractSelect implements Action.Container, * @see com.vaadin.event.Action.Container#addActionHandler(Action.Handler) */ + @Override public void addActionHandler(Action.Handler actionHandler) { if (actionHandler != null) { @@ -3708,6 +3726,7 @@ public class Table extends AbstractSelect implements Action.Container, * @see com.vaadin.event.Action.Container#removeActionHandler(Action.Handler) */ + @Override public void removeActionHandler(Action.Handler actionHandler) { if (actionHandlers != null && actionHandlers.contains(actionHandler)) { @@ -4046,6 +4065,10 @@ public class Table extends AbstractSelect implements Action.Container, public void containerItemSetChange(Container.ItemSetChangeEvent event) { super.containerItemSetChange(event); + // super method clears the key map, must inform client about this to + // avoid getting invalid keys back (#8584) + keyMapperReset = true; + // ensure that page still has first item in page, ignore buffer refresh // (forced in this method) setCurrentPageFirstItemIndex(getCurrentPageFirstItemIndex(), false); @@ -4117,6 +4140,7 @@ public class Table extends AbstractSelect implements Action.Container, * @see com.vaadin.data.Container.Ordered#nextItemId(java.lang.Object) */ + @Override public Object nextItemId(Object itemId) { return ((Container.Ordered) items).nextItemId(itemId); } @@ -4128,6 +4152,7 @@ public class Table extends AbstractSelect implements Action.Container, * @see com.vaadin.data.Container.Ordered#prevItemId(java.lang.Object) */ + @Override public Object prevItemId(Object itemId) { return ((Container.Ordered) items).prevItemId(itemId); } @@ -4138,6 +4163,7 @@ public class Table extends AbstractSelect implements Action.Container, * @see com.vaadin.data.Container.Ordered#firstItemId() */ + @Override public Object firstItemId() { return ((Container.Ordered) items).firstItemId(); } @@ -4148,6 +4174,7 @@ public class Table extends AbstractSelect implements Action.Container, * @see com.vaadin.data.Container.Ordered#lastItemId() */ + @Override public Object lastItemId() { return ((Container.Ordered) items).lastItemId(); } @@ -4159,6 +4186,7 @@ public class Table extends AbstractSelect implements Action.Container, * @see com.vaadin.data.Container.Ordered#isFirstId(java.lang.Object) */ + @Override public boolean isFirstId(Object itemId) { return ((Container.Ordered) items).isFirstId(itemId); } @@ -4170,6 +4198,7 @@ public class Table extends AbstractSelect implements Action.Container, * @see com.vaadin.data.Container.Ordered#isLastId(java.lang.Object) */ + @Override public boolean isLastId(Object itemId) { return ((Container.Ordered) items).isLastId(itemId); } @@ -4180,6 +4209,7 @@ public class Table extends AbstractSelect implements Action.Container, * @see com.vaadin.data.Container.Ordered#addItemAfter(java.lang.Object) */ + @Override public Object addItemAfter(Object previousItemId) throws UnsupportedOperationException { Object itemId = ((Container.Ordered) items) @@ -4197,6 +4227,7 @@ public class Table extends AbstractSelect implements Action.Container, * java.lang.Object) */ + @Override public Item addItemAfter(Object previousItemId, Object newItemId) throws UnsupportedOperationException { Item item = ((Container.Ordered) items).addItemAfter(previousItemId, @@ -4290,6 +4321,7 @@ public class Table extends AbstractSelect implements Action.Container, * */ + @Override public void sort(Object[] propertyId, boolean[] ascending) throws UnsupportedOperationException { final Container c = getContainerDataSource(); @@ -4331,6 +4363,7 @@ public class Table extends AbstractSelect implements Action.Container, * @see com.vaadin.data.Container.Sortable#getSortableContainerPropertyIds() */ + @Override public Collection<?> getSortableContainerPropertyIds() { final Container c = getContainerDataSource(); if (c instanceof Container.Sortable && isSortEnabled()) { @@ -4544,11 +4577,13 @@ public class Table extends AbstractSelect implements Action.Container, public abstract String getStyle(Object itemId, Object propertyId); } + @Override public void addListener(ItemClickListener listener) { addListener(VScrollTable.ITEM_CLICK_EVENT_ID, ItemClickEvent.class, listener, ItemClickEvent.ITEM_CLICK_METHOD); } + @Override public void removeListener(ItemClickListener listener) { removeListener(VScrollTable.ITEM_CLICK_EVENT_ID, ItemClickEvent.class, listener); @@ -4625,11 +4660,13 @@ public class Table extends AbstractSelect implements Action.Container, } + @Override public TableTransferable getTransferable(Map<String, Object> rawVariables) { TableTransferable transferable = new TableTransferable(rawVariables); return transferable; } + @Override public DropHandler getDropHandler() { return dropHandler; } @@ -4638,6 +4675,7 @@ public class Table extends AbstractSelect implements Action.Container, this.dropHandler = dropHandler; } + @Override public AbstractSelectTargetDetails translateDropTargetDetails( Map<String, Object> clientVariables) { return new AbstractSelectTargetDetails(clientVariables); @@ -4706,6 +4744,7 @@ public class Table extends AbstractSelect implements Action.Container, * com.vaadin.event.dd.acceptcriteria.AcceptCriterion#accepts(com.vaadin * .event.dd.DragAndDropEvent) */ + @Override @SuppressWarnings("unchecked") public boolean accept(DragAndDropEvent dragEvent) { AbstractSelectTargetDetails dropTargetData = (AbstractSelectTargetDetails) dragEvent @@ -5381,10 +5420,12 @@ public class Table extends AbstractSelect implements Action.Container, super.setVisible(visible); } + @Override public Iterator<Component> iterator() { return getComponentIterator(); } + @Override public Iterator<Component> getComponentIterator() { if (visibleComponents == null) { Collection<Component> empty = Collections.emptyList(); @@ -5394,6 +5435,7 @@ public class Table extends AbstractSelect implements Action.Container, return visibleComponents.iterator(); } + @Override public boolean isComponentVisible(Component childComponent) { return true; } diff --git a/src/com/vaadin/ui/TextArea.java b/src/com/vaadin/ui/TextArea.java index 4c0b563b00..d7837dd33f 100644 --- a/src/com/vaadin/ui/TextArea.java +++ b/src/com/vaadin/ui/TextArea.java @@ -5,7 +5,7 @@ package com.vaadin.ui; import com.vaadin.data.Property; -import com.vaadin.terminal.gwt.client.ui.textarea.TextAreaState; +import com.vaadin.shared.ui.textarea.TextAreaState; /** * A text field that supports multi line editing. diff --git a/src/com/vaadin/ui/Tree.java b/src/com/vaadin/ui/Tree.java index dacb3a2027..c15975d879 100644 --- a/src/com/vaadin/ui/Tree.java +++ b/src/com/vaadin/ui/Tree.java @@ -37,12 +37,12 @@ import com.vaadin.event.dd.TargetDetails; import com.vaadin.event.dd.acceptcriteria.ClientSideCriterion; import com.vaadin.event.dd.acceptcriteria.ServerSideCriterion; import com.vaadin.event.dd.acceptcriteria.TargetDetailIs; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.dd.VerticalDropLocation; import com.vaadin.terminal.KeyMapper; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.PaintTarget; import com.vaadin.terminal.Resource; -import com.vaadin.terminal.gwt.client.MouseEventDetails; -import com.vaadin.terminal.gwt.client.ui.dd.VerticalDropLocation; import com.vaadin.terminal.gwt.client.ui.tree.TreeConnector; import com.vaadin.terminal.gwt.client.ui.tree.VTree; import com.vaadin.tools.ReflectTools; @@ -721,6 +721,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, * * @see com.vaadin.data.Container.Hierarchical#areChildrenAllowed(Object) */ + @Override public boolean areChildrenAllowed(Object itemId) { return ((Container.Hierarchical) items).areChildrenAllowed(itemId); } @@ -730,6 +731,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, * * @see com.vaadin.data.Container.Hierarchical#getChildren(Object) */ + @Override public Collection<?> getChildren(Object itemId) { return ((Container.Hierarchical) items).getChildren(itemId); } @@ -739,6 +741,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, * * @see com.vaadin.data.Container.Hierarchical#getParent(Object) */ + @Override public Object getParent(Object itemId) { return ((Container.Hierarchical) items).getParent(itemId); } @@ -748,6 +751,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, * * @see com.vaadin.data.Container.Hierarchical#hasChildren(Object) */ + @Override public boolean hasChildren(Object itemId) { return ((Container.Hierarchical) items).hasChildren(itemId); } @@ -757,6 +761,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, * * @see com.vaadin.data.Container.Hierarchical#isRoot(Object) */ + @Override public boolean isRoot(Object itemId) { return ((Container.Hierarchical) items).isRoot(itemId); } @@ -766,6 +771,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, * * @see com.vaadin.data.Container.Hierarchical#rootItemIds() */ + @Override public Collection<?> rootItemIds() { return ((Container.Hierarchical) items).rootItemIds(); } @@ -776,6 +782,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, * @see com.vaadin.data.Container.Hierarchical#setChildrenAllowed(Object, * boolean) */ + @Override public boolean setChildrenAllowed(Object itemId, boolean areChildrenAllowed) { final boolean success = ((Container.Hierarchical) items) .setChildrenAllowed(itemId, areChildrenAllowed); @@ -791,6 +798,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, * @see com.vaadin.data.Container.Hierarchical#setParent(java.lang.Object , * java.lang.Object) */ + @Override public boolean setParent(Object itemId, Object newParentId) { final boolean success = ((Container.Hierarchical) items).setParent( itemId, newParentId); @@ -1015,6 +1023,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, * * @see com.vaadin.event.Action.Container#addActionHandler(Action.Handler) */ + @Override public void addActionHandler(Action.Handler actionHandler) { if (actionHandler != null) { @@ -1036,6 +1045,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, * * @see com.vaadin.event.Action.Container#removeActionHandler(Action.Handler) */ + @Override public void removeActionHandler(Action.Handler actionHandler) { if (actionHandlers != null && actionHandlers.contains(actionHandler)) { @@ -1150,11 +1160,13 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, private DropHandler dropHandler; + @Override public void addListener(ItemClickListener listener) { addListener(VTree.ITEM_CLICK_EVENT_ID, ItemClickEvent.class, listener, ItemClickEvent.ITEM_CLICK_METHOD); } + @Override public void removeListener(ItemClickListener listener) { removeListener(VTree.ITEM_CLICK_EVENT_ID, ItemClickEvent.class, listener); @@ -1206,6 +1218,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, return super.removeItem(itemId); } + @Override public DropHandler getDropHandler() { return dropHandler; } @@ -1304,6 +1317,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, * @see * com.vaadin.event.dd.DropTarget#translateDropTargetDetails(java.util.Map) */ + @Override public TreeTargetDetails translateDropTargetDetails( Map<String, Object> clientVariables) { return new TreeTargetDetails(clientVariables); @@ -1371,6 +1385,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, * * @see com.vaadin.event.dd.DragSource#getTransferable(java.util.Map) */ + @Override public Transferable getTransferable(Map<String, Object> payload) { TreeTransferable transferable = new TreeTransferable(this, payload); // updating drag source variables @@ -1418,6 +1433,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, * com.vaadin.event.dd.acceptCriteria.AcceptCriterion#accepts(com.vaadin * .event.dd.DragAndDropEvent) */ + @Override public boolean accept(DragAndDropEvent dragEvent) { AbstractSelectTargetDetails dropTargetData = (AbstractSelectTargetDetails) dragEvent .getTargetDetails(); @@ -1541,6 +1557,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, this.depthToCheck = depthToCheck; } + @Override public boolean accept(DragAndDropEvent dragEvent) { try { TreeTargetDetails eventDetails = (TreeTargetDetails) dragEvent diff --git a/src/com/vaadin/ui/TreeTable.java b/src/com/vaadin/ui/TreeTable.java index 3294f6fab0..6132b652f7 100644 --- a/src/com/vaadin/ui/TreeTable.java +++ b/src/com/vaadin/ui/TreeTable.java @@ -82,6 +82,7 @@ public class TreeTable extends Table implements Hierarchical { * scalability with some container implementations. */ + @Override public int getDepth(Object itemId) { int depth = 0; Hierarchical hierarchicalContainer = getContainerDataSource(); @@ -92,6 +93,7 @@ public class TreeTable extends Table implements Hierarchical { return depth; } + @Override public void containerItemSetChange(ItemSetChangeEvent event) { } @@ -110,44 +112,54 @@ public class TreeTable extends Table implements Hierarchical { return (Collapsible) getContainerDataSource(); } + @Override public void toggleChildVisibility(Object itemId) { c().setCollapsed(itemId, !c().isCollapsed(itemId)); } + @Override public boolean isNodeOpen(Object itemId) { return !c().isCollapsed(itemId); } + @Override public int size() { return TreeTable.super.size(); } + @Override public Object getIdByIndex(int index) { return TreeTable.super.getIdByIndex(index); } + @Override public int indexOfId(Object id) { return TreeTable.super.indexOfId(id); } + @Override public boolean isLastId(Object itemId) { // using the default impl return TreeTable.super.isLastId(itemId); } + @Override public Object lastItemId() { // using the default impl return TreeTable.super.lastItemId(); } + @Override public Object nextItemId(Object itemId) { return TreeTable.super.nextItemId(itemId); } + @Override public Object prevItemId(Object itemId) { return TreeTable.super.prevItemId(itemId); } + @Override public Collection<?> getItemIds() { return TreeTable.super.getItemIds(); } @@ -165,18 +177,22 @@ public class TreeTable extends Table implements Hierarchical { private final HashSet<Object> openItems = new HashSet<Object>(); + @Override public boolean isNodeOpen(Object itemId) { return openItems.contains(itemId); } + @Override public int size() { return getPreOrder().size(); } + @Override public Collection<Object> getItemIds() { return Collections.unmodifiableCollection(getPreOrder()); } + @Override public boolean isLastId(Object itemId) { if (itemId == null) { return false; @@ -185,6 +201,7 @@ public class TreeTable extends Table implements Hierarchical { return itemId.equals(lastItemId()); } + @Override public Object lastItemId() { if (getPreOrder().size() > 0) { return getPreOrder().get(getPreOrder().size() - 1); @@ -193,6 +210,7 @@ public class TreeTable extends Table implements Hierarchical { } } + @Override public Object nextItemId(Object itemId) { int indexOf = getPreOrder().indexOf(itemId); if (indexOf == -1) { @@ -206,6 +224,7 @@ public class TreeTable extends Table implements Hierarchical { } } + @Override public Object prevItemId(Object itemId) { int indexOf = getPreOrder().indexOf(itemId); indexOf--; @@ -216,6 +235,7 @@ public class TreeTable extends Table implements Hierarchical { } } + @Override public void toggleChildVisibility(Object itemId) { boolean removed = openItems.remove(itemId); if (!removed) { @@ -265,10 +285,12 @@ public class TreeTable extends Table implements Hierarchical { } + @Override public int indexOfId(Object id) { return getPreOrder().indexOf(id); } + @Override public Object getIdByIndex(int index) { return getPreOrder().get(index); } @@ -610,36 +632,44 @@ public class TreeTable extends Table implements Hierarchical { return getContainerStrategy().getItemIds(); } + @Override public boolean areChildrenAllowed(Object itemId) { return getContainerDataSource().areChildrenAllowed(itemId); } + @Override public Collection<?> getChildren(Object itemId) { return getContainerDataSource().getChildren(itemId); } + @Override public Object getParent(Object itemId) { return getContainerDataSource().getParent(itemId); } + @Override public boolean hasChildren(Object itemId) { return getContainerDataSource().hasChildren(itemId); } + @Override public boolean isRoot(Object itemId) { return getContainerDataSource().isRoot(itemId); } + @Override public Collection<?> rootItemIds() { return getContainerDataSource().rootItemIds(); } + @Override public boolean setChildrenAllowed(Object itemId, boolean areChildrenAllowed) throws UnsupportedOperationException { return getContainerDataSource().setChildrenAllowed(itemId, areChildrenAllowed); } + @Override public boolean setParent(Object itemId, Object newParentId) throws UnsupportedOperationException { return getContainerDataSource().setParent(itemId, newParentId); diff --git a/src/com/vaadin/ui/Upload.java b/src/com/vaadin/ui/Upload.java index 4dff71e45b..9d533b67f6 100644 --- a/src/com/vaadin/ui/Upload.java +++ b/src/com/vaadin/ui/Upload.java @@ -122,6 +122,7 @@ public class Upload extends AbstractComponent implements Component.Focusable, * @see com.vaadin.ui.AbstractComponent#changeVariables(java.lang.Object, * java.util.Map) */ + @Override public void changeVariables(Object source, Map<String, Object> variables) { if (variables.containsKey("pollForStart")) { int id = (Integer) variables.get("pollForStart"); @@ -141,6 +142,7 @@ public class Upload extends AbstractComponent implements Component.Focusable, * @throws PaintException * if the paint operation failed. */ + @Override public void paintContent(PaintTarget target) throws PaintException { if (notStarted) { target.addAttribute("notStarted", true); @@ -782,6 +784,7 @@ public class Upload extends AbstractComponent implements Component.Focusable, * * @see com.vaadin.ui.Component.Focusable#getTabIndex() */ + @Override public int getTabIndex() { return tabIndex; } @@ -791,6 +794,7 @@ public class Upload extends AbstractComponent implements Component.Focusable, * * @see com.vaadin.ui.Component.Focusable#setTabIndex(int) */ + @Override public void setTabIndex(int tabIndex) { this.tabIndex = tabIndex; } @@ -974,20 +978,24 @@ public class Upload extends AbstractComponent implements Component.Focusable, streamVariable = new com.vaadin.terminal.StreamVariable() { private StreamingStartEvent lastStartedEvent; + @Override public boolean listenProgress() { return (progressListeners != null && !progressListeners .isEmpty()); } + @Override public void onProgress(StreamingProgressEvent event) { fireUpdateProgress(event.getBytesReceived(), event.getContentLength()); } + @Override public boolean isInterrupted() { return interrupted; } + @Override public OutputStream getOutputStream() { OutputStream receiveUpload = receiver.receiveUpload( lastStartedEvent.getFileName(), @@ -996,6 +1004,7 @@ public class Upload extends AbstractComponent implements Component.Focusable, return receiveUpload; } + @Override public void streamingStarted(StreamingStartEvent event) { startUpload(); contentLength = event.getContentLength(); @@ -1003,6 +1012,7 @@ public class Upload extends AbstractComponent implements Component.Focusable, lastStartedEvent = event; } + @Override public void streamingFinished(StreamingEndEvent event) { fireUploadSuccess(event.getFileName(), event.getMimeType(), event.getContentLength()); @@ -1010,6 +1020,7 @@ public class Upload extends AbstractComponent implements Component.Focusable, requestRepaint(); } + @Override public void streamingFailed(StreamingErrorEvent event) { Exception exception = event.getException(); if (exception instanceof NoInputStreamException) { diff --git a/src/com/vaadin/ui/Video.java b/src/com/vaadin/ui/Video.java index 0a2eccca0f..d4f95a5be3 100644 --- a/src/com/vaadin/ui/Video.java +++ b/src/com/vaadin/ui/Video.java @@ -4,8 +4,8 @@ package com.vaadin.ui; +import com.vaadin.shared.ui.video.VideoState; import com.vaadin.terminal.Resource; -import com.vaadin.terminal.gwt.client.ui.video.VideoState; import com.vaadin.terminal.gwt.server.ResourceReference; /** @@ -67,7 +67,7 @@ public class Video extends AbstractMedia { * @param poster */ public void setPoster(Resource poster) { - getState().setPoster(new ResourceReference(poster)); + getState().setPoster(ResourceReference.create(poster)); requestRepaint(); } @@ -75,7 +75,7 @@ public class Video extends AbstractMedia { * @return The poster image. */ public Resource getPoster() { - return ((ResourceReference) getState().getPoster()).getResource(); + return ResourceReference.getResource(getState().getPoster()); } } diff --git a/src/com/vaadin/ui/Window.java b/src/com/vaadin/ui/Window.java index 8866362587..e413d35e6d 100644 --- a/src/com/vaadin/ui/Window.java +++ b/src/com/vaadin/ui/Window.java @@ -19,13 +19,13 @@ import com.vaadin.event.ShortcutAction; import com.vaadin.event.ShortcutAction.KeyCode; import com.vaadin.event.ShortcutAction.ModifierKey; import com.vaadin.event.ShortcutListener; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.window.WindowServerRpc; +import com.vaadin.shared.ui.window.WindowState; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.PaintTarget; import com.vaadin.terminal.Vaadin6Component; -import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.ui.root.VRoot; -import com.vaadin.terminal.gwt.client.ui.window.WindowServerRpc; -import com.vaadin.terminal.gwt.client.ui.window.WindowState; /** * A component that represents a floating popup window that can be added to a @@ -44,6 +44,10 @@ import com.vaadin.terminal.gwt.client.ui.window.WindowState; * <p> * The caption is displayed in the window header. * </p> + * <p> + * In Vaadin versions prior to 7.0.0, Window was also used as application level + * windows. This function is now covered by the {@link Root} class. + * </p> * * @author Vaadin Ltd. * @version @@ -56,6 +60,7 @@ public class Window extends Panel implements FocusNotifier, BlurNotifier, private WindowServerRpc rpc = new WindowServerRpc() { + @Override public void click(MouseEventDetails mouseDetails) { fireEvent(new ClickEvent(Window.this, mouseDetails)); } @@ -793,11 +798,13 @@ public class Window extends Panel implements FocusNotifier, BlurNotifier, * @see com.vaadin.event.FieldEvents.FocusNotifier#addListener(com.vaadin.event.FieldEvents.FocusListener) */ + @Override public void addListener(FocusListener listener) { addListener(FocusEvent.EVENT_ID, FocusEvent.class, listener, FocusListener.focusMethod); } + @Override public void removeListener(FocusListener listener) { removeListener(FocusEvent.EVENT_ID, FocusEvent.class, listener); } @@ -810,11 +817,13 @@ public class Window extends Panel implements FocusNotifier, BlurNotifier, * @see com.vaadin.event.FieldEvents.BlurNotifier#addListener(com.vaadin.event.FieldEvents.BlurListener) */ + @Override public void addListener(BlurListener listener) { addListener(BlurEvent.EVENT_ID, BlurEvent.class, listener, BlurListener.blurMethod); } + @Override public void removeListener(BlurListener listener) { removeListener(BlurEvent.EVENT_ID, BlurEvent.class, listener); } |