package er.extensions.appserver.navigation; import com.webobjects.appserver.WOActionResults; import com.webobjects.appserver.WOContext; import com.webobjects.appserver.WORequest; import com.webobjects.appserver.WOResponse; import com.webobjects.foundation.NSArray; import com.webobjects.foundation.NSKeyValueCoding; import er.extensions.components.ERXStatelessComponent; import er.extensions.foundation.ERXValueUtilities; /** * This is an updated ERXNavigationMenu component that should simplify common usage. * Used in conjunction with the ERXModernNavigationMenuItem, it creates a navigation menu structure from the entries in * the NavigationMenu.plist configuration file. This structure is a "standard" unordered list of (possibly nested) * navigation links. * * Please read "Documentation/Navigation.html" to find out how to use the navigation components. * * @author Travis Cripps */ /* Note that I've purposely not extended the old class, hoping to deprecate or replace it with this one at a later date. */ public class ERXModernNavigationMenu extends ERXStatelessComponent { /** * Do I need to update serialVersionUID? * See section 5.6 <cite>Type Changes Affecting Serialization</cite> on page 51 of the * <a href="http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf">Java Object Serialization Spec</a> */ private static final long serialVersionUID = 1L; public ERXNavigationItem aNavigationItem; protected ERXNavigationState _navigationState; protected NSKeyValueCoding _navigationContext; public int _renderLevelCount; protected boolean _menuIsSetUp=false; public ERXModernNavigationMenu(WOContext context) { super(context); } @Override public void reset() { _menuIsSetUp = false; _renderLevelCount = 0; aNavigationItem = null; _navigationState = null; _navigationContext = null; super.reset(); } public NSKeyValueCoding navigationContext() { if (_navigationContext == null) { _navigationContext = (NSKeyValueCoding)valueForBinding("navigationContext"); } return _navigationContext; } public void setUpMenu() { if (!_menuIsSetUp) { if (navigationContext() != null) { Object o = navigationContext().valueForKey("navigationState"); if(o != null) { NSArray navigationState = (o instanceof NSArray ? (NSArray)o : NSArray.componentsSeparatedByString(o.toString(), ".")); if (navigationState != null && navigationState.count() > 0) { navigationState().setState(navigationState); } else { o = navigationContext().valueForKey("additionalNavigationState"); o = (o == null ? NSArray.EmptyArray : o); NSArray additionalNavigationState = (o instanceof NSArray ? (NSArray)o : NSArray.componentsSeparatedByString(o.toString(), ".")); if (additionalNavigationState != null && additionalNavigationState.count() > 0) { navigationState().setAdditionalState(additionalNavigationState); } else if (ERXValueUtilities.booleanValue(navigationContext().valueForKey("shouldResetNavigationState"))) { navigationState().setState(NSArray.EmptyArray); } } } } _menuIsSetUp=true; } } public ERXNavigationState navigationState() { if (_navigationState == null) { _navigationState = ERXNavigationManager.manager().navigationStateForSession(session()); } return _navigationState; } public ERXNavigationItem rootNode() { return ERXNavigationManager.manager().rootNavigationItem(); } @Override public void takeValuesFromRequest(WORequest r, WOContext c) { setUpMenu(); super.takeValuesFromRequest(r,c); } @Override public void appendToResponse(WOResponse r, WOContext c) { setUpMenu(); super.appendToResponse(r,c); } @Override public WOActionResults invokeAction(WORequest r, WOContext c) { WOActionResults results=null; setUpMenu(); try { results = super.invokeAction(r,c); } catch (RuntimeException e) { // Might need to ignore rapid clicks, catch some type of IllegalArgumentException throw e; } return results; } }