172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file. 4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen/** 772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * @fileoverview This implements a tab control. 872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * 972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * An individual tab within a tab control is, unsurprisingly, a Tab. 1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Tabs must be explicitly added/removed from the control. 1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Tab titles are based on the label attribute of each child: 1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * 1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * <div> 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * <div label='Tab 1'>Hello</div> 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * <div label='Tab 2'>World</div> 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * </div> 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Results in: 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * 2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * --------------- 2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * | Tab1 | Tab2 | 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * | --------------------------------------- 2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * | Hello World | 2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * ----------------------------------------- 2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * 2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */ 2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsencr.define('gpu', function() { 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /** 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Creates a new tab element. A tab element is one of multiple tabs 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * within a TabControl. 3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * @constructor 3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * @param {Object=} opt_propertyBag Optional properties. 3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * @extends {HTMLDivElement} 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */ 3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen var Tab = cr.ui.define('div'); 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Tab.prototype = { 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen __proto__: HTMLDivElement.prototype, 3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen decorate: function() { 4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen }; 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /** 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Title for the tab. 4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * @type {String} 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */ 4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen cr.defineProperty(Tab, 'label', cr.PropertyKind.ATTR); 4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /** 5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Whether the item is selected. 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * @type {boolean} 5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */ 5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen cr.defineProperty(Tab, 'selected', cr.PropertyKind.BOOL_ATTR); 5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /** 5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Creates a new tab button element in the tabstrip 5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * @constructor 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * @param {Object=} opt_propertyBag Optional properties. 6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * @extends {HTMLDivElement} 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */ 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen var TabButton = cr.ui.define('a'); 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TabButton.prototype = { 6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen __proto__: HTMLAnchorElement.prototype, 6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen decorate: function() { 6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.classList.add('tab-button'); 6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.onclick = function() { 7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (this.tab_) 7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.parentNode.parentNode.selectedTab = this.tab_; 7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen }.bind(this); 7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen }, 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen get tab() { 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return this.tab_; 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen }, 7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen set tab(tab) { 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (this.tab_) 7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen throw Error('Cannot set tab once set.'); 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.tab_ = tab; 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.tab_.addEventListener('titleChange', this.onTabChanged_.bind(this)); 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.tab_.addEventListener('selectedChange', 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.onTabChanged_.bind(this)); 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.onTabChanged_(); 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen }, 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen onTabChanged_: function(e) { 8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (this.tab_) { 8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.textContent = this.tab_.label; 9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.selected = this.tab_.selected; 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen }; 9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /** 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Whether the TabButton is selected. 9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * @type {boolean} 9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */ 10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen cr.defineProperty(TabButton, 'selected', cr.PropertyKind.BOOL_ATTR); 10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /** 10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Creates a new tab control element. 10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * @param {Object=} opt_propertyBag Optional properties. 10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * @constructor 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * @extends {HTMLDivElement} 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */ 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen var TabControl = cr.ui.define('div'); 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TabControl.prototype = { 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen __proto__: HTMLDivElement.prototype, 11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen selectedTab_: null, 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /** 11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Initializes the tab control element. 11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Any child elements pre-existing on the element will become tabs. 11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */ 11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen decorate: function() { 12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.classList.add('tab-control'); 12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.tabStrip_ = this.ownerDocument.createElement('div'); 12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.tabStrip_.classList.add('tab-strip'); 12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.tabs_ = this.ownerDocument.createElement('div'); 12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.tabs_.classList.add('tabs'); 12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.insertBefore(this.tabs_, this.firstChild); 12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.insertBefore(this.tabStrip_, this.firstChild); 13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.boundOnTabSelectedChange_ = this.onTabSelectedChange_.bind(this); 13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Reparent existing tabs to the tabs_ div. 13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen while (this.children.length > 2) 13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.addTab(this.children[2]); 13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen }, 13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /** 13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Adds an element to the tab control. 14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */ 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen addTab: function(tab) { 14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (tab.parentNode == this.tabs_) 14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen throw Error('Tab is already part of this control.'); 14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!(tab instanceof Tab)) 14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen throw Error('Provided element is not instanceof Tab.'); 14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.tabs_.appendChild(tab); 14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab.addEventListener('selectedChange', this.boundOnTabSelectedChange_); 14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen var button = new TabButton(); 15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen button.tab = tab; 15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab.tabStripButton_ = button; 15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.tabStrip_.appendChild(button); 15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (this.tabs_.length == 1) 15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.tabs_.children[0].selected = true; 15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen }, 15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /** 16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Removes a tab from the tab control. 16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * changing the selected tab if needed. 16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */ 164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen removeTab: function(tab) { 16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (tab.parentNode != this.tabs_) 16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen throw new Error('Tab is not attached to this control.'); 16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab.removeEventListener('selectedChange', this.boundOnTabSelectedChange_); 16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (this.selectedTab_ == tab) { 17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (this.tabs_.children.length) { 17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.tabs_.children[0].selected = true; 17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else { 17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.selectedTab_ = undefined; 17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.tabs_.removeChild(tab); 17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab.tabStripButton_.parentNode.removeChild( 180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tab.tabStripButton_); 18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen }, 18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /** 18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Gets the currently selected tab element. 18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */ 18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen get selectedTab() { 18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return this.selectedTab_; 18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen }, 18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /** 19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Sets the currently selected tab element. 19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */ 19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen set selectedTab(tab) { 19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (tab.parentNode != this.tabs_) 195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen throw Error('Tab is not part of this TabControl.'); 19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab.selected = true; 19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen }, 19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /** 20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Hides the previously selected tab element and dispatches a 20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * 'selectedTabChanged' event. 20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */ 20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen onTabSelectedChange_: function(e) { 20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen var tab = e.target; 20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!e.newValue) { 20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Usually we can ignore this event, as the tab becoming unselected 20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // needs no corrective action. However, if the currently selected 20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // tab is deselected, we do need to do some work. 20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (tab == this.selectedTab_) { 21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen var previousTab = this.selectedTab_; 21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen var newTab; 21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (var i = 0; i < this.tabs_.children.length; ++i) { 21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (this.tabs_.children[i] != tab) { 21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen newTab = this.tabs_.children[i]; 21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (newTab) { 21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen newTab.selected = true; 22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else { 22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.selectedTab_ = undefined; 22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen cr.dispatchPropertyChange( 22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this, 'selectedTab', this.selectedTab_, previousTab); 22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else { 22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen var previousTab = this.selectedTab_; 22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.selectedTab_ = tab; 22972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (previousTab) 23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen previousTab.selected = false; 23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen cr.dispatchPropertyChange( 23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this, 'selectedTab', this.selectedTab_, previousTab); 23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen }, 23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /** 23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Returns an array of all the tabs within this control. This is 23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * not the same as this.children because the actual tab elements are 23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * attached to the tabs_ element. 24072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */ 24172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen get tabs() { 24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return Array.prototype.slice.call(this.tabs_.children); 24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen }; 24572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 24672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return { 247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Tab: Tab, 24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TabControl: TabControl 24972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen }; 250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}); 251