bookmark_bar_instructions_view.cc revision 868fa2fe829687343ffae624259930155e16dbd8
1c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// Use of this source code is governed by a BSD-style license that can be 3c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// found in the LICENSE file. 4c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant#include "chrome/browser/ui/views/bookmarks/bookmark_bar_instructions_view.h" 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant 7c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <algorithm> 8c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 9c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include "base/strings/utf_string_conversions.h" 10c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include "chrome/browser/defaults.h" 11c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include "chrome/browser/themes/theme_properties.h" 12c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include "chrome/browser/ui/bookmarks/bookmark_bar_instructions_delegate.h" 13c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include "grit/generated_resources.h" 14c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include "ui/base/accessibility/accessible_view_state.h" 15c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include "ui/base/l10n/l10n_util.h" 16c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include "ui/base/theme_provider.h" 17c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include "ui/views/controls/label.h" 18c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include "ui/views/controls/link.h" 19c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 20c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantnamespace { 21c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 22c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// Horizontal padding, in pixels, between the link and label. 23c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantconst int kViewPadding = 6; 24c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 25c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant} // namespace 26c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 27c52f43e72dfcea03037729649da84c23b3beb04aHoward HinnantBookmarkBarInstructionsView::BookmarkBarInstructionsView( 28c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant chrome::BookmarkBarInstructionsDelegate* delegate) 29c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant : delegate_(delegate), 30c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant instructions_(NULL), 31c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant import_link_(NULL), 32c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant baseline_(-1), 33c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant updated_colors_(false) { 34c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant instructions_ = new views::Label( 35c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant l10n_util::GetStringUTF16(IDS_BOOKMARKS_NO_ITEMS)); 36c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant instructions_->SetAutoColorReadabilityEnabled(false); 37c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant AddChildView(instructions_); 38c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 39c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant if (browser_defaults::kShowImportOnBookmarkBar) { 40c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant import_link_ = new views::Link( 41c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant l10n_util::GetStringUTF16(IDS_BOOKMARK_BAR_IMPORT_LINK)); 42c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant // We don't want the link to alter tab navigation. 43c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant import_link_->set_focusable(false); 44c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant import_link_->set_listener(this); 45541cb301a123086ac7889215aa032f7f81ea96b9Sean Hunt import_link_->set_context_menu_controller(this); 46c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant import_link_->SetAutoColorReadabilityEnabled(false); 47c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant AddChildView(import_link_); 48c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 49c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant} 50c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 51c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantgfx::Size BookmarkBarInstructionsView::GetPreferredSize() { 52c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant int ascent = 0, descent = 0, height = 0, width = 0; 53c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant for (int i = 0; i < child_count(); ++i) { 54c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant views::View* view = child_at(i); 55c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant gfx::Size pref = view->GetPreferredSize(); 56c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant int baseline = view->GetBaseline(); 57c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant if (baseline != -1) { 58c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant ascent = std::max(ascent, baseline); 59c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant descent = std::max(descent, pref.height() - baseline); 60c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } else { 61c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant height = std::max(pref.height(), height); 62c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 63c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant width += pref.width(); 64c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 65c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant width += (child_count() - 1) * kViewPadding; 66c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant if (ascent != 0) 67c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant height = std::max(ascent + descent, height); 68c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant return gfx::Size(width, height); 69c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant} 70c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 71c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantvoid BookmarkBarInstructionsView::Layout() { 72c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant int remaining_width = width(); 73c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant int x = 0; 74c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant for (int i = 0; i < child_count(); ++i) { 75c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant views::View* view = child_at(i); 76c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant gfx::Size pref = view->GetPreferredSize(); 77c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant int baseline = view->GetBaseline(); 78c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant int y; 79c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant if (baseline != -1 && baseline_ != -1) 80c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant y = baseline_ - baseline; 81c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant else 82c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant y = (height() - pref.height()) / 2; 83c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant int view_width = std::min(remaining_width, pref.width()); 84c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant view->SetBounds(x, y, view_width, pref.height()); 85c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant x += view_width + kViewPadding; 86c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant remaining_width = std::max(0, width() - x); 87c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 88c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant} 89c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 90c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantvoid BookmarkBarInstructionsView::OnThemeChanged() { 91c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant UpdateColors(); 92c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant} 93c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 94c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantvoid BookmarkBarInstructionsView::ViewHierarchyChanged( 95c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant const ViewHierarchyChangedDetails& details) { 96c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant if (!updated_colors_ && details.is_add && GetWidget()) 97c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant UpdateColors(); 98c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant} 99c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 100c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantvoid BookmarkBarInstructionsView::GetAccessibleState( 101c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant ui::AccessibleViewState* state) { 102c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant state->role = ui::AccessibilityTypes::ROLE_GROUPING; 103c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant} 104c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 105c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantvoid BookmarkBarInstructionsView::LinkClicked(views::Link* source, 106c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant int event_flags) { 107c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant delegate_->ShowImportDialog(); 108c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant} 109c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 110c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantvoid BookmarkBarInstructionsView::ShowContextMenuForView( 111c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant views::View* source, 112c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant const gfx::Point& point) { 113c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant // Do nothing here, we don't want to show the Bookmarks context menu when 114c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant // the user right clicks on the "Import bookmarks now" link. 115c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant} 116c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 117c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantvoid BookmarkBarInstructionsView::UpdateColors() { 118c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant // We don't always have a theme provider (ui tests, for example). 119c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant const ui::ThemeProvider* theme_provider = GetThemeProvider(); 120c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant if (!theme_provider) 121c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant return; 122541cb301a123086ac7889215aa032f7f81ea96b9Sean Hunt updated_colors_ = true; 123c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant SkColor text_color = 124 theme_provider->GetColor(ThemeProperties::COLOR_BOOKMARK_TEXT); 125 instructions_->SetEnabledColor(text_color); 126 if (import_link_) 127 import_link_->SetEnabledColor(text_color); 128} 129