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/panels/panel_browser_frame_view.h" | 5 #include "chrome/browser/ui/panels/panel_browser_frame_view.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
10 #include "chrome/browser/themes/theme_service.h" | 10 #include "chrome/browser/themes/theme_service.h" |
11 #include "chrome/browser/themes/theme_service_factory.h" | |
11 #include "chrome/browser/ui/panels/panel.h" | 12 #include "chrome/browser/ui/panels/panel.h" |
12 #include "chrome/browser/ui/panels/panel_browser_view.h" | 13 #include "chrome/browser/ui/panels/panel_browser_view.h" |
13 #include "chrome/browser/ui/panels/panel_manager.h" | 14 #include "chrome/browser/ui/panels/panel_manager.h" |
14 #include "chrome/browser/ui/panels/panel_settings_menu_model.h" | 15 #include "chrome/browser/ui/panels/panel_settings_menu_model.h" |
15 #include "chrome/common/extensions/extension.h" | 16 #include "chrome/common/extensions/extension.h" |
16 #include "content/browser/tab_contents/tab_contents.h" | 17 #include "content/browser/tab_contents/tab_contents.h" |
17 #include "grit/generated_resources.h" | 18 #include "grit/generated_resources.h" |
18 #include "grit/theme_resources.h" | 19 #include "grit/theme_resources.h" |
19 #include "grit/theme_resources_standard.h" | 20 #include "grit/theme_resources_standard.h" |
20 #include "grit/ui_resources.h" | 21 #include "grit/ui_resources.h" |
21 #include "third_party/skia/include/effects/SkGradientShader.h" | 22 #include "third_party/skia/include/effects/SkGradientShader.h" |
22 #include "ui/base/accessibility/accessible_view_state.h" | 23 #include "ui/base/accessibility/accessible_view_state.h" |
23 #include "ui/base/animation/slide_animation.h" | 24 #include "ui/base/animation/slide_animation.h" |
24 #include "ui/base/hit_test.h" | 25 #include "ui/base/hit_test.h" |
25 #include "ui/base/l10n/l10n_util.h" | 26 #include "ui/base/l10n/l10n_util.h" |
26 #include "ui/base/resource/resource_bundle.h" | 27 #include "ui/base/resource/resource_bundle.h" |
27 #include "ui/gfx/canvas_skia.h" | 28 #include "ui/gfx/canvas_skia.h" |
28 #include "ui/gfx/path.h" | 29 #include "ui/gfx/path.h" |
29 #include "ui/gfx/screen.h" | 30 #include "ui/gfx/screen.h" |
31 #include "ui/gfx/skia_util.h" | |
30 #include "ui/views/widget/widget_delegate.h" | 32 #include "ui/views/widget/widget_delegate.h" |
31 #include "views/controls/button/image_button.h" | 33 #include "views/controls/button/image_button.h" |
32 #include "views/controls/button/menu_button.h" | 34 #include "views/controls/button/menu_button.h" |
33 #include "views/controls/label.h" | 35 #include "views/controls/label.h" |
34 #include "views/controls/menu/menu_item_view.h" | 36 #include "views/controls/menu/menu_item_view.h" |
35 #include "views/controls/menu/menu_model_adapter.h" | 37 #include "views/controls/menu/menu_model_adapter.h" |
36 #include "views/controls/menu/menu_runner.h" | 38 #include "views/controls/menu/menu_runner.h" |
37 #include "views/painter.h" | 39 #include "views/painter.h" |
38 | 40 |
39 namespace { | 41 namespace { |
40 | 42 |
41 // The height in pixels of the titlebar. | 43 // The height in pixels of the titlebar. |
42 const int kTitlebarHeight = 24; | 44 const int kTitlebarHeight = 24; |
43 | 45 |
44 // The thickness in pixels of the frame border. | 46 // The thickness in pixels of the border. |
45 const int kFrameBorderThickness = 1; | 47 const int kBorderThickness = 1; |
46 | 48 |
47 // The spacing in pixels between the icon and the border/text. | 49 // No client edge is present. |
48 const int kIconSpacing = 4; | 50 const int kPanelClientEdgeThickness = 0; |
51 | |
52 // The spacing in pixels between the icon and the left border. | |
53 const int kIconAndBorderSpacing = 4; | |
49 | 54 |
50 // The height and width in pixels of the icon. | 55 // The height and width in pixels of the icon. |
51 const int kIconSize = 16; | 56 const int kIconSize = 16; |
52 | 57 |
53 // The spacing in pixels between buttons or the button and the adjacent control. | 58 // The spacing in pixels between the title and the icon on the left, or the |
54 const int kButtonSpacing = 6; | 59 // button on the right. |
60 const int kTitleSpacing = 8; | |
61 | |
62 // The spacing in pixels between the close button and the right border. | |
63 const int kCloseButtonAndBorderSpacing = 8; | |
64 | |
65 // The spacing in pixels between the close button and the settings button. | |
66 const int kSettingsButtonAndCloseButtonSpacing = 8; | |
55 | 67 |
56 // This value is experimental and subjective. | 68 // This value is experimental and subjective. |
57 const int kUpdateSettingsVisibilityAnimationMs = 120; | 69 const int kUpdateSettingsVisibilityAnimationMs = 120; |
58 | 70 |
59 // Colors used in painting the titlebar for drawing attention. | 71 // Colors used to draw active titlebar under default theme. |
60 const SkColor kBackgroundColorForAttention = 0xfffa983a; | 72 const SkColor kActiveTitleTextDefaultColor = SK_ColorBLACK; |
61 const SkColor kTitleTextColorForAttention = SK_ColorWHITE; | 73 const SkColor kActiveBackgroundDefaultColorStart = 0xfff0f8fa; |
74 const SkColor kActiveBackgroundDefaultColorEnd = 0xffd1e2ed; | |
75 | |
76 // Colors used to draw inactive titlebar under default theme. | |
77 const SkColor kInactiveTitleTextDefaultColor = 0xc0000000; | |
78 const SkColor kInactiveBackgroundDefaultColorStart = 0xffffffff; | |
79 const SkColor kInactiveBackgroundDefaultColorEnd = 0xffe7edf1; | |
80 | |
81 // Alpha value used in drawing inactive titlebar under default theme. | |
82 const U8CPU kInactiveAlphaBlending = 0xc0; | |
83 | |
84 // Colors used to draw titlebar for drawing attention regardless of the theme. | |
85 const SkColor kAttentionTitleTextColor = SK_ColorWHITE; | |
86 const SkColor kAttentionBackgroundColorStart = 0xffffab57; | |
87 const SkColor kAttentionBackgroundColorEnd = 0xfff59338; | |
88 | |
89 // Color used to draw the border. | |
90 const SkColor kBorderColor = 0xc0000000; | |
91 | |
92 // Color used to draw the divider line between the titlebar and the client area. | |
93 const SkColor kDividerColor = 0xffb5b5b5; | |
62 | 94 |
63 struct ButtonResources { | 95 struct ButtonResources { |
64 SkBitmap* normal_image; | 96 SkBitmap* normal_image; |
65 SkBitmap* mask_image; | 97 SkBitmap* mask_image; |
66 SkBitmap* hover_image; | 98 SkBitmap* hover_image; |
67 SkBitmap* pushed_image; | 99 SkBitmap* pushed_image; |
68 | 100 |
69 void SetResources(int normal_image_id, int mask_image_id, int hover_image_id, | 101 void SetResources(int normal_image_id, int mask_image_id, int hover_image_id, |
70 int pushed_image_id) { | 102 int pushed_image_id) { |
71 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 103 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
(...skipping 25 matching lines...) Expand all Loading... | |
97 bottom_right = rb.GetBitmapNamed(bottom_right_id); | 129 bottom_right = rb.GetBitmapNamed(bottom_right_id); |
98 bottom = rb.GetBitmapNamed(bottom_id); | 130 bottom = rb.GetBitmapNamed(bottom_id); |
99 bottom_left = rb.GetBitmapNamed(bottom_left_id); | 131 bottom_left = rb.GetBitmapNamed(bottom_left_id); |
100 left = rb.GetBitmapNamed(left_id); | 132 left = rb.GetBitmapNamed(left_id); |
101 } | 133 } |
102 }; | 134 }; |
103 | 135 |
104 ButtonResources settings_button_resources; | 136 ButtonResources settings_button_resources; |
105 ButtonResources close_button_resources; | 137 ButtonResources close_button_resources; |
106 EdgeResources frame_edges; | 138 EdgeResources frame_edges; |
107 EdgeResources client_edges; | |
108 gfx::Font* title_font = NULL; | 139 gfx::Font* title_font = NULL; |
109 SkBitmap* background_bitmap_for_attention = NULL; | 140 SkPaint active_background_default_paint; |
Dmitry Titov
2011/11/29 04:04:03
I wonder if this is a good thing to have objects w
jianli
2011/11/29 19:30:15
Done.
| |
141 SkPaint inactive_background_default_paint; | |
142 SkPaint attention_background_paint; | |
143 | |
144 void InitializeGradientPaint(SkPaint* paint, | |
Dmitry Titov
2011/11/29 04:04:03
why not return the SkPaint*, especially if statics
jianli
2011/11/29 19:30:15
I still need this to do the delay initialization w
| |
145 SkColor start_color, | |
146 SkColor end_color) { | |
147 SkShader* shader = gfx::CreateGradientShader( | |
148 0, kTitlebarHeight, start_color, end_color); | |
149 paint->setStyle(SkPaint::kFill_Style); | |
150 paint->setAntiAlias(true); | |
151 paint->setShader(shader); | |
152 shader->unref(); | |
153 } | |
110 | 154 |
111 void LoadImageResources() { | 155 void LoadImageResources() { |
112 settings_button_resources.SetResources( | 156 settings_button_resources.SetResources( |
113 IDR_BALLOON_WRENCH, 0, IDR_BALLOON_WRENCH_H, IDR_BALLOON_WRENCH_P); | 157 IDR_BALLOON_WRENCH, 0, IDR_BALLOON_WRENCH_H, IDR_BALLOON_WRENCH_P); |
114 | 158 |
115 close_button_resources.SetResources( | 159 close_button_resources.SetResources( |
116 IDR_TAB_CLOSE, IDR_TAB_CLOSE_MASK, IDR_TAB_CLOSE_H, IDR_TAB_CLOSE_P); | 160 IDR_TAB_CLOSE, IDR_TAB_CLOSE_MASK, IDR_TAB_CLOSE_H, IDR_TAB_CLOSE_P); |
117 | 161 |
118 frame_edges.SetResources( | 162 frame_edges.SetResources( |
119 IDR_WINDOW_TOP_LEFT_CORNER, IDR_WINDOW_TOP_CENTER, | 163 IDR_WINDOW_TOP_LEFT_CORNER, IDR_WINDOW_TOP_CENTER, |
120 IDR_WINDOW_TOP_RIGHT_CORNER, IDR_WINDOW_RIGHT_SIDE, | 164 IDR_WINDOW_TOP_RIGHT_CORNER, IDR_WINDOW_RIGHT_SIDE, |
121 IDR_PANEL_BOTTOM_RIGHT_CORNER, IDR_WINDOW_BOTTOM_CENTER, | 165 IDR_PANEL_BOTTOM_RIGHT_CORNER, IDR_WINDOW_BOTTOM_CENTER, |
122 IDR_PANEL_BOTTOM_LEFT_CORNER, IDR_WINDOW_LEFT_SIDE); | 166 IDR_PANEL_BOTTOM_LEFT_CORNER, IDR_WINDOW_LEFT_SIDE); |
123 | |
124 client_edges.SetResources( | |
125 IDR_APP_TOP_LEFT, IDR_APP_TOP_CENTER, | |
126 IDR_APP_TOP_RIGHT, IDR_CONTENT_RIGHT_SIDE, | |
127 IDR_CONTENT_BOTTOM_RIGHT_CORNER, IDR_CONTENT_BOTTOM_CENTER, | |
128 IDR_CONTENT_BOTTOM_LEFT_CORNER, IDR_CONTENT_LEFT_SIDE); | |
129 } | 167 } |
130 | 168 |
131 void EnsureResourcesInitialized() { | 169 void EnsureResourcesInitialized() { |
132 static bool resources_initialized = false; | 170 static bool resources_initialized = false; |
133 if (resources_initialized) | 171 if (resources_initialized) |
134 return; | 172 return; |
135 resources_initialized = true; | 173 resources_initialized = true; |
136 | 174 |
137 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 175 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
138 title_font = new gfx::Font(rb.GetFont(ResourceBundle::BaseFont)); | 176 title_font = new gfx::Font(rb.GetFont(ResourceBundle::BoldFont)); |
139 | 177 |
140 // Creates a bitmap of the specified color. | 178 InitializeGradientPaint(&active_background_default_paint, |
141 background_bitmap_for_attention = new SkBitmap(); | 179 kActiveBackgroundDefaultColorStart, |
142 background_bitmap_for_attention->setConfig( | 180 kActiveBackgroundDefaultColorEnd); |
143 SkBitmap::kARGB_8888_Config, 16, 16); | 181 InitializeGradientPaint(&inactive_background_default_paint, |
144 background_bitmap_for_attention->allocPixels(); | 182 kInactiveBackgroundDefaultColorStart, |
145 background_bitmap_for_attention->eraseColor(kBackgroundColorForAttention); | 183 kInactiveBackgroundDefaultColorEnd); |
184 InitializeGradientPaint(&attention_background_paint, | |
185 kAttentionBackgroundColorStart, | |
186 kAttentionBackgroundColorEnd); | |
146 | 187 |
147 LoadImageResources(); | 188 LoadImageResources(); |
148 } | 189 } |
149 | 190 |
150 } // namespace | 191 } // namespace |
151 | 192 |
152 // PanelBrowserFrameView::MouseWatcher ----------------------------------------- | 193 // PanelBrowserFrameView::MouseWatcher ----------------------------------------- |
153 | 194 |
154 PanelBrowserFrameView::MouseWatcher::MouseWatcher(PanelBrowserFrameView* view) | 195 PanelBrowserFrameView::MouseWatcher::MouseWatcher(PanelBrowserFrameView* view) |
155 : view_(view), | 196 : view_(view), |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
333 int window_component = GetHTComponentForFrame(point, | 374 int window_component = GetHTComponentForFrame(point, |
334 NonClientBorderThickness(), NonClientBorderThickness(), | 375 NonClientBorderThickness(), NonClientBorderThickness(), |
335 0, 0, | 376 0, 0, |
336 frame()->widget_delegate()->CanResize()); | 377 frame()->widget_delegate()->CanResize()); |
337 // Fall back to the caption if no other component matches. | 378 // Fall back to the caption if no other component matches. |
338 return (window_component == HTNOWHERE) ? HTCAPTION : window_component; | 379 return (window_component == HTNOWHERE) ? HTCAPTION : window_component; |
339 } | 380 } |
340 | 381 |
341 void PanelBrowserFrameView::GetWindowMask(const gfx::Size& size, | 382 void PanelBrowserFrameView::GetWindowMask(const gfx::Size& size, |
342 gfx::Path* window_mask) { | 383 gfx::Path* window_mask) { |
343 // For panel, the window shape is rectangle with top-left and top-right | 384 window_mask->moveTo(0, 3); |
344 // corners rounded. | 385 window_mask->lineTo(1, 2); |
345 if (size.height() <= Panel::kMinimizedPanelHeight) { | 386 window_mask->lineTo(1, 1); |
346 // For minimize panel, we need to produce the window mask applicable to | 387 window_mask->lineTo(2, 1); |
347 // the 3-pixel lines. | 388 window_mask->lineTo(3, 0); |
348 window_mask->moveTo(0, SkIntToScalar(size.height())); | 389 window_mask->lineTo(SkIntToScalar(size.width() - 3), 0); |
349 window_mask->lineTo(0, 1); | 390 window_mask->lineTo(SkIntToScalar(size.width() - 2), 1); |
350 window_mask->lineTo(1, 0); | 391 window_mask->lineTo(SkIntToScalar(size.width() - 1), 1); |
351 window_mask->lineTo(SkIntToScalar(size.width()) - 1, 0); | 392 window_mask->lineTo(SkIntToScalar(size.width() - 1), 2); |
352 window_mask->lineTo(SkIntToScalar(size.width()), 1); | 393 window_mask->lineTo(SkIntToScalar(size.width() - 1), 3); |
353 window_mask->lineTo(SkIntToScalar(size.width()), | 394 window_mask->lineTo(SkIntToScalar(size.width()), |
354 SkIntToScalar(size.height())); | 395 SkIntToScalar(size.height())); |
355 } else { | 396 window_mask->lineTo(0, SkIntToScalar(size.height())); |
356 window_mask->moveTo(0, 3); | |
357 window_mask->lineTo(1, 2); | |
358 window_mask->lineTo(1, 1); | |
359 window_mask->lineTo(2, 1); | |
360 window_mask->lineTo(3, 0); | |
361 window_mask->lineTo(SkIntToScalar(size.width() - 3), 0); | |
362 window_mask->lineTo(SkIntToScalar(size.width() - 2), 1); | |
363 window_mask->lineTo(SkIntToScalar(size.width() - 1), 1); | |
364 window_mask->lineTo(SkIntToScalar(size.width() - 1), 2); | |
365 window_mask->lineTo(SkIntToScalar(size.width()), 3); | |
366 window_mask->lineTo(SkIntToScalar(size.width()), | |
367 SkIntToScalar(size.height())); | |
368 window_mask->lineTo(0, SkIntToScalar(size.height())); | |
369 } | |
370 window_mask->close(); | 397 window_mask->close(); |
371 } | 398 } |
372 | 399 |
373 void PanelBrowserFrameView::ResetWindowControls() { | 400 void PanelBrowserFrameView::ResetWindowControls() { |
374 // The close button isn't affected by this constraint. | 401 // The close button isn't affected by this constraint. |
375 } | 402 } |
376 | 403 |
377 void PanelBrowserFrameView::UpdateWindowIcon() { | 404 void PanelBrowserFrameView::UpdateWindowIcon() { |
378 title_icon_->SchedulePaint(); | 405 title_icon_->SchedulePaint(); |
379 } | 406 } |
380 | 407 |
381 void PanelBrowserFrameView::OnPaint(gfx::Canvas* canvas) { | 408 void PanelBrowserFrameView::OnPaint(gfx::Canvas* canvas) { |
382 // The font and color need to be updated depending on the panel's state. | 409 // The font and color need to be updated depending on the panel's state. |
383 PaintState paint_state; | 410 PaintState paint_state; |
384 if (panel_browser_view_->panel()->IsDrawingAttention()) | 411 if (panel_browser_view_->panel()->IsDrawingAttention()) |
385 paint_state = PAINT_FOR_ATTENTION; | 412 paint_state = PAINT_FOR_ATTENTION; |
386 else if (panel_browser_view_->focused()) | 413 else if (panel_browser_view_->focused()) |
387 paint_state = PAINT_AS_ACTIVE; | 414 paint_state = PAINT_AS_ACTIVE; |
388 else | 415 else |
389 paint_state = PAINT_AS_INACTIVE; | 416 paint_state = PAINT_AS_INACTIVE; |
390 | 417 |
391 UpdateControlStyles(paint_state); | 418 UpdateControlStyles(paint_state); |
392 PaintFrameBorder(canvas); | 419 PaintFrameBorder(canvas); |
393 PaintClientEdge(canvas); | |
394 } | 420 } |
395 | 421 |
396 void PanelBrowserFrameView::OnThemeChanged() { | 422 void PanelBrowserFrameView::OnThemeChanged() { |
397 LoadImageResources(); | 423 LoadImageResources(); |
398 } | 424 } |
399 | 425 |
400 gfx::Size PanelBrowserFrameView::GetMinimumSize() { | 426 gfx::Size PanelBrowserFrameView::GetMinimumSize() { |
401 // This makes the panel be able to shrink to very small, like 3-pixel lines. | 427 // This makes the panel be able to shrink to very small, like 4-pixel lines. |
402 // Since the panel cannot be resized by the user, we do not need to enforce | 428 // Since the panel cannot be resized by the user, we do not need to enforce |
403 // the minimum size. | 429 // the minimum size. |
404 return gfx::Size(); | 430 return gfx::Size(); |
405 } | 431 } |
406 | 432 |
407 void PanelBrowserFrameView::Layout() { | 433 void PanelBrowserFrameView::Layout() { |
408 // Cancel the settings button animation if the layout of titlebar is being | 434 // Cancel the settings button animation if the layout of titlebar is being |
409 // updated. | 435 // updated. |
410 if (settings_button_animator_.get() && settings_button_animator_->IsShowing()) | 436 if (settings_button_animator_.get() && settings_button_animator_->IsShowing()) |
411 settings_button_animator_->Reset(); | 437 settings_button_animator_->Reset(); |
412 | 438 |
413 // Layout the close button. | 439 // Layout the close button. |
414 gfx::Size close_button_size = close_button_->GetPreferredSize(); | 440 gfx::Size close_button_size = close_button_->GetPreferredSize(); |
415 close_button_->SetBounds( | 441 close_button_->SetBounds( |
416 width() - kFrameBorderThickness - kButtonSpacing - | 442 width() - kBorderThickness - kCloseButtonAndBorderSpacing - |
417 close_button_size.width(), | 443 close_button_size.width(), |
418 (NonClientTopBorderHeight() - close_button_size.height()) / 2, | 444 (NonClientTopBorderHeight() - close_button_size.height()) / 2, |
419 close_button_size.width(), | 445 close_button_size.width(), |
420 close_button_size.height()); | 446 close_button_size.height()); |
421 | 447 |
422 // Layout the settings button. | 448 // Layout the settings button. |
423 gfx::Size settings_button_size = settings_button_->GetPreferredSize(); | 449 gfx::Size settings_button_size = settings_button_->GetPreferredSize(); |
424 settings_button_->SetBounds( | 450 settings_button_->SetBounds( |
425 close_button_->x() - kButtonSpacing - settings_button_size.width(), | 451 close_button_->x() - kSettingsButtonAndCloseButtonSpacing - |
452 settings_button_size.width(), | |
426 (NonClientTopBorderHeight() - settings_button_size.height()) / 2, | 453 (NonClientTopBorderHeight() - settings_button_size.height()) / 2, |
427 settings_button_size.width(), | 454 settings_button_size.width(), |
428 settings_button_size.height()); | 455 settings_button_size.height()); |
429 | 456 |
430 // Trace the full bounds and zero-size bounds for animation purpose. | 457 // Trace the full bounds and zero-size bounds for animation purpose. |
431 settings_button_full_bounds_ = settings_button_->bounds(); | 458 settings_button_full_bounds_ = settings_button_->bounds(); |
432 settings_button_zero_bounds_.SetRect( | 459 settings_button_zero_bounds_.SetRect( |
433 settings_button_full_bounds_.x() + | 460 settings_button_full_bounds_.x() + |
434 settings_button_full_bounds_.width() / 2, | 461 settings_button_full_bounds_.width() / 2, |
435 settings_button_full_bounds_.y() + | 462 settings_button_full_bounds_.y() + |
436 settings_button_full_bounds_.height() / 2, | 463 settings_button_full_bounds_.height() / 2, |
437 0, | 464 0, |
438 0); | 465 0); |
439 | 466 |
440 // Layout the icon. | 467 // Layout the icon. |
441 int icon_y = (NonClientTopBorderHeight() - kIconSize) / 2; | 468 int icon_y = (NonClientTopBorderHeight() - kIconSize) / 2; |
442 title_icon_->SetBounds( | 469 title_icon_->SetBounds( |
443 kFrameBorderThickness + kIconSpacing, | 470 kBorderThickness + kIconAndBorderSpacing, |
444 icon_y, | 471 icon_y, |
445 kIconSize, | 472 kIconSize, |
446 kIconSize); | 473 kIconSize); |
447 | 474 |
448 // Layout the title. | 475 // Layout the title. |
449 int title_x = title_icon_->bounds().right() + kIconSpacing; | 476 int title_x = title_icon_->bounds().right() + kTitleSpacing; |
450 int title_height = BrowserFrame::GetTitleFont().GetHeight(); | 477 int title_height = BrowserFrame::GetTitleFont().GetHeight(); |
451 title_label_->SetBounds( | 478 title_label_->SetBounds( |
452 title_x, | 479 title_x, |
453 icon_y + ((kIconSize - title_height - 1) / 2), | 480 icon_y + ((kIconSize - title_height - 1) / 2), |
454 std::max(0, settings_button_->x() - kButtonSpacing - title_x), | 481 std::max(0, settings_button_->x() - kTitleSpacing - title_x), |
455 title_height); | 482 title_height); |
456 | 483 |
457 // Calculate the client area bounds. | 484 // Calculate the client area bounds. |
458 int top_height = NonClientTopBorderHeight(); | 485 int top_height = NonClientTopBorderHeight(); |
459 int border_thickness = NonClientBorderThickness(); | 486 int border_thickness = NonClientBorderThickness(); |
460 client_view_bounds_.SetRect( | 487 client_view_bounds_.SetRect( |
461 border_thickness, | 488 border_thickness, |
462 top_height, | 489 top_height, |
463 std::max(0, width() - (2 * border_thickness)), | 490 std::max(0, width() - (2 * border_thickness)), |
464 std::max(0, height() - top_height - border_thickness)); | 491 std::max(0, height() - top_height - border_thickness)); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
546 AnimationEnded(animation); | 573 AnimationEnded(animation); |
547 else | 574 else |
548 settings_button_->SetBoundsRect(new_bounds); | 575 settings_button_->SetBoundsRect(new_bounds); |
549 } | 576 } |
550 | 577 |
551 void PanelBrowserFrameView::AnimationCanceled(const ui::Animation* animation) { | 578 void PanelBrowserFrameView::AnimationCanceled(const ui::Animation* animation) { |
552 AnimationEnded(animation); | 579 AnimationEnded(animation); |
553 } | 580 } |
554 | 581 |
555 int PanelBrowserFrameView::NonClientBorderThickness() const { | 582 int PanelBrowserFrameView::NonClientBorderThickness() const { |
556 return kFrameBorderThickness + kClientEdgeThickness; | 583 return kBorderThickness + kPanelClientEdgeThickness; |
557 } | 584 } |
558 | 585 |
559 int PanelBrowserFrameView::NonClientTopBorderHeight() const { | 586 int PanelBrowserFrameView::NonClientTopBorderHeight() const { |
560 return kFrameBorderThickness + kTitlebarHeight + kClientEdgeThickness; | 587 return kBorderThickness + kTitlebarHeight + kPanelClientEdgeThickness; |
561 } | 588 } |
562 | 589 |
563 gfx::Size PanelBrowserFrameView::NonClientAreaSize() const { | 590 gfx::Size PanelBrowserFrameView::NonClientAreaSize() const { |
564 return gfx::Size(NonClientBorderThickness() * 2, | 591 return gfx::Size(NonClientBorderThickness() * 2, |
565 NonClientTopBorderHeight() + NonClientBorderThickness()); | 592 NonClientTopBorderHeight() + NonClientBorderThickness()); |
566 } | 593 } |
567 | 594 |
595 bool PanelBrowserFrameView::UsingDefaultTheme() const { | |
596 ThemeService* theme_service = ThemeServiceFactory::GetForProfile( | |
597 panel_browser_view_->panel()->browser()->profile()); | |
598 return theme_service->UsingDefaultTheme(); | |
599 } | |
600 | |
601 SkColor PanelBrowserFrameView::GetDefaultTitleColor( | |
602 PaintState paint_state) const { | |
603 switch (paint_state) { | |
604 case PAINT_AS_INACTIVE: | |
605 return kActiveTitleTextDefaultColor; | |
606 case PAINT_AS_ACTIVE: | |
607 return kInactiveTitleTextDefaultColor; | |
608 case PAINT_FOR_ATTENTION: | |
609 return kAttentionTitleTextColor; | |
610 default: | |
611 NOTREACHED(); | |
612 return SkColor(); | |
613 } | |
614 } | |
615 | |
568 SkColor PanelBrowserFrameView::GetTitleColor(PaintState paint_state) const { | 616 SkColor PanelBrowserFrameView::GetTitleColor(PaintState paint_state) const { |
569 switch (paint_state) { | 617 switch (paint_state) { |
570 case PAINT_AS_INACTIVE: | 618 case PAINT_AS_INACTIVE: |
571 return GetThemeProvider()->GetColor( | 619 return SkColorSetA( |
572 ThemeService::COLOR_BACKGROUND_TAB_TEXT); | 620 GetThemeProvider()->GetColor(ThemeService::COLOR_BACKGROUND_TAB_TEXT), |
621 kInactiveAlphaBlending); | |
573 case PAINT_AS_ACTIVE: | 622 case PAINT_AS_ACTIVE: |
574 return GetThemeProvider()->GetColor(ThemeService::COLOR_TAB_TEXT); | 623 return GetThemeProvider()->GetColor(ThemeService::COLOR_TAB_TEXT); |
575 case PAINT_FOR_ATTENTION: | 624 case PAINT_FOR_ATTENTION: |
576 return kTitleTextColorForAttention; | 625 return kAttentionTitleTextColor; |
577 default: | 626 default: |
578 NOTREACHED(); | 627 NOTREACHED(); |
579 return SkColor(); | 628 return SkColor(); |
580 } | 629 } |
581 } | 630 } |
582 | 631 |
583 gfx::Font* PanelBrowserFrameView::GetTitleFont() const { | 632 gfx::Font* PanelBrowserFrameView::GetTitleFont() const { |
584 return title_font; | 633 return title_font; |
585 } | 634 } |
586 | 635 |
636 SkPaint* PanelBrowserFrameView::GetDefaultFrameTheme( | |
637 PaintState paint_state) const { | |
638 switch (paint_state) { | |
639 case PAINT_AS_INACTIVE: | |
640 return &inactive_background_default_paint; | |
641 case PAINT_AS_ACTIVE: | |
642 return &active_background_default_paint; | |
643 case PAINT_FOR_ATTENTION: | |
644 return &attention_background_paint; | |
645 default: | |
646 NOTREACHED(); | |
647 return NULL; | |
648 } | |
649 } | |
650 | |
587 SkBitmap* PanelBrowserFrameView::GetFrameTheme(PaintState paint_state) const { | 651 SkBitmap* PanelBrowserFrameView::GetFrameTheme(PaintState paint_state) const { |
588 switch (paint_state) { | 652 switch (paint_state) { |
589 case PAINT_AS_INACTIVE: | 653 case PAINT_AS_INACTIVE: |
590 return GetThemeProvider()->GetBitmapNamed(IDR_THEME_TAB_BACKGROUND); | 654 return GetThemeProvider()->GetBitmapNamed(IDR_THEME_TAB_BACKGROUND); |
591 case PAINT_AS_ACTIVE: | 655 case PAINT_AS_ACTIVE: |
592 return GetThemeProvider()->GetBitmapNamed(IDR_THEME_TOOLBAR); | 656 return GetThemeProvider()->GetBitmapNamed(IDR_THEME_TOOLBAR); |
593 case PAINT_FOR_ATTENTION: | 657 case PAINT_FOR_ATTENTION: |
594 return background_bitmap_for_attention; | 658 // Background color for drawing attention is same regardless of the |
659 // theme. GetDefaultFrameTheme should be used. | |
595 default: | 660 default: |
596 NOTREACHED(); | 661 NOTREACHED(); |
597 return NULL; | 662 return NULL; |
598 } | 663 } |
599 } | 664 } |
600 | 665 |
601 void PanelBrowserFrameView::UpdateControlStyles(PaintState paint_state) { | 666 void PanelBrowserFrameView::UpdateControlStyles(PaintState paint_state) { |
602 DCHECK(paint_state != NOT_PAINTED); | 667 DCHECK(paint_state != NOT_PAINTED); |
603 | 668 |
604 if (paint_state == paint_state_) | 669 if (paint_state == paint_state_) |
605 return; | 670 return; |
606 paint_state_ = paint_state; | 671 paint_state_ = paint_state; |
607 | 672 |
608 SkColor title_color = GetTitleColor(paint_state_); | 673 SkColor title_color = GetTitleColor(paint_state_); |
609 title_label_->SetEnabledColor(title_color); | 674 title_label_->SetEnabledColor(title_color); |
610 title_label_->SetFont(*GetTitleFont()); | 675 title_label_->SetFont(*GetTitleFont()); |
611 | 676 |
612 close_button_->SetBackground(title_color, | 677 close_button_->SetBackground(title_color, |
613 close_button_resources.normal_image, | 678 close_button_resources.normal_image, |
614 close_button_resources.mask_image); | 679 close_button_resources.mask_image); |
615 } | 680 } |
616 | 681 |
617 void PanelBrowserFrameView::PaintFrameBorder(gfx::Canvas* canvas) { | 682 void PanelBrowserFrameView::PaintFrameBorder(gfx::Canvas* canvas) { |
618 SkBitmap* theme_frame = GetFrameTheme(paint_state_); | 683 // Paint the background. |
619 | 684 if (paint_state_ == PAINT_FOR_ATTENTION || UsingDefaultTheme()) { |
620 // Draw the theme frame. | 685 SkPaint* paint = GetDefaultFrameTheme(paint_state_); |
621 canvas->TileImageInt(*theme_frame, 0, 0, width(), height()); | 686 canvas->DrawRectInt(0, 0, width(), kTitlebarHeight, *paint); |
622 | 687 } else { |
623 // No need to paint other stuff if panel is minimized. | 688 SkBitmap* bitmap = GetFrameTheme(paint_state_); |
624 if (height() <= Panel::kMinimizedPanelHeight) | 689 canvas->TileImageInt(*bitmap, 0, 0, width(), kTitlebarHeight); |
625 return; | 690 } |
626 | 691 |
627 // Draw the top border. | 692 // Draw the top border. |
628 canvas->DrawBitmapInt(*(frame_edges.top_left), 0, 0); | 693 canvas->DrawBitmapInt(*(frame_edges.top_left), 0, 0); |
629 canvas->TileImageInt( | 694 canvas->TileImageInt( |
630 *(frame_edges.top), frame_edges.top_left->width(), 0, | 695 *(frame_edges.top), frame_edges.top_left->width(), 0, |
631 width() - frame_edges.top_right->width(), frame_edges.top->height()); | 696 width() - frame_edges.top_right->width(), frame_edges.top->height()); |
632 canvas->DrawBitmapInt( | 697 canvas->DrawBitmapInt( |
633 *(frame_edges.top_right), | 698 *(frame_edges.top_right), |
634 width() - frame_edges.top_right->width(), 0); | 699 width() - frame_edges.top_right->width(), 0); |
635 | 700 |
(...skipping 18 matching lines...) Expand all Loading... | |
654 canvas->DrawBitmapInt( | 719 canvas->DrawBitmapInt( |
655 *(frame_edges.bottom_left), 0, | 720 *(frame_edges.bottom_left), 0, |
656 height() - frame_edges.bottom_left->height()); | 721 height() - frame_edges.bottom_left->height()); |
657 | 722 |
658 // Draw the left border. | 723 // Draw the left border. |
659 canvas->TileImageInt( | 724 canvas->TileImageInt( |
660 *(frame_edges.left), 0, frame_edges.top_left->height(), | 725 *(frame_edges.left), 0, frame_edges.top_left->height(), |
661 frame_edges.left->width(), | 726 frame_edges.left->width(), |
662 height() - frame_edges.top_left->height() - | 727 height() - frame_edges.top_left->height() - |
663 frame_edges.bottom_left->height()); | 728 frame_edges.bottom_left->height()); |
664 } | |
665 | 729 |
666 void PanelBrowserFrameView::PaintClientEdge(gfx::Canvas* canvas) { | 730 // Draw the divider between the titlebar and the client area. |
667 int client_area_top = client_view_bounds_.y(); | 731 if (height() > kTitlebarHeight) { |
668 | 732 canvas->DrawRectInt(kDividerColor, kBorderThickness, kTitlebarHeight, |
669 // No need to paint other stuff if panel is minimized. | 733 width() - 1 - 2 * kBorderThickness, kBorderThickness); |
670 if (height() <= Panel::kMinimizedPanelHeight) | 734 } |
671 return; | |
672 | |
673 // Draw the top edge. | |
674 int top_edge_y = client_area_top - client_edges.top->height(); | |
675 canvas->DrawBitmapInt( | |
676 *(client_edges.top_left), | |
677 client_view_bounds_.x() - client_edges.top_left->width(), | |
678 top_edge_y); | |
679 canvas->TileImageInt( | |
680 *(client_edges.top), client_view_bounds_.x(), top_edge_y, | |
681 client_view_bounds_.width(), client_edges.top->height()); | |
682 canvas->DrawBitmapInt( | |
683 *(client_edges.top_right), client_view_bounds_.right(), top_edge_y); | |
684 | |
685 // Draw the right edge. | |
686 int client_area_bottom = | |
687 std::max(client_area_top, client_view_bounds_.bottom()); | |
688 int client_area_height = client_area_bottom - client_area_top; | |
689 canvas->TileImageInt( | |
690 *(client_edges.right), client_view_bounds_.right(), client_area_top, | |
691 client_edges.right->width(), client_area_height); | |
692 | |
693 // Draw the bottom edge. | |
694 canvas->DrawBitmapInt( | |
695 *(client_edges.bottom_right), client_view_bounds_.right(), | |
696 client_area_bottom); | |
697 canvas->TileImageInt( | |
698 *(client_edges.bottom), client_view_bounds_.x(), client_area_bottom, | |
699 client_view_bounds_.width(), client_edges.bottom_right->height()); | |
700 canvas->DrawBitmapInt( | |
701 *(client_edges.bottom_left), | |
702 client_view_bounds_.x() - client_edges.bottom_left->width(), | |
703 client_area_bottom); | |
704 | |
705 // Draw the left edge. | |
706 canvas->TileImageInt( | |
707 *(client_edges.left), | |
708 client_view_bounds_.x() - client_edges.left->width(), | |
709 client_area_top, client_edges.left->width(), client_area_height); | |
710 } | 735 } |
711 | 736 |
712 string16 PanelBrowserFrameView::GetTitleText() const { | 737 string16 PanelBrowserFrameView::GetTitleText() const { |
713 return frame()->widget_delegate()->GetWindowTitle(); | 738 return frame()->widget_delegate()->GetWindowTitle(); |
714 } | 739 } |
715 | 740 |
716 void PanelBrowserFrameView::UpdateTitleBar() { | 741 void PanelBrowserFrameView::UpdateTitleBar() { |
717 title_label_->SetText(GetTitleText()); | 742 title_label_->SetText(GetTitleText()); |
718 } | 743 } |
719 | 744 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
765 | 790 |
766 settings_menu_model_.reset( | 791 settings_menu_model_.reset( |
767 new PanelSettingsMenuModel(panel_browser_view_->panel())); | 792 new PanelSettingsMenuModel(panel_browser_view_->panel())); |
768 settings_menu_adapter_.reset( | 793 settings_menu_adapter_.reset( |
769 new views::MenuModelAdapter(settings_menu_model_.get())); | 794 new views::MenuModelAdapter(settings_menu_model_.get())); |
770 settings_menu_ = new views::MenuItemView(settings_menu_adapter_.get()); | 795 settings_menu_ = new views::MenuItemView(settings_menu_adapter_.get()); |
771 settings_menu_adapter_->BuildMenu(settings_menu_); | 796 settings_menu_adapter_->BuildMenu(settings_menu_); |
772 settings_menu_runner_.reset(new views::MenuRunner(settings_menu_)); | 797 settings_menu_runner_.reset(new views::MenuRunner(settings_menu_)); |
773 return true; | 798 return true; |
774 } | 799 } |
OLD | NEW |