text: /**
   * Visual Blocks Editor
   *
   * Copyright 2012 Google Inc.
   * http://blockly.googlecode.com/
   *
   * 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.
   */
  
  /**
   * @fileoverview Non-editable text field.  Used for titles, labels, etc.
   * @author fraser@google.com (Neil Fraser)
   */
  'use strict';
  
  goog.provide('Blockly.FieldLabel');
  
  goog.require('Blockly.Field');
  goog.require('Blockly.Tooltip');
  
  /**
   * Class for a non-editable text field.
   * @param {string} text The initial content of the field.
   * @param customOptions
   * @extends {Blockly.Field}
   * @constructor
   */
  Blockly.FieldLabel = function(text, customOptions) {
    customOptions = customOptions || {};
  
    this.sourceBlock_ = null;
    // Build the DOM.
    this.textElement_ = Blockly.createSvgElement(
      'text',
      {class: 'blocklyText'},
      null
    );
  
    var loadingSize = {width: 0, height: 25};
    this.forceSize_ = Object.prototype.hasOwnProperty.call(
      customOptions,
      'fixedSize'
    );
    this.forceWidth_ =
      this.forceSize_ && customOptions.fixedSize.width !== undefined;
  
    // ideally we would dynamically resize based on fontSize. instead we depend
    // on fixedSize being set if you want to also change the size
    this.fontSize_ = customOptions.fontSize;
    this.size_ = this.forceSize_ ? customOptions.fixedSize : loadingSize;
    this.setText(text);
    this.fieldGroup_ = this.textElement_;
  };
  goog.inherits(Blockly.FieldLabel, Blockly.Field);
  
  /**
   * Editable fields are saved by the XML renderer, non-editable fields are not.
   */
  Blockly.FieldLabel.prototype.EDITABLE = false;
  
  /**
   * Install this text on a block.
   * @param {!Blockly.Block} block The block containing this text.
   */
  Blockly.FieldLabel.prototype.init = function(block) {
    if (this.sourceBlock_) {
      throw 'Text has already been initialized once.';
    }
    this.sourceBlock_ = block;
    block.getSvgRoot().appendChild(this.textElement_);
  
    // Configure the field to be transparent with respect to tooltips.
    this.textElement_.tooltip = this.sourceBlock_;
    if (!this.sourceBlock_.blockSpace.blockSpaceEditor.disableTooltip) {
      Blockly.Tooltip && Blockly.Tooltip.bindMouseEvents(this.textElement_);
    }
  };
  
  Blockly.FieldLabel.prototype.getSize = function() {
    // Update the width if we don't have one, unless we've forced the size to 0
    if (!this.size_.width && !this.forceWidth_) {
      this.updateWidth_();
    }
    return this.size_;
  };
  
  Blockly.FieldLabel.prototype.getBufferY = function() {
    // If we explicitly set a fontSize, center our text by having a y buffer on top.
    if (!this.fontSize_) {
      return 0;
    }
  
    return (this.size_.height - this.fontSize_) / 2;
  };
  
  Blockly.FieldLabel.prototype.setText = function(text) {
    if (text === null || text === this.text_) {
      // No change if null.
      return;
    }
    this.text_ = text;
    // Empty the text element.
    goog.dom.removeChildren(/** @type {!Element} */ (this.textElement_));
    // Replace whitespace with non-breaking spaces so the text doesn't collapse.
    text = text.replace(/\s/g, Blockly.Field.NBSP);
    if (!text) {
      // Prevent the field from disappearing if empty.
      text = Blockly.Field.NBSP;
    }
    var textNode = document.createTextNode(text);
    this.textElement_.appendChild(textNode);
  
    if (this.fontSize_) {
      this.textElement_.style.fontSize = this.fontSize_ + 'px';
    }
  
    // Cached width is obsolete.  Clear it.
    if (!this.forceWidth_) {
      this.size_.width = 0;
    }
  
    this.refreshRender();
  };
  
  /**
   * Dispose of all DOM objects belonging to this text.
   */
  Blockly.FieldLabel.prototype.dispose = function() {
    goog.dom.removeNode(this.textElement_);
    this.textElement_ = null;
  };
  
  /**
   * Gets the group element for this field.
   * Used for measuring the size and for positioning.
   * @return {!Element} The group element.
   */
  Blockly.FieldLabel.prototype.getRootElement = function() {
    return /** @type {!Element} */ (this.textElement_);
  };
  
  /**
   * Change the tooltip text for this field.
   * @param {string|!Element} newTip Text for tooltip or a parent element to
   *     link to for its tooltip.
   */
  Blockly.FieldLabel.prototype.setTooltip = function(newTip) {
    this.textElement_.tooltip = newTip;
  };
  