Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / views / infobars / before_translate_infobar.cc
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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/ui/views/infobars/before_translate_infobar.h"
6
7 #include "base/strings/utf_string_conversions.h"
8 #include "chrome/browser/translate/options_menu_model.h"
9 #include "chrome/browser/translate/translate_infobar_delegate.h"
10 #include "chrome/browser/ui/views/infobars/translate_language_menu_model.h"
11 #include "grit/generated_resources.h"
12 #include "ui/base/l10n/l10n_util.h"
13 #include "ui/views/controls/button/label_button.h"
14 #include "ui/views/controls/button/menu_button.h"
15 #include "ui/views/controls/label.h"
16
17 BeforeTranslateInfoBar::BeforeTranslateInfoBar(
18     scoped_ptr<TranslateInfoBarDelegate> delegate)
19     : TranslateInfoBarBase(delegate.Pass()),
20       label_1_(NULL),
21       label_2_(NULL),
22       language_menu_button_(NULL),
23       accept_button_(NULL),
24       deny_button_(NULL),
25       never_translate_button_(NULL),
26       always_translate_button_(NULL),
27       options_menu_button_(NULL) {
28 }
29
30 BeforeTranslateInfoBar::~BeforeTranslateInfoBar() {
31 }
32
33 void BeforeTranslateInfoBar::Layout() {
34   TranslateInfoBarBase::Layout();
35
36   int x = StartX();
37   Labels labels;
38   labels.push_back(label_1_);
39   labels.push_back(label_2_);
40   AssignWidths(&labels, std::max(0, EndX() - x - NonLabelWidth()));
41
42   label_1_->SetPosition(gfx::Point(x, OffsetY(label_1_)));
43   if (!label_1_->text().empty())
44      x = label_1_->bounds().right() + kButtonInLabelSpacing;
45
46   language_menu_button_->SetPosition(
47       gfx::Point(x, OffsetY(language_menu_button_)));
48   x = language_menu_button_->bounds().right();
49
50   label_2_->SetPosition(
51       gfx::Point(x + kButtonInLabelSpacing, OffsetY(label_2_)));
52   x = (label_2_->text().empty() ? x : label_2_->bounds().right()) +
53       kEndOfLabelSpacing;
54
55   accept_button_->SetPosition(gfx::Point(x, OffsetY(accept_button_)));
56   x = accept_button_->bounds().right() + kButtonButtonSpacing;
57
58   deny_button_->SetPosition(gfx::Point(x, OffsetY(deny_button_)));
59   x = deny_button_->bounds().right() + kButtonButtonSpacing;
60
61   if (never_translate_button_) {
62     never_translate_button_->SetPosition(
63         gfx::Point(x, OffsetY(never_translate_button_)));
64     x = never_translate_button_->bounds().right() + kButtonButtonSpacing;
65   }
66
67   if (always_translate_button_) {
68     always_translate_button_->SetPosition(
69         gfx::Point(x, OffsetY(always_translate_button_)));
70   }
71
72   options_menu_button_->SetPosition(gfx::Point(
73       EndX() - options_menu_button_->width(), OffsetY(options_menu_button_)));
74 }
75
76 void BeforeTranslateInfoBar::ViewHierarchyChanged(
77     const ViewHierarchyChangedDetails& details) {
78   if (!details.is_add || (details.child != this) || (label_1_ != NULL)) {
79     TranslateInfoBarBase::ViewHierarchyChanged(details);
80     return;
81   }
82
83   size_t offset = 0;
84   base::string16 text(
85       l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_BEFORE_MESSAGE,
86                                  base::string16(), &offset));
87
88   label_1_ = CreateLabel(text.substr(0, offset));
89   AddChildView(label_1_);
90
91   language_menu_button_ = CreateMenuButton(base::string16(), this);
92   TranslateInfoBarDelegate* delegate = GetDelegate();
93   language_menu_model_.reset(new TranslateLanguageMenuModel(
94       TranslateLanguageMenuModel::ORIGINAL, delegate, this,
95       language_menu_button_, false));
96   AddChildView(language_menu_button_);
97
98   label_2_ = CreateLabel(text.substr(offset));
99   AddChildView(label_2_);
100
101   accept_button_ = CreateLabelButton(
102       this, l10n_util::GetStringUTF16(IDS_TRANSLATE_INFOBAR_ACCEPT));
103   AddChildView(accept_button_);
104
105   deny_button_ = CreateLabelButton(
106       this, l10n_util::GetStringUTF16(IDS_TRANSLATE_INFOBAR_DENY));
107   AddChildView(deny_button_);
108
109   const base::string16& language(
110       delegate->language_name_at(delegate->original_language_index()));
111   if (delegate->ShouldShowNeverTranslateShortcut()) {
112     DCHECK(!delegate->ShouldShowAlwaysTranslateShortcut());
113     never_translate_button_ = CreateLabelButton(
114         this,
115         l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_NEVER_TRANSLATE,
116                                    language));
117     AddChildView(never_translate_button_);
118   } else if (delegate->ShouldShowAlwaysTranslateShortcut()) {
119     always_translate_button_ = CreateLabelButton(
120         this,
121         l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_ALWAYS_TRANSLATE,
122                                    language));
123     AddChildView(always_translate_button_);
124   }
125
126   options_menu_button_ = CreateMenuButton(
127       l10n_util::GetStringUTF16(IDS_TRANSLATE_INFOBAR_OPTIONS), this);
128   options_menu_model_.reset(new OptionsMenuModel(delegate));
129   AddChildView(options_menu_button_);
130
131   // This must happen after adding all other children so InfoBarView can ensure
132   // the close button is the last child.
133   TranslateInfoBarBase::ViewHierarchyChanged(details);
134
135   // This must happen after adding all children because it triggers layout,
136   // which assumes that particular children (e.g. the close button) have already
137   // been added.
138   UpdateLanguageButtonText(language_menu_button_,
139       delegate->language_name_at(delegate->original_language_index()));
140 }
141
142 int BeforeTranslateInfoBar::ContentMinimumWidth() {
143   return label_1_->GetMinimumSize().width() +
144       label_2_->GetMinimumSize().width() + NonLabelWidth();
145 }
146
147 void BeforeTranslateInfoBar::ButtonPressed(views::Button* sender,
148                                            const ui::Event& event) {
149   if (!owner())
150     return;  // We're closing; don't call anything, it might access the owner.
151   TranslateInfoBarDelegate* delegate = GetDelegate();
152   if (sender == accept_button_) {
153     delegate->Translate();
154   } else if (sender == deny_button_) {
155     delegate->TranslationDeclined();
156     RemoveSelf();
157   } else if (sender == never_translate_button_) {
158     delegate->NeverTranslatePageLanguage();
159   } else if (sender == always_translate_button_) {
160     delegate->AlwaysTranslatePageLanguage();
161   } else {
162     TranslateInfoBarBase::ButtonPressed(sender, event);
163   }
164 }
165
166 void BeforeTranslateInfoBar::OnMenuButtonClicked(views::View* source,
167                                                  const gfx::Point& point) {
168   if (!owner())
169     return;  // We're closing; don't call anything, it might access the owner.
170   if (source == language_menu_button_) {
171     RunMenuAt(language_menu_model_.get(),
172               language_menu_button_,
173               views::MENU_ANCHOR_TOPLEFT);
174   } else {
175     DCHECK_EQ(options_menu_button_, source);
176     RunMenuAt(options_menu_model_.get(),
177               options_menu_button_,
178               views::MENU_ANCHOR_TOPRIGHT);
179   }
180 }
181
182 int BeforeTranslateInfoBar::NonLabelWidth() const {
183   return (label_1_->text().empty() ? 0 : kButtonInLabelSpacing) +
184       language_menu_button_->width() +
185       (label_2_->text().empty() ? 0 : kButtonInLabelSpacing) +
186       kEndOfLabelSpacing + accept_button_->width() + kButtonButtonSpacing +
187       deny_button_->width() +
188       (never_translate_button_ ?
189           (kButtonButtonSpacing + never_translate_button_->width()) : 0) +
190       (always_translate_button_ ?
191           (kButtonButtonSpacing + always_translate_button_->width()) : 0) +
192       kEndOfLabelSpacing + options_menu_button_->width();
193 }