You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2010/05/21 02:49:44 UTC
svn commit: r946839 -
/myfaces/tomahawk/trunk/core20/src/main/java/org/apache/myfaces/custom/autoscroll/AutoscrollPageTagHandler.java
Author: lu4242
Date: Fri May 21 00:49:43 2010
New Revision: 946839
URL: http://svn.apache.org/viewvc?rev=946839&view=rev
Log:
TOMAHAWK-1504 Update autoscroll feature to JSF 2 (add t:autoScrollPage)
Added:
myfaces/tomahawk/trunk/core20/src/main/java/org/apache/myfaces/custom/autoscroll/AutoscrollPageTagHandler.java
Added: myfaces/tomahawk/trunk/core20/src/main/java/org/apache/myfaces/custom/autoscroll/AutoscrollPageTagHandler.java
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core20/src/main/java/org/apache/myfaces/custom/autoscroll/AutoscrollPageTagHandler.java?rev=946839&view=auto
==============================================================================
--- myfaces/tomahawk/trunk/core20/src/main/java/org/apache/myfaces/custom/autoscroll/AutoscrollPageTagHandler.java (added)
+++ myfaces/tomahawk/trunk/core20/src/main/java/org/apache/myfaces/custom/autoscroll/AutoscrollPageTagHandler.java Fri May 21 00:49:43 2010
@@ -0,0 +1,209 @@
+/*
+ * 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.custom.autoscroll;
+
+import java.io.IOException;
+import java.util.List;
+
+import javax.faces.component.StateHolder;
+import javax.faces.component.UICommand;
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIViewRoot;
+import javax.faces.component.behavior.ClientBehavior;
+import javax.faces.component.behavior.ClientBehaviorHolder;
+import javax.faces.context.FacesContext;
+import javax.faces.event.ComponentSystemEvent;
+import javax.faces.event.ComponentSystemEventListener;
+import javax.faces.event.PostAddToViewEvent;
+import javax.faces.event.PostRestoreStateEvent;
+import javax.faces.event.SystemEvent;
+import javax.faces.event.SystemEventListener;
+import javax.faces.view.facelets.FaceletContext;
+import javax.faces.view.facelets.TagAttribute;
+import javax.faces.view.facelets.TagConfig;
+import javax.faces.view.facelets.TagHandler;
+
+import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletAttribute;
+import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletTag;
+
+/**
+ * Adds to UICommand components that implements ClientBehaviorHolder interface an
+ * AutoscrollBehavior.
+ * <p>
+ * Use it in this way to ensure proper operation:
+ * </p>
+ * <code>
+ * <f:metadata>
+ * <t:autoScrollPage/>
+ * </f:metadata>
+ * </code>
+ * <p>
+ * Or in this way:
+ * </p>
+ * <code>
+ * <h:body>
+ * <t:autoScrollPage/>
+ * </code>
+ * <p>
+ * It is possible to use it at start of the page too, but note this tag attach a listener to
+ * PostAddToViewEvent, so previous components added to the view before apply this TagHandler
+ * will not be taken into account.
+ * </p>
+ *
+ * @since 1.1.10
+ * @author Leonardo Uribe (latest modification by $Author: lu4242 $)
+ * @version $Revision: 691856 $ $Date: 2008-09-03 21:40:30 -0500 (mié, 03 sep 2008) $
+ */
+@JSFFaceletTag(name="t:autoScrollPage")
+public class AutoscrollPageTagHandler extends TagHandler
+{
+
+ /**
+ *
+ */
+ @JSFFaceletAttribute(name="event",
+ className="javax.el.ValueExpression",
+ deferredValueType="java.lang.String")
+ private TagAttribute _event;
+
+ public AutoscrollPageTagHandler(TagConfig config)
+ {
+ super(config);
+ _event = this.getAttribute("event");
+ }
+
+ public void apply(FaceletContext ctx, UIComponent parent)
+ throws IOException
+ {
+ UIViewRoot root = getViewRoot(ctx, parent);
+
+ if (!root.getAttributes().containsKey(AutoscrollBehaviorTagHandler.AUTOSCROLL_TAG_ON_PAGE))
+ {
+ root.getAttributes().put(AutoscrollBehaviorTagHandler.AUTOSCROLL_TAG_ON_PAGE, Boolean.TRUE);
+ }
+
+ String eventName = (_event == null) ? null : _event.getValue(ctx);
+
+ root.subscribeToViewEvent(PostAddToViewEvent.class,
+ new RegisterAutoscrollBehaviorOnCommandListener(eventName));
+ root.subscribeToEvent(PostRestoreStateEvent.class, new RegisterAutoscrollListener(eventName));
+ }
+
+ private UIViewRoot getViewRoot(FaceletContext ctx, UIComponent parent)
+ {
+ UIComponent c = parent;
+ do
+ {
+ if (c instanceof UIViewRoot)
+ {
+ return (UIViewRoot) c;
+ }
+ else
+ {
+ c = c.getParent();
+ }
+ } while (c != null);
+
+ return ctx.getFacesContext().getViewRoot();
+ }
+
+ public static class RegisterAutoscrollListener implements ComponentSystemEventListener, StateHolder
+ {
+ private String eventName;
+
+ public RegisterAutoscrollListener()
+ {
+ super();
+ }
+
+ public RegisterAutoscrollListener(String event)
+ {
+ super();
+ eventName = event;
+ }
+
+ public void processEvent(ComponentSystemEvent event)
+ {
+ FacesContext.getCurrentInstance().getViewRoot().subscribeToViewEvent(PostAddToViewEvent.class,
+ new RegisterAutoscrollBehaviorOnCommandListener(eventName));
+ }
+
+ public boolean isTransient()
+ {
+ return false;
+ }
+
+ public void setTransient(boolean newTransientValue)
+ {
+ }
+
+ public void restoreState(FacesContext context, Object state)
+ {
+ eventName = (String)state;
+ }
+
+ public Object saveState(FacesContext context)
+ {
+ return eventName;
+ }
+ }
+
+ public static class RegisterAutoscrollBehaviorOnCommandListener implements SystemEventListener
+ {
+ private String _eventName;
+
+ public RegisterAutoscrollBehaviorOnCommandListener(String eventName)
+ {
+ super();
+ _eventName = eventName;
+ }
+
+ public boolean isListenerForSource(Object source)
+ {
+ return (source instanceof UICommand && source instanceof ClientBehaviorHolder);
+ }
+
+ public void processEvent(SystemEvent event)
+ {
+ ClientBehaviorHolder component = (ClientBehaviorHolder) event.getSource();
+
+ String eventName = (_eventName == null) ? component.getDefaultEventName() : _eventName;
+
+ boolean found = false;
+ List<ClientBehavior> list = component.getClientBehaviors().get(eventName);
+ if (list != null)
+ {
+ for (ClientBehavior cb : list)
+ {
+ if (cb instanceof AutoscrollBehavior)
+ {
+ found = true;
+ break;
+ }
+ }
+ }
+
+ if (!found)
+ {
+ ClientBehavior behavior = (ClientBehavior) FacesContext.getCurrentInstance().getApplication().createBehavior(AutoscrollBehavior.BEHAVIOR_ID);
+ component.addClientBehavior(eventName, behavior);
+ }
+ }
+ }
+}