Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
Clear All
new posts

    RecordList.sort(Comparator) throws exception

    Hi,

    RecordList.sort(Comparator) throws exception in SmartGWT 2.4

    Code:
    package com.smartgwt.client.data;
    public class RecordList extends BaseClass implements com.smartgwt.client.data.events.HasDataChangedHandlers {
    ...
        /**
         * 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(JavaScriptObject self, Comparator<Record> comparator) /*-{
            return 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);
            });
        }-*/;
    The method should return RecordList but it returns JavaScriptObject and throws ClassCastException. It can be fixed by the following way:
    Code:
        public native RecordList sort(Comparator<Record> comparator) /*-{
            var self = this.@com.smartgwt.client.core.BaseClass::getOrCreateJsObj()();
            var res =  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);
            });
            return @com.smartgwt.client.data.RecordList::getOrCreateRef(Lcom/google/gwt/core/client/JavaScriptObject;)(res);
        }-*/;

    #2
    Makes sense. We've added the change. Thanks for your attention to detail.

    Comment

    Working...
    X