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/location_bar/keyword_hint_view.h" 6 7 #include "base/logging.h" 8 #include "base/utf_string_conversions.h" 9 #include "chrome/app/chrome_command_ids.h" 10 #include "chrome/browser/profiles/profile.h" 11 #include "chrome/browser/search_engines/template_url_model.h" 12 #include "grit/generated_resources.h" 13 #include "grit/theme_resources.h" 14 #include "third_party/skia/include/core/SkBitmap.h" 15 #include "ui/base/l10n/l10n_util.h" 16 #include "ui/base/resource/resource_bundle.h" 17 #include "ui/gfx/canvas.h" 18 #include "views/controls/label.h" 19 20 // Amount of space to offset the tab image from the top of the view by. 21 static const int kTabImageYOffset = 4; 22 23 // The tab key image. 24 static const SkBitmap* kTabButtonBitmap = NULL; 25 26 KeywordHintView::KeywordHintView(Profile* profile) : profile_(profile) { 27 leading_label_ = new views::Label(); 28 trailing_label_ = new views::Label(); 29 AddChildView(leading_label_); 30 AddChildView(trailing_label_); 31 32 if (!kTabButtonBitmap) { 33 kTabButtonBitmap = ResourceBundle::GetSharedInstance(). 34 GetBitmapNamed(IDR_LOCATION_BAR_KEYWORD_HINT_TAB); 35 } 36 } 37 38 KeywordHintView::~KeywordHintView() { 39 } 40 41 void KeywordHintView::SetFont(const gfx::Font& font) { 42 leading_label_->SetFont(font); 43 trailing_label_->SetFont(font); 44 } 45 46 void KeywordHintView::SetColor(const SkColor& color) { 47 leading_label_->SetColor(color); 48 trailing_label_->SetColor(color); 49 } 50 51 void KeywordHintView::SetKeyword(const string16& keyword) { 52 keyword_ = keyword; 53 if (keyword_.empty()) 54 return; 55 DCHECK(profile_); 56 if (!profile_->GetTemplateURLModel()) 57 return; 58 59 std::vector<size_t> content_param_offsets; 60 bool is_extension_keyword; 61 string16 short_name = profile_->GetTemplateURLModel()-> 62 GetKeywordShortName(keyword, &is_extension_keyword); 63 int message_id = is_extension_keyword ? 64 IDS_OMNIBOX_EXTENSION_KEYWORD_HINT : IDS_OMNIBOX_KEYWORD_HINT; 65 const std::wstring keyword_hint = 66 UTF16ToWide(l10n_util::GetStringFUTF16( 67 message_id, 68 string16(), 69 short_name, 70 &content_param_offsets)); 71 if (content_param_offsets.size() == 2) { 72 leading_label_->SetText( 73 keyword_hint.substr(0, content_param_offsets.front())); 74 trailing_label_->SetText( 75 keyword_hint.substr(content_param_offsets.front())); 76 } else { 77 // See comments on an identical NOTREACHED() in search_provider.cc. 78 NOTREACHED(); 79 } 80 } 81 82 void KeywordHintView::OnPaint(gfx::Canvas* canvas) { 83 int image_x = leading_label_->IsVisible() ? leading_label_->width() : 0; 84 85 // Since we paint the button image directly on the canvas (instead of using a 86 // child view), we must mirror the button's position manually if the locale 87 // is right-to-left. 88 gfx::Rect tab_button_bounds(image_x, 89 kTabImageYOffset, 90 kTabButtonBitmap->width(), 91 kTabButtonBitmap->height()); 92 tab_button_bounds.set_x(GetMirroredXForRect(tab_button_bounds)); 93 canvas->DrawBitmapInt(*kTabButtonBitmap, 94 tab_button_bounds.x(), 95 tab_button_bounds.y()); 96 } 97 98 gfx::Size KeywordHintView::GetPreferredSize() { 99 // TODO(sky): currently height doesn't matter, once baseline support is 100 // added this should check baselines. 101 gfx::Size prefsize = leading_label_->GetPreferredSize(); 102 int width = prefsize.width(); 103 width += kTabButtonBitmap->width(); 104 prefsize = trailing_label_->GetPreferredSize(); 105 width += prefsize.width(); 106 return gfx::Size(width, prefsize.height()); 107 } 108 109 gfx::Size KeywordHintView::GetMinimumSize() { 110 // TODO(sky): currently height doesn't matter, once baseline support is 111 // added this should check baselines. 112 return gfx::Size(kTabButtonBitmap->width(), 0); 113 } 114 115 void KeywordHintView::Layout() { 116 // TODO(sky): baseline layout. 117 bool show_labels = (width() != kTabButtonBitmap->width()); 118 119 leading_label_->SetVisible(show_labels); 120 trailing_label_->SetVisible(show_labels); 121 int x = 0; 122 gfx::Size pref; 123 124 if (show_labels) { 125 pref = leading_label_->GetPreferredSize(); 126 leading_label_->SetBounds(x, 0, pref.width(), height()); 127 128 x += pref.width() + kTabButtonBitmap->width(); 129 pref = trailing_label_->GetPreferredSize(); 130 trailing_label_->SetBounds(x, 0, pref.width(), height()); 131 } 132 } 133