15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/extensions/media_galleries_dialog_views.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/ui/views/constrained_window_views.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/views/extensions/media_gallery_checkbox_view.h"
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/grit/locale_settings.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/web_modal/popup_manager.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/native_theme/native_theme.h"
16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/views/border.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/checkbox.h"
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/views/controls/button/image_button.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/label_button.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/views/controls/menu/menu_runner.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/scroll_view.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/separator.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/grid_layout.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/layout_constants.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/window/dialog_client_view.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kScrollAreaHeight = 192;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This container has the right Layout() impl to use within a ScrollView.
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ScrollableView : public views::View {
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScrollableView() {}
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ScrollableView() {}
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Layout() OVERRIDE;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScrollableView);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ScrollableView::Layout() {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size pref = GetPreferredSize();
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int width = pref.width();
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int height = pref.height();
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (parent()) {
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    width = parent()->width();
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    height = std::max(parent()->height(), height);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetBounds(x(), y(), width, height);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View::Layout();
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MediaGalleriesDialogViews::MediaGalleriesDialogViews(
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MediaGalleriesDialogController* controller)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : controller_(controller),
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      contents_(new views::View()),
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      auxiliary_button_(NULL),
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      confirm_available_(false),
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      accepted_(false) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitChildViews();
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (ControllerHasWebContents())
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ShowWebModalDialogViews(this, controller->WebContents());
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MediaGalleriesDialogViews::~MediaGalleriesDialogViews() {
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!ControllerHasWebContents())
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    delete contents_;
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesDialogViews::AcceptDialogForTesting() {
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  accepted_ = true;
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  web_modal::PopupManager* popup_manager =
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_modal::PopupManager::FromWebContents(controller_->WebContents());
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(popup_manager);
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  popup_manager->CloseAllDialogsForTesting(controller_->WebContents());
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaGalleriesDialogViews::InitChildViews() {
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Outer dialog layout.
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  contents_->RemoveAllChildViews(true);
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  checkbox_map_.clear();
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int dialog_content_width = views::Widget::GetLocalizedContentsWidth(
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IDS_MEDIA_GALLERIES_DIALOG_CONTENT_WIDTH_CHARS);
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  views::GridLayout* layout = views::GridLayout::CreatePanel(contents_);
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  contents_->SetLayoutManager(layout);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int column_set_id = 0;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::ColumnSet* columns = layout->AddColumnSet(column_set_id);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columns->AddColumn(views::GridLayout::LEADING,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     views::GridLayout::LEADING,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     1,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     views::GridLayout::FIXED,
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     dialog_content_width,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     0);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Message text.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Label* subtext = new views::Label(controller_->GetSubtext());
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subtext->SetMultiLine(true);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subtext->SetHorizontalAlignment(gfx::ALIGN_LEFT);
1115e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  layout->StartRow(0, column_set_id);
1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  layout->AddView(
1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      subtext, 1, 1,
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      views::GridLayout::FILL, views::GridLayout::LEADING,
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      dialog_content_width, subtext->GetHeightForWidth(dialog_content_width));
1165e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Scrollable area for checkboxes.
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScrollableView* scroll_container = new ScrollableView();
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_container->SetLayoutManager(new views::BoxLayout(
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::BoxLayout::kVertical, 0, 0,
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::kRelatedControlSmallVerticalSpacing));
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scroll_container->SetBorder(
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      views::Border::CreateEmptyBorder(views::kRelatedControlVerticalSpacing,
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       0,
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       views::kRelatedControlVerticalSpacing,
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       0));
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::vector<base::string16> section_headers =
13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      controller_->GetSectionHeaders();
13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (size_t i = 0; i < section_headers.size(); i++) {
13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    MediaGalleriesDialogController::Entries entries =
13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        controller_->GetSectionEntries(i);
13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // Header and separator line.
13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (!section_headers[i].empty() && !entries.empty()) {
13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      views::Separator* separator = new views::Separator(
13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          views::Separator::HORIZONTAL);
13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      scroll_container->AddChildView(separator);
14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      views::Label* header = new views::Label(section_headers[i]);
14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      header->SetMultiLine(true);
14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      header->SetHorizontalAlignment(gfx::ALIGN_LEFT);
14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      header->SetBorder(views::Border::CreateEmptyBorder(
14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          views::kRelatedControlVerticalSpacing,
14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          views::kPanelHorizMargin,
14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          views::kRelatedControlVerticalSpacing,
14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          0));
14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      scroll_container->AddChildView(header);
15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // Checkboxes.
15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    MediaGalleriesDialogController::Entries::const_iterator iter;
15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    for (iter = entries.begin(); iter != entries.end(); ++iter) {
15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      int spacing = 0;
15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      if (iter + 1 == entries.end())
15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        spacing = views::kRelatedControlSmallVerticalSpacing;
15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      AddOrUpdateGallery(*iter, scroll_container, spacing);
15968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  confirm_available_ = controller_->IsAcceptAllowed();
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add the scrollable area to the outer dialog view. It will squeeze against
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the title/subtitle and buttons to occupy all available space in the dialog.
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::ScrollView* scroll_view =
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::ScrollView::CreateScrollViewWithBorder();
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view->SetContents(scroll_container);
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->StartRowWithPadding(1, column_set_id,
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              0, views::kRelatedControlVerticalSpacing);
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->AddView(scroll_view, 1, 1,
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  views::GridLayout::FILL, views::GridLayout::FILL,
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  dialog_content_width, kScrollAreaHeight);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void MediaGalleriesDialogViews::UpdateGalleries() {
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitChildViews();
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  contents_->Layout();
179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (ControllerHasWebContents())
181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    GetWidget()->client_view()->AsDialogClientView()->UpdateDialogButtons();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MediaGalleriesDialogViews::AddOrUpdateGallery(
18546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const MediaGalleriesDialogController::Entry& gallery,
1865e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)    views::View* container,
1875e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)    int trailing_vertical_space) {
18846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  bool show_folder_viewer = controller_->ShouldShowFolderViewer(gallery);
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CheckboxMap::iterator iter = checkbox_map_.find(gallery.pref_info.pref_id);
1910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (iter != checkbox_map_.end()) {
192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    views::Checkbox* checkbox = iter->second->checkbox();
19346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    checkbox->SetChecked(gallery.selected);
194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    checkbox->SetText(gallery.pref_info.GetGalleryDisplayName());
195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    checkbox->SetTooltipText(gallery.pref_info.GetGalleryTooltip());
196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    base::string16 details = gallery.pref_info.GetGalleryAdditionalDetails();
197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    iter->second->secondary_text()->SetText(details);
198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    iter->second->secondary_text()->SetVisible(details.length() > 0);
19946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    iter->second->folder_viewer_button()->SetVisible(show_folder_viewer);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MediaGalleryCheckboxView* gallery_view =
204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      new MediaGalleryCheckboxView(gallery.pref_info, show_folder_viewer,
205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                   trailing_vertical_space, this, this);
20646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gallery_view->checkbox()->SetChecked(gallery.selected);
207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  container->AddChildView(gallery_view);
20846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  checkbox_map_[gallery.pref_info.pref_id] = gallery_view;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 MediaGalleriesDialogViews::GetWindowTitle() const {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return controller_->GetHeader();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaGalleriesDialogViews::DeleteDelegate() {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_->DialogFinished(accepted_);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::Widget* MediaGalleriesDialogViews::GetWidget() {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return contents_->GetWidget();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const views::Widget* MediaGalleriesDialogViews::GetWidget() const {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return contents_->GetWidget();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* MediaGalleriesDialogViews::GetContentsView() {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return contents_;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 MediaGalleriesDialogViews::GetDialogButtonLabel(
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::DialogButton button) const {
23546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (button == ui::DIALOG_BUTTON_OK)
23646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return controller_->GetAcceptButtonText();
23746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_MEDIA_GALLERIES_DIALOG_CANCEL);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MediaGalleriesDialogViews::IsDialogButtonEnabled(
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::DialogButton button) const {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return button != ui::DIALOG_BUTTON_OK || confirm_available_;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::ModalType MediaGalleriesDialogViews::GetModalType() const {
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ui::MODAL_TYPE_CHILD;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochviews::View* MediaGalleriesDialogViews::CreateExtraView() {
25046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(!auxiliary_button_);
25146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::string16 button_label = controller_->GetAuxiliaryButtonText();
25246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!button_label.empty()) {
25346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    auxiliary_button_ = new views::LabelButton(this, button_label);
25446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    auxiliary_button_->SetStyle(views::Button::STYLE_BUTTON);
25546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
25646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return auxiliary_button_;
257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MediaGalleriesDialogViews::Cancel() {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MediaGalleriesDialogViews::Accept() {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  accepted_ = true;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaGalleriesDialogViews::ButtonPressed(views::Button* sender,
269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                              const ui::Event& /* event */) {
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  confirm_available_ = true;
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (ControllerHasWebContents())
273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    GetWidget()->client_view()->AsDialogClientView()->UpdateDialogButtons();
274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
27546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (sender == auxiliary_button_) {
27646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    controller_->DidClickAuxiliaryButton();
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (CheckboxMap::const_iterator iter = checkbox_map_.begin();
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       iter != checkbox_map_.end(); ++iter) {
282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (sender == iter->second->checkbox()) {
28346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      controller_->DidToggleEntry(iter->first,
28446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                  iter->second->checkbox()->checked());
28546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return;
28646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
28746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (sender == iter->second->folder_viewer_button()) {
28846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      controller_->DidClickOpenFolderViewer(iter->first);
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void MediaGalleriesDialogViews::ShowContextMenuForView(
2951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    views::View* source,
2961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const gfx::Point& point,
2971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ui::MenuSourceType source_type) {
2981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (CheckboxMap::const_iterator iter = checkbox_map_.begin();
2991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)       iter != checkbox_map_.end(); ++iter) {
300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (iter->second->Contains(source)) {
3011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ShowContextMenu(point, source_type, iter->first);
3021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return;
3031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
3041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
3051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
3061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void MediaGalleriesDialogViews::ShowContextMenu(const gfx::Point& point,
3081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                ui::MenuSourceType source_type,
30946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                                MediaGalleryPrefId id) {
3101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  context_menu_runner_.reset(new views::MenuRunner(
311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      controller_->GetContextMenu(id),
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      views::MenuRunner::HAS_MNEMONICS | views::MenuRunner::CONTEXT_MENU));
313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (context_menu_runner_->RunMenuAt(GetWidget(),
315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      NULL,
316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      gfx::Rect(point.x(), point.y(), 0, 0),
317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      views::MENU_ANCHOR_TOPLEFT,
318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      source_type) ==
3191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      views::MenuRunner::MENU_DELETED) {
3201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return;
3211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool MediaGalleriesDialogViews::ControllerHasWebContents() const {
32546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return controller_->WebContents() != NULL;
326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MediaGalleriesDialogViewsController -----------------------------------------
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MediaGalleriesDialog* MediaGalleriesDialog::Create(
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MediaGalleriesDialogController* controller) {
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new MediaGalleriesDialogViews(controller);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335