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..ce9550ab099205a6834f2c2641b24dd60cfbf495 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,21 @@ void TabStripGtk::ActiveTabChanged(TabContentsWrapper* old_contents, |
} |
} |
+void TabStripGtk::TabSelectionChanged( |
sky
2011/06/01 20:56:04
Seems like you should only have to override one of
dpapad
2011/06/02 00:28:22
TabStripGtk::ActiveTabChanged() seems to me that i
|
+ const std::vector<int>& previously_selected, |
+ const std::vector<int>& currently_selected) { |
+ std::set<int> indices_affected; |
+ for (size_t i = 0; i < previously_selected.size(); i++) { |
+ if (previously_selected[i] != TabStripSelectionModel::kUnselectedIndex) |
+ indices_affected.insert(previously_selected[i]); |
+ } |
+ for (size_t i = 0; i < currently_selected.size(); i++) |
sky
2011/06/01 20:56:04
Can this be indices_affected.insert(currently_sele
dpapad
2011/06/02 00:28:22
Done.
|
+ indices_affected.insert(currently_selected[i]); |
+ std::set<int>::iterator it; |
+ for (it = indices_affected.begin(); it != indices_affected.end(); ++it) |
sky
2011/06/01 20:56:04
move definition of iterator into for loop.
dpapad
2011/06/02 00:28:22
Done.
|
+ GetTabAt(*it)->SchedulePaint(); |
sky
2011/06/01 20:56:04
The indices passed to this method are from the mod
|
+} |
+ |
void TabStripGtk::TabMoved(TabContentsWrapper* contents, |
int from_index, |
int to_index) { |
@@ -1055,7 +1072,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 +1114,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 +1147,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 +1250,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 +1387,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 +1531,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 +1960,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 { |