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