Chromium Code Reviews| Index: chrome/browser/ui/views/compact_nav/compact_options_bar.cc |
| diff --git a/chrome/browser/ui/views/compact_nav/compact_options_bar.cc b/chrome/browser/ui/views/compact_nav/compact_options_bar.cc |
| new file mode 100755 |
| index 0000000000000000000000000000000000000000..18a8ec86cb80387bf1100b11f49cd93eb649355c |
| --- /dev/null |
| +++ b/chrome/browser/ui/views/compact_nav/compact_options_bar.cc |
| @@ -0,0 +1,160 @@ |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "chrome/browser/ui/views/compact_nav/compact_options_bar.h" |
| + |
| +#include "chrome/app/chrome_command_ids.h" |
| +#include "chrome/browser/ui/toolbar/wrench_menu_model.h" |
| +#include "chrome/browser/ui/view_ids.h" |
| +#include "chrome/browser/ui/views/event_utils.h" |
| +#include "chrome/browser/ui/views/frame/browser_view.h" |
| +#include "chrome/browser/ui/views/toolbar_view.h" |
| +#include "grit/chromium_strings.h" |
| +#include "grit/generated_resources.h" |
| +#include "ui/base/l10n/l10n_util.h" |
| +#include "ui/base/resource/resource_bundle.h" |
| +#include "ui/gfx/canvas.h" |
| + |
| +namespace { |
| + const int kPreferredHeight = 25; |
|
sky
2011/05/03 18:38:32
no indentation in a namespace
SteveT
2011/05/06 18:48:43
Done.
|
| + // Pad the left and right ends from other tabstrip region items. |
| + const int kEndPadding = 3; |
| +} |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// CompactOptionsBar public: |
| + |
| +CompactOptionsBar::CompactOptionsBar(BrowserView* browser_view) |
| + : browser_view_(browser_view), |
| + initialized_(false), |
| + app_menu_(NULL), |
| + destroyed_flag_(NULL) { |
| +} |
| + |
| +CompactOptionsBar::~CompactOptionsBar() { |
| + if (destroyed_flag_) |
| + *destroyed_flag_ = true; |
| +} |
| + |
| +void CompactOptionsBar::Init() { |
| + DCHECK(!initialized_); |
| + initialized_ = true; |
| + |
| + wrench_menu_model_.reset(new WrenchMenuModel(this, browser_view_->browser())); |
| + |
| + app_menu_ = new views::MenuButton(NULL, std::wstring(), this, false); |
| + app_menu_->set_border(NULL); |
| + app_menu_->EnableCanvasFlippingForRTLUI(true); |
| + app_menu_->SetAccessibleName(l10n_util::GetStringUTF16(IDS_ACCNAME_APP)); |
| + app_menu_->SetTooltipText(UTF16ToWide(l10n_util::GetStringFUTF16( |
| + IDS_APPMENU_TOOLTIP, |
| + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)))); |
| + app_menu_->SetID(VIEW_ID_APP_MENU); |
| + AddChildView(app_menu_); |
| + |
| + LoadImages(); |
| +} |
| + |
| +gfx::Size CompactOptionsBar::GetPreferredSize() { |
| + int width = kEndPadding * 2 + app_menu_->GetPreferredSize().width(); |
| + // TODO(stevet): Add the width of the browser actions container here when that |
| + // is added to the bar. |
| + return gfx::Size(width, kPreferredHeight); |
| +} |
| + |
| +void CompactOptionsBar::Layout() { |
| + if (!initialized_) |
| + return; |
| + |
| + int curx = kEndPadding; |
| + gfx::Size button_size = app_menu_->GetPreferredSize(); |
| + app_menu_->SetBounds(curx, 0, button_size.width(), height()); |
|
sky
2011/05/03 18:38:32
You don't really need curx here.
SteveT
2011/05/06 18:48:43
Oops, yeah. Removing this for now, but we'll bring
|
| + curx += button_size.width(); |
| +} |
| + |
| +void CompactOptionsBar::OnPaint(gfx::Canvas* canvas) { |
| + OnPaintBackground(canvas); |
|
sky
2011/05/03 18:38:32
Do you really need to override this?
SteveT
2011/05/06 18:48:43
No - removed.
|
| +} |
| + |
| +void CompactOptionsBar::AddMenuListener(views::MenuListener* listener) { |
| + menu_listeners_.push_back(listener); |
| +} |
| + |
| +void CompactOptionsBar::RemoveMenuListener(views::MenuListener* listener) { |
| + for (std::vector<views::MenuListener*>::iterator i(menu_listeners_.begin()); |
| + i != menu_listeners_.end(); ++i) { |
|
sky
2011/05/03 18:38:32
indentation is off.
SteveT
2011/05/06 18:48:43
Done.
|
| + if (*i == listener) { |
| + menu_listeners_.erase(i); |
| + return; |
| + } |
| + } |
| +} |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// CompactOptionsBar, views::MenuDelegate implementation: |
| + |
| +void CompactOptionsBar::RunMenu(views::View* source, |
| + const gfx::Point& /* pt */) { |
| + DCHECK_EQ(VIEW_ID_APP_MENU, source->GetID()); |
| + |
| + bool destroyed_flag = false; |
| + destroyed_flag_ = &destroyed_flag; |
| + wrench_menu_ = new WrenchMenu(browser_view_->browser()); |
| + wrench_menu_->Init(wrench_menu_model_.get()); |
| + |
| + for (size_t i = 0; i < menu_listeners_.size(); ++i) |
| + menu_listeners_[i]->OnMenuOpened(); |
| + |
| + wrench_menu_->RunMenu(app_menu_); |
| + |
| + if (destroyed_flag) |
|
sky
2011/05/03 18:38:32
Given you've got nothing after destroyed_flag_, do
SteveT
2011/05/06 18:48:43
That is a good point - do you want me to get ride
sky
2011/05/06 19:56:06
Sure, but in a separate patch please.
SteveT
2011/05/06 22:13:40
Noted.
|
| + return; |
| + destroyed_flag_ = NULL; |
| +} |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// CompactOptionsBar, ui::AcceleratorProvider implementation: |
| + |
| +bool CompactOptionsBar::GetAcceleratorForCommandId(int command_id, |
| + ui::Accelerator* accelerator) { |
| + // TODO(stevet): Can we share ToolbarView's implementation? It's exactly the |
| + // same so far. |
| + // The standard Ctrl-X, Ctrl-V and Ctrl-C are not defined as accelerators |
| + // anywhere so we need to check for them explicitly here. |
| + // TODO(cpu) Bug 1109102. Query WebKit land for the actual bindings. |
| + switch (command_id) { |
| + case IDC_CUT: |
| + *accelerator = views::Accelerator(ui::VKEY_X, false, true, false); |
| + return true; |
| + case IDC_COPY: |
| + *accelerator = views::Accelerator(ui::VKEY_C, false, true, false); |
| + return true; |
| + case IDC_PASTE: |
| + *accelerator = views::Accelerator(ui::VKEY_V, false, true, false); |
| + return true; |
| + } |
| + // Else, we retrieve the accelerator information from the frame. |
| + return GetWidget()->GetAccelerator(command_id, accelerator); |
| +} |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// CompactOptionsBar, views::ButtonListener implementation. |
| + |
| +void CompactOptionsBar::ButtonPressed(views::Button* sender, |
| + const views::Event& event) { |
| + browser_view_->browser()->ExecuteCommandWithDisposition( |
| + sender->tag(), |
| + event_utils::DispositionFromEventFlags(sender->mouse_event_flags())); |
| +} |
| + |
| +void CompactOptionsBar::LoadImages() { |
| + // Reuse the resources loaded for the Toolbar's AppMenu. |
| + DCHECK(browser_view_->toolbar()); |
| + app_menu_->SetIcon(browser_view_->toolbar()->GetAppMenuIcon( |
| + views::CustomButton::BS_NORMAL)); |
| + app_menu_->SetHoverIcon(browser_view_->toolbar()->GetAppMenuIcon( |
| + views::CustomButton::BS_HOT)); |
| + app_menu_->SetPushedIcon(browser_view_->toolbar()->GetAppMenuIcon( |
| + views::CustomButton::BS_PUSHED)); |
| +} |