123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- if (!dojo._hasResource["dojox.collections.SortedList"]) { // _hasResource
- // checks added by
- // build. Do not use
- // _hasResource
- // directly in your
- // code.
- dojo._hasResource["dojox.collections.SortedList"] = true;
- dojo.provide("dojox.collections.SortedList");
- dojo.require("dojox.collections._base");
- dojox.collections.SortedList = function(/* object? */dictionary) {
- // summary
- // creates a collection that acts like a dictionary but is also
- // internally sorted.
- // Note that the act of adding any elements forces an internal resort,
- // making this object potentially slow.
- var _this = this;
- var items = {};
- var q = [];
- var sorter = function(a, b) {
- if (a.key > b.key)
- return 1;
- if (a.key < b.key)
- return -1;
- return 0;
- };
- var build = function() {
- q = [];
- var e = _this.getIterator();
- while (!e.atEnd()) {
- q.push(e.get());
- }
- q.sort(sorter);
- };
- var testObject = {};
- this.count = q.length;
- this.add = function(/* string */k,/* object */v) {
- // summary
- // add the passed value to the dictionary at location k
- if (!items[k]) {
- items[k] = new dojox.collections.DictionaryEntry(k, v);
- this.count = q.push(items[k]);
- q.sort(sorter);
- }
- };
- this.clear = function() {
- // summary
- // clear the internal collections
- items = {};
- q = [];
- this.count = q.length;
- };
- this.clone = function() {
- // summary
- // create a clone of this sorted list
- return new dojox.collections.SortedList(this); // dojox.collections.SortedList
- };
- this.contains = this.containsKey = function(/* string */k) {
- // summary
- // Check to see if the list has a location k
- if (testObject[k]) {
- return false; // bool
- }
- return (items[k] != null); // bool
- };
- this.containsValue = function(/* object */o) {
- // summary
- // Check to see if this list contains the passed object
- var e = this.getIterator();
- while (!e.atEnd()) {
- var item = e.get();
- if (item.value == o) {
- return true; // bool
- }
- }
- return false; // bool
- };
- this.copyTo = function(/* array */arr, /* int */i) {
- // summary
- // copy the contents of the list into array arr at index i
- var e = this.getIterator();
- var idx = i;
- while (!e.atEnd()) {
- arr.splice(idx, 0, e.get());
- idx++;
- }
- };
- this.entry = function(/* string */k) {
- // summary
- // return the object at location k
- return items[k]; // dojox.collections.DictionaryEntry
- };
- this.forEach = function(/* function */fn, /* object? */scope) {
- // summary
- // functional iterator, following the mozilla spec.
- dojo.forEach(q, fn, scope);
- };
- this.getByIndex = function(/* int */i) {
- // summary
- // return the item at index i
- return q[i].valueOf(); // object
- };
- this.getIterator = function() {
- // summary
- // get an iterator for this object
- return new dojox.collections.DictionaryIterator(items); // dojox.collections.DictionaryIterator
- };
- this.getKey = function(/* int */i) {
- // summary
- // return the key of the item at index i
- return q[i].key;
- };
- this.getKeyList = function() {
- // summary
- // return an array of the keys set in this list
- var arr = [];
- var e = this.getIterator();
- while (!e.atEnd()) {
- arr.push(e.get().key);
- }
- return arr; // array
- };
- this.getValueList = function() {
- // summary
- // return an array of values in this list
- var arr = [];
- var e = this.getIterator();
- while (!e.atEnd()) {
- arr.push(e.get().value);
- }
- return arr; // array
- };
- this.indexOfKey = function(/* string */k) {
- // summary
- // return the index of the passed key.
- for (var i = 0; i < q.length; i++) {
- if (q[i].key == k) {
- return i; // int
- }
- }
- return -1; // int
- };
- this.indexOfValue = function(/* object */o) {
- // summary
- // return the first index of object o
- for (var i = 0; i < q.length; i++) {
- if (q[i].value == o) {
- return i; // int
- }
- }
- return -1; // int
- };
- this.item = function(/* string */k) {
- // summary
- // return the value of the object at location k.
- if (k in items && !testObject[k]) {
- return items[k].valueOf(); // object
- }
- return undefined; // object
- };
- this.remove = function(/* string */k) {
- // summary
- // remove the item at location k and rebuild the internal
- // collections.
- delete items[k];
- build();
- this.count = q.length;
- };
- this.removeAt = function(/* int */i) {
- // summary
- // remove the item at index i, and rebuild the internal collections.
- delete items[q[i].key];
- build();
- this.count = q.length;
- };
- this.replace = function(/* string */k, /* object */v) {
- // summary
- // Replace an existing item if it's there, and add a new one if not.
- if (!items[k]) {
- // we're adding a new object, return false
- this.add(k, v);
- return false; // bool
- } else {
- // we're replacing an object, return true
- items[k] = new dojox.collections.DictionaryEntry(k, v);
- build();
- return true; // bool
- }
- };
- this.setByIndex = function(/* int */i, /* object */o) {
- // summary
- // set an item by index
- items[q[i].key].value = o;
- build();
- this.count = q.length;
- };
- if (dictionary) {
- var e = dictionary.getIterator();
- while (!e.atEnd()) {
- var item = e.get();
- q[q.length] = items[item.key] = new dojox.collections.DictionaryEntry(
- item.key, item.value);
- }
- q.sort(sorter);
- }
- }
- }
|