Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 /** | 5 /** |
| 6 * Controller and View for switching between tabs. | 6 * Controller and View for switching between tabs. |
| 7 * | 7 * |
| 8 * The View part of TabSwitcherView displays the contents of the currently | 8 * The View part of TabSwitcherView displays the contents of the currently |
| 9 * selected tab (only one tab can be active at a time). | 9 * selected tab (only one tab can be active at a time). |
| 10 * | 10 * |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 24 * | 24 * |
| 25 * @param {?Function} opt_onTabSwitched Optional callback to run when the | 25 * @param {?Function} opt_onTabSwitched Optional callback to run when the |
| 26 * active tab changes. Called as | 26 * active tab changes. Called as |
| 27 * opt_onTabSwitched(oldTabId, newTabId). | 27 * opt_onTabSwitched(oldTabId, newTabId). |
| 28 */ | 28 */ |
| 29 function TabSwitcherView(opt_onTabSwitched) { | 29 function TabSwitcherView(opt_onTabSwitched) { |
| 30 assertFirstConstructorCall(TabSwitcherView); | 30 assertFirstConstructorCall(TabSwitcherView); |
| 31 | 31 |
| 32 this.tabIdToView_ = {}; | 32 this.tabIdToView_ = {}; |
| 33 this.tabIdToLink_ = {}; | 33 this.tabIdToLink_ = {}; |
| 34 // Ordered list of views. | 34 // Map from tab id to the views link visiblity. |
| 35 this.viewList_ = []; | 35 this.tabIdsLinkVisibility_ = new Map(); |
| 36 this.activeTabId_ = null; | 36 this.activeTabId_ = null; |
| 37 | 37 |
| 38 this.onTabSwitched_ = opt_onTabSwitched; | 38 this.onTabSwitched_ = opt_onTabSwitched; |
| 39 | 39 |
| 40 // The ideal width of the tab list. If width is reduced below this, the | 40 // The ideal width of the tab list. If width is reduced below this, the |
| 41 // tab list will be shrunk, but it will be returned to this width once it | 41 // tab list will be shrunk, but it will be returned to this width once it |
| 42 // can be. | 42 // can be. |
| 43 this.tabListWidth_ = $(TAB_LIST_ID).offsetWidth; | 43 this.tabListWidth_ = $(TAB_LIST_ID).offsetWidth; |
| 44 | 44 |
| 45 superClass.call(this); | 45 superClass.call(this); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 91 * @param {string} tabId The ID to refer to the tab by. | 91 * @param {string} tabId The ID to refer to the tab by. |
| 92 * @param {!View} view The tab's actual contents. | 92 * @param {!View} view The tab's actual contents. |
| 93 * @param {string} name The name for the menu item that selects the tab. | 93 * @param {string} name The name for the menu item that selects the tab. |
| 94 */ | 94 */ |
| 95 addTab: function(tabId, view, name, hash) { | 95 addTab: function(tabId, view, name, hash) { |
| 96 if (!tabId) { | 96 if (!tabId) { |
| 97 throw Error('Must specify a non-false tabId'); | 97 throw Error('Must specify a non-false tabId'); |
| 98 } | 98 } |
| 99 | 99 |
| 100 this.tabIdToView_[tabId] = view; | 100 this.tabIdToView_[tabId] = view; |
| 101 this.viewList_.push(view); | 101 this.tabIdsLinkVisibility_.set(tabId, true); |
| 102 | 102 |
| 103 var node = addNodeWithText($(TAB_LIST_ID), 'a', name); | 103 var node = addNodeWithText($(TAB_LIST_ID), 'a', name); |
| 104 node.href = hash; | 104 node.href = hash; |
| 105 this.tabIdToLink_[tabId] = node; | 105 this.tabIdToLink_[tabId] = node; |
| 106 addNode($(TAB_LIST_ID), 'br'); | 106 addNode($(TAB_LIST_ID), 'br'); |
| 107 | 107 |
| 108 // Tab content views start off hidden. | 108 // Tab content views start off hidden. |
| 109 view.show(false); | 109 view.show(false); |
| 110 | 110 |
| 111 this.tabListWidth_ = $(TAB_LIST_ID).offsetWidth; | 111 this.tabListWidth_ = $(TAB_LIST_ID).offsetWidth; |
| 112 }, | 112 }, |
| 113 | 113 |
| 114 showTabLink: function(tabId, isVisible) { | 114 showTabLink: function(tabId, isVisible) { |
| 115 var wasActive = this.activeTabId_ == tabId; | 115 var wasActive = this.activeTabId_ == tabId; |
| 116 | 116 |
| 117 setNodeDisplay(this.tabIdToLink_[tabId], isVisible); | 117 setNodeDisplay(this.tabIdToLink_[tabId], isVisible); |
| 118 this.tabIdsLinkVisibility_.set(tabId, isVisible); | |
| 118 | 119 |
| 119 if (wasActive && !isVisible) { | 120 if (wasActive && !isVisible) { |
| 120 // If the link for active tab is being hidden, then switch to the first | 121 // If the link for active tab is being hidden, then switch to the first |
| 121 // tab which is still visible. | 122 // tab which is still visible. |
| 122 for (var view in this.viewList_) { | 123 for (var [localTabId, enabled] of this.tabIdsLinkVisibility_) { |
|
eroman
2016/07/06 20:06:29
I agree that the current code is quite wrong.
The
| |
| 123 if (view.isVisible()) | 124 if (enabled) { |
| 124 this.switchToTab(option.value); | 125 this.switchToTab(localTabId); |
| 126 break; | |
| 127 } | |
| 125 } | 128 } |
| 126 } | 129 } |
| 127 }, | 130 }, |
| 128 | 131 |
| 129 getAllTabViews: function() { | 132 getAllTabViews: function() { |
| 130 return this.tabIdToView_; | 133 return this.tabIdToView_; |
| 131 }, | 134 }, |
| 132 | 135 |
| 133 getTabView: function(tabId) { | 136 getTabView: function(tabId) { |
| 134 return this.tabIdToView_[tabId]; | 137 return this.tabIdToView_[tabId]; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 168 | 171 |
| 169 newView.show(this.isVisible()); | 172 newView.show(this.isVisible()); |
| 170 | 173 |
| 171 if (this.onTabSwitched_) | 174 if (this.onTabSwitched_) |
| 172 this.onTabSwitched_(oldTabId, tabId); | 175 this.onTabSwitched_(oldTabId, tabId); |
| 173 }, | 176 }, |
| 174 }; | 177 }; |
| 175 | 178 |
| 176 return TabSwitcherView; | 179 return TabSwitcherView; |
| 177 })(); | 180 })(); |
| OLD | NEW |