001: /* ====================================================================
002: * The QueryForm License, Version 1.1
003: *
004: * Copyright (c) 1998 - 2003 David F. Glasser. All rights
005: * reserved.
006: *
007: * Redistribution and use in source and binary forms, with or without
008: * modification, are permitted provided that the following conditions
009: * are met:
010: *
011: * 1. Redistributions of source code must retain the above copyright
012: * notice, this list of conditions and the following disclaimer.
013: *
014: * 2. Redistributions in binary form must reproduce the above copyright
015: * notice, this list of conditions and the following disclaimer in
016: * the documentation and/or other materials provided with the
017: * distribution.
018: *
019: * 3. The end-user documentation included with the redistribution,
020: * if any, must include the following acknowledgment:
021: * "This product includes software developed by
022: * David F. Glasser."
023: * Alternately, this acknowledgment may appear in the software itself,
024: * if and wherever such third-party acknowledgments normally appear.
025: *
026: * 4. The names "QueryForm" and "David F. Glasser" must
027: * not be used to endorse or promote products derived from this
028: * software without prior written permission. For written
029: * permission, please contact dglasser@pobox.com.
030: *
031: * 5. Products derived from this software may not be called "QueryForm",
032: * nor may "QueryForm" appear in their name, without prior written
033: * permission of David F. Glasser.
034: *
035: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
036: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
037: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
038: * DISCLAIMED. IN NO EVENT SHALL DAVID F. GLASSER, THE APACHE SOFTWARE
039: * FOUNDATION OR ITS CONTRIBUTORS, OR ANY AUTHORS OR DISTRIBUTORS
040: * OF THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
041: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
042: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
043: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
044: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
045: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
046: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
047: * SUCH DAMAGE.
048: * ====================================================================
049: *
050: * This product includes software developed by the
051: * Apache Software Foundation (http://www.apache.org/).
052: *
053: * ====================================================================
054: *
055: * $Source: /cvsroot/qform/qform/src/org/glasser/swing/table/ColumnManagerComparator.java,v $
056: * $Revision: 1.2 $
057: * $Author: dglasser $
058: * $Date: 2003/07/16 02:32:47 $
059: *
060: * --------------------------------------------------------------------
061: */
062: package org.glasser.swing.table;
063:
064: import org.glasser.util.comparators.BaseComparator;
065: import java.util.Comparator;
066:
067: /**
068: * This comparator is used by a ListTableModel to sort its rows on a particular
069: * column. It uses the ColumnManager that has been set for the ListTableModel
070: * to extract the column values for each of two given rows, and then compares those
071: * values to establish an ordering for the rows.<p>
072: *
073: * <strong>Objects of this class are not thread-safe, however, as used by the ListTableModel
074: * in a single-threaded GUI, it should not be a problem.</strong>
075: *
076: * @author Dave Glasser
077: */
078: public class ColumnManagerComparator extends BaseComparator {
079:
080: /**
081: * This is the column manager used to extract column values from row objects.
082: */
083: protected ColumnManager columnManager = null;
084:
085: protected int sortColumn = -1;
086:
087: protected Comparator[] columnComparators = null;
088:
089: public ColumnManagerComparator(ColumnManager columnManager) {
090: this .columnManager = columnManager;
091: }
092:
093: /**
094: * This is the column index on which two row objects will be compared.
095: */
096: public void setSortColumn(int sortColumn) {
097: this .sortColumn = sortColumn;
098: }
099:
100: /**
101: * Returns the column index which is used to compare two row objects.
102: */
103: public int getSortColumn() {
104: return sortColumn;
105: }
106:
107: public void setColumnComparator(int columnIndex,
108: Comparator comparator) {
109: if (columnComparators == null) {
110: columnComparators = new Comparator[columnIndex + 20]; // leave some room for growth
111: } else if (columnComparators.length <= columnIndex) {
112: Comparator[] temp = new Comparator[columnIndex + 20];
113: System.arraycopy(columnComparators, 0, temp, 0,
114: columnComparators.length);
115: }
116:
117: columnComparators[columnIndex] = comparator;
118: }
119:
120: /**
121: * The two objects passed to this method are rows in a ListTableModel. The ColumnManager
122: * is used to get the correct column value from each row object, and compares the two
123: * column values to establish an ordering for the two rows.
124: */
125: protected int doCompare(Object o1, Object o2) {
126: Object val1 = columnManager.getValueAt(0, sortColumn, o1);
127: Object val2 = columnManager.getValueAt(0, sortColumn, o2);
128:
129: if (val1 == null && val2 == null)
130: return 0;
131:
132: int retVal = compareForNulls(val1, val2);
133:
134: if (retVal != 0)
135: return retVal;
136:
137: if (columnComparators != null
138: && columnComparators[sortColumn] != null) {
139: return columnComparators[sortColumn].compare(val1, val2);
140: }
141:
142: if (val1 instanceof Comparable && val2 instanceof Comparable) {
143: return ((Comparable) val1).compareTo((Comparable) val2);
144: }
145:
146: return val1.toString().compareTo(val2.toString());
147:
148: }
149:
150: /**
151: * Sets the value of the nullIsGreater field, which determines whether
152: * null objects are considered "greater than" or "less than" non-null objects
153: * for sorting purposes. The default is false.
154: */
155: protected void setNullIsGreater(boolean nullIsGreater) {
156: super .setNullIsGreater(nullIsGreater);
157: }
158:
159: /**
160: * Sets the value of the sortDescending field. If true, the sign of the
161: * value of the compare() method is "flipped" before it's returned to
162: * the caller, which will cause collections of objects to be sorted
163: * in reverse order.
164: */
165: protected void setSortDescending(boolean sortDescending) {
166: super.setSortDescending(sortDescending);
167: }
168:
169: }
|