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