Author: nbelaevski
Date: 2009-01-28 09:25:42 -0500 (Wed, 28 Jan 2009)
New Revision: 12466
Added:
trunk/ui/simpleTogglePanel/src/main/java/org/richfaces/event/SimpleTogglePanelSwitchEvent.java
Modified:
trunk/ui/simpleTogglePanel/src/main/java/org/richfaces/component/UISimpleTogglePanel.java
trunk/ui/simpleTogglePanel/src/main/java/org/richfaces/renderkit/html/SimpleTogglePanelRenderer.java
trunk/ui/simpleTogglePanel/src/main/java/org/richfaces/taglib/SimpleTogglePanelTagHandlerBase.java
Log:
https://jira.jboss.org/jira/browse/RF-3552
Modified:
trunk/ui/simpleTogglePanel/src/main/java/org/richfaces/component/UISimpleTogglePanel.java
===================================================================
---
trunk/ui/simpleTogglePanel/src/main/java/org/richfaces/component/UISimpleTogglePanel.java 2009-01-28
14:16:38 UTC (rev 12465)
+++
trunk/ui/simpleTogglePanel/src/main/java/org/richfaces/component/UISimpleTogglePanel.java 2009-01-28
14:25:42 UTC (rev 12466)
@@ -23,22 +23,30 @@
import java.util.Iterator;
+import javax.el.ELException;
+import javax.el.ValueExpression;
+import javax.faces.FacesException;
+import javax.faces.application.FacesMessage;
import javax.faces.component.ActionSource;
import javax.faces.component.UIComponent;
+import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.FacesEvent;
+import javax.faces.event.PhaseId;
import org.ajax4jsf.component.AjaxActionComponent;
import org.ajax4jsf.component.AjaxComponent;
+import org.ajax4jsf.component.IterationStateHolder;
import org.ajax4jsf.event.AjaxSource;
-import org.richfaces.event.SimpleToggleEvent;
+import org.richfaces.component.util.MessageUtil;
+import org.richfaces.event.SimpleTogglePanelSwitchEvent;
/**
* JSF component class
*/
-public abstract class UISimpleTogglePanel extends AjaxActionComponent implements
AjaxComponent, AjaxSource, ActionSource
+public abstract class UISimpleTogglePanel extends AjaxActionComponent implements
AjaxComponent, AjaxSource, ActionSource, IterationStateHolder
//public abstract class UISimpleTogglePanel extends UIInput implements AjaxComponent,
AjaxSource, ActionSource
{
@@ -46,22 +54,21 @@
public static final String SERVER_SWITCH_TYPE = "server";
public static final String CLIENT_SWITCH_TYPE = "client";
public static final String AJAX_SWITCH_TYPE = "ajax";
+
+ @Deprecated
public static final boolean COLLAPSED = false;
+ @Deprecated
public static final boolean EXPANDED = true;
// private transient Boolean openedSet = null;
- private transient Boolean wasOpened = null;
+ private transient Boolean wasOpened = Boolean.FALSE;
+ protected void setWasOpened(Boolean wasOpened) {
+ this.wasOpened = wasOpened;
+ }
+
protected boolean isWasOpened() {
- if (wasOpened == null) {
- if (CLIENT_SWITCH_TYPE.equals(getSwitchType())) {
- wasOpened = Boolean.TRUE;
- } else {
- wasOpened = isOpened();
- }
- }
-
return wasOpened;
}
@@ -102,6 +109,8 @@
return;
}
+ setWasOpened(Boolean.valueOf(CLIENT_SWITCH_TYPE.equals(getSwitchType()) ||
isOpened()));
+
if (isWasOpened()) {
// Process all facets and children of this component
Iterator<UIComponent> kids = getFacetsAndChildren();
@@ -120,16 +129,7 @@
}
}
- @Override
- public void broadcast(FacesEvent event) throws AbortProcessingException {
- if(event instanceof SimpleToggleEvent) {
- SimpleToggleEvent simpleToggleEvent = (SimpleToggleEvent) event;
- setOpened(simpleToggleEvent.isIsOpen());
- }
- super.broadcast(event);
- }
-
/**
* @throws NullPointerException {@inheritDoc}
*/
@@ -169,8 +169,6 @@
return;
}
-// updateModel();
-
if (isWasOpened()) {
// Process all facets and children of this component
Iterator<UIComponent> kids = getFacetsAndChildren();
@@ -181,38 +179,163 @@
}
}
-// private void updateModel () {
-// if (openedSet != null) {
-// setOpened(openedSet);
-// }
-// }
-
-// public boolean isOpenedSet() {
-// return openedSet;
-// }
+ @Override
+ public void queueEvent(FacesEvent event) {
+ if (event instanceof SimpleTogglePanelSwitchEvent &&
this.equals(event.getComponent())) {
+ SimpleTogglePanelSwitchEvent switchEvent = (SimpleTogglePanelSwitchEvent) event;
-// /**
-// * @param openedSet the openedSet to set
-// */
-// public void setOpenedSet(boolean openedSet) {
-// this.openedSet = openedSet;
-// }
+ if (isImmediate()) {
+ setOpened(switchEvent.isOpened());
+ }
+
+ switchEvent.setPhaseId(PhaseId.UPDATE_MODEL_VALUES);
+ }
+
+ super.queueEvent(event);
+ }
-/*
- * public void setValueBinding(String arg0, ValueBinding arg1) { if
- * ("opened".equals(arg0)) super.setValueBinding("value", arg1);
- * super.setValueBinding(arg0, arg1); }
- *
- * public ValueBinding getValueBinding(String arg0) { if
("opened".equals(arg0))
- * return super.getValueBinding("value"); return super.getValueBinding(arg0);
}
- */
- //public void broadcast(FacesEvent facesEvent) throws AbortProcessingException {
- // super.broadcast(facesEvent);
- // FacesContext facesContext = FacesContext.getCurrentInstance();
- // if (AjaxRendererUtils.isAjaxRequest(facesContext) &&
this.getSwitchType().equals(AJAX_SWITCH_TYPE)) {
- // AjaxRendererUtils.addRegionByName(facesContext,
- // this,
- // this.getId());
- // }
- //}
+ @Override
+ public void broadcast(FacesEvent event) throws AbortProcessingException {
+ super.broadcast(event);
+
+ if (event instanceof SimpleTogglePanelSwitchEvent) {
+ SimpleTogglePanelSwitchEvent switchEvent = (SimpleTogglePanelSwitchEvent) event;
+
+ setOpened(switchEvent.isOpened());
+
+ try {
+ updateModel();
+ } catch (RuntimeException e) {
+ getFacesContext().renderResponse();
+ throw e;
+ }
+ }
+ }
+
+ private Object value;
+
+ protected Object getLocalValue() {
+ return value;
+ }
+
+ @Override
+ public Object getValue() {
+ if (this.value != null) {
+ return this.value;
+ }
+
+ ValueExpression ve = getValueExpression("value");
+ if (ve != null) {
+ FacesContext context = getFacesContext();
+
+ try {
+ return ve.getValue(context.getELContext());
+ } catch (ELException e) {
+ throw new FacesException(e);
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public void setValue(Object value) {
+ this.value = value;
+ }
+
+ @Override
+ public Object saveState(FacesContext context) {
+ Object[] state = new Object[2];
+
+ state[0] = super.saveState(context);
+ state[1] = this.value;
+
+ return state;
+ }
+
+ @Override
+ public void restoreState(FacesContext context, Object stateObject) {
+ Object[] state = (Object[]) stateObject;
+
+ super.restoreState(context, state[0]);
+ this.value = state[1];
+ }
+
+ public Object getIterationState() {
+ Object[] state = new Object[2];
+
+ state[0] = this.value;
+ state[1] = this.wasOpened;
+
+ return state;
+ }
+
+ public void setIterationState(Object stateObject) {
+ if (stateObject != null) {
+ Object[] state = (Object[]) stateObject;
+
+ this.value = state[0];
+ this.wasOpened = (Boolean) state[1];
+ } else {
+ this.value = null;
+ this.wasOpened = null;
+ }
+ }
+
+ protected void updateModel() {
+ Object value = getLocalValue();
+ if (value != null) {
+ ValueExpression ve = getValueExpression("value");
+ if (ve != null) {
+ FacesContext context = getFacesContext();
+ try {
+ ve.setValue(context.getELContext(), value);
+ setValue(null);
+ } catch (ELException e) {
+ String messageStr = e.getMessage();
+ Throwable result = e.getCause();
+ while (null != result &&
+ result.getClass().isAssignableFrom(ELException.class)) {
+ messageStr = result.getMessage();
+ result = result.getCause();
+ }
+ FacesMessage message;
+ if (null == messageStr) {
+ message =
+ //not an UIInput, but constant is fine
+ MessageUtil.getMessage(context, UIInput.UPDATE_MESSAGE_ID, new
Object[] {
+ MessageUtil.getLabel(context, this)
+ });
+ } else {
+ message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
+ messageStr,
+ messageStr);
+ }
+
+ context.getExternalContext().log(message.getSummary(), result);
+ context.addMessage(getClientId(context), message);
+ context.renderResponse();
+ } catch (IllegalArgumentException e) {
+ FacesMessage message =
+ MessageUtil.getMessage(context, UIInput.UPDATE_MESSAGE_ID, new Object[]
{
+ MessageUtil.getLabel(context, this)
+ });
+
+ context.getExternalContext().log(message.getSummary(), e);
+ context.addMessage(getClientId(context), message);
+ context.renderResponse();
+ } catch (Exception e) {
+ FacesMessage message =
+ MessageUtil.getMessage(context, UIInput.UPDATE_MESSAGE_ID, new Object[]
{
+ MessageUtil.getLabel(context, this)
+ });
+
+ context.getExternalContext().log(message.getSummary(), e);
+ context.addMessage(getClientId(context), message);
+ context.renderResponse();
+ }
+ }
+ }
+ }
+
}
Added:
trunk/ui/simpleTogglePanel/src/main/java/org/richfaces/event/SimpleTogglePanelSwitchEvent.java
===================================================================
---
trunk/ui/simpleTogglePanel/src/main/java/org/richfaces/event/SimpleTogglePanelSwitchEvent.java
(rev 0)
+++
trunk/ui/simpleTogglePanel/src/main/java/org/richfaces/event/SimpleTogglePanelSwitchEvent.java 2009-01-28
14:25:42 UTC (rev 12466)
@@ -0,0 +1,67 @@
+/**
+ * License Agreement.
+ *
+ * JBoss RichFaces - Ajax4jsf Component Library
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package org.richfaces.event;
+
+import javax.faces.component.UIComponent;
+import javax.faces.event.FacesEvent;
+import javax.faces.event.FacesListener;
+
+/**
+ * @author Nick Belaevski
+ * @since 3.3.1
+ */
+
+public class SimpleTogglePanelSwitchEvent extends FacesEvent {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 6963467503194963330L;
+
+ private boolean opened;
+
+ public SimpleTogglePanelSwitchEvent(UIComponent component, boolean opened) {
+ super(component);
+
+ this.opened = opened;
+ }
+
+ /* (non-Javadoc)
+ * @see
javax.faces.event.FacesEvent#isAppropriateListener(javax.faces.event.FacesListener)
+ */
+ @Override
+ public boolean isAppropriateListener(FacesListener listener) {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see javax.faces.event.FacesEvent#processListener(javax.faces.event.FacesListener)
+ */
+ @Override
+ public void processListener(FacesListener listener) {
+ throw new UnsupportedOperationException();
+ }
+
+ public boolean isOpened() {
+ return opened;
+ }
+}
Modified:
trunk/ui/simpleTogglePanel/src/main/java/org/richfaces/renderkit/html/SimpleTogglePanelRenderer.java
===================================================================
---
trunk/ui/simpleTogglePanel/src/main/java/org/richfaces/renderkit/html/SimpleTogglePanelRenderer.java 2009-01-28
14:16:38 UTC (rev 12465)
+++
trunk/ui/simpleTogglePanel/src/main/java/org/richfaces/renderkit/html/SimpleTogglePanelRenderer.java 2009-01-28
14:25:42 UTC (rev 12466)
@@ -38,6 +38,7 @@
import org.ajax4jsf.renderkit.RendererUtils;
import org.richfaces.component.UISimpleTogglePanel;
import org.richfaces.event.SimpleToggleEvent;
+import org.richfaces.event.SimpleTogglePanelSwitchEvent;
//public class SimpleTogglePanelRenderer extends AjaxCommandLinkRenderer {
@@ -46,7 +47,7 @@
final static String NONE = "none";
final static String EMPTY = "";
- protected Class getComponentClass() {
+ protected Class<? extends UIComponent> getComponentClass() {
return UISimpleTogglePanel.class;
}
@@ -70,47 +71,25 @@
UISimpleTogglePanel panel = (UISimpleTogglePanel) component;
if (clnId != null) {
+ boolean currentState = panel.isOpened();
+ boolean submittedState = false;
+
// enqueue event here for this component or for component with Id
// taken fro forId attribute
-
String switchType = panel.getSwitchType();
- if (!(UISimpleTogglePanel.CLIENT_SWITCH_TYPE.equals(switchType))) {
- // xxxx by nick - denis - use constants, please!
- SimpleToggleEvent event;
- if (panel.isOpened()) {
- event = new SimpleToggleEvent(panel, UISimpleTogglePanel.COLLAPSED);
- // panel.setOpened(UISimpleTogglePanel.COLLAPSED);
- // panel.setOpenedSet(UISimpleTogglePanel.COLLAPSED);
- } else {
- event = new SimpleToggleEvent(panel, UISimpleTogglePanel.EXPANDED);
- // xxxx by nick - denis - use constants, please!
- // panel.setOpened(UISimpleTogglePanel.EXPANDED);
- // panel.setOpenedSet(UISimpleTogglePanel.EXPANDED);
- }
- // if (panel.isImmediate()) {
- // event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
- // } else {
- // event.setPhaseId(PhaseId.INVOKE_APPLICATION);
- // }
+ if (UISimpleTogglePanel.CLIENT_SWITCH_TYPE.equals(switchType)) {
+ submittedState = Boolean.parseBoolean((String) clnId);
+ } else {
+ submittedState = !currentState;
+ }
+
+ if (currentState != submittedState) {
+ SimpleToggleEvent event = new SimpleToggleEvent(panel, submittedState);
event.queue();
- } else {
- boolean submittedState = Boolean.parseBoolean((String) clnId);
- if (panel.isOpened() != submittedState) {
- // panel.setAjaxSingle(false);
- SimpleToggleEvent event = new SimpleToggleEvent(panel, submittedState);
- // if (panel.isImmediate()) {
- // event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
- // } else {
- // event.setPhaseId(PhaseId.INVOKE_APPLICATION);
- // }
- event.queue();
- }
-// TODO: should we remove it ??
- if (null == panel.getValueBinding("value"))
- panel.setOpened(submittedState);
- // panel.setOpenedSet(submittedState);
+ SimpleTogglePanelSwitchEvent stateEvent = new SimpleTogglePanelSwitchEvent(panel,
submittedState);
+ stateEvent.queue();
}
// in case of "ajax" request and "ajax" switch mode of toggle
panel
@@ -196,7 +175,7 @@
public void encodeChildren(FacesContext context, UIComponent component) throws
IOException {
UISimpleTogglePanel comp = (UISimpleTogglePanel) component;
- if (!(((comp.getSwitchType() == null) ||
(comp.getSwitchType().equals(UISimpleTogglePanel.CLIENT_SWITCH_TYPE) != true)) &&
(comp.isOpened() == UISimpleTogglePanel.COLLAPSED)))
+ if (!(((comp.getSwitchType() == null) ||
(comp.getSwitchType().equals(UISimpleTogglePanel.CLIENT_SWITCH_TYPE) != true)) &&
(!comp.isOpened())))
{
super.encodeChildren(context, component);
}
Modified:
trunk/ui/simpleTogglePanel/src/main/java/org/richfaces/taglib/SimpleTogglePanelTagHandlerBase.java
===================================================================
---
trunk/ui/simpleTogglePanel/src/main/java/org/richfaces/taglib/SimpleTogglePanelTagHandlerBase.java 2009-01-28
14:16:38 UTC (rev 12465)
+++
trunk/ui/simpleTogglePanel/src/main/java/org/richfaces/taglib/SimpleTogglePanelTagHandlerBase.java 2009-01-28
14:25:42 UTC (rev 12466)
@@ -22,8 +22,6 @@
import javax.faces.context.FacesContext;
-import org.ajax4jsf.webapp.taglib.AjaxComponentHandler;
-
import com.sun.facelets.tag.MetaRuleset;
import com.sun.facelets.tag.TagAttribute;
import com.sun.facelets.tag.TagAttributes;