Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1803)

Unified Diff: chrome/browser/ui/panels/panel_browser_frame_view.cc

Issue 6975062: Update Panel UI looks on Windows. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/panels/panel_browser_frame_view.cc
===================================================================
--- chrome/browser/ui/panels/panel_browser_frame_view.cc (revision 87324)
+++ chrome/browser/ui/panels/panel_browser_frame_view.cc (working copy)
@@ -4,11 +4,16 @@
#include "chrome/browser/ui/panels/panel_browser_frame_view.h"
+#include "chrome/browser/extensions/extension_prefs.h"
+#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/themes/theme_service.h"
-#include "chrome/browser/ui/panels/about_panel_bubble.h"
#include "chrome/browser/ui/panels/panel.h"
#include "chrome/browser/ui/panels/panel_browser_view.h"
#include "chrome/browser/ui/panels/panel_manager.h"
+#include "chrome/browser/web_applications/web_app.h"
+#include "chrome/common/extensions/extension.h"
+#include "chrome/common/url_constants.h"
#include "content/browser/tab_contents/tab_contents.h"
#include "grit/app_resources.h"
#include "grit/generated_resources.h"
@@ -20,7 +25,9 @@
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/canvas_skia.h"
#include "views/controls/button/image_button.h"
+#include "views/controls/button/menu_button.h"
#include "views/controls/label.h"
+#include "views/controls/menu/menu_2.h"
#include "views/painter.h"
#include "views/screen.h"
#include "views/window/window.h"
@@ -88,7 +95,7 @@
}
};
-ButtonResources info_button_resources;
+ButtonResources wrench_button_resources;
jennb 2011/06/01 22:24:14 s/wrench/settings/g
jianli 2011/06/01 23:23:38 Done.
ButtonResources close_button_resources;
EdgeResources frame_edges;
EdgeResources client_edges;
@@ -96,8 +103,7 @@
gfx::Font* inactive_font = NULL;
void LoadImageResources() {
- // TODO(jianli): Use the right icon for the info button.
- info_button_resources.SetResources(
+ wrench_button_resources.SetResources(
IDR_BALLOON_WRENCH, 0, IDR_BALLOON_WRENCH_H, IDR_BALLOON_WRENCH_P);
close_button_resources.SetResources(
@@ -191,26 +197,25 @@
frame_(frame),
browser_view_(browser_view),
paint_state_(NOT_PAINTED),
- info_button_(NULL),
+ wrench_button_(NULL),
close_button_(NULL),
title_icon_(NULL),
title_label_(NULL) {
EnsureResourcesInitialized();
frame_->set_frame_type(views::Window::FRAME_TYPE_FORCE_CUSTOM);
- info_button_ = new views::ImageButton(this);
- info_button_->SetImage(views::CustomButton::BS_NORMAL,
- info_button_resources.normal_image);
- info_button_->SetImage(views::CustomButton::BS_HOT,
- info_button_resources.hover_image);
- info_button_->SetImage(views::CustomButton::BS_PUSHED,
- info_button_resources.pushed_image);
- info_button_->SetTooltipText(
- UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_ABOUT_PANEL)));
- info_button_->SetAccessibleName(
- l10n_util::GetStringUTF16(IDS_ACCNAME_ABOUT_PANEL));
- info_button_->SetVisible(false);
- AddChildView(info_button_);
+ wrench_button_ = new views::MenuButton(NULL, std::wstring(), this, false);
+ wrench_button_->SetIcon(*(wrench_button_resources.normal_image));
+ wrench_button_->SetHoverIcon(*(wrench_button_resources.hover_image));
+ wrench_button_->SetPushedIcon(*(wrench_button_resources.pushed_image));
+ wrench_button_->set_alignment(views::TextButton::ALIGN_CENTER);
+ wrench_button_->set_border(NULL);
+ wrench_button_->SetTooltipText(
+ UTF16ToWide(l10n_util::GetStringUTF16(IDS_NEW_TAB_APP_SETTINGS)));
+ wrench_button_->SetAccessibleName(
+ l10n_util::GetStringUTF16(IDS_NEW_TAB_APP_SETTINGS));
+ wrench_button_->SetVisible(false);
+ AddChildView(wrench_button_);
close_button_ = new views::ImageButton(this);
close_button_->SetImage(views::CustomButton::BS_NORMAL,
@@ -324,14 +329,6 @@
}
void PanelBrowserFrameView::Layout() {
- // Now that we know we have a parent, we can safely set our theme colors.
- SkColor title_color =
- GetThemeProvider()->GetColor(ThemeService::COLOR_TAB_TEXT);
- title_label_->SetColor(title_color);
- close_button_->SetBackground(title_color,
- close_button_resources.normal_image,
- close_button_resources.mask_image);
-
// Layout the close button.
gfx::Size close_button_size = close_button_->GetPreferredSize();
close_button_->SetBounds(
@@ -341,13 +338,13 @@
close_button_size.width(),
close_button_size.height());
- // Layout the info button.
- gfx::Size info_button_size = info_button_->GetPreferredSize();
- info_button_->SetBounds(
- close_button_->x() - kButtonSpacing - info_button_size.width(),
- (NonClientTopBorderHeight() - info_button_size.height()) / 2,
- info_button_size.width(),
- info_button_size.height());
+ // Layout the wrench button.
+ gfx::Size wrench_button_size = wrench_button_->GetPreferredSize();
+ wrench_button_->SetBounds(
+ close_button_->x() - kButtonSpacing - wrench_button_size.width(),
+ (NonClientTopBorderHeight() - wrench_button_size.height()) / 2,
+ wrench_button_size.width(),
+ wrench_button_size.height());
// Layout the icon.
int icon_y = (NonClientTopBorderHeight() - kIconSize) / 2;
@@ -363,7 +360,7 @@
title_label_->SetBounds(
title_x,
icon_y + ((kIconSize - title_height - 1) / 2),
- std::max(0, info_button_->x() - kButtonSpacing - title_x),
+ std::max(0, wrench_button_->x() - kButtonSpacing - title_x),
title_height);
// Calculate the client area bounds.
@@ -408,18 +405,80 @@
const views::Event& event) {
if (sender == close_button_)
frame_->Close();
- else if (sender == info_button_) {
- gfx::Point origin(info_button_->bounds().origin());
- views::View::ConvertPointToScreen(this, &origin);
- AboutPanelBubble::Show(
- GetWidget(),
- gfx::Rect(origin, info_button_->bounds().size()),
- BubbleBorder::BOTTOM_RIGHT,
- GetFaviconForTabIconView(),
- browser_view_->browser());
+}
+
+void PanelBrowserFrameView::RunMenu(View* source, const gfx::Point& pt) {
+ EnsureCreateWrenchMenu();
+ wrench_menu_->RunMenuAt(pt, views::Menu2::ALIGN_TOPRIGHT);
+}
+
+bool PanelBrowserFrameView::IsCommandIdChecked(int command_id) const {
+ // Nothing in the menu is checked.
+ return false;
+}
+
+bool PanelBrowserFrameView::IsCommandIdEnabled(int command_id) const {
+ const Extension* extension = GetExtension();
+ if (!extension)
+ return false;
+
+ if (command_id == COMMAND_NAME) {
jennb 2011/06/01 22:24:14 Would a switch statement be easier to read?
jianli 2011/06/01 23:23:38 Done.
+ // The NAME links to the Homepage URL. If the extension doesn't have a
+ // homepage, we just disable this menu item.
+ return extension->GetHomepageURL().is_valid();
+ } else if (command_id == COMMAND_CONFIGURE) {
+ return extension->options_url().spec().length() > 0;
+ } else if (command_id == COMMAND_DISABLE || command_id == COMMAND_UNINSTALL) {
+ // Some extension types can not be disabled or uninstalled.
+ return Extension::UserMayDisable(extension->location());
}
+ return true;
jennb 2011/06/01 22:24:14 Should return false for any unrecognized command_i
jianli 2011/06/01 23:23:38 Done.
}
+bool PanelBrowserFrameView::GetAcceleratorForCommandId(
+ int command_id, ui::Accelerator* accelerator) {
+ return false;
+}
+
+void PanelBrowserFrameView::ExecuteCommand(int command_id) {
+ const Extension* extension = GetExtension();
+ if (!extension)
+ return;
+
+ Browser* browser = browser_view_->browser();
+ switch (command_id) {
+ case COMMAND_NAME:
+ browser->OpenURL(extension->GetHomepageURL(),
+ GURL(),
+ NEW_FOREGROUND_TAB,
+ PageTransition::LINK);
+ break;
+ case COMMAND_CONFIGURE:
+ DCHECK(!extension->options_url().is_empty());
+ browser->GetProfile()->GetExtensionProcessManager()->OpenOptionsPage(
jennb 2011/06/01 22:24:14 Does this open in a new foreground tab?
jianli 2011/06/01 23:23:38 Yes.
+ extension, browser);
+ break;
+ case COMMAND_DISABLE:
+ browser->GetProfile()->GetExtensionService()->DisableExtension(
+ extension->id());
+ break;
+ case COMMAND_UNINSTALL:
+ extension_uninstall_dialog_.reset(new ExtensionUninstallDialog(
+ browser->GetProfile()));
+ extension_uninstall_dialog_->ConfirmUninstall(this, extension);
+ break;
+ case COMMAND_MANAGE:
+ browser->OpenURL(GURL(chrome::kChromeUIExtensionsURL),
+ GURL(),
+ SINGLETON_TAB,
jennb 2011/06/01 22:24:14 If there is no chrome://extensions page already op
jianli 2011/06/01 23:23:38 Yes, we will open a extension tab when it is not p
+ PageTransition::LINK);
+ break;
+ default:
+ NOTREACHED();
+ break;
+ }
+}
+
bool PanelBrowserFrameView::ShouldTabIconViewAnimate() const {
// This function is queried during the creation of the window as the
// TabIconView we host is initialized, so we need to NULL check the selected
@@ -432,6 +491,17 @@
return frame_->window_delegate()->GetWindowIcon();
}
+void PanelBrowserFrameView::ExtensionDialogAccepted() {
+ const Extension* extension = GetExtension();
+ if (extension) {
+ browser_view_->browser()->GetProfile()->GetExtensionService()->
+ UninstallExtension(extension->id(), false, NULL);
+ }
+}
+
+void PanelBrowserFrameView::ExtensionDialogCanceled() {
+}
+
int PanelBrowserFrameView::NonClientBorderThickness() const {
return kFrameBorderThickness + kClientEdgeThickness;
}
@@ -447,13 +517,23 @@
return;
paint_state_ = paint_state;
- // For now, the only indication is whether the font is bold or not.
+ SkColor title_color = GetThemeProvider()->
+ GetColor(paint_state == PAINT_AS_ACTIVE ?
+ ThemeService::COLOR_TAB_TEXT :
+ ThemeService::COLOR_BACKGROUND_TAB_TEXT);
+ title_label_->SetColor(title_color);
title_label_->SetFont(
paint_state == PAINT_AS_ACTIVE ? *active_font : *inactive_font);
+
+ close_button_->SetBackground(title_color,
+ close_button_resources.normal_image,
+ close_button_resources.mask_image);
}
void PanelBrowserFrameView::PaintFrameBorder(gfx::Canvas* canvas) {
- SkBitmap* theme_frame = GetThemeProvider()->GetBitmapNamed(IDR_THEME_TOOLBAR);
+ SkBitmap* theme_frame = GetThemeProvider()->GetBitmapNamed(
+ (paint_state_ == PAINT_AS_ACTIVE) ? IDR_THEME_TOOLBAR
+ : IDR_THEME_TAB_BACKGROUND);
// Draw the theme frame.
canvas->TileImageInt(*theme_frame, 0, 0, width(), height());
@@ -545,16 +625,54 @@
}
void PanelBrowserFrameView::OnActivationChanged(bool active) {
- UpdateInfoButtonVisibility(active, mouse_watcher_->IsCursorInViewBounds());
+ UpdateWrenchButtonVisibility(active, mouse_watcher_->IsCursorInViewBounds());
SchedulePaint();
}
void PanelBrowserFrameView::OnMouseEnterOrLeaveWindow(bool mouse_entered) {
- UpdateInfoButtonVisibility(browser_view_->panel()->IsActive(),
- mouse_entered);
+ // Panel might be closed when we still watch the mouse event.
+ if (!browser_view_->panel())
+ return;
+ UpdateWrenchButtonVisibility(browser_view_->panel()->IsActive(),
+ mouse_entered);
}
-void PanelBrowserFrameView::UpdateInfoButtonVisibility(bool active,
- bool cursor_in_view) {
- info_button_->SetVisible(active || cursor_in_view);
+void PanelBrowserFrameView::UpdateWrenchButtonVisibility(bool active,
+ bool cursor_in_view) {
+ wrench_button_->SetVisible(active || cursor_in_view);
}
+
+const Extension* PanelBrowserFrameView::GetExtension() const {
jennb 2011/06/01 22:24:14 Is this a utility all Panel instances, regardless
jianli 2011/06/01 23:23:38 Moved it as Panel::GetExtension.
+ // Find the extension. When we create a panel from an extension, the extension
+ // ID is passed as the app name to the Browser.
+ Browser* browser = browser_view_->browser();
+ ExtensionService* extension_service =
+ browser->GetProfile()->GetExtensionService();
+ return extension_service->GetExtensionById(
+ web_app::GetExtensionIdFromApplicationName(browser->app_name()), false);
+}
+
+void PanelBrowserFrameView::EnsureCreateWrenchMenu() {
+ if (wrench_menu_.get())
+ return;
+
+ const Extension* extension = GetExtension();
+ if (!extension)
+ return;
+
+ wrench_menu_contents_.reset(new ui::SimpleMenuModel(this));
+
+ wrench_menu_contents_->AddItem(COMMAND_NAME, UTF8ToUTF16(extension->name()));
+ wrench_menu_contents_->AddSeparator();
+ wrench_menu_contents_->AddItem(
+ COMMAND_CONFIGURE, l10n_util::GetStringUTF16(IDS_EXTENSIONS_OPTIONS));
+ wrench_menu_contents_->AddItem(
+ COMMAND_DISABLE, l10n_util::GetStringUTF16(IDS_EXTENSIONS_DISABLE));
+ wrench_menu_contents_->AddItem(
+ COMMAND_UNINSTALL, l10n_util::GetStringUTF16(IDS_EXTENSIONS_UNINSTALL));
+ wrench_menu_contents_->AddSeparator();
+ wrench_menu_contents_->AddItem(
+ COMMAND_MANAGE, l10n_util::GetStringUTF16(IDS_MANAGE_EXTENSIONS));
+
+ wrench_menu_.reset(new views::Menu2(wrench_menu_contents_.get()));
+}

Powered by Google App Engine
This is Rietveld 408576698