Author: nbelaevski
Date: 2009-09-17 20:38:27 -0400 (Thu, 17 Sep 2009)
New Revision: 15616
Added:
branches/community/3.3.X/ui/panelmenu/src/main/java/org/richfaces/renderkit/PanelMenuRendererHelper.java
Modified:
branches/community/3.3.X/ui/panelmenu/src/main/java/org/richfaces/renderkit/PanelMenuRendererBase.java
branches/community/3.3.X/ui/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuGroupRenderer.java
branches/community/3.3.X/ui/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuItemRenderer.java
branches/community/3.3.X/ui/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuRenderer.java
branches/community/3.3.X/ui/panelmenu/src/main/resources/org/richfaces/renderkit/html/scripts/panelMenu.js
branches/community/3.3.X/ui/panelmenu/src/main/templates/org/richfaces/htmlPanelMenu.jspx
branches/community/3.3.X/ui/panelmenu/src/main/templates/org/richfaces/htmlPanelMenuGroup.jspx
branches/community/3.3.X/ui/panelmenu/src/main/templates/org/richfaces/htmlPanelMenuItem.jspx
Log:
https://jira.jboss.org/jira/browse/RF-7796
Modified:
branches/community/3.3.X/ui/panelmenu/src/main/java/org/richfaces/renderkit/PanelMenuRendererBase.java
===================================================================
---
branches/community/3.3.X/ui/panelmenu/src/main/java/org/richfaces/renderkit/PanelMenuRendererBase.java 2009-09-18
00:34:01 UTC (rev 15615)
+++
branches/community/3.3.X/ui/panelmenu/src/main/java/org/richfaces/renderkit/PanelMenuRendererBase.java 2009-09-18
00:38:27 UTC (rev 15616)
@@ -35,6 +35,7 @@
import org.richfaces.component.UIPanelMenu;
import org.richfaces.component.UIPanelMenuGroup;
import org.richfaces.component.UIPanelMenuItem;
+import org.richfaces.renderkit.PanelMenuRendererHelper.PanelMenuState;
import org.richfaces.renderkit.html.PanelMenuGroupRenderer;
import org.richfaces.renderkit.html.iconimages.PanelMenuIconChevron;
import org.richfaces.renderkit.html.iconimages.PanelMenuIconChevronDown;
@@ -285,4 +286,18 @@
}
+ protected abstract String getName(UIComponent component);
+
+ public String getSelectedClass(boolean isSelected) {
+ if (isSelected) {
+ return UIPanelMenu.SELECTED_CLASS;
+ }
+ return "";
+ }
+
+ public boolean queryAndMarkSelection(FacesContext context, UIComponent component){
+ UIPanelMenu parentMenu = findMenu(component);
+ PanelMenuState panelMenuState = PanelMenuRendererHelper.getOrCreateState(context,
parentMenu);
+ return panelMenuState.queryAndMarkSelection(getName(component));
+ }
}
Added:
branches/community/3.3.X/ui/panelmenu/src/main/java/org/richfaces/renderkit/PanelMenuRendererHelper.java
===================================================================
---
branches/community/3.3.X/ui/panelmenu/src/main/java/org/richfaces/renderkit/PanelMenuRendererHelper.java
(rev 0)
+++
branches/community/3.3.X/ui/panelmenu/src/main/java/org/richfaces/renderkit/PanelMenuRendererHelper.java 2009-09-18
00:38:27 UTC (rev 15616)
@@ -0,0 +1,95 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright ${year}, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+
+package org.richfaces.renderkit;
+
+import java.util.Map;
+
+import javax.faces.context.FacesContext;
+
+import org.richfaces.component.UIPanelMenu;
+import org.richfaces.context.RequestContext;
+
+/**
+ * @author Nick Belaevski
+ */
+public final class PanelMenuRendererHelper {
+
+ private static final String CONTEXT_ATTRIBUTE_NAME =
PanelMenuRendererHelper.class.getName();
+
+ public static final class PanelMenuState {
+
+ private boolean childMarked = false;
+
+ private String selectedChildName;
+
+ public PanelMenuState(String selectedChildName) {
+ super();
+ this.selectedChildName = selectedChildName;
+ }
+
+ /**
+ * Queries whether the child with such name is the currently selected item.
+ * Marks in state that selected child has been encoded.
+ * @param childName
+ * @return <code>true</code> if the named is selected,
<code>false</code> otherwise
+ */
+ public boolean queryAndMarkSelection(String childName) {
+ if (selectedChildName == null || selectedChildName.length() == 0) {
+ return false;
+ }
+
+ boolean selected = false;
+
+ if (selectedChildName.equals(childName)) {
+ this.childMarked = true;
+ selected = true;
+ }
+
+ return selected;
+ }
+
+ /**
+ * @return the selectedChildName
+ */
+ public String getSelectedItemInputValue() {
+ return childMarked ? selectedChildName : null;
+ }
+ }
+
+ private PanelMenuRendererHelper() {
+ }
+
+ public static PanelMenuState getOrCreateState(FacesContext context, UIPanelMenu
panelMenu) {
+ RequestContext requestContext = RequestContext.getInstance(context);
+ Map<String, Object> panelMenuStatesMap =
requestContext.getOrCreateNestedMap(CONTEXT_ATTRIBUTE_NAME);
+
+ String clientId = panelMenu.getClientId(context);
+ PanelMenuState panelMenuState = (PanelMenuState) panelMenuStatesMap.get(clientId);
+ if (panelMenuState == null) {
+ panelMenuState = new PanelMenuState(panelMenu.getSelectedName());
+ panelMenuStatesMap.put(clientId, panelMenuState);
+ }
+
+ return panelMenuState;
+ }
+}
Modified:
branches/community/3.3.X/ui/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuGroupRenderer.java
===================================================================
---
branches/community/3.3.X/ui/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuGroupRenderer.java 2009-09-18
00:34:01 UTC (rev 15615)
+++
branches/community/3.3.X/ui/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuGroupRenderer.java 2009-09-18
00:38:27 UTC (rev 15616)
@@ -248,13 +248,6 @@
return value;
}
- public String getSelectedClass(FacesContext context, UIComponent component) {
- if (isSelected(context, component)) {
- return UIPanelMenu.SELECTED_CLASS;
- }
- return "";
- }
-
public String getLabelClass(FacesContext context, UIComponent component) {
UIPanelMenuGroup group = (UIPanelMenuGroup)component;
UIPanelMenu parentMenu = findMenu(group);
@@ -305,10 +298,8 @@
return result;
}
- public boolean isSelected(FacesContext context, UIComponent component){
- UIPanelMenuGroup group = (UIPanelMenuGroup)component;
- UIPanelMenu parentMenu = findMenu(group);
- return group.getName().equals(parentMenu.getSelectedName());
+ @Override
+ protected String getName(UIComponent component) {
+ return ((UIPanelMenuGroup) component).getName();
}
-
}
Modified:
branches/community/3.3.X/ui/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuItemRenderer.java
===================================================================
---
branches/community/3.3.X/ui/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuItemRenderer.java 2009-09-18
00:34:01 UTC (rev 15615)
+++
branches/community/3.3.X/ui/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuItemRenderer.java 2009-09-18
00:38:27 UTC (rev 15616)
@@ -207,13 +207,6 @@
return styleBuffer.toString();
}
- public String getSelectedClass(FacesContext context, UIComponent component) {
- if (isSelected(context, component)) {
- return UIPanelMenu.SELECTED_CLASS;
- }
- return "";
- }
-
public String getLabelClass(FacesContext context, UIComponent component) {
StringBuffer resClass = new StringBuffer();
UIPanelMenuItem item = (UIPanelMenuItem)component;
@@ -251,10 +244,9 @@
return iconClass;
}
-
- public boolean isSelected(FacesContext context, UIComponent component){
- UIPanelMenuItem item = (UIPanelMenuItem)component;
- UIPanelMenu parentMenu = findMenu(item);
- return item.getName().equals(parentMenu.getSelectedName());
+
+ @Override
+ protected String getName(UIComponent component) {
+ return ((UIPanelMenuItem) component).getName();
}
}
Modified:
branches/community/3.3.X/ui/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuRenderer.java
===================================================================
---
branches/community/3.3.X/ui/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuRenderer.java 2009-09-18
00:34:01 UTC (rev 15615)
+++
branches/community/3.3.X/ui/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuRenderer.java 2009-09-18
00:38:27 UTC (rev 15616)
@@ -44,6 +44,8 @@
import org.richfaces.component.UIPanelMenuGroup;
import org.richfaces.component.UIPanelMenuItem;
import org.richfaces.renderkit.PanelMenuRendererBase;
+import org.richfaces.renderkit.PanelMenuRendererHelper;
+import org.richfaces.renderkit.PanelMenuRendererHelper.PanelMenuState;
public class PanelMenuRenderer extends PanelMenuRendererBase {
@@ -117,15 +119,12 @@
boolean expandSingle = parentMenu.isExpandSingle();
- String selectedChild = parentMenu.getSelectedName();
-
flatten(component.getChildren(), flatList, levels, 0);
panelMenu.append("var ids = new PanelMenu('")
.append(component.getClientId(context).toString())
.append("',")
.append(new Boolean(expandSingle).toString())
- .append(",").append("'").append(selectedChild).append("'")
.append(").getIds();\n");
for (Iterator iter = flatList.iterator(); iter.hasNext();) {
@@ -522,8 +521,8 @@
if(component instanceof UIPanelMenu){
UIPanelMenu panelMenu = (UIPanelMenu)component;
if(panelMenu.getChildCount() > 0){
- for (Iterator it = component.getChildren().iterator(); it.hasNext();) {
- UIComponent child = (UIComponent) it.next();
+ for (Iterator<UIComponent> it = component.getChildren().iterator();
it.hasNext();) {
+ UIComponent child = it.next();
if(child instanceof UIPanelMenuGroup) {
UIPanelMenuGroup group = (UIPanelMenuGroup)child;
@@ -556,4 +555,13 @@
}
}
+ @Override
+ protected String getName(UIComponent component) {
+ return null;
+ }
+
+ public String getSelectedItemInputValue(FacesContext context, UIPanelMenu panelMenu) {
+ PanelMenuState panelMenuState = PanelMenuRendererHelper.getOrCreateState(context,
panelMenu);
+ return panelMenuState.getSelectedItemInputValue();
+ }
}
Modified:
branches/community/3.3.X/ui/panelmenu/src/main/resources/org/richfaces/renderkit/html/scripts/panelMenu.js
===================================================================
---
branches/community/3.3.X/ui/panelmenu/src/main/resources/org/richfaces/renderkit/html/scripts/panelMenu.js 2009-09-18
00:34:01 UTC (rev 15615)
+++
branches/community/3.3.X/ui/panelmenu/src/main/resources/org/richfaces/renderkit/html/scripts/panelMenu.js 2009-09-18
00:38:27 UTC (rev 15616)
@@ -11,16 +11,16 @@
PanelMenu = Class.create();
PanelMenu.prototype = {
- initialize: function(myId, so, selectedChild){
+ initialize: function(myId, so) {
this.myId = myId;
this.childObj = new Array();
this.expandSingle = so;
this.lastExpanded = null;
- this.selectedChild = selectedChild;
this.selectedClass = 'rich-pmenu-selected-element';
this.is = 'panelMenu';
this.selectedNameInput = $(myId + 'selectedItemName');
+ this.selectedChild = this.selectedNameInput.value;
PanelMenuStorage[myId] = this;
},
Modified:
branches/community/3.3.X/ui/panelmenu/src/main/templates/org/richfaces/htmlPanelMenu.jspx
===================================================================
---
branches/community/3.3.X/ui/panelmenu/src/main/templates/org/richfaces/htmlPanelMenu.jspx 2009-09-18
00:34:01 UTC (rev 15615)
+++
branches/community/3.3.X/ui/panelmenu/src/main/templates/org/richfaces/htmlPanelMenu.jspx 2009-09-18
00:38:27 UTC (rev 15616)
@@ -41,10 +41,11 @@
<div style="width:#{component.width}; #{style}" class="rich-pmenu
#{component.styleClass}"
id="#{clientId}"
x:passThruWithExclusions="style,width,class,styleClass,id">
- <input autocomplete="off" type="hidden"
id="#{clientId}selectedItemName" name="#{clientId}selectedItemName"
value="#{component.selectedName}" />
<vcp:body>
<f:call name="renderChildren" />
</vcp:body>
+ <f:clientid var="clientId"/>
+ <input autocomplete="off" type="hidden"
id="#{clientId}selectedItemName" name="#{clientId}selectedItemName"
value="#{this:getSelectedItemInputValue(context, component)}" />
<div style="display:none">
<f:call name="insertScript"/>
</div>
Modified:
branches/community/3.3.X/ui/panelmenu/src/main/templates/org/richfaces/htmlPanelMenuGroup.jspx
===================================================================
---
branches/community/3.3.X/ui/panelmenu/src/main/templates/org/richfaces/htmlPanelMenuGroup.jspx 2009-09-18
00:34:01 UTC (rev 15615)
+++
branches/community/3.3.X/ui/panelmenu/src/main/templates/org/richfaces/htmlPanelMenuGroup.jspx 2009-09-18
00:38:27 UTC (rev 15616)
@@ -15,9 +15,15 @@
<div id="#{clientId}" style="#{this:getHideStyle(context,
component)}"
class="#{this:getDivClass(context, component)}" >
+
+ <c:object type="boolean" var="isNodeSelected"
value="#{false}" />
<jsp:scriptlet>
<![CDATA[
String isNodeOpened = isOpened(context, component) ? "opened" :
"closed";
+
+ //marks current selection in renderer helper object - method should be called
+ //even if return value is not necessary
+ isNodeSelected = queryAndMarkSelection(context, component);
]]>
</jsp:scriptlet>
<table cellspacing="0" cellpadding="0" border="0"
@@ -28,7 +34,7 @@
<tbody>
<tr id="row_#{clientId}"
- class="#{this:getSelectedClass( context, component )}" >
+ class="#{this:getSelectedClass(isNodeSelected)}" >
<td class="rich-pmenu-nowrap #{this:getIconClass( context,
component,'left')}">
<f:call name="insertSpacerImages" />
<f:call name="insertImage">
Modified:
branches/community/3.3.X/ui/panelmenu/src/main/templates/org/richfaces/htmlPanelMenuItem.jspx
===================================================================
---
branches/community/3.3.X/ui/panelmenu/src/main/templates/org/richfaces/htmlPanelMenuItem.jspx 2009-09-18
00:34:01 UTC (rev 15615)
+++
branches/community/3.3.X/ui/panelmenu/src/main/templates/org/richfaces/htmlPanelMenuItem.jspx 2009-09-18
00:38:27 UTC (rev 15616)
@@ -13,6 +13,15 @@
<f:clientid var="clientId"/>
+ <c:object type="boolean" var="isNodeSelected"
value="#{false}" />
+ <jsp:scriptlet>
+ <![CDATA[
+ //marks current selection in renderer helper object - method should be called
+ //even if return value is not necessary
+ isNodeSelected = queryAndMarkSelection(context, component);
+ ]]>
+ </jsp:scriptlet>
+
<div id="#{clientId}" style="#{this:getHideStyle(context,
component)}" >
<table cellspacing="0" cellpadding="0" border="0"
id="tablehide#{clientId}"
@@ -21,7 +30,7 @@
x:passThruWithExclusions="cellspacing,cellpadding,border,id,class,styleClass,style">
<tbody>
<tr id="row_#{clientId}"
- class="#{this:getSelectedClass( context, component )}" >
+ class="#{this:getSelectedClass(isNodeSelected)}" >
<td class="rich-pmenu-nowrap #{this:getIconClass( context,
component,'left')}">
<f:call name="insertSpacerImages" />
<f:call name="insertImage">