Chromium Code Reviews| Index: chrome/browser/ui/gtk/tabs/tab_strip_gtk.cc |
| diff --git a/chrome/browser/ui/gtk/tabs/tab_strip_gtk.cc b/chrome/browser/ui/gtk/tabs/tab_strip_gtk.cc |
| index 1a5784028b9f75960ad3ea6f1fbe558e2e11247a..3d7ab227387bb80646d2fb56c98a414ce1e6f953 100644 |
| --- a/chrome/browser/ui/gtk/tabs/tab_strip_gtk.cc |
| +++ b/chrome/browser/ui/gtk/tabs/tab_strip_gtk.cc |
| @@ -5,6 +5,7 @@ |
| #include "chrome/browser/ui/gtk/tabs/tab_strip_gtk.h" |
| #include <algorithm> |
| +#include <vector> |
| #include "base/i18n/rtl.h" |
| #include "base/string_util.h" |
| @@ -22,6 +23,7 @@ |
| #include "chrome/browser/ui/gtk/gtk_theme_service.h" |
| #include "chrome/browser/ui/gtk/gtk_util.h" |
| #include "chrome/browser/ui/gtk/tabs/dragged_tab_controller_gtk.h" |
| +#include "chrome/browser/ui/gtk/tabs/tab_strip_menu_controller.h" |
| #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
| #include "content/browser/tab_contents/tab_contents.h" |
| #include "content/common/notification_service.h" |
| @@ -168,7 +170,7 @@ class TabStripGtk::TabAnimation : public ui::AnimationDelegate { |
| } else { |
| double unselected, selected; |
| tabstrip->GetCurrentTabWidths(&unselected, &selected); |
| - tab_width = tab->IsSelected() ? selected : unselected; |
| + tab_width = tab->IsActive() ? selected : unselected; |
| } |
| if (animation) { |
| @@ -302,7 +304,7 @@ class InsertTabAnimation : public TabStripGtk::TabAnimation { |
| if (tabstrip_->GetTabAt(index)->mini()) |
| return TabGtk::GetMiniWidth(); |
| - if (tabstrip_->GetTabAt(index)->IsSelected()) { |
| + if (tabstrip_->GetTabAt(index)->IsActive()) { |
| double delta = end_selected_width_ - start_selected_width_; |
| return start_selected_width_ + (delta * animation_.GetCurrentValue()); |
| } |
| @@ -383,7 +385,7 @@ class RemoveTabAnimation : public TabStripGtk::TabAnimation { |
| // All other tabs are sized according to the start/end widths specified at |
| // the start of the animation. |
| - if (tab->IsSelected()) { |
| + if (tab->IsActive()) { |
| double delta = end_selected_width_ - start_selected_width_; |
| return start_selected_width_ + (delta * animation_.GetCurrentValue()); |
| } |
| @@ -491,7 +493,7 @@ class ResizeLayoutAnimation : public TabStripGtk::TabAnimation { |
| if (tab->mini()) |
| return TabGtk::GetMiniWidth(); |
| - if (tab->IsSelected()) { |
| + if (tab->IsActive()) { |
| return animation_.CurrentValueBetween(start_selected_width_, |
| end_selected_width_); |
| } |
| @@ -509,7 +511,7 @@ class ResizeLayoutAnimation : public TabStripGtk::TabAnimation { |
| for (int i = 0; i < tabstrip_->GetTabCount(); ++i) { |
| TabGtk* current_tab = tabstrip_->GetTabAt(i); |
| if (!current_tab->mini()) { |
| - if (current_tab->IsSelected()) { |
| + if (current_tab->IsActive()) { |
| start_selected_width_ = current_tab->width(); |
| } else { |
| start_unselected_width_ = current_tab->width(); |
| @@ -563,7 +565,7 @@ class MiniTabAnimation : public TabStripGtk::TabAnimation { |
| return TabGtk::GetMiniWidth(); |
| } |
| - if (tab->IsSelected()) { |
| + if (tab->IsActive()) { |
| return animation_.CurrentValueBetween(start_selected_width_, |
| end_selected_width_); |
| } |
| @@ -661,7 +663,7 @@ class MiniMoveAnimation : public TabStripGtk::TabAnimation { |
| if (tab->mini()) |
| return TabGtk::GetMiniWidth(); |
| - if (tab->IsSelected()) { |
| + if (tab->IsActive()) { |
| return animation_.CurrentValueBetween(start_selected_width_, |
| end_selected_width_); |
| } |
| @@ -1035,6 +1037,22 @@ void TabStripGtk::ActiveTabChanged(TabContentsWrapper* old_contents, |
| } |
| } |
| +void TabStripGtk::TabSelectionChanged( |
| + const std::vector<int>& previously_selected, |
| + const std::vector<int>& currently_selected) { |
| + std::set<int> indices_affected; |
| + size_t i = 0; |
|
James Hawkins
2011/06/01 18:20:40
nit: Move loop variables into the loop declaration
dpapad
2011/06/01 18:30:49
Done.
|
| + for (i = 0; i < previously_selected.size(); i++) { |
| + if (previously_selected[i] != TabStripSelectionModel::kUnselectedIndex) |
| + indices_affected.insert(previously_selected[i]); |
| + } |
| + for (i = 0; i < currently_selected.size(); i++) |
| + indices_affected.insert(currently_selected[i]); |
| + std::set<int>::iterator it; |
| + for (it = indices_affected.begin(); it != indices_affected.end(); ++it) |
| + GetTabAt(*it)->SchedulePaint(); |
| +} |
| + |
| void TabStripGtk::TabMoved(TabContentsWrapper* contents, |
| int from_index, |
| int to_index) { |
| @@ -1055,7 +1073,7 @@ void TabStripGtk::TabChangedAt(TabContentsWrapper* contents, int index, |
| // case we have an animation going. |
| TabGtk* tab = GetTabAtAdjustForAnimation(index); |
| if (change_type == TITLE_NOT_LOADING) { |
| - if (tab->mini() && !tab->IsSelected()) |
| + if (tab->mini() && !tab->IsActive()) |
| tab->StartMiniTabTitleAnimation(); |
| // We'll receive another notification of the change asynchronously. |
| return; |
| @@ -1097,13 +1115,20 @@ void TabStripGtk::TabBlockedStateChanged(TabContentsWrapper* contents, |
| //////////////////////////////////////////////////////////////////////////////// |
| // TabStripGtk, TabGtk::TabDelegate implementation: |
| -bool TabStripGtk::IsTabSelected(const TabGtk* tab) const { |
| +bool TabStripGtk::IsTabActive(const TabGtk* tab) const { |
| if (tab->closing()) |
| return false; |
| return GetIndexOfTab(tab) == model_->active_index(); |
| } |
| +bool TabStripGtk::IsTabSelected(const TabGtk* tab) const { |
| + if (tab->closing()) |
| + return false; |
| + |
| + return model_->IsTabSelected(GetIndexOfTab(tab)); |
| +} |
| + |
| bool TabStripGtk::IsTabDetached(const TabGtk* tab) const { |
| if (drag_controller_.get()) |
| return drag_controller_->IsTabDetached(tab); |
| @@ -1123,12 +1148,23 @@ bool TabStripGtk::IsTabPinned(const TabGtk* tab) const { |
| return model_->IsTabPinned(GetIndexOfTab(tab)); |
| } |
| -void TabStripGtk::SelectTab(TabGtk* tab) { |
| +void TabStripGtk::ActivateTab(TabGtk* tab) { |
| int index = GetIndexOfTab(tab); |
| if (model_->ContainsIndex(index)) |
| model_->ActivateTabAt(index, true); |
| } |
| +void TabStripGtk::ToggleTabSelection(TabGtk* tab) { |
| + int index = GetIndexOfTab(tab); |
| + model_->ToggleSelectionAt(index); |
| +} |
| + |
| +void TabStripGtk::ExtendTabSelection(TabGtk* tab) { |
| + int index = GetIndexOfTab(tab); |
| + if (model_->ContainsIndex(index)) |
| + model_->ExtendSelectionTo(index); |
| +} |
| + |
| void TabStripGtk::CloseTab(TabGtk* tab) { |
| int tab_index = GetIndexOfTab(tab); |
| if (model_->ContainsIndex(tab_index)) { |
| @@ -1215,6 +1251,11 @@ ui::ThemeProvider* TabStripGtk::GetThemeProvider() { |
| return theme_service_; |
| } |
| +TabStripMenuController* TabStripGtk::GetTabStripMenuControllerForTab( |
| + TabGtk* tab) { |
| + return new TabStripMenuController(tab, model(), GetIndexOfTab(tab)); |
| +} |
| + |
| /////////////////////////////////////////////////////////////////////////////// |
| // TabStripGtk, MessageLoop::Observer implementation: |
| @@ -1347,7 +1388,7 @@ void TabStripGtk::GenerateIdealBounds() { |
| double tab_width = unselected; |
| if (tab->mini()) |
| tab_width = TabGtk::GetMiniWidth(); |
| - else if (tab->IsSelected()) |
| + else if (tab->IsActive()) |
| tab_width = selected; |
| double end_of_tab = tab_x + tab_width; |
| int rounded_tab_x = Round(tab_x); |
| @@ -1491,7 +1532,7 @@ bool TabStripGtk::ResizeLayoutTabs() { |
| TabGtk* first_tab = GetTabAt(mini_tab_count); |
| double unselected, selected; |
| GetDesiredTabWidths(GetTabCount(), mini_tab_count, &unselected, &selected); |
| - int w = Round(first_tab->IsSelected() ? selected : unselected); |
| + int w = Round(first_tab->IsActive() ? selected : unselected); |
| // We only want to run the animation if we're not already at the desired |
| // size. |
| @@ -1920,7 +1961,7 @@ gboolean TabStripGtk::OnExpose(GtkWidget* widget, GdkEventExpose* event) { |
| // We must ask the _Tab's_ model, not ourselves, because in some situations |
| // the model will be different to this object, e.g. when a Tab is being |
| // removed after its TabContents has been destroyed. |
| - if (!tab->IsSelected()) { |
| + if (!tab->IsActive()) { |
| gtk_container_propagate_expose(GTK_CONTAINER(tabstrip_.get()), |
| tab->widget(), event); |
| } else { |