media_gallery_checkbox_view.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
11e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner// Copyright 2014 The Chromium Authors. All rights reserved.
20e0a7a45d3d0a8c865a078459d2e1c6d8967a100Misha Brukman// Use of this source code is governed by a BSD-style license that can be
3856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell// found in the LICENSE file.
4856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner#include "chrome/browser/ui/views/extensions/media_gallery_checkbox_view.h"
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner
70e0a7a45d3d0a8c865a078459d2e1c6d8967a100Misha Brukman#include "chrome/browser/media_galleries/media_galleries_preferences.h"
8856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell#include "grit/generated_resources.h"
9726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner#include "grit/theme_resources.h"
103501feab811c86c9659248a4875fc31a3165f84dChris Lattner#include "third_party/skia/include/core/SkColor.h"
11726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner#include "ui/base/l10n/l10n_util.h"
12726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner#include "ui/base/resource/resource_bundle.h"
13726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner#include "ui/gfx/rect.h"
14726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner#include "ui/views/border.h"
15726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner#include "ui/views/context_menu_controller.h"
16726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner#include "ui/views/controls/button/button.h"
173501feab811c86c9659248a4875fc31a3165f84dChris Lattner#include "ui/views/controls/button/checkbox.h"
1852e724ad7e679ee590f4bd763d55280586a8f1bcNicolas Geoffray#include "ui/views/controls/button/image_button.h"
19726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner#include "ui/views/controls/label.h"
206259d51c91d7da9bf16114849236b5bdfa85f35eBill Wendling#include "ui/views/layout/box_layout.h"
216f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman#include "ui/views/layout/layout_constants.h"
22726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner
23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace {
2425ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng
25aa3c1410b427909da350f2b5e8d4ec3db62a3618Evan Cheng// Equal to the #9F9F9F color used in spec (note WebUI color is #999).
26d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeconst SkColor kDeemphasizedTextColor = SkColorSetRGB(159, 159, 159);
277fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner
287fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner}  // namespace
297fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner
307fbe9723e32ff35c4ad765c88209ef9321475a1bChris LattnerMediaGalleryCheckboxView::MediaGalleryCheckboxView(
317fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner    const MediaGalleryPrefInfo& pref_info,
327fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner    bool show_folder_button,
337fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner    int trailing_vertical_space,
347fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner    views::ButtonListener* button_listener,
357fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner    views::ContextMenuController* menu_controller) {
367fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner  DCHECK(button_listener != NULL);
377fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner  SetLayoutManager(
387fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner      new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0));
397fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner  SetBorder(views::Border::CreateEmptyBorder(
407fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner      0, views::kPanelHorizMargin, trailing_vertical_space,
417fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner      views::kPanelHorizMargin));
427fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner  if (menu_controller)
437fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner    set_context_menu_controller(menu_controller);
447fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner
457fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner  checkbox_ = new views::Checkbox(pref_info.GetGalleryDisplayName());
467fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner  checkbox_->set_listener(button_listener);
477fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner  if (menu_controller)
487fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner    checkbox_->set_context_menu_controller(menu_controller);
496634e26aa11b0e2eabde8b3b463bb943364f8d9dChristopher Lamb  checkbox_->SetElideBehavior(gfx::ELIDE_MIDDLE);
507fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner  base::string16 tooltip_text = pref_info.GetGalleryTooltip();
517fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner  checkbox_->SetTooltipText(tooltip_text);
529cd68759178f9fe25c72253d338e78e414f1d770Chris Lattner
539cd68759178f9fe25c72253d338e78e414f1d770Chris Lattner  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
549cd68759178f9fe25c72253d338e78e414f1d770Chris Lattner  folder_viewer_button_ = new views::ImageButton(button_listener);
559cd68759178f9fe25c72253d338e78e414f1d770Chris Lattner  if (menu_controller)
569cd68759178f9fe25c72253d338e78e414f1d770Chris Lattner    folder_viewer_button_->set_context_menu_controller(menu_controller);
577fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner  folder_viewer_button_->SetImage(views::ImageButton::STATE_NORMAL,
587fbe9723e32ff35c4ad765c88209ef9321475a1bChris Lattner                                  rb.GetImageSkiaNamed(IDR_FILE_FOLDER));
599d17740295838f94120646ef619b2e187f2d71bdChris Lattner  folder_viewer_button_->SetImageAlignment(views::ImageButton::ALIGN_CENTER,
609d17740295838f94120646ef619b2e187f2d71bdChris Lattner                                           views::ImageButton::ALIGN_MIDDLE);
619d17740295838f94120646ef619b2e187f2d71bdChris Lattner  folder_viewer_button_->SetAccessibleName(l10n_util::GetStringUTF16(
629d17740295838f94120646ef619b2e187f2d71bdChris Lattner      IDS_MEDIA_GALLERIES_SCAN_RESULT_OPEN_FOLDER_VIEW_ACCESSIBILITY_NAME));
639d17740295838f94120646ef619b2e187f2d71bdChris Lattner  folder_viewer_button_->SetFocusable(true);
646aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner  folder_viewer_button_->SetVisible(show_folder_button);
656aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner  folder_viewer_button_->SetBorder(views::Border::CreateEmptyBorder(
666aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner      0, views::kRelatedControlSmallHorizontalSpacing, 0, 0));
676aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner
686aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner  base::string16 details = pref_info.GetGalleryAdditionalDetails();
694c299f5da1013cd36563a82f188c731b2758074dChris Lattner  secondary_text_ = new views::Label(details);
704c299f5da1013cd36563a82f188c731b2758074dChris Lattner  if (menu_controller)
714c299f5da1013cd36563a82f188c731b2758074dChris Lattner    secondary_text_->set_context_menu_controller(menu_controller);
724c299f5da1013cd36563a82f188c731b2758074dChris Lattner  secondary_text_->SetVisible(details.length() > 0);
734c299f5da1013cd36563a82f188c731b2758074dChris Lattner  secondary_text_->SetEnabledColor(kDeemphasizedTextColor);
746aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner  secondary_text_->SetElideBehavior(gfx::ELIDE_HEAD);
756aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner  secondary_text_->SetTooltipText(tooltip_text);
764c299f5da1013cd36563a82f188c731b2758074dChris Lattner  secondary_text_->SetBorder(views::Border::CreateEmptyBorder(
770e0a7a45d3d0a8c865a078459d2e1c6d8967a100Misha Brukman      0, views::kRelatedControlSmallHorizontalSpacing, 0, 0));
786aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner
796aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner  AddChildView(checkbox_);
804c299f5da1013cd36563a82f188c731b2758074dChris Lattner  AddChildView(folder_viewer_button_);
816aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner  AddChildView(secondary_text_);
826aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner}
836aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner
846aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris LattnerMediaGalleryCheckboxView::~MediaGalleryCheckboxView() {}
854c299f5da1013cd36563a82f188c731b2758074dChris Lattner
866aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattnervoid MediaGalleryCheckboxView::Layout() {
876aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner  views::View::Layout();
886aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner  if (GetPreferredSize().width() <= GetLocalBounds().width())
896aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner    return;
904c299f5da1013cd36563a82f188c731b2758074dChris Lattner
916aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner  // If box layout doesn't fit, do custom layout. The folder_viewer_button and
926aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner  // the secondary text should take up at most half of the space and the
936aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner  // checkbox can take up what ever is left.
946aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner  int checkbox_width = checkbox_->GetPreferredSize().width();
954c299f5da1013cd36563a82f188c731b2758074dChris Lattner  int folder_viewer_width = folder_viewer_button_->GetPreferredSize().width();
966aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner  int secondary_text_width = secondary_text_->GetPreferredSize().width();
976aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner  if (!folder_viewer_button_->visible())
986aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner    folder_viewer_width = 0;
996aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner  if (!secondary_text_->visible())
1004c299f5da1013cd36563a82f188c731b2758074dChris Lattner    secondary_text_width = 0;
1010e0a7a45d3d0a8c865a078459d2e1c6d8967a100Misha Brukman
102169584ed45f62f91599bed3d019640e168d815eaAlkis Evlogimenos  gfx::Rect area(GetLocalBounds());
10385b39f229f3146e57d059f1c774400e4bde23987Chris Lattner  area.Inset(GetInsets());
10485b39f229f3146e57d059f1c774400e4bde23987Chris Lattner
10585b39f229f3146e57d059f1c774400e4bde23987Chris Lattner  if (folder_viewer_width + secondary_text_width > area.width() / 2) {
10685b39f229f3146e57d059f1c774400e4bde23987Chris Lattner    secondary_text_width =
10785b39f229f3146e57d059f1c774400e4bde23987Chris Lattner        std::max(area.width() / 2 - folder_viewer_width,
108169584ed45f62f91599bed3d019640e168d815eaAlkis Evlogimenos                 area.width() - folder_viewer_width - checkbox_width);
109169584ed45f62f91599bed3d019640e168d815eaAlkis Evlogimenos  }
11085b39f229f3146e57d059f1c774400e4bde23987Chris Lattner  checkbox_width = area.width() - folder_viewer_width - secondary_text_width;
11185b39f229f3146e57d059f1c774400e4bde23987Chris Lattner
112169584ed45f62f91599bed3d019640e168d815eaAlkis Evlogimenos  checkbox_->SetBounds(area.x(), area.y(), checkbox_width, area.height());
113169584ed45f62f91599bed3d019640e168d815eaAlkis Evlogimenos  if (folder_viewer_button_->visible()) {
1146aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner    folder_viewer_button_->SetBounds(checkbox_->x() + checkbox_width, area.y(),
1153c55c54a877b3e5a79053df8f6080f505c9d1ff4Evan Cheng                                     folder_viewer_width, area.height());
1163c55c54a877b3e5a79053df8f6080f505c9d1ff4Evan Cheng  }
1173c55c54a877b3e5a79053df8f6080f505c9d1ff4Evan Cheng  if (secondary_text_->visible()) {
1183c55c54a877b3e5a79053df8f6080f505c9d1ff4Evan Cheng    secondary_text_->SetBounds(
1193c55c54a877b3e5a79053df8f6080f505c9d1ff4Evan Cheng        checkbox_->x() + checkbox_width + folder_viewer_width,
1206aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner        area.y(), secondary_text_width, area.height());
1216aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner  }
1226aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner}
1236aab9cf65cd1e96f9d0fa99f8453da454648bba1Chris Lattner