Chromium Code Reviews| 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 "chrome/browser/extensions/extension_prefs.h" | |
| 8 #include "chrome/browser/extensions/extension_service.h" | |
| 9 #include "chrome/browser/profiles/profile.h" | |
| 7 #include "chrome/browser/themes/theme_service.h" | 10 #include "chrome/browser/themes/theme_service.h" |
| 8 #include "chrome/browser/ui/panels/about_panel_bubble.h" | |
| 9 #include "chrome/browser/ui/panels/panel.h" | 11 #include "chrome/browser/ui/panels/panel.h" |
| 10 #include "chrome/browser/ui/panels/panel_browser_view.h" | 12 #include "chrome/browser/ui/panels/panel_browser_view.h" |
| 11 #include "chrome/browser/ui/panels/panel_manager.h" | 13 #include "chrome/browser/ui/panels/panel_manager.h" |
| 14 #include "chrome/browser/web_applications/web_app.h" | |
| 15 #include "chrome/common/extensions/extension.h" | |
| 16 #include "chrome/common/url_constants.h" | |
| 12 #include "content/browser/tab_contents/tab_contents.h" | 17 #include "content/browser/tab_contents/tab_contents.h" |
| 13 #include "grit/app_resources.h" | 18 #include "grit/app_resources.h" |
| 14 #include "grit/generated_resources.h" | 19 #include "grit/generated_resources.h" |
| 15 #include "grit/theme_resources.h" | 20 #include "grit/theme_resources.h" |
| 16 #include "grit/theme_resources_standard.h" | 21 #include "grit/theme_resources_standard.h" |
| 17 #include "third_party/skia/include/effects/SkGradientShader.h" | 22 #include "third_party/skia/include/effects/SkGradientShader.h" |
| 18 #include "ui/base/accessibility/accessible_view_state.h" | 23 #include "ui/base/accessibility/accessible_view_state.h" |
| 19 #include "ui/base/l10n/l10n_util.h" | 24 #include "ui/base/l10n/l10n_util.h" |
| 20 #include "ui/base/resource/resource_bundle.h" | 25 #include "ui/base/resource/resource_bundle.h" |
| 21 #include "ui/gfx/canvas_skia.h" | 26 #include "ui/gfx/canvas_skia.h" |
| 22 #include "views/controls/button/image_button.h" | 27 #include "views/controls/button/image_button.h" |
| 28 #include "views/controls/button/menu_button.h" | |
| 23 #include "views/controls/label.h" | 29 #include "views/controls/label.h" |
| 30 #include "views/controls/menu/menu_2.h" | |
| 24 #include "views/painter.h" | 31 #include "views/painter.h" |
| 25 #include "views/screen.h" | 32 #include "views/screen.h" |
| 26 #include "views/window/window.h" | 33 #include "views/window/window.h" |
| 27 #include "views/window/window_shape.h" | 34 #include "views/window/window_shape.h" |
| 28 | 35 |
| 29 #if !defined(OS_WIN) | 36 #if !defined(OS_WIN) |
| 30 #include "views/window/hit_test.h" | 37 #include "views/window/hit_test.h" |
| 31 #endif | 38 #endif |
| 32 | 39 |
| 33 namespace { | 40 namespace { |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 81 top = rb.GetBitmapNamed(top_id); | 88 top = rb.GetBitmapNamed(top_id); |
| 82 top_right = rb.GetBitmapNamed(top_right_id); | 89 top_right = rb.GetBitmapNamed(top_right_id); |
| 83 right = rb.GetBitmapNamed(right_id); | 90 right = rb.GetBitmapNamed(right_id); |
| 84 bottom_right = rb.GetBitmapNamed(bottom_right_id); | 91 bottom_right = rb.GetBitmapNamed(bottom_right_id); |
| 85 bottom = rb.GetBitmapNamed(bottom_id); | 92 bottom = rb.GetBitmapNamed(bottom_id); |
| 86 bottom_left = rb.GetBitmapNamed(bottom_left_id); | 93 bottom_left = rb.GetBitmapNamed(bottom_left_id); |
| 87 left = rb.GetBitmapNamed(left_id); | 94 left = rb.GetBitmapNamed(left_id); |
| 88 } | 95 } |
| 89 }; | 96 }; |
| 90 | 97 |
| 91 ButtonResources info_button_resources; | 98 ButtonResources wrench_button_resources; |
| 92 ButtonResources close_button_resources; | 99 ButtonResources close_button_resources; |
| 93 EdgeResources frame_edges; | 100 EdgeResources frame_edges; |
| 94 EdgeResources client_edges; | 101 EdgeResources client_edges; |
| 95 gfx::Font* active_font = NULL; | 102 gfx::Font* active_font = NULL; |
| 96 gfx::Font* inactive_font = NULL; | 103 gfx::Font* inactive_font = NULL; |
| 97 | 104 |
| 98 void LoadImageResources() { | 105 void LoadImageResources() { |
| 99 // TODO(jianli): Use the right icon for the info button. | 106 wrench_button_resources.SetResources( |
| 100 info_button_resources.SetResources( | |
| 101 IDR_BALLOON_WRENCH, 0, IDR_BALLOON_WRENCH_H, IDR_BALLOON_WRENCH_P); | 107 IDR_BALLOON_WRENCH, 0, IDR_BALLOON_WRENCH_H, IDR_BALLOON_WRENCH_P); |
| 102 | 108 |
| 103 close_button_resources.SetResources( | 109 close_button_resources.SetResources( |
| 104 IDR_TAB_CLOSE, IDR_TAB_CLOSE_MASK, IDR_TAB_CLOSE_H, IDR_TAB_CLOSE_P); | 110 IDR_TAB_CLOSE, IDR_TAB_CLOSE_MASK, IDR_TAB_CLOSE_H, IDR_TAB_CLOSE_P); |
| 105 | 111 |
| 106 frame_edges.SetResources( | 112 frame_edges.SetResources( |
| 107 IDR_WINDOW_TOP_LEFT_CORNER, IDR_WINDOW_TOP_CENTER, | 113 IDR_WINDOW_TOP_LEFT_CORNER, IDR_WINDOW_TOP_CENTER, |
| 108 IDR_WINDOW_TOP_RIGHT_CORNER, IDR_WINDOW_RIGHT_SIDE, | 114 IDR_WINDOW_TOP_RIGHT_CORNER, IDR_WINDOW_RIGHT_SIDE, |
| 109 IDR_WINDOW_BOTTOM_RIGHT_CORNER, IDR_WINDOW_BOTTOM_CENTER, | 115 IDR_WINDOW_BOTTOM_RIGHT_CORNER, IDR_WINDOW_BOTTOM_CENTER, |
| 110 IDR_WINDOW_BOTTOM_LEFT_CORNER, IDR_WINDOW_LEFT_SIDE); | 116 IDR_WINDOW_BOTTOM_LEFT_CORNER, IDR_WINDOW_LEFT_SIDE); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 184 } | 190 } |
| 185 | 191 |
| 186 // PanelBrowserFrameView ------------------------------------------------------- | 192 // PanelBrowserFrameView ------------------------------------------------------- |
| 187 | 193 |
| 188 PanelBrowserFrameView::PanelBrowserFrameView(BrowserFrame* frame, | 194 PanelBrowserFrameView::PanelBrowserFrameView(BrowserFrame* frame, |
| 189 PanelBrowserView* browser_view) | 195 PanelBrowserView* browser_view) |
| 190 : BrowserNonClientFrameView(), | 196 : BrowserNonClientFrameView(), |
| 191 frame_(frame), | 197 frame_(frame), |
| 192 browser_view_(browser_view), | 198 browser_view_(browser_view), |
| 193 paint_state_(NOT_PAINTED), | 199 paint_state_(NOT_PAINTED), |
| 194 info_button_(NULL), | 200 wrench_button_(NULL), |
| 195 close_button_(NULL), | 201 close_button_(NULL), |
| 196 title_icon_(NULL), | 202 title_icon_(NULL), |
| 197 title_label_(NULL) { | 203 title_label_(NULL) { |
| 198 EnsureResourcesInitialized(); | 204 EnsureResourcesInitialized(); |
| 199 frame_->set_frame_type(views::Window::FRAME_TYPE_FORCE_CUSTOM); | 205 frame_->set_frame_type(views::Window::FRAME_TYPE_FORCE_CUSTOM); |
| 200 | 206 |
| 201 info_button_ = new views::ImageButton(this); | 207 wrench_button_ = new views::MenuButton(NULL, std::wstring(), this, false); |
| 202 info_button_->SetImage(views::CustomButton::BS_NORMAL, | 208 wrench_button_->SetIcon(*(wrench_button_resources.normal_image)); |
| 203 info_button_resources.normal_image); | 209 wrench_button_->SetHoverIcon(*(wrench_button_resources.hover_image)); |
| 204 info_button_->SetImage(views::CustomButton::BS_HOT, | 210 wrench_button_->SetPushedIcon(*(wrench_button_resources.pushed_image)); |
| 205 info_button_resources.hover_image); | 211 wrench_button_->set_alignment(views::TextButton::ALIGN_CENTER); |
| 206 info_button_->SetImage(views::CustomButton::BS_PUSHED, | 212 wrench_button_->set_border(NULL); |
| 207 info_button_resources.pushed_image); | 213 wrench_button_->SetTooltipText( |
| 208 info_button_->SetTooltipText( | 214 UTF16ToWide(l10n_util::GetStringUTF16(IDS_NEW_TAB_APP_SETTINGS))); |
| 209 UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_ABOUT_PANEL))); | 215 wrench_button_->SetAccessibleName( |
| 210 info_button_->SetAccessibleName( | 216 l10n_util::GetStringUTF16(IDS_NEW_TAB_APP_SETTINGS)); |
| 211 l10n_util::GetStringUTF16(IDS_ACCNAME_ABOUT_PANEL)); | 217 wrench_button_->SetVisible(false); |
| 212 info_button_->SetVisible(false); | 218 AddChildView(wrench_button_); |
| 213 AddChildView(info_button_); | |
| 214 | 219 |
| 215 close_button_ = new views::ImageButton(this); | 220 close_button_ = new views::ImageButton(this); |
| 216 close_button_->SetImage(views::CustomButton::BS_NORMAL, | 221 close_button_->SetImage(views::CustomButton::BS_NORMAL, |
| 217 close_button_resources.normal_image); | 222 close_button_resources.normal_image); |
| 218 close_button_->SetImage(views::CustomButton::BS_HOT, | 223 close_button_->SetImage(views::CustomButton::BS_HOT, |
| 219 close_button_resources.hover_image); | 224 close_button_resources.hover_image); |
| 220 close_button_->SetImage(views::CustomButton::BS_PUSHED, | 225 close_button_->SetImage(views::CustomButton::BS_PUSHED, |
| 221 close_button_resources.pushed_image); | 226 close_button_resources.pushed_image); |
| 222 close_button_->SetTooltipText( | 227 close_button_->SetTooltipText( |
| 223 UTF16ToWide(l10n_util::GetStringUTF16(IDS_TOOLTIP_CLOSE_TAB))); | 228 UTF16ToWide(l10n_util::GetStringUTF16(IDS_TOOLTIP_CLOSE_TAB))); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 317 PAINT_AS_ACTIVE : PAINT_AS_INACTIVE); | 322 PAINT_AS_ACTIVE : PAINT_AS_INACTIVE); |
| 318 PaintFrameBorder(canvas); | 323 PaintFrameBorder(canvas); |
| 319 PaintClientEdge(canvas); | 324 PaintClientEdge(canvas); |
| 320 } | 325 } |
| 321 | 326 |
| 322 void PanelBrowserFrameView::OnThemeChanged() { | 327 void PanelBrowserFrameView::OnThemeChanged() { |
| 323 LoadImageResources(); | 328 LoadImageResources(); |
| 324 } | 329 } |
| 325 | 330 |
| 326 void PanelBrowserFrameView::Layout() { | 331 void PanelBrowserFrameView::Layout() { |
| 327 // Now that we know we have a parent, we can safely set our theme colors. | |
| 328 SkColor title_color = | |
| 329 GetThemeProvider()->GetColor(ThemeService::COLOR_TAB_TEXT); | |
| 330 title_label_->SetColor(title_color); | |
| 331 close_button_->SetBackground(title_color, | |
| 332 close_button_resources.normal_image, | |
| 333 close_button_resources.mask_image); | |
| 334 | |
| 335 // Layout the close button. | 332 // Layout the close button. |
| 336 gfx::Size close_button_size = close_button_->GetPreferredSize(); | 333 gfx::Size close_button_size = close_button_->GetPreferredSize(); |
| 337 close_button_->SetBounds( | 334 close_button_->SetBounds( |
| 338 width() - kFrameBorderThickness - kButtonSpacing - | 335 width() - kFrameBorderThickness - kButtonSpacing - |
| 339 close_button_size.width(), | 336 close_button_size.width(), |
| 340 (NonClientTopBorderHeight() - close_button_size.height()) / 2, | 337 (NonClientTopBorderHeight() - close_button_size.height()) / 2, |
| 341 close_button_size.width(), | 338 close_button_size.width(), |
| 342 close_button_size.height()); | 339 close_button_size.height()); |
| 343 | 340 |
| 344 // Layout the info button. | 341 // Layout the wrench button. |
| 345 gfx::Size info_button_size = info_button_->GetPreferredSize(); | 342 gfx::Size wrench_button_size = wrench_button_->GetPreferredSize(); |
| 346 info_button_->SetBounds( | 343 wrench_button_->SetBounds( |
| 347 close_button_->x() - kButtonSpacing - info_button_size.width(), | 344 close_button_->x() - kButtonSpacing - wrench_button_size.width(), |
| 348 (NonClientTopBorderHeight() - info_button_size.height()) / 2, | 345 (NonClientTopBorderHeight() - wrench_button_size.height()) / 2, |
| 349 info_button_size.width(), | 346 wrench_button_size.width(), |
| 350 info_button_size.height()); | 347 wrench_button_size.height()); |
| 351 | 348 |
| 352 // Layout the icon. | 349 // Layout the icon. |
| 353 int icon_y = (NonClientTopBorderHeight() - kIconSize) / 2; | 350 int icon_y = (NonClientTopBorderHeight() - kIconSize) / 2; |
| 354 title_icon_->SetBounds( | 351 title_icon_->SetBounds( |
| 355 kFrameBorderThickness + kIconSpacing, | 352 kFrameBorderThickness + kIconSpacing, |
| 356 icon_y, | 353 icon_y, |
| 357 kIconSize, | 354 kIconSize, |
| 358 kIconSize); | 355 kIconSize); |
| 359 | 356 |
| 360 // Layout the title. | 357 // Layout the title. |
| 361 int title_x = title_icon_->bounds().right() + kIconSpacing; | 358 int title_x = title_icon_->bounds().right() + kIconSpacing; |
| 362 int title_height = BrowserFrame::GetTitleFont().GetHeight(); | 359 int title_height = BrowserFrame::GetTitleFont().GetHeight(); |
| 363 title_label_->SetBounds( | 360 title_label_->SetBounds( |
| 364 title_x, | 361 title_x, |
| 365 icon_y + ((kIconSize - title_height - 1) / 2), | 362 icon_y + ((kIconSize - title_height - 1) / 2), |
| 366 std::max(0, info_button_->x() - kButtonSpacing - title_x), | 363 std::max(0, wrench_button_->x() - kButtonSpacing - title_x), |
| 367 title_height); | 364 title_height); |
| 368 | 365 |
| 369 // Calculate the client area bounds. | 366 // Calculate the client area bounds. |
| 370 int top_height = NonClientTopBorderHeight(); | 367 int top_height = NonClientTopBorderHeight(); |
| 371 int border_thickness = NonClientBorderThickness(); | 368 int border_thickness = NonClientBorderThickness(); |
| 372 client_view_bounds_.SetRect( | 369 client_view_bounds_.SetRect( |
| 373 border_thickness, | 370 border_thickness, |
| 374 top_height, | 371 top_height, |
| 375 std::max(0, width() - (2 * border_thickness)), | 372 std::max(0, width() - (2 * border_thickness)), |
| 376 std::max(0, height() - top_height - border_thickness)); | 373 std::max(0, height() - top_height - border_thickness)); |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 401 void PanelBrowserFrameView::OnMouseCaptureLost() { | 398 void PanelBrowserFrameView::OnMouseCaptureLost() { |
| 402 if (browser_view_->OnTitleBarMouseCaptureLost()) | 399 if (browser_view_->OnTitleBarMouseCaptureLost()) |
| 403 return; | 400 return; |
| 404 BrowserNonClientFrameView::OnMouseCaptureLost(); | 401 BrowserNonClientFrameView::OnMouseCaptureLost(); |
| 405 } | 402 } |
| 406 | 403 |
| 407 void PanelBrowserFrameView::ButtonPressed(views::Button* sender, | 404 void PanelBrowserFrameView::ButtonPressed(views::Button* sender, |
| 408 const views::Event& event) { | 405 const views::Event& event) { |
| 409 if (sender == close_button_) | 406 if (sender == close_button_) |
| 410 frame_->Close(); | 407 frame_->Close(); |
| 411 else if (sender == info_button_) { | 408 } |
| 412 gfx::Point origin(info_button_->bounds().origin()); | 409 |
| 413 views::View::ConvertPointToScreen(this, &origin); | 410 void PanelBrowserFrameView::RunMenu(View* source, const gfx::Point& pt) { |
| 414 AboutPanelBubble::Show( | 411 EnsureCreateWrenchMenu(); |
| 415 GetWidget(), | 412 wrench_menu_->RunMenuAt(pt, views::Menu2::ALIGN_TOPRIGHT); |
| 416 gfx::Rect(origin, info_button_->bounds().size()), | 413 } |
| 417 BubbleBorder::BOTTOM_RIGHT, | 414 |
| 418 GetFaviconForTabIconView(), | 415 bool PanelBrowserFrameView::IsCommandIdChecked(int command_id) const { |
| 419 browser_view_->browser()); | 416 // Nothing in the menu is checked. |
| 417 return false; | |
| 418 } | |
| 419 | |
| 420 bool PanelBrowserFrameView::IsCommandIdEnabled(int command_id) const { | |
| 421 const Extension* extension = GetExtension(); | |
| 422 if (!extension) | |
| 423 return false; | |
| 424 | |
| 425 if (command_id == COMMAND_NAME) { | |
| 426 // The NAME links to the Homepage URL. If the extension doesn't have a | |
| 427 // homepage, we just disable this menu item. | |
| 428 return extension->GetHomepageURL().is_valid(); | |
| 429 } else if (command_id == COMMAND_CONFIGURE) { | |
| 430 return extension->options_url().spec().length() > 0; | |
| 431 } else if (command_id == COMMAND_DISABLE || command_id == COMMAND_UNINSTALL) { | |
| 432 // Some extension types can not be disabled or uninstalled. | |
| 433 return Extension::UserMayDisable(extension->location()); | |
| 434 } | |
| 435 return true; | |
| 436 } | |
| 437 | |
| 438 bool PanelBrowserFrameView::GetAcceleratorForCommandId( | |
| 439 int command_id, ui::Accelerator* accelerator) { | |
| 440 return false; | |
| 441 } | |
| 442 | |
| 443 void PanelBrowserFrameView::ExecuteCommand(int command_id) { | |
| 444 const Extension* extension = GetExtension(); | |
| 445 if (!extension) | |
| 446 return; | |
| 447 | |
| 448 Browser* browser = browser_view_->browser(); | |
| 449 switch (command_id) { | |
| 450 case COMMAND_NAME: | |
| 451 browser->OpenURL(extension->GetHomepageURL(), | |
| 452 GURL(), | |
| 453 NEW_FOREGROUND_TAB, | |
| 454 PageTransition::LINK); | |
| 455 break; | |
| 456 case COMMAND_CONFIGURE: | |
| 457 DCHECK(!extension->options_url().is_empty()); | |
| 458 browser->GetProfile()->GetExtensionProcessManager()->OpenOptionsPage( | |
| 459 extension, browser); | |
| 460 break; | |
| 461 case COMMAND_DISABLE: | |
|
Dmitry Titov
2011/06/01 20:06:20
Should we also Close the Panel here? Same for Unin
jianli
2011/06/01 20:39:50
It is not needed for both Close and Uninstall. Sin
| |
| 462 browser->GetProfile()->GetExtensionService()->DisableExtension( | |
| 463 extension->id()); | |
| 464 break; | |
| 465 case COMMAND_UNINSTALL: | |
| 466 extension_uninstall_dialog_.reset(new ExtensionUninstallDialog( | |
|
Dmitry Titov
2011/06/01 20:06:20
Do we need to ensure the panel is not closed (poss
jianli
2011/06/01 20:39:50
The panel can be closed since the uninstall dialog
jianli
2011/06/01 23:23:38
Added a TODO item as discussed.
| |
| 467 browser->GetProfile())); | |
| 468 extension_uninstall_dialog_->ConfirmUninstall(this, extension); | |
| 469 break; | |
| 470 case COMMAND_MANAGE: | |
| 471 browser->OpenURL(GURL(chrome::kChromeUIExtensionsURL), | |
| 472 GURL(), | |
| 473 SINGLETON_TAB, | |
| 474 PageTransition::LINK); | |
| 475 break; | |
| 476 default: | |
| 477 NOTREACHED(); | |
| 478 break; | |
| 420 } | 479 } |
| 421 } | 480 } |
| 422 | 481 |
| 423 bool PanelBrowserFrameView::ShouldTabIconViewAnimate() const { | 482 bool PanelBrowserFrameView::ShouldTabIconViewAnimate() const { |
| 424 // This function is queried during the creation of the window as the | 483 // This function is queried during the creation of the window as the |
| 425 // TabIconView we host is initialized, so we need to NULL check the selected | 484 // TabIconView we host is initialized, so we need to NULL check the selected |
| 426 // TabContents because in this condition there is not yet a selected tab. | 485 // TabContents because in this condition there is not yet a selected tab. |
| 427 TabContents* current_tab = browser_view_->GetSelectedTabContents(); | 486 TabContents* current_tab = browser_view_->GetSelectedTabContents(); |
| 428 return current_tab ? current_tab->is_loading() : false; | 487 return current_tab ? current_tab->is_loading() : false; |
| 429 } | 488 } |
| 430 | 489 |
| 431 SkBitmap PanelBrowserFrameView::GetFaviconForTabIconView() { | 490 SkBitmap PanelBrowserFrameView::GetFaviconForTabIconView() { |
| 432 return frame_->window_delegate()->GetWindowIcon(); | 491 return frame_->window_delegate()->GetWindowIcon(); |
| 433 } | 492 } |
| 434 | 493 |
| 494 void PanelBrowserFrameView::ExtensionDialogAccepted() { | |
| 495 const Extension* extension = GetExtension(); | |
| 496 if (extension) { | |
| 497 browser_view_->browser()->GetProfile()->GetExtensionService()-> | |
| 498 UninstallExtension(extension->id(), false, NULL); | |
| 499 } | |
| 500 } | |
| 501 | |
| 502 void PanelBrowserFrameView::ExtensionDialogCanceled() { | |
| 503 } | |
| 504 | |
| 435 int PanelBrowserFrameView::NonClientBorderThickness() const { | 505 int PanelBrowserFrameView::NonClientBorderThickness() const { |
| 436 return kFrameBorderThickness + kClientEdgeThickness; | 506 return kFrameBorderThickness + kClientEdgeThickness; |
| 437 } | 507 } |
| 438 | 508 |
| 439 int PanelBrowserFrameView::NonClientTopBorderHeight() const { | 509 int PanelBrowserFrameView::NonClientTopBorderHeight() const { |
| 440 return kFrameBorderThickness + kTitleBarHeight + kClientEdgeThickness; | 510 return kFrameBorderThickness + kTitleBarHeight + kClientEdgeThickness; |
| 441 } | 511 } |
| 442 | 512 |
| 443 void PanelBrowserFrameView::UpdateControlStyles(PaintState paint_state) { | 513 void PanelBrowserFrameView::UpdateControlStyles(PaintState paint_state) { |
| 444 DCHECK(paint_state != NOT_PAINTED); | 514 DCHECK(paint_state != NOT_PAINTED); |
| 445 | 515 |
| 446 if (paint_state == paint_state_) | 516 if (paint_state == paint_state_) |
| 447 return; | 517 return; |
| 448 paint_state_ = paint_state; | 518 paint_state_ = paint_state; |
| 449 | 519 |
| 450 // For now, the only indication is whether the font is bold or not. | 520 SkColor title_color = GetThemeProvider()-> |
| 521 GetColor(paint_state == PAINT_AS_ACTIVE ? | |
| 522 ThemeService::COLOR_TAB_TEXT : | |
| 523 ThemeService::COLOR_BACKGROUND_TAB_TEXT); | |
| 524 title_label_->SetColor(title_color); | |
| 451 title_label_->SetFont( | 525 title_label_->SetFont( |
| 452 paint_state == PAINT_AS_ACTIVE ? *active_font : *inactive_font); | 526 paint_state == PAINT_AS_ACTIVE ? *active_font : *inactive_font); |
| 527 | |
| 528 close_button_->SetBackground(title_color, | |
| 529 close_button_resources.normal_image, | |
| 530 close_button_resources.mask_image); | |
| 453 } | 531 } |
| 454 | 532 |
| 455 void PanelBrowserFrameView::PaintFrameBorder(gfx::Canvas* canvas) { | 533 void PanelBrowserFrameView::PaintFrameBorder(gfx::Canvas* canvas) { |
| 456 SkBitmap* theme_frame = GetThemeProvider()->GetBitmapNamed(IDR_THEME_TOOLBAR); | 534 SkBitmap* theme_frame = GetThemeProvider()->GetBitmapNamed( |
| 535 (paint_state_ == PAINT_AS_ACTIVE) ? IDR_THEME_TOOLBAR | |
| 536 : IDR_THEME_TAB_BACKGROUND); | |
| 457 | 537 |
| 458 // Draw the theme frame. | 538 // Draw the theme frame. |
| 459 canvas->TileImageInt(*theme_frame, 0, 0, width(), height()); | 539 canvas->TileImageInt(*theme_frame, 0, 0, width(), height()); |
| 460 | 540 |
| 461 // Draw the top border. | 541 // Draw the top border. |
| 462 canvas->DrawBitmapInt(*(frame_edges.top_left), 0, 0); | 542 canvas->DrawBitmapInt(*(frame_edges.top_left), 0, 0); |
| 463 canvas->TileImageInt( | 543 canvas->TileImageInt( |
| 464 *(frame_edges.top), frame_edges.top_left->width(), 0, | 544 *(frame_edges.top), frame_edges.top_left->width(), 0, |
| 465 width() - frame_edges.top_right->width(), frame_edges.top->height()); | 545 width() - frame_edges.top_right->width(), frame_edges.top->height()); |
| 466 canvas->DrawBitmapInt( | 546 canvas->DrawBitmapInt( |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 538 client_view_bounds_.x() - client_edges.left->width(), | 618 client_view_bounds_.x() - client_edges.left->width(), |
| 539 client_area_top, client_edges.left->width(), client_area_height); | 619 client_area_top, client_edges.left->width(), client_area_height); |
| 540 } | 620 } |
| 541 | 621 |
| 542 void PanelBrowserFrameView::UpdateTitleBar() { | 622 void PanelBrowserFrameView::UpdateTitleBar() { |
| 543 title_label_->SetText( | 623 title_label_->SetText( |
| 544 frame_->window_delegate()->GetWindowTitle()); | 624 frame_->window_delegate()->GetWindowTitle()); |
| 545 } | 625 } |
| 546 | 626 |
| 547 void PanelBrowserFrameView::OnActivationChanged(bool active) { | 627 void PanelBrowserFrameView::OnActivationChanged(bool active) { |
| 548 UpdateInfoButtonVisibility(active, mouse_watcher_->IsCursorInViewBounds()); | 628 UpdateWrenchButtonVisibility(active, mouse_watcher_->IsCursorInViewBounds()); |
| 549 SchedulePaint(); | 629 SchedulePaint(); |
| 550 } | 630 } |
| 551 | 631 |
| 552 void PanelBrowserFrameView::OnMouseEnterOrLeaveWindow(bool mouse_entered) { | 632 void PanelBrowserFrameView::OnMouseEnterOrLeaveWindow(bool mouse_entered) { |
| 553 UpdateInfoButtonVisibility(browser_view_->panel()->IsActive(), | 633 UpdateWrenchButtonVisibility(browser_view_->panel()->IsActive(), |
| 554 mouse_entered); | 634 mouse_entered); |
| 555 } | 635 } |
| 556 | 636 |
| 557 void PanelBrowserFrameView::UpdateInfoButtonVisibility(bool active, | 637 void PanelBrowserFrameView::UpdateWrenchButtonVisibility(bool active, |
| 558 bool cursor_in_view) { | 638 bool cursor_in_view) { |
| 559 info_button_->SetVisible(active || cursor_in_view); | 639 wrench_button_->SetVisible(active || cursor_in_view); |
| 560 } | 640 } |
| 641 | |
| 642 const Extension* PanelBrowserFrameView::GetExtension() const { | |
| 643 // Find the extension. When we create a panel from an extension, the extension | |
| 644 // ID is passed as the app name to the Browser. | |
| 645 Browser* browser = browser_view_->browser(); | |
| 646 ExtensionService* extension_service = | |
| 647 browser->GetProfile()->GetExtensionService(); | |
| 648 return extension_service->GetExtensionById( | |
| 649 web_app::GetExtensionIdFromApplicationName(browser->app_name()), false); | |
| 650 } | |
| 651 | |
| 652 void PanelBrowserFrameView::EnsureCreateWrenchMenu() { | |
| 653 if (wrench_menu_.get()) | |
| 654 return; | |
| 655 | |
| 656 const Extension* extension = GetExtension(); | |
| 657 if (!extension) | |
| 658 return; | |
| 659 | |
| 660 wrench_menu_contents_.reset(new ui::SimpleMenuModel(this)); | |
| 661 | |
| 662 wrench_menu_contents_->AddItem(COMMAND_NAME, UTF8ToUTF16(extension->name())); | |
|
Dmitry Titov
2011/06/01 18:37:27
It seems that with this, we don't have any clue wh
Dmitry Titov
2011/06/01 20:06:20
Offline discussion shows we are ok with that, on a
| |
| 663 wrench_menu_contents_->AddSeparator(); | |
| 664 wrench_menu_contents_->AddItem( | |
| 665 COMMAND_CONFIGURE, l10n_util::GetStringUTF16(IDS_EXTENSIONS_OPTIONS)); | |
| 666 wrench_menu_contents_->AddItem( | |
| 667 COMMAND_DISABLE, l10n_util::GetStringUTF16(IDS_EXTENSIONS_DISABLE)); | |
| 668 wrench_menu_contents_->AddItem( | |
| 669 COMMAND_UNINSTALL, l10n_util::GetStringUTF16(IDS_EXTENSIONS_UNINSTALL)); | |
| 670 wrench_menu_contents_->AddSeparator(); | |
| 671 wrench_menu_contents_->AddItem( | |
| 672 COMMAND_MANAGE, l10n_util::GetStringUTF16(IDS_MANAGE_EXTENSIONS)); | |
| 673 | |
| 674 wrench_menu_.reset(new views::Menu2(wrench_menu_contents_.get())); | |
| 675 } | |
| OLD | NEW |