OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/views/default_search_view.h" | 5 #include "chrome/browser/ui/views/default_search_view.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
10 #include "chrome/browser/profiles/profile.h" | 10 #include "chrome/browser/profiles/profile.h" |
11 #include "chrome/browser/search_engines/template_url.h" | 11 #include "chrome/browser/search_engines/template_url.h" |
12 #include "chrome/browser/search_engines/template_url_service.h" | 12 #include "chrome/browser/search_engines/template_url_service.h" |
| 13 #include "chrome/browser/search_engines/template_url_service_factory.h" |
13 #include "chrome/browser/search_engines/template_url_prepopulate_data.h" | 14 #include "chrome/browser/search_engines/template_url_prepopulate_data.h" |
| 15 #include "chrome/browser/themes/theme_service.h" |
14 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 16 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
15 #include "chrome/browser/ui/views/constrained_window_views.h" | 17 #include "chrome/browser/ui/views/constrained_window_views.h" |
16 #include "content/browser/tab_contents/tab_contents.h" | 18 #include "content/browser/tab_contents/tab_contents.h" |
17 #include "grit/generated_resources.h" | 19 #include "grit/generated_resources.h" |
18 #include "grit/locale_settings.h" | 20 #include "grit/locale_settings.h" |
19 #include "grit/theme_resources.h" | 21 #include "grit/theme_resources.h" |
20 #include "ui/base/message_box_flags.h" | 22 #include "ui/base/message_box_flags.h" |
21 #include "ui/base/l10n/l10n_util.h" | 23 #include "ui/base/l10n/l10n_util.h" |
22 #include "ui/base/resource/resource_bundle.h" | 24 #include "ui/base/resource/resource_bundle.h" |
23 #include "ui/gfx/canvas.h" | 25 #include "ui/gfx/canvas.h" |
(...skipping 29 matching lines...) Expand all Loading... |
53 *logo_id = built_in_data->logo_id(); | 55 *logo_id = built_in_data->logo_id(); |
54 } else { | 56 } else { |
55 *short_name = UTF8ToWide(url.host()).c_str(); | 57 *short_name = UTF8ToWide(url.host()).c_str(); |
56 *logo_id = kNoSearchEngineLogo; | 58 *logo_id = kNoSearchEngineLogo; |
57 } | 59 } |
58 } | 60 } |
59 | 61 |
60 views::Label* CreateProviderLabel(int message_id) { | 62 views::Label* CreateProviderLabel(int message_id) { |
61 views::Label* choice_label = | 63 views::Label* choice_label = |
62 new views::Label(l10n_util::GetStringUTF16(message_id)); | 64 new views::Label(l10n_util::GetStringUTF16(message_id)); |
63 choice_label->SetColor(SK_ColorBLACK); | 65 choice_label->SetBackgroundColor(SK_ColorWHITE); |
| 66 choice_label->SetEnabledColor(SK_ColorBLACK); |
64 choice_label->SetFont( | 67 choice_label->SetFont( |
65 choice_label->font().DeriveFont(1, gfx::Font::NORMAL)); | 68 choice_label->font().DeriveFont(1, gfx::Font::NORMAL)); |
66 return choice_label; | 69 return choice_label; |
67 } | 70 } |
68 | 71 |
69 views::View* CreateProviderLogo( | 72 views::View* CreateProviderLogo( |
70 int logo_id, | 73 int logo_id, |
71 const std::wstring& short_name) { | 74 const std::wstring& short_name) { |
72 views::View* logo_view = NULL; | 75 views::View* logo_view = NULL; |
73 | 76 |
74 // The width for the "logo" element when text is displayed. | 77 // The width for the "logo" element when text is displayed. |
75 const int kTextLogoWidth = 132; | 78 const int kTextLogoWidth = 132; |
76 | 79 |
77 bool use_images = false; | 80 bool use_images = false; |
78 #if defined(GOOGLE_CHROME_BUILD) | 81 #if defined(GOOGLE_CHROME_BUILD) |
79 use_images = true; | 82 use_images = true; |
80 #endif | 83 #endif |
81 | 84 |
82 if (use_images && logo_id != kNoSearchEngineLogo) { | 85 if (use_images && logo_id != kNoSearchEngineLogo) { |
83 views::ImageView* logo_image = new views::ImageView(); | 86 views::ImageView* logo_image = new views::ImageView(); |
84 SkBitmap* logo_bmp = | 87 SkBitmap* logo_bmp = |
85 ResourceBundle::GetSharedInstance().GetBitmapNamed(logo_id); | 88 ResourceBundle::GetSharedInstance().GetBitmapNamed(logo_id); |
86 logo_image->SetImage(logo_bmp); | 89 logo_image->SetImage(logo_bmp); |
87 logo_image->SetTooltipText(WideToUTF16Hack(short_name)); | 90 logo_image->SetTooltipText(WideToUTF16Hack(short_name)); |
88 logo_view = logo_image; | 91 logo_view = logo_image; |
89 } else { | 92 } else { |
90 // No logo -- show a text label. | 93 // No logo -- show a text label. |
91 views::Label* logo_label = new views::Label(short_name); | 94 views::Label* logo_label = new views::Label(short_name); |
92 logo_label->SetColor(SK_ColorDKGRAY); | 95 logo_label->SetBackgroundColor(SK_ColorWHITE); |
| 96 logo_label->SetEnabledColor(SK_ColorDKGRAY); |
93 logo_label->SetFont(logo_label->font().DeriveFont(3, gfx::Font::BOLD)); | 97 logo_label->SetFont(logo_label->font().DeriveFont(3, gfx::Font::BOLD)); |
94 logo_label->SetHorizontalAlignment(views::Label::ALIGN_CENTER); | 98 logo_label->SetHorizontalAlignment(views::Label::ALIGN_CENTER); |
95 // Tooltip text provides accessibility for low-vision users. | 99 // Tooltip text provides accessibility for low-vision users. |
96 logo_label->SetTooltipText(WideToUTF16Hack(short_name)); | 100 logo_label->SetTooltipText(WideToUTF16Hack(short_name)); |
97 logo_view = logo_label; | 101 logo_view = logo_label; |
98 } | 102 } |
99 | 103 |
100 return logo_view; | 104 return logo_view; |
101 } | 105 } |
102 views::View* CreateProviderChoiceButton( | 106 views::View* CreateProviderChoiceButton( |
103 views::ButtonListener* listener, | 107 views::ButtonListener* listener, |
104 int message_id, | 108 int message_id, |
105 const std::wstring& short_name) { | 109 const std::wstring& short_name) { |
106 return new views::NativeTextButton(listener, UTF16ToWide( | 110 return new views::NativeTextButton(listener, UTF16ToWide( |
107 l10n_util::GetStringFUTF16(message_id, WideToUTF16(short_name)))); | 111 l10n_util::GetStringFUTF16(message_id, WideToUTF16(short_name)))); |
108 } | 112 } |
109 | 113 |
110 } // namespace | 114 } // namespace |
111 | 115 |
112 // static | 116 // static |
113 void DefaultSearchView::Show(TabContents* tab_contents, | 117 void DefaultSearchView::Show(TabContents* tab_contents, |
114 TemplateURL* default_url, | 118 TemplateURL* proposed_default_turl, |
115 TemplateURLService* template_url_service) { | 119 Profile* profile) { |
116 scoped_ptr<TemplateURL> template_url(default_url); | 120 TemplateURLService* template_url_service = |
117 if (!template_url_service->CanMakeDefault(default_url) || | 121 TemplateURLServiceFactory::GetForProfile(profile); |
118 default_url->url()->GetHost().empty()) | 122 if (template_url_service->CanMakeDefault(proposed_default_turl) && |
119 return; | 123 !proposed_default_turl->url()->GetHost().empty()) { |
120 | 124 // When the window closes, it will delete itself. |
121 // When the window closes, it will delete itself. | 125 new DefaultSearchView(tab_contents, proposed_default_turl, |
122 new DefaultSearchView(tab_contents, template_url.release(), | 126 template_url_service, profile->GetPrefs()); |
123 template_url_service); | 127 } else { |
| 128 delete proposed_default_turl; |
| 129 } |
124 } | 130 } |
125 | 131 |
126 DefaultSearchView::~DefaultSearchView() { | 132 DefaultSearchView::~DefaultSearchView() { |
127 } | 133 } |
128 | 134 |
129 void DefaultSearchView::OnPaint(gfx::Canvas* canvas) { | 135 void DefaultSearchView::OnPaint(gfx::Canvas* canvas) { |
130 // Fill in behind the background image with the standard gray toolbar color. | 136 // Fill in behind the background image with the standard gray toolbar color. |
131 canvas->FillRectInt(SkColorSetRGB(237, 238, 237), 0, 0, width(), | 137 canvas->FillRectInt(GetThemeProvider()->GetColor(ThemeService::COLOR_TOOLBAR), |
132 background_image_->height()); | 138 0, 0, width(), background_image_->height()); |
133 // The rest of the dialog background should be white. | 139 // The rest of the dialog background should be white. |
134 DCHECK(height() > background_image_->height()); | 140 DCHECK(height() > background_image_->height()); |
135 canvas->FillRectInt(SK_ColorWHITE, 0, background_image_->height(), width(), | 141 canvas->FillRectInt(SK_ColorWHITE, 0, background_image_->height(), width(), |
136 height() - background_image_->height()); | 142 height() - background_image_->height()); |
137 } | 143 } |
138 | 144 |
139 void DefaultSearchView::ButtonPressed(views::Button* sender, | 145 void DefaultSearchView::ButtonPressed(views::Button* sender, |
140 const views::Event& event) { | 146 const views::Event& event) { |
141 views::DialogClientView* client = GetDialogClientView(); | 147 views::DialogClientView* client = GetDialogClientView(); |
142 if (sender == proposed_provider_button_) | 148 if (sender == proposed_provider_button_) |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 views::Widget* DefaultSearchView::GetWidget() { | 182 views::Widget* DefaultSearchView::GetWidget() { |
177 return View::GetWidget(); | 183 return View::GetWidget(); |
178 } | 184 } |
179 | 185 |
180 const views::Widget* DefaultSearchView::GetWidget() const { | 186 const views::Widget* DefaultSearchView::GetWidget() const { |
181 return View::GetWidget(); | 187 return View::GetWidget(); |
182 } | 188 } |
183 | 189 |
184 DefaultSearchView::DefaultSearchView(TabContents* tab_contents, | 190 DefaultSearchView::DefaultSearchView(TabContents* tab_contents, |
185 TemplateURL* proposed_default_turl, | 191 TemplateURL* proposed_default_turl, |
186 TemplateURLService* template_url_service) | 192 TemplateURLService* template_url_service, |
| 193 PrefService* prefs) |
187 : background_image_(NULL), | 194 : background_image_(NULL), |
188 default_provider_button_(NULL), | 195 default_provider_button_(NULL), |
189 proposed_provider_button_(NULL), | 196 proposed_provider_button_(NULL), |
190 proposed_turl_(proposed_default_turl), | 197 proposed_turl_(proposed_default_turl), |
191 template_url_service_(template_url_service) { | 198 template_url_service_(template_url_service) { |
192 Profile* profile = | |
193 Profile::FromBrowserContext(tab_contents->browser_context()); | |
194 PrefService* prefs = profile->GetPrefs(); | |
195 SetupControls(prefs); | 199 SetupControls(prefs); |
196 | 200 |
197 // Show the dialog. | 201 // Show the dialog. |
198 TabContentsWrapper* wrapper = | 202 new ConstrainedWindowViews( |
199 TabContentsWrapper::GetCurrentWrapperForContents(tab_contents); | 203 TabContentsWrapper::GetCurrentWrapperForContents(tab_contents), this); |
200 new ConstrainedWindowViews(wrapper, this); | |
201 } | 204 } |
202 | 205 |
203 void DefaultSearchView::SetupControls(PrefService* prefs) { | 206 void DefaultSearchView::SetupControls(PrefService* prefs) { |
204 using views::ColumnSet; | |
205 using views::GridLayout; | |
206 using views::ImageView; | |
207 using views::Label; | |
208 | |
209 // Column set id's. | 207 // Column set id's. |
210 const int kWholeDialogViewSetId = 0; | 208 const int kWholeDialogViewSetId = 0; |
211 const int kPaddedWholeDialogViewSetId = 1; | 209 const int kPaddedWholeDialogViewSetId = 1; |
212 const int kChoicesViewSetId = 2; | 210 const int kChoicesViewSetId = 2; |
213 | 211 |
214 // Set up the information for the proposed default. | 212 // Set up the information for the proposed default. |
215 std::wstring proposed_short_name; | 213 std::wstring proposed_short_name; |
216 int proposed_logo_id = kNoSearchEngineLogo; | 214 int proposed_logo_id = kNoSearchEngineLogo; |
217 GetShortNameAndLogoId(prefs, | 215 GetShortNameAndLogoId(prefs, |
218 proposed_turl_.get(), | 216 proposed_turl_.get(), |
219 &proposed_short_name, | 217 &proposed_short_name, |
220 &proposed_logo_id); | 218 &proposed_logo_id); |
221 if (proposed_logo_id != kNoSearchEngineLogo) | 219 if (proposed_logo_id != kNoSearchEngineLogo) |
222 proposed_turl_->set_logo_id(proposed_logo_id); | 220 proposed_turl_->set_logo_id(proposed_logo_id); |
223 | 221 |
224 | 222 |
225 // Set up the information for the current default. | 223 // Set up the information for the current default. |
226 std::wstring default_short_name; | 224 std::wstring default_short_name; |
227 int default_logo_id = kNoSearchEngineLogo; | 225 int default_logo_id = kNoSearchEngineLogo; |
228 GetShortNameAndLogoId(prefs, | 226 GetShortNameAndLogoId(prefs, |
229 template_url_service_->GetDefaultSearchProvider(), | 227 template_url_service_->GetDefaultSearchProvider(), |
230 &default_short_name, | 228 &default_short_name, |
231 &default_logo_id); | 229 &default_logo_id); |
232 | 230 |
233 // Now set-up the dialog contents. | 231 // Now set-up the dialog contents. |
234 GridLayout* layout = new views::GridLayout(this); | 232 views::GridLayout* layout = new views::GridLayout(this); |
235 layout->SetInsets(0, 0, views::kPanelVertMargin, 0); | 233 layout->SetInsets(0, 0, views::kPanelVertMargin, 0); |
236 SetLayoutManager(layout); | 234 SetLayoutManager(layout); |
237 | 235 |
238 // Add a column set that spans the whole dialog. | 236 // Add a column set that spans the whole dialog. |
239 ColumnSet* whole_dialog_column_set = | 237 views::ColumnSet* whole_dialog_column_set = |
240 layout->AddColumnSet(kWholeDialogViewSetId); | 238 layout->AddColumnSet(kWholeDialogViewSetId); |
241 whole_dialog_column_set->AddColumn(GridLayout::LEADING, GridLayout::LEADING, | 239 whole_dialog_column_set->AddColumn(views::GridLayout::LEADING, |
242 1, GridLayout::FIXED, | 240 views::GridLayout::LEADING, 1, views::GridLayout::FIXED, |
243 views::Widget::GetLocalizedContentsWidth( | 241 views::Widget::GetLocalizedContentsWidth(IDS_DEFAULT_SEARCH_WIDTH_CHARS), |
244 IDS_DEFAULT_SEARCH_WIDTH_CHARS), | 242 0); |
245 0); | |
246 | 243 |
247 // Add a column set that spans the whole dialog but obeying padding. | 244 // Add a column set that spans the whole dialog but obeying padding. |
248 ColumnSet* padded_whole_dialog_column_set = | 245 views::ColumnSet* padded_whole_dialog_column_set = |
249 layout->AddColumnSet(kPaddedWholeDialogViewSetId); | 246 layout->AddColumnSet(kPaddedWholeDialogViewSetId); |
250 padded_whole_dialog_column_set->AddPaddingColumn(1, views::kPanelVertMargin); | 247 padded_whole_dialog_column_set->AddPaddingColumn(1, views::kPanelVertMargin); |
251 padded_whole_dialog_column_set->AddColumn( | 248 padded_whole_dialog_column_set->AddColumn(views::GridLayout::LEADING, |
252 GridLayout::LEADING, GridLayout::LEADING, | 249 views::GridLayout::LEADING, 1, views::GridLayout::USE_PREF, 0, 0); |
253 1, GridLayout::USE_PREF, 0, 0); | |
254 padded_whole_dialog_column_set->AddPaddingColumn(1, views::kPanelVertMargin); | 250 padded_whole_dialog_column_set->AddPaddingColumn(1, views::kPanelVertMargin); |
255 | 251 |
256 // Add a column set for the search engine choices. | 252 // Add a column set for the search engine choices. |
257 ColumnSet* choices_column_set = layout->AddColumnSet(kChoicesViewSetId); | 253 views::ColumnSet* choices_column_set = |
| 254 layout->AddColumnSet(kChoicesViewSetId); |
258 choices_column_set->AddPaddingColumn(1, views::kPanelVertMargin); | 255 choices_column_set->AddPaddingColumn(1, views::kPanelVertMargin); |
259 choices_column_set->AddColumn(GridLayout::CENTER, GridLayout::CENTER, | 256 choices_column_set->AddColumn(views::GridLayout::CENTER, |
260 1, GridLayout::USE_PREF, 0, 0); | 257 views::GridLayout::CENTER, 1, views::GridLayout::USE_PREF, 0, 0); |
261 choices_column_set->AddPaddingColumn( | 258 choices_column_set->AddPaddingColumn( |
262 1, views::kRelatedControlHorizontalSpacing); | 259 1, views::kRelatedControlHorizontalSpacing); |
263 choices_column_set->AddColumn(GridLayout::CENTER, GridLayout::CENTER, | 260 choices_column_set->AddColumn(views::GridLayout::CENTER, |
264 1, GridLayout::USE_PREF, 0, 0); | 261 views::GridLayout::CENTER, 1, views::GridLayout::USE_PREF, 0, 0); |
265 choices_column_set->LinkColumnSizes(0, 2, -1); | 262 choices_column_set->LinkColumnSizes(0, 2, -1); |
266 choices_column_set->AddPaddingColumn(1, views::kPanelVertMargin); | 263 choices_column_set->AddPaddingColumn(1, views::kPanelVertMargin); |
267 | 264 |
268 // Add the "search box" image. | 265 // Add the "search box" image. |
269 layout->StartRow(0, kWholeDialogViewSetId); | 266 layout->StartRow(0, kWholeDialogViewSetId); |
270 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 267 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
271 background_image_ = new ImageView(); | 268 background_image_ = new views::ImageView(); |
272 background_image_->SetImage(rb.GetBitmapNamed(IDR_SEARCH_ENGINE_DIALOG_TOP)); | 269 background_image_->SetImage(rb.GetBitmapNamed(IDR_SEARCH_ENGINE_DIALOG_TOP)); |
273 background_image_->EnableCanvasFlippingForRTLUI(true); | 270 background_image_->EnableCanvasFlippingForRTLUI(true); |
274 ImageView::Alignment horizontal_alignment = | 271 views::ImageView::Alignment horizontal_alignment = base::i18n::IsRTL() ? |
275 base::i18n::IsRTL() ? ImageView::LEADING : ImageView::TRAILING; | 272 views::ImageView::LEADING : views::ImageView::TRAILING; |
276 background_image_->SetHorizontalAlignment(horizontal_alignment); | 273 background_image_->SetHorizontalAlignment(horizontal_alignment); |
277 layout->AddView(background_image_); | 274 layout->AddView(background_image_); |
278 | 275 |
279 // Add text informing the user about the requested default change. | 276 // Add text informing the user about the requested default change. |
280 layout->StartRowWithPadding(0, kPaddedWholeDialogViewSetId, | 277 layout->StartRowWithPadding(0, kPaddedWholeDialogViewSetId, |
281 1, views::kLabelToControlVerticalSpacing); | 278 1, views::kLabelToControlVerticalSpacing); |
282 Label* summary_label = new Label(l10n_util::GetStringFUTF16( | 279 views::Label* summary_label = new views::Label(l10n_util::GetStringFUTF16( |
283 IDS_DEFAULT_SEARCH_SUMMARY, | 280 IDS_DEFAULT_SEARCH_SUMMARY, WideToUTF16(proposed_short_name))); |
284 WideToUTF16(proposed_short_name))); | 281 summary_label->SetBackgroundColor(SK_ColorWHITE); |
285 summary_label->SetColor(SK_ColorBLACK); | 282 summary_label->SetEnabledColor(SK_ColorBLACK); |
286 summary_label->SetFont( | 283 summary_label->SetFont( |
287 summary_label->font().DeriveFont(1, gfx::Font::NORMAL)); | 284 summary_label->font().DeriveFont(1, gfx::Font::NORMAL)); |
288 summary_label->SetHorizontalAlignment(Label::ALIGN_LEFT); | 285 summary_label->SetHorizontalAlignment(views::Label::ALIGN_LEFT); |
289 layout->AddView(summary_label); | 286 layout->AddView(summary_label); |
290 | 287 |
291 // Add the labels for the tops of the choices. | 288 // Add the labels for the tops of the choices. |
292 layout->StartRowWithPadding(0, kChoicesViewSetId, | 289 layout->StartRowWithPadding(0, kChoicesViewSetId, |
293 0, views::kRelatedControlVerticalSpacing); | 290 0, views::kRelatedControlVerticalSpacing); |
294 layout->AddView(CreateProviderLabel(IDS_DEFAULT_SEARCH_LABEL_CURRENT)); | 291 layout->AddView(CreateProviderLabel(IDS_DEFAULT_SEARCH_LABEL_CURRENT)); |
295 layout->AddView(CreateProviderLabel(IDS_DEFAULT_SEARCH_LABEL_PROPOSED)); | 292 layout->AddView(CreateProviderLabel(IDS_DEFAULT_SEARCH_LABEL_PROPOSED)); |
296 | 293 |
297 // Add the logos. | 294 // Add the logos. |
298 layout->StartRowWithPadding(0, kChoicesViewSetId, | 295 layout->StartRowWithPadding(0, kChoicesViewSetId, |
299 0, views::kRelatedControlVerticalSpacing); | 296 0, views::kRelatedControlVerticalSpacing); |
300 layout->AddView(CreateProviderLogo(default_logo_id, default_short_name)); | 297 layout->AddView(CreateProviderLogo(default_logo_id, default_short_name)); |
301 layout->AddView(CreateProviderLogo(proposed_logo_id, proposed_short_name)); | 298 layout->AddView(CreateProviderLogo(proposed_logo_id, proposed_short_name)); |
302 | 299 |
303 // Add the buttons. | 300 // Add the buttons. |
304 layout->StartRowWithPadding(0, kChoicesViewSetId, | 301 layout->StartRowWithPadding(0, kChoicesViewSetId, |
305 0, views::kRelatedControlVerticalSpacing); | 302 0, views::kRelatedControlVerticalSpacing); |
306 default_provider_button_ = CreateProviderChoiceButton( | 303 default_provider_button_ = CreateProviderChoiceButton( |
307 this, | 304 this, |
308 IDS_DEFAULT_SEARCH_PROMPT_CURRENT, | 305 IDS_DEFAULT_SEARCH_PROMPT_CURRENT, |
309 default_short_name); | 306 default_short_name); |
310 layout->AddView(default_provider_button_); | 307 layout->AddView(default_provider_button_); |
311 proposed_provider_button_ = CreateProviderChoiceButton( | 308 proposed_provider_button_ = CreateProviderChoiceButton( |
312 this, | 309 this, |
313 IDS_DEFAULT_SEARCH_PROMPT_PROPOSED, | 310 IDS_DEFAULT_SEARCH_PROMPT_PROPOSED, |
314 proposed_short_name); | 311 proposed_short_name); |
315 layout->AddView(proposed_provider_button_); | 312 layout->AddView(proposed_provider_button_); |
316 } | 313 } |
OLD | NEW |