Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(849)

Unified Diff: chrome/browser/resources/file_manager/js/combobutton.js

Issue 10411018: [FileBrowser] Added DefaultAction dialog to choose default action. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed comments. Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 {

Powered by Google App Engine
This is Rietveld 408576698