/* * WXSortOrder.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 WXSortOrder 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 WODisplayGroup _displayGroup; protected String _key; protected String _displayKey; public WXSortOrder(WOContext aContext) { super(aContext); } ///////////// // No-Sync //////////// @Override public boolean synchronizesVariablesWithBindings() { return false; } ///////////// // 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 /////////// public String imageName() { if (_isCurrentKeyPrimary()) { NSSelector aCurrentState = _primaryKeyOrderingSelector(); if (aCurrentState==EOSortOrdering.CompareCaseInsensitiveAscending) { return "Ascending.gif"; } if (aCurrentState==EOSortOrdering.CompareCaseInsensitiveDescending) { return "Descending.gif"; } } return "Unsorted.gif"; } public boolean _isCurrentKeyPrimary() { EOSortOrdering anOrdering = _primaryOrdering(); if (anOrdering.key().equals(key())) { return true; } return false; } public NSSelector _primaryKeyOrderingSelector() { EOSortOrdering anOrdering = _primaryOrdering(); return anOrdering.selector(); } public EOSortOrdering _primaryOrdering() { NSArray anArray = _sortOrderingArray(); if (anArray.count() > 0) { EOSortOrdering anOrdering = (EOSortOrdering)anArray.objectAtIndex(0); return anOrdering; } return null; } @SuppressWarnings("unchecked") protected NSArray<EOSortOrdering> _sortOrderingArray() { return (NSArray<EOSortOrdering>)_WOJExtensionsUtil.valueForBindingOrNull("sortOrderings",this); } @SuppressWarnings("unchecked") protected NSMutableArray<EOSortOrdering> XX_sortOrderingArray() { WODisplayGroup displayGroup = displayGroup(); NSArray<EOSortOrdering> orderingArray; if (null!=displayGroup) orderingArray = displayGroup.sortOrderings(); else orderingArray = (NSArray<EOSortOrdering>)_WOJExtensionsUtil.valueForBindingOrNull("sortOrderings",this); if (null==orderingArray) { orderingArray = new NSMutableArray<>(); } else { orderingArray = new NSMutableArray<>(orderingArray); } if (null!=displayGroup) displayGroup.setSortOrderings(orderingArray); else { setValueForBinding(orderingArray, "sortOrderings"); } return (NSMutableArray<EOSortOrdering>)orderingArray; } protected void _removeOrderingWithKey(String aKey) { int anIndex = 0; EOSortOrdering ordering; NSArray orderingArray = _sortOrderingArray(); Enumeration anEnumerator = orderingArray.objectEnumerator(); while (anEnumerator.hasMoreElements()) { ordering = (EOSortOrdering) anEnumerator.nextElement(); if (aKey.equals(ordering.key())) { ((NSMutableArray)orderingArray).removeObjectAtIndex(anIndex); return ; } anIndex++; } } protected void _makePrimaryOrderingWithSelector(NSSelector aSelector) { NSMutableArray<EOSortOrdering> orderingArray = (NSMutableArray<EOSortOrdering>)_sortOrderingArray(); EOSortOrdering aNewOrdering = EOSortOrdering.sortOrderingWithKey(key(), aSelector); orderingArray.insertObjectAtIndex(aNewOrdering, 0); if (orderingArray.count() > 3) { // ** limits ing to 3 levels orderingArray.removeLastObject(); } } public String helpString() { return "Push to toggle sorting order according to "+displayKey(); } ///////////// // Actions ///////////// public WOComponent toggleClicked() { if (_isCurrentKeyPrimary()) { NSSelector aCurrentState = _primaryKeyOrderingSelector(); if (aCurrentState==EOSortOrdering.CompareCaseInsensitiveAscending) { _removeOrderingWithKey(key()); _makePrimaryOrderingWithSelector( EOSortOrdering.CompareCaseInsensitiveDescending); } else if (aCurrentState==EOSortOrdering.CompareCaseInsensitiveDescending) { _removeOrderingWithKey(key()); } } else { _removeOrderingWithKey(key()); _makePrimaryOrderingWithSelector(EOSortOrdering.CompareCaseInsensitiveAscending); } displayGroup().updateDisplayedObjects(); return null; } }