Author: Alex.Kolonitsky
Date: 2011-02-26 06:16:17 -0500 (Sat, 26 Feb 2011)
New Revision: 21946
Modified:
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/component/AbstractAccordion.java
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/component/AbstractCollapsiblePanel.java
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/component/AbstractPanelMenu.java
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/component/AbstractTabPanel.java
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/component/AbstractTogglePanel.java
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/CollapsiblePanelRenderer.java
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/PanelMenuRenderer.java
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/TabPanelRenderer.java
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/TogglePanelRenderer.java
branches/4.0.0.CR1/ui/validator/ui/src/main/java/org/richfaces/javascript/ClientScriptServiceImpl.java
Log:
RF-10586 togglePanel : ignores validation on ajax switching
Modified:
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/component/AbstractAccordion.java
===================================================================
---
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/component/AbstractAccordion.java 2011-02-26
00:50:53 UTC (rev 21945)
+++
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/component/AbstractAccordion.java 2011-02-26
11:16:17 UTC (rev 21946)
@@ -23,7 +23,12 @@
package org.richfaces.component;
-import org.richfaces.cdk.annotations.*;
+import org.richfaces.cdk.annotations.Attribute;
+import org.richfaces.cdk.annotations.EventName;
+import org.richfaces.cdk.annotations.JsfComponent;
+import org.richfaces.cdk.annotations.JsfRenderer;
+import org.richfaces.cdk.annotations.Tag;
+import org.richfaces.cdk.annotations.TagType;
/**
* @author akolonitsky
Modified:
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/component/AbstractCollapsiblePanel.java
===================================================================
---
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/component/AbstractCollapsiblePanel.java 2011-02-26
00:50:53 UTC (rev 21945)
+++
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/component/AbstractCollapsiblePanel.java 2011-02-26
11:16:17 UTC (rev 21946)
@@ -27,6 +27,7 @@
import javax.faces.context.FacesContext;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.FacesEvent;
+import javax.faces.event.PhaseId;
import org.richfaces.cdk.annotations.Attribute;
import org.richfaces.cdk.annotations.EventName;
@@ -212,9 +213,13 @@
@Override
public void broadcast(FacesEvent event) throws AbortProcessingException {
+ if (event instanceof PanelToggleEvent) {
+ setExpanded(((PanelToggleEvent)event).getExpanded());
+ setSubmittedActiveItem(null);
+ if (event.getPhaseId() != PhaseId.UPDATE_MODEL_VALUES) {
+ FacesContext.getCurrentInstance().renderResponse();
+ }
+ }
super.broadcast(event);
- if (event instanceof PanelToggleEvent && isImmediate()) {
- FacesContext.getCurrentInstance().renderResponse();
- }
}
}
Modified:
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/component/AbstractPanelMenu.java
===================================================================
---
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/component/AbstractPanelMenu.java 2011-02-26
00:50:53 UTC (rev 21945)
+++
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/component/AbstractPanelMenu.java 2011-02-26
11:16:17 UTC (rev 21946)
@@ -75,58 +75,66 @@
//TODO nick - is component immediate = true only?
//TODO nick - processValue should be executed in context of component, i.e. when
'component' EL variable is set
- processValue(context);
+ ItemChangeEvent event = createItemChangeEvent(context);
+ if (event != null) {
+ event.queue();
+ }
}
-
- private void processValue(FacesContext context) {
- try {
- if (context == null) {
- throw new NullPointerException();
+
+ public void queueEvent(FacesEvent event) {
+ if ((event instanceof ItemChangeEvent) && (event.getComponent() == this))
{
+ setEventPhase((ItemChangeEvent)event);
+ }
+ super.queueEvent(event);
+ }
+
+ public void setEventPhase(FacesEvent event) {
+ if (event instanceof ItemChangeEvent) {
+ AbstractPanelMenuItem actItm = (AbstractPanelMenuItem)
((ItemChangeEvent)event).getNewItem();
+ if (isImmediate() || (actItm != null && actItm.isImmediate())) {
+ event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
+ } else if (actItm!= null && actItm.isBypassUpdates()) {
+ event.setPhaseId(PhaseId.PROCESS_VALIDATIONS);
+ } else {
+ event.setPhaseId(PhaseId.UPDATE_MODEL_VALUES);
}
+ }
+ }
- // Submitted value == null means "the component was not submitted at
all".
- String activeItem = getSubmittedActiveItem();
- if (activeItem == null) {
- return;
- }
+ private ItemChangeEvent createItemChangeEvent(FacesContext context) {
- String previous = (String) getValue();
- setActiveItem(activeItem);
- setSubmittedActiveItem(null);
+ // Submitted value == null means "the component was not submitted at
all".
+ String activeItem = getSubmittedActiveItem();
+ if (activeItem == null) {
+ return null;
+ }
- if (previous == null || !previous.equalsIgnoreCase(activeItem)) {
- AbstractPanelMenuItem prevItm = null;
- AbstractPanelMenuItem actItm = null;
- if (previous != null) {
- prevItm = getItem(previous);
- }
- if (activeItem != null) {
- actItm = getItem(activeItem);
- }
-
- ItemChangeEvent event = new ItemChangeEvent(this, previous,prevItm,
activeItem, actItm);
- if (isImmediate() || (actItm != null && actItm.isImmediate())) {
- event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
- } else if (actItm!= null && actItm.isBypassUpdates()) {
- event.setPhaseId(PhaseId.PROCESS_VALIDATIONS);
- } else {
- event.setPhaseId(PhaseId.INVOKE_APPLICATION);
- }
- event.queue();
+ String previous = (String) getValue();
+ if (previous == null || !previous.equalsIgnoreCase(activeItem)) {
+ AbstractPanelMenuItem prevItm = null;
+ AbstractPanelMenuItem actItm = null;
+ if (previous != null) {
+ prevItm = getItem(previous);
}
- } catch (RuntimeException e) {
- context.renderResponse();
- throw e;
+ if (activeItem != null) {
+ actItm = getItem(activeItem);
+ }
+
+ return new ItemChangeEvent(this, previous, prevItm, activeItem, actItm);
}
+ return null;
}
@Override
public void broadcast(FacesEvent event) throws AbortProcessingException {
- super.broadcast(event);
-
if (event instanceof ItemChangeEvent) {
- getFacesContext().renderResponse();
+ setValue(((ItemChangeEvent) event).getNewItemName());
+ setSubmittedActiveItem(null);
+ if (event.getPhaseId() != PhaseId.UPDATE_MODEL_VALUES) {
+ FacesContext.getCurrentInstance().renderResponse();
+ }
}
+ super.broadcast(event);
}
public String getSubmittedActiveItem() {
@@ -155,6 +163,7 @@
}
}
+ @Attribute(generate = false)
public boolean isImmediate() {
return (Boolean) getStateHelper().eval(PropertyKeys.immediate, false);
}
Modified:
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/component/AbstractTabPanel.java
===================================================================
---
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/component/AbstractTabPanel.java 2011-02-26
00:50:53 UTC (rev 21945)
+++
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/component/AbstractTabPanel.java 2011-02-26
11:16:17 UTC (rev 21946)
@@ -25,7 +25,11 @@
import org.richfaces.HeaderAlignment;
import org.richfaces.HeaderPosition;
-import org.richfaces.cdk.annotations.*;
+import org.richfaces.cdk.annotations.Attribute;
+import org.richfaces.cdk.annotations.JsfComponent;
+import org.richfaces.cdk.annotations.JsfRenderer;
+import org.richfaces.cdk.annotations.Tag;
+import org.richfaces.cdk.annotations.TagType;
/**
* @author akolonitsky
@@ -88,9 +92,6 @@
public abstract String getTabHeaderClass();
@Attribute(hidden = true)
- public abstract boolean isBypassUpdates();
-
- @Attribute(hidden = true)
public abstract boolean isLimitRender();
@Attribute(hidden = true)
Modified:
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/component/AbstractTogglePanel.java
===================================================================
---
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/component/AbstractTogglePanel.java 2011-02-26
00:50:53 UTC (rev 21945)
+++
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/component/AbstractTogglePanel.java 2011-02-26
11:16:17 UTC (rev 21946)
@@ -22,16 +22,10 @@
package org.richfaces.component;
-import com.google.common.base.Strings;
-import org.richfaces.application.MessageFactory;
-import org.richfaces.application.ServiceTracker;
-import org.richfaces.appplication.FacesMessages;
-import org.richfaces.cdk.annotations.*;
-import org.richfaces.component.util.MessageUtil;
-import org.richfaces.event.ItemChangeEvent;
-import org.richfaces.event.ItemChangeListener;
-import org.richfaces.event.ItemChangeSource;
-import org.richfaces.renderkit.util.RendererUtils;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
import javax.el.ELException;
import javax.el.MethodExpression;
@@ -41,21 +35,48 @@
import javax.faces.component.UIComponent;
import javax.faces.component.UIOutput;
import javax.faces.component.UpdateModelException;
+import javax.faces.component.visit.VisitCallback;
+import javax.faces.component.visit.VisitContext;
+import javax.faces.component.visit.VisitResult;
import javax.faces.context.FacesContext;
-import javax.faces.event.*;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
+import javax.faces.event.AbortProcessingException;
+import javax.faces.event.ExceptionQueuedEvent;
+import javax.faces.event.ExceptionQueuedEventContext;
+import javax.faces.event.FacesEvent;
+import javax.faces.event.PhaseId;
+import javax.faces.event.PostValidateEvent;
+import javax.faces.event.PreValidateEvent;
+import org.richfaces.application.MessageFactory;
+import org.richfaces.application.ServiceTracker;
+import org.richfaces.appplication.FacesMessages;
+import org.richfaces.cdk.annotations.Attribute;
+import org.richfaces.cdk.annotations.EventName;
+import org.richfaces.cdk.annotations.JsfComponent;
+import org.richfaces.cdk.annotations.JsfRenderer;
+import org.richfaces.cdk.annotations.Tag;
+import org.richfaces.cdk.annotations.TagType;
+import org.richfaces.component.util.MessageUtil;
+import org.richfaces.context.ExtendedVisitContext;
+import org.richfaces.context.ExtendedVisitContextMode;
+import org.richfaces.event.ItemChangeEvent;
+import org.richfaces.event.ItemChangeListener;
+import org.richfaces.event.ItemChangeSource;
+import org.richfaces.renderkit.MetaComponentRenderer;
+import org.richfaces.renderkit.util.RendererUtils;
+
+import com.google.common.base.Strings;
+
/**
* @author akolonitsky
* @version 1.0
*/
@JsfComponent(tag = @Tag(type = TagType.Facelets, handler =
"org.richfaces.view.facelets.html.TogglePanelTagHandler"),
renderer = @JsfRenderer(type = "org.richfaces.TogglePanelRenderer"))
-public abstract class AbstractTogglePanel extends UIOutput implements AbstractDivPanel,
ItemChangeSource {
+public abstract class AbstractTogglePanel extends UIOutput implements AbstractDivPanel,
ItemChangeSource, MetaComponentResolver, MetaComponentEncoder {
+ public static final String ACTIVE_ITEM_META_COMPONENT = "activeItem";
+
public static final String COMPONENT_TYPE = "org.richfaces.TogglePanel";
public static final String COMPONENT_FAMILY = "org.richfaces.TogglePanel";
@@ -204,7 +225,10 @@
popComponentFromEL(context);
}
- createItemChangeEvent(context);
+ ItemChangeEvent event = createItemChangeEvent(context);
+ if (event != null) {
+ event.queue();
+ }
}
/**
@@ -372,7 +396,7 @@
}
}
- private void createItemChangeEvent(FacesContext context) {
+ private ItemChangeEvent createItemChangeEvent(FacesContext context) {
if (context == null) {
throw new NullPointerException();
}
@@ -380,12 +404,10 @@
// Submitted value == null means "the component was not submitted at
all".
String activeItem = getSubmittedActiveItem();
if (activeItem == null) {
- return;
+ return null;
}
String previous = (String) getValue();
- setValue(activeItem);
- setSubmittedActiveItem(null);
if (previous == null || !previous.equalsIgnoreCase(activeItem)) {
UIComponent prevComp = null;
UIComponent actvComp = null;
@@ -397,8 +419,9 @@
actvComp = (UIComponent)getItem(activeItem);
}
- new ItemChangeEvent(this, previous, prevComp, activeItem, actvComp).queue();
+ return new ItemChangeEvent(this, previous, prevComp, activeItem, actvComp);
}
+ return null;
}
@Override
@@ -414,10 +437,10 @@
RendererUtils.getInstance().isBooleanAttribute(event.getNewItem(),
"immediate"))) {
event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
} else {
- event.setPhaseId(PhaseId.INVOKE_APPLICATION);
+ event.setPhaseId(PhaseId.UPDATE_MODEL_VALUES);
}
}
-
+
protected void setEventPhase(FacesEvent event) {
if (isImmediate()) {
event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
@@ -428,11 +451,14 @@
@Override
public void broadcast(FacesEvent event) throws AbortProcessingException {
- super.broadcast(event);
-
if (event instanceof ItemChangeEvent) {
- FacesContext.getCurrentInstance().renderResponse();
+ setValue(((ItemChangeEvent) event).getNewItemName());
+ setSubmittedActiveItem(null);
+ if (event.getPhaseId() != PhaseId.UPDATE_MODEL_VALUES) {
+ FacesContext.getCurrentInstance().renderResponse();
+ }
}
+ super.broadcast(event);
}
// -------------------------------------------------- Panel Items Managing
@@ -657,4 +683,66 @@
removeFacesListener(listener);
}
+ public String resolveClientId(FacesContext facesContext, UIComponent
contextComponent, String metaComponentId) {
+ if (ACTIVE_ITEM_META_COMPONENT.equals(metaComponentId)) {
+ return getClientId(facesContext) +
MetaComponentResolver.META_COMPONENT_SEPARATOR_CHAR + metaComponentId;
+ }
+ return null;
+ }
+
+ public String substituteUnresolvedClientId(FacesContext facesContext, UIComponent
contextComponent,
+ String metaComponentId) {
+ return null;
+ }
+
+ public void encodeMetaComponent(FacesContext context, String metaComponentId) throws
IOException {
+ ((MetaComponentRenderer) getRenderer(context)).encodeMetaComponent(context, this,
metaComponentId);
+ }
+
+ @Override
+ public boolean visitTree(VisitContext context, VisitCallback callback) {
+ if (!isVisitable(context)) {
+ return false;
+ }
+
+ FacesContext facesContext = context.getFacesContext();
+ pushComponentToEL(facesContext, null);
+
+ try {
+ VisitResult result = context.invokeVisitCallback(this, callback);
+
+ if (result == VisitResult.COMPLETE) {
+ return true;
+ }
+
+ if (result == VisitResult.ACCEPT) {
+ if (context instanceof ExtendedVisitContext) {
+ ExtendedVisitContext extendedVisitContext = (ExtendedVisitContext)
context;
+ if (extendedVisitContext.getVisitMode() ==
ExtendedVisitContextMode.RENDER) {
+
+ result =
extendedVisitContext.invokeMetaComponentVisitCallback(this, callback,
ACTIVE_ITEM_META_COMPONENT);
+ if (result == VisitResult.COMPLETE) {
+ return true;
+ }
+ }
+ }
+ }
+
+ if (result == VisitResult.ACCEPT) {
+ Iterator<UIComponent> kids = this.getFacetsAndChildren();
+
+ while(kids.hasNext()) {
+ boolean done = kids.next().visitTree(context, callback);
+
+ if (done) {
+ return true;
+ }
+ }
+ }
+ } finally {
+ popComponentFromEL(facesContext);
+ }
+
+ return false;
+ }
}
Modified:
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/CollapsiblePanelRenderer.java
===================================================================
---
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/CollapsiblePanelRenderer.java 2011-02-26
00:50:53 UTC (rev 21945)
+++
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/CollapsiblePanelRenderer.java 2011-02-26
11:16:17 UTC (rev 21946)
@@ -102,29 +102,6 @@
};
@Override
- protected void doDecode(FacesContext context, UIComponent component) {
- AbstractTogglePanel panel = (AbstractTogglePanel) component;
-
- Map<String, String> requestMap =
- context.getExternalContext().getRequestParameterMap();
-
- // Don't overwrite the value unless you have to!
- String newValue = requestMap.get(getValueRequestParamName(context, component));
- if (newValue != null) {
- panel.setSubmittedActiveItem(newValue);
- }
-
- String compClientId = component.getClientId(context);
- String clientId = requestMap.get(compClientId);
- if (clientId != null && clientId.equals(compClientId)) {
- context.getPartialViewContext().getRenderIds().add(clientId);
-
- //TODO nick - this should be done on encode, not on decode
- addOnCompleteParam(context, newValue, panel.getClientId(context));
- }
- }
-
- @Override
protected void doEncodeBegin(ResponseWriter writer, FacesContext context, UIComponent
component) throws IOException {
super.doEncodeBegin(writer, context, component);
Modified:
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/PanelMenuRenderer.java
===================================================================
---
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/PanelMenuRenderer.java 2011-02-26
00:50:53 UTC (rev 21945)
+++
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/PanelMenuRenderer.java 2011-02-26
11:16:17 UTC (rev 21946)
@@ -23,23 +23,24 @@
package org.richfaces.renderkit.html;
-import org.ajax4jsf.javascript.JSObject;
-import org.richfaces.cdk.annotations.JsfRenderer;
-import org.richfaces.component.AbstractPanelMenu;
-import org.richfaces.component.util.HtmlUtil;
-import org.richfaces.renderkit.HtmlConstants;
+import static org.richfaces.renderkit.html.TogglePanelRenderer.getAjaxOptions;
+import static org.richfaces.renderkit.html.TogglePanelRenderer.getValueRequestParamName;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
import javax.faces.application.ResourceDependencies;
import javax.faces.application.ResourceDependency;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import static org.richfaces.renderkit.html.TogglePanelRenderer.getAjaxOptions;
-import static org.richfaces.renderkit.html.TogglePanelRenderer.getValueRequestParamName;
+import org.ajax4jsf.javascript.JSObject;
+import org.richfaces.cdk.annotations.JsfRenderer;
+import org.richfaces.component.AbstractPanelMenu;
+import org.richfaces.component.util.HtmlUtil;
+import org.richfaces.renderkit.HtmlConstants;
/**
* @author akolonitsky
Modified:
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/TabPanelRenderer.java
===================================================================
---
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/TabPanelRenderer.java 2011-02-26
00:50:53 UTC (rev 21945)
+++
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/TabPanelRenderer.java 2011-02-26
11:16:17 UTC (rev 21946)
@@ -22,25 +22,39 @@
package org.richfaces.renderkit.html;
-import org.ajax4jsf.javascript.JSObject;
-import org.richfaces.cdk.annotations.JsfRenderer;
-import org.richfaces.component.*;
-import org.richfaces.component.util.HtmlUtil;
-import org.richfaces.context.ExtendedPartialViewContext;
-import org.richfaces.renderkit.HtmlConstants;
-import org.richfaces.renderkit.RenderKitUtils;
+import static org.richfaces.component.AbstractTogglePanelTitledItem.HeaderStates.active;
+import static
org.richfaces.component.AbstractTogglePanelTitledItem.HeaderStates.disabled;
+import static
org.richfaces.component.AbstractTogglePanelTitledItem.HeaderStates.inactive;
+import static org.richfaces.renderkit.HtmlConstants.CLASS_ATTRIBUTE;
+import static org.richfaces.renderkit.HtmlConstants.DIV_ELEM;
+import static org.richfaces.renderkit.HtmlConstants.ID_ATTRIBUTE;
+import static org.richfaces.renderkit.HtmlConstants.SPAN_ELEM;
+import static org.richfaces.renderkit.HtmlConstants.STYLE_ATTRIBUTE;
+import static org.richfaces.renderkit.HtmlConstants.TBODY_ELEMENT;
+import static org.richfaces.renderkit.HtmlConstants.TD_ELEM;
+import static org.richfaces.renderkit.HtmlConstants.TR_ELEMENT;
+import static org.richfaces.renderkit.RenderKitUtils.renderPassThroughAttributes;
+import java.io.IOException;
+import java.util.Map;
+
import javax.faces.application.ResourceDependencies;
import javax.faces.application.ResourceDependency;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
-import java.io.IOException;
-import java.util.Map;
-import static org.richfaces.component.AbstractTogglePanelTitledItem.HeaderStates.*;
-import static org.richfaces.renderkit.HtmlConstants.*;
-import static org.richfaces.renderkit.RenderKitUtils.renderPassThroughAttributes;
+import org.ajax4jsf.javascript.JSObject;
+import org.richfaces.cdk.annotations.JsfRenderer;
+import org.richfaces.component.AbstractTab;
+import org.richfaces.component.AbstractTabPanel;
+import org.richfaces.component.AbstractTogglePanel;
+import org.richfaces.component.AbstractTogglePanelItemInterface;
+import org.richfaces.component.AbstractTogglePanelTitledItem;
+import org.richfaces.component.util.HtmlUtil;
+import org.richfaces.context.ExtendedPartialViewContext;
+import org.richfaces.renderkit.HtmlConstants;
+import org.richfaces.renderkit.RenderKitUtils;
/**
* @author akolonitsky
@@ -70,33 +84,6 @@
private static final String STYLE = STYLE_ATTRIBUTE;
private static final String CLASS = CLASS_ATTRIBUTE;
-// @Override
-// protected void doDecode(FacesContext context, UIComponent component) {
-// AbstractTogglePanel panel = (AbstractTogglePanel) component;
-//
-// Map<String, String> requestMap =
-// context.getExternalContext().getRequestParameterMap();
-//
-// // Don't overwrite the value unless you have to!
-// String newValue = requestMap.get(getValueRequestParamName(context,
component));
-// if (newValue != null) {
-// panel.setSubmittedActiveItem(newValue);
-// }
-//
-// String tabClientId = component.getClientId(context);
-// if (requestMap.get(tabClientId) != null) {
-// new ActionEvent(component).queue();
-//
-// if (context.getPartialViewContext().isPartialRequest()) {
-// //TODO nick - why render item by default?
-// context.getPartialViewContext().getRenderIds().add(tabClientId);
-//
-// //TODO nick - this should be done on encode, not on decode
-// AbstractTab tab = (AbstractTab) component;
-// addOnCompleteParam(context, tab.getName(),
tab.getTabPanel().getClientId(context));
-// }
-// }
-// }
protected static void addOnCompleteParam(FacesContext context, String newValue,
String panelId) {
StringBuilder onComplete = new StringBuilder();
Modified:
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/TogglePanelRenderer.java
===================================================================
---
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/TogglePanelRenderer.java 2011-02-26
00:50:53 UTC (rev 21945)
+++
branches/4.0.0.CR1/ui/output/ui/src/main/java/org/richfaces/renderkit/html/TogglePanelRenderer.java 2011-02-26
11:16:17 UTC (rev 21946)
@@ -22,29 +22,33 @@
package org.richfaces.renderkit.html;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.faces.application.ResourceDependencies;
+import javax.faces.application.ResourceDependency;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.context.PartialViewContext;
+import javax.faces.context.ResponseWriter;
+
import org.ajax4jsf.javascript.JSFunctionDefinition;
import org.ajax4jsf.javascript.JSObject;
import org.ajax4jsf.javascript.JSReference;
import org.richfaces.cdk.annotations.JsfRenderer;
import org.richfaces.component.AbstractTogglePanel;
import org.richfaces.component.AbstractTogglePanelItemInterface;
+import org.richfaces.component.MetaComponentResolver;
import org.richfaces.component.util.HtmlUtil;
import org.richfaces.context.ExtendedPartialViewContext;
import org.richfaces.renderkit.AjaxOptions;
import org.richfaces.renderkit.HtmlConstants;
+import org.richfaces.renderkit.MetaComponentRenderer;
import org.richfaces.renderkit.util.AjaxRendererUtils;
import org.richfaces.renderkit.util.FormUtil;
import org.richfaces.renderkit.util.HandlersChain;
-import javax.faces.application.ResourceDependencies;
-import javax.faces.application.ResourceDependency;
-import javax.faces.component.UIComponent;
-import javax.faces.context.FacesContext;
-import javax.faces.context.ResponseWriter;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
/**
* @author akolonitsky
*/
@@ -56,7 +60,7 @@
@ResourceDependency(name = "richfaces-base-component.js"),
@ResourceDependency(library = "org.richfaces", name =
"togglePanel.js")})
@JsfRenderer(type = "org.richfaces.TogglePanelRenderer", family =
AbstractTogglePanel.COMPONENT_FAMILY)
-public class TogglePanelRenderer extends DivPanelRenderer {
+public class TogglePanelRenderer extends DivPanelRenderer implements
MetaComponentRenderer {
public static final String VALUE_POSTFIX = "-value";
@@ -76,17 +80,14 @@
String newValue = requestMap.get(getValueRequestParamName(context, component));
if (newValue != null) {
panel.setSubmittedActiveItem(newValue);
-
- //Retrieve the child item from the panel
- AbstractTogglePanelItemInterface panelItem = panel.getItem(newValue);
- if (panelItem != null) {
- //Set the active panel to be rendered
- context.getPartialViewContext().getRenderIds().add(((UIComponent)
panelItem).getClientId(context));
-
- //TODO nick - this should be done on encode, not on decode
- addOnCompleteParam(context, newValue, panel.getClientId(context));
- }
}
+
+ if (requestMap.get("javax.faces.partial.ajax") != null) {
+ PartialViewContext pvc = context.getPartialViewContext();
+ pvc.getRenderIds().add(
+ component.getClientId(context) +
MetaComponentResolver.META_COMPONENT_SEPARATOR_CHAR
+ + AbstractTogglePanel.ACTIVE_ITEM_META_COMPONENT);
+ }
}
protected static void addOnCompleteParam(FacesContext context, String newValue,
String panelId) {
@@ -100,7 +101,7 @@
static String getValueRequestParamName(FacesContext context, UIComponent component)
{
return component.getClientId(context) + VALUE_POSTFIX;
}
-
+
@Override
protected void doEncodeBegin(ResponseWriter writer, FacesContext context, UIComponent
component) throws IOException {
FormUtil.throwEnclFormReqExceptionIfNeed(context, component);
@@ -114,7 +115,7 @@
writer.writeAttribute(HtmlConstants.TYPE_ATTR, HtmlConstants.INPUT_TYPE_HIDDEN,
null);
writer.writeAttribute(HtmlConstants.VALUE_ATTRIBUTE, panel.getActiveItem(),
null);
writer.endElement(HtmlConstants.INPUT_ELEM);
-
+
writeJavaScript(writer, context, component);
}
@@ -179,5 +180,39 @@
protected Class<? extends UIComponent> getComponentClass() {
return AbstractTogglePanel.class;
}
+
+ public void encodeMetaComponent(FacesContext context, UIComponent component, String
metaComponentId)
+ throws IOException {
+ if (AbstractTogglePanel.ACTIVE_ITEM_META_COMPONENT.equals(metaComponentId)) {
+ AbstractTogglePanel panel = (AbstractTogglePanel)component;
+ AbstractTogglePanelItemInterface item =
panel.getItem(panel.getActiveItem());
+
+ if (item != null) {
+ partialStart(context, ((UIComponent)item).getClientId(context));
+ ((UIComponent)item).encodeAll(context);
+ partialEnd(context);
+ addOnCompleteParam(context, item.getName(), panel.getClientId(context));
+ } else {
+ partialStart(context, component.getClientId(context));
+ component.encodeAll(context);
+ partialEnd(context);
+ addOnCompleteParam(context, panel.getActiveItem(),
panel.getClientId(context));
+ }
+ } else {
+ throw new IllegalArgumentException(metaComponentId);
+ }
+ }
+
+ public void decodeMetaComponent(FacesContext context, UIComponent component, String
metaComponentId) {
+ // TODO Auto-generated method stub
+ }
+
+ protected void partialStart(FacesContext facesContext, String id) throws IOException
{
+ facesContext.getPartialViewContext().getPartialResponseWriter().startUpdate(id);
+ }
+
+ protected void partialEnd(FacesContext facesContext) throws IOException {
+ facesContext.getPartialViewContext().getPartialResponseWriter().endUpdate();
+ }
}
Modified:
branches/4.0.0.CR1/ui/validator/ui/src/main/java/org/richfaces/javascript/ClientScriptServiceImpl.java
===================================================================
---
branches/4.0.0.CR1/ui/validator/ui/src/main/java/org/richfaces/javascript/ClientScriptServiceImpl.java 2011-02-26
00:50:53 UTC (rev 21945)
+++
branches/4.0.0.CR1/ui/validator/ui/src/main/java/org/richfaces/javascript/ClientScriptServiceImpl.java 2011-02-26
11:16:17 UTC (rev 21946)
@@ -5,7 +5,6 @@
import java.util.List;
import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import javax.faces.application.Resource;