/* * WOSortOrder.java * (c) Copyright 2001 Apple Computer, Inc. All rights reserved. * This a modified version. * Original license: http://www.opensource.apple.com/apsl/ */ package com.webobjects.woextensions; import java.util.Enumeration; import com.webobjects.appserver.WOComponent; import com.webobjects.appserver.WOContext; import com.webobjects.appserver.WODisplayGroup; import com.webobjects.eocontrol.EOSortOrdering; import com.webobjects.foundation.NSArray; import com.webobjects.foundation.NSMutableArray; import com.webobjects.foundation.NSSelector; public class WOSortOrder extends WOComponent { /** * 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; protected String _key; protected String _displayKey; // ** Internal Caching protected WODisplayGroup _displayGroup; public WOSortOrder(WOContext aContext) { super(aContext); } @Override public boolean isStateless() { return true; } @Override public void reset() { _invalidateCaches(); } ///////////// // Bindings //////////// public WODisplayGroup displayGroup() { if (null==_displayGroup) { _displayGroup = (WODisplayGroup)_WOJExtensionsUtil.valueForBindingOrNull("displayGroup",this); } return _displayGroup; } public String key() { if (null==_key) { _key = (String)_WOJExtensionsUtil.valueForBindingOrNull("key",this); } return _key; } public String displayKey() { if (null==_displayKey) { _displayKey = (String)_WOJExtensionsUtil.valueForBindingOrNull("displayKey",this); } return _displayKey; } /////////// // Utility /////////// protected EOSortOrdering _primarySortOrdering() { NSArray anArray = displayGroup().sortOrderings(); if ((anArray!=null) && (anArray.count() > 0)) { EOSortOrdering anOrdering = (EOSortOrdering)anArray.objectAtIndex(0); return anOrdering; } return null; } protected boolean _isCurrentKeyPrimary() { EOSortOrdering anOrdering = _primarySortOrdering(); if ((anOrdering!=null) && anOrdering.key().equals(key())) { return true; } return false; } protected NSSelector _primaryKeySortOrderingSelector() { EOSortOrdering anOrdering = _primarySortOrdering(); NSSelector anOrderingSelector = null; if (anOrdering!=null) anOrderingSelector = anOrdering.selector(); return anOrderingSelector; } public String imageName() { String anImageName = "Unsorted.gif"; if (_isCurrentKeyPrimary()) { NSSelector aCurrentState = _primaryKeySortOrderingSelector(); if (aCurrentState == EOSortOrdering.CompareAscending) { anImageName = "Ascending.gif"; } else if (aCurrentState == EOSortOrdering.CompareDescending) { anImageName = "Descending.gif"; } } return anImageName; } protected void _removeSortOrderingWithKey(String aKey) { int anIndex = 0; EOSortOrdering aSortOrdering = null; WODisplayGroup aDisplayGroup = displayGroup(); NSArray<EOSortOrdering> sortOrderings = aDisplayGroup.sortOrderings(); if (sortOrderings!=null) { NSMutableArray<EOSortOrdering> aSortOrderingArray = sortOrderings.mutableClone(); Enumeration anEnumerator = aSortOrderingArray.objectEnumerator(); while (anEnumerator.hasMoreElements()) { aSortOrdering = (EOSortOrdering) anEnumerator.nextElement(); if (aKey.equals(aSortOrdering.key())) { aSortOrderingArray.removeObjectAtIndex(anIndex); break; } anIndex++; } aDisplayGroup.setSortOrderings(aSortOrderingArray); } } protected void _makePrimarySortOrderingWithSelector(NSSelector aSelector) { String aKey = key(); WODisplayGroup aDisplayGroup = displayGroup(); NSArray<EOSortOrdering> sortOrderings = aDisplayGroup.sortOrderings(); NSMutableArray<EOSortOrdering> aSortOrderingArray; if (sortOrderings!=null) { aSortOrderingArray = new NSMutableArray<>(sortOrderings); } else { aSortOrderingArray = new NSMutableArray<>(); } EOSortOrdering aNewSortOrdering = EOSortOrdering.sortOrderingWithKey(aKey, aSelector); aSortOrderingArray.insertObjectAtIndex(aNewSortOrdering, 0); if (aSortOrderingArray.count() > 3) { // ** limits sorting to 3 levels aSortOrderingArray.removeLastObject(); } aDisplayGroup.setSortOrderings(aSortOrderingArray); } public String helpString() { return "Push to toggle sorting order according to "+displayKey(); } ///////////// // Actions ///////////// public WOComponent toggleClicked() { String aKey = key(); if (_isCurrentKeyPrimary()) { NSSelector aCurrentState = _primaryKeySortOrderingSelector(); if (aCurrentState == EOSortOrdering.CompareAscending) { // from ascending to descending _removeSortOrderingWithKey(aKey); _makePrimarySortOrderingWithSelector(EOSortOrdering.CompareDescending); } else if (aCurrentState == EOSortOrdering.CompareDescending) { // from descending to none _removeSortOrderingWithKey(aKey); } else { // from none to ascending _removeSortOrderingWithKey(aKey); _makePrimarySortOrderingWithSelector(EOSortOrdering.CompareAscending); } } else { _removeSortOrderingWithKey(aKey); _makePrimarySortOrderingWithSelector(EOSortOrdering.CompareAscending); } displayGroup().updateDisplayedObjects(); return null; } protected void _invalidateCaches() { // ** By setting these to nil, we allow for cycling of the page) _key = null; _displayKey = null; _displayGroup = null; } }