15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/bookmarks/bookmark_bar_instructions_view.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/defaults.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/themes/theme_properties.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/bookmarks/bookmark_bar_instructions_delegate.h"
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_view_state.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/theme_provider.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/link.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Horizontal padding, in pixels, between the link and label.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kViewPadding = 6;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BookmarkBarInstructionsView::BookmarkBarInstructionsView(
28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    BookmarkBarInstructionsDelegate* delegate)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : delegate_(delegate),
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instructions_(NULL),
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      import_link_(NULL),
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      baseline_(-1),
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      updated_colors_(false) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instructions_ = new views::Label(
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_BOOKMARKS_NO_ITEMS));
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instructions_->SetAutoColorReadabilityEnabled(false);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(instructions_);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_defaults::kShowImportOnBookmarkBar) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    import_link_ = new views::Link(
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_BOOKMARK_BAR_IMPORT_LINK));
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We don't want the link to alter tab navigation.
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    import_link_->SetFocusable(false);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    import_link_->set_listener(this);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    import_link_->set_context_menu_controller(this);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    import_link_->SetAutoColorReadabilityEnabled(false);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddChildView(import_link_);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size BookmarkBarInstructionsView::GetPreferredSize() const {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int ascent = 0, descent = 0, height = 0, width = 0;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < child_count(); ++i) {
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const views::View* view = child_at(i);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Size pref = view->GetPreferredSize();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int baseline = view->GetBaseline();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (baseline != -1) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ascent = std::max(ascent, baseline);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      descent = std::max(descent, pref.height() - baseline);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      height = std::max(pref.height(), height);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    width += pref.width();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  width += (child_count() - 1) * kViewPadding;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ascent != 0)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    height = std::max(ascent + descent, height);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Size(width, height);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BookmarkBarInstructionsView::Layout() {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int remaining_width = width();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int x = 0;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < child_count(); ++i) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View* view = child_at(i);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Size pref = view->GetPreferredSize();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int baseline = view->GetBaseline();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int y;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (baseline != -1 && baseline_ != -1)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      y = baseline_ - baseline;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      y = (height() - pref.height()) / 2;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int view_width = std::min(remaining_width, pref.width());
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view->SetBounds(x, y, view_width, pref.height());
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    x += view_width + kViewPadding;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    remaining_width = std::max(0, width() - x);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BookmarkBarInstructionsView::OnThemeChanged() {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateColors();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void BookmarkBarInstructionsView::ViewHierarchyChanged(
95a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const ViewHierarchyChangedDetails& details) {
96a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (!updated_colors_ && details.is_add && GetWidget())
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateColors();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BookmarkBarInstructionsView::GetAccessibleState(
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ui::AXViewState* state) {
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  instructions_->GetAccessibleState(state);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BookmarkBarInstructionsView::LinkClicked(views::Link* source,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              int event_flags) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->ShowImportDialog();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BookmarkBarInstructionsView::ShowContextMenuForView(
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::View* source,
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const gfx::Point& point,
1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ui::MenuSourceType source_type) {
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Do nothing here, we don't want to show the Bookmarks context menu when
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the user right clicks on the "Import bookmarks now" link.
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BookmarkBarInstructionsView::UpdateColors() {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't always have a theme provider (ui tests, for example).
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::ThemeProvider* theme_provider = GetThemeProvider();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!theme_provider)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  updated_colors_ = true;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor text_color =
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      theme_provider->GetColor(ThemeProperties::COLOR_BOOKMARK_TEXT);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instructions_->SetEnabledColor(text_color);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (import_link_)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    import_link_->SetEnabledColor(text_color);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
130