Source: pick/PickedObjectList.js

/*
 * Copyright 2015-2017 WorldWind Contributors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 * @exports PickedObjectList
 */
define([],
    function () {
        "use strict";

        /**
         * Constructs a picked-object list.
         * @alias PickedObjectList
         * @constructor
         * @classdesc Holds a collection of picked objects.
         */
        var PickedObjectList = function () {
            /**
             * The picked objects.
             * @type {Array}
             */
            this.objects = [];
        };

        /**
         * Indicates whether this list contains picked objects that are not terrain.
         * @returns {Boolean} true if this list contains objects that are not terrain,
         * otherwise false.
         */
        PickedObjectList.prototype.hasNonTerrainObjects = function () {
            return this.objects.length > 1 || (this.objects.length === 1 && this.terrainObject() == null);
        };

        /**
         * Returns the terrain object within this list, if this list contains a terrain object.
         * @returns {PickedObject} The terrain object, or null if this list does not contain a terrain object.
         */
        PickedObjectList.prototype.terrainObject = function () {
            for (var i = 0, len = this.objects.length; i < len; i++) {
                if (this.objects[i].isTerrain) {
                    return this.objects[i];
                }
            }

            return null;
        };

        /**
         * Adds a picked object to this list.
         * If the picked object is a terrain object and the list already contains a terrain object, the terrain
         * object in the list is replaced by the specified one.
         * @param {PickedObject} pickedObject The picked object to add. If null, this list remains unchanged.
         */
        PickedObjectList.prototype.add = function (pickedObject) {
            if (pickedObject) {
                if (pickedObject.isTerrain) {
                    var terrainObjectIndex = this.objects.length;

                    for (var i = 0, len = this.objects.length; i < len; i++) {
                        if (this.objects[i].isTerrain) {
                            terrainObjectIndex = i;
                            break;
                        }
                    }

                    this.objects[terrainObjectIndex] = pickedObject;
                } else {
                    this.objects.push(pickedObject);
                }
            }
        };

        /**
         * Removes all items from this list.
         */
        PickedObjectList.prototype.clear = function () {
            this.objects = [];
        };

        /**
         * Returns the top-most picked object in this list.
         * @returns {PickedObject} The top-most picked object in this list, or null if this list is empty.
         */
        PickedObjectList.prototype.topPickedObject = function () {
            var size = this.objects.length;

            if (size > 1) {
                for (var i = 0; i < size; i++) {
                    if (this.objects[i].isOnTop) {
                        return this.objects[i];
                    }
                }
            }

            if (size > 0) {
                return this.objects[0];
            }

            return null;
        };

        return PickedObjectList;
    });