1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/chromeos/ui/echo_dialog_view.h"
6
7#include "chrome/browser/chromeos/ui/echo_dialog_listener.h"
8#include "chrome/grit/generated_resources.h"
9#include "ui/base/l10n/l10n_util.h"
10#include "ui/gfx/font.h"
11#include "ui/views/border.h"
12#include "ui/views/controls/styled_label.h"
13#include "ui/views/widget/widget.h"
14#include "ui/views/window/dialog_client_view.h"
15
16namespace {
17
18const int kDialogLabelTopInset = 20;
19const int kDialogLabelLeftInset = 20;
20const int kDialogLabelBottomInset = 20;
21const int kDialogLabelRightInset = 100;
22
23const int kDialogLabelPreferredWidth =
24    350 + kDialogLabelLeftInset + kDialogLabelRightInset;
25
26}  // namespace
27
28namespace chromeos {
29
30EchoDialogView::EchoDialogView(EchoDialogListener* listener)
31    : label_(NULL),
32      listener_(listener),
33      ok_button_label_id_(0),
34      cancel_button_label_id_(0) {
35}
36
37EchoDialogView::~EchoDialogView() {}
38
39void EchoDialogView::InitForEnabledEcho(const base::string16& service_name,
40                                        const base::string16& origin) {
41  ok_button_label_id_ = IDS_OFFERS_CONSENT_INFOBAR_ENABLE_BUTTON;
42  cancel_button_label_id_ = IDS_OFFERS_CONSENT_INFOBAR_DISABLE_BUTTON;
43
44  base::string16 link =
45      l10n_util::GetStringUTF16(IDS_OFFERS_CONSENT_INFOBAR_LABEL_LEARN_MORE);
46
47  std::vector<size_t> offsets;
48  base::string16 text = l10n_util::GetStringFUTF16(IDS_ECHO_CONSENT_DIALOG_TEXT,
49                                             service_name,
50                                             link,
51                                             &offsets);
52
53  label_ = new views::StyledLabel(text, this);
54
55  views::StyledLabel::RangeStyleInfo service_name_style;
56  service_name_style.font_style = gfx::Font::UNDERLINE;
57  service_name_style.tooltip = origin;
58  label_->AddStyleRange(
59      gfx::Range(offsets[0], offsets[0] + service_name.length()),
60      service_name_style);
61
62  views::StyledLabel::RangeStyleInfo link_style =
63      views::StyledLabel::RangeStyleInfo::CreateForLink();
64  link_style.font_style = gfx::Font::NORMAL;
65  label_->AddStyleRange(gfx::Range(offsets[1], offsets[1] + link.length()),
66                        link_style);
67
68  SetLabelBorderAndBounds();
69
70  AddChildView(label_);
71}
72
73void EchoDialogView::InitForDisabledEcho() {
74  ok_button_label_id_ = 0;
75  cancel_button_label_id_ = IDS_ECHO_CONSENT_DISMISS_BUTTON;
76
77  base::string16 link =
78      l10n_util::GetStringUTF16(IDS_OFFERS_CONSENT_INFOBAR_LABEL_LEARN_MORE);
79
80  size_t offset;
81  base::string16 text = l10n_util::GetStringFUTF16(
82      IDS_ECHO_DISABLED_CONSENT_DIALOG_TEXT, link, &offset);
83
84  label_ = new views::StyledLabel(text, this);
85
86  views::StyledLabel::RangeStyleInfo link_style =
87      views::StyledLabel::RangeStyleInfo::CreateForLink();
88  link_style.font_style = gfx::Font::NORMAL;
89  label_->AddStyleRange(gfx::Range(offset, offset + link.length()), link_style);
90
91  SetLabelBorderAndBounds();
92
93  AddChildView(label_);
94}
95
96void EchoDialogView::Show(gfx::NativeWindow parent) {
97  DCHECK(cancel_button_label_id_);
98
99  views::DialogDelegate::CreateDialogWidget(this, parent, parent);
100  GetWidget()->SetSize(GetWidget()->GetRootView()->GetPreferredSize());
101  GetWidget()->Show();
102}
103
104int EchoDialogView::GetDefaultDialogButton() const {
105  return ui::DIALOG_BUTTON_NONE;
106}
107
108int EchoDialogView::GetDialogButtons() const {
109  int buttons = ui::DIALOG_BUTTON_NONE;
110  if (ok_button_label_id_)
111    buttons |= ui::DIALOG_BUTTON_OK;
112  if (cancel_button_label_id_)
113    buttons |= ui::DIALOG_BUTTON_CANCEL;
114  return buttons;
115}
116
117bool EchoDialogView::Accept() {
118  if (listener_) {
119    listener_->OnAccept();
120    listener_ = NULL;
121  }
122  return true;
123}
124
125bool EchoDialogView::Cancel() {
126  if (listener_) {
127    listener_->OnCancel();
128    listener_ = NULL;
129  }
130  return true;
131}
132
133base::string16 EchoDialogView::GetDialogButtonLabel(
134    ui::DialogButton button) const {
135  if (button == ui::DIALOG_BUTTON_OK && ok_button_label_id_)
136    return l10n_util::GetStringUTF16(ok_button_label_id_);
137  if (button == ui::DIALOG_BUTTON_CANCEL && cancel_button_label_id_)
138    return l10n_util::GetStringUTF16(cancel_button_label_id_);
139  return base::string16();
140}
141
142ui::ModalType EchoDialogView::GetModalType() const {
143  return ui::MODAL_TYPE_WINDOW;
144}
145
146bool EchoDialogView::ShouldShowWindowTitle() const {
147  return false;
148}
149
150bool EchoDialogView::ShouldShowWindowIcon() const {
151  return false;
152}
153
154void EchoDialogView::StyledLabelLinkClicked(const gfx::Range& range,
155                                            int event_flags) {
156  if (!listener_)
157    return;
158  listener_->OnMoreInfoLinkClicked();
159}
160
161gfx::Size EchoDialogView::GetPreferredSize() const {
162  gfx::Size size =
163      gfx::Size(kDialogLabelPreferredWidth,
164                label_->GetHeightForWidth(kDialogLabelPreferredWidth));
165  gfx::Insets insets = GetInsets();
166  size.Enlarge(insets.width(), insets.height());
167  return size;
168}
169
170void EchoDialogView::SetLabelBorderAndBounds() {
171  label_->SetBorder(views::Border::CreateEmptyBorder(kDialogLabelTopInset,
172                                                     kDialogLabelLeftInset,
173                                                     kDialogLabelBottomInset,
174                                                     kDialogLabelRightInset));
175
176  label_->SetBounds(label_->x(),
177                    label_->y(),
178                    kDialogLabelPreferredWidth,
179                    label_->GetHeightForWidth(kDialogLabelPreferredWidth));
180}
181
182}  // namespace chromeos
183