| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #include "chrome/browser/ui/gtk/tabs/tab_strip_gtk.h" | 5 #include "chrome/browser/ui/gtk/tabs/tab_strip_gtk.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/i18n/rtl.h" | 9 #include "base/i18n/rtl.h" |
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| 11 #include "base/utf_string_conversions.h" | 11 #include "base/utf_string_conversions.h" |
| 12 #include "chrome/browser/autocomplete/autocomplete.h" | 12 #include "chrome/browser/autocomplete/autocomplete.h" |
| 13 #include "chrome/browser/autocomplete/autocomplete_classifier.h" | 13 #include "chrome/browser/autocomplete/autocomplete_classifier.h" |
| 14 #include "chrome/browser/autocomplete/autocomplete_match.h" | 14 #include "chrome/browser/autocomplete/autocomplete_match.h" |
| 15 #include "chrome/browser/profiles/profile.h" | 15 #include "chrome/browser/profiles/profile.h" |
| 16 #include "chrome/browser/tabs/tab_strip_model_delegate.h" | 16 #include "chrome/browser/tabs/tab_strip_model_delegate.h" |
| 17 #include "chrome/browser/themes/theme_service.h" | 17 #include "chrome/browser/themes/theme_service.h" |
| 18 #include "chrome/browser/ui/browser.h" | 18 #include "chrome/browser/ui/browser.h" |
| 19 #include "chrome/browser/ui/browser_navigator.h" | 19 #include "chrome/browser/ui/browser_navigator.h" |
| 20 #include "chrome/browser/ui/gtk/browser_window_gtk.h" | 20 #include "chrome/browser/ui/gtk/browser_window_gtk.h" |
| 21 #include "chrome/browser/ui/gtk/custom_button.h" | 21 #include "chrome/browser/ui/gtk/custom_button.h" |
| 22 #include "chrome/browser/ui/gtk/gtk_theme_service.h" | 22 #include "chrome/browser/ui/gtk/gtk_theme_service.h" |
| 23 #include "chrome/browser/ui/gtk/gtk_util.h" | 23 #include "chrome/browser/ui/gtk/gtk_util.h" |
| 24 #include "chrome/browser/ui/gtk/tabs/dragged_tab_controller_gtk.h" | 24 #include "chrome/browser/ui/gtk/tabs/dragged_tab_controller_gtk.h" |
| 25 #include "chrome/browser/ui/gtk/tabs/tab_strip_menu_controller.h" |
| 25 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 26 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
| 26 #include "content/browser/tab_contents/tab_contents.h" | 27 #include "content/browser/tab_contents/tab_contents.h" |
| 27 #include "content/common/notification_service.h" | 28 #include "content/common/notification_service.h" |
| 28 #include "content/common/notification_type.h" | 29 #include "content/common/notification_type.h" |
| 29 #include "grit/app_resources.h" | 30 #include "grit/app_resources.h" |
| 30 #include "grit/theme_resources.h" | 31 #include "grit/theme_resources.h" |
| 31 #include "grit/theme_resources_standard.h" | 32 #include "grit/theme_resources_standard.h" |
| 32 #include "ui/base/animation/animation_delegate.h" | 33 #include "ui/base/animation/animation_delegate.h" |
| 33 #include "ui/base/animation/slide_animation.h" | 34 #include "ui/base/animation/slide_animation.h" |
| 34 #include "ui/base/dragdrop/gtk_dnd_util.h" | 35 #include "ui/base/dragdrop/gtk_dnd_util.h" |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 161 static double GetCurrentTabWidth(TabStripGtk* tabstrip, | 162 static double GetCurrentTabWidth(TabStripGtk* tabstrip, |
| 162 TabStripGtk::TabAnimation* animation, | 163 TabStripGtk::TabAnimation* animation, |
| 163 int index) { | 164 int index) { |
| 164 TabGtk* tab = tabstrip->GetTabAt(index); | 165 TabGtk* tab = tabstrip->GetTabAt(index); |
| 165 double tab_width; | 166 double tab_width; |
| 166 if (tab->mini()) { | 167 if (tab->mini()) { |
| 167 tab_width = TabGtk::GetMiniWidth(); | 168 tab_width = TabGtk::GetMiniWidth(); |
| 168 } else { | 169 } else { |
| 169 double unselected, selected; | 170 double unselected, selected; |
| 170 tabstrip->GetCurrentTabWidths(&unselected, &selected); | 171 tabstrip->GetCurrentTabWidths(&unselected, &selected); |
| 171 tab_width = tab->IsSelected() ? selected : unselected; | 172 tab_width = tab->IsActive() ? selected : unselected; |
| 172 } | 173 } |
| 173 | 174 |
| 174 if (animation) { | 175 if (animation) { |
| 175 double specified_tab_width = animation->GetWidthForTab(index); | 176 double specified_tab_width = animation->GetWidthForTab(index); |
| 176 if (specified_tab_width != -1) | 177 if (specified_tab_width != -1) |
| 177 tab_width = specified_tab_width; | 178 tab_width = specified_tab_width; |
| 178 } | 179 } |
| 179 | 180 |
| 180 return tab_width; | 181 return tab_width; |
| 181 } | 182 } |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 double delta = target_width - start_width; | 296 double delta = target_width - start_width; |
| 296 if (delta > 0) | 297 if (delta > 0) |
| 297 return start_width + (delta * animation_.GetCurrentValue()); | 298 return start_width + (delta * animation_.GetCurrentValue()); |
| 298 | 299 |
| 299 return start_width; | 300 return start_width; |
| 300 } | 301 } |
| 301 | 302 |
| 302 if (tabstrip_->GetTabAt(index)->mini()) | 303 if (tabstrip_->GetTabAt(index)->mini()) |
| 303 return TabGtk::GetMiniWidth(); | 304 return TabGtk::GetMiniWidth(); |
| 304 | 305 |
| 305 if (tabstrip_->GetTabAt(index)->IsSelected()) { | 306 if (tabstrip_->GetTabAt(index)->IsActive()) { |
| 306 double delta = end_selected_width_ - start_selected_width_; | 307 double delta = end_selected_width_ - start_selected_width_; |
| 307 return start_selected_width_ + (delta * animation_.GetCurrentValue()); | 308 return start_selected_width_ + (delta * animation_.GetCurrentValue()); |
| 308 } | 309 } |
| 309 | 310 |
| 310 double delta = end_unselected_width_ - start_unselected_width_; | 311 double delta = end_unselected_width_ - start_unselected_width_; |
| 311 return start_unselected_width_ + (delta * animation_.GetCurrentValue()); | 312 return start_unselected_width_ + (delta * animation_.GetCurrentValue()); |
| 312 } | 313 } |
| 313 | 314 |
| 314 private: | 315 private: |
| 315 int index_; | 316 int index_; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 if (tab->mini()) | 377 if (tab->mini()) |
| 377 return TabGtk::GetMiniWidth(); | 378 return TabGtk::GetMiniWidth(); |
| 378 | 379 |
| 379 if (tabstrip_->available_width_for_tabs_ != -1 && | 380 if (tabstrip_->available_width_for_tabs_ != -1 && |
| 380 index_ != tabstrip_->GetTabCount() - 1) { | 381 index_ != tabstrip_->GetTabCount() - 1) { |
| 381 return TabStripGtk::TabAnimation::GetWidthForTab(index); | 382 return TabStripGtk::TabAnimation::GetWidthForTab(index); |
| 382 } | 383 } |
| 383 | 384 |
| 384 // All other tabs are sized according to the start/end widths specified at | 385 // All other tabs are sized according to the start/end widths specified at |
| 385 // the start of the animation. | 386 // the start of the animation. |
| 386 if (tab->IsSelected()) { | 387 if (tab->IsActive()) { |
| 387 double delta = end_selected_width_ - start_selected_width_; | 388 double delta = end_selected_width_ - start_selected_width_; |
| 388 return start_selected_width_ + (delta * animation_.GetCurrentValue()); | 389 return start_selected_width_ + (delta * animation_.GetCurrentValue()); |
| 389 } | 390 } |
| 390 | 391 |
| 391 double delta = end_unselected_width_ - start_unselected_width_; | 392 double delta = end_unselected_width_ - start_unselected_width_; |
| 392 return start_unselected_width_ + (delta * animation_.GetCurrentValue()); | 393 return start_unselected_width_ + (delta * animation_.GetCurrentValue()); |
| 393 } | 394 } |
| 394 | 395 |
| 395 virtual void AnimationEnded(const ui::Animation* animation) { | 396 virtual void AnimationEnded(const ui::Animation* animation) { |
| 396 tabstrip_->RemoveTabAt(index_); | 397 tabstrip_->RemoveTabAt(index_); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 484 virtual int GetDuration() const { | 485 virtual int GetDuration() const { |
| 485 return kResizeLayoutAnimationDurationMs; | 486 return kResizeLayoutAnimationDurationMs; |
| 486 } | 487 } |
| 487 | 488 |
| 488 virtual double GetWidthForTab(int index) const { | 489 virtual double GetWidthForTab(int index) const { |
| 489 TabGtk* tab = tabstrip_->GetTabAt(index); | 490 TabGtk* tab = tabstrip_->GetTabAt(index); |
| 490 | 491 |
| 491 if (tab->mini()) | 492 if (tab->mini()) |
| 492 return TabGtk::GetMiniWidth(); | 493 return TabGtk::GetMiniWidth(); |
| 493 | 494 |
| 494 if (tab->IsSelected()) { | 495 if (tab->IsActive()) { |
| 495 return animation_.CurrentValueBetween(start_selected_width_, | 496 return animation_.CurrentValueBetween(start_selected_width_, |
| 496 end_selected_width_); | 497 end_selected_width_); |
| 497 } | 498 } |
| 498 | 499 |
| 499 return animation_.CurrentValueBetween(start_unselected_width_, | 500 return animation_.CurrentValueBetween(start_unselected_width_, |
| 500 end_unselected_width_); | 501 end_unselected_width_); |
| 501 } | 502 } |
| 502 | 503 |
| 503 private: | 504 private: |
| 504 // We need to start from the current widths of the Tabs as they were last | 505 // We need to start from the current widths of the Tabs as they were last |
| 505 // laid out, _not_ the last known good state, which is what'll be done if we | 506 // laid out, _not_ the last known good state, which is what'll be done if we |
| 506 // don't measure the Tab sizes here and just go with the default TabAnimation | 507 // don't measure the Tab sizes here and just go with the default TabAnimation |
| 507 // behavior... | 508 // behavior... |
| 508 void InitStartState() { | 509 void InitStartState() { |
| 509 for (int i = 0; i < tabstrip_->GetTabCount(); ++i) { | 510 for (int i = 0; i < tabstrip_->GetTabCount(); ++i) { |
| 510 TabGtk* current_tab = tabstrip_->GetTabAt(i); | 511 TabGtk* current_tab = tabstrip_->GetTabAt(i); |
| 511 if (!current_tab->mini()) { | 512 if (!current_tab->mini()) { |
| 512 if (current_tab->IsSelected()) { | 513 if (current_tab->IsActive()) { |
| 513 start_selected_width_ = current_tab->width(); | 514 start_selected_width_ = current_tab->width(); |
| 514 } else { | 515 } else { |
| 515 start_unselected_width_ = current_tab->width(); | 516 start_unselected_width_ = current_tab->width(); |
| 516 } | 517 } |
| 517 } | 518 } |
| 518 } | 519 } |
| 519 } | 520 } |
| 520 | 521 |
| 521 DISALLOW_COPY_AND_ASSIGN(ResizeLayoutAnimation); | 522 DISALLOW_COPY_AND_ASSIGN(ResizeLayoutAnimation); |
| 522 }; | 523 }; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 556 static_cast<double>(TabGtk::GetMiniWidth())); | 557 static_cast<double>(TabGtk::GetMiniWidth())); |
| 557 } else { | 558 } else { |
| 558 return animation_.CurrentValueBetween( | 559 return animation_.CurrentValueBetween( |
| 559 static_cast<double>(TabGtk::GetMiniWidth()), | 560 static_cast<double>(TabGtk::GetMiniWidth()), |
| 560 end_selected_width_); | 561 end_selected_width_); |
| 561 } | 562 } |
| 562 } else if (tab->mini()) { | 563 } else if (tab->mini()) { |
| 563 return TabGtk::GetMiniWidth(); | 564 return TabGtk::GetMiniWidth(); |
| 564 } | 565 } |
| 565 | 566 |
| 566 if (tab->IsSelected()) { | 567 if (tab->IsActive()) { |
| 567 return animation_.CurrentValueBetween(start_selected_width_, | 568 return animation_.CurrentValueBetween(start_selected_width_, |
| 568 end_selected_width_); | 569 end_selected_width_); |
| 569 } | 570 } |
| 570 | 571 |
| 571 return animation_.CurrentValueBetween(start_unselected_width_, | 572 return animation_.CurrentValueBetween(start_unselected_width_, |
| 572 end_unselected_width_); | 573 end_unselected_width_); |
| 573 } | 574 } |
| 574 | 575 |
| 575 private: | 576 private: |
| 576 // Index of the tab whose mini-state changed. | 577 // Index of the tab whose mini-state changed. |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 654 | 655 |
| 655 virtual double GetWidthForTab(int index) const { | 656 virtual double GetWidthForTab(int index) const { |
| 656 TabGtk* tab = tabstrip_->GetTabAt(index); | 657 TabGtk* tab = tabstrip_->GetTabAt(index); |
| 657 | 658 |
| 658 if (index == to_index_) | 659 if (index == to_index_) |
| 659 return animation_.CurrentValueBetween(0, target_bounds_.width()); | 660 return animation_.CurrentValueBetween(0, target_bounds_.width()); |
| 660 | 661 |
| 661 if (tab->mini()) | 662 if (tab->mini()) |
| 662 return TabGtk::GetMiniWidth(); | 663 return TabGtk::GetMiniWidth(); |
| 663 | 664 |
| 664 if (tab->IsSelected()) { | 665 if (tab->IsActive()) { |
| 665 return animation_.CurrentValueBetween(start_selected_width_, | 666 return animation_.CurrentValueBetween(start_selected_width_, |
| 666 end_selected_width_); | 667 end_selected_width_); |
| 667 } | 668 } |
| 668 | 669 |
| 669 return animation_.CurrentValueBetween(start_unselected_width_, | 670 return animation_.CurrentValueBetween(start_unselected_width_, |
| 670 end_unselected_width_); | 671 end_unselected_width_); |
| 671 } | 672 } |
| 672 | 673 |
| 673 private: | 674 private: |
| 674 // The tab being moved. | 675 // The tab being moved. |
| (...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1048 GenerateIdealBounds(); | 1049 GenerateIdealBounds(); |
| 1049 StartMoveTabAnimation(from_index, to_index); | 1050 StartMoveTabAnimation(from_index, to_index); |
| 1050 } | 1051 } |
| 1051 | 1052 |
| 1052 void TabStripGtk::TabChangedAt(TabContentsWrapper* contents, int index, | 1053 void TabStripGtk::TabChangedAt(TabContentsWrapper* contents, int index, |
| 1053 TabChangeType change_type) { | 1054 TabChangeType change_type) { |
| 1054 // Index is in terms of the model. Need to make sure we adjust that index in | 1055 // Index is in terms of the model. Need to make sure we adjust that index in |
| 1055 // case we have an animation going. | 1056 // case we have an animation going. |
| 1056 TabGtk* tab = GetTabAtAdjustForAnimation(index); | 1057 TabGtk* tab = GetTabAtAdjustForAnimation(index); |
| 1057 if (change_type == TITLE_NOT_LOADING) { | 1058 if (change_type == TITLE_NOT_LOADING) { |
| 1058 if (tab->mini() && !tab->IsSelected()) | 1059 if (tab->mini() && !tab->IsActive()) |
| 1059 tab->StartMiniTabTitleAnimation(); | 1060 tab->StartMiniTabTitleAnimation(); |
| 1060 // We'll receive another notification of the change asynchronously. | 1061 // We'll receive another notification of the change asynchronously. |
| 1061 return; | 1062 return; |
| 1062 } | 1063 } |
| 1063 tab->UpdateData(contents->tab_contents(), | 1064 tab->UpdateData(contents->tab_contents(), |
| 1064 model_->IsAppTab(index), | 1065 model_->IsAppTab(index), |
| 1065 change_type == LOADING_ONLY); | 1066 change_type == LOADING_ONLY); |
| 1066 tab->UpdateFromModel(); | 1067 tab->UpdateFromModel(); |
| 1067 } | 1068 } |
| 1068 | 1069 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1090 } | 1091 } |
| 1091 | 1092 |
| 1092 void TabStripGtk::TabBlockedStateChanged(TabContentsWrapper* contents, | 1093 void TabStripGtk::TabBlockedStateChanged(TabContentsWrapper* contents, |
| 1093 int index) { | 1094 int index) { |
| 1094 GetTabAt(index)->SetBlocked(model_->IsTabBlocked(index)); | 1095 GetTabAt(index)->SetBlocked(model_->IsTabBlocked(index)); |
| 1095 } | 1096 } |
| 1096 | 1097 |
| 1097 //////////////////////////////////////////////////////////////////////////////// | 1098 //////////////////////////////////////////////////////////////////////////////// |
| 1098 // TabStripGtk, TabGtk::TabDelegate implementation: | 1099 // TabStripGtk, TabGtk::TabDelegate implementation: |
| 1099 | 1100 |
| 1100 bool TabStripGtk::IsTabSelected(const TabGtk* tab) const { | 1101 bool TabStripGtk::IsTabActive(const TabGtk* tab) const { |
| 1101 if (tab->closing()) | 1102 if (tab->closing()) |
| 1102 return false; | 1103 return false; |
| 1103 | 1104 |
| 1104 return GetIndexOfTab(tab) == model_->active_index(); | 1105 return GetIndexOfTab(tab) == model_->active_index(); |
| 1105 } | 1106 } |
| 1106 | 1107 |
| 1108 bool TabStripGtk::IsTabSelected(const TabGtk* tab) const { |
| 1109 if (tab->closing()) |
| 1110 return false; |
| 1111 |
| 1112 return model_->IsTabSelected(GetIndexOfTab(tab)); |
| 1113 } |
| 1114 |
| 1107 bool TabStripGtk::IsTabDetached(const TabGtk* tab) const { | 1115 bool TabStripGtk::IsTabDetached(const TabGtk* tab) const { |
| 1108 if (drag_controller_.get()) | 1116 if (drag_controller_.get()) |
| 1109 return drag_controller_->IsTabDetached(tab); | 1117 return drag_controller_->IsTabDetached(tab); |
| 1110 return false; | 1118 return false; |
| 1111 } | 1119 } |
| 1112 | 1120 |
| 1113 void TabStripGtk::GetCurrentTabWidths(double* unselected_width, | 1121 void TabStripGtk::GetCurrentTabWidths(double* unselected_width, |
| 1114 double* selected_width) const { | 1122 double* selected_width) const { |
| 1115 *unselected_width = current_unselected_width_; | 1123 *unselected_width = current_unselected_width_; |
| 1116 *selected_width = current_selected_width_; | 1124 *selected_width = current_selected_width_; |
| 1117 } | 1125 } |
| 1118 | 1126 |
| 1119 bool TabStripGtk::IsTabPinned(const TabGtk* tab) const { | 1127 bool TabStripGtk::IsTabPinned(const TabGtk* tab) const { |
| 1120 if (tab->closing()) | 1128 if (tab->closing()) |
| 1121 return false; | 1129 return false; |
| 1122 | 1130 |
| 1123 return model_->IsTabPinned(GetIndexOfTab(tab)); | 1131 return model_->IsTabPinned(GetIndexOfTab(tab)); |
| 1124 } | 1132 } |
| 1125 | 1133 |
| 1126 void TabStripGtk::SelectTab(TabGtk* tab) { | 1134 void TabStripGtk::ActivateTab(TabGtk* tab) { |
| 1127 int index = GetIndexOfTab(tab); | 1135 int index = GetIndexOfTab(tab); |
| 1128 if (model_->ContainsIndex(index)) | 1136 if (model_->ContainsIndex(index)) |
| 1129 model_->ActivateTabAt(index, true); | 1137 model_->ActivateTabAt(index, true); |
| 1130 } | 1138 } |
| 1131 | 1139 |
| 1140 void TabStripGtk::ToggleTabSelection(TabGtk* tab) { |
| 1141 int index = GetIndexOfTab(tab); |
| 1142 model_->ToggleSelectionAt(index); |
| 1143 } |
| 1144 |
| 1145 void TabStripGtk::ExtendTabSelection(TabGtk* tab) { |
| 1146 int index = GetIndexOfTab(tab); |
| 1147 if (model_->ContainsIndex(index)) |
| 1148 model_->ExtendSelectionTo(index); |
| 1149 } |
| 1150 |
| 1132 void TabStripGtk::CloseTab(TabGtk* tab) { | 1151 void TabStripGtk::CloseTab(TabGtk* tab) { |
| 1133 int tab_index = GetIndexOfTab(tab); | 1152 int tab_index = GetIndexOfTab(tab); |
| 1134 if (model_->ContainsIndex(tab_index)) { | 1153 if (model_->ContainsIndex(tab_index)) { |
| 1135 TabGtk* last_tab = GetTabAt(GetTabCount() - 1); | 1154 TabGtk* last_tab = GetTabAt(GetTabCount() - 1); |
| 1136 // Limit the width available to the TabStrip for laying out Tabs, so that | 1155 // Limit the width available to the TabStrip for laying out Tabs, so that |
| 1137 // Tabs are not resized until a later time (when the mouse pointer leaves | 1156 // Tabs are not resized until a later time (when the mouse pointer leaves |
| 1138 // the TabStrip). | 1157 // the TabStrip). |
| 1139 available_width_for_tabs_ = GetAvailableWidthForTabs(last_tab); | 1158 available_width_for_tabs_ = GetAvailableWidthForTabs(last_tab); |
| 1140 needs_resize_layout_ = true; | 1159 needs_resize_layout_ = true; |
| 1141 // We hook into the message loop in order to receive mouse move events when | 1160 // We hook into the message loop in order to receive mouse move events when |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1208 } | 1227 } |
| 1209 | 1228 |
| 1210 bool TabStripGtk::HasAvailableDragActions() const { | 1229 bool TabStripGtk::HasAvailableDragActions() const { |
| 1211 return model_->delegate()->GetDragActions() != 0; | 1230 return model_->delegate()->GetDragActions() != 0; |
| 1212 } | 1231 } |
| 1213 | 1232 |
| 1214 ui::ThemeProvider* TabStripGtk::GetThemeProvider() { | 1233 ui::ThemeProvider* TabStripGtk::GetThemeProvider() { |
| 1215 return theme_service_; | 1234 return theme_service_; |
| 1216 } | 1235 } |
| 1217 | 1236 |
| 1237 TabStripMenuController* TabStripGtk::GetTabStripMenuControllerForTab( |
| 1238 TabGtk* tab) { |
| 1239 return new TabStripMenuController(tab, model(), GetIndexOfTab(tab)); |
| 1240 } |
| 1241 |
| 1218 /////////////////////////////////////////////////////////////////////////////// | 1242 /////////////////////////////////////////////////////////////////////////////// |
| 1219 // TabStripGtk, MessageLoop::Observer implementation: | 1243 // TabStripGtk, MessageLoop::Observer implementation: |
| 1220 | 1244 |
| 1221 void TabStripGtk::WillProcessEvent(GdkEvent* event) { | 1245 void TabStripGtk::WillProcessEvent(GdkEvent* event) { |
| 1222 // Nothing to do. | 1246 // Nothing to do. |
| 1223 } | 1247 } |
| 1224 | 1248 |
| 1225 void TabStripGtk::DidProcessEvent(GdkEvent* event) { | 1249 void TabStripGtk::DidProcessEvent(GdkEvent* event) { |
| 1226 switch (event->type) { | 1250 switch (event->type) { |
| 1227 case GDK_MOTION_NOTIFY: | 1251 case GDK_MOTION_NOTIFY: |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1340 | 1364 |
| 1341 // NOTE: This currently assumes a tab's height doesn't differ based on | 1365 // NOTE: This currently assumes a tab's height doesn't differ based on |
| 1342 // selected state or the number of tabs in the strip! | 1366 // selected state or the number of tabs in the strip! |
| 1343 int tab_height = TabGtk::GetStandardSize().height(); | 1367 int tab_height = TabGtk::GetStandardSize().height(); |
| 1344 double tab_x = tab_start_x(); | 1368 double tab_x = tab_start_x(); |
| 1345 for (int i = 0; i < tab_count; ++i) { | 1369 for (int i = 0; i < tab_count; ++i) { |
| 1346 TabGtk* tab = GetTabAt(i); | 1370 TabGtk* tab = GetTabAt(i); |
| 1347 double tab_width = unselected; | 1371 double tab_width = unselected; |
| 1348 if (tab->mini()) | 1372 if (tab->mini()) |
| 1349 tab_width = TabGtk::GetMiniWidth(); | 1373 tab_width = TabGtk::GetMiniWidth(); |
| 1350 else if (tab->IsSelected()) | 1374 else if (tab->IsActive()) |
| 1351 tab_width = selected; | 1375 tab_width = selected; |
| 1352 double end_of_tab = tab_x + tab_width; | 1376 double end_of_tab = tab_x + tab_width; |
| 1353 int rounded_tab_x = Round(tab_x); | 1377 int rounded_tab_x = Round(tab_x); |
| 1354 gfx::Rect state(rounded_tab_x, 0, Round(end_of_tab) - rounded_tab_x, | 1378 gfx::Rect state(rounded_tab_x, 0, Round(end_of_tab) - rounded_tab_x, |
| 1355 tab_height); | 1379 tab_height); |
| 1356 tab_data_.at(i).ideal_bounds = state; | 1380 tab_data_.at(i).ideal_bounds = state; |
| 1357 tab_x = end_of_tab + GetTabHOffset(i + 1); | 1381 tab_x = end_of_tab + GetTabHOffset(i + 1); |
| 1358 } | 1382 } |
| 1359 } | 1383 } |
| 1360 | 1384 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1484 available_width_for_tabs_ = -1; | 1508 available_width_for_tabs_ = -1; |
| 1485 int mini_tab_count = GetMiniTabCount(); | 1509 int mini_tab_count = GetMiniTabCount(); |
| 1486 if (mini_tab_count == GetTabCount()) { | 1510 if (mini_tab_count == GetTabCount()) { |
| 1487 // Only mini tabs, we know the tab widths won't have changed (all mini-tabs | 1511 // Only mini tabs, we know the tab widths won't have changed (all mini-tabs |
| 1488 // have the same width), so there is nothing to do. | 1512 // have the same width), so there is nothing to do. |
| 1489 return false; | 1513 return false; |
| 1490 } | 1514 } |
| 1491 TabGtk* first_tab = GetTabAt(mini_tab_count); | 1515 TabGtk* first_tab = GetTabAt(mini_tab_count); |
| 1492 double unselected, selected; | 1516 double unselected, selected; |
| 1493 GetDesiredTabWidths(GetTabCount(), mini_tab_count, &unselected, &selected); | 1517 GetDesiredTabWidths(GetTabCount(), mini_tab_count, &unselected, &selected); |
| 1494 int w = Round(first_tab->IsSelected() ? selected : unselected); | 1518 int w = Round(first_tab->IsActive() ? selected : unselected); |
| 1495 | 1519 |
| 1496 // We only want to run the animation if we're not already at the desired | 1520 // We only want to run the animation if we're not already at the desired |
| 1497 // size. | 1521 // size. |
| 1498 if (abs(first_tab->width() - w) > 1) { | 1522 if (abs(first_tab->width() - w) > 1) { |
| 1499 StartResizeLayoutAnimation(); | 1523 StartResizeLayoutAnimation(); |
| 1500 return true; | 1524 return true; |
| 1501 } | 1525 } |
| 1502 | 1526 |
| 1503 return false; | 1527 return false; |
| 1504 } | 1528 } |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1913 newtab_button_->widget(), event); | 1937 newtab_button_->widget(), event); |
| 1914 | 1938 |
| 1915 // Paint the tabs in reverse order, so they stack to the left. | 1939 // Paint the tabs in reverse order, so they stack to the left. |
| 1916 TabGtk* selected_tab = NULL; | 1940 TabGtk* selected_tab = NULL; |
| 1917 int tab_count = GetTabCount(); | 1941 int tab_count = GetTabCount(); |
| 1918 for (int i = tab_count - 1; i >= 0; --i) { | 1942 for (int i = tab_count - 1; i >= 0; --i) { |
| 1919 TabGtk* tab = GetTabAt(i); | 1943 TabGtk* tab = GetTabAt(i); |
| 1920 // We must ask the _Tab's_ model, not ourselves, because in some situations | 1944 // We must ask the _Tab's_ model, not ourselves, because in some situations |
| 1921 // the model will be different to this object, e.g. when a Tab is being | 1945 // the model will be different to this object, e.g. when a Tab is being |
| 1922 // removed after its TabContents has been destroyed. | 1946 // removed after its TabContents has been destroyed. |
| 1923 if (!tab->IsSelected()) { | 1947 if (!tab->IsActive()) { |
| 1924 gtk_container_propagate_expose(GTK_CONTAINER(tabstrip_.get()), | 1948 gtk_container_propagate_expose(GTK_CONTAINER(tabstrip_.get()), |
| 1925 tab->widget(), event); | 1949 tab->widget(), event); |
| 1926 } else { | 1950 } else { |
| 1927 selected_tab = tab; | 1951 selected_tab = tab; |
| 1928 } | 1952 } |
| 1929 } | 1953 } |
| 1930 | 1954 |
| 1931 // Paint the selected tab last, so it overlaps all the others. | 1955 // Paint the selected tab last, so it overlaps all the others. |
| 1932 if (selected_tab) { | 1956 if (selected_tab) { |
| 1933 gtk_container_propagate_expose(GTK_CONTAINER(tabstrip_.get()), | 1957 gtk_container_propagate_expose(GTK_CONTAINER(tabstrip_.get()), |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2076 | 2100 |
| 2077 // Let the middle mouse button initiate clicks as well. | 2101 // Let the middle mouse button initiate clicks as well. |
| 2078 gtk_util::SetButtonTriggersNavigation(button->widget()); | 2102 gtk_util::SetButtonTriggersNavigation(button->widget()); |
| 2079 g_signal_connect(button->widget(), "clicked", | 2103 g_signal_connect(button->widget(), "clicked", |
| 2080 G_CALLBACK(OnNewTabClickedThunk), this); | 2104 G_CALLBACK(OnNewTabClickedThunk), this); |
| 2081 GTK_WIDGET_UNSET_FLAGS(button->widget(), GTK_CAN_FOCUS); | 2105 GTK_WIDGET_UNSET_FLAGS(button->widget(), GTK_CAN_FOCUS); |
| 2082 gtk_fixed_put(GTK_FIXED(tabstrip_.get()), button->widget(), 0, 0); | 2106 gtk_fixed_put(GTK_FIXED(tabstrip_.get()), button->widget(), 0, 0); |
| 2083 | 2107 |
| 2084 return button; | 2108 return button; |
| 2085 } | 2109 } |
| OLD | NEW |