Source: render/ScreenCreditController.js

/*
 * Copyright 2003-2006, 2009, 2017, United States Government, as represented by the Administrator of the
 * National Aeronautics and Space Administration. All rights reserved.
 *
 * The NASAWorldWind/WebWorldWind platform is 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 ScreenCreditController
 */
define([
        '../error/ArgumentError',
        '../util/Color',
        '../util/Font',
        '../layer/Layer',
        '../util/Logger',
        '../util/Offset',
        '../shapes/ScreenText'
    ],
    function (ArgumentError,
              Color,
              Font,
              Layer,
              Logger,
              Offset,
              ScreenText) {
        "use strict";

        /**
         * Constructs a screen credit controller.
         * @alias ScreenCreditController
         * @constructor
         * @augments Layer
         * @classdesc Collects and displays screen credits.
         */
        var ScreenCreditController = function () {
            Layer.call(this, "ScreenCreditController");

            /**
             * An {@link Offset} indicating where to place the attributions on the screen.
             * @type {Offset}
             * @default The lower left corner of the window with an 11px left margin and a 2px bottom margin.
             */
            this.creditPlacement = new Offset(WorldWind.OFFSET_PIXELS, 11, WorldWind.OFFSET_PIXELS, 2);

            /**
             * The amount of horizontal spacing between adjacent attributions.
             * @type {number}
             * @default An 11px margin between attributions.
             */
            this.creditMargin = 11;

            // Apply 50% opacity to all shapes rendered by this layer.
            this.opacity = 0.5;

            // Internal. Intentionally not documented.
            this.credits = [];
        };

        ScreenCreditController.prototype = Object.create(Layer.prototype);

        /**
         * Clears all credits from this controller.
         */
        ScreenCreditController.prototype.clear = function () {
            this.credits = [];
        };

        /**
         * Adds a credit to this controller.
         * @param {String} creditString The text to display in the credits area.
         * @param {Color} color The color with which to draw the string.
         * @param {String} hyperlinkUrl Optional argument if screen credit is intended to work as a hyperlink.
         * @throws {ArgumentError} If either the specified string or color is null or undefined.
         */
        ScreenCreditController.prototype.addCredit = function (creditString, color, hyperlinkUrl) {
            if (!creditString) {
                throw new ArgumentError(
                    Logger.logMessage(Logger.LEVEL_SEVERE, "ScreenCreditController", "addCredit", "missingText"));
            }

            if (!color) {
                throw new ArgumentError(
                    Logger.logMessage(Logger.LEVEL_SEVERE, "ScreenCreditController", "addCredit", "missingColor"));
            }

            // Verify if text credit is not already in controller, if it is, don't add it.
            for (var i = 0, len = this.credits.length; i < len; i++) {
                if (this.credits[i].text === creditString) {
                    return;
                }
            }

            var credit = new ScreenText(new Offset(WorldWind.OFFSET_PIXELS, 0, WorldWind.OFFSET_PIXELS, 0), creditString);
            credit.attributes.font = new Font(10);
            credit.attributes.color = color;
            credit.attributes.enableOutline = false;
            credit.attributes.offset = new Offset(WorldWind.OFFSET_FRACTION, 0, WorldWind.OFFSET_FRACTION, 0);

            // Append new user property to store URL for hyperlinking.
            // (See BasicWorldWindowController.handleClickOrTap).
            if (hyperlinkUrl) {
                credit.userProperties.url = hyperlinkUrl;
            }

            this.credits.push(credit);
        };

        // Internal use only. Intentionally not documented.
        ScreenCreditController.prototype.doRender = function (dc) {
            var point = this.creditPlacement.offsetForSize(dc.viewport.width, dc.viewport.height);

            for (var i = 0, len = this.credits.length; i < len; i++) {
                // Place the credit text on screen and render it.
                this.credits[i].screenOffset.x = point[0];
                this.credits[i].screenOffset.y = point[1];
                this.credits[i].render(dc);

                // Advance the screen position for the next credit.
                dc.textRenderer.typeFace = this.credits[i].attributes.font;
                dc.textRenderer.outlineWidth = this.credits[i].attributes.outlineWidth;
                dc.textRenderer.enableOutline = this.credits[i].attributes.enableOutline;
                point[0] += dc.textRenderer.textSize(this.credits[i].text)[0];
                point[0] += this.creditMargin;
            }
        };

        return ScreenCreditController;
    });