| OLD | NEW |
| 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 "ui/views/controls/message_box_view.h" | 5 #include "ui/views/controls/message_box_view.h" |
| 6 | 6 |
| 7 #include "base/i18n/rtl.h" | 7 #include "base/i18n/rtl.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "base/strings/string_split.h" | 9 #include "base/strings/string_split.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 // 0085 ; B # Cc <control-0085> | 37 // 0085 ; B # Cc <control-0085> |
| 38 // 2029 ; B # Zp PARAGRAPH SEPARATOR | 38 // 2029 ; B # Zp PARAGRAPH SEPARATOR |
| 39 bool IsParagraphSeparator(char16 c) { | 39 bool IsParagraphSeparator(char16 c) { |
| 40 return ( c == 0x000A || c == 0x000D || c == 0x001C || c == 0x001D || | 40 return ( c == 0x000A || c == 0x000D || c == 0x001C || c == 0x001D || |
| 41 c == 0x001E || c == 0x0085 || c == 0x2029); | 41 c == 0x001E || c == 0x0085 || c == 0x2029); |
| 42 } | 42 } |
| 43 | 43 |
| 44 // Splits |text| into a vector of paragraphs. | 44 // Splits |text| into a vector of paragraphs. |
| 45 // Given an example "\nabc\ndef\n\n\nhij\n", the split results should be: | 45 // Given an example "\nabc\ndef\n\n\nhij\n", the split results should be: |
| 46 // "", "abc", "def", "", "", "hij", and "". | 46 // "", "abc", "def", "", "", "hij", and "". |
| 47 void SplitStringIntoParagraphs(const string16& text, | 47 void SplitStringIntoParagraphs(const base::string16& text, |
| 48 std::vector<string16>* paragraphs) { | 48 std::vector<base::string16>* paragraphs) { |
| 49 paragraphs->clear(); | 49 paragraphs->clear(); |
| 50 | 50 |
| 51 size_t start = 0; | 51 size_t start = 0; |
| 52 for (size_t i = 0; i < text.length(); ++i) { | 52 for (size_t i = 0; i < text.length(); ++i) { |
| 53 if (IsParagraphSeparator(text[i])) { | 53 if (IsParagraphSeparator(text[i])) { |
| 54 paragraphs->push_back(text.substr(start, i - start)); | 54 paragraphs->push_back(text.substr(start, i - start)); |
| 55 start = i + 1; | 55 start = i + 1; |
| 56 } | 56 } |
| 57 } | 57 } |
| 58 paragraphs->push_back(text.substr(start, text.length() - start)); | 58 paragraphs->push_back(text.substr(start, text.length() - start)); |
| 59 } | 59 } |
| 60 | 60 |
| 61 } // namespace | 61 } // namespace |
| 62 | 62 |
| 63 namespace views { | 63 namespace views { |
| 64 | 64 |
| 65 /////////////////////////////////////////////////////////////////////////////// | 65 /////////////////////////////////////////////////////////////////////////////// |
| 66 // MessageBoxView, public: | 66 // MessageBoxView, public: |
| 67 | 67 |
| 68 MessageBoxView::InitParams::InitParams(const string16& message) | 68 MessageBoxView::InitParams::InitParams(const base::string16& message) |
| 69 : options(NO_OPTIONS), | 69 : options(NO_OPTIONS), |
| 70 message(message), | 70 message(message), |
| 71 message_width(kDefaultMessageWidth), | 71 message_width(kDefaultMessageWidth), |
| 72 inter_row_vertical_spacing(kRelatedControlVerticalSpacing) {} | 72 inter_row_vertical_spacing(kRelatedControlVerticalSpacing) {} |
| 73 | 73 |
| 74 MessageBoxView::InitParams::~InitParams() { | 74 MessageBoxView::InitParams::~InitParams() { |
| 75 } | 75 } |
| 76 | 76 |
| 77 MessageBoxView::MessageBoxView(const InitParams& params) | 77 MessageBoxView::MessageBoxView(const InitParams& params) |
| 78 : prompt_field_(NULL), | 78 : prompt_field_(NULL), |
| 79 icon_(NULL), | 79 icon_(NULL), |
| 80 checkbox_(NULL), | 80 checkbox_(NULL), |
| 81 link_(NULL), | 81 link_(NULL), |
| 82 message_width_(params.message_width) { | 82 message_width_(params.message_width) { |
| 83 Init(params); | 83 Init(params); |
| 84 } | 84 } |
| 85 | 85 |
| 86 MessageBoxView::~MessageBoxView() {} | 86 MessageBoxView::~MessageBoxView() {} |
| 87 | 87 |
| 88 string16 MessageBoxView::GetInputText() { | 88 base::string16 MessageBoxView::GetInputText() { |
| 89 return prompt_field_ ? prompt_field_->text() : string16(); | 89 return prompt_field_ ? prompt_field_->text() : base::string16(); |
| 90 } | 90 } |
| 91 | 91 |
| 92 bool MessageBoxView::IsCheckBoxSelected() { | 92 bool MessageBoxView::IsCheckBoxSelected() { |
| 93 return checkbox_ ? checkbox_->checked() : false; | 93 return checkbox_ ? checkbox_->checked() : false; |
| 94 } | 94 } |
| 95 | 95 |
| 96 void MessageBoxView::SetIcon(const gfx::ImageSkia& icon) { | 96 void MessageBoxView::SetIcon(const gfx::ImageSkia& icon) { |
| 97 if (!icon_) | 97 if (!icon_) |
| 98 icon_ = new ImageView(); | 98 icon_ = new ImageView(); |
| 99 icon_->SetImage(icon); | 99 icon_->SetImage(icon); |
| 100 icon_->SetBounds(0, 0, icon.width(), icon.height()); | 100 icon_->SetBounds(0, 0, icon.width(), icon.height()); |
| 101 ResetLayoutManager(); | 101 ResetLayoutManager(); |
| 102 } | 102 } |
| 103 | 103 |
| 104 void MessageBoxView::SetCheckBoxLabel(const string16& label) { | 104 void MessageBoxView::SetCheckBoxLabel(const base::string16& label) { |
| 105 if (!checkbox_) | 105 if (!checkbox_) |
| 106 checkbox_ = new Checkbox(label); | 106 checkbox_ = new Checkbox(label); |
| 107 else | 107 else |
| 108 checkbox_->SetText(label); | 108 checkbox_->SetText(label); |
| 109 ResetLayoutManager(); | 109 ResetLayoutManager(); |
| 110 } | 110 } |
| 111 | 111 |
| 112 void MessageBoxView::SetCheckBoxSelected(bool selected) { | 112 void MessageBoxView::SetCheckBoxSelected(bool selected) { |
| 113 if (!checkbox_) | 113 if (!checkbox_) |
| 114 return; | 114 return; |
| 115 checkbox_->SetChecked(selected); | 115 checkbox_->SetChecked(selected); |
| 116 } | 116 } |
| 117 | 117 |
| 118 void MessageBoxView::SetLink(const string16& text, LinkListener* listener) { | 118 void MessageBoxView::SetLink(const base::string16& text, |
| 119 LinkListener* listener) { |
| 119 if (text.empty()) { | 120 if (text.empty()) { |
| 120 DCHECK(!listener); | 121 DCHECK(!listener); |
| 121 delete link_; | 122 delete link_; |
| 122 link_ = NULL; | 123 link_ = NULL; |
| 123 } else { | 124 } else { |
| 124 DCHECK(listener); | 125 DCHECK(listener); |
| 125 if (!link_) { | 126 if (!link_) { |
| 126 link_ = new Link(); | 127 link_ = new Link(); |
| 127 link_->SetHorizontalAlignment(gfx::ALIGN_LEFT); | 128 link_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 128 } | 129 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 155 | 156 |
| 156 // We must not intercept Ctrl-C when we have a text box and it's focused. | 157 // We must not intercept Ctrl-C when we have a text box and it's focused. |
| 157 if (prompt_field_ && prompt_field_->HasFocus()) | 158 if (prompt_field_ && prompt_field_->HasFocus()) |
| 158 return false; | 159 return false; |
| 159 | 160 |
| 160 ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread(); | 161 ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread(); |
| 161 if (!clipboard) | 162 if (!clipboard) |
| 162 return false; | 163 return false; |
| 163 | 164 |
| 164 ui::ScopedClipboardWriter scw(clipboard, ui::CLIPBOARD_TYPE_COPY_PASTE); | 165 ui::ScopedClipboardWriter scw(clipboard, ui::CLIPBOARD_TYPE_COPY_PASTE); |
| 165 string16 text = message_labels_[0]->text(); | 166 base::string16 text = message_labels_[0]->text(); |
| 166 for (size_t i = 1; i < message_labels_.size(); ++i) | 167 for (size_t i = 1; i < message_labels_.size(); ++i) |
| 167 text += message_labels_[i]->text(); | 168 text += message_labels_[i]->text(); |
| 168 scw.WriteText(text); | 169 scw.WriteText(text); |
| 169 return true; | 170 return true; |
| 170 } | 171 } |
| 171 | 172 |
| 172 /////////////////////////////////////////////////////////////////////////////// | 173 /////////////////////////////////////////////////////////////////////////////// |
| 173 // MessageBoxView, private: | 174 // MessageBoxView, private: |
| 174 | 175 |
| 175 void MessageBoxView::Init(const InitParams& params) { | 176 void MessageBoxView::Init(const InitParams& params) { |
| 176 if (params.options & DETECT_DIRECTIONALITY) { | 177 if (params.options & DETECT_DIRECTIONALITY) { |
| 177 std::vector<string16> texts; | 178 std::vector<base::string16> texts; |
| 178 SplitStringIntoParagraphs(params.message, &texts); | 179 SplitStringIntoParagraphs(params.message, &texts); |
| 179 // If the text originates from a web page, its alignment is based on its | 180 // If the text originates from a web page, its alignment is based on its |
| 180 // first character with strong directionality. | 181 // first character with strong directionality. |
| 181 base::i18n::TextDirection message_direction = | 182 base::i18n::TextDirection message_direction = |
| 182 base::i18n::GetFirstStrongCharacterDirection(params.message); | 183 base::i18n::GetFirstStrongCharacterDirection(params.message); |
| 183 gfx::HorizontalAlignment alignment = | 184 gfx::HorizontalAlignment alignment = |
| 184 (message_direction == base::i18n::RIGHT_TO_LEFT) ? | 185 (message_direction == base::i18n::RIGHT_TO_LEFT) ? |
| 185 gfx::ALIGN_RIGHT : gfx::ALIGN_LEFT; | 186 gfx::ALIGN_RIGHT : gfx::ALIGN_LEFT; |
| 186 for (size_t i = 0; i < texts.size(); ++i) { | 187 for (size_t i = 0; i < texts.size(); ++i) { |
| 187 Label* message_label = new Label(texts[i]); | 188 Label* message_label = new Label(texts[i]); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 } | 270 } |
| 270 | 271 |
| 271 if (link_) { | 272 if (link_) { |
| 272 layout->AddPaddingRow(0, inter_row_vertical_spacing_); | 273 layout->AddPaddingRow(0, inter_row_vertical_spacing_); |
| 273 layout->StartRow(0, extra_column_view_set_id); | 274 layout->StartRow(0, extra_column_view_set_id); |
| 274 layout->AddView(link_); | 275 layout->AddView(link_); |
| 275 } | 276 } |
| 276 } | 277 } |
| 277 | 278 |
| 278 } // namespace views | 279 } // namespace views |
| OLD | NEW |