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