You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lo...@apache.org on 2016/06/29 13:58:19 UTC

svn commit: r1750640 [1/2] - in /myfaces/tobago/trunk: tobago-core/src/main/java/org/apache/myfaces/tobago/component/ tobago-core/src/main/java/org/apache/myfaces/tobago/event/ tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/ tob...

Author: lofwyr
Date: Wed Jun 29 13:58:18 2016
New Revision: 1750640

URL: http://svn.apache.org/viewvc?rev=1750640&view=rev
Log:
TOBAGO-1565: Specification for "collapsible" for Popup, Box, Section, ...
* implemented for Box, Section and Panel

Added:
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/event/CollapsibleActionEvent.java
      - copied, changed from r1748577, myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/event/PageActionEvent.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/event/CollapsibleActionListener.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUICollapsiblePanel.java
      - copied, changed from r1746463, myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIBox.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIOperation.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIPanel.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIPanelBase.java
      - copied, changed from r1750609, myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIPanel.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/OperationTagDeclaration.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/model/CollapseState.java
    myfaces/tobago/trunk/tobago-core/src/test/java/org/apache/myfaces/tobago/model/CollapseStateUnitTest.java
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/CollapsibleController.java
      - copied, changed from r1747992, myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/Collapsible.java
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/00-collapsible-box/
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/00-collapsible-box/collapsible-box.xhtml
      - copied, changed from r1747992, myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/collapsible.xhtml
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/10-collapsible-popup/
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/10-collapsible-popup/collapsible-popup.xhtml
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/20-collapsible-panel/
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/20-collapsible-panel/collapsible-panel.xhtml
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/30-collapsible-section/
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/30-collapsible-section/collapsible-section.xhtml
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/collapsible.xhtml
    myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/Collapse.java
      - copied, changed from r1746463, myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/Popup.java
    myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/OperationRenderer.java
    myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/PanelRendererBase.java
Removed:
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/Collapsible.java
Modified:
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/RendererTypes.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIBar.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIBox.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIButtons.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUICommand.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUICommands.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIMediator.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIPopup.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISection.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUITab.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUITabGroup.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/PanelTagDeclaration.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SectionTagDeclaration.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/declaration/IsCollapsible.java
    myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/css/TobagoClass.java
    myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/AjaxClientBehaviorRenderer.java
    myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/Command.java
    myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/JsonUtils.java
    myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/BoxRenderer.java
    myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/PanelRenderer.java
    myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/SectionRenderer.java
    myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/SheetRenderer.java
    myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/TabGroupRenderer.java
    myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/script/tobago-popup.js
    myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/script/tobago.js
    myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/style/tobago.css
    myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/test/java/org/apache/myfaces/tobago/renderkit/html/JsonUtilsUnitTest.java
    myfaces/tobago/trunk/tobago-tool/tobago-tool-apt/src/main/resources/org/apache/myfaces/tobago/apt/component.stg

Modified: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/RendererTypes.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/RendererTypes.java?rev=1750640&r1=1750639&r2=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/RendererTypes.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/RendererTypes.java Wed Jun 29 13:58:18 2016
@@ -58,6 +58,7 @@ public enum RendererTypes {
   MenuCommand,
   MenuSeparator,
   Object,
+  Operation,
   Out,
   Page,
   Panel,
@@ -128,6 +129,7 @@ public enum RendererTypes {
   public static final String MENU_COMMAND = "MenuCommand";
   public static final String MENU_SEPARATOR = "MenuSeparator";
   public static final String OBJECT = "Object";
+  public static final String OPERATION = "Operation";
   public static final String OUT = "Out";
   public static final String PAGE = "Page";
   public static final String PANEL = "Panel";

Copied: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/event/CollapsibleActionEvent.java (from r1748577, myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/event/PageActionEvent.java)
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/event/CollapsibleActionEvent.java?p2=myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/event/CollapsibleActionEvent.java&p1=myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/event/PageActionEvent.java&r1=1748577&r2=1750640&rev=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/event/PageActionEvent.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/event/CollapsibleActionEvent.java Wed Jun 29 13:58:18 2016
@@ -20,39 +20,30 @@
 package org.apache.myfaces.tobago.event;
 
 
-import javax.faces.event.ActionEvent;
+import org.apache.myfaces.tobago.model.CollapseState;
+
 import javax.faces.component.UIComponent;
+import javax.faces.event.ActionEvent;
+import javax.faces.event.PhaseId;
 
 
-public class PageActionEvent extends ActionEvent {
+public class CollapsibleActionEvent extends ActionEvent {
 
-  private static final long serialVersionUID = 3364193750247386220L;
+  private static final long serialVersionUID = 1L;
 
-  private PageAction action;
-  private int value;
+  private CollapseState newState;
 
-  public PageActionEvent(final UIComponent component, final PageAction action) {
+  public CollapsibleActionEvent(final UIComponent component, final CollapseState newState) {
     super(component);
-    this.action = action;
+    this.newState = newState;
+    setPhaseId(PhaseId.INVOKE_APPLICATION);
   }
 
-  /**
-   * Returns the action type ({@link PageAction}).
-   */
-  public PageAction getAction() {
-    return action;
+  public CollapseState getNewState() {
+    return newState;
   }
 
-  public void setValue(final int value) {
-    this.value = value;
+  public void setNewState(CollapseState newState) {
+    this.newState = newState;
   }
-
-  /**
-   * Returns the value for action types {@link PageAction#TO_ROW}
-   * and {@link PageAction#TO_PAGE}.
-   */
-  public int getValue() {
-    return value;
-  }
-
 }

Added: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/event/CollapsibleActionListener.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/event/CollapsibleActionListener.java?rev=1750640&view=auto
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/event/CollapsibleActionListener.java (added)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/event/CollapsibleActionListener.java Wed Jun 29 13:58:18 2016
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.myfaces.tobago.event;
+
+import org.apache.myfaces.tobago.internal.component.AbstractUICollapsiblePanel;
+import org.apache.myfaces.tobago.util.ComponentUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIViewRoot;
+import javax.faces.context.FacesContext;
+import javax.faces.event.AbortProcessingException;
+import javax.faces.event.ActionEvent;
+import javax.faces.event.ActionListener;
+
+public class CollapsibleActionListener implements ActionListener {
+
+  private static final Logger LOG = LoggerFactory.getLogger(CollapsibleActionListener.class);
+
+  private UIComponent component;
+  private String forId;
+
+  public CollapsibleActionListener(final UIComponent component, final String forId) {
+    this.component = component;
+    this.forId = forId;
+  }
+
+  @Override
+  public void processAction(final ActionEvent actionEvent) throws AbortProcessingException {
+    final FacesContext facesContext = FacesContext.getCurrentInstance();
+    final UIViewRoot viewRoot = facesContext.getViewRoot();
+    if (viewRoot != null) {
+      final String forClientId = ComponentUtils.evaluateClientId(facesContext, component, forId);
+
+      final UIComponent component = viewRoot.findComponent(forClientId);
+      if (component instanceof AbstractUICollapsiblePanel) {
+        ((AbstractUICollapsiblePanel) component).processState();
+      } else {
+        LOG.error("Wrong component class for id: '{}'. Type is {} but expected type is {}",
+            forClientId, component.getClass().getName(), AbstractUICollapsiblePanel.class.getName());
+      }
+    }
+  }
+}

Modified: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIBar.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIBar.java?rev=1750640&r1=1750639&r2=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIBar.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIBar.java Wed Jun 29 13:58:18 2016
@@ -19,7 +19,7 @@
 
 package org.apache.myfaces.tobago.internal.component;
 
-public abstract class AbstractUIBar extends AbstractUIPanel {
+public abstract class AbstractUIBar extends AbstractUIPanelBase {
 
 
 }

Modified: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIBox.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIBox.java?rev=1750640&r1=1750639&r2=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIBox.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIBox.java Wed Jun 29 13:58:18 2016
@@ -19,33 +19,7 @@
 
 package org.apache.myfaces.tobago.internal.component;
 
-import javax.faces.context.FacesContext;
-
-public abstract class AbstractUIBox extends AbstractUIPanel {
-
-  @Override
-  public void processDecodes(final FacesContext context) {
-    if (isCollapsed()) {
-      decode(context);
-    } else {
-      super.processDecodes(context);
-    }
-  }
-
-  @Override
-  public void processValidators(final FacesContext context) {
-    if (!isCollapsed()) {
-      super.processValidators(context);
-    }
-  }
-
-  @Override
-  public void processUpdates(final FacesContext context) {
-    if (!isCollapsed()) {
-      super.processUpdates(context);
-    }
-  }
-
-  public abstract boolean isCollapsed();
+public abstract class AbstractUIBox extends AbstractUICollapsiblePanel {
 
+  public abstract String getLabel();
 }

Modified: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIButtons.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIButtons.java?rev=1750640&r1=1750639&r2=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIButtons.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIButtons.java Wed Jun 29 13:58:18 2016
@@ -19,5 +19,5 @@
 
 package org.apache.myfaces.tobago.internal.component;
 
-public abstract class AbstractUIButtons extends AbstractUIPanel {
+public abstract class AbstractUIButtons extends AbstractUIPanelBase {
 }

Copied: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUICollapsiblePanel.java (from r1746463, myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIBox.java)
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUICollapsiblePanel.java?p2=myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUICollapsiblePanel.java&p1=myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIBox.java&r1=1746463&r2=1750640&rev=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIBox.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUICollapsiblePanel.java Wed Jun 29 13:58:18 2016
@@ -19,33 +19,77 @@
 
 package org.apache.myfaces.tobago.internal.component;
 
+import org.apache.myfaces.tobago.component.Facets;
+import org.apache.myfaces.tobago.model.CollapseState;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
 
-public abstract class AbstractUIBox extends AbstractUIPanel {
+public abstract class AbstractUICollapsiblePanel extends AbstractUIPanelBase {
+
+  private static final Logger LOG = LoggerFactory.getLogger(AbstractUICollapsiblePanel.class);
+
+  private volatile CollapseState nextState;
 
   @Override
-  public void processDecodes(final FacesContext context) {
-    if (isCollapsed()) {
-      decode(context);
+  public void processDecodes(final FacesContext facesContext) {
+    if (isNormalLifecycle()) {
+      super.processDecodes(facesContext);
     } else {
-      super.processDecodes(context);
+      decode(facesContext);
+      final UIComponent bar = getFacet(Facets.BAR); // XXX is from Box or Section
+      if (bar != null) {
+        bar.processDecodes(facesContext);
+      }
     }
   }
 
   @Override
-  public void processValidators(final FacesContext context) {
-    if (!isCollapsed()) {
-      super.processValidators(context);
+  public void processValidators(final FacesContext facesContext) {
+    if (isNormalLifecycle()) {
+      super.processValidators(facesContext);
+    } else {
+      final UIComponent bar = getFacet(Facets.BAR); // XXX is from Box or Section
+      if (bar != null) {
+        bar.processValidators(facesContext);
+      }
     }
   }
 
   @Override
-  public void processUpdates(final FacesContext context) {
-    if (!isCollapsed()) {
-      super.processUpdates(context);
+  public void processUpdates(final FacesContext facesContext) {
+    if (isNormalLifecycle()) {
+      super.processUpdates(facesContext);
+    } else {
+      final UIComponent bar = getFacet(Facets.BAR); // XXX is from Box or Section
+      if (bar != null) {
+        bar.processUpdates(facesContext);
+      }
     }
   }
 
-  public abstract boolean isCollapsed();
+  private boolean isNormalLifecycle() {
+    return !getCollapsed().isSkipLifecycle();
+  }
+
+  public abstract CollapseState getCollapsed();
 
+  public abstract void setCollapsed(final CollapseState collapsed);
+
+  public CollapseState getNextState() {
+    return nextState;
+  }
+
+  public void setNextState(CollapseState nextState) {
+    this.nextState = nextState;
+  }
+
+  public void processState() {
+    if (nextState != null) {
+      setCollapsed(nextState);
+      nextState = null;
+    }
+  }
 }

Modified: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUICommand.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUICommand.java?rev=1750640&r1=1750639&r2=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUICommand.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUICommand.java Wed Jun 29 13:58:18 2016
@@ -24,6 +24,7 @@ import org.apache.myfaces.tobago.compone
 import org.apache.myfaces.tobago.component.SupportsAccessKey;
 import org.apache.myfaces.tobago.component.SupportsRenderedPartially;
 import org.apache.myfaces.tobago.component.Visual;
+import org.apache.myfaces.tobago.event.CollapsibleActionListener;
 import org.apache.myfaces.tobago.event.PopupFacetActionListener;
 import org.apache.myfaces.tobago.internal.util.AuthorizationHelper;
 import org.apache.myfaces.tobago.util.ComponentUtils;
@@ -41,6 +42,7 @@ import javax.faces.event.PhaseId;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.List;
 
 public abstract class AbstractUICommand
     extends UICommand
@@ -66,6 +68,10 @@ public abstract class AbstractUICommand
         addActionListener(new PopupFacetActionListener());
       }
     }
+    final List<AbstractUIOperation> list = ComponentUtils.findDescendantList(this, AbstractUIOperation.class);
+    for (AbstractUIOperation operation : list) {
+      addActionListener(new CollapsibleActionListener(this, operation.getFor()));
+    }
   }
 
   @Override

Modified: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUICommands.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUICommands.java?rev=1750640&r1=1750639&r2=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUICommands.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUICommands.java Wed Jun 29 13:58:18 2016
@@ -19,5 +19,5 @@
 
 package org.apache.myfaces.tobago.internal.component;
 
-public abstract class AbstractUICommands extends AbstractUIPanel {
+public abstract class AbstractUICommands extends AbstractUIPanelBase {
 }

Modified: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIMediator.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIMediator.java?rev=1750640&r1=1750639&r2=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIMediator.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIMediator.java Wed Jun 29 13:58:18 2016
@@ -28,7 +28,7 @@ import javax.faces.event.FacesEvent;
 import java.io.IOException;
 import java.util.Map;
 
-public abstract class AbstractUIMediator extends AbstractUIPanel {
+public abstract class AbstractUIMediator extends AbstractUIPanelBase {
 
   private static final Logger LOG = LoggerFactory.getLogger(AbstractUIMediator.class);
 

Added: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIOperation.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIOperation.java?rev=1750640&view=auto
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIOperation.java (added)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIOperation.java Wed Jun 29 13:58:18 2016
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.myfaces.tobago.internal.component;
+
+import javax.faces.component.UIComponentBase;
+
+public abstract class AbstractUIOperation extends UIComponentBase {
+
+  public abstract String getName();
+
+  public abstract String getFor();
+}

Added: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIPanel.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIPanel.java?rev=1750640&view=auto
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIPanel.java (added)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIPanel.java Wed Jun 29 13:58:18 2016
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.myfaces.tobago.internal.component;
+
+public abstract class AbstractUIPanel extends AbstractUICollapsiblePanel {
+}

Copied: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIPanelBase.java (from r1750609, myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIPanel.java)
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIPanelBase.java?p2=myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIPanelBase.java&p1=myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIPanel.java&r1=1750609&r2=1750640&rev=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIPanel.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIPanelBase.java Wed Jun 29 13:58:18 2016
@@ -27,7 +27,7 @@ import javax.faces.component.UIComponent
 import javax.faces.context.FacesContext;
 import java.io.IOException;
 
-public abstract class AbstractUIPanel extends javax.faces.component.UIPanel
+public abstract class AbstractUIPanelBase extends javax.faces.component.UIPanel
     implements OnComponentPopulated, Visual {
 
   @Override

Modified: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIPopup.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIPopup.java?rev=1750640&r1=1750639&r2=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIPopup.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIPopup.java Wed Jun 29 13:58:18 2016
@@ -33,7 +33,7 @@ import javax.faces.context.FacesContext;
 import java.io.IOException;
 import java.util.Iterator;
 
-public abstract class AbstractUIPopup extends AbstractUIPanel
+public abstract class AbstractUIPopup extends AbstractUIPanelBase
     implements NamingContainer, Visual {
 
   private boolean activated;

Modified: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISection.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISection.java?rev=1750640&r1=1750639&r2=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISection.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISection.java Wed Jun 29 13:58:18 2016
@@ -20,18 +20,16 @@
 package org.apache.myfaces.tobago.internal.component;
 
 import org.apache.myfaces.tobago.component.Facets;
-import org.apache.myfaces.tobago.component.Visual;
 import org.apache.myfaces.tobago.util.ComponentUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.faces.component.UIComponent;
-import javax.faces.component.UIComponentBase;
 import javax.faces.component.UIOutput;
 import javax.faces.context.FacesContext;
 import java.io.IOException;
 
-public abstract class AbstractUISection extends UIComponentBase implements Visual {
+public abstract class AbstractUISection extends AbstractUICollapsiblePanel {
 
   private static final Logger LOG = LoggerFactory.getLogger(AbstractUISection.class);
 
@@ -51,6 +49,8 @@ public abstract class AbstractUISection
 
   public abstract String getLabel();
 
+  public abstract String getImage();
+
   @Override
   public void encodeBegin(FacesContext context) throws IOException {
 

Modified: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUITab.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUITab.java?rev=1750640&r1=1750639&r2=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUITab.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUITab.java Wed Jun 29 13:58:18 2016
@@ -19,7 +19,7 @@
 
 package org.apache.myfaces.tobago.internal.component;
 
-public abstract class AbstractUITab extends AbstractUIPanel {
+public abstract class AbstractUITab extends AbstractUIPanelBase {
 
   public abstract String getLabel();
 

Modified: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUITabGroup.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUITabGroup.java?rev=1750640&r1=1750639&r2=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUITabGroup.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUITabGroup.java Wed Jun 29 13:58:18 2016
@@ -47,7 +47,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
-public abstract class AbstractUITabGroup extends AbstractUIPanel
+public abstract class AbstractUITabGroup extends AbstractUIPanelBase
     implements TabChangeSource2, ActionSource2, OnComponentPopulated, SupportsRenderedPartially, Visual {
 
   private static final Logger LOG = LoggerFactory.getLogger(AbstractUITabGroup.class);

Added: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/OperationTagDeclaration.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/OperationTagDeclaration.java?rev=1750640&view=auto
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/OperationTagDeclaration.java (added)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/OperationTagDeclaration.java Wed Jun 29 13:58:18 2016
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.myfaces.tobago.internal.taglib.component;
+
+import org.apache.myfaces.tobago.apt.annotation.Tag;
+import org.apache.myfaces.tobago.apt.annotation.TagAttribute;
+import org.apache.myfaces.tobago.apt.annotation.UIComponentTag;
+import org.apache.myfaces.tobago.apt.annotation.UIComponentTagAttribute;
+import org.apache.myfaces.tobago.component.RendererTypes;
+
+/**
+ * An operation describes an Tobago command, which will usually executed on client side.
+ */
+@Tag(name = "operation")
+@UIComponentTag(
+    uiComponent = "org.apache.myfaces.tobago.component.UIOperation",
+    uiComponentBaseClass = "org.apache.myfaces.tobago.internal.component.AbstractUIOperation",
+    componentFamily = "org.apache.myfaces.tobago.Operation",
+    rendererType = RendererTypes.OPERATION,
+    allowedChildComponenents = "NONE")
+public interface OperationTagDeclaration {
+
+  /**
+   * Name of the operation to be executed.
+   */
+  @TagAttribute()
+  @UIComponentTagAttribute()
+  void setName(String name);
+
+  /**
+   * The id of the component the operation is related to.
+   */
+  @TagAttribute()
+  @UIComponentTagAttribute()
+  void setFor(String forAttribute);
+
+}

Modified: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/PanelTagDeclaration.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/PanelTagDeclaration.java?rev=1750640&r1=1750639&r2=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/PanelTagDeclaration.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/PanelTagDeclaration.java Wed Jun 29 13:58:18 2016
@@ -26,6 +26,7 @@ import org.apache.myfaces.tobago.compone
 import org.apache.myfaces.tobago.component.RendererTypes;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasIdBindingAndRendered;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasTip;
+import org.apache.myfaces.tobago.internal.taglib.declaration.IsCollapsible;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsVisual;
 
 import javax.faces.component.UIPanel;
@@ -48,5 +49,5 @@ import javax.faces.component.UIPanel;
         @Facet(name = Facets.LAYOUT, description = "Deprecated. Contains an layout manager. "
             + "The layout manager tag should surround the content instead.")})
 public interface PanelTagDeclaration
-    extends HasIdBindingAndRendered, IsVisual, HasTip {
+    extends HasIdBindingAndRendered, IsVisual, IsCollapsible, HasTip {
 }

Modified: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SectionTagDeclaration.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SectionTagDeclaration.java?rev=1750640&r1=1750639&r2=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SectionTagDeclaration.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SectionTagDeclaration.java Wed Jun 29 13:58:18 2016
@@ -27,6 +27,8 @@ import org.apache.myfaces.tobago.compone
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasIdBindingAndRendered;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasImage;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasLabel;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasTip;
+import org.apache.myfaces.tobago.internal.taglib.declaration.IsCollapsible;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsVisual;
 
 /**
@@ -36,7 +38,7 @@ import org.apache.myfaces.tobago.interna
 @UIComponentTag(
     uiComponent = "org.apache.myfaces.tobago.component.UISection",
     uiComponentBaseClass = "org.apache.myfaces.tobago.internal.component.AbstractUISection",
-    uiComponentFacesClass = "javax.faces.component.UIComponentBase",
+    uiComponentFacesClass = "javax.faces.component.UIPanel",
     componentFamily = "org.apache.myfaces.tobago.Section",
     rendererType = RendererTypes.SECTION,
     facets = {
@@ -44,5 +46,6 @@ import org.apache.myfaces.tobago.interna
             description = "This facet contains a UILabel",
             allowedChildComponenents = "org.apache.myfaces.tobago.Label")})
 
-public interface SectionTagDeclaration extends HasIdBindingAndRendered, HasLabel, IsVisual, HasImage {
+public interface SectionTagDeclaration
+    extends HasIdBindingAndRendered, HasLabel, IsVisual, HasImage, IsCollapsible, HasTip {
 }

Modified: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/declaration/IsCollapsible.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/declaration/IsCollapsible.java?rev=1750640&r1=1750639&r2=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/declaration/IsCollapsible.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/declaration/IsCollapsible.java Wed Jun 29 13:58:18 2016
@@ -21,12 +21,17 @@ package org.apache.myfaces.tobago.intern
 
 import org.apache.myfaces.tobago.apt.annotation.TagAttribute;
 import org.apache.myfaces.tobago.apt.annotation.UIComponentTagAttribute;
+import org.apache.myfaces.tobago.model.CollapseState;
 
 public interface IsCollapsible {
+
   /**
-   * Flag indicating whether or not this component is collapsed.
+   * Enum indicating the collapsed state of this component.
    */
   @TagAttribute
-  @UIComponentTagAttribute(type = "boolean", defaultValue = "false")
-  void setCollapsed(String rendered);
+  @UIComponentTagAttribute(
+      type = "org.apache.myfaces.tobago.model.CollapseState",
+      defaultValue = CollapseState.VISIBLE,
+      defaultCode = "org.apache.myfaces.tobago.model.CollapseState.visible")
+  void setCollapsed(String collapsed);
 }

Added: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/model/CollapseState.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/model/CollapseState.java?rev=1750640&view=auto
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/model/CollapseState.java (added)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/model/CollapseState.java Wed Jun 29 13:58:18 2016
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.myfaces.tobago.model;
+
+public enum CollapseState {
+
+  visible,
+  hidden,
+  absent;
+
+  public static final String VISIBLE = "visible";
+  public static final String HIDDEN = "hidden";
+  public static final String ABSENT = "absent";
+
+  public boolean isSkipLifecycle() {
+    return this == absent;
+  }
+
+}

Added: myfaces/tobago/trunk/tobago-core/src/test/java/org/apache/myfaces/tobago/model/CollapseStateUnitTest.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/test/java/org/apache/myfaces/tobago/model/CollapseStateUnitTest.java?rev=1750640&view=auto
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/test/java/org/apache/myfaces/tobago/model/CollapseStateUnitTest.java (added)
+++ myfaces/tobago/trunk/tobago-core/src/test/java/org/apache/myfaces/tobago/model/CollapseStateUnitTest.java Wed Jun 29 13:58:18 2016
@@ -0,0 +1,13 @@
+package org.apache.myfaces.tobago.model;
+
+import org.apache.myfaces.tobago.util.EnumUnitTest;
+import org.junit.Test;
+
+public class CollapseStateUnitTest extends EnumUnitTest {
+
+  @Test
+  public void testNames() throws IllegalAccessException, NoSuchFieldException {
+    testNames(CollapseState.class);
+  }
+
+}

Copied: myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/CollapsibleController.java (from r1747992, myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/Collapsible.java)
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/CollapsibleController.java?p2=myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/CollapsibleController.java&p1=myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/Collapsible.java&r1=1747992&r2=1750640&rev=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/Collapsible.java (original)
+++ myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/CollapsibleController.java Wed Jun 29 13:58:18 2016
@@ -28,45 +28,57 @@ import java.io.Serializable;
 
 @SessionScoped
 @Named
-public class Collapsible implements Serializable {
+public class CollapsibleController implements Serializable {
 
-  private static final Logger LOG = LoggerFactory.getLogger(Collapsible.class);
+  private static final Logger LOG = LoggerFactory.getLogger(CollapsibleController.class);
 
-  private boolean collapsed1;
-  private boolean collapsed2;
+/* TODO
+  private CollapseState collapsed1;
+  private CollapseState collapsed2;
 
-  public Collapsible() {
+  public CollapsibleController() {
   }
 
   public String toggle1() {
-    collapsed1 = !collapsed1;
+    collapsed1 = collapsed1 == CollapseState.visible ? CollapseState.hidden : CollapseState.visible; // todo: define toggle in the "enum".
 
-    LOG.info("collapsed1={}", collapsed1);
+    LOG.info("new value of collapsed1={}", collapsed1);
 
     return null;
   }
 
   public String toggle2() {
-    collapsed2 = !collapsed2;
+    collapsed2 = collapsed2 == CollapseState.visible ? CollapseState.hidden : CollapseState.visible; // todo: define toggle in the "enum".
 
-    LOG.info("collapsed2={}", collapsed2);
+    LOG.info("new value of collapsed2={}", collapsed2);
 
     return null;
   }
 
-  public boolean isCollapsed1() {
+  public String action() {
+    LOG.info("action(): collapsed2={}", collapsed2);
+    return null;
+  }
+
+  public String cancel() {
+    LOG.info("cancel(): collapsed2={}", collapsed2);
+    return null;
+  }
+
+  public CollapseState getCollapsed1() {
     return collapsed1;
   }
 
-  public void setCollapsed1(boolean collapsed1) {
+  public void setCollapsed1(CollapseState collapsed1) {
     this.collapsed1 = collapsed1;
   }
 
-  public boolean isCollapsed2() {
+  public CollapseState getCollapsed2() {
     return collapsed2;
   }
 
-  public void setCollapsed2(boolean collapsed2) {
+  public void setCollapsed2(CollapseState collapsed2) {
     this.collapsed2 = collapsed2;
   }
+*/
 }

Copied: myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/00-collapsible-box/collapsible-box.xhtml (from r1747992, myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/collapsible.xhtml)
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/00-collapsible-box/collapsible-box.xhtml?p2=myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/00-collapsible-box/collapsible-box.xhtml&p1=myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/collapsible.xhtml&r1=1747992&r2=1750640&rev=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/collapsible.xhtml (original)
+++ myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/00-collapsible-box/collapsible-box.xhtml Wed Jun 29 13:58:18 2016
@@ -23,41 +23,85 @@
                 xmlns:f="http://java.sun.com/jsf/core">
   <ui:param name="title" value="Container"/>
 
-    <tc:section label="Collapsible with the box collapsed attribute">
+  <tc:section label="Collapsible box without server request" id="section1">
 
-      <tc:segmentLayout medium="12" id="collapsible">
-        <tc:button action="#{collapsible.toggle1}" label="Toggle" immediate="true" renderedPartially="collapsible"/>
-        <tc:box label="Collapsible" collapsed="#{collapsible.collapsed1}">
-          Hallo, collapsible box.
-          <tc:in required="true" label="Required"/>
-        </tc:box>
-        <tc:out value="Requests: #{activityList.values[0].jsfRequest} / AJAX: #{activityList.values[0].ajaxRequest}"/>
-      </tc:segmentLayout>
-
-    </tc:section>
-
-    <tc:section label="Collapsible with the rendered attribute">
-
-      <tc:segmentLayout medium="12" id="collapsible2">
-        <tc:box label="Collapsible">
-          <f:facet name="toolBar">
-            <tc:toolBar>
-              <tc:toolBarCommand action="#{collapsible.toggle2}" label="Toggle" immediate="true" renderedPartially="collapsible2"/>
-            </tc:toolBar>
-          </f:facet>
-          <tc:panel rendered="#{!collapsible.collapsed2}">
-            Hallo, collapsible box.
-            <tc:in required="true" label="Required"/>
-          </tc:panel>
-        </tc:box>
-        <tc:out value="Requests: #{activityList.values[0].jsfRequest} / AJAX: #{activityList.values[0].ajaxRequest}"/>
-      </tc:segmentLayout>
-
-    </tc:section>
-
-    <tc:flowLayout>
-      <tc:style textAlign="right"/>
-      <tc:button label="Submit"/>
-    </tc:flowLayout>
+    Here we have the transitions <code>show</code> and <code>hide</code> and there is no server request needed.
+    The buttons have set <code>omit="true"</code>.
+
+    <tc:box label="Collapsible box (Client only)" id="box1">
+      <f:facet name="bar">
+        <tc:buttons>
+          <tc:button label="show" omit="true" id="show1">
+            <tc:operation name="show" for="box1"/>
+          </tc:button>
+          <tc:button label="hide" omit="true" id="hide1">
+            <tc:operation name="hide" for="box1"/>
+          </tc:button>
+        </tc:buttons>
+      </f:facet>
+      <tc:panel>
+        Hallo, collapsible box.
+        <tc:in required="true" label="Required"/>
+      </tc:panel>
+    </tc:box>
+
+  </tc:section>
+
+  <tc:section label="Collapsible section with AJAX server request" id="section2">
+
+    Here we have the transitions <code>show</code> and <code>drop</code> and there is no server request needed.
+    The buttons have set <code>omit="false"</code> which is the default.
+
+    <tc:box label="Collapsible box (AJAX)" id="box2">
+      <f:facet name="bar">
+        <tc:buttons>
+          <tc:button label="show" id="show2">
+            <f:ajax execute="box2" render="box2"/>
+            <tc:operation name="show" for="box2"/>
+          </tc:button>
+          <tc:button label="drop" id="drop2">
+            <f:ajax execute="box2" render="box2"/>
+            <tc:operation name="drop" for="box2"/>
+          </tc:button>
+        </tc:buttons>
+      </f:facet>
+      <tc:panel>
+        Hallo, collapsible box.
+        <tc:in required="true" label="Required"/>
+      </tc:panel>
+    </tc:box>
+
+  </tc:section>
+
+  <tc:section label="Collapsible section with full server request" id="section3">
+
+    Here we have the transitions <code>show</code> and <code>drop</code> and there is no server request needed.
+    The buttons have set <code>omit="false"</code> which is the default.
+
+    <tc:box label="Collapsible box (full request)" id="box3">
+      <f:facet name="bar">
+        <tc:buttons>
+          <tc:button label="show" id="show3">
+            <tc:operation name="show" for="box3"/>
+          </tc:button>
+          <tc:button label="drop" id="drop3">
+            <tc:operation name="drop" for="box3"/>
+          </tc:button>
+        </tc:buttons>
+      </f:facet>
+      <tc:panel>
+        Hallo, collapsible box.
+        <tc:in required="true" label="Required"/>
+      </tc:panel>
+    </tc:box>
+
+  </tc:section>
+
+  <tc:out value="Requests: #{activityList.values[0].jsfRequest} / AJAX: #{activityList.values[0].ajaxRequest}"/>
+
+  <tc:flowLayout>
+    <tc:style textAlign="right"/>
+    <tc:button label="Submit"/>
+  </tc:flowLayout>
 
 </ui:composition>

Added: myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/10-collapsible-popup/collapsible-popup.xhtml
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/10-collapsible-popup/collapsible-popup.xhtml?rev=1750640&view=auto
==============================================================================
--- myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/10-collapsible-popup/collapsible-popup.xhtml (added)
+++ myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/10-collapsible-popup/collapsible-popup.xhtml Wed Jun 29 13:58:18 2016
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+-->
+
+<ui:composition template="/plain.xhtml"
+                xmlns:tc="http://myfaces.apache.org/tobago/component"
+                xmlns:ui="http://java.sun.com/jsf/facelets"
+                xmlns:f="http://java.sun.com/jsf/core">
+  <ui:param name="title" value="Container"/>
+
+  <tc:form>
+    <h1>Currently this is not a popup, but should work the same manner!</h1>
+
+    <tc:button label="Open">
+      <tc:operation name="show" for="popup"/>
+    </tc:button>
+
+    <tc:box label="Test for Popup" id="popup" collapsed="#{collapsibleController.collapsed2}">
+      Hallo, collapsible popup.
+      <tc:in required="true" label="Required"/>
+      <tc:button label="Cancel and Close (immediate)" immediate="true" action="#{collapsibleController.cancel}">
+        <tc:operation name="drop" for="popup"/>
+      </tc:button>
+      <tc:button label="Submit and Close" action="#{collapsibleController.action}">
+        <tc:operation name="drop" for="popup"/>
+      </tc:button>
+    </tc:box>
+
+    <tc:out value="Requests: #{activityList.values[0].jsfRequest} / AJAX: #{activityList.values[0].ajaxRequest}"/>
+    <tc:selectBooleanCheckbox readonly="true" value="true" label="A" itemLabel="B"/>
+    <tc:out value="#{collapsibleController.collapsed2}" label="collapsed2"/>
+
+    <tc:flowLayout>
+      <tc:style textAlign="right"/>
+      <tc:button label="Submit"/>
+    </tc:flowLayout>
+  </tc:form>
+
+</ui:composition>

Added: myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/20-collapsible-panel/collapsible-panel.xhtml
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/20-collapsible-panel/collapsible-panel.xhtml?rev=1750640&view=auto
==============================================================================
--- myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/20-collapsible-panel/collapsible-panel.xhtml (added)
+++ myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/20-collapsible-panel/collapsible-panel.xhtml Wed Jun 29 13:58:18 2016
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+-->
+
+<ui:composition template="/main.xhtml"
+                xmlns:tc="http://myfaces.apache.org/tobago/component"
+                xmlns:ui="http://java.sun.com/jsf/facelets"
+                xmlns:f="http://java.sun.com/jsf/core">
+  <ui:param name="title" value="Container"/>
+
+  <tc:separator label="Collapsible panel without server request"/>
+  <tc:buttons>
+    <tc:button label="show" omit="true" id="show1">
+      <tc:operation name="show" for="panel1"/>
+    </tc:button>
+    <tc:button label="hide" omit="true" id="hide1">
+      <tc:operation name="hide" for="panel1"/>
+    </tc:button>
+  </tc:buttons>
+  <tc:panel id="panel1">
+
+    Here we have the transitions <code>show</code> and <code>hide</code> and there is no server request needed.
+    The buttons have set <code>omit="true"</code>.
+
+    <tc:panel>
+      Hallo, collapsible panel.
+      <tc:in required="true" label="Required"/>
+    </tc:panel>
+
+  </tc:panel>
+
+  <tc:separator label="Collapsible panel with AJAX server request"/>
+  <tc:buttons>
+    <tc:button label="show" id="show2">
+      <f:ajax execute="panel2" render="panel2"/>
+      <tc:operation name="show" for="panel2"/>
+    </tc:button>
+    <tc:button label="drop" id="drop2">
+      <f:ajax execute="panel2" render="panel2"/>
+      <tc:operation name="drop" for="panel2"/>
+    </tc:button>
+  </tc:buttons>
+  <tc:panel id="panel2">
+
+    Here we have the transitions <code>show</code> and <code>drop</code> and there is no server request needed.
+    The buttons have set <code>omit="false"</code> which is the default.
+
+    <tc:panel>
+      Hallo, collapsible panel.
+      <tc:in required="true" label="Required"/>
+    </tc:panel>
+
+  </tc:panel>
+
+  <tc:separator label="Collapsible panel with full server request"/>
+  <tc:buttons>
+    <tc:button label="show" id="show3">
+      <tc:operation name="show" for="panel3"/>
+    </tc:button>
+    <tc:button label="drop" id="drop3">
+      <tc:operation name="drop" for="panel3"/>
+    </tc:button>
+  </tc:buttons>
+  <tc:panel id="panel3">
+
+    Here we have the transitions <code>show</code> and <code>drop</code> and there is no server request needed.
+    The buttons have set <code>omit="false"</code> which is the default.
+
+    <tc:panel>
+      Hallo, collapsible panel.
+      <tc:in required="true" label="Required"/>
+    </tc:panel>
+
+  </tc:panel>
+
+  <tc:out value="Requests: #{activityList.values[0].jsfRequest} / AJAX: #{activityList.values[0].ajaxRequest}"/>
+
+  <tc:flowLayout>
+    <tc:style textAlign="right"/>
+    <tc:button label="Submit"/>
+  </tc:flowLayout>
+
+</ui:composition>

Added: myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/30-collapsible-section/collapsible-section.xhtml
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/30-collapsible-section/collapsible-section.xhtml?rev=1750640&view=auto
==============================================================================
--- myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/30-collapsible-section/collapsible-section.xhtml (added)
+++ myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/30-collapsible-section/collapsible-section.xhtml Wed Jun 29 13:58:18 2016
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+-->
+
+<ui:composition template="/main.xhtml"
+                xmlns:tc="http://myfaces.apache.org/tobago/component"
+                xmlns:ui="http://java.sun.com/jsf/facelets"
+                xmlns:f="http://java.sun.com/jsf/core">
+  <ui:param name="title" value="Container"/>
+
+  <tc:section label="Collapsible section without server request" id="section1">
+
+    <f:facet name="bar">
+      <tc:buttons>
+        <tc:button label="show" omit="true" id="show1">
+          <tc:operation name="show" for="section1"/>
+        </tc:button>
+        <tc:button label="hide" omit="true" id="hide1">
+          <tc:operation name="hide" for="section1"/>
+        </tc:button>
+      </tc:buttons>
+    </f:facet>
+
+    Here we have the transitions <code>show</code> and <code>hide</code> and there is no server request needed.
+    The buttons have set <code>omit="true"</code>.
+
+    <tc:panel>
+      Hallo, collapsible section.
+      <tc:in required="true" label="Required"/>
+    </tc:panel>
+
+  </tc:section>
+
+  <tc:section label="Collapsible section with AJAX server request" id="section2">
+
+    <f:facet name="bar">
+      <tc:buttons>
+        <tc:button label="show" id="show2">
+          <f:ajax execute="section2" render="section2"/>
+          <tc:operation name="show" for="section2"/>
+        </tc:button>
+        <tc:button label="drop" id="drop2">
+          <f:ajax execute="section2" render="section2"/>
+          <tc:operation name="drop" for="section2"/>
+        </tc:button>
+      </tc:buttons>
+    </f:facet>
+
+    Here we have the transitions <code>show</code> and <code>drop</code> and there is no server request needed.
+    The buttons have set <code>omit="false"</code> which is the default.
+
+    <tc:panel>
+      Hallo, collapsible section.
+      <tc:in required="true" label="Required"/>
+    </tc:panel>
+
+  </tc:section>
+
+  <tc:section label="Collapsible section with full server request" id="section3">
+
+    <f:facet name="bar">
+      <tc:buttons>
+        <tc:button label="show" id="show3">
+          <tc:operation name="show" for="section3"/>
+        </tc:button>
+        <tc:button label="drop" id="drop3">
+          <tc:operation name="drop" for="section3"/>
+        </tc:button>
+      </tc:buttons>
+    </f:facet>
+
+    Here we have the transitions <code>show</code> and <code>drop</code> and there is no server request needed.
+    The buttons have set <code>omit="false"</code> which is the default.
+
+    <tc:panel>
+      Hallo, collapsible section.
+      <tc:in required="true" label="Required"/>
+    </tc:panel>
+
+  </tc:section>
+
+  <tc:out value="Requests: #{activityList.values[0].jsfRequest} / AJAX: #{activityList.values[0].ajaxRequest}"/>
+
+  <tc:flowLayout>
+    <tc:style textAlign="right"/>
+    <tc:button label="Submit"/>
+  </tc:flowLayout>
+
+</ui:composition>

Added: myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/collapsible.xhtml
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/collapsible.xhtml?rev=1750640&view=auto
==============================================================================
--- myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/collapsible.xhtml (added)
+++ myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/30-concept/53-collapsible/collapsible.xhtml Wed Jun 29 13:58:18 2016
@@ -0,0 +1,30 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+-->
+
+<ui:composition template="/main.xhtml"
+                xmlns:tc="http://myfaces.apache.org/tobago/component"
+                xmlns:ui="http://java.sun.com/jsf/facelets"
+                xmlns:f="http://java.sun.com/jsf/core">
+  <ui:param name="title" value="Collapsible"/>
+
+  <tc:section label="TODO: description of the concept">
+
+    <tc:link link="https://issues.apache.org/jira/browse/TOBAGO-1565" label="See in Jira"/>
+
+  </tc:section>
+
+</ui:composition>

Modified: myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/css/TobagoClass.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/css/TobagoClass.java?rev=1750640&r1=1750639&r2=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/css/TobagoClass.java (original)
+++ myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/css/TobagoClass.java Wed Jun 29 13:58:18 2016
@@ -42,6 +42,7 @@ public enum TobagoClass implements CssIt
   REQUIRED("required"),
 
   BOX__HEADER("tobago-box-header"),
+  COLLAPSED("tobago-collapsed"),
   FLEX_LAYOUT("tobago-flexLayout"),
   LABEL("tobago-label"),
   MENU_BAR("tobago-menuBar"),
@@ -51,6 +52,7 @@ public enum TobagoClass implements CssIt
   PANEL("tobago-panel"),
   POPUP("tobago-popup"),
   SECTION__HEADER("tobago-section-header"),
+  SECTION__CONTENT("tobago-section-content"),
   SHEET__PAGING_INPUT("tobago-sheet-pagingInput"),
   SHEET__PAGING_OUTPUT("tobago-sheet-pagingOutput"),
   SHEET__CELL__MARKUP__RIGHT("tobago-sheet-cell-markup-right"),

Modified: myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/AjaxClientBehaviorRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/AjaxClientBehaviorRenderer.java?rev=1750640&r1=1750639&r2=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/AjaxClientBehaviorRenderer.java (original)
+++ myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/AjaxClientBehaviorRenderer.java Wed Jun 29 13:58:18 2016
@@ -20,6 +20,7 @@
 package org.apache.myfaces.tobago.renderkit.html;
 
 import org.apache.myfaces.tobago.internal.component.AbstractUICommand;
+import org.apache.myfaces.tobago.internal.component.AbstractUIOperation;
 import org.apache.myfaces.tobago.renderkit.util.RenderUtils;
 import org.apache.myfaces.tobago.util.ComponentUtils;
 
@@ -34,6 +35,7 @@ import javax.faces.event.AjaxBehaviorEve
 import javax.faces.event.PhaseId;
 import javax.faces.render.ClientBehaviorRenderer;
 import java.util.Collection;
+import java.util.List;
 
 public class AjaxClientBehaviorRenderer extends ClientBehaviorRenderer {
 
@@ -46,6 +48,9 @@ public class AjaxClientBehaviorRenderer
     final Collection<String> render = ajaxBehavior.getRender();
     final UIComponent uiComponent = behaviorContext.getComponent();
 
+    //// TBD: is this nice? May be implemented with a JSF behaviour?
+    final Collapse collapse = createCollapsible(facesContext, uiComponent);
+
     if (uiComponent instanceof AbstractUICommand) {
       final AbstractUICommand component = (AbstractUICommand) uiComponent;
 
@@ -60,6 +65,7 @@ public class AjaxClientBehaviorRenderer
           null, // getConfirmation(command), // todo
           null,
           Popup.createPopup(component),
+          collapse,
           component.isOmit());
 
       final CommandMap map = new CommandMap();
@@ -78,6 +84,7 @@ public class AjaxClientBehaviorRenderer
           null,
           null,
           null,
+          collapse,
           null);
 
       final CommandMap map = new CommandMap();
@@ -116,4 +123,24 @@ public class AjaxClientBehaviorRenderer
     }
     return false;
   }
+
+  public static Collapse createCollapsible(FacesContext facesContext, UIComponent component) {
+    //// TBD: is this nice? May be implemented with a JSF behaviour?
+    //// BEGIN
+
+    // XXX too complicated
+    final List<AbstractUIOperation> operations =
+        ComponentUtils.findDescendantList(component, AbstractUIOperation.class);
+    Collapse collapse = null;
+    if (operations.size() > 0) {
+      final AbstractUIOperation operation = operations.get(0);
+      final String forId = ComponentUtils.evaluateClientId(facesContext, component, operation.getFor());
+      collapse = new Collapse(Collapse.Action.valueOf(operation.getName()), forId);
+    }
+
+    //// TBD: is this nice?
+    //// END
+    return collapse;
+  }
+
 }

Copied: myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/Collapse.java (from r1746463, myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/Popup.java)
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/Collapse.java?p2=myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/Collapse.java&p1=myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/Popup.java&r1=1746463&r2=1750640&rev=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/Popup.java (original)
+++ myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/Collapse.java Wed Jun 29 13:58:18 2016
@@ -19,53 +19,25 @@
 
 package org.apache.myfaces.tobago.renderkit.html;
 
-import org.apache.myfaces.tobago.component.Attributes;
-import org.apache.myfaces.tobago.internal.component.AbstractUICommand;
-import org.apache.myfaces.tobago.util.ComponentUtils;
-
-public class Popup {
-
-  /**
-   * Can be "open" or "close"
-   */
-  private String command;
-
-  /**
-   * true for close immediately, false for close after submit
-   */
-  private Boolean immediate;
-
-  private Popup(final String command, final Boolean immediate) {
-    this.command = command;
-    this.immediate = immediate;
+public class Collapse {
+
+  private Action action;
+  private String forId;
+
+  public Collapse(Action action, String forId) {
+    this.action = action;
+    this.forId = forId;
   }
 
-  public static Popup createPopup(final AbstractUICommand component) {
-    String command = null;
-    Boolean immediate = null;
-
-    final String popupClose = ComponentUtils.getStringAttribute(component, Attributes.popupClose);
-    if (popupClose != null) {
-      command = "close";
-      immediate = popupClose.equals("immediate");
-    } else {
-      final boolean popupAction = ComponentUtils.containsPopupActionListener(component);
-      if (popupAction) {
-        command = "open";
-      }
-    }
-    if (command != null) {
-      return new Popup(command, immediate);
-    } else {
-      return null;
-    }
+  public Action getAction() {
+    return action;
   }
 
-  public String getCommand() {
-    return command;
+  public String getFor() {
+    return forId;
   }
 
-  public Boolean isImmediate() {
-    return immediate;
+  public enum Action {
+    show, hide, drop
   }
 }

Modified: myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/Command.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/Command.java?rev=1750640&r1=1750639&r2=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/Command.java (original)
+++ myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/Command.java Wed Jun 29 13:58:18 2016
@@ -51,7 +51,9 @@ public class Command {
   private String focus;
   private String confirmation;
   private Integer delay;
+  @Deprecated
   private Popup popup;
+  private Collapse collapse;
   private Boolean omit;
 
   public Command() {
@@ -59,8 +61,8 @@ public class Command {
 
   public Command(
       final String action, final Boolean transition, final String target, final String url, final String execute,
-      final String render, final String focus, final String confirmation, final Integer delay, final Popup popup,
-      final Boolean omit) {
+      final String render, final String focus, final String confirmation, final Integer delay,
+      @Deprecated final Popup popup, final Collapse collapse, final Boolean omit) {
     this.action = action;
     this.transition = transition;
     this.target = target;
@@ -71,6 +73,7 @@ public class Command {
     this.confirmation = confirmation;
     this.delay = delay;
     this.popup = popup;
+    this.collapse = collapse;
     this.omit = omit;
   }
 
@@ -80,7 +83,8 @@ public class Command {
   @Deprecated
   public Command(
       final String action, final Boolean transition, final String target, final String url, final String partially,
-      final String focus, final String confirmation, final Integer delay, final Popup popup, final Boolean omit) {
+      final String focus, final String confirmation, final Integer delay, final Popup popup, final Collapse collapse,
+      final Boolean omit) {
     this.action = action;
     this.transition = transition;
     this.target = target;
@@ -90,6 +94,7 @@ public class Command {
     this.confirmation = confirmation;
     this.delay = delay;
     this.popup = popup;
+    this.collapse = collapse;
     this.omit = omit;
   }
 
@@ -104,6 +109,7 @@ public class Command {
         getConfirmation(command),
         null,
         Popup.createPopup(command),
+        AjaxClientBehaviorRenderer.createCollapsible(facesContext, command),
         command.isOmit());
   }
 
@@ -118,6 +124,7 @@ public class Command {
         getConfirmation(command),
         null,
         Popup.createPopup(command),
+        AjaxClientBehaviorRenderer.createCollapsible(facesContext, command),
         command.isOmit());
   }
 
@@ -262,6 +269,14 @@ public class Command {
     this.popup = popup;
   }
 
+  public Collapse getCollapse() {
+    return collapse;
+  }
+
+  public void setCollapse(Collapse collapse) {
+    this.collapse = collapse;
+  }
+
   public Boolean getOmit() {
     return omit;
   }

Modified: myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/JsonUtils.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/JsonUtils.java?rev=1750640&r1=1750639&r2=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/JsonUtils.java (original)
+++ myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/JsonUtils.java Wed Jun 29 13:58:18 2016
@@ -161,6 +161,10 @@ public class JsonUtils {
     if (render != null) {
       encode(builder, "render", render);
     }
+    final Collapse collapse = command.getCollapse();
+    if (collapse != null) {
+      encode(builder, "collapse", collapse);
+    }
     final String focus = command.getFocus();
     if (focus != null) {
       encode(builder, "focus", focus);
@@ -206,6 +210,28 @@ public class JsonUtils {
     }
     if (builder.length() - initialLength > 0) {
       assert builder.charAt(builder.length() - 1) == ',';
+      builder.deleteCharAt(builder.length() - 1);
+    }
+
+    builder.append("},");
+  }
+
+  static void encode(final StringBuilder builder, final String name, final Collapse collapse) {
+    builder.append("\"");
+    builder.append(name);
+    builder.append("\":{");
+    final int initialLength = builder.length();
+
+    final Collapse.Action action = collapse.getAction();
+    if (action != null) {
+      encode(builder, "transition", action.name());
+    }
+    final String forId = collapse.getFor();
+    if (forId != null) {
+      encode(builder, "forId", forId);
+    }
+    if (builder.length() - initialLength > 0) {
+      assert builder.charAt(builder.length() - 1) == ',';
       builder.deleteCharAt(builder.length() - 1);
     }
 

Modified: myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/BoxRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/BoxRenderer.java?rev=1750640&r1=1750639&r2=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/BoxRenderer.java (original)
+++ myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/BoxRenderer.java Wed Jun 29 13:58:18 2016
@@ -19,10 +19,10 @@
 package org.apache.myfaces.tobago.renderkit.html.standard.standard.tag;
 
 import org.apache.myfaces.tobago.component.Facets;
-import org.apache.myfaces.tobago.component.UIBox;
 import org.apache.myfaces.tobago.component.UIMenuBar;
+import org.apache.myfaces.tobago.internal.component.AbstractUIBox;
 import org.apache.myfaces.tobago.internal.util.Deprecation;
-import org.apache.myfaces.tobago.renderkit.RendererBase;
+import org.apache.myfaces.tobago.model.CollapseState;
 import org.apache.myfaces.tobago.renderkit.css.BootstrapClass;
 import org.apache.myfaces.tobago.renderkit.css.Classes;
 import org.apache.myfaces.tobago.renderkit.css.TobagoClass;
@@ -32,22 +32,18 @@ import org.apache.myfaces.tobago.renderk
 import org.apache.myfaces.tobago.renderkit.util.RenderUtils;
 import org.apache.myfaces.tobago.util.ComponentUtils;
 import org.apache.myfaces.tobago.webapp.TobagoResponseWriter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import javax.faces.component.UIComponent;
 import javax.faces.component.UIPanel;
 import javax.faces.context.FacesContext;
 import java.io.IOException;
 
-public class BoxRenderer extends RendererBase {
-
-  private static final Logger LOG = LoggerFactory.getLogger(BoxRenderer.class);
+public class BoxRenderer extends PanelRendererBase {
 
   @Override
   public void encodeBegin(final FacesContext facesContext, final UIComponent component) throws IOException {
 
-    final UIBox box = (UIBox) component;
+    final AbstractUIBox box = (AbstractUIBox) component;
     final TobagoResponseWriter writer = HtmlRendererUtils.getTobagoResponseWriter(facesContext);
 
     final UIComponent label = ComponentUtils.getFacet(box, Facets.label);
@@ -56,8 +52,14 @@ public class BoxRenderer extends Rendere
     final UIComponent bar = ComponentUtils.getFacet(box, Facets.bar);
 
     writer.startElement(HtmlElements.DIV);
-    writer.writeClassAttribute(Classes.create(box), BootstrapClass.CARD, box.getCustomClass());
-    writer.writeIdAttribute(box.getClientId(facesContext));
+    final CollapseState collapsed = box.getCollapsed();
+    writer.writeClassAttribute(
+        Classes.create(box),
+        collapsed == CollapseState.visible ? null : TobagoClass.COLLAPSED,
+        BootstrapClass.CARD,
+        box.getCustomClass());
+    final String clientId = box.getClientId(facesContext);
+    writer.writeIdAttribute(clientId);
     final String title = HtmlRendererUtils.getTitleFromTipAndMessages(facesContext, box);
     if (title != null) {
       writer.writeAttribute(HtmlAttributes.TITLE, title, true);
@@ -65,6 +67,8 @@ public class BoxRenderer extends Rendere
     HtmlRendererUtils.writeDataAttributes(facesContext, writer, box);
     writer.writeStyleAttribute(box.getStyle());
 
+    encodeHidden(writer, clientId);
+
     if (label != null || labelString != null || bar != null || toolbar != null) {
       writer.startElement(HtmlElements.DIV);
       writer.writeClassAttribute(BootstrapClass.CARD_HEADER);
@@ -103,19 +107,6 @@ public class BoxRenderer extends Rendere
   }
 
   @Override
-  public boolean getRendersChildren() {
-    return true;
-  }
-
-  @Override
-  public void encodeChildren(final FacesContext facesContext, final UIComponent component) throws IOException {
-    if (component instanceof UIBox && ((UIBox) component).isCollapsed()) {
-      return;
-    }
-    super.encodeChildren(facesContext, component);
-  }
-
-  @Override
   public void encodeEnd(final FacesContext facesContext, final UIComponent component) throws IOException {
     final TobagoResponseWriter writer = HtmlRendererUtils.getTobagoResponseWriter(facesContext);
     writer.endElement(HtmlElements.DIV);

Added: myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/OperationRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/OperationRenderer.java?rev=1750640&view=auto
==============================================================================
--- myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/OperationRenderer.java (added)
+++ myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/OperationRenderer.java Wed Jun 29 13:58:18 2016
@@ -0,0 +1,8 @@
+package org.apache.myfaces.tobago.renderkit.html.standard.standard.tag;
+
+import org.apache.myfaces.tobago.renderkit.RendererBase;
+
+public class OperationRenderer extends RendererBase {
+
+  // no needed
+}

Modified: myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/PanelRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/PanelRenderer.java?rev=1750640&r1=1750639&r2=1750640&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/PanelRenderer.java (original)
+++ myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/PanelRenderer.java Wed Jun 29 13:58:18 2016
@@ -23,13 +23,13 @@ import org.apache.myfaces.tobago.compone
 import org.apache.myfaces.tobago.component.UIPanel;
 import org.apache.myfaces.tobago.component.UIReload;
 import org.apache.myfaces.tobago.internal.util.FacesContextUtils;
-import org.apache.myfaces.tobago.renderkit.RendererBase;
+import org.apache.myfaces.tobago.model.CollapseState;
 import org.apache.myfaces.tobago.renderkit.css.Classes;
+import org.apache.myfaces.tobago.renderkit.css.TobagoClass;
 import org.apache.myfaces.tobago.renderkit.html.DataAttributes;
 import org.apache.myfaces.tobago.renderkit.html.HtmlAttributes;
 import org.apache.myfaces.tobago.renderkit.html.HtmlElements;
 import org.apache.myfaces.tobago.renderkit.html.util.HtmlRendererUtils;
-import org.apache.myfaces.tobago.renderkit.util.RenderUtils;
 import org.apache.myfaces.tobago.util.ComponentUtils;
 import org.apache.myfaces.tobago.webapp.TobagoResponseWriter;
 
@@ -37,31 +37,22 @@ import javax.faces.component.UIComponent
 import javax.faces.context.FacesContext;
 import java.io.IOException;
 
-public class PanelRenderer extends RendererBase {
-
-  @Override
-  public boolean getRendersChildren() {
-    return true;
-  }
-
-  @Override
-  public void encodeChildren(final FacesContext facesContext, final UIComponent component) throws IOException {
-    final UIPanel panel = (UIPanel) component;
-    for (final UIComponent child : panel.getChildren()) {
-      RenderUtils.encode(facesContext, child);
-    }
-  }
+public class PanelRenderer extends PanelRendererBase {
 
   @Override
   public void encodeBegin(final FacesContext facesContext, final UIComponent component) throws IOException {
 
     final UIPanel panel = (UIPanel) component;
     final TobagoResponseWriter writer = HtmlRendererUtils.getTobagoResponseWriter(facesContext);
-
     final String clientId = panel.getClientId(facesContext);
+    final CollapseState collapsed = panel.getCollapsed();
+
     writer.startElement(HtmlElements.DIV);
     writer.writeIdAttribute(clientId);
-    writer.writeClassAttribute(Classes.create(panel), panel.getCustomClass());
+    writer.writeClassAttribute(
+        Classes.create(panel),
+        panel.getCustomClass(),
+        collapsed == CollapseState.visible ? null : TobagoClass.COLLAPSED);
     writer.writeStyleAttribute(panel.getStyle());
 
     HtmlRendererUtils.writeDataAttributes(facesContext, writer, panel);
@@ -79,6 +70,8 @@ public class PanelRenderer extends Rende
     }
     HtmlRendererUtils.renderCommandFacet(panel, facesContext, writer);
     HtmlRendererUtils.encodeContextMenu(facesContext, writer, panel);
+
+    encodeHidden(writer, clientId);
   }
 
   @Override