Index: chrome/browser/resources/shared/js/cr/ui/list_selection_controller.js |
=================================================================== |
--- chrome/browser/resources/shared/js/cr/ui/list_selection_controller.js (revision 177292) |
+++ chrome/browser/resources/shared/js/cr/ui/list_selection_controller.js (working copy) |
@@ -1,286 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-cr.define('cr.ui', function() { |
- /** |
- * Creates a selection controller that is to be used with lists. This is |
- * implemented for vertical lists but changing the behavior for horizontal |
- * lists or icon views is a matter of overriding {@code getIndexBefore}, |
- * {@code getIndexAfter}, {@code getIndexAbove} as well as |
- * {@code getIndexBelow}. |
- * |
- * @param {cr.ui.ListSelectionModel} selectionModel The selection model to |
- * interact with. |
- * |
- * @constructor |
- * @extends {!cr.EventTarget} |
- */ |
- function ListSelectionController(selectionModel) { |
- this.selectionModel_ = selectionModel; |
- } |
- |
- ListSelectionController.prototype = { |
- |
- /** |
- * The selection model we are interacting with. |
- * @type {cr.ui.ListSelectionModel} |
- */ |
- get selectionModel() { |
- return this.selectionModel_; |
- }, |
- |
- /** |
- * Returns the index below (y axis) the given element. |
- * @param {number} index The index to get the index below. |
- * @return {number} The index below or -1 if not found. |
- */ |
- getIndexBelow: function(index) { |
- if (index == this.getLastIndex()) |
- return -1; |
- return index + 1; |
- }, |
- |
- /** |
- * Returns the index above (y axis) the given element. |
- * @param {number} index The index to get the index above. |
- * @return {number} The index below or -1 if not found. |
- */ |
- getIndexAbove: function(index) { |
- return index - 1; |
- }, |
- |
- /** |
- * Returns the index before (x axis) the given element. This returns -1 |
- * by default but override this for icon view and horizontal selection |
- * models. |
- * |
- * @param {number} index The index to get the index before. |
- * @return {number} The index before or -1 if not found. |
- */ |
- getIndexBefore: function(index) { |
- return -1; |
- }, |
- |
- /** |
- * Returns the index after (x axis) the given element. This returns -1 |
- * by default but override this for icon view and horizontal selection |
- * models. |
- * |
- * @param {number} index The index to get the index after. |
- * @return {number} The index after or -1 if not found. |
- */ |
- getIndexAfter: function(index) { |
- return -1; |
- }, |
- |
- /** |
- * Returns the next list index. This is the next logical and should not |
- * depend on any kind of layout of the list. |
- * @param {number} index The index to get the next index for. |
- * @return {number} The next index or -1 if not found. |
- */ |
- getNextIndex: function(index) { |
- if (index == this.getLastIndex()) |
- return -1; |
- return index + 1; |
- }, |
- |
- /** |
- * Returns the prevous list index. This is the previous logical and should |
- * not depend on any kind of layout of the list. |
- * @param {number} index The index to get the previous index for. |
- * @return {number} The previous index or -1 if not found. |
- */ |
- getPreviousIndex: function(index) { |
- return index - 1; |
- }, |
- |
- /** |
- * @return {number} The first index. |
- */ |
- getFirstIndex: function() { |
- return 0; |
- }, |
- |
- /** |
- * @return {number} The last index. |
- */ |
- getLastIndex: function() { |
- return this.selectionModel.length - 1; |
- }, |
- |
- /** |
- * Called by the view when the user does a mousedown or mouseup on the |
- * list. |
- * @param {!Event} e The browser mouse event. |
- * @param {number} index The index that was under the mouse pointer, -1 if |
- * none. |
- */ |
- handlePointerDownUp: function(e, index) { |
- var sm = this.selectionModel; |
- var anchorIndex = sm.anchorIndex; |
- var isDown = (e.type == 'mousedown'); |
- |
- sm.beginChange(); |
- |
- if (index == -1) { |
- // On Mac we always clear the selection if the user clicks a blank area. |
- // On Windows, we only clear the selection if neither Shift nor Ctrl are |
- // pressed. |
- if (cr.isMac || cr.isChromeOS) { |
- sm.leadIndex = sm.anchorIndex = -1; |
- sm.unselectAll(); |
- } else if (!isDown && !e.shiftKey && !e.ctrlKey) |
- // Keep anchor and lead indexes. Note that this is intentionally |
- // different than on the Mac. |
- if (sm.multiple) |
- sm.unselectAll(); |
- } else { |
- if (sm.multiple && (cr.isMac ? e.metaKey : |
- (e.ctrlKey && !e.shiftKey))) { |
- // Selection is handled at mouseUp on windows/linux, mouseDown on mac. |
- if (cr.isMac ? isDown : !isDown) { |
- // Toggle the current one and make it anchor index. |
- sm.setIndexSelected(index, !sm.getIndexSelected(index)); |
- sm.leadIndex = index; |
- sm.anchorIndex = index; |
- } |
- } else if (e.shiftKey && anchorIndex != -1 && anchorIndex != index) { |
- // Shift is done in mousedown. |
- if (isDown) { |
- sm.unselectAll(); |
- sm.leadIndex = index; |
- if (sm.multiple) |
- sm.selectRange(anchorIndex, index); |
- else |
- sm.setIndexSelected(index, true); |
- } |
- } else { |
- // Right click for a context menu needs to not clear the selection. |
- var isRightClick = e.button == 2; |
- |
- // If the index is selected this is handled in mouseup. |
- var indexSelected = sm.getIndexSelected(index); |
- if ((indexSelected && !isDown || !indexSelected && isDown) && |
- !(indexSelected && isRightClick)) { |
- sm.selectedIndex = index; |
- } |
- } |
- } |
- |
- sm.endChange(); |
- }, |
- |
- /** |
- * Called by the view when it receives a keydown event. |
- * @param {Event} e The keydown event. |
- */ |
- handleKeyDown: function(e) { |
- var SPACE_KEY_CODE = 32; |
- var tagName = e.target.tagName; |
- // If focus is in an input field of some kind, only handle navigation keys |
- // that aren't likely to conflict with input interaction (e.g., text |
- // editing, or changing the value of a checkbox or select). |
- if (tagName == 'INPUT') { |
- var inputType = e.target.type; |
- // Just protect space (for toggling) for checkbox and radio. |
- if (inputType == 'checkbox' || inputType == 'radio') { |
- if (e.keyCode == SPACE_KEY_CODE) |
- return; |
- // Protect all but the most basic navigation commands in anything else. |
- } else if (e.keyIdentifier != 'Up' && e.keyIdentifier != 'Down') { |
- return; |
- } |
- } |
- // Similarly, don't interfere with select element handling. |
- if (tagName == 'SELECT') |
- return; |
- |
- var sm = this.selectionModel; |
- var newIndex = -1; |
- var leadIndex = sm.leadIndex; |
- var prevent = true; |
- |
- // Ctrl/Meta+A |
- if (sm.multiple && e.keyCode == 65 && |
- (cr.isMac && e.metaKey || !cr.isMac && e.ctrlKey)) { |
- sm.selectAll(); |
- e.preventDefault(); |
- return; |
- } |
- |
- // Space |
- if (e.keyCode == SPACE_KEY_CODE) { |
- if (leadIndex != -1) { |
- var selected = sm.getIndexSelected(leadIndex); |
- if (e.ctrlKey || !selected) { |
- sm.setIndexSelected(leadIndex, !selected || !sm.multiple); |
- return; |
- } |
- } |
- } |
- |
- switch (e.keyIdentifier) { |
- case 'Home': |
- newIndex = this.getFirstIndex(); |
- break; |
- case 'End': |
- newIndex = this.getLastIndex(); |
- break; |
- case 'Up': |
- newIndex = leadIndex == -1 ? |
- this.getLastIndex() : this.getIndexAbove(leadIndex); |
- break; |
- case 'Down': |
- newIndex = leadIndex == -1 ? |
- this.getFirstIndex() : this.getIndexBelow(leadIndex); |
- break; |
- case 'Left': |
- newIndex = leadIndex == -1 ? |
- this.getLastIndex() : this.getIndexBefore(leadIndex); |
- break; |
- case 'Right': |
- newIndex = leadIndex == -1 ? |
- this.getFirstIndex() : this.getIndexAfter(leadIndex); |
- break; |
- default: |
- prevent = false; |
- } |
- |
- if (newIndex != -1) { |
- sm.beginChange(); |
- |
- sm.leadIndex = newIndex; |
- if (e.shiftKey) { |
- var anchorIndex = sm.anchorIndex; |
- if (sm.multiple) |
- sm.unselectAll(); |
- if (anchorIndex == -1) { |
- sm.setIndexSelected(newIndex, true); |
- sm.anchorIndex = newIndex; |
- } else { |
- sm.selectRange(anchorIndex, newIndex); |
- } |
- } else if (e.ctrlKey && !cr.isMac && !cr.isChromeOS) { |
- // Setting the lead index is done above. |
- // Mac does not allow you to change the lead. |
- } else { |
- if (sm.multiple) |
- sm.unselectAll(); |
- sm.setIndexSelected(newIndex, true); |
- sm.anchorIndex = newIndex; |
- } |
- |
- sm.endChange(); |
- |
- if (prevent) |
- e.preventDefault(); |
- } |
- } |
- }; |
- |
- return { |
- ListSelectionController: ListSelectionController |
- }; |
-}); |