package org.openswing.swing.table.client;
import org.openswing.swing.table.model.client.VOListTableModel;
import org.openswing.swing.table.model.client.VOListAdapter;
import org.openswing.swing.message.receive.java.ValueObject;
import org.openswing.swing.util.java.Consts;
import java.text.Collator;
/**
* <p>Title: OpenSwing Framework</p>
* <p>Description: Class used by grid control in order to sort columns in a custom way.
* Default column sort algorithm can be changed by overriding <code>compareAttributeValues</code> method.</p>
* <p>Copyright: Copyright (C) 2006 Mauro Carniel</p>
*
* <p> This file is part of OpenSwing Framework.
* This library is free software; you can redistribute it and/or
* modify it under the terms of the (LGPL) Lesser General Public
* License as published by the Free Software Foundation;
*
* GNU LESSER GENERAL PUBLIC LICENSE
* Version 2.1, February 1999
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* The author may be contacted at:
* maurocarniel@tin.it</p>
*
* @author Mauro Carniel
* @version 1.0
*/
public class OrderPolicy {
private Collator collator = null;
/**
* Method invoked by Grid component in order to compare two rows of the same VOListModel.
* @param modelAdapter TableModel adapter, used to link ValueObjects to TableModel
* @param grids Grids grid component
* @param model grid model
* @param o1 value object related to first row
* @param o2 value object related to second row
* @return row comparison result
*/
public final int compareRow(VOListAdapter modelAdapter,Grids grids,VOListTableModel model,ValueObject o1,ValueObject o2) {
if (collator==null)
// initialize Collator instance...
collator = Collator.getInstance(grids.getDefaultLocale());
int colIndex,sign;
Object val1,val2;
String attributeName = null;
String sortVersus = null;
int retValue = 0;
for(int i=0;i<grids.getCurrentSortedColumns().size();i++) {
colIndex = modelAdapter.getFieldIndex(grids.getCurrentSortedColumns().get(i).toString());
attributeName = modelAdapter.getFieldName(colIndex);
sortVersus = grids.getCurrentSortedVersusColumns().get(i).toString();
val1 = modelAdapter.getField(o1,colIndex);
val2 = modelAdapter.getField(o2,colIndex);
sign = sortVersus.equals(Consts.ASC_SORTED)?+1:-1;
if (val1==null && val2==null)
continue;
else if (val1==null && val2!=null)
return -1*sign;
else if (val1!=null && val2==null)
return +1*sign;
else {
retValue = compareAttributeValues(attributeName,sortVersus,val1, val2,model);
if (retValue!=0)
return retValue;
}
}
return 0;
}
/**
* Callback method invoked by grid in order to sort the specified column:
* it can be overrided in order to define a custom sorting algorithm.
* The default implementation is able to compare Date, Number and String objects.
* @param attributeName attribute name that identities the column to sort
* @param sortVersus sorting order; allowed values: Consts.ASC_SORTED,Consts.DESC_SORTED,Consts.NO_SORTED
* @param val1 first value to compare
* @param val2 second value to compare
* @param model VOListModel grid model to sort
* @return cell values comparison result: -1 if val1 is less than val2, +1 if val1 is greater than val2, 0 if val1 is equals to val2
*/
public int compareAttributeValues(String attributeName,String sortVersus,Object val1, Object val2,VOListTableModel model) {
int sign = sortVersus.equals(Consts.ASC_SORTED)?+1:-1;
if (val1 instanceof java.util.Date) {
if (((java.util.Date)val1).getTime()<((java.util.Date)val2).getTime())
return -1*sign;
else if (((java.util.Date)val1).getTime()>((java.util.Date)val2).getTime())
return +1*sign;
}
else if (val1 instanceof Number) {
if (((Number)val1).doubleValue()<((Number)val2).doubleValue())
return -1*sign;
else if (((Number)val1).doubleValue()>((Number)val2).doubleValue())
return +1*sign;
}
else {
// if (val1.toString().compareTo(val2.toString())<0)
// return -1*sign;
// else if (val1.toString().compareTo(val2.toString())>0)
// return +1*sign;
if (collator.compare(val1.toString(),val2.toString())<0)
return -1*sign;
else if (collator.compare(val1.toString(),val2.toString())>0)
return +1*sign;
}
return 0;
}
/**
* Callback method invoked by grid after internally sorting columns.
* @param model VOListModel grid model just sorted
*/
public void afterSorting(VOListTableModel model) {}
}