123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321 |
- // Copyright 2008 The Closure Library Authors. All Rights Reserved.
- //
- // 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 A dimension picker control. A dimension picker allows the
- * user to visually select a row and column count.
- *
- * @author robbyw@google.com (Robby Walker)
- * @see ../demos/dimensionpicker.html
- * @see ../demos/dimensionpicker_rtl.html
- */
- goog.provide('goog.ui.DimensionPicker');
- goog.require('goog.events.EventType');
- goog.require('goog.events.KeyCodes');
- goog.require('goog.math.Size');
- goog.require('goog.ui.Component');
- goog.require('goog.ui.Control');
- goog.require('goog.ui.DimensionPickerRenderer');
- goog.require('goog.ui.registry');
- /**
- * A dimension picker allows the user to visually select a row and column
- * count using their mouse and keyboard.
- *
- * The currently selected dimension is controlled by an ACTION event. Event
- * listeners may retrieve the selected item using the
- * {@link #getValue} method.
- *
- * @param {goog.ui.DimensionPickerRenderer=} opt_renderer Renderer used to
- * render or decorate the palette; defaults to
- * {@link goog.ui.DimensionPickerRenderer}.
- * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for
- * document interaction.
- * @constructor
- * @extends {goog.ui.Control}
- * @final
- */
- goog.ui.DimensionPicker = function(opt_renderer, opt_domHelper) {
- goog.ui.Control.call(
- this, null, opt_renderer || goog.ui.DimensionPickerRenderer.getInstance(),
- opt_domHelper);
- this.size_ = new goog.math.Size(this.minColumns, this.minRows);
- };
- goog.inherits(goog.ui.DimensionPicker, goog.ui.Control);
- /**
- * Minimum number of columns to show in the grid.
- * @type {number}
- */
- goog.ui.DimensionPicker.prototype.minColumns = 5;
- /**
- * Minimum number of rows to show in the grid.
- * @type {number}
- */
- goog.ui.DimensionPicker.prototype.minRows = 5;
- /**
- * Maximum number of columns to show in the grid.
- * @type {number}
- */
- goog.ui.DimensionPicker.prototype.maxColumns = 20;
- /**
- * Maximum number of rows to show in the grid.
- * @type {number}
- */
- goog.ui.DimensionPicker.prototype.maxRows = 20;
- /**
- * Palette dimensions (columns x rows).
- * @type {goog.math.Size}
- * @private
- */
- goog.ui.DimensionPicker.prototype.size_;
- /**
- * Currently highlighted row count.
- * @type {number}
- * @private
- */
- goog.ui.DimensionPicker.prototype.highlightedRows_ = 1;
- /**
- * Currently highlighted column count.
- * @type {number}
- * @private
- */
- goog.ui.DimensionPicker.prototype.highlightedColumns_ = 1;
- /** @override */
- goog.ui.DimensionPicker.prototype.enterDocument = function() {
- goog.ui.DimensionPicker.superClass_.enterDocument.call(this);
- var handler = this.getHandler();
- handler
- .listen(
- this.getRenderer().getMouseMoveElement(this),
- goog.events.EventType.MOUSEMOVE, this.handleMouseMove)
- .listen(
- this.getDomHelper().getWindow(), goog.events.EventType.RESIZE,
- this.handleWindowResize);
- var parent = this.getParent();
- if (parent) {
- handler.listen(parent, goog.ui.Component.EventType.SHOW, this.handleShow_);
- }
- };
- /** @override */
- goog.ui.DimensionPicker.prototype.exitDocument = function() {
- goog.ui.DimensionPicker.superClass_.exitDocument.call(this);
- var handler = this.getHandler();
- handler
- .unlisten(
- this.getRenderer().getMouseMoveElement(this),
- goog.events.EventType.MOUSEMOVE, this.handleMouseMove)
- .unlisten(
- this.getDomHelper().getWindow(), goog.events.EventType.RESIZE,
- this.handleWindowResize);
- var parent = this.getParent();
- if (parent) {
- handler.unlisten(
- parent, goog.ui.Component.EventType.SHOW, this.handleShow_);
- }
- };
- /**
- * Resets the highlighted size when the picker is shown.
- * @private
- */
- goog.ui.DimensionPicker.prototype.handleShow_ = function() {
- if (this.isVisible()) {
- this.setValue(1, 1);
- }
- };
- /** @override */
- goog.ui.DimensionPicker.prototype.disposeInternal = function() {
- goog.ui.DimensionPicker.superClass_.disposeInternal.call(this);
- delete this.size_;
- };
- // Palette event handling.
- /**
- * Handles mousemove events. Determines which palette size was moused over and
- * highlights it.
- * @param {goog.events.BrowserEvent} e Mouse event to handle.
- * @protected
- */
- goog.ui.DimensionPicker.prototype.handleMouseMove = function(e) {
- var highlightedSizeX = this.getRenderer().getGridOffsetX(
- this, this.isRightToLeft() ?
- /** @type {!HTMLElement} */ (e.target).offsetWidth - e.offsetX :
- e.offsetX);
- var highlightedSizeY = this.getRenderer().getGridOffsetY(this, e.offsetY);
- this.setValue(highlightedSizeX, highlightedSizeY);
- };
- /**
- * Handles window resize events. Ensures no scrollbars are introduced by the
- * renderer's mouse catcher.
- * @param {goog.events.Event} e Resize event to handle.
- * @protected
- */
- goog.ui.DimensionPicker.prototype.handleWindowResize = function(e) {
- this.getRenderer().positionMouseCatcher(this);
- };
- /**
- * Handle key events if supported, so the user can use the keyboard to
- * manipulate the highlighted rows and columns.
- * @param {goog.events.KeyEvent} e The key event object.
- * @return {boolean} Whether the key event was handled.
- * @override
- */
- goog.ui.DimensionPicker.prototype.handleKeyEvent = function(e) {
- var rows = this.highlightedRows_;
- var columns = this.highlightedColumns_;
- switch (e.keyCode) {
- case goog.events.KeyCodes.DOWN:
- rows++;
- break;
- case goog.events.KeyCodes.UP:
- rows--;
- break;
- case goog.events.KeyCodes.LEFT:
- if (this.isRightToLeft()) {
- columns++;
- } else {
- if (columns == 1) {
- // Delegate to parent.
- return false;
- } else {
- columns--;
- }
- }
- break;
- case goog.events.KeyCodes.RIGHT:
- if (this.isRightToLeft()) {
- if (columns == 1) {
- // Delegate to parent.
- return false;
- } else {
- columns--;
- }
- } else {
- columns++;
- }
- break;
- default:
- return goog.ui.DimensionPicker.superClass_.handleKeyEvent.call(this, e);
- }
- this.setValue(columns, rows);
- return true;
- };
- // Palette management.
- /**
- * @return {goog.math.Size} Current table size shown (columns x rows).
- */
- goog.ui.DimensionPicker.prototype.getSize = function() {
- return this.size_;
- };
- /**
- * @return {!goog.math.Size} size The currently highlighted dimensions.
- */
- goog.ui.DimensionPicker.prototype.getValue = function() {
- return new goog.math.Size(this.highlightedColumns_, this.highlightedRows_);
- };
- /**
- * Sets the currently highlighted dimensions. If the dimensions are not valid
- * (not between 1 and the maximum number of columns/rows to show), they will
- * be changed to the closest valid value.
- * @param {(number|!goog.math.Size)} columns The number of columns to highlight,
- * or a goog.math.Size object containing both.
- * @param {number=} opt_rows The number of rows to highlight. Can be
- * omitted when columns is a good.math.Size object.
- */
- goog.ui.DimensionPicker.prototype.setValue = function(columns, opt_rows) {
- if (!goog.isDef(opt_rows)) {
- columns = /** @type {!goog.math.Size} */ (columns);
- opt_rows = columns.height;
- columns = columns.width;
- } else {
- columns = /** @type {number} */ (columns);
- }
- // Ensure that the row and column values are within the minimum value (1) and
- // maxmimum values.
- columns = Math.max(1, columns);
- opt_rows = Math.max(1, opt_rows);
- columns = Math.min(this.maxColumns, columns);
- opt_rows = Math.min(this.maxRows, opt_rows);
- if (this.highlightedColumns_ != columns ||
- this.highlightedRows_ != opt_rows) {
- var renderer = this.getRenderer();
- // Show one more row/column than highlighted so the user understands the
- // palette can grow.
- this.size_.width =
- Math.max(Math.min(columns + 1, this.maxColumns), this.minColumns);
- this.size_.height =
- Math.max(Math.min(opt_rows + 1, this.maxRows), this.minRows);
- renderer.updateSize(this, this.getElement());
- this.highlightedColumns_ = columns;
- this.highlightedRows_ = opt_rows;
- renderer.setHighlightedSize(this, columns, opt_rows);
- }
- };
- /**
- * Register this control so it can be created from markup
- */
- goog.ui.registry.setDecoratorByClassName(
- goog.ui.DimensionPickerRenderer.CSS_CLASS,
- function() { return new goog.ui.DimensionPicker(); });
|