15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/message_box_view.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/rtl.h" 8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_view_state.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/base/clipboard/clipboard.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/scoped_clipboard_writer.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/checkbox.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h" 167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/views/controls/link.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/controls/scroll_view.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/textfield/textfield.h" 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/layout/box_layout.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/grid_layout.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/layout_constants.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/window/client_view.h" 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/views/window/dialog_delegate.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kDefaultMessageWidth = 320; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Paragraph separators are defined in 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://www.unicode.org/Public/6.0.0/ucd/extracted/DerivedBidiClass.txt 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// # Bidi_Class=Paragraph_Separator 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 000A ; B # Cc <control-000A> 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 000D ; B # Cc <control-000D> 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 001C..001E ; B # Cc [3] <control-001C>..<control-001E> 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 0085 ; B # Cc <control-0085> 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2029 ; B # Zp PARAGRAPH SEPARATOR 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool IsParagraphSeparator(base::char16 c) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ( c == 0x000A || c == 0x000D || c == 0x001C || c == 0x001D || 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c == 0x001E || c == 0x0085 || c == 0x2029); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Splits |text| into a vector of paragraphs. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Given an example "\nabc\ndef\n\n\nhij\n", the split results should be: 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "", "abc", "def", "", "", "hij", and "". 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SplitStringIntoParagraphs(const base::string16& text, 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<base::string16>* paragraphs) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paragraphs->clear(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t start = 0; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < text.length(); ++i) { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsParagraphSeparator(text[i])) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paragraphs->push_back(text.substr(start, i - start)); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start = i + 1; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paragraphs->push_back(text.substr(start, text.length() - start)); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MessageBoxView, public: 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MessageBoxView::InitParams::InitParams(const base::string16& message) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : options(NO_OPTIONS), 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message(message), 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_width(kDefaultMessageWidth), 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) inter_row_vertical_spacing(kRelatedControlVerticalSpacing) {} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageBoxView::InitParams::~InitParams() { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageBoxView::MessageBoxView(const InitParams& params) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : prompt_field_(NULL), 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checkbox_(NULL), 817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) link_(NULL), 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_width_(params.message_width) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Init(params); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageBoxView::~MessageBoxView() {} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 MessageBoxView::GetInputText() { 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return prompt_field_ ? prompt_field_->text() : base::string16(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MessageBoxView::IsCheckBoxSelected() { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return checkbox_ ? checkbox_->checked() : false; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void MessageBoxView::SetCheckBoxLabel(const base::string16& label) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!checkbox_) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checkbox_ = new Checkbox(label); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checkbox_->SetText(label); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetLayoutManager(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageBoxView::SetCheckBoxSelected(bool selected) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!checkbox_) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checkbox_->SetChecked(selected); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void MessageBoxView::SetLink(const base::string16& text, 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LinkListener* listener) { 1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (text.empty()) { 1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(!listener); 1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) delete link_; 1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) link_ = NULL; 1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } else { 1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(listener); 1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!link_) { 1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) link_ = new Link(); 1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) link_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) link_->SetText(text); 1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) link_->set_listener(listener); 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ResetLayoutManager(); 1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void MessageBoxView::GetAccessibleState(ui::AXViewState* state) { 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state->role = ui::AX_ROLE_ALERT; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MessageBoxView, View overrides: 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void MessageBoxView::ViewHierarchyChanged( 136a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const ViewHierarchyChangedDetails& details) { 137a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (details.child == this && details.is_add) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prompt_field_) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prompt_field_->SelectAll(true); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NotifyAccessibilityEvent(ui::AX_EVENT_ALERT, true); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MessageBoxView::AcceleratorPressed(const ui::Accelerator& accelerator) { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only accepts Ctrl-C. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(accelerator.key_code() == 'C' && accelerator.IsCtrlDown()); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We must not intercept Ctrl-C when we have a text box and it's focused. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prompt_field_ && prompt_field_->HasFocus()) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::ScopedClipboardWriter scw(ui::CLIPBOARD_TYPE_COPY_PASTE); 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 text = message_labels_[0]->text(); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 1; i < message_labels_.size(); ++i) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text += message_labels_[i]->text(); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scw.WriteText(text); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MessageBoxView, private: 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageBoxView::Init(const InitParams& params) { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.options & DETECT_DIRECTIONALITY) { 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<base::string16> texts; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SplitStringIntoParagraphs(params.message, &texts); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < texts.size(); ++i) { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Label* message_label = new Label(texts[i]); 170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Avoid empty multi-line labels, which have a height of 0. 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_label->SetMultiLine(!texts[i].empty()); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_label->SetAllowCharacterBreak(true); 173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) message_label->SetHorizontalAlignment(gfx::ALIGN_TO_HEAD); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_labels_.push_back(message_label); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Label* message_label = new Label(params.message); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_label->SetMultiLine(true); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_label->SetAllowCharacterBreak(true); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_labels_.push_back(message_label); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.options & HAS_PROMPT_FIELD) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prompt_field_ = new Textfield; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prompt_field_->SetText(params.default_prompt); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inter_row_vertical_spacing_ = params.inter_row_vertical_spacing; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetLayoutManager(); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageBoxView::ResetLayoutManager() { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize the Grid Layout Manager used for this dialog box. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GridLayout* layout = GridLayout::CreatePanel(this); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLayoutManager(layout); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add the column set for the message displayed at the top of the dialog box. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int message_column_view_set_id = 0; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ColumnSet* column_set = layout->AddColumnSet(message_column_view_set_id); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GridLayout::FIXED, message_width_, 0); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Column set for extra elements, if any. 2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const int extra_column_view_set_id = 1; 2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (prompt_field_ || checkbox_ || link_) { 2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) column_set = layout->AddColumnSet(extra_column_view_set_id); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GridLayout::USE_PREF, 0, 0); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const int kMaxScrollViewHeight = 600; 214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch views::View* message_contents = new views::View(); 215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch message_contents->SetLayoutManager( 216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0)); 217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (size_t i = 0; i < message_labels_.size(); ++i) 218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch message_contents->AddChildView(message_labels_[i]); 219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ScrollView* scroll_view = new views::ScrollView(); 220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scroll_view->ClipHeightTo(0, kMaxScrollViewHeight); 221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scroll_view->SetContents(message_contents); 222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch layout->StartRow(0, message_column_view_set_id); 223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch layout->AddView(scroll_view); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prompt_field_) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddPaddingRow(0, inter_row_vertical_spacing_); 2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) layout->StartRow(0, extra_column_view_set_id); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(prompt_field_); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (checkbox_) { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddPaddingRow(0, inter_row_vertical_spacing_); 2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) layout->StartRow(0, extra_column_view_set_id); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(checkbox_); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (link_) { 2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) layout->AddPaddingRow(0, inter_row_vertical_spacing_); 2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) layout->StartRow(0, extra_column_view_set_id); 2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) layout->AddView(link_); 2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace views 245