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