- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / gtk / infobars / after_translate_infobar_gtk.cc
1 // Copyright (c) 2011 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/gtk/infobars/after_translate_infobar_gtk.h"
6
7 #include "base/bind.h"
8 #include "base/message_loop/message_loop.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "chrome/browser/translate/translate_infobar_delegate.h"
11 #include "chrome/browser/ui/gtk/gtk_util.h"
12 #include "grit/generated_resources.h"
13 #include "ui/base/gtk/gtk_hig_constants.h"
14 #include "ui/base/gtk/gtk_signal_registrar.h"
15 #include "ui/base/l10n/l10n_util.h"
16
17 AfterTranslateInfoBar::AfterTranslateInfoBar(
18     InfoBarService* owner,
19     TranslateInfoBarDelegate* delegate)
20     : TranslateInfoBarBase(owner, delegate),
21       weak_factory_(this) {
22 }
23
24 AfterTranslateInfoBar::~AfterTranslateInfoBar() {
25 }
26
27 void AfterTranslateInfoBar::InitWidgets() {
28   TranslateInfoBarBase::InitWidgets();
29
30   bool swapped_language_combos = false;
31   bool autodetermined_source_language =
32       GetDelegate()->original_language_index() ==
33       TranslateInfoBarDelegate::kNoIndex;
34
35   std::vector<string16> strings;
36   TranslateInfoBarDelegate::GetAfterTranslateStrings(
37         &strings, &swapped_language_combos, autodetermined_source_language);
38   DCHECK_EQ(autodetermined_source_language ? 2U : 3U, strings.size());
39
40   GtkWidget* new_hbox = gtk_hbox_new(FALSE, ui::kControlSpacing);
41   gtk_util::CenterWidgetInHBox(hbox(), new_hbox, false, 0);
42
43   size_t original_language_index = GetDelegate()->original_language_index();
44   size_t target_language_index = GetDelegate()->target_language_index();
45   bool exclude_the_other = original_language_index != target_language_index;
46
47   GtkWidget* original_lang_combo = NULL;
48   if (!autodetermined_source_language) {
49     original_lang_combo = CreateLanguageCombobox(
50         original_language_index,
51         exclude_the_other ?
52             target_language_index : TranslateInfoBarDelegate::kNoIndex);
53     signals()->Connect(original_lang_combo, "changed",
54                        G_CALLBACK(&OnOriginalLanguageModifiedThunk), this);
55   }
56   GtkWidget* target_lang_combo = CreateLanguageCombobox(
57       target_language_index,
58       exclude_the_other ? original_language_index :
59                           TranslateInfoBarDelegate::kNoIndex);
60   signals()->Connect(target_lang_combo, "changed",
61                      G_CALLBACK(&OnTargetLanguageModifiedThunk), this);
62
63   gtk_box_pack_start(GTK_BOX(new_hbox), CreateLabel(UTF16ToUTF8(strings[0])),
64                      FALSE, FALSE, 0);
65   gtk_box_pack_start(
66       GTK_BOX(new_hbox),
67       (swapped_language_combos || autodetermined_source_language) ?
68           target_lang_combo : original_lang_combo,
69       FALSE, FALSE, 0);
70   gtk_box_pack_start(GTK_BOX(new_hbox), CreateLabel(UTF16ToUTF8(strings[1])),
71                      FALSE, FALSE, 0);
72   if (!autodetermined_source_language) {
73     gtk_box_pack_start(GTK_BOX(new_hbox),
74                        swapped_language_combos ?
75                            original_lang_combo : target_lang_combo,
76                        FALSE, FALSE, 0);
77     gtk_box_pack_start(GTK_BOX(new_hbox), CreateLabel(UTF16ToUTF8(strings[2])),
78                        FALSE, FALSE, 0);
79   }
80
81   GtkWidget* button = gtk_button_new_with_label(
82       l10n_util::GetStringUTF8(IDS_TRANSLATE_INFOBAR_REVERT).c_str());
83   signals()->Connect(button, "clicked",
84                      G_CALLBACK(&OnRevertPressedThunk), this);
85   gtk_box_pack_start(GTK_BOX(new_hbox), button, FALSE, FALSE, 0);
86 }
87
88 bool AfterTranslateInfoBar::ShowOptionsMenuButton() const {
89   return true;
90 }
91
92 void AfterTranslateInfoBar::SetOriginalLanguage(size_t language_index) {
93   GetDelegate()->UpdateOriginalLanguageIndex(language_index);
94   GetDelegate()->Translate();
95 }
96
97 void AfterTranslateInfoBar::SetTargetLanguage(size_t language_index) {
98   GetDelegate()->UpdateTargetLanguageIndex(language_index);
99   GetDelegate()->Translate();
100 }
101
102 void AfterTranslateInfoBar::OnOriginalLanguageModified(GtkWidget* sender) {
103   size_t index = GetLanguageComboboxActiveId(GTK_COMBO_BOX(sender));
104   if (index == GetDelegate()->original_language_index())
105     return;
106
107   // Setting the language will lead to a new translation that is going to close
108   // the infobar.  This is not OK to do this from the signal handler, so we'll
109   // defer it.
110   base::MessageLoop::current()->PostTask(
111       FROM_HERE,
112       base::Bind(&AfterTranslateInfoBar::SetOriginalLanguage,
113                  weak_factory_.GetWeakPtr(),
114                  index));
115 }
116
117 void AfterTranslateInfoBar::OnTargetLanguageModified(GtkWidget* sender) {
118   size_t index = GetLanguageComboboxActiveId(GTK_COMBO_BOX(sender));
119   if (index == GetDelegate()->target_language_index())
120     return;
121
122   // See comment in OnOriginalLanguageModified on why we use a task.
123   base::MessageLoop::current()->PostTask(
124       FROM_HERE,
125       base::Bind(&AfterTranslateInfoBar::SetTargetLanguage,
126                  weak_factory_.GetWeakPtr(),
127                  index));
128 }
129
130 void AfterTranslateInfoBar::OnRevertPressed(GtkWidget* sender) {
131   GetDelegate()->RevertTranslation();
132 }