OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/gtk/tabs/tab_strip_gtk.h" | 5 #include "chrome/browser/gtk/tabs/tab_strip_gtk.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "app/animation_delegate.h" | |
10 #include "app/gtk_dnd_util.h" | 9 #include "app/gtk_dnd_util.h" |
11 #include "app/resource_bundle.h" | 10 #include "app/resource_bundle.h" |
12 #include "app/slide_animation.h" | |
13 #include "base/i18n/rtl.h" | 11 #include "base/i18n/rtl.h" |
14 #include "base/string_util.h" | 12 #include "base/string_util.h" |
15 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
16 #include "chrome/browser/autocomplete/autocomplete.h" | 14 #include "chrome/browser/autocomplete/autocomplete.h" |
17 #include "chrome/browser/autocomplete/autocomplete_classifier.h" | 15 #include "chrome/browser/autocomplete/autocomplete_classifier.h" |
18 #include "chrome/browser/autocomplete/autocomplete_match.h" | 16 #include "chrome/browser/autocomplete/autocomplete_match.h" |
19 #include "chrome/browser/gtk/browser_window_gtk.h" | 17 #include "chrome/browser/gtk/browser_window_gtk.h" |
20 #include "chrome/browser/gtk/custom_button.h" | 18 #include "chrome/browser/gtk/custom_button.h" |
21 #include "chrome/browser/gtk/gtk_theme_provider.h" | 19 #include "chrome/browser/gtk/gtk_theme_provider.h" |
22 #include "chrome/browser/gtk/gtk_util.h" | 20 #include "chrome/browser/gtk/gtk_util.h" |
23 #include "chrome/browser/gtk/tabs/dragged_tab_controller_gtk.h" | 21 #include "chrome/browser/gtk/tabs/dragged_tab_controller_gtk.h" |
24 #include "chrome/browser/profiles/profile.h" | 22 #include "chrome/browser/profiles/profile.h" |
25 #include "chrome/browser/tab_contents/tab_contents.h" | 23 #include "chrome/browser/tab_contents/tab_contents.h" |
26 #include "chrome/browser/tabs/tab_strip_model_delegate.h" | 24 #include "chrome/browser/tabs/tab_strip_model_delegate.h" |
27 #include "chrome/browser/themes/browser_theme_provider.h" | 25 #include "chrome/browser/themes/browser_theme_provider.h" |
28 #include "chrome/browser/ui/browser.h" | 26 #include "chrome/browser/ui/browser.h" |
29 #include "chrome/browser/ui/browser_navigator.h" | 27 #include "chrome/browser/ui/browser_navigator.h" |
30 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 28 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
31 #include "chrome/common/notification_service.h" | 29 #include "chrome/common/notification_service.h" |
32 #include "chrome/common/notification_type.h" | 30 #include "chrome/common/notification_type.h" |
33 #include "gfx/gtk_util.h" | 31 #include "gfx/gtk_util.h" |
34 #include "gfx/point.h" | 32 #include "gfx/point.h" |
35 #include "grit/app_resources.h" | 33 #include "grit/app_resources.h" |
36 #include "grit/theme_resources.h" | 34 #include "grit/theme_resources.h" |
| 35 #include "ui/base/animation/animation_delegate.h" |
| 36 #include "ui/base/animation/slide_animation.h" |
37 | 37 |
38 namespace { | 38 namespace { |
39 | 39 |
40 const int kDefaultAnimationDurationMs = 100; | 40 const int kDefaultAnimationDurationMs = 100; |
41 const int kResizeLayoutAnimationDurationMs = 166; | 41 const int kResizeLayoutAnimationDurationMs = 166; |
42 const int kReorderAnimationDurationMs = 166; | 42 const int kReorderAnimationDurationMs = 166; |
43 const int kAnimateToBoundsDurationMs = 150; | 43 const int kAnimateToBoundsDurationMs = 150; |
44 const int kMiniTabAnimationDurationMs = 150; | 44 const int kMiniTabAnimationDurationMs = 150; |
45 | 45 |
46 const int kNewTabButtonHOffset = -5; | 46 const int kNewTabButtonHOffset = -5; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 } | 100 } |
101 | 101 |
102 } // namespace | 102 } // namespace |
103 | 103 |
104 //////////////////////////////////////////////////////////////////////////////// | 104 //////////////////////////////////////////////////////////////////////////////// |
105 // | 105 // |
106 // TabAnimation | 106 // TabAnimation |
107 // | 107 // |
108 // A base class for all TabStrip animations. | 108 // A base class for all TabStrip animations. |
109 // | 109 // |
110 class TabStripGtk::TabAnimation : public AnimationDelegate { | 110 class TabStripGtk::TabAnimation : public ui::AnimationDelegate { |
111 public: | 111 public: |
112 friend class TabStripGtk; | 112 friend class TabStripGtk; |
113 | 113 |
114 // Possible types of animation. | 114 // Possible types of animation. |
115 enum Type { | 115 enum Type { |
116 INSERT, | 116 INSERT, |
117 REMOVE, | 117 REMOVE, |
118 MOVE, | 118 MOVE, |
119 RESIZE, | 119 RESIZE, |
120 MINI, | 120 MINI, |
121 MINI_MOVE | 121 MINI_MOVE |
122 }; | 122 }; |
123 | 123 |
124 TabAnimation(TabStripGtk* tabstrip, Type type) | 124 TabAnimation(TabStripGtk* tabstrip, Type type) |
125 : tabstrip_(tabstrip), | 125 : tabstrip_(tabstrip), |
126 animation_(this), | 126 animation_(this), |
127 start_selected_width_(0), | 127 start_selected_width_(0), |
128 start_unselected_width_(0), | 128 start_unselected_width_(0), |
129 end_selected_width_(0), | 129 end_selected_width_(0), |
130 end_unselected_width_(0), | 130 end_unselected_width_(0), |
131 layout_on_completion_(false), | 131 layout_on_completion_(false), |
132 type_(type) { | 132 type_(type) { |
133 } | 133 } |
134 virtual ~TabAnimation() {} | 134 virtual ~TabAnimation() {} |
135 | 135 |
136 Type type() const { return type_; } | 136 Type type() const { return type_; } |
137 | 137 |
138 void Start() { | 138 void Start() { |
139 animation_.SetSlideDuration(GetDuration()); | 139 animation_.SetSlideDuration(GetDuration()); |
140 animation_.SetTweenType(Tween::EASE_OUT); | 140 animation_.SetTweenType(ui::Tween::EASE_OUT); |
141 if (!animation_.IsShowing()) { | 141 if (!animation_.IsShowing()) { |
142 animation_.Reset(); | 142 animation_.Reset(); |
143 animation_.Show(); | 143 animation_.Show(); |
144 } | 144 } |
145 } | 145 } |
146 | 146 |
147 void Stop() { | 147 void Stop() { |
148 animation_.Stop(); | 148 animation_.Stop(); |
149 } | 149 } |
150 | 150 |
(...skipping 18 matching lines...) Expand all Loading... |
169 | 169 |
170 if (animation) { | 170 if (animation) { |
171 double specified_tab_width = animation->GetWidthForTab(index); | 171 double specified_tab_width = animation->GetWidthForTab(index); |
172 if (specified_tab_width != -1) | 172 if (specified_tab_width != -1) |
173 tab_width = specified_tab_width; | 173 tab_width = specified_tab_width; |
174 } | 174 } |
175 | 175 |
176 return tab_width; | 176 return tab_width; |
177 } | 177 } |
178 | 178 |
179 // Overridden from AnimationDelegate: | 179 // Overridden from ui::AnimationDelegate: |
180 virtual void AnimationProgressed(const Animation* animation) { | 180 virtual void AnimationProgressed(const ui::Animation* animation) { |
181 tabstrip_->AnimationLayout(end_unselected_width_); | 181 tabstrip_->AnimationLayout(end_unselected_width_); |
182 } | 182 } |
183 | 183 |
184 virtual void AnimationEnded(const Animation* animation) { | 184 virtual void AnimationEnded(const ui::Animation* animation) { |
185 tabstrip_->FinishAnimation(this, layout_on_completion_); | 185 tabstrip_->FinishAnimation(this, layout_on_completion_); |
186 // This object is destroyed now, so we can't do anything else after this. | 186 // This object is destroyed now, so we can't do anything else after this. |
187 } | 187 } |
188 | 188 |
189 virtual void AnimationCanceled(const Animation* animation) { | 189 virtual void AnimationCanceled(const ui::Animation* animation) { |
190 AnimationEnded(animation); | 190 AnimationEnded(animation); |
191 } | 191 } |
192 | 192 |
193 // Returns the gap before the tab at the specified index. Subclass if during | 193 // Returns the gap before the tab at the specified index. Subclass if during |
194 // an animation you need to insert a gap before a tab. | 194 // an animation you need to insert a gap before a tab. |
195 virtual double GetGapWidth(int index) { | 195 virtual double GetGapWidth(int index) { |
196 return 0; | 196 return 0; |
197 } | 197 } |
198 | 198 |
199 protected: | 199 protected: |
(...skipping 27 matching lines...) Expand all Loading... |
227 start_unselected_width_ -= minimum_tab_width / start_tab_count; | 227 start_unselected_width_ -= minimum_tab_width / start_tab_count; |
228 } | 228 } |
229 | 229 |
230 tabstrip_->GenerateIdealBounds(); | 230 tabstrip_->GenerateIdealBounds(); |
231 tabstrip_->GetDesiredTabWidths(end_tab_count, end_mini_count, | 231 tabstrip_->GetDesiredTabWidths(end_tab_count, end_mini_count, |
232 &end_unselected_width_, | 232 &end_unselected_width_, |
233 &end_selected_width_); | 233 &end_selected_width_); |
234 } | 234 } |
235 | 235 |
236 TabStripGtk* tabstrip_; | 236 TabStripGtk* tabstrip_; |
237 SlideAnimation animation_; | 237 ui::SlideAnimation animation_; |
238 | 238 |
239 double start_selected_width_; | 239 double start_selected_width_; |
240 double start_unselected_width_; | 240 double start_unselected_width_; |
241 double end_selected_width_; | 241 double end_selected_width_; |
242 double end_unselected_width_; | 242 double end_unselected_width_; |
243 | 243 |
244 private: | 244 private: |
245 // True if a complete re-layout is required upon completion of the animation. | 245 // True if a complete re-layout is required upon completion of the animation. |
246 // Subclasses set this if they don't perform a complete layout | 246 // Subclasses set this if they don't perform a complete layout |
247 // themselves and canceling the animation may leave the strip in an | 247 // themselves and canceling the animation may leave the strip in an |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 // the start of the animation. | 381 // the start of the animation. |
382 if (tab->IsSelected()) { | 382 if (tab->IsSelected()) { |
383 double delta = end_selected_width_ - start_selected_width_; | 383 double delta = end_selected_width_ - start_selected_width_; |
384 return start_selected_width_ + (delta * animation_.GetCurrentValue()); | 384 return start_selected_width_ + (delta * animation_.GetCurrentValue()); |
385 } | 385 } |
386 | 386 |
387 double delta = end_unselected_width_ - start_unselected_width_; | 387 double delta = end_unselected_width_ - start_unselected_width_; |
388 return start_unselected_width_ + (delta * animation_.GetCurrentValue()); | 388 return start_unselected_width_ + (delta * animation_.GetCurrentValue()); |
389 } | 389 } |
390 | 390 |
391 virtual void AnimationEnded(const Animation* animation) { | 391 virtual void AnimationEnded(const ui::Animation* animation) { |
392 tabstrip_->RemoveTabAt(index_); | 392 tabstrip_->RemoveTabAt(index_); |
393 TabStripGtk::TabAnimation::AnimationEnded(animation); | 393 TabStripGtk::TabAnimation::AnimationEnded(animation); |
394 } | 394 } |
395 | 395 |
396 private: | 396 private: |
397 int index_; | 397 int index_; |
398 | 398 |
399 DISALLOW_COPY_AND_ASSIGN(RemoveTabAnimation); | 399 DISALLOW_COPY_AND_ASSIGN(RemoveTabAnimation); |
400 }; | 400 }; |
401 | 401 |
402 //////////////////////////////////////////////////////////////////////////////// | 402 //////////////////////////////////////////////////////////////////////////////// |
403 | 403 |
404 // Handles the movement of a Tab from one position to another. | 404 // Handles the movement of a Tab from one position to another. |
405 class MoveTabAnimation : public TabStripGtk::TabAnimation { | 405 class MoveTabAnimation : public TabStripGtk::TabAnimation { |
406 public: | 406 public: |
407 MoveTabAnimation(TabStripGtk* tabstrip, int tab_a_index, int tab_b_index) | 407 MoveTabAnimation(TabStripGtk* tabstrip, int tab_a_index, int tab_b_index) |
408 : TabAnimation(tabstrip, MOVE), | 408 : TabAnimation(tabstrip, MOVE), |
409 start_tab_a_bounds_(tabstrip_->GetIdealBounds(tab_b_index)), | 409 start_tab_a_bounds_(tabstrip_->GetIdealBounds(tab_b_index)), |
410 start_tab_b_bounds_(tabstrip_->GetIdealBounds(tab_a_index)) { | 410 start_tab_b_bounds_(tabstrip_->GetIdealBounds(tab_a_index)) { |
411 tab_a_ = tabstrip_->GetTabAt(tab_a_index); | 411 tab_a_ = tabstrip_->GetTabAt(tab_a_index); |
412 tab_b_ = tabstrip_->GetTabAt(tab_b_index); | 412 tab_b_ = tabstrip_->GetTabAt(tab_b_index); |
413 | 413 |
414 // Since we don't do a full TabStrip re-layout, we need to force a full | 414 // Since we don't do a full TabStrip re-layout, we need to force a full |
415 // layout upon completion since we're not guaranteed to be in a good state | 415 // layout upon completion since we're not guaranteed to be in a good state |
416 // if for example the animation is canceled. | 416 // if for example the animation is canceled. |
417 set_layout_on_completion(true); | 417 set_layout_on_completion(true); |
418 } | 418 } |
419 virtual ~MoveTabAnimation() {} | 419 virtual ~MoveTabAnimation() {} |
420 | 420 |
421 // Overridden from AnimationDelegate: | 421 // Overridden from ui::AnimationDelegate: |
422 virtual void AnimationProgressed(const Animation* animation) { | 422 virtual void AnimationProgressed(const ui::Animation* animation) { |
423 // Position Tab A | 423 // Position Tab A |
424 double distance = start_tab_b_bounds_.x() - start_tab_a_bounds_.x(); | 424 double distance = start_tab_b_bounds_.x() - start_tab_a_bounds_.x(); |
425 double delta = distance * animation_.GetCurrentValue(); | 425 double delta = distance * animation_.GetCurrentValue(); |
426 double new_x = start_tab_a_bounds_.x() + delta; | 426 double new_x = start_tab_a_bounds_.x() + delta; |
427 gfx::Rect bounds(Round(new_x), start_tab_a_bounds_.y(), tab_a_->width(), | 427 gfx::Rect bounds(Round(new_x), start_tab_a_bounds_.y(), tab_a_->width(), |
428 tab_a_->height()); | 428 tab_a_->height()); |
429 tabstrip_->SetTabBounds(tab_a_, bounds); | 429 tabstrip_->SetTabBounds(tab_a_, bounds); |
430 | 430 |
431 // Position Tab B | 431 // Position Tab B |
432 distance = start_tab_a_bounds_.x() - start_tab_b_bounds_.x(); | 432 distance = start_tab_a_bounds_.x() - start_tab_b_bounds_.x(); |
(...skipping 29 matching lines...) Expand all Loading... |
462 explicit ResizeLayoutAnimation(TabStripGtk* tabstrip) | 462 explicit ResizeLayoutAnimation(TabStripGtk* tabstrip) |
463 : TabAnimation(tabstrip, RESIZE) { | 463 : TabAnimation(tabstrip, RESIZE) { |
464 int tab_count = tabstrip->GetTabCount(); | 464 int tab_count = tabstrip->GetTabCount(); |
465 int mini_tab_count = tabstrip->GetMiniTabCount(); | 465 int mini_tab_count = tabstrip->GetMiniTabCount(); |
466 GenerateStartAndEndWidths(tab_count, tab_count, mini_tab_count, | 466 GenerateStartAndEndWidths(tab_count, tab_count, mini_tab_count, |
467 mini_tab_count); | 467 mini_tab_count); |
468 InitStartState(); | 468 InitStartState(); |
469 } | 469 } |
470 virtual ~ResizeLayoutAnimation() {} | 470 virtual ~ResizeLayoutAnimation() {} |
471 | 471 |
472 // Overridden from AnimationDelegate: | 472 // Overridden from ui::AnimationDelegate: |
473 virtual void AnimationEnded(const Animation* animation) { | 473 virtual void AnimationEnded(const ui::Animation* animation) { |
474 tabstrip_->needs_resize_layout_ = false; | 474 tabstrip_->needs_resize_layout_ = false; |
475 TabStripGtk::TabAnimation::AnimationEnded(animation); | 475 TabStripGtk::TabAnimation::AnimationEnded(animation); |
476 } | 476 } |
477 | 477 |
478 protected: | 478 protected: |
479 // Overridden from TabStripGtk::TabAnimation: | 479 // Overridden from TabStripGtk::TabAnimation: |
480 virtual int GetDuration() const { | 480 virtual int GetDuration() const { |
481 return kResizeLayoutAnimationDurationMs; | 481 return kResizeLayoutAnimationDurationMs; |
482 } | 482 } |
483 | 483 |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
596 if (tabstrip->GetTabAt(to_index)->mini()) | 596 if (tabstrip->GetTabAt(to_index)->mini()) |
597 start_mini_count--; | 597 start_mini_count--; |
598 else | 598 else |
599 start_mini_count++; | 599 start_mini_count++; |
600 GenerateStartAndEndWidths(tab_count, tab_count, start_mini_count, | 600 GenerateStartAndEndWidths(tab_count, tab_count, start_mini_count, |
601 end_mini_count); | 601 end_mini_count); |
602 target_bounds_ = tabstrip->GetIdealBounds(to_index); | 602 target_bounds_ = tabstrip->GetIdealBounds(to_index); |
603 tab_->set_animating_mini_change(true); | 603 tab_->set_animating_mini_change(true); |
604 } | 604 } |
605 | 605 |
606 // Overridden from AnimationDelegate: | 606 // Overridden from ui::AnimationDelegate: |
607 virtual void AnimationProgressed(const Animation* animation) { | 607 virtual void AnimationProgressed(const ui::Animation* animation) { |
608 // Do the normal layout. | 608 // Do the normal layout. |
609 TabAnimation::AnimationProgressed(animation); | 609 TabAnimation::AnimationProgressed(animation); |
610 | 610 |
611 // Then special case the position of the tab being moved. | 611 // Then special case the position of the tab being moved. |
612 int x = animation_.CurrentValueBetween(start_bounds_.x(), | 612 int x = animation_.CurrentValueBetween(start_bounds_.x(), |
613 target_bounds_.x()); | 613 target_bounds_.x()); |
614 int width = animation_.CurrentValueBetween(start_bounds_.width(), | 614 int width = animation_.CurrentValueBetween(start_bounds_.width(), |
615 target_bounds_.width()); | 615 target_bounds_.width()); |
616 gfx::Rect tab_bounds(x, start_bounds_.y(), width, | 616 gfx::Rect tab_bounds(x, start_bounds_.y(), width, |
617 start_bounds_.height()); | 617 start_bounds_.height()); |
618 tabstrip_->SetTabBounds(tab_, tab_bounds); | 618 tabstrip_->SetTabBounds(tab_, tab_bounds); |
619 } | 619 } |
620 | 620 |
621 virtual void AnimationEnded(const Animation* animation) { | 621 virtual void AnimationEnded(const ui::Animation* animation) { |
622 tabstrip_->needs_resize_layout_ = false; | 622 tabstrip_->needs_resize_layout_ = false; |
623 TabStripGtk::TabAnimation::AnimationEnded(animation); | 623 TabStripGtk::TabAnimation::AnimationEnded(animation); |
624 } | 624 } |
625 | 625 |
626 virtual double GetGapWidth(int index) { | 626 virtual double GetGapWidth(int index) { |
627 if (to_index_ < from_index_) { | 627 if (to_index_ < from_index_) { |
628 // The tab was made mini. | 628 // The tab was made mini. |
629 if (index == to_index_) { | 629 if (index == to_index_) { |
630 double current_size = | 630 double current_size = |
631 animation_.CurrentValueBetween(0, target_bounds_.width()); | 631 animation_.CurrentValueBetween(0, target_bounds_.width()); |
(...skipping 1421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2053 | 2053 |
2054 // Let the middle mouse button initiate clicks as well. | 2054 // Let the middle mouse button initiate clicks as well. |
2055 gtk_util::SetButtonTriggersNavigation(button->widget()); | 2055 gtk_util::SetButtonTriggersNavigation(button->widget()); |
2056 g_signal_connect(button->widget(), "clicked", | 2056 g_signal_connect(button->widget(), "clicked", |
2057 G_CALLBACK(OnNewTabClickedThunk), this); | 2057 G_CALLBACK(OnNewTabClickedThunk), this); |
2058 GTK_WIDGET_UNSET_FLAGS(button->widget(), GTK_CAN_FOCUS); | 2058 GTK_WIDGET_UNSET_FLAGS(button->widget(), GTK_CAN_FOCUS); |
2059 gtk_fixed_put(GTK_FIXED(tabstrip_.get()), button->widget(), 0, 0); | 2059 gtk_fixed_put(GTK_FIXED(tabstrip_.get()), button->widget(), 0, 0); |
2060 | 2060 |
2061 return button; | 2061 return button; |
2062 } | 2062 } |
OLD | NEW |