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

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,
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 views::BubbleBorder::Arrow arrow, 67 views::BubbleBorder::Arrow arrow,
67 Browser* browser, 68 Browser* browser,
68 const base::WeakPtr<GlobalErrorWithStandardBubble>& error) 69 const base::WeakPtr<GlobalErrorWithStandardBubble>& error)
69 : BubbleDelegateView(anchor_view, arrow), 70 : BubbleDelegateView(anchor_view, arrow),
70 browser_(browser), 71 browser_(browser),
71 error_(error) { 72 error_(error) {
72 // Compensate for built-in vertical padding in the anchor view's image. 73 // Compensate for built-in vertical padding in the anchor view's image.
73 set_anchor_view_insets( 74 set_anchor_view_insets(
74 gfx::Insets(kAnchorVerticalInset, 0, kAnchorVerticalInset, 0)); 75 gfx::Insets(kAnchorVerticalInset, 0, kAnchorVerticalInset, 0));
75 76
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()); 77 std::vector<base::string16> message_strings(error_->GetBubbleViewMessages());
89 std::vector<views::Label*> message_labels; 78 std::vector<views::Label*> message_labels;
90 for (size_t i = 0; i < message_strings.size(); ++i) { 79 for (size_t i = 0; i < message_strings.size(); ++i) {
91 views::Label* message_label = new views::Label(message_strings[i]); 80 views::Label* message_label = new views::Label(message_strings[i]);
92 message_label->SetMultiLine(true); 81 message_label->SetMultiLine(true);
93 message_label->SizeToFit(kMaxBubbleViewWidth); 82 message_label->SizeToFit(kMaxBubbleViewWidth);
94 message_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 83 message_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
95 message_labels.push_back(message_label); 84 message_labels.push_back(message_label);
96 } 85 }
97 86
98 base::string16 accept_string(error_->GetBubbleViewAcceptButtonLabel()); 87 base::string16 accept_string(error_->GetBubbleViewAcceptButtonLabel());
99 scoped_ptr<views::LabelButton> accept_button( 88 scoped_ptr<views::LabelButton> accept_button(
100 new views::LabelButton(this, accept_string)); 89 new views::LabelButton(this, accept_string));
101 accept_button->SetStyle(views::Button::STYLE_BUTTON); 90 accept_button->SetStyle(views::Button::STYLE_BUTTON);
102 accept_button->SetIsDefault(true); 91 accept_button->SetIsDefault(true);
103 accept_button->set_tag(TAG_ACCEPT_BUTTON); 92 accept_button->set_tag(TAG_ACCEPT_BUTTON);
104 if (error_->ShouldAddElevationIconToAcceptButton()) 93 if (error_->ShouldAddElevationIconToAcceptButton())
105 elevation_icon_setter_.reset(new ElevationIconSetter(accept_button.get())); 94 elevation_icon_setter_.reset(new ElevationIconSetter(accept_button.get()));
106 95
107 base::string16 cancel_string(error_->GetBubbleViewCancelButtonLabel()); 96 base::string16 cancel_string(error_->GetBubbleViewCancelButtonLabel());
108 scoped_ptr<views::LabelButton> cancel_button; 97 scoped_ptr<views::LabelButton> cancel_button;
109 if (!cancel_string.empty()) { 98 if (!cancel_string.empty()) {
110 cancel_button.reset(new views::LabelButton(this, cancel_string)); 99 cancel_button.reset(new views::LabelButton(this, cancel_string));
111 cancel_button->SetStyle(views::Button::STYLE_BUTTON); 100 cancel_button->SetStyle(views::Button::STYLE_BUTTON);
112 cancel_button->set_tag(TAG_CANCEL_BUTTON); 101 cancel_button->set_tag(TAG_CANCEL_BUTTON);
113 } 102 }
114 103
115 views::GridLayout* layout = new views::GridLayout(this); 104 views::GridLayout* layout = new views::GridLayout(this);
116 SetLayoutManager(layout); 105 SetLayoutManager(layout);
117 layout->SetInsets(kBubblePadding, kBubblePadding, 106 layout->SetInsets(0, kBubblePadding, kBubblePadding, kBubblePadding);
118 kBubblePadding, kBubblePadding);
119 107
120 // Top row, icon and title. 108
109 // Top row, Message labels.
121 views::ColumnSet* cs = layout->AddColumnSet(0); 110 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,
126 1, views::GridLayout::USE_PREF, 0, 0);
127
128 // Middle rows, message labels.
129 cs = layout->AddColumnSet(1);
130 cs->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 111 cs->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL,
131 1, views::GridLayout::USE_PREF, 0, 0); 112 1, views::GridLayout::USE_PREF, 0, 0);
132 113
133 // Bottom row, accept and cancel button. 114 // Bottom row, accept and cancel button.
134 cs = layout->AddColumnSet(2); 115 cs = layout->AddColumnSet(1);
135 cs->AddPaddingColumn(1, views::kRelatedControlHorizontalSpacing); 116 cs->AddPaddingColumn(1, views::kRelatedControlHorizontalSpacing);
136 cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::LEADING, 117 cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::LEADING,
137 0, views::GridLayout::USE_PREF, 0, 0); 118 0, views::GridLayout::USE_PREF, 0, 0);
138 if (cancel_button.get()) { 119 if (cancel_button.get()) {
139 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing); 120 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
140 cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::LEADING, 121 cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::LEADING,
141 0, views::GridLayout::USE_PREF, 0, 0); 122 0, views::GridLayout::USE_PREF, 0, 0);
142 } 123 }
143 124
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) { 125 for (size_t i = 0; i < message_labels.size(); ++i) {
150 layout->StartRow(1, 1); 126 layout->StartRow(1, 0);
151 layout->AddView(message_labels[i]); 127 layout->AddView(message_labels[i]);
152 if (i < message_labels.size() - 1) 128 if (i < message_labels.size() - 1)
153 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 129 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
154 } 130 }
155 layout->AddPaddingRow(0, views::kLabelToControlVerticalSpacing); 131 layout->AddPaddingRow(0, views::kLabelToControlVerticalSpacing);
156 132
157 layout->StartRow(0, 2); 133 layout->StartRow(0, 1);
158 layout->AddView(accept_button.release()); 134 layout->AddView(accept_button.release());
159 if (cancel_button.get()) 135 if (cancel_button.get())
160 layout->AddView(cancel_button.release()); 136 layout->AddView(cancel_button.release());
161 137
162 // Adjust the message label size in case buttons are too long. 138 // Adjust the message label size in case buttons are too long.
163 for (size_t i = 0; i < message_labels.size(); ++i) 139 for (size_t i = 0; i < message_labels.size(); ++i)
164 message_labels[i]->SizeToFit(layout->GetPreferredSize(this).width()); 140 message_labels[i]->SizeToFit(layout->GetPreferredSize(this).width());
165 141
166 // These bubbles show at times where activation is sporadic (like at startup, 142 // 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 143 // or a new window opening). Make sure the bubble doesn't disappear before the
(...skipping 22 matching lines...) Expand all
190 166
191 void GlobalErrorBubbleView::WindowClosing() { 167 void GlobalErrorBubbleView::WindowClosing() {
192 if (error_) 168 if (error_)
193 error_->BubbleViewDidClose(browser_); 169 error_->BubbleViewDidClose(browser_);
194 } 170 }
195 171
196 bool GlobalErrorBubbleView::ShouldShowCloseButton() const { 172 bool GlobalErrorBubbleView::ShouldShowCloseButton() const {
197 return error_ && error_->ShouldShowCloseButton(); 173 return error_ && error_->ShouldShowCloseButton();
198 } 174 }
199 175
176 bool GlobalErrorBubbleView::ShouldShowWindowTitle() const {
177 return true;
178 }
179
180 base::string16 GlobalErrorBubbleView::GetWindowTitle() const {
181 return error_->GetBubbleViewTitle();
182 }
183
200 void GlobalErrorBubbleView::CloseBubbleView() { 184 void GlobalErrorBubbleView::CloseBubbleView() {
201 GetWidget()->Close(); 185 GetWidget()->Close();
202 } 186 }
187
188 gfx::ImageSkia GlobalErrorBubbleView::GetWindowTitleIcon() {
189 gfx::Image image = error_->GetBubbleViewIcon();
190 CHECK(!image.IsEmpty());
191 return *image.ToImageSkia();
192 }
193
194 bool GlobalErrorBubbleView::ShouldShowWindowTitleIcon() const {
195 return true;
196 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698