Index: chrome/browser/resources/file_manager/js/combobutton.js |
diff --git a/chrome/browser/resources/file_manager/js/combobutton.js b/chrome/browser/resources/file_manager/js/combobutton.js |
index f4ab5f0a87cab5f1e0f77ed538760f30e0fb3706..7c2fcf1711cdf191664594f21a177764b4ba2cf5 100644 |
--- a/chrome/browser/resources/file_manager/js/combobutton.js |
+++ b/chrome/browser/resources/file_manager/js/combobutton.js |
@@ -8,154 +8,133 @@ |
cr.define('cr.ui', function() { |
/** |
- * Sets minWidth for the target, so it's visually as large as source. |
- * @param {HTMLElement} target Element which min-width to tune. |
- * @param {HTMLElement} source Element, which width to use. |
- */ |
- function enlarge(target, source) { |
- var cs = target.ownerDocument.defaultView.getComputedStyle(target); |
- target.style.minWidth = (source.getBoundingClientRect().width - |
- parseFloat(cs.borderLeftWidth) - |
- parseFloat(cs.borderRightWidth)) + 'px'; |
- } |
- |
- /** |
* Creates a new combobutton element. |
* @param {Object=} opt_propertyBag Optional properties. |
* @constructor |
* @extends {HTMLUListElement} |
*/ |
- var ComboButton = cr.ui.define('div'); |
+ var ComboButton = cr.ui.define(cr.ui.MenuButton); |
+ |
ComboButton.prototype = { |
- __proto__: HTMLDivElement.prototype, |
+ __proto__: cr.ui.MenuButton.prototype, |
+ |
+ defaultItem_: null, |
/** |
- * The items list. |
+ * Truncates drop-down list. |
*/ |
- items_: null, |
- |
clear: function() { |
- if (this.items_.length > 0) |
- // Remove default combobox item if we have added it at addItem. |
- this.removeChild(this.firstChild); |
- |
- this.items_ = []; |
- this.popup_.textContent = ''; |
+ this.menu.clear(); |
this.multiple = false; |
- this.popup_.style.minWidth = ''; |
}, |
- addItem: function(item) { |
- this.items_.push(item); |
- if (this.items_.length == 1) { |
- // Set first added item as default on combobox. |
- // First item should be the first element to prepend drop-down arrow and |
- // popup layer. |
- this.insertBefore(item, this.firstChild); |
+ addDropDownItem: function(item) { |
+ this.multiple = true; |
+ this.menu.addMenuItem(item).data = item; |
+ }, |
+ |
+ /** |
+ * Adds separator to drop-down list. |
+ */ |
+ addSeparator: function() { |
+ this.menu.addSeparator(); |
+ }, |
+ |
+ /** |
+ * Default item to fire on combobox click |
+ */ |
+ get defaultItem() { |
+ return this.defaultItem_; |
+ }, |
+ set defaultItem(defaultItem) { |
+ this.defaultItem_ = defaultItem; |
+ if (defaultItem.label) { |
+ this.labelNode_.textContent = defaultItem.label; |
} else { |
- this.multiple = true; |
- if (this.popup_.hasChildNodes()) |
- this.popup_.insertBefore(item, this.popup_.firstChild); |
- else |
- this.popup_.appendChild(item); |
- if (this.visible) |
- this.setPopupSize_(); |
+ this.labelNode_.textContent = ''; |
} |
- }, |
- setPopupSize_: function() { |
- this.popup_.style.bottom = (this.clientHeight + 1) + 'px'; |
- enlarge(this.popup_, this); |
+ if (defaultItem.iconUrl) { |
+ this.iconNode_.src = defaultItem.iconUrl; |
+ } else { |
+ this.iconNode_.src = ''; |
+ } |
}, |
/** |
* Initializes the element. |
*/ |
decorate: function() { |
- this.items_ = []; |
+ cr.ui.MenuButton.prototype.decorate.call(this); |
this.classList.add('combobutton'); |
+ this.iconNode_ = this.ownerDocument.createElement('img'); |
+ this.appendChild(this.iconNode_); |
+ |
+ this.labelNode_ = this.ownerDocument.createElement('span'); |
+ this.appendChild(this.labelNode_); |
+ |
var triggerIcon = this.ownerDocument.createElement('span'); |
triggerIcon.className = 'disclosureindicator'; |
this.trigger_ = this.ownerDocument.createElement('div'); |
this.trigger_.appendChild(triggerIcon); |
- this.popup_ = this.ownerDocument.createElement('div'); |
- this.popup_.className = 'popup'; |
- |
this.appendChild(this.trigger_); |
- this.appendChild(this.popup_); |
- this.addEventListener('click', |
- this.handleButtonClick_.bind(this)); |
- this.popup_.addEventListener('click', |
- this.handlePopupClick_.bind(this)); |
+ this.addEventListener('click', this.handleButtonClick_.bind(this)); |
+ |
this.trigger_.addEventListener('click', |
this.handleTriggerClicked_.bind(this)); |
- this.addEventListener('mouseout', this.handleMouseOut_.bind(this)); |
- this.visible = true; |
- }, |
+ this.menu.addEventListener('activate', |
+ this.handleMenuActivate_.bind(this)); |
- handleTriggerClicked_: function(event) { |
- this.open = !this.open; |
- event.stopPropagation(); |
+ // Remove mousedown event listener created by MenuButton::decorate, |
+ // and move it down to trigger_. |
+ this.removeEventListener('mousedown', this); |
+ this.trigger_.addEventListener('mousedown', this); |
}, |
- handleMouseOut_: function(event) { |
- var x = event.x; |
- var y = event.y; |
- |
- var children = this.childNodes; |
- for (var i = 0; i < children.length; i++) |
- { |
- var r = this.children[i].getBoundingClientRect(); |
- if (x >= r.left && x <= r.right && y >= r.top && y <= r.bottom) |
- return; |
+ /** |
+ * Handles the keydown event for the menu button. |
+ */ |
+ handleKeyDown: function(e) { |
+ switch (e.keyIdentifier) { |
+ case 'Down': |
+ case 'Up': |
+ if (!this.isMenuShown()) |
+ this.showMenu(); |
+ e.preventDefault(); |
+ break; |
+ case 'Esc': |
+ case 'U+001B': // Maybe this is remote desktop playing a prank? |
+ this.hideMenu(); |
+ break; |
} |
- |
- this.open = false; |
}, |
- handleButtonClick_: function(event) { |
- this.dispatchSelectEvent(this.items_[0]); |
+ handleTriggerClicked_: function(event) { |
+ event.stopPropagation(); |
}, |
- handlePopupClick_: function(event) { |
- var item = event.target; |
- while (item && item.parentNode != this.popup_) |
- item = item.parentNode; |
- if (!item) |
- return; |
+ handleMenuActivate_: function(event) { |
+ this.dispatchSelectEvent(event.target.data); |
+ }, |
- this.open = false; |
- this.dispatchSelectEvent(item); |
- event.stopPropagation(); |
+ handleButtonClick_: function() { |
+ this.dispatchSelectEvent(this.defaultItem_); |
}, |
dispatchSelectEvent: function(item) { |
var selectEvent = new Event('select'); |
selectEvent.item = item; |
this.dispatchEvent(selectEvent); |
- }, |
- |
- get visible() { |
- return this.hasAttribute('visible'); |
- }, |
- set visible(value) { |
- if (value) { |
- this.setAttribute('visible', 'visible'); |
- setTimeout(this.setPopupSize_.bind(this), 0); |
- } else { |
- this.removeAttribute('visible'); |
- } |
} |
}; |
cr.defineProperty(ComboButton, 'disabled', cr.PropertyKind.BOOL_ATTR); |
- cr.defineProperty(ComboButton, 'open', cr.PropertyKind.BOOL_ATTR); |
cr.defineProperty(ComboButton, 'multiple', cr.PropertyKind.BOOL_ATTR); |
return { |