]> source.dussan.org Git - vaadin-framework.git/commitdiff
Moved isComponentVisible to separate interface (#10303) 05/305/5
authorArtur Signell <artur@vaadin.com>
Tue, 20 Nov 2012 12:49:52 +0000 (14:49 +0200)
committerVaadin Code Review <review@vaadin.com>
Tue, 20 Nov 2012 13:15:35 +0000 (13:15 +0000)
HasComponents.isComponentVisible is now SelectiveRenderer.isRendered

Change-Id: Ic3b9cd65278ffc2a38ee20c76ec771ee057268bf

13 files changed:
server/src/com/vaadin/server/AbstractCommunicationManager.java
server/src/com/vaadin/server/JsonCodec.java
server/src/com/vaadin/server/LegacyPaint.java
server/src/com/vaadin/ui/AbstractComponent.java
server/src/com/vaadin/ui/AbstractComponentContainer.java
server/src/com/vaadin/ui/AbstractSingleComponentContainer.java
server/src/com/vaadin/ui/ConnectorTracker.java
server/src/com/vaadin/ui/CustomField.java
server/src/com/vaadin/ui/Form.java
server/src/com/vaadin/ui/HasComponents.java
server/src/com/vaadin/ui/SelectiveRenderer.java [new file with mode: 0644]
server/src/com/vaadin/ui/TabSheet.java
server/src/com/vaadin/ui/Table.java

index 74e5d5fd20c8b89ab9d155f9456262f0aaee3696..57878bef31b16bf9c07b30223c31f10bc6cfb1cd 100644 (file)
@@ -85,6 +85,7 @@ import com.vaadin.ui.ConnectorTracker;
 import com.vaadin.ui.HasComponents;
 import com.vaadin.ui.LegacyComponent;
 import com.vaadin.ui.LegacyWindow;
+import com.vaadin.ui.SelectiveRenderer;
 import com.vaadin.ui.UI;
 import com.vaadin.ui.Window;
 
@@ -933,7 +934,7 @@ public abstract class AbstractCommunicationManager implements Serializable {
 
                 for (ClientConnector child : AbstractClientConnector
                         .getAllChildrenIterable(connector)) {
-                    if (isVisible(child)) {
+                    if (isConnectorVisibleToClient(child)) {
                         children.put(child.getConnectorId());
                     }
                 }
@@ -1402,53 +1403,59 @@ public abstract class AbstractCommunicationManager implements Serializable {
 
     /**
      * Checks if the connector is visible in context. For Components,
-     * {@link #isVisible(Component)} is used. For other types of connectors, the
-     * contextual visibility of its first Component ancestor is used. If no
-     * Component ancestor is found, the connector is not visible.
+     * {@link #isComponentVisibleToClient(Component)} is used. For other types
+     * of connectors, the contextual visibility of its first Component ancestor
+     * is used. If no Component ancestor is found, the connector is not visible.
      * 
      * @param connector
      *            The connector to check
      * @return <code>true</code> if the connector is visible to the client,
      *         <code>false</code> otherwise
      */
-    public static boolean isVisible(ClientConnector connector) {
+    public static boolean isConnectorVisibleToClient(ClientConnector connector) {
         if (connector instanceof Component) {
-            return isVisible((Component) connector);
+            return isComponentVisibleToClient((Component) connector);
         } else {
             ClientConnector parent = connector.getParent();
             if (parent == null) {
                 return false;
             } else {
-                return isVisible(parent);
+                return isConnectorVisibleToClient(parent);
             }
         }
     }
 
     /**
-     * Checks if the component is visible in context, i.e. returns false if the
-     * child is hidden, the parent is hidden or the parent says the child should
-     * not be rendered (using
-     * {@link HasComponents#isComponentVisible(Component)}
+     * Checks if the component should be visible to the client. Returns false if
+     * the child should not be sent to the client, true otherwise.
      * 
      * @param child
      *            The child to check
      * @return true if the child is visible to the client, false otherwise
      */
-    static boolean isVisible(Component child) {
+    public static boolean isComponentVisibleToClient(Component child) {
         if (!child.isVisible()) {
             return false;
         }
-
         HasComponents parent = child.getParent();
-        if (parent == null) {
+
+        if (parent instanceof SelectiveRenderer) {
+            if (!((SelectiveRenderer) parent).isRendered(child)) {
+                return false;
+            }
+        }
+
+        if (parent != null) {
+            return isComponentVisibleToClient(parent);
+        } else {
             if (child instanceof UI) {
-                return child.isVisible();
+                // UI has no parent and visibility was checked above
+                return true;
             } else {
+                // Component which is not attached to any UI
                 return false;
             }
         }
-
-        return parent.isComponentVisible(child) && isVisible(parent);
     }
 
     private static class NullIterator<E> implements Iterator<E> {
@@ -2219,7 +2226,7 @@ public abstract class AbstractCommunicationManager implements Serializable {
             ConnectorTracker connectorTracker) {
         ArrayList<ClientConnector> dirtyConnectors = new ArrayList<ClientConnector>();
         for (ClientConnector c : connectorTracker.getDirtyConnectors()) {
-            if (isVisible(c)) {
+            if (isConnectorVisibleToClient(c)) {
                 dirtyConnectors.add(c);
             }
         }
index 55e0fd69ed252b5ce8382f08e6cd70a8974d90a5..89ef060ef0aed8ce14c22369fa84534a81ba39ae 100644 (file)
@@ -654,7 +654,7 @@ public class JsonCodec implements Serializable {
             Connector connector = (Connector) value;
             if (value instanceof Component
                     && !(AbstractCommunicationManager
-                            .isVisible((Component) value))) {
+                            .isComponentVisibleToClient((Component) value))) {
                 return encodeNull();
             }
             return new EncodeResult(connector.getConnectorId());
@@ -847,7 +847,7 @@ public class JsonCodec implements Serializable {
 
         for (Entry<?, ?> entry : map.entrySet()) {
             ClientConnector key = (ClientConnector) entry.getKey();
-            if (AbstractCommunicationManager.isVisible(key)) {
+            if (AbstractCommunicationManager.isConnectorVisibleToClient(key)) {
                 EncodeResult encodedValue = encode(entry.getValue(), null,
                         valueType, connectorTracker);
                 jsonMap.put(key.getConnectorId(),
index 971aec682f06a9205eba6b3a41de7ccf45cba864..17c02955f46815c5f34fe515d78128471738c67f 100644 (file)
@@ -19,7 +19,6 @@ import java.io.Serializable;
 
 import com.vaadin.server.PaintTarget.PaintStatus;
 import com.vaadin.ui.Component;
-import com.vaadin.ui.HasComponents;
 import com.vaadin.ui.LegacyComponent;
 
 public class LegacyPaint implements Serializable {
@@ -51,7 +50,7 @@ public class LegacyPaint implements Serializable {
     public static void paint(Component component, PaintTarget target)
             throws PaintException {
         // Only paint content of visible components.
-        if (!isVisibleInContext(component)) {
+        if (!AbstractCommunicationManager.isComponentVisibleToClient(component)) {
             return;
         }
 
@@ -65,34 +64,9 @@ public class LegacyPaint implements Serializable {
             if (component instanceof LegacyComponent) {
                 ((LegacyComponent) component).paintContent(target);
             }
-
         }
         target.endPaintable(component);
 
     }
 
-    /**
-     * Checks if the component is visible and its parent is visible,
-     * recursively.
-     * <p>
-     * This is only a helper until paint is moved away from this class.
-     * 
-     * @return
-     */
-    protected static boolean isVisibleInContext(Component c) {
-        HasComponents p = c.getParent();
-        while (p != null) {
-            if (!p.isVisible()) {
-                return false;
-            }
-            p = p.getParent();
-        }
-        if (c.getParent() != null && !c.getParent().isComponentVisible(c)) {
-            return false;
-        }
-
-        // All parents visible, return this state
-        return c.isVisible();
-    }
-
 }
index fc6f176e2ada2b8ac5acceb900b966add5a3d993..7e7a595a2eaeaa73e4451358eaac2023b5cc32c2 100644 (file)
@@ -349,7 +349,8 @@ public abstract class AbstractComponent extends AbstractClientConnector
             return false;
         } else if (!super.isConnectorEnabled()) {
             return false;
-        } else if (!getParent().isComponentVisible(this)) {
+        } else if ((getParent() instanceof SelectiveRenderer)
+                && !((SelectiveRenderer) getParent()).isRendered(this)) {
             return false;
         } else {
             return true;
index c60f3122930e1a81b07ac777fa73749442d31b3f..b5cc3da861f7203dbf541cf982ce1a72d1ee4dbe 100644 (file)
@@ -343,15 +343,4 @@ public abstract class AbstractComponentContainer extends AbstractComponent
     public Iterator<Component> getComponentIterator() {
         return iterator();
     }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * com.vaadin.ui.HasComponents#isComponentVisible(com.vaadin.ui.Component)
-     */
-    @Override
-    public boolean isComponentVisible(Component childComponent) {
-        return true;
-    }
 }
\ No newline at end of file
index 20660ce95541539f2c73d48594eb28eb66732cbf..7297318e951537e6d2a71faecd6281a9891a9033 100644 (file)
@@ -102,17 +102,6 @@ public abstract class AbstractSingleComponentContainer extends
         fireEvent(new ComponentDetachEvent(this, component));
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * com.vaadin.ui.HasComponents#isComponentVisible(com.vaadin.ui.Component)
-     */
-    @Override
-    public boolean isComponentVisible(Component childComponent) {
-        return true;
-    }
-
     @Override
     public void setVisible(boolean visible) {
         if (isVisible() == visible) {
index ddb02129d40747993c13591f853a7a8fa5397b99..8b1a940c4bc163f429187dd7270eda3b590a314e 100644 (file)
@@ -247,7 +247,8 @@ public class ConnectorTracker implements Serializable {
                 uninitializedConnectors.remove(connector);
                 diffStates.remove(connector);
                 iterator.remove();
-            } else if (!AbstractCommunicationManager.isVisible(connector)
+            } else if (!AbstractCommunicationManager
+                    .isConnectorVisibleToClient(connector)
                     && !uninitializedConnectors.contains(connector)) {
                 uninitializedConnectors.add(connector);
                 diffStates.remove(connector);
index 23460d824e64485aa63b998bbcd970aab2849a1d..c3331609a551095162b9be44e6dec8caf951d036 100644 (file)
@@ -150,9 +150,4 @@ public abstract class CustomField<T> extends AbstractField<T> implements
     public Iterator<Component> iterator() {
         return new ComponentIterator();
     }
-
-    @Override
-    public boolean isComponentVisible(Component childComponent) {
-        return true;
-    }
 }
index 94a9f9b73a49b25743198562a9d70b82a4840122..62a6de4fe65a9a353f93fc266dc7782414bf1576 100644 (file)
@@ -1374,11 +1374,6 @@ public class Form extends AbstractField<Object> implements Item.Editor,
         return count;
     }
 
-    @Override
-    public boolean isComponentVisible(Component childComponent) {
-        return true;
-    };
-
     @Override
     public void setVisible(boolean visible) {
         if (isVisible() == visible) {
index 4f6320f6b22d42e4e061284a1ca2000b9b47a73f..d2ca45fa424b89636f4caf86f6fba39ddbb18ce5 100644 (file)
@@ -40,25 +40,6 @@ public interface HasComponents extends Component, Iterable<Component> {
     @Override
     public Iterator<Component> iterator();
 
-    /**
-     * Checks if the child component is visible. This method allows hiding a
-     * child component from updates and communication to and from the client.
-     * This is useful for components that show only a limited number of its
-     * children at any given time and want to allow updates only for the
-     * children that are visible (e.g. TabSheet has one tab open at a time).
-     * <p>
-     * Note that this will prevent updates from reaching the child even though
-     * the child itself is set to visible. Also if a child is set to invisible
-     * this will not force it to be visible.
-     * </p>
-     * 
-     * @param childComponent
-     *            The child component to check
-     * @return true if the child component is visible to the user, false
-     *         otherwise
-     */
-    public boolean isComponentVisible(Component childComponent);
-
     /**
      * Interface for {@link HasComponents} implementations that support sending
      * attach and detach events for components.
diff --git a/server/src/com/vaadin/ui/SelectiveRenderer.java b/server/src/com/vaadin/ui/SelectiveRenderer.java
new file mode 100644 (file)
index 0000000..47fd9bf
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2011 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.ui;
+
+/**
+ * Interface implemented by {@link HasComponents} implementors that wish to
+ * dynamically be able to prevent given child components from reaching the
+ * client side.
+ * 
+ * @author Vaadin Ltd
+ * @version @VERSION@
+ * @since 7.0
+ * 
+ */
+public interface SelectiveRenderer extends HasComponents {
+    /**
+     * Checks if the child component should be rendered (sent to the client
+     * side). This method allows hiding a child component from updates and
+     * communication to and from the client. It is mostly useful for parents
+     * which show only a limited number of their children at any given time and
+     * want to allow updates only for the visible children (e.g. TabSheet has
+     * one tab open at a time).
+     * <p>
+     * This method can only prevent updates from reaching the client, not force
+     * child components to reach the client. If the child is set to visible,
+     * returning false will prevent the child from being sent to the client. If
+     * a child is set to invisible, this method has no effect.
+     * </p>
+     * 
+     * @param childComponent
+     *            The child component to check
+     * @return true if the child component may be sent to the client, false
+     *         otherwise
+     */
+    public boolean isRendered(Component childComponent);
+
+}
index 227743e9f46e95bac596bb5614f4202135c1fedd..1a76aa88bc1266f573f7c9f3f2279112db5e1f15 100644 (file)
@@ -70,7 +70,7 @@ import com.vaadin.ui.themes.Runo;
  * @since 3.0
  */
 public class TabSheet extends AbstractComponentContainer implements Focusable,
-        FocusNotifier, BlurNotifier, LegacyComponent {
+        FocusNotifier, BlurNotifier, LegacyComponent, SelectiveRenderer {
 
     /**
      * List of component tabs (tab contents). In addition to being on this list,
@@ -1290,7 +1290,7 @@ public class TabSheet extends AbstractComponentContainer implements Focusable,
     }
 
     @Override
-    public boolean isComponentVisible(Component childComponent) {
+    public boolean isRendered(Component childComponent) {
         return childComponent == getSelectedTab();
     }
 
index 352b9212a7093992a67060537463fe9e245b5d6d..f224e13dfd742b9c4a5fe0701f35ccfa2c144ff8 100644 (file)
@@ -5579,11 +5579,6 @@ public class Table extends AbstractSelect implements Action.Container,
         return iterator();
     }
 
-    @Override
-    public boolean isComponentVisible(Component childComponent) {
-        return true;
-    }
-
     private final Logger getLogger() {
         if (logger == null) {
             logger = Logger.getLogger(Table.class.getName());