Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(667)

Side by Side Diff: chrome/browser/ui/views/global_error_bubble_view.cc

Issue 933893003: Use standard icon/title in global error bubble (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/global_error_bubble_view.h" 5 #include "chrome/browser/ui/views/global_error_bubble_view.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
10 #include "chrome/browser/ui/global_error/global_error.h" 10 #include "chrome/browser/ui/global_error/global_error.h"
11 #include "chrome/browser/ui/global_error/global_error_service.h" 11 #include "chrome/browser/ui/global_error/global_error_service.h"
12 #include "chrome/browser/ui/global_error/global_error_service_factory.h" 12 #include "chrome/browser/ui/global_error/global_error_service_factory.h"
13 #include "chrome/browser/ui/views/elevation_icon_setter.h" 13 #include "chrome/browser/ui/views/elevation_icon_setter.h"
14 #include "chrome/browser/ui/views/frame/browser_view.h" 14 #include "chrome/browser/ui/views/frame/browser_view.h"
15 #include "chrome/browser/ui/views/toolbar/toolbar_view.h" 15 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
16 #include "chrome/browser/ui/views/toolbar/wrench_toolbar_button.h" 16 #include "chrome/browser/ui/views/toolbar/wrench_toolbar_button.h"
17 #include "ui/base/resource/resource_bundle.h" 17 #include "ui/base/resource/resource_bundle.h"
18 #include "ui/gfx/image/image.h" 18 #include "ui/gfx/image/image.h"
19 #include "ui/views/bubble/bubble_frame_view.h"
19 #include "ui/views/controls/button/label_button.h" 20 #include "ui/views/controls/button/label_button.h"
20 #include "ui/views/controls/image_view.h" 21 #include "ui/views/controls/image_view.h"
21 #include "ui/views/controls/label.h" 22 #include "ui/views/controls/label.h"
22 #include "ui/views/layout/grid_layout.h" 23 #include "ui/views/layout/grid_layout.h"
23 #include "ui/views/layout/layout_constants.h" 24 #include "ui/views/layout/layout_constants.h"
24 25
25 namespace { 26 namespace {
26 27
27 enum { 28 enum {
28 TAG_ACCEPT_BUTTON = 1, 29 TAG_ACCEPT_BUTTON = 1,
29 TAG_CANCEL_BUTTON, 30 TAG_CANCEL_BUTTON,
30 }; 31 };
31 32
32 const int kMaxBubbleViewWidth = 262; 33 const int kMaxBubbleViewWidth = 262;
33 34
34 // The horizontal padding between the title and the icon.
35 const int kTitleHorizontalPadding = 5;
36
37 // The vertical inset of the wrench bubble anchor from the wrench menu button. 35 // The vertical inset of the wrench bubble anchor from the wrench menu button.
38 const int kAnchorVerticalInset = 5; 36 const int kAnchorVerticalInset = 5;
39 37
40 const int kBubblePadding = 6; 38 const int kBubblePadding = 6;
41 39
42 } // namespace 40 } // namespace
43 41
44 // GlobalErrorBubbleViewBase --------------------------------------------------- 42 // GlobalErrorBubbleViewBase ---------------------------------------------------
45 43
46 // static 44 // static
(...skipping 19 matching lines...) Expand all
66 views::BubbleBorder::Arrow arrow, 64 views::BubbleBorder::Arrow arrow,
67 Browser* browser, 65 Browser* browser,
68 const base::WeakPtr<GlobalErrorWithStandardBubble>& error) 66 const base::WeakPtr<GlobalErrorWithStandardBubble>& error)
69 : BubbleDelegateView(anchor_view, arrow), 67 : BubbleDelegateView(anchor_view, arrow),
70 browser_(browser), 68 browser_(browser),
71 error_(error) { 69 error_(error) {
72 // Compensate for built-in vertical padding in the anchor view's image. 70 // Compensate for built-in vertical padding in the anchor view's image.
73 set_anchor_view_insets( 71 set_anchor_view_insets(
74 gfx::Insets(kAnchorVerticalInset, 0, kAnchorVerticalInset, 0)); 72 gfx::Insets(kAnchorVerticalInset, 0, kAnchorVerticalInset, 0));
75 73
76 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
77 gfx::Image image = error_->GetBubbleViewIcon();
78 CHECK(!image.IsEmpty());
79 scoped_ptr<views::ImageView> image_view(new views::ImageView());
80 image_view->SetImage(image.ToImageSkia());
81
82 base::string16 title_string(error_->GetBubbleViewTitle());
83 scoped_ptr<views::Label> title_label(new views::Label(title_string));
84 title_label->SetMultiLine(true);
85 title_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
86 title_label->SetFontList(rb.GetFontList(ui::ResourceBundle::MediumFont));
87
88 std::vector<base::string16> message_strings(error_->GetBubbleViewMessages()); 74 std::vector<base::string16> message_strings(error_->GetBubbleViewMessages());
89 std::vector<views::Label*> message_labels; 75 std::vector<views::Label*> message_labels;
90 for (size_t i = 0; i < message_strings.size(); ++i) { 76 for (size_t i = 0; i < message_strings.size(); ++i) {
91 views::Label* message_label = new views::Label(message_strings[i]); 77 views::Label* message_label = new views::Label(message_strings[i]);
92 message_label->SetMultiLine(true); 78 message_label->SetMultiLine(true);
93 message_label->SizeToFit(kMaxBubbleViewWidth); 79 message_label->SizeToFit(kMaxBubbleViewWidth);
94 message_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 80 message_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
95 message_labels.push_back(message_label); 81 message_labels.push_back(message_label);
96 } 82 }
97 83
98 base::string16 accept_string(error_->GetBubbleViewAcceptButtonLabel()); 84 base::string16 accept_string(error_->GetBubbleViewAcceptButtonLabel());
99 scoped_ptr<views::LabelButton> accept_button( 85 scoped_ptr<views::LabelButton> accept_button(
100 new views::LabelButton(this, accept_string)); 86 new views::LabelButton(this, accept_string));
101 accept_button->SetStyle(views::Button::STYLE_BUTTON); 87 accept_button->SetStyle(views::Button::STYLE_BUTTON);
102 accept_button->SetIsDefault(true); 88 accept_button->SetIsDefault(true);
103 accept_button->set_tag(TAG_ACCEPT_BUTTON); 89 accept_button->set_tag(TAG_ACCEPT_BUTTON);
104 if (error_->ShouldAddElevationIconToAcceptButton()) 90 if (error_->ShouldAddElevationIconToAcceptButton())
105 elevation_icon_setter_.reset(new ElevationIconSetter(accept_button.get())); 91 elevation_icon_setter_.reset(new ElevationIconSetter(accept_button.get()));
106 92
107 base::string16 cancel_string(error_->GetBubbleViewCancelButtonLabel()); 93 base::string16 cancel_string(error_->GetBubbleViewCancelButtonLabel());
108 scoped_ptr<views::LabelButton> cancel_button; 94 scoped_ptr<views::LabelButton> cancel_button;
109 if (!cancel_string.empty()) { 95 if (!cancel_string.empty()) {
110 cancel_button.reset(new views::LabelButton(this, cancel_string)); 96 cancel_button.reset(new views::LabelButton(this, cancel_string));
111 cancel_button->SetStyle(views::Button::STYLE_BUTTON); 97 cancel_button->SetStyle(views::Button::STYLE_BUTTON);
112 cancel_button->set_tag(TAG_CANCEL_BUTTON); 98 cancel_button->set_tag(TAG_CANCEL_BUTTON);
113 } 99 }
114 100
115 views::GridLayout* layout = new views::GridLayout(this); 101 views::GridLayout* layout = new views::GridLayout(this);
116 SetLayoutManager(layout); 102 SetLayoutManager(layout);
117 layout->SetInsets(kBubblePadding, kBubblePadding,
118 kBubblePadding, kBubblePadding);
119 103
120 // Top row, icon and title. 104 // BubbleFrameView adds enough padding below title, no top padding needed.
105 layout->SetInsets(0, kBubblePadding, kBubblePadding, kBubblePadding);
106
107 // First row, message labels.
121 views::ColumnSet* cs = layout->AddColumnSet(0); 108 views::ColumnSet* cs = layout->AddColumnSet(0);
122 cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER,
123 0, views::GridLayout::USE_PREF, 0, 0);
124 cs->AddPaddingColumn(0, kTitleHorizontalPadding);
125 cs->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 109 cs->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL,
126 1, views::GridLayout::USE_PREF, 0, 0); 110 1, views::GridLayout::USE_PREF, 0, 0);
127 111
128 // Middle rows, message labels. 112 // Second row, accept and cancel button.
129 cs = layout->AddColumnSet(1); 113 cs = layout->AddColumnSet(1);
130 cs->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL,
131 1, views::GridLayout::USE_PREF, 0, 0);
132
133 // Bottom row, accept and cancel button.
134 cs = layout->AddColumnSet(2);
135 cs->AddPaddingColumn(1, views::kRelatedControlHorizontalSpacing); 114 cs->AddPaddingColumn(1, views::kRelatedControlHorizontalSpacing);
136 cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::LEADING, 115 cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::LEADING,
137 0, views::GridLayout::USE_PREF, 0, 0); 116 0, views::GridLayout::USE_PREF, 0, 0);
138 if (cancel_button.get()) { 117 if (cancel_button.get()) {
139 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing); 118 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
140 cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::LEADING, 119 cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::LEADING,
141 0, views::GridLayout::USE_PREF, 0, 0); 120 0, views::GridLayout::USE_PREF, 0, 0);
142 } 121 }
143 122
144 layout->StartRow(1, 0);
145 layout->AddView(image_view.release());
146 layout->AddView(title_label.release());
147 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
148
149 for (size_t i = 0; i < message_labels.size(); ++i) { 123 for (size_t i = 0; i < message_labels.size(); ++i) {
150 layout->StartRow(1, 1); 124 layout->StartRow(1, 0);
151 layout->AddView(message_labels[i]); 125 layout->AddView(message_labels[i]);
152 if (i < message_labels.size() - 1) 126 if (i < message_labels.size() - 1)
153 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 127 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
154 } 128 }
155 layout->AddPaddingRow(0, views::kLabelToControlVerticalSpacing); 129 layout->AddPaddingRow(0, views::kLabelToControlVerticalSpacing);
156 130
157 layout->StartRow(0, 2); 131 layout->StartRow(0, 1);
158 layout->AddView(accept_button.release()); 132 layout->AddView(accept_button.release());
159 if (cancel_button.get()) 133 if (cancel_button.get())
160 layout->AddView(cancel_button.release()); 134 layout->AddView(cancel_button.release());
161 135
162 // Adjust the message label size in case buttons are too long. 136 // Adjust the message label size in case buttons are too long.
163 for (size_t i = 0; i < message_labels.size(); ++i) 137 for (size_t i = 0; i < message_labels.size(); ++i)
164 message_labels[i]->SizeToFit(layout->GetPreferredSize(this).width()); 138 message_labels[i]->SizeToFit(layout->GetPreferredSize(this).width());
165 139
166 // These bubbles show at times where activation is sporadic (like at startup, 140 // These bubbles show at times where activation is sporadic (like at startup,
167 // or a new window opening). Make sure the bubble doesn't disappear before the 141 // or a new window opening). Make sure the bubble doesn't disappear before the
(...skipping 18 matching lines...) Expand all
186 NOTREACHED(); 160 NOTREACHED();
187 } 161 }
188 GetWidget()->Close(); 162 GetWidget()->Close();
189 } 163 }
190 164
191 void GlobalErrorBubbleView::WindowClosing() { 165 void GlobalErrorBubbleView::WindowClosing() {
192 if (error_) 166 if (error_)
193 error_->BubbleViewDidClose(browser_); 167 error_->BubbleViewDidClose(browser_);
194 } 168 }
195 169
170 bool GlobalErrorBubbleView::ShouldShowWindowTitle() const {
171 return true;
msw 2015/02/19 23:56:14 You shouldn't need to override this, WidgetDelegat
xiaoling 2015/02/20 19:43:21 Done.
172 }
173
174 base::string16 GlobalErrorBubbleView::GetWindowTitle() const {
175 return error_->GetBubbleViewTitle();
176 }
177
178 bool GlobalErrorBubbleView::ShouldShowWindowIcon() const {
179 return true;
180 }
181
182 gfx::ImageSkia GlobalErrorBubbleView::GetWindowIcon() {
183 gfx::Image image = error_->GetBubbleViewIcon();
184 CHECK(!image.IsEmpty());
msw 2015/02/19 23:56:13 Do all global error bubbles really have valid icon
xiaoling 2015/02/20 19:43:21 Done.
185 return *image.ToImageSkia();
186 }
187
196 bool GlobalErrorBubbleView::ShouldShowCloseButton() const { 188 bool GlobalErrorBubbleView::ShouldShowCloseButton() const {
197 return error_ && error_->ShouldShowCloseButton(); 189 return error_ && error_->ShouldShowCloseButton();
198 } 190 }
199 191
200 void GlobalErrorBubbleView::CloseBubbleView() { 192 void GlobalErrorBubbleView::CloseBubbleView() {
201 GetWidget()->Close(); 193 GetWidget()->Close();
202 } 194 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698