/**
 * @license
 * Copyright The Closure Library Authors.
 * SPDX-License-Identifier: Apache-2.0
 */

// 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 Native browser textarea renderer for {@link goog.ui.Textarea}s.
 * @suppress {strictMissingProperties} legacy accesses off type 'Element'
 */

goog.provide('goog.ui.TextareaRenderer');

goog.require('goog.dom.TagName');
goog.require('goog.ui.Component');
goog.require('goog.ui.ControlRenderer');
goog.requireType('goog.ui.Control');



/**
 * Renderer for {@link goog.ui.Textarea}s.  Renders and decorates native HTML
 * textarea elements.  Since native HTML textareas have built-in support for
 * many features, overrides many expensive (and redundant) superclass methods to
 * be no-ops.
 * @constructor
 * @extends {goog.ui.ControlRenderer}
 */
goog.ui.TextareaRenderer = function() {
  'use strict';
  goog.ui.ControlRenderer.call(this);
};
goog.inherits(goog.ui.TextareaRenderer, goog.ui.ControlRenderer);
goog.addSingletonGetter(goog.ui.TextareaRenderer);


/**
 * Default CSS class to be applied to the root element of components rendered
 * by this renderer.
 * @type {string}
 */
goog.ui.TextareaRenderer.CSS_CLASS = goog.getCssName('goog-textarea');


/** @override */
goog.ui.TextareaRenderer.prototype.getAriaRole = function() {
  'use strict';
  // textareas don't need ARIA roles to be recognized by screen readers.
  return undefined;
};


/** @override */
goog.ui.TextareaRenderer.prototype.decorate = function(control, element) {
  'use strict';
  this.setUpTextarea_(control);
  goog.ui.TextareaRenderer.superClass_.decorate.call(this, control, element);
  control.setContent(element.value);
  return element;
};


/**
 * Returns the textarea's contents wrapped in an HTML textarea element.  Sets
 * the textarea's disabled attribute as needed.
 * @param {goog.ui.Control} textarea Textarea to render.
 * @return {!Element} Root element for the Textarea control (an HTML textarea
 *     element).
 * @override
 */
goog.ui.TextareaRenderer.prototype.createDom = function(textarea) {
  'use strict';
  this.setUpTextarea_(textarea);
  var element = textarea.getDomHelper().createDom(
      goog.dom.TagName.TEXTAREA, {
        'class': this.getClassNames(textarea).join(' '),
        'disabled': !textarea.isEnabled()
      },
      textarea.getContent() || '');
  return element;
};


/**
 * Overrides {@link goog.ui.TextareaRenderer#canDecorate} by returning true only
 * if the element is an HTML textarea.
 * @param {Element} element Element to decorate.
 * @return {boolean} Whether the renderer can decorate the element.
 * @override
 */
goog.ui.TextareaRenderer.prototype.canDecorate = function(element) {
  'use strict';
  return element.tagName == goog.dom.TagName.TEXTAREA;
};


/**
 * Textareas natively support right-to-left rendering.
 * @override
 */
goog.ui.TextareaRenderer.prototype.setRightToLeft = function() {};


/**
 * Textareas are always focusable as long as they are enabled.
 * @override
 */
goog.ui.TextareaRenderer.prototype.isFocusable = function(textarea) {
  'use strict';
  return textarea.isEnabled();
};


/**
 * Textareas natively support keyboard focus.
 * @override
 */
goog.ui.TextareaRenderer.prototype.setFocusable = function() {};


/**
 * Textareas also expose the DISABLED state in the HTML textarea's
 * `disabled` attribute.
 * @override
 */
goog.ui.TextareaRenderer.prototype.setState = function(
    textarea, state, enable) {
  'use strict';
  goog.ui.TextareaRenderer.superClass_.setState.call(
      this, textarea, state, enable);
  var element = textarea.getElement();
  if (element && state == goog.ui.Component.State.DISABLED) {
    element.disabled = enable;
  }
};


/**
 * Textareas don't need ARIA states to support accessibility, so this is
 * a no-op.
 * @override
 */
goog.ui.TextareaRenderer.prototype.updateAriaState = function() {};


/**
 * Sets up the textarea control such that it doesn't waste time adding
 * functionality that is already natively supported by browser
 * textareas.
 * @param {goog.ui.Control} textarea Textarea control to configure.
 * @private
 */
goog.ui.TextareaRenderer.prototype.setUpTextarea_ = function(textarea) {
  'use strict';
  textarea.setHandleMouseEvents(false);
  textarea.setAutoStates(goog.ui.Component.State.ALL, false);
  textarea.setSupportedState(goog.ui.Component.State.FOCUSED, false);
};


/** @override **/
goog.ui.TextareaRenderer.prototype.setContent = function(element, value) {
  'use strict';
  if (element) {
    element.value = value;
  }
};


/** @override **/
goog.ui.TextareaRenderer.prototype.getCssClass = function() {
  'use strict';
  return goog.ui.TextareaRenderer.CSS_CLASS;
};
