You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by to...@apache.org on 2005/09/24 02:00:55 UTC

svn commit: r291224 - /myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/

Author: tomsp
Date: Fri Sep 23 17:00:49 2005
New Revision: 291224

URL: http://svn.apache.org/viewcvs?rev=291224&view=rev
Log:
Refactoring navigation

Modified:
    myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlCommandNavigationItem.java
    myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlCommandNavigationItemTag.java
    myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlNavigationMenuRenderer.java
    myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlNavigationMenuRendererUtils.java
    myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlPanelNavigationMenu.java

Modified: myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlCommandNavigationItem.java
URL: http://svn.apache.org/viewcvs/myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlCommandNavigationItem.java?rev=291224&r1=291223&r2=291224&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlCommandNavigationItem.java (original)
+++ myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlCommandNavigationItem.java Fri Sep 23 17:00:49 2005
@@ -30,6 +30,7 @@
 import java.util.List;
 
 /**
+ * @author Manfred Geiler
  * @author Thomas Spiegl
  */
 public class HtmlCommandNavigationItem extends HtmlCommandLink

Modified: myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlCommandNavigationItemTag.java
URL: http://svn.apache.org/viewcvs/myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlCommandNavigationItemTag.java?rev=291224&r1=291223&r2=291224&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlCommandNavigationItemTag.java (original)
+++ myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlCommandNavigationItemTag.java Fri Sep 23 17:00:49 2005
@@ -23,6 +23,8 @@
  */
 public class HtmlCommandNavigationItemTag extends HtmlCommandLinkTag
 {
+
+
     public String getComponentType()
     {
         return HtmlCommandNavigationItem.COMPONENT_TYPE;
@@ -30,6 +32,6 @@
 
     public String getRendererType()
     {
-        return "org.apache.myfaces.NavigationMenu";
+        return HtmlNavigationMenuRenderer.RENDERER_TYPE;
     }
 }

Modified: myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlNavigationMenuRenderer.java
URL: http://svn.apache.org/viewcvs/myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlNavigationMenuRenderer.java?rev=291224&r1=291223&r2=291224&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlNavigationMenuRenderer.java (original)
+++ myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlNavigationMenuRenderer.java Fri Sep 23 17:00:49 2005
@@ -17,6 +17,8 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.myfaces.custom.navmenu.UINavigationMenuItem;
+import org.apache.myfaces.el.SimpleActionMethodBinding;
 import org.apache.myfaces.renderkit.RendererUtils;
 import org.apache.myfaces.renderkit.html.HTML;
 import org.apache.myfaces.renderkit.html.HtmlRendererUtils;
@@ -24,20 +26,23 @@
 
 import javax.faces.component.UIComponent;
 import javax.faces.component.UIOutput;
+import javax.faces.component.UIViewRoot;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
+import javax.faces.el.MethodBinding;
 import java.io.IOException;
-import java.util.Iterator;
 import java.util.List;
 
 /**
- * @author Manfred Geiler
  * @author Thomas Spiegl
+ * @author Manfred Geiler
  */
 public class HtmlNavigationMenuRenderer extends HtmlLinkRenderer
 {
     private static final Log log = LogFactory.getLog(HtmlNavigationMenuRenderer.class);
 
+    public static final String RENDERER_TYPE = "org.apache.myfaces.NavigationMenu";
+
     private static final Integer ZERO_INTEGER = new Integer(0);
 
     public boolean getRendersChildren()
@@ -84,6 +89,14 @@
         HtmlPanelNavigationMenu panelNav = (HtmlPanelNavigationMenu)component;
         if (HtmlNavigationMenuRendererUtils.isListLayout(panelNav))
         {
+            // get old view
+            UIViewRoot previousViewRoot = (UIViewRoot)
+                facesContext.getExternalContext().getRequestMap().get(HtmlPanelNavigationMenu.PREVIOUS_VIEW_ROOT);
+            // preprocess component tree
+            preprocessNavigationItems(facesContext, panelNav, previousViewRoot, panelNav.getChildren());
+            // render list
+            if (log.isDebugEnabled())
+                HtmlNavigationMenuRendererUtils.debugTree(log, panelNav.getChildren(), 0);
             renderListLayout(facesContext, panelNav);
         }
         else
@@ -92,54 +105,67 @@
         }
     }
 
-    private void postProcessComponentTree(List children)
+    private void preprocessNavigationItems(FacesContext facesContext, UIComponent parent, UIViewRoot previousViewRoot, List children)
     {
-        for (Iterator it = children.iterator(); it.hasNext(); )
+        for (int i = 0; i < children.size(); i++)
         {
-            UIComponent child = (UIComponent)it.next();
+            UIComponent child = (UIComponent)children.get(i);
             if (!child.isRendered()) continue;
-            if (child instanceof HtmlCommandNavigationItem)
+            if (child instanceof UINavigationMenuItem)
             {
-                HtmlCommandNavigationItem navItem = (HtmlCommandNavigationItem) child;
-                if (navItem.isActive())
+                UINavigationMenuItem uiNavMenuItem = (UINavigationMenuItem) child;
+
+                // Create HtmlCommandNavigationItem
+                HtmlCommandNavigationItem item = (HtmlCommandNavigationItem)
+                    facesContext.getApplication().createComponent(HtmlCommandNavigationItem.COMPONENT_TYPE);
+                item.setRendererType(RENDERER_TYPE);
+                parent.getChildren().add(i + 1, item);
+                item.setParent(parent);
+                // set action
+                item.setAction(getAction(facesContext, uiNavMenuItem));
+                // restore state
+                HtmlCommandNavigationItem previousItem =
+                    HtmlNavigationMenuRendererUtils.findPreviousItem(previousViewRoot, item.getClientId(facesContext));
+                if (previousItem != null)
+                {
+                    item.setActive(Boolean.valueOf(previousItem.isActive()));
+                    item.setOpen(Boolean.valueOf(previousItem.isOpen()));
+                }
+
+                // Create UIOutput
+                UIOutput uiOutput = (UIOutput) facesContext.getApplication().createComponent(UIOutput.COMPONENT_TYPE);
+                item.getChildren().add(uiOutput);
+                uiOutput.setParent(item);
+                if (uiNavMenuItem.getItemLabel() != null)
                 {
-                    navItem.getChildren().remove(0);
-                    navItem.getChildren().remove(0);
+                    uiOutput.setValue(uiNavMenuItem.getItemLabel());
                 }
-                if (navItem.isOpen() && navItem.getChildren().size() > 0)
+                else
                 {
-                    postProcessComponentTree(navItem.getChildren());
+                    uiOutput.setValue(uiNavMenuItem.getValue());
                 }
+                // process next level
+                preprocessNavigationItems(facesContext, item, previousViewRoot, uiNavMenuItem.getChildren());
             }
         }
     }
 
-    private void preProcessComponentTree(FacesContext facesContext, UIComponent activeItemPrefix, List children)
+    private MethodBinding getAction(FacesContext facesContext, UINavigationMenuItem uiNavMenuItem)
     {
-        for (Iterator it = children.iterator(); it.hasNext(); )
+        String action = uiNavMenuItem.getAction();
+        MethodBinding mb;
+        if (HtmlNavigationMenuRendererUtils.isValueReference(action))
         {
-            UIComponent child = (UIComponent)it.next();
-            if (!child.isRendered()) continue;
-            if (child instanceof HtmlCommandNavigationItem)
-            {
-                HtmlCommandNavigationItem navItem = (HtmlCommandNavigationItem) child;
-                if (navItem.isActive())
-                {
-                    UIOutput uiOutput = (UIOutput) facesContext.getApplication().createComponent(UIOutput.COMPONENT_TYPE);
-                    uiOutput.setValue(navItem.getValue());
-                    uiOutput.setTransient(true);
-                    navItem.setValue(null);
-                    navItem.getChildren().add(0, uiOutput);
-                    navItem.getChildren().add(0, activeItemPrefix);
-                }
-                if (navItem.isOpen() && navItem.getChildren().size() > 0)
-                {
-                    preProcessComponentTree(facesContext, activeItemPrefix, navItem.getChildren());
-                }
-            }
+            mb = facesContext.getApplication().createMethodBinding(action, null);
         }
+        else
+        {
+            mb = new SimpleActionMethodBinding(action);
+        }
+        return mb;
     }
 
+
     protected void renderListLayout(FacesContext facesContext, HtmlPanelNavigationMenu component) throws IOException
     {
         ResponseWriter writer = facesContext.getResponseWriter();
@@ -188,8 +214,8 @@
         }
     }
 
-    // protected
-    
+// protected
+
     protected String getStyle(FacesContext facesContext, UIComponent link)
     {
         if (!(link instanceof HtmlCommandNavigationItem))

Modified: myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlNavigationMenuRendererUtils.java
URL: http://svn.apache.org/viewcvs/myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlNavigationMenuRendererUtils.java?rev=291224&r1=291223&r2=291224&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlNavigationMenuRendererUtils.java (original)
+++ myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlNavigationMenuRendererUtils.java Fri Sep 23 17:00:49 2005
@@ -3,10 +3,14 @@
 import org.apache.myfaces.renderkit.html.HtmlRendererUtils;
 import org.apache.myfaces.renderkit.html.HTML;
 import org.apache.myfaces.renderkit.RendererUtils;
+import org.apache.myfaces.custom.navmenu.UINavigationMenuItem;
+import org.apache.commons.logging.Log;
 
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
 import javax.faces.component.UIComponent;
+import javax.faces.component.UIOutput;
+import javax.faces.component.UIViewRoot;
 import java.util.List;
 import java.util.Iterator;
 import java.io.IOException;
@@ -28,6 +32,10 @@
         {
             UIComponent child = (UIComponent)it.next();
             if (!child.isRendered()) continue;
+            if (child instanceof UINavigationMenuItem)
+            {
+                renderChildrenListLayout(facesContext, writer, panelNav, child.getChildren(), level);
+            }
             if (child instanceof HtmlCommandNavigationItem)
             {
                 //navigation item
@@ -206,7 +214,7 @@
 
     public static boolean isListLayout(HtmlPanelNavigationMenu panelNav)
     {
-        return "List".equalsIgnoreCase(panelNav.getLayout());
+        return !"Table".equalsIgnoreCase(panelNav.getLayout());
     }
 
     public static void renderChildren(FacesContext facesContext, HtmlCommandNavigationItem component) throws IOException
@@ -224,4 +232,62 @@
         }
     }
 
+    public static void debugTree(Log log, List children, int level)
+    {
+        for (Iterator it = children.iterator(); it.hasNext(); )
+        {
+            UIComponent child = (UIComponent) it.next();
+            if (child instanceof UINavigationMenuItem)
+            {
+                UINavigationMenuItem item = (UINavigationMenuItem) child;
+                StringBuffer buf = new StringBuffer();
+                for (int i = 0; i < level * 4; i++) buf.append(' ');
+                log.debug(buf.toString() + "--> " + item.getItemLabel());
+                debugTree(log, child.getChildren(), level + 1);
+            }
+            else if (child instanceof HtmlCommandNavigationItem)
+            {
+                HtmlCommandNavigationItem item = (HtmlCommandNavigationItem) child;
+                StringBuffer buf = new StringBuffer();
+                for (int i = 0; i < level * 4; i++) buf.append(' ');
+                String value;
+                if (item.getChildren().size() > 0 && item.getChildren().get(0) instanceof UIOutput)
+                {
+                    UIOutput uiOutput = (UIOutput) item.getChildren().get(0);
+                    value = uiOutput.getValue() != null ? uiOutput.getValue().toString() : "?";
+                }
+                else
+                {
+                    value = item.getValue() != null ? item.getValue().toString() : "";
+                }
+                log.debug(buf.toString() + value);
+                debugTree(log, child.getChildren(), level + 1);
+            }
+        }
+    }
+
+    public static HtmlCommandNavigationItem findPreviousItem(UIViewRoot previousViewRoot, String clientId)
+    {
+        HtmlCommandNavigationItem previousItem = null;
+        if (previousViewRoot != null)
+        {
+            UIComponent previousComp = previousViewRoot.findComponent(clientId);
+            if (previousComp instanceof HtmlCommandNavigationItem)
+            {
+                previousItem = (HtmlCommandNavigationItem) previousComp;
+            }
+        }
+        return previousItem;
+    }
+
+    public static boolean isValueReference(String value)
+    {
+        if (value == null) throw new NullPointerException("value");
+
+        int start = value.indexOf("#{");
+        if (start < 0) return false;
+
+        int end = value.lastIndexOf('}');
+        return (end >=0 && start < end);
+    }
 }

Modified: myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlPanelNavigationMenu.java
URL: http://svn.apache.org/viewcvs/myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlPanelNavigationMenu.java?rev=291224&r1=291223&r2=291224&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlPanelNavigationMenu.java (original)
+++ myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/navmenu/htmlnavmenu/HtmlPanelNavigationMenu.java Fri Sep 23 17:00:49 2005
@@ -35,7 +35,7 @@
 {
     private static final Log log = LogFactory.getLog(HtmlPanelNavigationMenu.class);
 
-    private static final String PREVIOUS_VIEW_ROOT = HtmlPanelNavigationMenu.class.getName() + ".PREVIOUS_VIEW_ROOT";
+    static final String PREVIOUS_VIEW_ROOT = HtmlPanelNavigationMenu.class.getName() + ".PREVIOUS_VIEW_ROOT";
     private boolean _itemOpenActiveStatesRestored = false;
 
     public void decode(FacesContext context)