aboutsummaryrefslogtreecommitdiff
path: root/contexts/data/lib/closure-library/closure/goog/ui/tree/typeahead.js
diff options
context:
space:
mode:
Diffstat (limited to 'contexts/data/lib/closure-library/closure/goog/ui/tree/typeahead.js')
-rw-r--r--contexts/data/lib/closure-library/closure/goog/ui/tree/typeahead.js332
1 files changed, 0 insertions, 332 deletions
diff --git a/contexts/data/lib/closure-library/closure/goog/ui/tree/typeahead.js b/contexts/data/lib/closure-library/closure/goog/ui/tree/typeahead.js
deleted file mode 100644
index 60b3520..0000000
--- a/contexts/data/lib/closure-library/closure/goog/ui/tree/typeahead.js
+++ /dev/null
@@ -1,332 +0,0 @@
-// Copyright 2007 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 Provides the typeahead functionality for the tree class.
- *
- */
-
-goog.provide('goog.ui.tree.TypeAhead');
-goog.provide('goog.ui.tree.TypeAhead.Offset');
-
-goog.require('goog.array');
-goog.require('goog.events.KeyCodes');
-goog.require('goog.string');
-goog.require('goog.structs.Trie');
-
-
-
-/**
- * Constructs a TypeAhead object.
- * @constructor
- */
-goog.ui.tree.TypeAhead = function() {
- this.nodeMap_ = new goog.structs.Trie();
-};
-
-
-/**
- * Map of tree nodes to allow for quick access by characters in the label text.
- * @type {goog.structs.Trie}
- * @private
- */
-goog.ui.tree.TypeAhead.prototype.nodeMap_;
-
-
-/**
- * Buffer for storing typeahead characters.
- * @type {string}
- * @private
- */
-goog.ui.tree.TypeAhead.prototype.buffer_ = '';
-
-
-/**
- * Matching labels from the latest typeahead search.
- * @type {Array.<string>?}
- * @private
- */
-goog.ui.tree.TypeAhead.prototype.matchingLabels_ = null;
-
-
-/**
- * Matching nodes from the latest typeahead search. Used when more than
- * one node is present with the same label text.
- * @type {Array.<goog.ui.tree.BaseNode>?}
- * @private
- */
-goog.ui.tree.TypeAhead.prototype.matchingNodes_ = null;
-
-
-/**
- * Specifies the current index of the label from the latest typeahead search.
- * @type {number}
- * @private
- */
-goog.ui.tree.TypeAhead.prototype.matchingLabelIndex_ = 0;
-
-
-/**
- * Specifies the index into matching nodes when more than one node is found
- * with the same label.
- * @type {number}
- * @private
- */
-goog.ui.tree.TypeAhead.prototype.matchingNodeIndex_ = 0;
-
-
-/**
- * Enum for offset values that are used for ctrl-key navigation among the
- * multiple matches of a given typeahead buffer.
- *
- * @enum {number}
- */
-goog.ui.tree.TypeAhead.Offset = {
- DOWN: 1,
- UP: -1
-};
-
-
-/**
- * Handles navigation keys.
- * @param {goog.events.BrowserEvent} e The browser event.
- * @return {boolean} The handled value.
- */
-goog.ui.tree.TypeAhead.prototype.handleNavigation = function(e) {
- var handled = false;
-
- switch (e.keyCode) {
- // Handle ctrl+down, ctrl+up to navigate within typeahead results.
- case goog.events.KeyCodes.DOWN:
- case goog.events.KeyCodes.UP:
- if (e.ctrlKey) {
- this.jumpTo_(e.keyCode == goog.events.KeyCodes.DOWN ?
- goog.ui.tree.TypeAhead.Offset.DOWN :
- goog.ui.tree.TypeAhead.Offset.UP);
- handled = true;
- }
- break;
-
- // Remove the last typeahead char.
- case goog.events.KeyCodes.BACKSPACE:
- var length = this.buffer_.length - 1;
- handled = true;
- if (length > 0) {
- this.buffer_ = this.buffer_.substring(0, length);
- this.jumpToLabel_(this.buffer_);
- } else if (length == 0) {
- // Clear the last character in typeahead.
- this.buffer_ = '';
- } else {
- handled = false;
- }
- break;
-
- // Clear typeahead buffer.
- case goog.events.KeyCodes.ESC:
- this.buffer_ = '';
- handled = true;
- break;
- }
-
- return handled;
-};
-
-
-/**
- * Handles the character presses.
- * @param {goog.events.BrowserEvent} e The browser event.
- * Expected event type is goog.events.KeyHandler.EventType.KEY.
- * @return {boolean} The handled value.
- */
-goog.ui.tree.TypeAhead.prototype.handleTypeAheadChar = function(e) {
- var handled = false;
-
- if (!e.ctrlKey && !e.altKey) {
- // Since goog.structs.Trie.getKeys compares characters during
- // lookup, we should use charCode instead of keyCode where possible.
- // Convert to lowercase, typeahead is case insensitive.
- var ch = String.fromCharCode(e.charCode || e.keyCode).toLowerCase();
- if (goog.string.isUnicodeChar(ch) && (ch != ' ' || this.buffer_)) {
- this.buffer_ += ch;
- handled = this.jumpToLabel_(this.buffer_);
- }
- }
-
- return handled;
-};
-
-
-/**
- * Adds or updates the given node in the nodemap. The label text is used as a
- * key and the node id is used as a value. In the case that the key already
- * exists, such as when more than one node exists with the same label, then this
- * function creates an array to hold the multiple nodes.
- * @param {goog.ui.tree.BaseNode} node Node to be added or updated.
- */
-goog.ui.tree.TypeAhead.prototype.setNodeInMap = function(node) {
- var labelText = node.getText();
- if (labelText && !goog.string.isEmptySafe(labelText)) {
- // Typeahead is case insensitive, convert to lowercase.
- labelText = labelText.toLowerCase();
-
- var previousValue = this.nodeMap_.get(labelText);
- if (previousValue) {
- // Found a previously created array, add the given node.
- previousValue.push(node);
- } else {
- // Create a new array and set the array as value.
- var nodeList = [node];
- this.nodeMap_.set(labelText, nodeList);
- }
- }
-};
-
-
-/**
- * Removes the given node from the nodemap.
- * @param {goog.ui.tree.BaseNode} node Node to be removed.
- */
-goog.ui.tree.TypeAhead.prototype.removeNodeFromMap = function(node) {
- var labelText = node.getText();
- if (labelText && !goog.string.isEmptySafe(labelText)) {
- labelText = labelText.toLowerCase();
-
- var nodeList = /** @type {Array} */ (this.nodeMap_.get(labelText));
- if (nodeList) {
- // Remove the node from the array.
- goog.array.remove(nodeList, node);
- if (!!nodeList.length) {
- this.nodeMap_.remove(labelText);
- }
- }
- }
-};
-
-
-/**
- * Select the first matching node for the given typeahead.
- * @param {string} typeAhead Typeahead characters to match.
- * @return {boolean} True iff a node is found.
- * @private
- */
-goog.ui.tree.TypeAhead.prototype.jumpToLabel_ = function(typeAhead) {
- var handled = false;
- var labels = this.nodeMap_.getKeys(typeAhead);
-
- // Make sure we have at least one matching label.
- if (labels && labels.length) {
- this.matchingNodeIndex_ = 0;
- this.matchingLabelIndex_ = 0;
-
- var nodes = /** @type {Array} */ (this.nodeMap_.get(labels[0]));
- if ((handled = this.selectMatchingNode_(nodes))) {
- this.matchingLabels_ = labels;
- }
- }
-
- // TODO(user): beep when no node is found
- return handled;
-};
-
-
-/**
- * Select the next or previous node based on the offset.
- * @param {goog.ui.tree.TypeAhead.Offset} offset DOWN or UP.
- * @return {boolean} Whether a node is found.
- * @private
- */
-goog.ui.tree.TypeAhead.prototype.jumpTo_ = function(offset) {
- var handled = false;
- var labels = this.matchingLabels_;
-
- if (labels) {
- var nodes = null;
- var nodeIndexOutOfRange = false;
-
- // Navigate within the nodes array.
- if (this.matchingNodes_) {
- var newNodeIndex = this.matchingNodeIndex_ + offset;
- if (newNodeIndex >= 0 && newNodeIndex < this.matchingNodes_.length) {
- this.matchingNodeIndex_ = newNodeIndex;
- nodes = this.matchingNodes_;
- } else {
- nodeIndexOutOfRange = true;
- }
- }
-
- // Navigate to the next or previous label.
- if (!nodes) {
- var newLabelIndex = this.matchingLabelIndex_ + offset;
- if (newLabelIndex >= 0 && newLabelIndex < labels.length) {
- this.matchingLabelIndex_ = newLabelIndex;
- }
-
- if (labels.length > this.matchingLabelIndex_) {
- nodes = /** @type {Array} */ (this.nodeMap_.get(
- labels[this.matchingLabelIndex_]));
- }
-
- // Handle the case where we are moving beyond the available nodes,
- // while going UP select the last item of multiple nodes with same label
- // and while going DOWN select the first item of next set of nodes
- if (nodes && nodes.length && nodeIndexOutOfRange) {
- this.matchingNodeIndex_ = (offset == goog.ui.tree.TypeAhead.Offset.UP) ?
- nodes.length - 1 : 0;
- }
- }
-
- if ((handled = this.selectMatchingNode_(nodes))) {
- this.matchingLabels_ = labels;
- }
- }
-
- // TODO(user): beep when no node is found
- return handled;
-};
-
-
-/**
- * Given a nodes array reveals and selects the node while using node index.
- * @param {Array.<goog.ui.tree.BaseNode>?} nodes Nodes array to select the
- * node from.
- * @return {boolean} Whether a matching node was found.
- * @private
- */
-goog.ui.tree.TypeAhead.prototype.selectMatchingNode_ = function(nodes) {
- var node;
-
- if (nodes) {
- // Find the matching node.
- if (this.matchingNodeIndex_ < nodes.length) {
- node = nodes[this.matchingNodeIndex_];
- this.matchingNodes_ = nodes;
- }
-
- if (node) {
- node.reveal();
- node.select();
- }
- }
-
- return !!node;
-};
-
-
-/**
- * Clears the typeahead buffer.
- */
-goog.ui.tree.TypeAhead.prototype.clear = function() {
- this.buffer_ = '';
-};