/* * SmartGWT (GWT for SmartClient) * Copyright 2008 and beyond, Isomorphic Software, Inc. * * SmartGWT is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3 * as published by the Free Software Foundation. SmartGWT is also * available under typical commercial license terms - see * http://smartclient.com/license * * This software 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 * Lesser General Public License for more details. */ package com.smartgwt.client.data; import java.util.Comparator; import java.util.Date; import java.util.List; import java.util.Map; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.event.shared.HandlerRegistration; import com.smartgwt.client.core.BaseClass; import com.smartgwt.client.util.JSOHelper; /** * An an ordered collection of Records. <P> This class is expected by list-oriented display * components such as the ListGrid. */ public class RecordList extends BaseClass implements com.smartgwt.client.data.events.HasDataChangedHandlers { public static boolean isARecordList(Object obj) { return obj instanceof RecordList; } protected JavaScriptObject jsObj; public static RecordList getOrCreateRef(JavaScriptObject jsObj) { if(jsObj == null) return null; return new RecordList(jsObj); } /** * Construct a RecordList with no initial data. Use the various add* methods to add Records to this list. */ public RecordList(){ super(); } /** * Construct a RecordList with initial data. * * @param data initial Record data */ public RecordList(Record[] data) { addList(data); } public RecordList(List<? extends Record> data) { this(data == null ? null : data.toArray(new Record[data.size()])); } public RecordList(JavaScriptObject jsObj){ super(jsObj); this.jsObj = jsObj; } @Override protected JavaScriptObject create() { jsObj = JSOHelper.createJavaScriptArray(); return jsObj; } @Override public JavaScriptObject getJsObj() { return jsObj; } @Override public boolean isCreated() { return jsObj != null; } @Override public JavaScriptObject getOrCreateJsObj() { if (!isCreated()) { this.jsObj = createJsObj(); doInit(); } return getJsObj(); } // ********************* Methods *********************** /** * Return the item at a particular position * @param pos position of the element to get * * @return whatever's at that position, null if not found */ public native Record get(int pos) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordJS = self.get(pos); return recordJS == null ? null : @com.smartgwt.client.data.Record::getOrCreateRef(Lcom/google/gwt/core/client/JavaScriptObject;)(recordJS); }-*/; /** * Return the number of items in this list * * @return number of items in the list */ public native int getLength() /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.getLength(); }-*/; /** * Return whether or not this array is empty * * @return true == this array is empty, false == some items in the array */ public native Boolean isEmpty() /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var retVal =self.isEmpty(); if(retVal == null || retVal === undefined) { return null; } else { return @com.smartgwt.client.util.JSOHelper::toBoolean(Z)(retVal); } }-*/; /** * Return the first item in this list * * @return first item in the list */ public native Record first() /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordJS = self.first(); return recordJS == null || recordJS === undefined ? null : @com.smartgwt.client.data.Record::getOrCreateRef(Lcom/google/gwt/core/client/JavaScriptObject;)(recordJS); }-*/; /** * Return the last item in this list * * @return last item in the list */ public native Record last() /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordJS = self.last(); return recordJS == null || recordJS === undefined ? null : @com.smartgwt.client.data.Record::getOrCreateRef(Lcom/google/gwt/core/client/JavaScriptObject;)(recordJS); }-*/; /** * Return the position in the list of the first instance of the specified object. <p> If pos is specified, starts looking * after that position. <p> Returns -1 if not found. * @param record object to look for * * @return position of the item, if found, -1 if not found */ public native int indexOf(Record record) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.indexOf(record.@com.smartgwt.client.data.Record::getJsObj()()); }-*/; /** * Return the position in the list of the first instance of the specified object. <p> If pos is specified, starts looking * after that position. <p> Returns -1 if not found. * @param record object to look for * @param pos earliest index to consider * @param endPos last index to consider * * @return position of the item, if found, -1 if not found */ public native int indexOf(Record record, int pos, int endPos) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.indexOf(record.@com.smartgwt.client.data.Record::getJsObj()(), pos, endPos); }-*/; /** * Return the position in the list of the last instance of the specified object. <p> If pos is specified, starts looking * before that position. <p> Returns -1 if not found. * @param record object to look for * * @return position of the item, if found, -1 if not found */ public native int lastIndexOf(Record record) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.lastIndexOf(record.@com.smartgwt.client.data.Record::getJsObj()()); }-*/; /** * Return the position in the list of the last instance of the specified object. <p> If pos is specified, starts looking * before that position. <p> Returns -1 if not found. * @param record object to look for * @param pos last index to consider * @param endPos earliest index to consider * * @return position of the item, if found, -1 if not found */ public native int lastIndexOf(Record record, int pos, int endPos) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.lastIndexOf(record.@com.smartgwt.client.data.Record::getJsObj()(), pos, endPos); }-*/; /** * Find the index of the first Record where property == value in the object. <P> Note: for string values, matches are case sensitive. * @param properties set of properties and values to match * * @return index of the first matching Record or -1 if not found */ public native int findIndex(Map properties) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.findIndex(@com.smartgwt.client.util.JSOHelper::convertMapToJavascriptObject(Ljava/util/Map;)(properties)); }-*/; /** * Find the index of the first Record where property == value in the object. <P> Note: for string values, matches are case sensitive. * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * * @return index of the first matching Record or -1 if not found */ public native int findIndex(String propertyName, String value) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.findIndex(propertyName, value); }-*/; /** * Find the index of the first Record where property == value in the object. * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * * @return index of the first matching Record or -1 if not found */ public native int findIndex(String propertyName, int value) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.findIndex(propertyName, value); }-*/; /** * Find the index of the first Record where property == value in the object. * <P> Note: JavaScript has no long type, so the long value becomes a JavaScript Number, which has a lesser range than Java long. * The range for integer numbers in Javascript is [-9007199254740992,9007199254740992] or [-Math.pow(2,53),Math.pow(2,53)]. * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * * @return index of the first matching Record or -1 if not found */ public native int findIndex(String propertyName, Long value) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.findIndex(propertyName, value); }-*/; /** * Find the index of the first Record where property == value in the object. * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * * @return index of the first matching Record or -1 if not found */ public native int findIndex(String propertyName, float value) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.findIndex(propertyName, value); }-*/; /** * Find the index of the first Record where property == value in the object. * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * * @return index of the first matching Record or -1 if not found */ public native int findIndex(String propertyName, boolean value) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.findIndex(propertyName, value); }-*/; /** * Find the index of the first Record where property == value in the object. * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * * @return index of the first matching Record or -1 if not found */ public native int findIndex(String propertyName, Date value) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.findIndex(propertyName, @com.smartgwt.client.util.JSOHelper::convertToJavaScriptDate(Ljava/util/Date;)(value)); }-*/; /** * Like {@link RecordList#findIndex}, but inspects a range from startIndex to endIndex. * @param startIndex first index to consider * @param propertyName property to match * * @return index of the first matching Record or -1 if not found */ public native int findNextIndex(int startIndex, String propertyName) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.findNextIndex(startIndex, propertyName); }-*/; /** * Like {@link RecordList#findIndex}, but inspects a range from startIndex to endIndex. * @param startIndex first index to consider * @param properties set of properties and values to match * * @return index of the first matching Record or -1 if not found */ public native int findNextIndex(int startIndex, Map properties) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.findNextIndex(startIndex, @com.smartgwt.client.util.JSOHelper::convertMapToJavascriptObject(Ljava/util/Map;)(properties)); }-*/; /** * Like {@link RecordList#findIndex}, but inspects a range from startIndex to endIndex. * @param startIndex first index to consider * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * @param endIndex last index to consider * * @return index of the first matching Record or -1 if not found */ public native int findNextIndex(int startIndex, String propertyName, String value, int endIndex) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.findNextIndex(startIndex, propertyName, value, endIndex); }-*/; /** * Like {@link RecordList#findIndex}, but inspects a range from startIndex to endIndex. * @param startIndex first index to consider * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * @param endIndex last index to consider * * @return index of the first matching Record or -1 if not found */ public native int findNextIndex(int startIndex, String propertyName, int value, int endIndex) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.findNextIndex(startIndex, propertyName, value, endIndex); }-*/; /** * Like {@link RecordList#findIndex}, but inspects a range from startIndex to endIndex. * <P> Note: JavaScript has no long type, so the long value becomes a JavaScript Number, which has a lesser range than Java long. * The range for integer numbers in Javascript is [-9007199254740992,9007199254740992] or [-Math.pow(2,53),Math.pow(2,53)]. * @param startIndex first index to consider * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * @param endIndex last index to consider * * @return index of the first matching Record or -1 if not found */ public native int findNextIndex(int startIndex, String propertyName, Long value, int endIndex) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.findNextIndex(startIndex, propertyName, value, endIndex); }-*/; /** * Like {@link RecordList#findIndex}, but inspects a range from startIndex to endIndex. * @param startIndex first index to consider * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * @param endIndex last index to consider * * @return index of the first matching Record or -1 if not found */ public native int findNextIndex(int startIndex, String propertyName, float value, int endIndex) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.findNextIndex(startIndex, propertyName, value, endIndex); }-*/; /** * Like {@link RecordList#findIndex}, but inspects a range from startIndex to endIndex. * @param startIndex first index to consider * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * @param endIndex last index to consider * * @return index of the first matching Record or -1 if not found */ public native int findNextIndex(int startIndex, String propertyName, boolean value, int endIndex) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.findNextIndex(startIndex, propertyName, value, endIndex); }-*/; /** * Like {@link RecordList#findIndex}, but inspects a range from startIndex to endIndex. * @param startIndex first index to consider * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * @param endIndex last index to consider * * @return index of the first matching Record or -1 if not found */ public native int findNextIndex(int startIndex, String propertyName, Date value, int endIndex) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.findNextIndex(startIndex, propertyName, @com.smartgwt.client.util.JSOHelper::convertToJavaScriptDate(Ljava/util/Date;)(value), endIndex); }-*/; /** * Like {@link RecordList#findIndex}, but returns the object itself instead of its index. * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * * @return first matching object or null if not found */ public native Record find(String propertyName, Object value) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordJS = self.find(propertyName, value); return recordJS == null || recordJS === undefined ? null : @com.smartgwt.client.data.Record::getOrCreateRef(Lcom/google/gwt/core/client/JavaScriptObject;)(recordJS); }-*/; /** * Like {@link RecordList#findIndex}, but returns the object itself instead of its index. * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * * @return first matching object or null if not found */ public Record find(String propertyName, Date value) { return find(propertyName, (Object) JSOHelper.convertToJavaScriptDate(value)); } /** * Like {@link RecordList#findIndex}, but returns the object itself instead of its index. * <P> Note: JavaScript has no long type, so the long value becomes a JavaScript Number, which has a lesser range than Java long. * The range for integer numbers in Javascript is [-9007199254740992,9007199254740992] or [-Math.pow(2,53),Math.pow(2,53)]. * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * * @return first matching object or null if not found */ public native Record find(String propertyName, Long value) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordJS = self.find(propertyName, value); return recordJS == null || recordJS === undefined ? null : @com.smartgwt.client.data.Record::getOrCreateRef(Lcom/google/gwt/core/client/JavaScriptObject;)(recordJS); }-*/; /** * Like {@link RecordList#findIndex}, but returns the object itself instead of its index. * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * * @return first matching object or null if not found */ public Record find(String propertyName, Boolean value) { if (value == null) return null; return this._find(propertyName, value.booleanValue()); } private native Record _find(String propertyName, boolean value) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordJS = self.find(propertyName, value); return recordJS == null || recordJS === undefined ? null : @com.smartgwt.client.data.Record::getOrCreateRef(Lcom/google/gwt/core/client/JavaScriptObject;)(recordJS); }-*/; /** * Find all objects where property == value in the object * @param properties set of properties and values to * match * * @return all matching Objects or null if none found */ public native Record[] findAll(Map properties) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordsJS = self.findAll(@com.smartgwt.client.util.JSOHelper::convertMapToJavascriptObject(Ljava/util/Map;)(properties)); return recordsJS == null || recordsJS === undefined ? null : @com.smartgwt.client.data.Record::convertToRecordArray(Lcom/google/gwt/core/client/JavaScriptObject;)(recordsJS); }-*/; /** * Find all objects where property == value in the object. * * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * * @return all matching Objects or null if none found */ public native Record[] findAll(String propertyName, String value) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordsJS = self.findAll(propertyName, value); return recordsJS == null || recordsJS === undefined ? null : @com.smartgwt.client.data.Record::convertToRecordArray(Lcom/google/gwt/core/client/JavaScriptObject;)(recordsJS); }-*/; /** * Find all objects where property == value in the object * * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * * @return all matching Objects or null if none found */ public native Record[] findAll(String propertyName, int value) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordsJS = self.findAll(propertyName, value); return recordsJS == null || recordsJS === undefined ? null : @com.smartgwt.client.data.Record::convertToRecordArray(Lcom/google/gwt/core/client/JavaScriptObject;)(recordsJS); }-*/; /** * Find all objects where property == value in the object * <P> Note: JavaScript has no long type, so the long value becomes a JavaScript Number, which has a lesser range than Java long. * The range for integer numbers in Javascript is [-9007199254740992,9007199254740992] or [-Math.pow(2,53),Math.pow(2,53)]. * * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * * @return all matching Objects or null if none found */ public native Record[] findAll(String propertyName, Long value) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordsJS = self.findAll(propertyName, value); return recordsJS == null || recordsJS === undefined ? null : @com.smartgwt.client.data.Record::convertToRecordArray(Lcom/google/gwt/core/client/JavaScriptObject;)(recordsJS); }-*/; /** * Find all objects where property == value in the object * * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * * @return all matching Objects or null if none found */ public native Record[] findAll(String propertyName, float value) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordsJS = self.findAll(propertyName, value); return recordsJS == null || recordsJS === undefined ? null : @com.smartgwt.client.data.Record::convertToRecordArray(Lcom/google/gwt/core/client/JavaScriptObject;)(recordsJS); }-*/; /** * Find all objects where property == value in the object. * * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * * @return all matching Objects or null if none found */ public native Record[] findAll(String propertyName, boolean value) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordsJS = self.findAll(propertyName, value); return recordsJS == null || recordsJS === undefined ? null : @com.smartgwt.client.data.Record::convertToRecordArray(Lcom/google/gwt/core/client/JavaScriptObject;)(recordsJS); }-*/; /** * Find all objects where property == value in the object. * * @param propertyName property to match * @param value value to compare against (if propertyName is a string) * * @return all matching Objects or null if none found */ public native Record[] findAll(String propertyName, Date value) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordsJS = self.findAll(propertyName, @com.smartgwt.client.util.JSOHelper::convertToJavaScriptDate(Ljava/util/Date;)(value)); return recordsJS == null || recordsJS === undefined ? null : @com.smartgwt.client.data.Record::convertToRecordArray(Lcom/google/gwt/core/client/JavaScriptObject;)(recordsJS); }-*/; /** * Filters all objects according to the AdvancedCriteria passed * * @param adCriteria AdvancedCriteria to use to filter results * * @return all matching Objects or null if none found */ public native Record[] findAll(AdvancedCriteria adCriteria) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordsJS = self.findAll(adCriteria.@com.smartgwt.client.core.DataClass::getJsObj()()); return recordsJS == null || recordsJS === undefined ? null : @com.smartgwt.client.data.Record::convertToRecordArray(Lcom/google/gwt/core/client/JavaScriptObject;)(recordsJS); }-*/; /** * Filters all objects according to the AdvancedCriteria passed and returns the first matching object or null if not found * * @param adCriteria AdvancedCriteria to use to filter results * * @return first matching object or null if not found */ public native Record find(AdvancedCriteria adCriteria) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordJS = self.find(adCriteria.@com.smartgwt.client.core.DataClass::getJsObj()()); return recordJS == null || recordJS === undefined ? null : @com.smartgwt.client.data.Record::getOrCreateRef(Lcom/google/gwt/core/client/JavaScriptObject;)(recordJS); }-*/; /** * Finds the index of the first Record that matches with the AdvacendCriteria passed. * @param adCriteria AdvancedCriteria to use to filter results * * @return index of the first matching Record or -1 if not found */ public native int findIndex(AdvancedCriteria adCriteria) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.findIndex(adCriteria.@com.smartgwt.client.core.DataClass::getJsObj()()); }-*/; /** * Like {@link RecordList#findIndex}, but considering the startIndex and endIndex parameters. * @param startIndex first index to consider * @param adCriteria AdvancedCriteria to use to filter results * @param endIndex last index to consider * * @return index of the first matching Record or -1 if not found */ public native int findNextIndex(int startIndex, AdvancedCriteria adCriteria, int endIndex) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.findNextIndex(startIndex, adCriteria.@com.smartgwt.client.core.DataClass::getJsObj()(), null, endIndex); }-*/; /** * Like {@link RecordList#findIndex}, but considering the startIndex parameter. * @param startIndex first index to consider * @param adCriteria AdvancedCriteria to use to filter results * * @return index of the first matching Record or -1 if not found */ public native int findNextIndex(int startIndex, AdvancedCriteria adCriteria) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); return self.findNextIndex(startIndex, adCriteria.@com.smartgwt.client.core.DataClass::getJsObj()()); }-*/; /** * Return if this list contains the specified object. * @param record item to look for * * @return true == item was found, false == not found */ public native Boolean contains(Record record) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var retVal =self.contains(record.@com.smartgwt.client.data.Record::getJsObj()()); if(retVal == null || retVal === undefined) { return null; } else { return @com.smartgwt.client.util.JSOHelper::toBoolean(Z)(retVal); } }-*/; /** * Return if this list contains the specified object. <P> If pos is specified, starts looking after that position. * @param record item to look for * @param pos optional position in the list to look after * * @return true == item was found, false == not found */ public native Boolean contains(Record record, int pos) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var retVal =self.contains(record.@com.smartgwt.client.data.Record::getJsObj()(), pos); if(retVal == null || retVal === undefined) { return null; } else { return @com.smartgwt.client.util.JSOHelper::toBoolean(Z)(retVal); } }-*/; /** * Return whether this list contains all the item in the specified list. * @param list items to look for * * @return whether all items were found */ public native Boolean containsAll(RecordList list) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var retVal =self.containsAll(list.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()()); if(retVal == null || retVal === undefined) { return null; } else { return @com.smartgwt.client.util.JSOHelper::toBoolean(Z)(retVal); } }-*/; /** * Return the list of items that are in both this list and the passed-in list. * @param list list to intersect with * * @return intersection */ public native RecordList intersect(RecordList list) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var ret = self.intersect(list.@com.smartgwt.client.data.RecordList::getJsObj()()); if(ret == null || ret === undefined) return null; return @com.smartgwt.client.data.RecordList::new(Lcom/google/gwt/core/client/JavaScriptObject;)(ret); }-*/; /** * Return whether this list is equal to another list. <P> Two lists are equal only if they have the same length and all * contained items are in the same order and are also equal. * @param list list to check for equality * * @return whether the specified list is equal to this list */ public native Boolean equals(RecordList list) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var retVal =self.equals(list.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()()); if(retVal == null || retVal === undefined) { return null; } else { return @com.smartgwt.client.util.JSOHelper::toBoolean(Z)(retVal); } }-*/; /** * Return the items at a list of specified positions. * @param itemList array of positions * * @return subset of the array, in the same order as itemList */ public native Record[] getItems(int[] itemList) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordsJS = self.getItems(@com.smartgwt.client.util.JSOHelper::convertToJavaScriptArray([I)(itemList)); return recordsJS == null || recordsJS === undefined ? null : @com.smartgwt.client.data.Record::convertToRecordArray(Lcom/google/gwt/core/client/JavaScriptObject;)(recordsJS); }-*/; /** * Return the items between position start and end, non-inclusive at the end. * @param start start position * @param end end position * * @return subset of the array from start -> end-1 */ public native Record[] getRange(int start, int end) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordsJS = self.getRange(start, end); return recordsJS == null || recordsJS === undefined ? null : @com.smartgwt.client.data.Record::convertToRecordArray(Lcom/google/gwt/core/client/JavaScriptObject;)(recordsJS); }-*/; /** * Return an Array that is a shallow copy of the list, that is, containing the same items. * * @return new array, pointing to the same items */ public native Record[] duplicate() /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordsJS = self.duplicate(); return recordsJS == null || recordsJS === undefined ? null : @com.smartgwt.client.data.Record::convertToRecordArray(Lcom/google/gwt/core/client/JavaScriptObject;)(recordsJS); }-*/; /** * Change the array element at a particular position. <P> set() can be used to expand the length of the list. * @param pos position in the list to change * @param record new value for that position * * @return whatever's at that position, null if not found */ public native Record set(int pos, Record record) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordJS = self.set(pos, record.@com.smartgwt.client.data.Record::getJsObj()()); return recordJS == null || recordJS === undefined ? null : @com.smartgwt.client.data.Record::getOrCreateRef(Lcom/google/gwt/core/client/JavaScriptObject;)(recordJS); }-*/; /** * Add a single item to this array at a specific position in the list, sliding other items over to fit. * @param record object to add * @param pos position in the list to add at * * @return object that was added */ public native Record addAt(Record record, int pos) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordJS = self.addAt(record.@com.smartgwt.client.data.Record::getJsObj()(), pos); return recordJS == null || recordJS === undefined ? null : @com.smartgwt.client.data.Record::getOrCreateRef(Lcom/google/gwt/core/client/JavaScriptObject;)(recordJS); }-*/; /** * Remove the item at the specified position, rearranging all subsequent items to fill the gap * @param pos position to remove * * @return item that was removed */ public native Record removeAt(int pos) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordJS = self.removeAt(pos); return recordJS == null || recordJS === undefined ? null : @com.smartgwt.client.data.Record::getOrCreateRef(Lcom/google/gwt/core/client/JavaScriptObject;)(recordJS); }-*/; /** * Add an object to this list, at the end * @param record object to add * */ public native void add(Record record) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); self.add(record.@com.smartgwt.client.data.Record::getJsObj()()); }-*/; /** * Add a list of items to this array. <P> Note: you can specify that a subset range be added by passing start and end * indices * @param list list of items to add * */ public native void addList(Record[] list) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); self.addList(@com.smartgwt.client.util.JSOHelper::convertToJavaScriptArray([Ljava/lang/Object;)(list)); }-*/; /** * Add a list of items to this array. <P> Note: you can specify that a subset range be added by passing start and end * indices * @param list list of items to add * @param listStartRow optional start index in list * @param listEndRow optional end index in list (non-inclusive) * */ public native void addList(Record[] list, int listStartRow, int listEndRow) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); self.addList(@com.smartgwt.client.util.JSOHelper::convertToJavaScriptArray([Ljava/lang/Object;)(list), listStartRow, listEndRow); }-*/; /** * Set the length of this list. <P> If the length of the list is shortened, any elements past the new length of the list * are removed. If the length is increased, all positions past the old length have the value <code>undefined</code>. * @param length new length */ public native void setLength(int length) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); self.setLength(length); }-*/; /** * Add list of items list to this array at item pos. All items after array[pos] will slide down to fit new items. * @param list new array of items * @param pos position in this list to put the new items * */ public native void addListAt(Record[] list, int pos) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); self.addListAt(@com.smartgwt.client.util.JSOHelper::convertToJavaScriptArray([Ljava/lang/Object;)(list), pos); }-*/; /** * Remove first instance of the passed object from this array, sliding other items around to fill gaps. * @param record item to remove * * @return true if a matching object was found and removed, false if no matching object was found and the list remains unchanged. */ public native Boolean remove(Record record) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var retVal =self.remove(record.@com.smartgwt.client.data.Record::getJsObj()()); if(retVal == null || retVal === undefined) { return null; } else { return @com.smartgwt.client.util.JSOHelper::toBoolean(Z)(retVal); } }-*/; /** * Remove all instances of objects in the specified list from this list, sliding the remaining objects around to fill gaps. * @param list list of items to remove * */ public native void removeList(Record[] list) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); self.removeList(@com.smartgwt.client.util.JSOHelper::convertToJavaScriptArray([Ljava/lang/Object;)(list)); }-*/; /** * Sorts the elements of the List in place. <P> The optional comparator function should take two parameters "a" and "b" * which are the two list items to compare, and should return: <ul> <li> a value less than zero, if "a" is less than "b" * such that "a" should appear earlier in the list <li> zero, if "a" and "b" are equal <li> a value greater than zero, * if "a" is greater than "b" such that "b" should appear earlier in the list </ul> * */ public native void sort() /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); self.sort(); }-*/; /** * Sorts the elements of the List in place. <P> The optional comparator function should take two parameters "a" and "b" * which are the two list items to compare, and should return: <ul> <li> a value less than zero, if "a" is less than "b" * such that "a" should appear earlier in the list <li> zero, if "a" and "b" are equal <li> a value greater than zero, * if "a" is greater than "b" such that "b" should appear earlier in the list </ul> * @param comparator comparator function to use * * @return the list itself */ public native RecordList sort(Comparator<Record> comparator) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var result = self.sort(function(record1, record2) { var record1J = @com.smartgwt.client.data.Record::getOrCreateRef(Lcom/google/gwt/core/client/JavaScriptObject;)(record1); var record2J = @com.smartgwt.client.data.Record::getOrCreateRef(Lcom/google/gwt/core/client/JavaScriptObject;)(record2); return comparator.@java.util.Comparator::compare(Ljava/lang/Object;Ljava/lang/Object;)(record1J, record2J); }); if (result == null) return null; return @com.smartgwt.client.data.RecordList::getOrCreateRef(Lcom/google/gwt/core/client/JavaScriptObject;)(result); }-*/; /** * Return a new Array where the value of item i is the value of "property" of item i in this array. If an item doesn't * have that property or is null, return item will be null. * @param property name of the property to look for * * @return array of the values of property in each item of this list */ public native Record[] getProperty(String property) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var recordsJS = self.getProperty(property); return recordsJS == null || recordsJS === undefined ? null : @com.smartgwt.client.data.Record::convertToRecordArray(Lcom/google/gwt/core/client/JavaScriptObject;)(recordsJS); }-*/; /** * Sort a list of objects by a given property of each item. <P> The optional normalizer, if passed as a function, is called * for each item in the List, and should return whatever value should be used for sorting, which does not have to agree * with the property value. By passing a normalizer function you can achieve any kind of sorting you'd like, including * sorting by multiple properties. <P> NOTE: string sort is case INsensitive by default * @param property name of the property to sort by * @param up true == sort ascending, false == sort descending * * @return the list itself */ public native RecordList sortByProperty(String property, boolean up) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var ret = self.sortByProperty(property, up); if(ret == null || ret === undefined) return null; return @com.smartgwt.client.data.RecordList::new(Lcom/google/gwt/core/client/JavaScriptObject;)(ret); }-*/; /** * Sort this ResultSet by a property of each record. <P> Sorting is performed on the client for a ResultSet that has a full * cache for the current filter criteria. Otherwise, sorting is performed by the server, and changing the sort order will * invalidate the cache. <P> <b>NOTE:</b> normalizers are not supported by ResultSets in "paged" mode * @param property name of the property to sort by * @param up true == sort ascending, false == sort descending * @param normalizer May be specified as a callbac with signature <code>normalize(item, propertyName)</code>, where * <code>item</code> is reference to the item in the array, <code>propertyName</code> is the * property by which the array is being sorted. Normalizer function should return the value normalized for sorting. */ public native void sortByProperty(String property, boolean up, SortNormalizer normalizer) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); self.sortByProperty(property, up, normalizer == null ? null : $debox($entry(function(record, propertyName) { var recordJ = @com.smartgwt.client.data.Record::getOrCreateRef(Lcom/google/gwt/core/client/JavaScriptObject;)(record); var value = normalizer.@com.smartgwt.client.data.RecordList$SortNormalizer::normalize(Lcom/smartgwt/client/data/Record;Ljava/lang/String;)(recordJ, propertyName); if(value == null) return null; if(typeof value == 'string') { return value; } else { return @com.smartgwt.client.data.RecordList::normalizedValue(Ljava/lang/Number;)(value); } }))); }-*/; private static double normalizedValue(Number number) { return JSOHelper.doubleValue(number); } /** * Multi-Property sort. Sort this ResultSet by a list of {@link com.smartgwt.client.data.SortSpecifier}'s. * * @param sortSpecifiers a list of {@link com.smartgwt.client.data.SortSpecifier} objects, one per sort-field and direction */ public native void setSort(SortSpecifier... sortSpecifiers)/*-{ var sortSpecifiersJS = @com.smartgwt.client.util.JSOHelper::convertToJavaScriptArray([Ljava/lang/Object;)(sortSpecifiers); var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); self.setSort(sortSpecifiersJS); }-*/; /** * Get a map of the form <code>{ item[idField] -> item[displayField] }</code>, for all items in the list. Note that if * more than one item has the same <code>idProperty</code>, the value for the later item in the list will clobber the * value for the earlier item. * @param idField Property to use as ID (data value) in the valueMap * @param displayField Property to use a display value in the valueMap * * @return valueMap object */ public native Map getValueMap(String idField, String displayField) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var mapJS = self.getValueMap(idField, displayField); return mapJS == null ? null : @com.smartgwt.client.util.JSOHelper::convertToMap(Lcom/google/gwt/core/client/JavaScriptObject;)(mapJS); }-*/; /** * Add a DataChanged handler. * <p> * Notification fired when data changes in some way. Note that this will only fire when items are added, removed or * rearranged. If a list contains objects, this method will not fire if changes are made to objects within the list without * changing their position within the list * * @param handler the DataChanged handler * @return {@link com.google.gwt.event.shared.HandlerRegistration} used to remove this handler */ public HandlerRegistration addDataChangedHandler(com.smartgwt.client.data.events.DataChangedHandler handler) { if(getHandlerCount(com.smartgwt.client.data.events.DataChangedEvent.getType()) == 0) setupDataChangedEvent(); return doAddHandler(handler, com.smartgwt.client.data.events.DataChangedEvent.getType()); } private native void setupDataChangedEvent() /*-{ var obj, selfJ = this; if (this.@com.smartgwt.client.core.BaseClass::isCreated()()) { obj = this.@com.smartgwt.client.core.BaseClass::getJsObj()(); } else { obj = this.@com.smartgwt.client.core.BaseClass::getConfig()(); } obj.onDataChanged = $entry(function () { var param = {}; var event = @com.smartgwt.client.data.events.DataChangedEvent::new(Lcom/google/gwt/core/client/JavaScriptObject;)(param); selfJ.@com.smartgwt.client.core.BaseClass::fireEvent(Lcom/google/gwt/event/shared/GwtEvent;)(event); }); }-*/; /** * Returns the records in this RecordList as an array. * * @return an array of records. */ public Record[] toArray() { return getRange(0, getLength()); } public interface SortNormalizer { /** * The normalization function. * * @param record the record to normalize * @param fieldName name of the field on which sorting occurred * @return normalized value for sorting (a java numeric primitive type or String) */ Object normalize(Record record, String fieldName); } /** * Return a RecordList with the items between position start and end, non-inclusive at the end. * @param start start position * @param end end position * * @return a RecordList with the items from start -> end-1 */ public native RecordList getRangeList(int start, int end) /*-{ var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()(); var ret = self.getRange(start, end); if(ret == null || ret === undefined) return null; return @com.smartgwt.client.data.RecordList::new(Lcom/google/gwt/core/client/JavaScriptObject;)(ret); }-*/; }