/* * Copyright 2005-2010 Ignis Software Tools Ltd. All rights reserved. */ package jsystem.treeui.params; import java.util.ArrayList; import java.util.Comparator; import java.util.TreeMap; import jsystem.framework.scenario.Parameter; import jsystem.framework.scenario.PresentationDefinitions; /** * a sorting parameters class. sorts both sections and headers holds a sub class * "ParametersCompare" which compares the Parameters for sorting. * * @author Nizan Freedman * */ public class ParametersSorter { private Parameter[] parameters; public ParametersSorter(Parameter[] parameters) { this.parameters = parameters; } public Parameter[] getParameters(){ return parameters; } /** * sorts the initialized parameters according to given sorting parameters * * @param sortSection * section sorting preferance * @param sortHeader * header sorting * @param ascending * Ascending/Descending * @param order * A user defined String Order * @return the new parameters sorted */ public Parameter[] sortParameters(int sortSection, int sortHeader, PresentationDefinitions.ParametersOrder parametersOrder, String order) { ParameterCompare.order = parametersOrder; TreeMap<ParameterCompare, Parameter> map = new TreeMap<ParameterCompare, Parameter>(new ParameterCompare()); // build TreeMap String name; String sectionName; String headerName; int sectionNumber; double headerNumber; ParameterCompare pc; for (int i = 0; i < parameters.length; i++) { sectionName = ""; headerName = ""; sectionNumber = 0; // making sure strings that are not numbers will be displayed after // numbers headerNumber = Double.MAX_VALUE; if (sortSection == ParametersPanel.SORT_BY_SECTION_STRING) { sectionNumber = order.toLowerCase().indexOf(parameters[i].getSection().toLowerCase()); if (sectionNumber == -1){ sectionNumber = order.length(); } sectionName = parameters[i].getSection(); } else if (sortSection == ParametersPanel.SORT_BY_SECTION_AB) { sectionName = parameters[i].getSection(); } if (sortHeader == ParametersPanel.SORT_BY_HEADER_NAME) { headerName = parameters[i].getName(); } else if (sortHeader == ParametersPanel.SORT_BY_HEADER_DESCRIPTION) { headerName = parameters[i].getDescription(); } else if (sortHeader == ParametersPanel.SORT_BY_HEADER_TYPE) { headerName = parameters[i].getParamTypeString(); } else if (sortHeader == ParametersPanel.SORT_BY_HEADER_VALUE) { Object o = parameters[i].getValue(); if (o != null) { headerName = o.toString(); try { headerNumber = Double.parseDouble(headerName); headerName = ""; } catch (NumberFormatException e) { // no exception here needed to be handled here - just // testing if has a double value } } } // for distinguishing double entries of same value/description/type name = headerName + parameters[i].getName(); int indexOf = indexOf(parameters,parameters[i]); pc = new ParameterCompare(sectionNumber, headerNumber, sectionName, name,indexOf); map.put(pc, parameters[i]); } ArrayList<Parameter> params = new ArrayList<Parameter>(); // sort ascending/descending while (!map.isEmpty()) { pc = map.firstKey(); params.add(map.get(pc)); map.remove(pc); } Parameter[] tmpParam = params.toArray(new Parameter[0]); return tmpParam; } private static int indexOf(Parameter[] params,Object o){ for (int i=0;i<params.length;i++){ if (o==params[i]){ return i; } } return -1; } } /** * a class for sorting parameters according to section name/header * * @author Nizan Freedman * */ class ParameterCompare implements Comparator<Object> { int sectionNum; double headerNum; String sectionName; String name; int index; static PresentationDefinitions.ParametersOrder order; public ParameterCompare() { } public ParameterCompare(int sectionNum, double headerNum, String sectionName, String name,int index) { this.sectionNum = sectionNum; this.sectionName = sectionName.toLowerCase(); this.headerNum = headerNum; this.name = name.toLowerCase(); this.index = index; } /** * first sort by section number , then by section name and last by header * num */ public int compare(Object o1, Object o2) { ParameterCompare p1 = (ParameterCompare) o1; ParameterCompare p2 = (ParameterCompare) o2; if (p1.sectionNum != p2.sectionNum){ return ((Integer) p1.sectionNum).compareTo((Integer) p2.sectionNum); } if (!p1.sectionName.equals(p2.sectionName)){ // different section // if (p1.sectionName.toLowerCase().equals("general")){ // return -1; // }else if(p2.sectionName.toLowerCase().equals("general")){ // return 1; // } return p1.sectionName.compareTo(p2.sectionName); } if (order == PresentationDefinitions.ParametersOrder.defaultOrder) { if (p1.headerNum == p2.headerNum){ return p1.index-p2.index; } return ((Double) p1.headerNum).compareTo((Double) p2.headerNum); } if (order == PresentationDefinitions.ParametersOrder.ascending) { if (p1.headerNum == p2.headerNum) return p1.name.compareTo(p2.name); return ((Double) p1.headerNum).compareTo((Double) p2.headerNum); } else { if (p1.headerNum == p2.headerNum) return p2.name.compareTo(p1.name); return ((Double) p2.headerNum).compareTo((Double) p1.headerNum); } } }