media_galleries_dialog_views.cc revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
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"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/constrained_window_views.h"
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "components/web_modal/web_contents_modal_dialog_host.h"
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/web_modal/web_contents_modal_dialog_manager.h"
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/web_modal/web_contents_modal_dialog_manager_delegate.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_view.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/locale_settings.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkColor.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/native_theme/native_theme.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/checkbox.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/label_button.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/scroll_view.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/separator.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/grid_layout.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/layout_constants.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/window/dialog_client_view.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using web_modal::WebContentsModalDialogManager;
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)using web_modal::WebContentsModalDialogManagerDelegate;
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Equal to the #969696 color used in spec (note WebUI color is #999).
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kDeemphasizedTextColor = SkColorSetRGB(159, 159, 159);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kScrollAreaHeight = 192;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This container has the right Layout() impl to use within a ScrollView.
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ScrollableView : public views::View {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScrollableView() {}
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ScrollableView() {}
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Layout() OVERRIDE;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScrollableView);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ScrollableView::Layout() {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size pref = GetPreferredSize();
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int width = pref.width();
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int height = pref.height();
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (parent()) {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    width = std::max(parent()->width(), width);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    height = std::max(parent()->height(), height);
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetBounds(x(), y(), width, height);
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View::Layout();
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef MediaGalleriesDialogController::GalleryPermissionsVector
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GalleryPermissionsVector;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MediaGalleriesDialogViews::MediaGalleriesDialogViews(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MediaGalleriesDialogController* controller)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : controller_(controller),
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_(NULL),
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      contents_(new views::View()),
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      add_gallery_button_(NULL),
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      confirm_available_(false),
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      accepted_(false) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitChildViews();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ownership of |contents_| is handed off by this call. |window_| will take
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // care of deleting itself after calling DeleteDelegate().
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsModalDialogManager* web_contents_modal_dialog_manager =
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebContentsModalDialogManager::FromWebContents(
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          controller->web_contents());
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(web_contents_modal_dialog_manager);
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  WebContentsModalDialogManagerDelegate* modal_delegate =
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      web_contents_modal_dialog_manager->delegate();
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK(modal_delegate);
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  window_ = views::Widget::CreateWindowAsFramelessChild(
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      this,
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      controller->web_contents()->GetView()->GetNativeView(),
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      modal_delegate->GetWebContentsModalDialogHost()->GetHostView());
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_contents_modal_dialog_manager->ShowDialog(window_->GetNativeView());
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MediaGalleriesDialogViews::~MediaGalleriesDialogViews() {}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaGalleriesDialogViews::InitChildViews() {
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Outer dialog layout.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  contents_->RemoveAllChildViews(true);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int dialog_content_width = views::Widget::GetLocalizedContentsWidth(
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IDS_MEDIA_GALLERIES_DIALOG_CONTENT_WIDTH_CHARS);
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  views::GridLayout* layout = views::GridLayout::CreatePanel(contents_);
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  contents_->SetLayoutManager(layout);
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int column_set_id = 0;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::ColumnSet* columns = layout->AddColumnSet(column_set_id);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columns->AddColumn(views::GridLayout::LEADING,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     views::GridLayout::LEADING,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     1,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     views::GridLayout::FIXED,
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     dialog_content_width,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     0);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!DialogDelegate::UseNewStyle()) {
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Header text.
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    views::Label* header = new views::Label(controller_->GetHeader());
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    header->SetFont(rb.GetFont(ui::ResourceBundle::MediumFont));
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    header->SetHorizontalAlignment(gfx::ALIGN_LEFT);
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layout->StartRow(0, column_set_id);
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layout->AddView(header);
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Message text.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Label* subtext = new views::Label(controller_->GetSubtext());
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subtext->SetMultiLine(true);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subtext->SetHorizontalAlignment(gfx::ALIGN_LEFT);
1315e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  layout->StartRow(0, column_set_id);
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  layout->AddView(
1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      subtext, 1, 1,
1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      views::GridLayout::FILL, views::GridLayout::LEADING,
1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      dialog_content_width, subtext->GetHeightForWidth(dialog_content_width));
1365e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Scrollable area for checkboxes.
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScrollableView* scroll_container = new ScrollableView();
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_container->SetLayoutManager(new views::BoxLayout(
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::BoxLayout::kVertical, 0, 0,
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::kRelatedControlSmallVerticalSpacing));
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_container->set_border(views::Border::CreateEmptyBorder(
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::kRelatedControlVerticalSpacing,
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0,
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::kRelatedControlVerticalSpacing,
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0));
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add attached galleries checkboxes.
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  checkbox_map_.clear();
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GalleryPermissionsVector permissions = controller_->AttachedPermissions();
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (GalleryPermissionsVector::const_iterator iter = permissions.begin();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != permissions.end(); ++iter) {
1545e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)    int spacing = 0;
1555e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)    if (iter + 1 == permissions.end())
1565e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      spacing = views::kRelatedControlSmallVerticalSpacing;
1575e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)    AddOrUpdateGallery(iter->pref_info, iter->allowed, scroll_container,
1585e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)                       spacing);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GalleryPermissionsVector unattached_permissions =
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      controller_->UnattachedPermissions();
16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!unattached_permissions.empty()) {
16568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Separator line.
16668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    views::Separator* separator = new views::Separator(
16768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        views::Separator::HORIZONTAL);
16868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    scroll_container->AddChildView(separator);
16968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
17068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Unattached locations section.
17168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    views::Label* unattached_text = new views::Label(
17268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        controller_->GetUnattachedLocationsHeader());
17368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    unattached_text->SetMultiLine(true);
17468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    unattached_text->SetHorizontalAlignment(gfx::ALIGN_LEFT);
17568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    unattached_text->set_border(views::Border::CreateEmptyBorder(
17668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        views::kRelatedControlVerticalSpacing,
17768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        views::kPanelHorizMargin,
17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        views::kRelatedControlVerticalSpacing,
17968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        0));
18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    scroll_container->AddChildView(unattached_text);
18168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Add unattached galleries checkboxes.
18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    for (GalleryPermissionsVector::const_iterator iter =
18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)             unattached_permissions.begin();
18568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)         iter != unattached_permissions.end(); ++iter) {
18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      AddOrUpdateGallery(iter->pref_info, iter->allowed, scroll_container, 0);
18768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  confirm_available_ = controller_->HasPermittedGalleries();
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add the scrollable area to the outer dialog view. It will squeeze against
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the title/subtitle and buttons to occupy all available space in the dialog.
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::ScrollView* scroll_view =
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::ScrollView::CreateScrollViewWithBorder();
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view->SetContents(scroll_container);
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->StartRowWithPadding(1, column_set_id,
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              0, views::kRelatedControlVerticalSpacing);
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->AddView(scroll_view, 1, 1,
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  views::GridLayout::FILL, views::GridLayout::FILL,
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  dialog_content_width, kScrollAreaHeight);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaGalleriesDialogViews::UpdateGallery(
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const MediaGalleryPrefInfo& gallery,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool permitted) {
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitChildViews();
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  contents_->Layout();
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void MediaGalleriesDialogViews::ForgetGallery(MediaGalleryPrefId gallery) {
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitChildViews();
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  contents_->Layout();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MediaGalleriesDialogViews::AddOrUpdateGallery(
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const MediaGalleryPrefInfo& gallery,
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool permitted,
2195e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)    views::View* container,
2205e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)    int trailing_vertical_space) {
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  string16 label = gallery.GetGalleryDisplayName();
222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  string16 tooltip_text = gallery.GetGalleryTooltip();
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  string16 details = gallery.GetGalleryAdditionalDetails();
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CheckboxMap::iterator iter = checkbox_map_.find(gallery.pref_id);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (iter != checkbox_map_.end()) {
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::Checkbox* checkbox = iter->second;
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    checkbox->SetChecked(permitted);
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    checkbox->SetText(label);
23068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    checkbox->SetElideBehavior(views::Label::ELIDE_IN_MIDDLE);
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    checkbox->SetTooltipText(tooltip_text);
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Replace the details string.
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::View* checkbox_view = checkbox->parent();
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_EQ(2, checkbox_view->child_count());
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::Label* secondary_text =
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<views::Label*>(checkbox_view->child_at(1));
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    secondary_text->SetText(details);
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Why is this returning false? Looks like that will mean it doesn't paint.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Checkbox* checkbox = new views::Checkbox(label);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  checkbox->set_listener(this);
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  checkbox->SetTooltipText(tooltip_text);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Label* secondary_text = new views::Label(details);
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  secondary_text->SetTooltipText(tooltip_text);
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  secondary_text->SetEnabledColor(kDeemphasizedTextColor);
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  secondary_text->SetTooltipText(tooltip_text);
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  secondary_text->set_border(views::Border::CreateEmptyBorder(
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0,
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::kRelatedControlSmallHorizontalSpacing,
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0,
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::kRelatedControlSmallHorizontalSpacing));
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View* checkbox_view = new views::View();
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  checkbox_view->set_border(views::Border::CreateEmptyBorder(
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0,
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::kPanelHorizMargin,
2605e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      trailing_vertical_space,
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0));
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  checkbox_view->SetLayoutManager(
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0));
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  checkbox_view->AddChildView(checkbox);
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  checkbox_view->AddChildView(secondary_text);
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  container->AddChildView(checkbox_view);
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  checkbox->SetChecked(permitted);
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  checkbox_map_[gallery.pref_id] = checkbox;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 MediaGalleriesDialogViews::GetWindowTitle() const {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return controller_->GetHeader();
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MediaGalleriesDialogViews::ShouldShowWindowTitle() const {
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return DialogDelegate::UseNewStyle();
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaGalleriesDialogViews::DeleteDelegate() {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_->DialogFinished(accepted_);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::Widget* MediaGalleriesDialogViews::GetWidget() {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return contents_->GetWidget();
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const views::Widget* MediaGalleriesDialogViews::GetWidget() const {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return contents_->GetWidget();
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* MediaGalleriesDialogViews::GetContentsView() {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return contents_;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 MediaGalleriesDialogViews::GetDialogButtonLabel(
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::DialogButton button) const {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(button == ui::DIALOG_BUTTON_OK ?
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_MEDIA_GALLERIES_DIALOG_CONFIRM :
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_MEDIA_GALLERIES_DIALOG_CANCEL);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MediaGalleriesDialogViews::IsDialogButtonEnabled(
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::DialogButton button) const {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return button != ui::DIALOG_BUTTON_OK || confirm_available_;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::ModalType MediaGalleriesDialogViews::GetModalType() const {
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH)
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ui::MODAL_TYPE_CHILD;
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return views::WidgetDelegate::GetModalType();
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochviews::View* MediaGalleriesDialogViews::CreateExtraView() {
320eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(!add_gallery_button_);
321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  add_gallery_button_ = new views::LabelButton(this,
322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      l10n_util::GetStringUTF16(IDS_MEDIA_GALLERIES_DIALOG_ADD_GALLERY));
323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  add_gallery_button_->SetStyle(views::Button::STYLE_NATIVE_TEXTBUTTON);
324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return add_gallery_button_;
325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MediaGalleriesDialogViews::Cancel() {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MediaGalleriesDialogViews::Accept() {
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  accepted_ = true;
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(wittman): Remove this override once we move to the new style frame view
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// on all dialogs.
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)views::NonClientFrameView* MediaGalleriesDialogViews::CreateNonClientFrameView(
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::Widget* widget) {
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return CreateConstrainedStyleNonClientFrameView(
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      widget,
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      controller_->web_contents()->GetBrowserContext());
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaGalleriesDialogViews::ButtonPressed(views::Button* sender,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              const ui::Event& event) {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  confirm_available_ = true;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWidget()->client_view()->AsDialogClientView()->UpdateDialogButtons();
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sender == add_gallery_button_) {
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    controller_->OnAddFolderClicked();
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (CheckboxMap::const_iterator iter = checkbox_map_.begin();
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       iter != checkbox_map_.end(); ++iter) {
358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (sender == iter->second) {
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      controller_->DidToggleGalleryId(iter->first,
360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      iter->second->checked());
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MediaGalleriesDialogViewsController -----------------------------------------
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MediaGalleriesDialog* MediaGalleriesDialog::Create(
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MediaGalleriesDialogController* controller) {
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new MediaGalleriesDialogViews(controller);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
373