From 453099e29f5d6ca12f448eb9bb4264efd087ebf3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Leif=20=C3=85strand?= Date: Fri, 5 Apr 2013 13:53:30 +0300 Subject: [PATCH] Require implementing hasTooltip if there's custom tooltip logic (#11052) Change-Id: I3038b97d9a7c7e144a325ce87aa849309b9b31c4 --- .../ConnectorBundleLoaderFactory.java | 16 --------- .../metadata/ConnectorBundle.java | 34 ------------------- .../metadata/WidgetInitVisitor.java | 19 ----------- .../com/vaadin/client/ComponentConnector.java | 19 +++++++++++ client/src/com/vaadin/client/VTooltip.java | 3 ++ .../vaadin/client/metadata/TypeDataStore.java | 19 ----------- .../client/ui/AbstractComponentConnector.java | 32 ++--------------- .../client/ui/calendar/CalendarConnector.java | 9 +++++ .../vaadin/client/ui/form/FormConnector.java | 5 +++ .../ui/formlayout/FormLayoutConnector.java | 9 +++++ .../client/ui/menubar/MenuBarConnector.java | 10 ++++++ .../client/ui/table/TableConnector.java | 10 ++++++ .../client/ui/tabsheet/TabsheetConnector.java | 10 ++++++ .../vaadin/client/ui/tree/TreeConnector.java | 10 ++++++ .../com/vaadin/client/ui/ui/UIConnector.java | 11 +++--- 15 files changed, 92 insertions(+), 124 deletions(-) diff --git a/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java b/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java index 2be3bf5a16..f8aa586064 100644 --- a/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java +++ b/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java @@ -334,22 +334,6 @@ public class ConnectorBundleLoaderFactory extends Generator { writeGetters(logger, w, bundle); writeSerializers(logger, w, bundle); writeDelegateToWidget(logger, w, bundle); - writeHasGetTooltip(logger, w, bundle); - } - - /** - * @deprecated As of 7.0.1. This is just a hack to avoid breaking backwards - * compatibility and will be removed in Vaadin 7.1 - */ - @Deprecated - private void writeHasGetTooltip(TreeLogger logger, SplittingSourceWriter w, - ConnectorBundle bundle) { - Set types = bundle.getHasGetTooltip(); - for (JClassType type : types) { - w.println("store.setHasGetTooltipInfo(%s);", - getClassLiteralString(type)); - w.splitIfNeeded(); - } } private void writeDelegateToWidget(TreeLogger logger, diff --git a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java index f6dc982f15..cbdd3e89aa 100644 --- a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java +++ b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java @@ -63,7 +63,6 @@ public class ConnectorBundle { private final Set needsGwtConstructor = new HashSet(); private final Set visitedTypes = new HashSet(); private final Set needsProxySupport = new HashSet(); - private final Set hasGetTooltip = new HashSet(); private final Map> identifiers = new HashMap>(); private final Map> needsReturnType = new HashMap>(); @@ -620,37 +619,4 @@ public class ConnectorBundle { return Collections.unmodifiableSet(needsDelegateToWidget); } - /** - * @deprecated As of 7.0.1. This is just a hack to avoid breaking backwards - * compatibility and will be removed in Vaadin 7.1 - */ - @Deprecated - public Set getHasGetTooltip() { - return Collections.unmodifiableSet(hasGetTooltip); - } - - /** - * @deprecated As of 7.0.1. This is just a hack to avoid breaking backwards - * compatibility and will be removed in Vaadin 7.1 - */ - @Deprecated - public void setHasGetTooltip(JClassType type) { - if (!isHasGetTooltip(type)) { - hasGetTooltip.add(type); - } - } - - /** - * @deprecated As of 7.0.1. This is just a hack to avoid breaking backwards - * compatibility and will be removed in Vaadin 7.1 - */ - @Deprecated - private boolean isHasGetTooltip(JClassType type) { - if (hasGetTooltip.contains(type)) { - return true; - } else { - return previousBundle != null - && previousBundle.isHasGetTooltip(type); - } - } } \ No newline at end of file diff --git a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/WidgetInitVisitor.java b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/WidgetInitVisitor.java index 662ecf872b..4de9d2ae99 100644 --- a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/WidgetInitVisitor.java +++ b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/WidgetInitVisitor.java @@ -47,25 +47,6 @@ public class WidgetInitVisitor extends TypeVisitor { bundle.setNeedsReturnType(type, getWidget); } - // Hack to detect when getTooltipInfo has a custom implementation - // #11051 - JClassType getTooltipParamType = type.getOracle().findType( - "com.google.gwt.dom.client.Element"); - JMethod getTooltipInfoMethod = findInheritedMethod(type, - "getTooltipInfo", getTooltipParamType); - if (getTooltipInfoMethod == null) { - logger.log(Type.ERROR, "Could not find getTooltipInfo in " - + type.getQualifiedSourceName()); - throw new UnableToCompleteException(); - } - JClassType enclosingType = getTooltipInfoMethod.getEnclosingType(); - if (!enclosingType.getQualifiedSourceName().equals( - AbstractComponentConnector.class.getCanonicalName())) { - logger.log(Type.WARN, type.getQualifiedSourceName() - + " has overridden getTooltipInfo"); - bundle.setHasGetTooltip(type); - } - // Check state properties for @DelegateToWidget JMethod getState = findInheritedMethod(type, "getState"); JClassType stateType = getState.getReturnType().isClass(); diff --git a/client/src/com/vaadin/client/ComponentConnector.java b/client/src/com/vaadin/client/ComponentConnector.java index eecc3fda0c..f923a9dade 100644 --- a/client/src/com/vaadin/client/ComponentConnector.java +++ b/client/src/com/vaadin/client/ComponentConnector.java @@ -119,6 +119,11 @@ public interface ComponentConnector extends ServerConnector { /** * Gets the tooltip info for the given element. + *

+ * When overriding this method, {@link #hasTooltip()} should also be + * overridden to return true in all situations where this + * method might return a non-empty result. + *

* * @param element * The element to lookup a tooltip for @@ -127,6 +132,20 @@ public interface ComponentConnector extends ServerConnector { */ public TooltipInfo getTooltipInfo(Element element); + /** + * Check whether there might be a tooltip for this component. The framework + * will only add event listeners for automatically handling tooltips (using + * {@link #getTooltipInfo(Element)}) if this method returns true. + *

+ * This is only done to optimize performance, so in cases where the status + * is not known, it's safer to return true so that there will + * be a tooltip handler even though it might not be needed in all cases. + * + * @return true if some part of the component might have a + * tooltip, otherwise false + */ + public boolean hasTooltip(); + /** * Called for the active (focused) connector when a situation occurs that * the focused connector might have buffered changes which need to be diff --git a/client/src/com/vaadin/client/VTooltip.java b/client/src/com/vaadin/client/VTooltip.java index 53770f4201..61d155d668 100644 --- a/client/src/com/vaadin/client/VTooltip.java +++ b/client/src/com/vaadin/client/VTooltip.java @@ -340,6 +340,9 @@ public class VTooltip extends VOverlay { } if (connector != null && info != null) { + assert connector.hasTooltip() : "getTooltipInfo for " + + Util.getConnectorString(connector) + + " returned a tooltip even though hasTooltip claims there are no tooltips for the connector."; currentTooltipInfo = info; return true; } diff --git a/client/src/com/vaadin/client/metadata/TypeDataStore.java b/client/src/com/vaadin/client/metadata/TypeDataStore.java index dff02749f8..aa37d75dc8 100644 --- a/client/src/com/vaadin/client/metadata/TypeDataStore.java +++ b/client/src/com/vaadin/client/metadata/TypeDataStore.java @@ -41,7 +41,6 @@ public class TypeDataStore { private final FastStringSet delayedMethods = FastStringSet.create(); private final FastStringSet lastOnlyMethods = FastStringSet.create(); - private final FastStringSet hasGetTooltipInfo = FastStringSet.create(); private final FastStringMap returnTypes = FastStringMap.create(); private final FastStringMap invokers = FastStringMap.create(); @@ -291,22 +290,4 @@ public class TypeDataStore { public static boolean hasProperties(Type type) { return get().properties.containsKey(type.getSignature()); } - - /** - * @deprecated As of 7.0.1. This is just a hack to avoid breaking backwards - * compatibility and will be removed in Vaadin 7.1 - */ - @Deprecated - public void setHasGetTooltipInfo(Class clazz) { - hasGetTooltipInfo.add(getType(clazz).getSignature()); - } - - /** - * @deprecated As of 7.0.1. This is just a hack to avoid breaking backwards - * compatibility and will be removed in Vaadin 7.1 - */ - @Deprecated - public static boolean getHasGetTooltipInfo(Class clazz) { - return get().hasGetTooltipInfo.contains(getType(clazz).getSignature()); - } } diff --git a/client/src/com/vaadin/client/ui/AbstractComponentConnector.java b/client/src/com/vaadin/client/ui/AbstractComponentConnector.java index 5475c128c1..13d1e6d56c 100644 --- a/client/src/com/vaadin/client/ui/AbstractComponentConnector.java +++ b/client/src/com/vaadin/client/ui/AbstractComponentConnector.java @@ -35,7 +35,6 @@ import com.vaadin.client.communication.StateChangeEvent; import com.vaadin.client.metadata.NoDataException; import com.vaadin.client.metadata.Type; import com.vaadin.client.metadata.TypeData; -import com.vaadin.client.metadata.TypeDataStore; import com.vaadin.client.ui.datefield.PopupDateFieldConnector; import com.vaadin.client.ui.ui.UIConnector; import com.vaadin.shared.AbstractComponentState; @@ -430,40 +429,13 @@ public abstract class AbstractComponentConnector extends AbstractConnector } } - /** - * {@inheritDoc} - * - *

- * When overriding this method, {@link #hasTooltip()} should also be - * overridden to return true in all situations where this method might - * return a non-empty result. - *

- * - * @see ComponentConnector#getTooltipInfo(Element) - */ @Override public TooltipInfo getTooltipInfo(Element element) { return new TooltipInfo(getState().description, getState().errorMessage); } - /** - * Check whether there might be a tooltip for this component. The framework - * will only add event listeners for automatically handling tooltips (using - * {@link #getTooltipInfo(Element)}) if this method returns true. - * - * @return true if some part of the component might have a - * tooltip, otherwise false - */ - private boolean hasTooltip() { - /* - * Hack to avoid breaking backwards compatibility - use a generator to - * know whether there's a custom implementation of getTooltipInfo, and - * in that case always assume that there might be tooltip. - */ - if (TypeDataStore.getHasGetTooltipInfo(getClass())) { - return true; - } - + @Override + public boolean hasTooltip() { // Normally, there is a tooltip if description or errorMessage is set AbstractComponentState state = getState(); if (state.description != null && !state.description.equals("")) { diff --git a/client/src/com/vaadin/client/ui/calendar/CalendarConnector.java b/client/src/com/vaadin/client/ui/calendar/CalendarConnector.java index c36521b3ac..285d15792b 100644 --- a/client/src/com/vaadin/client/ui/calendar/CalendarConnector.java +++ b/client/src/com/vaadin/client/ui/calendar/CalendarConnector.java @@ -411,6 +411,15 @@ public class CalendarConnector extends AbstractComponentConnector implements return tooltipInfo; } + @Override + public boolean hasTooltip() { + /* + * Tooltips are not processed until updateFromUIDL, so we can't be sure + * that there are no tooltips during onStateChange when this is used. + */ + return true; + } + private void updateMonthView(List days, List events) { CalendarState state = getState(); diff --git a/client/src/com/vaadin/client/ui/form/FormConnector.java b/client/src/com/vaadin/client/ui/form/FormConnector.java index 22277b6974..acd0e917fc 100644 --- a/client/src/com/vaadin/client/ui/form/FormConnector.java +++ b/client/src/com/vaadin/client/ui/form/FormConnector.java @@ -231,4 +231,9 @@ public class FormConnector extends AbstractComponentContainerConnector // as a part of the actual layout return null; } + + @Override + public boolean hasTooltip() { + return false; + } } diff --git a/client/src/com/vaadin/client/ui/formlayout/FormLayoutConnector.java b/client/src/com/vaadin/client/ui/formlayout/FormLayoutConnector.java index 1a952959f3..c65f689f7a 100644 --- a/client/src/com/vaadin/client/ui/formlayout/FormLayoutConnector.java +++ b/client/src/com/vaadin/client/ui/formlayout/FormLayoutConnector.java @@ -141,4 +141,13 @@ public class FormLayoutConnector extends AbstractLayoutConnector { return info; } + @Override + public boolean hasTooltip() { + /* + * Tooltips are fetched from child connectors -> there's no quick way of + * checking whether there might a tooltip hiding somewhere + */ + return true; + } + } diff --git a/client/src/com/vaadin/client/ui/menubar/MenuBarConnector.java b/client/src/com/vaadin/client/ui/menubar/MenuBarConnector.java index d8ca73a401..3e22ebb05b 100644 --- a/client/src/com/vaadin/client/ui/menubar/MenuBarConnector.java +++ b/client/src/com/vaadin/client/ui/menubar/MenuBarConnector.java @@ -209,4 +209,14 @@ public class MenuBarConnector extends AbstractComponentConnector implements return info; } + + @Override + public boolean hasTooltip() { + /* + * Item tooltips are not processed until updateFromUIDL, so we can't be + * sure that there are no tooltips during onStateChange when this method + * is used. + */ + return true; + } } diff --git a/client/src/com/vaadin/client/ui/table/TableConnector.java b/client/src/com/vaadin/client/ui/table/TableConnector.java index fc31cdf8ea..c8b4af83f2 100644 --- a/client/src/com/vaadin/client/ui/table/TableConnector.java +++ b/client/src/com/vaadin/client/ui/table/TableConnector.java @@ -395,6 +395,16 @@ public class TableConnector extends AbstractHasComponentsConnector implements return info; } + @Override + public boolean hasTooltip() { + /* + * Tooltips for individual rows and cells are not processed until + * updateFromUIDL, so we can't be sure that there are no tooltips during + * onStateChange when this method is used. + */ + return true; + } + @Override public void onConnectorHierarchyChange( ConnectorHierarchyChangeEvent connectorHierarchyChangeEvent) { diff --git a/client/src/com/vaadin/client/ui/tabsheet/TabsheetConnector.java b/client/src/com/vaadin/client/ui/tabsheet/TabsheetConnector.java index f1ad5e792a..04a514738d 100644 --- a/client/src/com/vaadin/client/ui/tabsheet/TabsheetConnector.java +++ b/client/src/com/vaadin/client/ui/tabsheet/TabsheetConnector.java @@ -137,6 +137,16 @@ public class TabsheetConnector extends TabsheetBaseConnector implements return info; } + @Override + public boolean hasTooltip() { + /* + * Tab tooltips are not processed until updateFromUIDL, so we can't be + * sure that there are no tooltips during onStateChange when this method + * is used. + */ + return true; + } + @Override public void onConnectorHierarchyChange( ConnectorHierarchyChangeEvent connectorHierarchyChangeEvent) { diff --git a/client/src/com/vaadin/client/ui/tree/TreeConnector.java b/client/src/com/vaadin/client/ui/tree/TreeConnector.java index d8ad7d6634..ef016c31b7 100644 --- a/client/src/com/vaadin/client/ui/tree/TreeConnector.java +++ b/client/src/com/vaadin/client/ui/tree/TreeConnector.java @@ -332,4 +332,14 @@ public class TreeConnector extends AbstractComponentConnector implements return info; } + @Override + public boolean hasTooltip() { + /* + * Item tooltips are not processed until updateFromUIDL, so we can't be + * sure that there are no tooltips during onStateChange when this method + * is used. + */ + return true; + } + } diff --git a/client/src/com/vaadin/client/ui/ui/UIConnector.java b/client/src/com/vaadin/client/ui/ui/UIConnector.java index 0843b3069d..07481063c3 100644 --- a/client/src/com/vaadin/client/ui/ui/UIConnector.java +++ b/client/src/com/vaadin/client/ui/ui/UIConnector.java @@ -48,7 +48,6 @@ import com.vaadin.client.ConnectorHierarchyChangeEvent; import com.vaadin.client.ConnectorMap; import com.vaadin.client.Focusable; import com.vaadin.client.Paintable; -import com.vaadin.client.TooltipInfo; import com.vaadin.client.UIDL; import com.vaadin.client.VConsole; import com.vaadin.client.communication.StateChangeEvent; @@ -527,13 +526,13 @@ public class UIConnector extends AbstractSingleComponentContainerConnector } @Override - public TooltipInfo getTooltipInfo(com.google.gwt.dom.client.Element element) { + public boolean hasTooltip() { /* - * Override method to make AbstractComponentConnector.hasTooltip() - * return true so there's a top level handler that takes care of hiding - * tooltips whenever the mouse is moved somewhere else. + * Always return true so there's always top level tooltip handler that + * takes care of hiding tooltips whenever the mouse is moved somewhere + * else. */ - return super.getTooltipInfo(element); + return true; } /** -- 2.39.5