/* * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * * Portions Copyright (c) 2000 Apple Computer, Inc. All Rights * Reserved. This file contains Original Code and/or Modifications of * Original Code as defined in and that are subject to the Apple Public * Source License Version 1.1 (the "License"). You may not use this file * except in compliance with the License. Please obtain a copy of the * License at http://www.apple.com/publicsource and read it before using * this file. * * The Original Code and all software distributed under the License are * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the * License for the specific language governing rights and limitations * under the License. * * @APPLE_LICENSE_HEADER_END@ */ package er.extensions.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; import er.extensions.components.ERXStatelessComponent; /** * Almost direct port of WOSortOrder from WO 5's WOExtensions * * @binding caseInsensitive is ordering case sensitive or not */ public class WOSortOrder 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 WOSortOrder(WOContext aContext) { super(aContext); } @Override public void reset() { _invalidateCaches(); } public WODisplayGroup displayGroup() { if (null == _displayGroup) _displayGroup = (WODisplayGroup)valueForBinding("displayGroup"); return _displayGroup; } public String key() { if (null == _key) _key = (String)valueForBinding("key"); return _key; } public String displayKey() { if (null == _displayKey) _displayKey = (String)valueForBinding("displayKey"); return _displayKey; } private EOSortOrdering _primarySortOrdering() { NSArray nsarray = displayGroup().sortOrderings(); if (nsarray != null && nsarray.count() > 0) { EOSortOrdering eosortordering = (EOSortOrdering)nsarray.objectAtIndex(0); return eosortordering; } return null; } private boolean _isCurrentKeyPrimary() { EOSortOrdering eosortordering = _primarySortOrdering(); return eosortordering != null && eosortordering.key().equals(key()); } private NSSelector _primaryKeySortOrderingSelector() { EOSortOrdering eosortordering = _primarySortOrdering(); NSSelector nsselector = null; if(eosortordering != null) nsselector = eosortordering.selector(); return nsselector; } public String imageName() { String s = "Unsorted.gif"; if(_isCurrentKeyPrimary()) { NSSelector nsselector = _primaryKeySortOrderingSelector(); if(nsselector.equals(EOSortOrdering.CompareAscending) || nsselector.equals(EOSortOrdering.CompareCaseInsensitiveAscending)) { s = "Ascending.gif"; } else if(nsselector.equals(EOSortOrdering.CompareDescending) || nsselector.equals(EOSortOrdering.CompareCaseInsensitiveDescending)) { s = "Descending.gif"; } } return s; } private void _removeSortOrderingWithKey(String s) { int i = 0; WODisplayGroup wodisplaygroup = displayGroup(); NSArray nsarray = wodisplaygroup.sortOrderings(); if(nsarray != null) { NSMutableArray nsmutablearray = new NSMutableArray(nsarray); //.mutableClone(); for(Enumeration enumeration = nsmutablearray.objectEnumerator(); enumeration.hasMoreElements(); i++) { EOSortOrdering eosortordering = (EOSortOrdering)enumeration.nextElement(); if(!s.equals(eosortordering.key())) continue; nsmutablearray.removeObjectAtIndex(i); break; } wodisplaygroup.setSortOrderings(nsmutablearray); } } private void _makePrimarySortOrderingWithSelector(NSSelector nsselector) { String s = key(); WODisplayGroup wodisplaygroup = displayGroup(); NSArray nsarray = wodisplaygroup.sortOrderings(); NSMutableArray nsmutablearray; if(nsarray != null) nsmutablearray = new NSMutableArray(nsarray); else nsmutablearray = new NSMutableArray(); EOSortOrdering eosortordering = EOSortOrdering.sortOrderingWithKey(s, nsselector); nsmutablearray.insertObjectAtIndex(eosortordering, 0); if(nsmutablearray.count() > 3) nsmutablearray.removeLastObject(); wodisplaygroup.setSortOrderings(nsmutablearray); } public String helpString() { return "Push to toggle sorting order according to " + displayKey(); } public WOComponent toggleClicked() { String s = key(); boolean caseInsensitive = caseInsensitive(); NSSelector asc = caseInsensitive ? EOSortOrdering.CompareCaseInsensitiveAscending : EOSortOrdering.CompareAscending; NSSelector desc = caseInsensitive ? EOSortOrdering.CompareCaseInsensitiveDescending : EOSortOrdering.CompareDescending; if(_isCurrentKeyPrimary()) { NSSelector nsselector = _primaryKeySortOrderingSelector(); if(nsselector.equals(EOSortOrdering.CompareAscending) || nsselector.equals(EOSortOrdering.CompareCaseInsensitiveAscending)) { _removeSortOrderingWithKey(s); _makePrimarySortOrderingWithSelector(desc); } else if (nsselector.equals(EOSortOrdering.CompareDescending) || nsselector.equals(EOSortOrdering.CompareCaseInsensitiveDescending)) { _removeSortOrderingWithKey(s); _makePrimarySortOrderingWithSelector(asc); } else { _removeSortOrderingWithKey(s); _makePrimarySortOrderingWithSelector(asc); } } else { _removeSortOrderingWithKey(s); _makePrimarySortOrderingWithSelector(asc); } displayGroup().updateDisplayedObjects(); return null; } public boolean caseInsensitive() { return booleanValueForBinding("caseInsensitive"); } private void _invalidateCaches() { _key = null; _displayKey = null; _displayGroup = null; } private String _key; private String _displayKey; WODisplayGroup _displayGroup; }