Home | History | Annotate | Download | only in bookmarks
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/views/bookmarks/bookmark_bar_instructions_view.h"
      6 
      7 #include "base/utf_string_conversions.h"
      8 #include "chrome/browser/defaults.h"
      9 #include "chrome/browser/themes/theme_service.h"
     10 #include "grit/generated_resources.h"
     11 #include "ui/base/l10n/l10n_util.h"
     12 #include "views/controls/label.h"
     13 
     14 using views::View;
     15 
     16 // Horizontal padding, in pixels, between the link and label.
     17 static const int kViewPadding = 6;
     18 
     19 BookmarkBarInstructionsView::BookmarkBarInstructionsView(Delegate* delegate)
     20     : delegate_(delegate),
     21       instructions_(NULL),
     22       import_link_(NULL),
     23       baseline_(-1),
     24       updated_colors_(false) {
     25   instructions_ = new views::Label(
     26       UTF16ToWide(l10n_util::GetStringUTF16(IDS_BOOKMARKS_NO_ITEMS)));
     27   AddChildView(instructions_);
     28 
     29   if (browser_defaults::kShowImportOnBookmarkBar) {
     30     import_link_ = new views::Link(
     31         UTF16ToWide(l10n_util::GetStringUTF16(IDS_BOOKMARK_BAR_IMPORT_LINK)));
     32     // We don't want the link to alter tab navigation.
     33     import_link_->SetFocusable(false);
     34     import_link_->SetController(this);
     35     AddChildView(import_link_);
     36   }
     37 }
     38 
     39 gfx::Size BookmarkBarInstructionsView::GetPreferredSize() {
     40   int ascent = 0, descent = 0, height = 0, width = 0;
     41   for (int i = 0; i < child_count(); ++i) {
     42     View* view = GetChildViewAt(i);
     43     gfx::Size pref = view->GetPreferredSize();
     44     int baseline = view->GetBaseline();
     45     if (baseline != -1) {
     46       ascent = std::max(ascent, baseline);
     47       descent = std::max(descent, pref.height() - baseline);
     48     } else {
     49       height = std::max(pref.height(), height);
     50     }
     51     width += pref.width();
     52   }
     53   width += (child_count() - 1) * kViewPadding;
     54   if (ascent != 0)
     55     height = std::max(ascent + descent, height);
     56   return gfx::Size(width, height);
     57 }
     58 
     59 void BookmarkBarInstructionsView::Layout() {
     60   int remaining_width = width();
     61   int x = 0;
     62   for (int i = 0; i < child_count(); ++i) {
     63     View* view = GetChildViewAt(i);
     64     gfx::Size pref = view->GetPreferredSize();
     65     int baseline = view->GetBaseline();
     66     int y;
     67     if (baseline != -1 && baseline_ != -1)
     68       y = baseline_ - baseline;
     69     else
     70       y = (height() - pref.height()) / 2;
     71     int view_width = std::min(remaining_width, pref.width());
     72     view->SetBounds(x, y, view_width, pref.height());
     73     x += view_width + kViewPadding;
     74     remaining_width = std::max(0, width() - x);
     75   }
     76 }
     77 
     78 void BookmarkBarInstructionsView::OnThemeChanged() {
     79   UpdateColors();
     80 }
     81 
     82 void BookmarkBarInstructionsView::ViewHierarchyChanged(bool is_add,
     83                                                        View* parent,
     84                                                        View* child) {
     85   if (!updated_colors_ && is_add && GetWidget())
     86     UpdateColors();
     87 }
     88 
     89 void BookmarkBarInstructionsView::GetAccessibleState(
     90     ui::AccessibleViewState* state) {
     91   state->role = ui::AccessibilityTypes::ROLE_GROUPING;
     92 }
     93 
     94 void BookmarkBarInstructionsView::LinkActivated(views::Link* source,
     95                                                 int event_flags) {
     96   delegate_->ShowImportDialog();
     97 }
     98 
     99 void BookmarkBarInstructionsView::UpdateColors() {
    100   // We don't always have a theme provider (ui tests, for example).
    101   const ui::ThemeProvider* theme_provider = GetThemeProvider();
    102   if (!theme_provider)
    103     return;
    104   updated_colors_ = true;
    105   SkColor text_color =
    106       theme_provider->GetColor(ThemeService::COLOR_BOOKMARK_TEXT);
    107   instructions_->SetColor(text_color);
    108   if (import_link_)
    109     import_link_->SetColor(text_color);
    110 }
    111