| 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 #include "chrome/browser/ui/views/tabs/tab.h" | 5 #include "chrome/browser/ui/views/tabs/tab.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "chrome/browser/defaults.h" | 10 #include "chrome/browser/defaults.h" |
| 11 #include "chrome/browser/themes/theme_service.h" | 11 #include "chrome/browser/themes/theme_service.h" |
| 12 #include "chrome/browser/ui/tabs/tab_resources.h" | 12 #include "chrome/browser/ui/tabs/tab_resources.h" |
| 13 #include "chrome/browser/ui/views/tabs/tab_controller.h" | 13 #include "chrome/browser/ui/views/tabs/tab_controller.h" |
| 14 #include "grit/generated_resources.h" | 14 #include "grit/generated_resources.h" |
| 15 #include "grit/theme_resources.h" | 15 #include "grit/theme_resources.h" |
| 16 #include "grit/theme_resources_standard.h" | 16 #include "grit/theme_resources_standard.h" |
| 17 #include "grit/ui_resources.h" | 17 #include "grit/ui_resources.h" |
| 18 #include "third_party/skia/include/effects/SkGradientShader.h" | 18 #include "third_party/skia/include/effects/SkGradientShader.h" |
| 19 #include "ui/base/animation/multi_animation.h" | 19 #include "ui/base/animation/multi_animation.h" |
| 20 #include "ui/base/animation/throb_animation.h" | 20 #include "ui/base/animation/throb_animation.h" |
| 21 #include "ui/base/layout.h" |
| 21 #include "ui/base/resource/resource_bundle.h" | 22 #include "ui/base/resource/resource_bundle.h" |
| 22 #include "ui/gfx/canvas.h" | 23 #include "ui/gfx/canvas.h" |
| 23 #include "ui/gfx/favicon_size.h" | 24 #include "ui/gfx/favicon_size.h" |
| 24 #include "ui/gfx/font.h" | 25 #include "ui/gfx/font.h" |
| 25 #include "ui/gfx/path.h" | 26 #include "ui/gfx/path.h" |
| 26 #include "ui/gfx/skbitmap_operations.h" | 27 #include "ui/gfx/skbitmap_operations.h" |
| 27 #include "ui/views/controls/button/image_button.h" | 28 #include "ui/views/controls/button/image_button.h" |
| 28 #include "ui/views/widget/tooltip_manager.h" | 29 #include "ui/views/widget/tooltip_manager.h" |
| 29 #include "ui/views/widget/widget.h" | 30 #include "ui/views/widget/widget.h" |
| 30 #include "ui/views/window/non_client_view.h" | 31 #include "ui/views/window/non_client_view.h" |
| 31 | 32 |
| 33 namespace { |
| 34 |
| 32 // Padding around the "content" of a tab, occupied by the tab border graphics. | 35 // Padding around the "content" of a tab, occupied by the tab border graphics. |
| 33 #if defined(USE_ASH) | 36 |
| 34 static const int kLeftPadding = 21; | 37 const int GetLeftPadding() { |
| 35 static const int kTopPadding = 8; | 38 static int value = -1; |
| 36 static const int kRightPadding = 20; | 39 if (value == -1) { |
| 37 static const int kBottomPadding = 5; | 40 switch (ui::GetDisplayLayout()) { |
| 38 #else | 41 case ui::LAYOUT_ASH: |
| 39 static const int kLeftPadding = 16; | 42 value = 21; |
| 40 static const int kTopPadding = 6; | 43 break; |
| 41 static const int kRightPadding = 15; | 44 case ui::LAYOUT_TOUCH: |
| 42 static const int kBottomPadding = 5; | 45 value = 20; |
| 43 #endif | 46 break; |
| 47 default: |
| 48 value = 16; |
| 49 } |
| 50 } |
| 51 return value; |
| 52 } |
| 53 |
| 54 const int GetTopPadding() { |
| 55 static int value = -1; |
| 56 if (value == -1) { |
| 57 switch (ui::GetDisplayLayout()) { |
| 58 case ui::LAYOUT_ASH: |
| 59 value = 8; |
| 60 break; |
| 61 case ui::LAYOUT_TOUCH: |
| 62 value = 12; |
| 63 break; |
| 64 default: |
| 65 value = 6; |
| 66 } |
| 67 } |
| 68 return value; |
| 69 } |
| 70 |
| 71 const int GetRightPadding() { |
| 72 static int value = -1; |
| 73 if (value == -1) { |
| 74 switch (ui::GetDisplayLayout()) { |
| 75 case ui::LAYOUT_ASH: |
| 76 value = 20; |
| 77 break; |
| 78 case ui::LAYOUT_TOUCH: |
| 79 value = 21; |
| 80 break; |
| 81 default: |
| 82 value = 15; |
| 83 } |
| 84 } |
| 85 return value; |
| 86 } |
| 87 |
| 88 const int GetBottomPadding() { |
| 89 static int value = -1; |
| 90 if (value == -1) { |
| 91 switch (ui::GetDisplayLayout()) { |
| 92 case ui::LAYOUT_TOUCH: |
| 93 value = 7; |
| 94 break; |
| 95 case ui::LAYOUT_ASH: |
| 96 default: |
| 97 value = 5; |
| 98 } |
| 99 } |
| 100 return value; |
| 101 } |
| 44 | 102 |
| 45 // Height of the shadow at the top of the tab image assets. | 103 // Height of the shadow at the top of the tab image assets. |
| 46 #if defined(USE_ASH) | 104 #if defined(USE_ASH) |
| 47 static const int kDropShadowHeight = 4; | 105 static const int kDropShadowHeight = 4; |
| 48 #else | 106 #else |
| 49 static const int kDropShadowHeight = 2; | 107 static const int kDropShadowHeight = 2; |
| 50 #endif | 108 #endif |
| 51 static const int kToolbarOverlap = 1; | 109 static const int kToolbarOverlap = 1; |
| 52 static const int kFaviconTitleSpacing = 4; | 110 static const int kFaviconTitleSpacing = 4; |
| 53 // Additional vertical offset for title text relative to top of tab. | 111 // Additional vertical offset for title text relative to top of tab. |
| (...skipping 27 matching lines...) Expand all Loading... |
| 81 | 139 |
| 82 // How opaque to make the hover state (out of 1). | 140 // How opaque to make the hover state (out of 1). |
| 83 static const double kHoverOpacity = 0.33; | 141 static const double kHoverOpacity = 0.33; |
| 84 | 142 |
| 85 // Opacity for non-active selected tabs. | 143 // Opacity for non-active selected tabs. |
| 86 static const double kSelectedTabOpacity = .45; | 144 static const double kSelectedTabOpacity = .45; |
| 87 | 145 |
| 88 // Selected (but not active) tabs have their throb value scaled down by this. | 146 // Selected (but not active) tabs have their throb value scaled down by this. |
| 89 static const double kSelectedTabThrobScale = .5; | 147 static const double kSelectedTabThrobScale = .5; |
| 90 | 148 |
| 91 Tab::TabImage Tab::tab_alpha_ = {0}; | |
| 92 Tab::TabImage Tab::tab_active_ = {0}; | |
| 93 Tab::TabImage Tab::tab_inactive_ = {0}; | |
| 94 | |
| 95 // Durations for the various parts of the mini tab title animation. | 149 // Durations for the various parts of the mini tab title animation. |
| 96 static const int kMiniTitleChangeAnimationDuration1MS = 1600; | 150 static const int kMiniTitleChangeAnimationDuration1MS = 1600; |
| 97 static const int kMiniTitleChangeAnimationStart1MS = 0; | 151 static const int kMiniTitleChangeAnimationStart1MS = 0; |
| 98 static const int kMiniTitleChangeAnimationEnd1MS = 1900; | 152 static const int kMiniTitleChangeAnimationEnd1MS = 1900; |
| 99 static const int kMiniTitleChangeAnimationDuration2MS = 0; | 153 static const int kMiniTitleChangeAnimationDuration2MS = 0; |
| 100 static const int kMiniTitleChangeAnimationDuration3MS = 550; | 154 static const int kMiniTitleChangeAnimationDuration3MS = 550; |
| 101 static const int kMiniTitleChangeAnimationStart3MS = 150; | 155 static const int kMiniTitleChangeAnimationStart3MS = 150; |
| 102 static const int kMiniTitleChangeAnimationEnd3MS = 800; | 156 static const int kMiniTitleChangeAnimationEnd3MS = 800; |
| 103 | 157 |
| 104 // Offset from the right edge for the start of the mini title change animation. | 158 // Offset from the right edge for the start of the mini title change animation. |
| 105 static const int kMiniTitleChangeInitialXOffset = 6; | 159 static const int kMiniTitleChangeInitialXOffset = 6; |
| 106 | 160 |
| 107 // Radius of the radial gradient used for mini title change animation. | 161 // Radius of the radial gradient used for mini title change animation. |
| 108 static const int kMiniTitleChangeGradientRadius = 20; | 162 static const int kMiniTitleChangeGradientRadius = 20; |
| 109 | 163 |
| 110 // Colors of the gradient used during the mini title change animation. | 164 // Colors of the gradient used during the mini title change animation. |
| 111 static const SkColor kMiniTitleChangeGradientColor1 = SK_ColorWHITE; | 165 static const SkColor kMiniTitleChangeGradientColor1 = SK_ColorWHITE; |
| 112 static const SkColor kMiniTitleChangeGradientColor2 = | 166 static const SkColor kMiniTitleChangeGradientColor2 = |
| 113 SkColorSetARGB(0, 255, 255, 255); | 167 SkColorSetARGB(0, 255, 255, 255); |
| 114 | 168 |
| 169 } // namespace |
| 170 |
| 171 Tab::TabImage Tab::tab_alpha_ = {0}; |
| 172 Tab::TabImage Tab::tab_active_ = {0}; |
| 173 Tab::TabImage Tab::tab_inactive_ = {0}; |
| 174 |
| 115 // static | 175 // static |
| 116 const char Tab::kViewClassName[] = "browser/tabs/Tab"; | 176 const char Tab::kViewClassName[] = "browser/tabs/Tab"; |
| 117 | 177 |
| 118 //////////////////////////////////////////////////////////////////////////////// | 178 //////////////////////////////////////////////////////////////////////////////// |
| 119 // Tab, public: | 179 // Tab, public: |
| 120 | 180 |
| 121 Tab::Tab(TabController* controller) | 181 Tab::Tab(TabController* controller) |
| 122 : BaseTab(controller), | 182 : BaseTab(controller), |
| 123 showing_icon_(false), | 183 showing_icon_(false), |
| 124 showing_close_button_(false), | 184 showing_close_button_(false), |
| (...skipping 30 matching lines...) Expand all Loading... |
| 155 void Tab::StopMiniTabTitleAnimation() { | 215 void Tab::StopMiniTabTitleAnimation() { |
| 156 if (mini_title_animation_.get()) | 216 if (mini_title_animation_.get()) |
| 157 mini_title_animation_->Stop(); | 217 mini_title_animation_->Stop(); |
| 158 } | 218 } |
| 159 | 219 |
| 160 // static | 220 // static |
| 161 gfx::Size Tab::GetBasicMinimumUnselectedSize() { | 221 gfx::Size Tab::GetBasicMinimumUnselectedSize() { |
| 162 InitTabResources(); | 222 InitTabResources(); |
| 163 | 223 |
| 164 gfx::Size minimum_size; | 224 gfx::Size minimum_size; |
| 165 minimum_size.set_width(kLeftPadding + kRightPadding); | 225 minimum_size.set_width(GetLeftPadding() + GetRightPadding()); |
| 166 // Since we use bitmap images, the real minimum height of the image is | 226 // Since we use bitmap images, the real minimum height of the image is |
| 167 // defined most accurately by the height of the end cap images. | 227 // defined most accurately by the height of the end cap images. |
| 168 minimum_size.set_height(tab_active_.image_l->height()); | 228 minimum_size.set_height(tab_active_.image_l->height()); |
| 169 return minimum_size; | 229 return minimum_size; |
| 170 } | 230 } |
| 171 | 231 |
| 172 gfx::Size Tab::GetMinimumUnselectedSize() { | 232 gfx::Size Tab::GetMinimumUnselectedSize() { |
| 173 return GetBasicMinimumUnselectedSize(); | 233 return GetBasicMinimumUnselectedSize(); |
| 174 } | 234 } |
| 175 | 235 |
| 176 // static | 236 // static |
| 177 gfx::Size Tab::GetMinimumSelectedSize() { | 237 gfx::Size Tab::GetMinimumSelectedSize() { |
| 178 gfx::Size minimum_size = GetBasicMinimumUnselectedSize(); | 238 gfx::Size minimum_size = GetBasicMinimumUnselectedSize(); |
| 179 minimum_size.set_width(kLeftPadding + gfx::kFaviconSize + kRightPadding); | 239 minimum_size.set_width( |
| 240 GetLeftPadding() + gfx::kFaviconSize + GetRightPadding()); |
| 180 return minimum_size; | 241 return minimum_size; |
| 181 } | 242 } |
| 182 | 243 |
| 183 // static | 244 // static |
| 184 gfx::Size Tab::GetStandardSize() { | 245 gfx::Size Tab::GetStandardSize() { |
| 185 gfx::Size standard_size = GetBasicMinimumUnselectedSize(); | 246 gfx::Size standard_size = GetBasicMinimumUnselectedSize(); |
| 186 standard_size.set_width( | 247 standard_size.set_width( |
| 187 standard_size.width() + kFaviconTitleSpacing + kStandardTitleWidth); | 248 standard_size.width() + kFaviconTitleSpacing + kStandardTitleWidth); |
| 188 return standard_size; | 249 return standard_size; |
| 189 } | 250 } |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 249 close_button()->SetBackground(close_button_color_, | 310 close_button()->SetBackground(close_button_color_, |
| 250 rb.GetBitmapNamed(IDR_TAB_CLOSE), | 311 rb.GetBitmapNamed(IDR_TAB_CLOSE), |
| 251 rb.GetBitmapNamed(IDR_TAB_CLOSE_MASK)); | 312 rb.GetBitmapNamed(IDR_TAB_CLOSE_MASK)); |
| 252 } | 313 } |
| 253 } | 314 } |
| 254 | 315 |
| 255 void Tab::Layout() { | 316 void Tab::Layout() { |
| 256 gfx::Rect lb = GetContentsBounds(); | 317 gfx::Rect lb = GetContentsBounds(); |
| 257 if (lb.IsEmpty()) | 318 if (lb.IsEmpty()) |
| 258 return; | 319 return; |
| 259 lb.Inset(kLeftPadding, kTopPadding, kRightPadding, kBottomPadding); | 320 lb.Inset( |
| 321 GetLeftPadding(), GetTopPadding(), GetRightPadding(), GetBottomPadding()); |
| 260 | 322 |
| 261 // The height of the content of the Tab is the largest of the favicon, | 323 // The height of the content of the Tab is the largest of the favicon, |
| 262 // the title text and the close button graphic. | 324 // the title text and the close button graphic. |
| 263 int content_height = std::max(kTabIconSize, font_height()); | 325 int content_height = std::max(kTabIconSize, font_height()); |
| 264 gfx::Size close_button_size(close_button()->GetPreferredSize()); | 326 gfx::Size close_button_size(close_button()->GetPreferredSize()); |
| 265 content_height = std::max(content_height, close_button_size.height()); | 327 content_height = std::max(content_height, close_button_size.height()); |
| 266 | 328 |
| 267 // Size the Favicon. | 329 // Size the Favicon. |
| 268 showing_icon_ = ShouldShowIcon(); | 330 showing_icon_ = ShouldShowIcon(); |
| 269 if (showing_icon_) { | 331 if (showing_icon_) { |
| 270 // Use the size of the favicon as apps use a bigger favicon size. | 332 // Use the size of the favicon as apps use a bigger favicon size. |
| 271 int favicon_top = kTopPadding + content_height / 2 - kTabIconSize / 2; | 333 int favicon_top = GetTopPadding() + content_height / 2 - kTabIconSize / 2; |
| 272 int favicon_left = lb.x(); | 334 int favicon_left = lb.x(); |
| 273 favicon_bounds_.SetRect(favicon_left, favicon_top, | 335 favicon_bounds_.SetRect(favicon_left, favicon_top, |
| 274 kTabIconSize, kTabIconSize); | 336 kTabIconSize, kTabIconSize); |
| 275 if (data().mini && width() < kMiniTabRendererAsNormalTabWidth) { | 337 if (data().mini && width() < kMiniTabRendererAsNormalTabWidth) { |
| 276 // Adjust the location of the favicon when transitioning from a normal | 338 // Adjust the location of the favicon when transitioning from a normal |
| 277 // tab to a mini-tab. | 339 // tab to a mini-tab. |
| 278 int mini_delta = kMiniTabRendererAsNormalTabWidth - GetMiniWidth(); | 340 int mini_delta = kMiniTabRendererAsNormalTabWidth - GetMiniWidth(); |
| 279 int ideal_delta = width() - GetMiniWidth(); | 341 int ideal_delta = width() - GetMiniWidth(); |
| 280 if (ideal_delta < mini_delta) { | 342 if (ideal_delta < mini_delta) { |
| 281 int ideal_x = (GetMiniWidth() - kTabIconSize) / 2; | 343 int ideal_x = (GetMiniWidth() - kTabIconSize) / 2; |
| 282 int x = favicon_bounds_.x() + static_cast<int>( | 344 int x = favicon_bounds_.x() + static_cast<int>( |
| 283 (1 - static_cast<float>(ideal_delta) / | 345 (1 - static_cast<float>(ideal_delta) / |
| 284 static_cast<float>(mini_delta)) * | 346 static_cast<float>(mini_delta)) * |
| 285 (ideal_x - favicon_bounds_.x())); | 347 (ideal_x - favicon_bounds_.x())); |
| 286 favicon_bounds_.set_x(x); | 348 favicon_bounds_.set_x(x); |
| 287 } | 349 } |
| 288 } | 350 } |
| 289 } else { | 351 } else { |
| 290 favicon_bounds_.SetRect(lb.x(), lb.y(), 0, 0); | 352 favicon_bounds_.SetRect(lb.x(), lb.y(), 0, 0); |
| 291 } | 353 } |
| 292 | 354 |
| 293 // Size the Close button. | 355 // Size the Close button. |
| 294 showing_close_button_ = ShouldShowCloseBox(); | 356 showing_close_button_ = ShouldShowCloseBox(); |
| 295 if (showing_close_button_) { | 357 if (showing_close_button_) { |
| 296 int close_button_top = kTopPadding + kCloseButtonVertFuzz + | 358 int close_button_top = GetTopPadding() + kCloseButtonVertFuzz + |
| 297 (content_height - close_button_size.height()) / 2; | 359 (content_height - close_button_size.height()) / 2; |
| 298 // If the ratio of the close button size to tab width exceeds the maximum. | 360 // If the ratio of the close button size to tab width exceeds the maximum. |
| 299 close_button()->SetBounds(lb.width() + kCloseButtonHorzFuzz, | 361 close_button()->SetBounds(lb.width() + kCloseButtonHorzFuzz, |
| 300 close_button_top, close_button_size.width(), | 362 close_button_top, close_button_size.width(), |
| 301 close_button_size.height()); | 363 close_button_size.height()); |
| 302 close_button()->SetVisible(true); | 364 close_button()->SetVisible(true); |
| 303 } else { | 365 } else { |
| 304 close_button()->SetBounds(0, 0, 0, 0); | 366 close_button()->SetBounds(0, 0, 0, 0); |
| 305 close_button()->SetVisible(false); | 367 close_button()->SetVisible(false); |
| 306 } | 368 } |
| 307 | 369 |
| 308 int title_left = favicon_bounds_.right() + kFaviconTitleSpacing; | 370 int title_left = favicon_bounds_.right() + kFaviconTitleSpacing; |
| 309 int title_top = | 371 int title_top = GetTopPadding() + kTitleTextOffsetY + |
| 310 kTopPadding + kTitleTextOffsetY + (content_height - font_height()) / 2; | 372 (content_height - font_height()) / 2; |
| 311 // Size the Title text to fill the remaining space. | 373 // Size the Title text to fill the remaining space. |
| 312 if (!data().mini || width() >= kMiniTabRendererAsNormalTabWidth) { | 374 if (!data().mini || width() >= kMiniTabRendererAsNormalTabWidth) { |
| 313 // If the user has big fonts, the title will appear rendered too far down | 375 // If the user has big fonts, the title will appear rendered too far down |
| 314 // on the y-axis if we use the regular top padding, so we need to adjust it | 376 // on the y-axis if we use the regular top padding, so we need to adjust it |
| 315 // so that the text appears centered. | 377 // so that the text appears centered. |
| 316 gfx::Size minimum_size = GetMinimumUnselectedSize(); | 378 gfx::Size minimum_size = GetMinimumUnselectedSize(); |
| 317 int text_height = title_top + font_height() + kBottomPadding; | 379 int text_height = title_top + font_height() + GetBottomPadding(); |
| 318 if (text_height > minimum_size.height()) | 380 if (text_height > minimum_size.height()) |
| 319 title_top -= (text_height - minimum_size.height()) / 2; | 381 title_top -= (text_height - minimum_size.height()) / 2; |
| 320 | 382 |
| 321 int title_width; | 383 int title_width; |
| 322 if (close_button()->visible()) { | 384 if (close_button()->visible()) { |
| 323 title_width = std::max(close_button()->x() - | 385 title_width = std::max(close_button()->x() - |
| 324 kTitleCloseButtonSpacing - title_left, 0); | 386 kTitleCloseButtonSpacing - title_left, 0); |
| 325 } else { | 387 } else { |
| 326 title_width = std::max(lb.width() - title_left, 0); | 388 title_width = std::max(lb.width() - title_left, 0); |
| 327 } | 389 } |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 558 // Now draw the highlights/shadows around the tab edge. | 620 // Now draw the highlights/shadows around the tab edge. |
| 559 canvas->DrawBitmapInt(*tab_image->image_l, 0, 0); | 621 canvas->DrawBitmapInt(*tab_image->image_l, 0, 0); |
| 560 canvas->TileImageInt(*tab_image->image_c, tab_image->l_width, 0, | 622 canvas->TileImageInt(*tab_image->image_c, tab_image->l_width, 0, |
| 561 width() - tab_image->l_width - tab_image->r_width, height()); | 623 width() - tab_image->l_width - tab_image->r_width, height()); |
| 562 canvas->DrawBitmapInt(*tab_image->image_r, width() - tab_image->r_width, 0); | 624 canvas->DrawBitmapInt(*tab_image->image_r, width() - tab_image->r_width, 0); |
| 563 } | 625 } |
| 564 | 626 |
| 565 int Tab::IconCapacity() const { | 627 int Tab::IconCapacity() const { |
| 566 if (height() < GetMinimumUnselectedSize().height()) | 628 if (height() < GetMinimumUnselectedSize().height()) |
| 567 return 0; | 629 return 0; |
| 568 return (width() - kLeftPadding - kRightPadding) / kTabIconSize; | 630 return (width() - GetLeftPadding() - GetRightPadding()) / kTabIconSize; |
| 569 } | 631 } |
| 570 | 632 |
| 571 bool Tab::ShouldShowIcon() const { | 633 bool Tab::ShouldShowIcon() const { |
| 572 if (data().mini && height() >= GetMinimumUnselectedSize().height()) | 634 if (data().mini && height() >= GetMinimumUnselectedSize().height()) |
| 573 return true; | 635 return true; |
| 574 if (!data().show_icon) { | 636 if (!data().show_icon) { |
| 575 return false; | 637 return false; |
| 576 } else if (IsActive()) { | 638 } else if (IsActive()) { |
| 577 // The active tab clips favicon before close button. | 639 // The active tab clips favicon before close button. |
| 578 return IconCapacity() >= 2; | 640 return IconCapacity() >= 2; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 630 tab_active_.image_r = rb.GetBitmapNamed(IDR_TAB_ACTIVE_RIGHT); | 692 tab_active_.image_r = rb.GetBitmapNamed(IDR_TAB_ACTIVE_RIGHT); |
| 631 tab_active_.l_width = tab_active_.image_l->width(); | 693 tab_active_.l_width = tab_active_.image_l->width(); |
| 632 tab_active_.r_width = tab_active_.image_r->width(); | 694 tab_active_.r_width = tab_active_.image_r->width(); |
| 633 | 695 |
| 634 tab_inactive_.image_l = rb.GetBitmapNamed(IDR_TAB_INACTIVE_LEFT); | 696 tab_inactive_.image_l = rb.GetBitmapNamed(IDR_TAB_INACTIVE_LEFT); |
| 635 tab_inactive_.image_c = rb.GetBitmapNamed(IDR_TAB_INACTIVE_CENTER); | 697 tab_inactive_.image_c = rb.GetBitmapNamed(IDR_TAB_INACTIVE_CENTER); |
| 636 tab_inactive_.image_r = rb.GetBitmapNamed(IDR_TAB_INACTIVE_RIGHT); | 698 tab_inactive_.image_r = rb.GetBitmapNamed(IDR_TAB_INACTIVE_RIGHT); |
| 637 tab_inactive_.l_width = tab_inactive_.image_l->width(); | 699 tab_inactive_.l_width = tab_inactive_.image_l->width(); |
| 638 tab_inactive_.r_width = tab_inactive_.image_r->width(); | 700 tab_inactive_.r_width = tab_inactive_.image_r->width(); |
| 639 } | 701 } |
| OLD | NEW |