media_galleries_dialog_views.cc revision 0529e5d033099cbfc42635f6f6183833b09dff6e
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Use of this source code is governed by a BSD-style license that can be
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// found in the LICENSE file.
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner#include "chrome/browser/ui/views/extensions/media_galleries_dialog_views.h"
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "base/strings/utf_string_conversions.h"
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "chrome/browser/ui/views/extensions/media_gallery_checkbox_view.h"
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "components/web_modal/web_contents_modal_dialog_host.h"
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "components/web_modal/web_contents_modal_dialog_manager.h"
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "components/web_modal/web_contents_modal_dialog_manager_delegate.h"
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "content/public/browser/web_contents.h"
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "grit/generated_resources.h"
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "grit/locale_settings.h"
155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "ui/base/l10n/l10n_util.h"
165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "ui/native_theme/native_theme.h"
1794deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson#include "ui/views/border.h"
185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "ui/views/controls/button/checkbox.h"
195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "ui/views/controls/button/label_button.h"
205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "ui/views/controls/label.h"
21525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner#include "ui/views/controls/menu/menu_runner.h"
223b8d116703db8018f855cbb4733ace426422623bNate Begeman#include "ui/views/controls/scroll_view.h"
23b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar#include "ui/views/controls/separator.h"
24c5ae899b4bbf65488445316c63168079177db0edSteve Naroff#include "ui/views/layout/box_layout.h"
255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "ui/views/layout/grid_layout.h"
265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "ui/views/layout/layout_constants.h"
27590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner#include "ui/views/view.h"
28c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson#include "ui/views/widget/widget.h"
29c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "ui/views/window/dialog_client_view.h"
30c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar
31c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbarusing web_modal::WebContentsModalDialogManager;
328e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorusing web_modal::WebContentsModalDialogManagerDelegate;
33c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar
3456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroffnamespace {
3588a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor
3688a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregorconst int kScrollAreaHeight = 192;
3788a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor
385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This container has the right Layout() impl to use within a ScrollView.
395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass ScrollableView : public views::View {
405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer public:
415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ScrollableView() {}
425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual ~ScrollableView() {}
435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
44898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  virtual void Layout() OVERRIDE;
459ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor
461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump private:
47898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  DISALLOW_COPY_AND_ASSIGN(ScrollableView);
48898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor};
49898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid ScrollableView::Layout() {
51898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  gfx::Size pref = GetPreferredSize();
52898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  int width = pref.width();
53898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  int height = pref.height();
54898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  if (parent()) {
55898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    width = parent()->width();
56898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    height = std::max(parent()->height(), height);
571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
58b3eef68111ffc220e449be96da1747998c057790Douglas Gregor  SetBounds(x(), y(), width, height);
591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6083233a4b7c2bc7b531ffa3b33fdd1cd8138373b6Douglas Gregor  views::View::Layout();
61898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor}
62898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
63b3eef68111ffc220e449be96da1747998c057790Douglas Gregor}  // namespace
64898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
65898574e7496ba8fd76290079d3a9d06954992734Douglas Gregortypedef MediaGalleriesDialogController::GalleryPermissionsVector
66898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    GalleryPermissionsVector;
670b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor
680b7489194f9f89fac39d57211c1e7953ae50251fDouglas GregorMediaGalleriesDialogViews::MediaGalleriesDialogViews(
690b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor    MediaGalleriesDialogController* controller)
701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    : controller_(controller),
7143d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor      window_(NULL),
7243d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor      contents_(new views::View()),
7343d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor      add_gallery_button_(NULL),
7443d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor      confirm_available_(false),
7543d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor      accepted_(false) {
7643d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor  InitChildViews();
7743d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor
7843d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor  if (ControllerHasWebContents()) {
791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Ownership of |contents_| is handed off by this call. |window_| will take
80f7c2aa0b049272d8f318988c1965760dcb852578Douglas Gregor    // care of deleting itself after calling DeleteDelegate().
811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    WebContentsModalDialogManager* web_contents_modal_dialog_manager =
829d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor        WebContentsModalDialogManager::FromWebContents(
839d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor            controller->web_contents());
849d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor    DCHECK(web_contents_modal_dialog_manager);
859d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor    WebContentsModalDialogManagerDelegate* modal_delegate =
869d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor        web_contents_modal_dialog_manager->delegate();
879d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor    DCHECK(modal_delegate);
889d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor    window_ = views::Widget::CreateWindowAsFramelessChild(
891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        this, modal_delegate->GetWebContentsModalDialogHost()->GetHostView());
908320aaaa01d931aa234fc3bce05b399ef41898d5Daniel Dunbar    web_contents_modal_dialog_manager->ShowModalDialog(
91f7c2aa0b049272d8f318988c1965760dcb852578Douglas Gregor        window_->GetNativeView());
921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
939d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor}
9477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
95898574e7496ba8fd76290079d3a9d06954992734Douglas GregorMediaGalleriesDialogViews::~MediaGalleriesDialogViews() {
96898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  if (!ControllerHasWebContents())
97898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    delete contents_;
981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
99898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
100898574e7496ba8fd76290079d3a9d06954992734Douglas Gregorvoid MediaGalleriesDialogViews::InitChildViews() {
101898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  // Outer dialog layout.
102898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  contents_->RemoveAllChildViews(true);
103898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  int dialog_content_width = views::Widget::GetLocalizedContentsWidth(
1040b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor      IDS_MEDIA_GALLERIES_DIALOG_CONTENT_WIDTH_CHARS);
1050b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor  views::GridLayout* layout = views::GridLayout::CreatePanel(contents_);
1060b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor  contents_->SetLayoutManager(layout);
107898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
108898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  int column_set_id = 0;
109898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  views::ColumnSet* columns = layout->AddColumnSet(column_set_id);
110898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  columns->AddColumn(views::GridLayout::LEADING,
111898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor                     views::GridLayout::LEADING,
112898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor                     1,
1131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                     views::GridLayout::FIXED,
114898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor                     dialog_content_width,
115898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor                     0);
116898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
117898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  // Message text.
118898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  views::Label* subtext = new views::Label(controller_->GetSubtext());
119898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  subtext->SetMultiLine(true);
1200b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor  subtext->SetHorizontalAlignment(gfx::ALIGN_LEFT);
1210b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor  layout->StartRow(0, column_set_id);
1220b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor  layout->AddView(
1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      subtext, 1, 1,
1245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      views::GridLayout::FILL, views::GridLayout::LEADING,
1255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      dialog_content_width, subtext->GetHeightForWidth(dialog_content_width));
1265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
1275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Scrollable area for checkboxes.
1295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ScrollableView* scroll_container = new ScrollableView();
1305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  scroll_container->SetLayoutManager(new views::BoxLayout(
1311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      views::BoxLayout::kVertical, 0, 0,
132026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner      views::kRelatedControlSmallVerticalSpacing));
133026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner  scroll_container->SetBorder(
134026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner      views::Border::CreateEmptyBorder(views::kRelatedControlVerticalSpacing,
135026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner                                       0,
136026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner                                       views::kRelatedControlVerticalSpacing,
13740b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis                                       0));
1381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Add attached galleries checkboxes.
1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  checkbox_map_.clear();
1415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  GalleryPermissionsVector permissions = controller_->AttachedPermissions();
1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (GalleryPermissionsVector::const_iterator iter = permissions.begin();
1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer       iter != permissions.end(); ++iter) {
1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    int spacing = 0;
1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (iter + 1 == permissions.end())
1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      spacing = views::kRelatedControlSmallVerticalSpacing;
1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    AddOrUpdateGallery(*iter, scroll_container, spacing);
14808ad47cbd1f81fcb31dbc731c13b885a07e12704Bill Wendling  }
14976458501a8963fa11b91c9337a487de6871169b4Sebastian Redl
1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  GalleryPermissionsVector unattached_permissions =
1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      controller_->UnattachedPermissions();
1525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!unattached_permissions.empty()) {
1545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Separator line.
155fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff    views::Separator* separator = new views::Separator(
15686f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor        views::Separator::HORIZONTAL);
15786f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor    scroll_container->AddChildView(separator);
1585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
15928be73f74c9e241a23ea24fe5756623de6bf1084Chris Lattner    // Unattached locations section.
16053202857c60214d80950a975e6e52aebf30bd16aEli Friedman    views::Label* unattached_text = new views::Label(
16153202857c60214d80950a975e6e52aebf30bd16aEli Friedman        controller_->GetUnattachedLocationsHeader());
16253202857c60214d80950a975e6e52aebf30bd16aEli Friedman    unattached_text->SetMultiLine(true);
1631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    unattached_text->SetHorizontalAlignment(gfx::ALIGN_LEFT);
1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    unattached_text->SetBorder(
1655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        views::Border::CreateEmptyBorder(views::kRelatedControlVerticalSpacing,
1661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                         views::kPanelHorizMargin,
1675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                                         views::kRelatedControlVerticalSpacing,
1685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                                         0));
16944e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar    scroll_container->AddChildView(unattached_text);
17044e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar
17144e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar    // Add unattached galleries checkboxes.
17244e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar    for (GalleryPermissionsVector::const_iterator iter =
1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer             unattached_permissions.begin();
1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer         iter != unattached_permissions.end(); ++iter) {
1755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      AddOrUpdateGallery(*iter, scroll_container, 0);
1765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
177fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff  }
1785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
179ca354faa7e9b99af17070c82b9662a5fca76422cChris Lattner  confirm_available_ = controller_->IsAcceptAllowed();
1805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Add the scrollable area to the outer dialog view. It will squeeze against
1824f6a7d7ead09b439216c32f2de806a998aeb222aSteve Naroff  // the title/subtitle and buttons to occupy all available space in the dialog.
1835daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian  views::ScrollView* scroll_view =
184ba8d2d684e74a20bef03828c21c991d222c7e9e5Fariborz Jahanian      views::ScrollView::CreateScrollViewWithBorder();
18586f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor  scroll_view->SetContents(scroll_container);
18686f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor  layout->StartRowWithPadding(1, column_set_id,
1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                              0, views::kRelatedControlVerticalSpacing);
18844e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar  layout->AddView(scroll_view, 1, 1,
18944e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar                  views::GridLayout::FILL, views::GridLayout::FILL,
1901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  dialog_content_width, kScrollAreaHeight);
19133bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor}
19233bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor
19333bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregorvoid MediaGalleriesDialogViews::UpdateGalleries() {
1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitChildViews();
19538d068e8f13a119b89a3b8b0f79f35cab1ffd09aAnders Carlsson  contents_->Layout();
19638d068e8f13a119b89a3b8b0f79f35cab1ffd09aAnders Carlsson}
19738d068e8f13a119b89a3b8b0f79f35cab1ffd09aAnders Carlsson
1981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool MediaGalleriesDialogViews::AddOrUpdateGallery(
1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    const MediaGalleriesDialogController::GalleryPermission& gallery,
2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    views::View* container,
2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    int trailing_vertical_space) {
2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  base::string16 label = gallery.pref_info.GetGalleryDisplayName();
203590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner  base::string16 tooltip_text = gallery.pref_info.GetGalleryTooltip();
204590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner  base::string16 details = gallery.pref_info.GetGalleryAdditionalDetails();
2055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
206590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner  CheckboxMap::iterator iter = checkbox_map_.find(gallery.gallery_id);
2078070a8497c0fb3e6f70a557f788405d8945b1208Daniel Dunbar  if (iter != checkbox_map_.end()) {
208590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner    views::Checkbox* checkbox = iter->second->checkbox();
2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    checkbox->SetChecked(gallery.allowed);
210c9e8f606787b0bc0c3b08e566b87cc1751694168Eli Friedman    checkbox->SetText(label);
211c9e8f606787b0bc0c3b08e566b87cc1751694168Eli Friedman    checkbox->SetTooltipText(tooltip_text);
212c9e8f606787b0bc0c3b08e566b87cc1751694168Eli Friedman    iter->second->secondary_text()->SetText(details);
2131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    iter->second->secondary_text()->SetVisible(details.length() > 0);
21494deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson    return false;
21594deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson  }
2162d6744ff04c1690a1485178d550d2fab84a0270bDaniel Dunbar
21794deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson  MediaGalleryCheckboxView* gallery_view =
2181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      new MediaGalleryCheckboxView(label, tooltip_text, details, false,
21994deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson                                   trailing_vertical_space, this, this);
22094deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson  gallery_view->checkbox()->SetChecked(gallery.allowed);
22194deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson  container->AddChildView(gallery_view);
2221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  checkbox_map_[gallery.gallery_id] = gallery_view;
22394deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson
22494deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson  return true;
22594deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson}
22694deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson
22794deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlssonbase::string16 MediaGalleriesDialogViews::GetWindowTitle() const {
22894deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson  return controller_->GetHeader();
22994deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson}
23094deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson
23194deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlssonvoid MediaGalleriesDialogViews::DeleteDelegate() {
23294deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson  controller_->DialogFinished(accepted_);
23394deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson}
2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23594deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlssonviews::Widget* MediaGalleriesDialogViews::GetWidget() {
23694deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson  return contents_->GetWidget();
23794deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson}
2386ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner
239019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattnerconst views::Widget* MediaGalleriesDialogViews::GetWidget() const {
240019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  return contents_->GetWidget();
241019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner}
2425b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson
2435b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlssonviews::View* MediaGalleriesDialogViews::GetContentsView() {
2446ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner  return contents_;
24545b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner}
24645b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner
247c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlssonbase::string16 MediaGalleriesDialogViews::GetDialogButtonLabel(
24851fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson    ui::DialogButton button) const {
24951fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson  return l10n_util::GetStringUTF16(button == ui::DIALOG_BUTTON_OK ?
25051fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson      IDS_MEDIA_GALLERIES_DIALOG_CONFIRM :
25151fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson      IDS_MEDIA_GALLERIES_DIALOG_CANCEL);
252b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman}
253b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman
2541b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlssonbool MediaGalleriesDialogViews::IsDialogButtonEnabled(
2551b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson    ui::DialogButton button) const {
256b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman  return button != ui::DIALOG_BUTTON_OK || confirm_available_;
257b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman}
258b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman
259b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedmanui::ModalType MediaGalleriesDialogViews::GetModalType() const {
260ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor#if defined(USE_ASH)
261ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor  return ui::MODAL_TYPE_CHILD;
262ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor#else
263ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor  return views::WidgetDelegate::GetModalType();
264ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor#endif
265ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor}
266ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor
267ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregorviews::View* MediaGalleriesDialogViews::CreateExtraView() {
268ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor  DCHECK(!add_gallery_button_);
269ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor  add_gallery_button_ = new views::LabelButton(this,
270ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor      l10n_util::GetStringUTF16(IDS_MEDIA_GALLERIES_DIALOG_ADD_GALLERY));
271ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor  add_gallery_button_->SetStyle(views::Button::STYLE_BUTTON);
272ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor  return add_gallery_button_;
273ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor}
274ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor
275efa9b3877ef298bcb792600ac33521827e1f7fafAnders Carlssonbool MediaGalleriesDialogViews::Cancel() {
276efa9b3877ef298bcb792600ac33521827e1f7fafAnders Carlsson  return true;
277efa9b3877ef298bcb792600ac33521827e1f7fafAnders Carlsson}
278ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor
279ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregorbool MediaGalleriesDialogViews::Accept() {
280efa9b3877ef298bcb792600ac33521827e1f7fafAnders Carlsson  accepted_ = true;
28144baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian
2821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return true;
283102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian}
2841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2854e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenekvoid MediaGalleriesDialogViews::ButtonPressed(views::Button* sender,
2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              const ui::Event& /* event */) {
2874e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek  confirm_available_ = true;
2884e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek
2894e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek  if (ControllerHasWebContents())
29056f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner    GetWidget()->client_view()->AsDialogClientView()->UpdateDialogButtons();
29156f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner
29227c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor  if (sender == add_gallery_button_) {
29356f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner    controller_->OnAddFolderClicked();
2941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return;
295ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner  }
296ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner
297ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner  for (CheckboxMap::const_iterator iter = checkbox_map_.begin();
298ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner       iter != checkbox_map_.end(); ++iter) {
2991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (sender == iter->second->checkbox()) {
3004e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek      controller_->DidToggleGallery(iter->first,
3014e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek                                    iter->second->checkbox()->checked());
3024e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek      return;
30356f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner    }
30456f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner  }
30556f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner}
306ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner
307ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattnervoid MediaGalleriesDialogViews::ShowContextMenuForView(
308ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner    views::View* source,
3091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const gfx::Point& point,
310898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    ui::MenuSourceType source_type) {
311898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  for (CheckboxMap::const_iterator iter = checkbox_map_.begin();
312898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor       iter != checkbox_map_.end(); ++iter) {
3131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (iter->second->Contains(source)) {
3145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      ShowContextMenu(point, source_type, iter->first);
3151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return;
3165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
3175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid MediaGalleriesDialogViews::ShowContextMenu(const gfx::Point& point,
3215549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek                                                ui::MenuSourceType source_type,
3225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                                                GalleryDialogId id) {
3235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  context_menu_runner_.reset(new views::MenuRunner(
3245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      controller_->GetContextMenu(id)));
3255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (context_menu_runner_->RunMenuAt(
3275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer          GetWidget(), NULL, gfx::Rect(point.x(), point.y(), 0, 0),
3281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump          views::MenuItemView::TOPLEFT, source_type,
3295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer          views::MenuRunner::HAS_MNEMONICS | views::MenuRunner::CONTEXT_MENU) ==
3309e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis      views::MenuRunner::MENU_DELETED) {
3319e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis    return;
3321a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor  }
3331a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor}
3348e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor
3359e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidisbool MediaGalleriesDialogViews::ControllerHasWebContents() const {
3369e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis  return controller_->web_contents() != NULL;
3371a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor}
3381a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor
3391a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor// MediaGalleriesDialogViewsController -----------------------------------------
3401a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor
3415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// static
342898574e7496ba8fd76290079d3a9d06954992734Douglas GregorMediaGalleriesDialog* MediaGalleriesDialog::Create(
343898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    MediaGalleriesDialogController* controller) {
3441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return new MediaGalleriesDialogViews(controller);
3455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
346898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor