Chromium Code Reviews

Side by Side Diff: chrome/browser/gtk/translate/translate_infobar_base_gtk.cc

Issue 6251001: Move chrome/browser/gtk/ to chrome/browser/ui/gtk/... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2010 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/gtk/translate/translate_infobar_base_gtk.h"
6
7 #include "app/l10n_util.h"
8 #include "base/utf_string_conversions.h"
9 #include "chrome/browser/translate/options_menu_model.h"
10 #include "chrome/browser/translate/translate_infobar_delegate.h"
11 #include "chrome/browser/gtk/translate/after_translate_infobar_gtk.h"
12 #include "chrome/browser/gtk/translate/before_translate_infobar_gtk.h"
13 #include "chrome/browser/gtk/translate/translate_message_infobar_gtk.h"
14 #include "chrome/browser/gtk/gtk_util.h"
15 #include "chrome/browser/gtk/menu_gtk.h"
16 #include "gfx/canvas.h"
17 #include "grit/generated_resources.h"
18 #include "ui/base/animation/slide_animation.h"
19
20 namespace {
21
22 // To be able to map from language id <-> entry in the combo box, we
23 // store the language id in the combo box data model in addition to the
24 // displayed name.
25 enum {
26 LANGUAGE_COMBO_COLUMN_ID,
27 LANGUAGE_COMBO_COLUMN_NAME,
28 LANGUAGE_COMBO_COLUMN_COUNT
29 };
30
31 } // namespace
32
33 TranslateInfoBarBase::TranslateInfoBarBase(TranslateInfoBarDelegate* delegate)
34 : InfoBar(delegate) {
35 TranslateInfoBarDelegate::BackgroundAnimationType animation =
36 delegate->background_animation_type();
37 if (animation != TranslateInfoBarDelegate::NONE) {
38 background_color_animation_.reset(new ui::SlideAnimation(this));
39 background_color_animation_->SetTweenType(ui::Tween::LINEAR);
40 background_color_animation_->SetSlideDuration(500);
41 if (animation == TranslateInfoBarDelegate::NORMAL_TO_ERROR) {
42 background_color_animation_->Show();
43 } else {
44 DCHECK_EQ(TranslateInfoBarDelegate::ERROR_TO_NORMAL, animation);
45 // Hide() runs the animation in reverse.
46 background_color_animation_->Reset(1.0);
47 background_color_animation_->Hide();
48 }
49 } else {
50 background_error_percent_ = delegate->IsError() ? 1 : 0;
51 }
52 }
53
54 TranslateInfoBarBase::~TranslateInfoBarBase() {
55 }
56
57 void TranslateInfoBarBase::Init() {
58 if (!ShowOptionsMenuButton())
59 return;
60
61 // The options button sits outside the translate_box so that it can be end
62 // packed in hbox_.
63 GtkWidget* options_menu_button = BuildOptionsMenuButton();
64 g_signal_connect(options_menu_button, "clicked",
65 G_CALLBACK(&OnOptionsClickedThunk), this);
66 gtk_widget_show_all(options_menu_button);
67 gtk_util::CenterWidgetInHBox(hbox_, options_menu_button, true, 0);
68 }
69
70 void TranslateInfoBarBase::GetTopColor(InfoBarDelegate::Type type,
71 double* r, double* g, double *b) {
72 if (background_error_percent_ <= 0) {
73 InfoBar::GetTopColor(InfoBarDelegate::PAGE_ACTION_TYPE, r, g, b);
74 } else if (background_error_percent_ >= 1) {
75 InfoBar::GetTopColor(InfoBarDelegate::WARNING_TYPE, r, g, b);
76 } else {
77 double normal_r, normal_g, normal_b;
78 InfoBar::GetTopColor(InfoBarDelegate::PAGE_ACTION_TYPE,
79 &normal_r, &normal_g, &normal_b);
80
81 double error_r, error_g, error_b;
82 InfoBar::GetTopColor(InfoBarDelegate::WARNING_TYPE,
83 &error_r, &error_g, &error_b);
84
85 double offset_r = error_r - normal_r;
86 double offset_g = error_g - normal_g;
87 double offset_b = error_b - normal_b;
88
89 *r = normal_r + (background_error_percent_ * offset_r);
90 *g = normal_g + (background_error_percent_ * offset_g);
91 *b = normal_b + (background_error_percent_ * offset_b);
92 }
93 }
94
95 void TranslateInfoBarBase::GetBottomColor(InfoBarDelegate::Type type,
96 double* r, double* g, double *b) {
97 if (background_error_percent_ <= 0) {
98 InfoBar::GetBottomColor(InfoBarDelegate::PAGE_ACTION_TYPE, r, g, b);
99 } else if (background_error_percent_ >= 1) {
100 InfoBar::GetBottomColor(InfoBarDelegate::WARNING_TYPE, r, g, b);
101 } else {
102 double normal_r, normal_g, normal_b;
103 InfoBar::GetBottomColor(InfoBarDelegate::PAGE_ACTION_TYPE,
104 &normal_r, &normal_g, &normal_b);
105
106 double error_r, error_g, error_b;
107 InfoBar::GetBottomColor(InfoBarDelegate::WARNING_TYPE,
108 &error_r, &error_g, &error_b);
109
110 double offset_r = error_r - normal_r;
111 double offset_g = error_g - normal_g;
112 double offset_b = error_b - normal_b;
113
114 *r = normal_r + (background_error_percent_ * offset_r);
115 *g = normal_g + (background_error_percent_ * offset_g);
116 *b = normal_b + (background_error_percent_ * offset_b);
117 }
118 }
119
120 void TranslateInfoBarBase::AnimationProgressed(const ui::Animation* animation) {
121 DCHECK(animation == background_color_animation_.get());
122 background_error_percent_ = animation->GetCurrentValue();
123 // Queue the info bar widget for redisplay so it repaints its background.
124 gtk_widget_queue_draw(widget());
125 }
126
127 bool TranslateInfoBarBase::ShowOptionsMenuButton() const {
128 return false;
129 }
130
131 GtkWidget* TranslateInfoBarBase::CreateLabel(const std::string& text) {
132 GtkWidget* label = gtk_label_new(text.c_str());
133 gtk_widget_modify_fg(label, GTK_STATE_NORMAL, &gtk_util::kGdkBlack);
134 return label;
135 }
136
137 GtkWidget* TranslateInfoBarBase::CreateLanguageCombobox(int selected_language,
138 int exclude_language) {
139 GtkListStore* model = gtk_list_store_new(LANGUAGE_COMBO_COLUMN_COUNT,
140 G_TYPE_INT, G_TYPE_STRING);
141 bool set_selection = false;
142 GtkTreeIter selected_iter;
143 TranslateInfoBarDelegate* delegate = GetDelegate();
144 for (int i = 0; i < delegate->GetLanguageCount(); ++i) {
145 if (i == exclude_language)
146 continue;
147 GtkTreeIter tree_iter;
148 const string16& name = delegate->GetLanguageDisplayableNameAt(i);
149
150 gtk_list_store_append(model, &tree_iter);
151 gtk_list_store_set(model, &tree_iter,
152 LANGUAGE_COMBO_COLUMN_ID, i,
153 LANGUAGE_COMBO_COLUMN_NAME, UTF16ToUTF8(name).c_str(),
154 -1);
155 if (i == selected_language) {
156 selected_iter = tree_iter;
157 set_selection = true;
158 }
159 }
160
161 GtkWidget* combobox = gtk_combo_box_new_with_model(GTK_TREE_MODEL(model));
162 if (set_selection)
163 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(combobox), &selected_iter);
164 g_object_unref(model);
165 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
166 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox), renderer, TRUE);
167 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combobox), renderer,
168 "text", LANGUAGE_COMBO_COLUMN_NAME,
169 NULL);
170 return combobox;
171 }
172
173 // static
174 int TranslateInfoBarBase::GetLanguageComboboxActiveId(GtkComboBox* combo) {
175 GtkTreeIter iter;
176 if (!gtk_combo_box_get_active_iter(combo, &iter))
177 return 0;
178
179 gint id = 0;
180 gtk_tree_model_get(gtk_combo_box_get_model(combo), &iter,
181 LANGUAGE_COMBO_COLUMN_ID, &id,
182 -1);
183 return id;
184 }
185
186 TranslateInfoBarDelegate* TranslateInfoBarBase::GetDelegate() const {
187 return static_cast<TranslateInfoBarDelegate*>(delegate());
188 }
189
190 // static
191 GtkWidget* TranslateInfoBarBase::BuildOptionsMenuButton() {
192 GtkWidget* button = gtk_button_new();
193 GtkWidget* former_child = gtk_bin_get_child(GTK_BIN(button));
194 if (former_child)
195 gtk_container_remove(GTK_CONTAINER(button), former_child);
196
197 GtkWidget* hbox = gtk_hbox_new(FALSE, 0);
198
199 GtkWidget* label = gtk_label_new(
200 l10n_util::GetStringUTF8(IDS_TRANSLATE_INFOBAR_OPTIONS).c_str());
201 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
202
203 GtkWidget* arrow = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_NONE);
204 gtk_box_pack_start(GTK_BOX(hbox), arrow, FALSE, FALSE, 0);
205
206 gtk_container_add(GTK_CONTAINER(button), hbox);
207
208 return button;
209 }
210
211 void TranslateInfoBarBase::OnOptionsClicked(GtkWidget* sender) {
212 if (!options_menu_model_.get()) {
213 options_menu_model_.reset(new OptionsMenuModel(GetDelegate()));
214 options_menu_menu_.reset(new MenuGtk(NULL, options_menu_model_.get()));
215 }
216 options_menu_menu_->Popup(sender, 1, gtk_get_current_event_time());
217 }
218
219 // TranslateInfoBarDelegate specific method:
220 InfoBar* TranslateInfoBarDelegate::CreateInfoBar() {
221 TranslateInfoBarBase* infobar = NULL;
222 switch (type_) {
223 case BEFORE_TRANSLATE:
224 infobar = new BeforeTranslateInfoBar(this);
225 break;
226 case AFTER_TRANSLATE:
227 infobar = new AfterTranslateInfoBar(this);
228 break;
229 case TRANSLATING:
230 case TRANSLATION_ERROR:
231 infobar = new TranslateMessageInfoBar(this);
232 break;
233 default:
234 NOTREACHED();
235 }
236 infobar->Init();
237 // Set |infobar_view_| so that the model can notify the infobar when it
238 // changes.
239 infobar_view_ = infobar;
240 return infobar;
241 }
OLDNEW

Powered by Google App Engine