| OLD | NEW |
| (Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "chrome/browser/ui/views/compact_nav/compact_options_bar.h" |
| 6 |
| 7 #include "chrome/app/chrome_command_ids.h" |
| 8 #include "chrome/browser/ui/toolbar/wrench_menu_model.h" |
| 9 #include "chrome/browser/ui/view_ids.h" |
| 10 #include "chrome/browser/ui/views/event_utils.h" |
| 11 #include "chrome/browser/ui/views/frame/browser_view.h" |
| 12 #include "chrome/browser/ui/views/toolbar_view.h" |
| 13 #include "chrome/browser/ui/views/wrench_menu.h" |
| 14 #include "grit/chromium_strings.h" |
| 15 #include "grit/generated_resources.h" |
| 16 #include "ui/base/l10n/l10n_util.h" |
| 17 #include "ui/base/resource/resource_bundle.h" |
| 18 #include "ui/gfx/canvas.h" |
| 19 #include "views/controls/button/menu_button.h" |
| 20 |
| 21 namespace { |
| 22 const int kPreferredHeight = 25; |
| 23 // Pad the left and right ends from other tabstrip region items. |
| 24 const int kEndPadding = 3; |
| 25 } |
| 26 |
| 27 //////////////////////////////////////////////////////////////////////////////// |
| 28 // CompactOptionsBar public: |
| 29 |
| 30 CompactOptionsBar::CompactOptionsBar(BrowserView* browser_view) |
| 31 : browser_view_(browser_view), |
| 32 initialized_(false), |
| 33 app_menu_(NULL) { |
| 34 } |
| 35 |
| 36 CompactOptionsBar::~CompactOptionsBar() { |
| 37 } |
| 38 |
| 39 void CompactOptionsBar::Init() { |
| 40 DCHECK(!initialized_); |
| 41 initialized_ = true; |
| 42 |
| 43 wrench_menu_model_.reset(new WrenchMenuModel(this, browser_view_->browser())); |
| 44 |
| 45 app_menu_ = new views::MenuButton(NULL, std::wstring(), this, false); |
| 46 app_menu_->set_border(NULL); |
| 47 app_menu_->EnableCanvasFlippingForRTLUI(true); |
| 48 app_menu_->SetAccessibleName(l10n_util::GetStringUTF16(IDS_ACCNAME_APP)); |
| 49 app_menu_->SetTooltipText(UTF16ToWide(l10n_util::GetStringFUTF16( |
| 50 IDS_APPMENU_TOOLTIP, |
| 51 l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)))); |
| 52 app_menu_->SetID(VIEW_ID_APP_MENU); |
| 53 AddChildView(app_menu_); |
| 54 |
| 55 LoadImages(); |
| 56 } |
| 57 |
| 58 void CompactOptionsBar::AddMenuListener(views::MenuListener* listener) { |
| 59 menu_listeners_.push_back(listener); |
| 60 } |
| 61 |
| 62 void CompactOptionsBar::RemoveMenuListener(views::MenuListener* listener) { |
| 63 for (std::vector<views::MenuListener*>::iterator i(menu_listeners_.begin()); |
| 64 i != menu_listeners_.end(); ++i) { |
| 65 if (*i == listener) { |
| 66 menu_listeners_.erase(i); |
| 67 return; |
| 68 } |
| 69 } |
| 70 } |
| 71 |
| 72 //////////////////////////////////////////////////////////////////////////////// |
| 73 // CompactOptionsBar, views::View overrides: |
| 74 |
| 75 gfx::Size CompactOptionsBar::GetPreferredSize() { |
| 76 int width = kEndPadding * 2 + app_menu_->GetPreferredSize().width(); |
| 77 // TODO(stevet): Add the width of the browser actions container here when that |
| 78 // is added to the bar. |
| 79 return gfx::Size(width, kPreferredHeight); |
| 80 } |
| 81 |
| 82 void CompactOptionsBar::Layout() { |
| 83 if (!initialized_) |
| 84 return; |
| 85 |
| 86 gfx::Size button_size = app_menu_->GetPreferredSize(); |
| 87 app_menu_->SetBounds(kEndPadding, 0, button_size.width(), height()); |
| 88 } |
| 89 |
| 90 //////////////////////////////////////////////////////////////////////////////// |
| 91 // CompactOptionsBar, views::MenuDelegate implementation: |
| 92 |
| 93 void CompactOptionsBar::RunMenu(views::View* source, |
| 94 const gfx::Point& /* pt */) { |
| 95 DCHECK_EQ(VIEW_ID_APP_MENU, source->GetID()); |
| 96 |
| 97 wrench_menu_ = new WrenchMenu(browser_view_->browser()); |
| 98 wrench_menu_->Init(wrench_menu_model_.get()); |
| 99 |
| 100 for (size_t i = 0; i < menu_listeners_.size(); ++i) |
| 101 menu_listeners_[i]->OnMenuOpened(); |
| 102 |
| 103 // Note that this might be destroyed while the menu is running. |
| 104 wrench_menu_->RunMenu(app_menu_); |
| 105 } |
| 106 |
| 107 //////////////////////////////////////////////////////////////////////////////// |
| 108 // CompactOptionsBar, ui::AcceleratorProvider implementation: |
| 109 |
| 110 bool CompactOptionsBar::GetAcceleratorForCommandId(int command_id, |
| 111 ui::Accelerator* accelerator) { |
| 112 // TODO(stevet): Can we share ToolbarView's implementation? It's exactly the |
| 113 // same so far. |
| 114 // The standard Ctrl-X, Ctrl-V and Ctrl-C are not defined as accelerators |
| 115 // anywhere so we need to check for them explicitly here. |
| 116 // TODO(cpu) Bug 1109102. Query WebKit land for the actual bindings. |
| 117 switch (command_id) { |
| 118 case IDC_CUT: |
| 119 *accelerator = views::Accelerator(ui::VKEY_X, false, true, false); |
| 120 return true; |
| 121 case IDC_COPY: |
| 122 *accelerator = views::Accelerator(ui::VKEY_C, false, true, false); |
| 123 return true; |
| 124 case IDC_PASTE: |
| 125 *accelerator = views::Accelerator(ui::VKEY_V, false, true, false); |
| 126 return true; |
| 127 } |
| 128 // Else, we retrieve the accelerator information from the frame. |
| 129 return GetWidget()->GetAccelerator(command_id, accelerator); |
| 130 } |
| 131 |
| 132 //////////////////////////////////////////////////////////////////////////////// |
| 133 // CompactOptionsBar, views::ButtonListener implementation. |
| 134 |
| 135 void CompactOptionsBar::ButtonPressed(views::Button* sender, |
| 136 const views::Event& event) { |
| 137 browser_view_->browser()->ExecuteCommandWithDisposition( |
| 138 sender->tag(), |
| 139 event_utils::DispositionFromEventFlags(sender->mouse_event_flags())); |
| 140 } |
| 141 |
| 142 void CompactOptionsBar::LoadImages() { |
| 143 // Reuse the resources loaded for the Toolbar's AppMenu. |
| 144 DCHECK(browser_view_->toolbar()); |
| 145 app_menu_->SetIcon(browser_view_->toolbar()->GetAppMenuIcon( |
| 146 views::CustomButton::BS_NORMAL)); |
| 147 app_menu_->SetHoverIcon(browser_view_->toolbar()->GetAppMenuIcon( |
| 148 views::CustomButton::BS_HOT)); |
| 149 app_menu_->SetPushedIcon(browser_view_->toolbar()->GetAppMenuIcon( |
| 150 views::CustomButton::BS_PUSHED)); |
| 151 } |
| OLD | NEW |