Path: blob/trunk/third_party/closure/goog/ui/button.js
4500 views
/**1* @license2* Copyright The Closure Library Authors.3* SPDX-License-Identifier: Apache-2.04*/56/**7* @fileoverview A button control. This implementation extends {@link8* goog.ui.Control}.9*10* @see ../demos/button.html11*/1213goog.provide('goog.ui.Button');14goog.provide('goog.ui.Button.Side');1516goog.require('goog.events.EventType');17goog.require('goog.events.KeyCodes');18goog.require('goog.events.KeyHandler');19goog.require('goog.ui.ButtonRenderer');20goog.require('goog.ui.ButtonSide');21goog.require('goog.ui.Component');22goog.require('goog.ui.Control');23goog.require('goog.ui.NativeButtonRenderer');24goog.require('goog.ui.registry');25goog.requireType('goog.dom.DomHelper');26goog.requireType('goog.events.KeyEvent');27goog.requireType('goog.ui.ControlContent');28293031/**32* A button control, rendered as a native browser button by default.33*34* @param {goog.ui.ControlContent=} opt_content Text caption or existing DOM35* structure to display as the button's caption (if any).36* @param {goog.ui.ButtonRenderer=} opt_renderer Renderer used to render or37* decorate the button; defaults to {@link goog.ui.NativeButtonRenderer}.38* @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for39* document interaction.40* @constructor41* @extends {goog.ui.Control}42*/43goog.ui.Button = function(opt_content, opt_renderer, opt_domHelper) {44'use strict';45goog.ui.Control.call(46this, opt_content,47opt_renderer || goog.ui.NativeButtonRenderer.getInstance(),48opt_domHelper);49};50goog.inherits(goog.ui.Button, goog.ui.Control);515253/**54* Constants for button sides, see {@link goog.ui.Button.prototype.setCollapsed}55* for details. Aliased from goog.ui.ButtonSide to support legacy users without56* creating a circular dependency in {@link goog.ui.ButtonRenderer}.57* @enum {number}58* @deprecated use {@link goog.ui.ButtonSide} instead.59*/60goog.ui.Button.Side = goog.ui.ButtonSide;616263/**64* Value associated with the button.65* @type {*}66* @private67*/68goog.ui.Button.prototype.value_;697071/**72* Tooltip text for the button, displayed on hover.73* @type {string|undefined}74* @private75*/76goog.ui.Button.prototype.tooltip_;777879// goog.ui.Button API implementation.808182/**83* Returns the value associated with the button.84* @return {*} Button value (undefined if none).85*/86goog.ui.Button.prototype.getValue = function() {87'use strict';88return this.value_;89};909192/**93* Sets the value associated with the button, and updates its DOM.94* @param {*} value New button value.95*/96goog.ui.Button.prototype.setValue = function(value) {97'use strict';98this.value_ = value;99var renderer = /** @type {!goog.ui.ButtonRenderer} */ (this.getRenderer());100renderer.setValue(this.getElement(), /** @type {string} */ (value));101};102103104/**105* Sets the value associated with the button. Unlike {@link #setValue},106* doesn't update the button's DOM. Considered protected; to be called only107* by renderer code during element decoration.108* @param {*} value New button value.109* @protected110*/111goog.ui.Button.prototype.setValueInternal = function(value) {112'use strict';113this.value_ = value;114};115116117/**118* Returns the tooltip for the button.119* @return {string|undefined} Tooltip text (undefined if none).120*/121goog.ui.Button.prototype.getTooltip = function() {122'use strict';123return this.tooltip_;124};125126127/**128* Sets the tooltip for the button, and updates its DOM.129* @param {string} tooltip New tooltip text.130* @suppress {strictMissingProperties} Added to tighten compiler checks131*/132goog.ui.Button.prototype.setTooltip = function(tooltip) {133'use strict';134this.tooltip_ = tooltip;135this.getRenderer().setTooltip(this.getElement(), tooltip);136};137138139/**140* Sets the tooltip for the button. Unlike {@link #setTooltip}, doesn't update141* the button's DOM. Considered protected; to be called only by renderer code142* during element decoration.143* @param {string} tooltip New tooltip text.144* @protected145*/146goog.ui.Button.prototype.setTooltipInternal = function(tooltip) {147'use strict';148this.tooltip_ = tooltip;149};150151152/**153* Collapses the border on one or both sides of the button, allowing it to be154* combined with the adjancent button(s), forming a single UI componenet with155* multiple targets.156* @param {number} sides Bitmap of one or more {@link goog.ui.ButtonSide}s for157* which borders should be collapsed.158* @suppress {strictMissingProperties} Added to tighten compiler checks159*/160goog.ui.Button.prototype.setCollapsed = function(sides) {161'use strict';162this.getRenderer().setCollapsed(this, sides);163};164165166// goog.ui.Control & goog.ui.Component API implementation.167168169/** @override */170goog.ui.Button.prototype.disposeInternal = function() {171'use strict';172goog.ui.Button.superClass_.disposeInternal.call(this);173delete this.value_;174delete this.tooltip_;175};176177178/** @override */179goog.ui.Button.prototype.enterDocument = function() {180'use strict';181goog.ui.Button.superClass_.enterDocument.call(this);182if (this.isSupportedState(goog.ui.Component.State.FOCUSED)) {183var keyTarget = this.getKeyEventTarget();184if (keyTarget) {185this.getHandler().listen(186keyTarget, goog.events.EventType.KEYUP, this.handleKeyEventInternal);187}188}189};190191192/**193* Attempts to handle a keyboard event; returns true if the event was handled,194* false otherwise. If the button is enabled and the Enter/Space key was195* pressed, handles the event by dispatching an `ACTION` event,196* and returns true. Overrides {@link goog.ui.Control#handleKeyEventInternal}.197* @param {goog.events.KeyEvent} e Key event to handle.198* @return {boolean} Whether the key event was handled.199* @protected200* @override201*/202goog.ui.Button.prototype.handleKeyEventInternal = function(e) {203'use strict';204if (e.keyCode == goog.events.KeyCodes.ENTER &&205e.type == goog.events.KeyHandler.EventType.KEY ||206e.keyCode == goog.events.KeyCodes.SPACE &&207e.type == goog.events.EventType.KEYUP) {208return this.performActionInternal(e);209}210// Return true for space keypress (even though the event is handled on keyup)211// as preventDefault needs to be called up keypress to take effect in IE and212// WebKit.213return e.keyCode == goog.events.KeyCodes.SPACE;214};215216217// Register a decorator factory function for goog.ui.Buttons.218goog.ui.registry.setDecoratorByClassName(219goog.ui.ButtonRenderer.CSS_CLASS, function() {220'use strict';221return new goog.ui.Button(null);222});223224225