Index: chrome/browser/ui/views/content_setting_bubble_contents.cc |
diff --git a/chrome/browser/ui/views/content_setting_bubble_contents.cc b/chrome/browser/ui/views/content_setting_bubble_contents.cc |
index 7a01e388149a61df764e1164a9ddb37189604b31..888f5370275634939cca5b46c9d25fda093da388 100644 |
--- a/chrome/browser/ui/views/content_setting_bubble_contents.cc |
+++ b/chrome/browser/ui/views/content_setting_bubble_contents.cc |
@@ -13,6 +13,7 @@ |
#include "chrome/browser/content_settings/host_content_settings_map.h" |
#include "chrome/browser/plugins/plugin_finder.h" |
#include "chrome/browser/plugins/plugin_metadata.h" |
+#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/ui/chrome_style.h" |
#include "chrome/browser/ui/content_settings/content_setting_bubble_model.h" |
#include "chrome/browser/ui/views/browser_dialogs.h" |
@@ -21,11 +22,15 @@ |
#include "content/public/browser/plugin_service.h" |
#include "grit/generated_resources.h" |
#include "ui/base/l10n/l10n_util.h" |
+#include "ui/views/controls/button/menu_button.h" |
#include "ui/views/controls/button/radio_button.h" |
#include "ui/views/controls/button/text_button.h" |
#include "ui/views/controls/image_view.h" |
#include "ui/views/controls/label.h" |
#include "ui/views/controls/link.h" |
+#include "ui/views/controls/menu/menu.h" |
+#include "ui/views/controls/menu/menu_model_adapter.h" |
+#include "ui/views/controls/menu/menu_runner.h" |
#include "ui/views/controls/separator.h" |
#include "ui/views/layout/grid_layout.h" |
#include "ui/views/layout/layout_constants.h" |
@@ -99,15 +104,18 @@ gfx::NativeCursor ContentSettingBubbleContents::Favicon::GetCursor( |
ContentSettingBubbleContents::ContentSettingBubbleContents( |
ContentSettingBubbleModel* content_setting_bubble_model, |
+ Profile* profile, |
WebContents* web_contents, |
views::View* anchor_view, |
views::BubbleBorder::ArrowLocation arrow_location) |
: BubbleDelegateView(anchor_view, arrow_location), |
content_setting_bubble_model_(content_setting_bubble_model), |
+ profile_(profile), |
web_contents_(web_contents), |
custom_link_(NULL), |
manage_link_(NULL), |
close_button_(NULL) { |
+ DCHECK(profile); |
// Compensate for built-in vertical padding in the anchor view's image. |
set_anchor_insets(gfx::Insets(5, 0, 5, 0)); |
@@ -116,6 +124,11 @@ ContentSettingBubbleContents::ContentSettingBubbleContents( |
} |
ContentSettingBubbleContents::~ContentSettingBubbleContents() { |
+ // Free any MediaMenuVoew objects left over. |
markusheintz_
2013/02/06 11:03:26
Typo s/MediaMenuVoew/MediaMenuView
no longer working on chromium
2013/02/06 13:31:52
Done.
|
+ for (MediaMenuViewMap::const_iterator it = media_menus_.begin(); |
+ it != media_menus_.end(); ++it) { |
+ delete it->second; |
+ } |
} |
gfx::Size ContentSettingBubbleContents::GetPreferredSize() { |
@@ -128,6 +141,20 @@ gfx::Size ContentSettingBubbleContents::GetPreferredSize() { |
return preferred_size; |
} |
+void ContentSettingBubbleContents::UpdateMenuLabel( |
+ content::MediaStreamType type, |
+ const std::string& label) { |
+ MediaMenuViewMap::const_iterator it = media_menus_.begin(); |
+ for (; it != media_menus_.end(); ++it) { |
+ if (it->second->type == type) { |
+ it->first->SetText(UTF8ToUTF16(label)); |
+ DLOG(WARNING) << "TODO SET THE TITLE FOR THE MENU"; |
markusheintz_
2013/02/06 11:03:26
Is this still an active TODO? Looks like some dbg
no longer working on chromium
2013/02/06 13:31:52
Removed.
|
+ break; |
+ } |
+ } |
+ DCHECK(it != media_menus_.end()); |
+} |
+ |
void ContentSettingBubbleContents::Init() { |
using views::GridLayout; |
@@ -225,6 +252,50 @@ void ContentSettingBubbleContents::Init() { |
radio_group_[radio_group.default_item]->SetChecked(true); |
} |
+ // Layout code for the media device menus. |
+ if (content_setting_bubble_model_->content_type() == |
+ CONTENT_SETTINGS_TYPE_MEDIASTREAM) { |
+ const int kMediaMenuColumnSetId = 2; |
+ views::ColumnSet* menu_column_set = |
+ layout->AddColumnSet(kMediaMenuColumnSetId); |
+ menu_column_set->AddColumn(GridLayout::LEADING, GridLayout::FILL, 0, |
+ GridLayout::USE_PREF, 0, 0); |
+ menu_column_set->AddPaddingColumn( |
+ 0, views::kRelatedControlHorizontalSpacing); |
+ menu_column_set->AddColumn(GridLayout::LEADING, GridLayout::FILL, 1, |
+ GridLayout::USE_PREF, 0, 0); |
+ |
+ for (ContentSettingBubbleModel::MediaMenuMap::const_iterator i( |
+ bubble_content.media_menus.begin()); |
+ i != bubble_content.media_menus.end(); ++i) { |
+ if (!bubble_content_empty) |
+ layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); |
+ layout->StartRow(0, kMediaMenuColumnSetId); |
+ |
+ views::Label* menu_label = new views::Label(UTF8ToUTF16(i->second.label)); |
+ menu_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
+ layout->AddView(menu_label, 1, 1, GridLayout::FILL, GridLayout::LEADING); |
+ views::MenuButton* menu_button = |
+ new views::MenuButton(NULL, string16(), this, false); |
+ menu_button->set_alignment(views::TextButton::ALIGN_CENTER); |
+ menu_button->set_border(NULL); |
+ //menu_button->SetBoundsRect(GetOptionsButtonBounds()); |
+ |
+ layout->AddView(menu_label); |
+ layout->AddView(menu_button); |
+ // Store the menu view to the map. |
+ MediaMenuView* menu_view = new MediaMenuView(); |
+ menu_view->type = i->first; |
+ menu_view->menu_model.reset(new ContentSettingMediaMenuModel( |
+ profile_, |
+ i->second.default_device.type, |
+ content_setting_bubble_model_.get(), |
+ this)); |
+ media_menus_[menu_button] = menu_view; |
+ bubble_content_empty = false; |
+ } |
+ } |
+ |
gfx::Font domain_font = |
views::Label().font().DeriveFont(0, gfx::Font::BOLD); |
for (std::vector<ContentSettingBubbleModel::DomainList>::const_iterator i( |
@@ -320,6 +391,27 @@ void ContentSettingBubbleContents::LinkClicked(views::Link* source, |
content_setting_bubble_model_->OnPopupClicked(i->second); |
} |
+void ContentSettingBubbleContents::OnMenuButtonClicked( |
+ views::View* source, |
+ const gfx::Point& point) { |
+ MediaMenuViewMap::iterator i(media_menus_.find( |
+ static_cast<views::MenuButton*>(source))); |
+ DCHECK(i != media_menus_.end()); |
+ |
+ views::MenuModelAdapter menu_model_adapter(i->second->menu_model.get()); |
+ menu_runner_.reset(new views::MenuRunner(menu_model_adapter.CreateMenu())); |
+ |
+ gfx::Point screen_location; |
+ views::View::ConvertPointToScreen(i->first, &screen_location); |
+ if (menu_runner_->RunMenuAt(source->GetWidget(), |
+ i->first, |
+ gfx::Rect(screen_location, i->first->size()), |
+ views::MenuItemView::TOPRIGHT, |
+ views::MenuRunner::HAS_MNEMONICS) == |
+ views::MenuRunner::MENU_DELETED) |
+ return; |
+} |
+ |
void ContentSettingBubbleContents::Observe( |
int type, |
const content::NotificationSource& source, |
@@ -328,3 +420,7 @@ void ContentSettingBubbleContents::Observe( |
DCHECK(source == content::Source<WebContents>(web_contents_)); |
web_contents_ = NULL; |
} |
+ |
+ContentSettingBubbleContents::MediaMenuView::MediaMenuView() {} |
markusheintz_
2013/02/06 11:03:26
|menu_model| initialized to NULL thanks to the sco
no longer working on chromium
2013/02/06 13:31:52
Done. I added the type as the input to the constru
|
+ |
+ContentSettingBubbleContents::MediaMenuView::~MediaMenuView() {} |