/*
* 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;
});