11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file.
41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/app_list/views/folder_header_view.h"
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <algorithm>
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/app_list/app_list_constants.h"
111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/app_list/app_list_folder_item.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/app_list/app_list_switches.h"
131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/app_list/views/app_list_folder_view.h"
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/canvas.h"
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ui/resources/grit/ui_resources.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/strings/grit/ui_strings.h"
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/views/border.h"
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/views/controls/button/image_button.h"
201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/views/controls/textfield/textfield.h"
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/views/painter.h"
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace app_list {
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace {
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)const int kPreferredWidth = 360;
281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)const int kPreferredHeight = 48;
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const int kIconDimension = 24;
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kBackButtonPadding = 14;
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kBottomSeparatorPadding = 9;  // Non-experimental app list only.
321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)const int kBottomSeparatorHeight = 1;
3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)const int kMaxFolderNameWidth = 300;
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)const SkColor kHintTextColor = SkColorSetRGB(0xA0, 0xA0, 0xA0);
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class FolderHeaderView::FolderNameView : public views::Textfield {
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public:
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  FolderNameView() {
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetBorder(views::Border::CreateEmptyBorder(1, 1, 1, 1));
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const SkColor kFocusBorderColor = SkColorSetRGB(64, 128, 250);
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SetFocusPainter(views::Painter::CreateSolidFocusPainter(
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          kFocusBorderColor,
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          gfx::Insets(0, 0, 1, 1)));
471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual ~FolderNameView() {
501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private:
531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FolderNameView);
541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)FolderHeaderView::FolderHeaderView(FolderHeaderViewDelegate* delegate)
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    : folder_item_(NULL),
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      back_button_(new views::ImageButton(this)),
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      folder_name_view_(new FolderNameView),
6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      folder_name_placeholder_text_(
6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)              IDS_APP_LIST_FOLDER_NAME_PLACEHOLDER)),
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      delegate_(delegate),
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      folder_name_visible_(true) {
651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  back_button_->SetImage(views::ImageButton::STATE_NORMAL,
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      rb.GetImageSkiaNamed(IDR_APP_LIST_FOLDER_BACK_NORMAL));
681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  back_button_->SetImageAlignment(views::ImageButton::ALIGN_CENTER,
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      views::ImageButton::ALIGN_MIDDLE);
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AddChildView(back_button_);
71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  back_button_->SetFocusable(true);
72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  back_button_->SetAccessibleName(
73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          IDS_APP_LIST_FOLDER_CLOSE_FOLDER_ACCESSIBILE_NAME));
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  folder_name_view_->SetFontList(
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      rb.GetFontList(ui::ResourceBundle::MediumFont));
781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  folder_name_view_->set_placeholder_text_color(kHintTextColor);
7923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  folder_name_view_->set_placeholder_text(folder_name_placeholder_text_);
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  folder_name_view_->SetBorder(views::Border::NullBorder());
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  folder_name_view_->SetBackgroundColor(kContentsBackgroundColor);
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  folder_name_view_->set_controller(this);
831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AddChildView(folder_name_view_);
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)FolderHeaderView::~FolderHeaderView() {
871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (folder_item_)
881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    folder_item_->RemoveObserver(this);
891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void FolderHeaderView::SetFolderItem(AppListFolderItem* folder_item) {
921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (folder_item_)
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    folder_item_->RemoveObserver(this);
941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  folder_item_ = folder_item;
961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!folder_item_)
971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return;
981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  folder_item_->AddObserver(this);
991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  folder_name_view_->SetEnabled(folder_item_->folder_type() !=
10123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                AppListFolderItem::FOLDER_TYPE_OEM);
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  Update();
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FolderHeaderView::UpdateFolderNameVisibility(bool visible) {
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  folder_name_visible_ = visible;
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Update();
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SchedulePaint();
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FolderHeaderView::OnFolderItemRemoved() {
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  folder_item_ = NULL;
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void FolderHeaderView::Update() {
1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!folder_item_)
1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return;
1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  folder_name_view_->SetVisible(folder_name_visible_);
121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (folder_name_visible_) {
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    folder_name_view_->SetText(base::UTF8ToUTF16(folder_item_->name()));
1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    UpdateFolderNameAccessibleName();
124effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
12523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
12623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  Layout();
1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid FolderHeaderView::UpdateFolderNameAccessibleName() {
1305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Sets |folder_name_view_|'s accessible name to the placeholder text if
1315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // |folder_name_view_| is blank; otherwise, clear the accessible name, the
1325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // accessible state's value is set to be folder_name_view_->text() by
1335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // TextField.
1345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::string16 accessible_name = folder_name_view_->text().empty()
1355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                       ? folder_name_placeholder_text_
1365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                       : base::string16();
1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  folder_name_view_->SetAccessibleName(accessible_name);
1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst base::string16& FolderHeaderView::GetFolderNameForTest() {
141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return folder_name_view_->text();
142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
143effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid FolderHeaderView::SetFolderNameForTest(const base::string16& name) {
145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  folder_name_view_->SetText(name);
146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool FolderHeaderView::IsFolderNameEnabledForTest() const {
149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return folder_name_view_->enabled();
150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
151effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size FolderHeaderView::GetPreferredSize() const {
1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return gfx::Size(kPreferredWidth, kPreferredHeight);
1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void FolderHeaderView::Layout() {
1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  gfx::Rect rect(GetContentsBounds());
1581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (rect.IsEmpty())
1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return;
1601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  gfx::Rect back_bounds(rect);
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  back_bounds.set_width(kIconDimension + 2 * kBackButtonPadding);
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (app_list::switches::IsExperimentalAppListEnabled()) {
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Align the left edge of the button image with the left margin of the
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // launcher window. Note that this means the physical button dimensions
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // extends slightly into the margin.
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    back_bounds.set_x(kExperimentalWindowPadding - kBackButtonPadding);
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  back_button_->SetBoundsRect(back_bounds);
1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  gfx::Rect text_bounds(rect);
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::string16 text = folder_item_ && !folder_item_->name().empty()
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                            ? base::UTF8ToUTF16(folder_item_->name())
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                            : folder_name_placeholder_text_;
175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  int text_width =
1765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      gfx::Canvas::GetStringWidth(text, folder_name_view_->GetFontList()) +
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      folder_name_view_->GetCaretBounds().width() +
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      folder_name_view_->GetInsets().width();
17923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  text_width = std::min(text_width, kMaxFolderNameWidth);
1801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  text_bounds.set_x(back_bounds.x() + (rect.width() - text_width) / 2);
1811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  text_bounds.set_width(text_width);
1821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  text_bounds.ClampToCenteredSize(gfx::Size(text_bounds.width(),
1831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      folder_name_view_->GetPreferredSize().height()));
1841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  folder_name_view_->SetBoundsRect(text_bounds);
1851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool FolderHeaderView::OnKeyPressed(const ui::KeyEvent& event) {
188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (event.key_code() == ui::VKEY_RETURN)
189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    delegate_->GiveBackFocusToSearchBox();
190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return false;
192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void FolderHeaderView::OnPaint(gfx::Canvas* canvas) {
1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  views::View::OnPaint(canvas);
1961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  gfx::Rect rect(GetContentsBounds());
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (rect.IsEmpty() || !folder_name_visible_)
1991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return;
2001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Draw bottom separator line.
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int horizontal_padding = app_list::switches::IsExperimentalAppListEnabled()
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               ? kExperimentalWindowPadding
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               : kBottomSeparatorPadding;
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  rect.Inset(horizontal_padding, 0);
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  rect.set_y(rect.bottom() - kBottomSeparatorHeight);
2071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  rect.set_height(kBottomSeparatorHeight);
2081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  canvas->FillRect(rect, kTopSeparatorColor);
2091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void FolderHeaderView::ContentsChanged(views::Textfield* sender,
2121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                       const base::string16& new_contents) {
2131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Temporarily remove from observer to ignore data change caused by us.
2141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!folder_item_)
2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return;
2161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  folder_item_->RemoveObserver(this);
218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Enforce the maximum folder name length in UI.
219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string name = base::UTF16ToUTF8(
220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      folder_name_view_->text().substr(0, kMaxFolderNameChars));
221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (name != folder_item_->name())
222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    delegate_->SetItemName(folder_item_, name);
2231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  folder_item_->AddObserver(this);
22423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  UpdateFolderNameAccessibleName();
2265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
22723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  Layout();
2281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void FolderHeaderView::ButtonPressed(views::Button* sender,
2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                     const ui::Event& event) {
2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  delegate_->NavigateBack(folder_item_, event);
2331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FolderHeaderView::ItemNameChanged() {
2361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  Update();
2371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace app_list
240