Author: dbiatenia
Date: 2007-07-05 15:10:16 -0400 (Thu, 05 Jul 2007)
New Revision: 1506
Modified:
branches/3.0.2/sandbox/panelmenu/src/main/config/component/panelMenu.xml
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/component/UIPanelMenu.java
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/component/UIPanelMenuGroup.java
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/component/UIPanelMenuItem.java
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuGroupRenderer.java
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuItemRenderer.java
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuRenderer.java
branches/3.0.2/sandbox/panelmenu/src/main/resources/org/richfaces/renderkit/html/css/panelMenu.xcss
branches/3.0.2/sandbox/panelmenu/src/main/resources/org/richfaces/renderkit/html/scripts/panelMenu.js
branches/3.0.2/sandbox/panelmenu/src/main/templates/org/richfaces/htmlPanelMenu.jspx
Log:
Modified: branches/3.0.2/sandbox/panelmenu/src/main/config/component/panelMenu.xml
===================================================================
--- branches/3.0.2/sandbox/panelmenu/src/main/config/component/panelMenu.xml 2007-07-05
19:01:59 UTC (rev 1505)
+++ branches/3.0.2/sandbox/panelmenu/src/main/config/component/panelMenu.xml 2007-07-05
19:10:16 UTC (rev 1506)
@@ -250,7 +250,14 @@
<classname>java.lang.String</classname>
<description></description>
<defaultvalue><![CDATA["dr-pmenu-hovered-element
rich-pmenu-hovered-element"]]></defaultvalue>
- </property>
+ </property>
+ <property>
+ <name>selectedChild</name>
+ <classname>java.lang.String</classname>
+ <description>contain the name or the clientId of any of the item or group,
the child defined in this attribute should be highlighted on PanelMenu
rendering</description>
+ <defaultvalue><![CDATA[""]]></defaultvalue>
+ </property>
+
&ui_component_attributes;
&html_events;
@@ -285,8 +292,6 @@
<defaultvalue><![CDATA[""]]></defaultvalue>
</property>
-
-
<property>
<name>onitemhover</name>
<classname>java.lang.String</classname>
@@ -370,7 +375,14 @@
If “true” sets state of the item to disabled state. “false” is default.
</description>
<defaultvalue>false</defaultvalue>
- </property>
+ </property>
+ <property>
+ <name>name</name>
+ <classname>java.lang.String</classname>
+ <description>'selectedChild' attribute of PanelMenu refers to
group/item with the same name</description>
+ <defaultvalue>getId()</defaultvalue>
+ </property>
+
<!--property>
<name>value</name>
<classname>java.lang.Object</classname>
@@ -513,7 +525,13 @@
<name>value</name>
<classname>java.lang.Object</classname>
<description>Defines representation text for menuItem.</description>
- </property>
+ </property>
+ <property>
+ <name>name</name>
+ <classname>java.lang.String</classname>
+ <description>'selectedChild' attribute of PanelMenu refers to
group/item with the same name</description>
+ <defaultvalue>getId()</defaultvalue>
+ </property>
<property>
<name>hoverClass</name>
<classname>java.lang.String</classname>
Modified:
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/component/UIPanelMenu.java
===================================================================
---
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/component/UIPanelMenu.java 2007-07-05
19:01:59 UTC (rev 1505)
+++
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/component/UIPanelMenu.java 2007-07-05
19:10:16 UTC (rev 1506)
@@ -1,11 +1,14 @@
package org.richfaces.component;
-import javax.faces.component.UIComponentBase;
+import javax.faces.component.UIInput;
-public abstract class UIPanelMenu extends UIComponentBase{
+public abstract class UIPanelMenu extends UIInput{
public static final String COMPONENT_TYPE = "org.richfaces.panelMenu";
+ public static final String DEFAULT_SELECTED_CLASS = "dr-pmenu-selected-item";
+ public static final String USER_DEFINED_SELECTED_CLASS =
"rich-pmenu-item-selected";
+
public abstract String getEvent();
public abstract void setEvent(String event);
public abstract String getMode();
@@ -104,6 +107,10 @@
public abstract void setOnmouseover(String string);
public abstract String getOnmouseover();
+ public abstract void setSelectedChild(String string);
+ public abstract String getSelectedChild();
-
+ public String getSelectedName(){
+ return getValue() != null ? getValue().toString() : getSelectedChild();
+ }
}
Modified:
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/component/UIPanelMenuGroup.java
===================================================================
---
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/component/UIPanelMenuGroup.java 2007-07-05
19:01:59 UTC (rev 1505)
+++
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/component/UIPanelMenuGroup.java 2007-07-05
19:10:16 UTC (rev 1506)
@@ -79,7 +79,10 @@
public abstract boolean isExpanded();
public abstract void setExpanded(boolean expanded);
+ public abstract void setName(String string);
+ public abstract String getName();
+
public UIPanelMenuGroup(){
setConverter(new BooleanConverter());
}
Modified:
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/component/UIPanelMenuItem.java
===================================================================
---
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/component/UIPanelMenuItem.java 2007-07-05
19:01:59 UTC (rev 1505)
+++
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/component/UIPanelMenuItem.java 2007-07-05
19:10:16 UTC (rev 1506)
@@ -57,4 +57,7 @@
public abstract String getTarget();
public abstract void setTarget(String target);
+ public abstract void setName(String string);
+ public abstract String getName();
+
}
Modified:
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuGroupRenderer.java
===================================================================
---
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuGroupRenderer.java 2007-07-05
19:01:59 UTC (rev 1505)
+++
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuGroupRenderer.java 2007-07-05
19:10:16 UTC (rev 1506)
@@ -23,15 +23,16 @@
import java.io.IOException;
import java.util.Map;
+
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.convert.ConverterException;
import javax.faces.event.ActionEvent;
+
import org.ajax4jsf.framework.ajax.AjaxEvent;
import org.richfaces.component.UIPanelMenu;
import org.richfaces.component.UIPanelMenuGroup;
-import org.richfaces.component.UISwitchablePanel;
import org.richfaces.renderkit.PanelMenuRendererBase;
public class PanelMenuGroupRenderer extends PanelMenuRendererBase {
@@ -56,7 +57,7 @@
}
if(isSubmitted(context, component)){
new ActionEvent(component).queue();
- if (UISwitchablePanel.AJAX_METHOD.equals(getItemMode(component))) {
+ if ("ajax".equals(getItemMode(component))) {
new AjaxEvent(component).queue();
}
}
@@ -243,12 +244,16 @@
public String getLabelClass(FacesContext context, UIComponent component) {
UIPanelMenuGroup group = (UIPanelMenuGroup)component;
UIPanelMenu parentMenu = findMenu(group);
+ StringBuffer resClass = new StringBuffer();
if(!group.isDisabled() && !parentMenu.isDisabled()){
if(isTopLevel(component)){
- return "rich-pmenu-group-self-label rich-pmenu-top-group-self-label";
- } else return "rich-pmenu-group-self-label";
+ resClass.append("rich-pmenu-group-self-label
rich-pmenu-top-group-self-label");
+ } else resClass.append("rich-pmenu-group-self-label");
}
- return "";
+ if(isSelected(context, component)){
+ resClass.append("
").append(UIPanelMenu.DEFAULT_SELECTED_CLASS).append("
").append(UIPanelMenu.USER_DEFINED_SELECTED_CLASS);
+ }
+ return resClass.toString();
}
public String getIconClass(FacesContext context, UIComponent component) {
@@ -277,4 +282,11 @@
result = "dr-pmenu-group";
return result;
}
+
+ public boolean isSelected(FacesContext context, UIComponent component){
+ UIPanelMenuGroup group = (UIPanelMenuGroup)component;
+ UIPanelMenu parentMenu = findMenu(group);
+ return group.getName().equals(parentMenu.getSelectedName());
+ }
+
}
Modified:
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuItemRenderer.java
===================================================================
---
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuItemRenderer.java 2007-07-05
19:01:59 UTC (rev 1505)
+++
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuItemRenderer.java 2007-07-05
19:10:16 UTC (rev 1506)
@@ -43,11 +43,10 @@
}
protected void doDecode(FacesContext context, UIComponent component) {
if(isSubmitted(context, component)) {
+ UIPanelMenuItem item = (UIPanelMenuItem)component;
new ActionEvent(component).queue();
if ("ajax".equals(getItemMode(component))) {
new AjaxEvent(component).queue();
- } else {
-
}
}
}
@@ -56,12 +55,6 @@
}
- /*
- public String getOnClick(FacesContext context, UIComponent component) {
- String clientId = component.getClientId(context);
- return ";PanelMenuStorage['" + clientId +
"'].trigger(event);";
- }
- */
public void insertImage(FacesContext context, UIComponent component, Object data) throws
IOException {
String from = (String)data;
UIPanelMenu panelMenu = findMenu(component);
@@ -169,14 +162,19 @@
}
public String getLabelClass(FacesContext context, UIComponent component) {
+ StringBuffer resClass = new StringBuffer();
UIPanelMenuItem item = (UIPanelMenuItem)component;
UIPanelMenu parentMenu = findMenu(item);
if(!item.isDisabled() && !parentMenu.isDisabled()){
if(isTopLevel(component)){
- return "rich-pmenu-item-label rich-pmenu-top-item-label";
- } else return "rich-pmenu-item-label";
+ resClass.append("rich-pmenu-item-label rich-pmenu-top-item-label");
+
+ } else resClass.append("rich-pmenu-item-label");
}
- return "";
+ if(isSelected(context, component)){
+ resClass.append("
").append(UIPanelMenu.DEFAULT_SELECTED_CLASS).append("
").append(UIPanelMenu.USER_DEFINED_SELECTED_CLASS);
+ }
+ return resClass.toString();
}
public String getIconClass(FacesContext context, UIComponent component) {
@@ -189,4 +187,10 @@
}
return "";
}
+
+ public boolean isSelected(FacesContext context, UIComponent component){
+ UIPanelMenuItem item = (UIPanelMenuItem)component;
+ UIPanelMenu parentMenu = findMenu(item);
+ return item.getName().equals(parentMenu.getSelectedName());
+ }
}
Modified:
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuRenderer.java
===================================================================
---
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuRenderer.java 2007-07-05
19:01:59 UTC (rev 1505)
+++
branches/3.0.2/sandbox/panelmenu/src/main/java/org/richfaces/renderkit/html/PanelMenuRenderer.java 2007-07-05
19:10:16 UTC (rev 1506)
@@ -23,13 +23,19 @@
import java.io.IOException;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Set;
+
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
+import javax.faces.event.ActionEvent;
+
+import org.ajax4jsf.framework.ajax.AjaxEvent;
import org.ajax4jsf.framework.renderer.AjaxRendererUtils;
import org.ajax4jsf.framework.util.javascript.JSFunction;
import org.richfaces.component.UIPanelMenu;
@@ -54,15 +60,21 @@
List flatList = new LinkedList();
Map levels = new HashMap();
- boolean expandSingle = ((UIPanelMenu)component).isExpandSingle();
+ Set itemNames = new HashSet();
+ UIPanelMenu parentMenu = (UIPanelMenu)component;
+
+ boolean expandSingle = parentMenu.isExpandSingle();
+
+ String selectedChild = parentMenu.getSelectedName();
+
flatten(component.getChildren(), flatList, levels, 0);
- panelMenu
- .append("new PanelMenu('")
+ panelMenu.append("new PanelMenu('")
.append(component.getClientId(context).toString())
.append("',")
.append(new Boolean(expandSingle).toString())
+ .append(",").append("'").append(selectedChild).append("'")
.append(");\n");
for (Iterator iter = flatList.iterator(); iter.hasNext();) {
@@ -81,7 +93,7 @@
child.getAttributes().put("rendered",Boolean.FALSE);
}
- UIPanelMenu parentMenu = findMenu(child);
+ //UIPanelMenu parentMenu = findMenu(child);
String event = parentMenu.getEvent();
if ("".equals(event))
@@ -112,10 +124,21 @@
else
targetString = target.toString();
-
-
if (childRendered && parentRendered){
if ( !isParentDisabled(child) ){
+ String childName;
+ if(child instanceof UIPanelMenuGroup){
+ childName = ((UIPanelMenuGroup)child).getName();
+ } else {
+ childName = ((UIPanelMenuItem)child).getName();
+ }
+
+ if(itemNames.contains(childName)){
+ throw new RuntimeException("Attibute \"name\" with value
\"" + childName + "\" is already used in PanelMenu. It must be unique
for every group/item.");
+ } else {
+ itemNames.add(childName);
+ }
+
buffer
.append("new PanelMenuItem({myId:'")
.append((String) child.getClientId(context))
@@ -126,11 +149,11 @@
.append(",event:\"" + event + "\"")
.append(",mode:\"" + mode + "\"")
.append(",target:\"" + targetString + "\"")
- .append(",disabled:" +
- new Boolean(childDisabled).toString())
+ .append(",disabled:" + new Boolean(childDisabled).toString())
+ .append(",target:\"" + targetString + "\"")
+ .append(",name:\"" + childName + "\"")
.append("},{");
-
for (int i = 0; i < hoveredStyles.length; i++)
if (!"".equals(hoveredStyles[i])) {
String [] temp = hoveredStyles[i].split(":");
@@ -273,8 +296,6 @@
try {
isNodeOpened = r.isOpened(context, child);
} catch (IOException e) {
- // TODO Auto-generated catch block
-// e.printStackTrace();
isNodeOpened = false;
}
buffer.append(",").append(String.valueOf(isNodeOpened));
@@ -329,7 +350,6 @@
defaultItemIconSrc = getIconByType(defaultItemIcon, isTopLevel,context, component);
}
-
customItemIcon = item.isDisabled() ? item.getIconDisabled() : item.getIcon();
if(customItemIcon != null && customItemIcon.equals("none")){
customIconSource = PANEL_MENU_SPACER_ICON;
@@ -433,5 +453,16 @@
}
buffer.append("\"");
}
+
+ public void doDecode(FacesContext context, UIComponent component) {
+ Map requestMap = context.getExternalContext().getRequestParameterMap();
+ String menuClientId = component.getClientId(context);
+ UIPanelMenu menu = ((UIPanelMenu)component);
+ Object selectedItemName = requestMap.get(menuClientId + "selectedItemName");
+ if(selectedItemName != null){
+ menu.setSubmittedValue(selectedItemName);
+ }
+ }
+
}
Modified:
branches/3.0.2/sandbox/panelmenu/src/main/resources/org/richfaces/renderkit/html/css/panelMenu.xcss
===================================================================
---
branches/3.0.2/sandbox/panelmenu/src/main/resources/org/richfaces/renderkit/html/css/panelMenu.xcss 2007-07-05
19:01:59 UTC (rev 1505)
+++
branches/3.0.2/sandbox/panelmenu/src/main/resources/org/richfaces/renderkit/html/css/panelMenu.xcss 2007-07-05
19:10:16 UTC (rev 1506)
@@ -83,7 +83,9 @@
.dr-pmenu-disabled-element {
cursor: default;
}
-
+ .dr-pmenu-selected-item {
+ font-style : italic;
+ }
</f:verbatim>
</f:template>
\ No newline at end of file
Modified:
branches/3.0.2/sandbox/panelmenu/src/main/resources/org/richfaces/renderkit/html/scripts/panelMenu.js
===================================================================
---
branches/3.0.2/sandbox/panelmenu/src/main/resources/org/richfaces/renderkit/html/scripts/panelMenu.js 2007-07-05
19:01:59 UTC (rev 1505)
+++
branches/3.0.2/sandbox/panelmenu/src/main/resources/org/richfaces/renderkit/html/scripts/panelMenu.js 2007-07-05
19:10:16 UTC (rev 1506)
@@ -6,17 +6,20 @@
window.Richfaces = {};
}
-//TODO by nick - dima - better not to use global object to track panels
var PanelMenuStorage = new Object();
PanelMenu = Class.create();
PanelMenu.prototype = {
- initialize: function(myId,so){
+ initialize: function(myId, so, selectedChild){
this.childObj = new Array();
this.expandSingle = so;
this.lastExpanded = null;
- this.is = 'panelMenu';
+ this.selectedChild = selectedChild;
+ this.defaultSelectedClass = 'dr-pmenu-selected-item';
+ this.userDefinedSelectedClass = 'dr-pmenu-selected-item';
+ this.is = 'panelMenu';
+ this.selectedNameInput = $(myId + 'selectedItemName');
PanelMenuStorage[myId] = this;
}
};
@@ -31,6 +34,7 @@
this.onclose = options.onclose;
this.event = options.event;
this.disabled = options.disabled;
+ this.name = options.name;
this.mode = options.mode;
if (!this.mode)
@@ -58,6 +62,15 @@
}
parent = parent.parentObj;
}
+ // parent - root menu object
+ this.rootMenu = parent;
+
+ if(this.rootMenu.selectedChild == this.name){
+ this.selected = true;
+ } else {
+ this.selected = false;
+ }
+ this.clientId = ids.myId;
this.obj = $("tdhide" + ids.myId);
this.leftIcon = $('leftIcon' + ids.myId);
this.rightIcon = $('rightIcon' + ids.myId);
@@ -183,7 +196,8 @@
},
preTrigger: function(e){
- this.inputAction.setAttribute('value', this.obj.id);
+ //this.inputAction.setAttribute('value', this.obj.id);
+ this.inputAction.setAttribute('value', this.clientId);
},
postTrigger: function(e){
@@ -212,6 +226,11 @@
},
itemClicked: function(e){
+ this.globalClearSelection();
+ this.setSelectedClass();
+
+ this.rootMenu.selectedNameInput.value = this.name;
+
if(this.action){
if (this.action=='panelMenuNodeAction'){
if (this.expanded){
@@ -283,31 +302,55 @@
}
},
+ globalClearSelection: function(e) {
+ for(var key in PanelMenuStorage){
+ if(PanelMenuStorage.hasOwnProperty(key)){
+ if(PanelMenuStorage[key].type == 'node' || PanelMenuStorage[key].type ==
'item'){
+ PanelMenuStorage[key].removeSelectedClass();
+ }
+ }
+ }
+ },
+
+
+
+ setSelectedClass: function(e){
+ this.labelArea.addClassName(this.rootMenu.defaultSelectedClass);
+ this.labelArea.addClassName(this.rootMenu.userDefinedSelectedClass);
+ },
+ removeSelectedClass: function(e){
+ this.labelArea.removeClassName(this.rootMenu.defaultSelectedClass);
+ this.labelArea.removeClassName(this.rootMenu.userDefinedSelectedClass);
+ },
+
+
addHoverStyles: function(e) {
- if(!this.hasInitialSylesChecked){
- this.initialStyles = this.tablehider.style.cssText;
- this.hasInitialSylesChecked = true;
- }
- if (this.hoveredStyles) {
- Element.setStyle(this.tablehider, this.hoveredStyles);
- }
- if (this.hoveredClasses)
- for (i = 0; i < this.hoveredClasses.length; i++) {
- this.tablehider.addClassName(this.hoveredClasses[i]);
+ if(!this.selected){
+ if(!this.hasInitialSylesChecked){
+ this.initialStyles = this.tablehider.style.cssText;
+ this.hasInitialSylesChecked = true;
}
-
+ if (this.hoveredStyles) {
+ Element.setStyle(this.tablehider, this.hoveredStyles);
+ }
+ if (this.hoveredClasses)
+ for (i = 0; i < this.hoveredClasses.length; i++) {
+ this.tablehider.addClassName(this.hoveredClasses[i]);
+ }
+ }
},
removeHoverStyles: function(e) {
- if (this.hoveredStyles && this.hasInitialSylesChecked) {
- this.tablehider.style.cssText = this.initialStyles;
- }
-
- if (this.hoveredClasses)
- for (var i = 0; i < this.hoveredClasses.length; i++){
- this.tablehider.removeClassName(this.hoveredClasses[i]);
+ if(!this.selected){
+ if (this.hoveredStyles && this.hasInitialSylesChecked) {
+ this.tablehider.style.cssText = this.initialStyles;
}
-
+
+ if (this.hoveredClasses)
+ for (var i = 0; i < this.hoveredClasses.length; i++){
+ this.tablehider.removeClassName(this.hoveredClasses[i]);
+ }
+ }
},
_getDirectChildrenByTag: function(e, tagName) {
Modified:
branches/3.0.2/sandbox/panelmenu/src/main/templates/org/richfaces/htmlPanelMenu.jspx
===================================================================
---
branches/3.0.2/sandbox/panelmenu/src/main/templates/org/richfaces/htmlPanelMenu.jspx 2007-07-05
19:01:59 UTC (rev 1505)
+++
branches/3.0.2/sandbox/panelmenu/src/main/templates/org/richfaces/htmlPanelMenu.jspx 2007-07-05
19:10:16 UTC (rev 1506)
@@ -31,7 +31,7 @@
onmousemove="#{component.onmousemove}"
onmouseout="#{component.onmouseout}"
onmouseover="#{component.onmouseover}" >
-
+ <input type="hidden" id="#{clientId}selectedItemName"
name="#{clientId}selectedItemName" value="" />
<vcp:body>
<f:call name="renderChildren" />
</vcp:body>