• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef CHROME_BROWSER_TRANSLATE_TRANSLATE_INFOBAR_DELEGATE_H_
6 #define CHROME_BROWSER_TRANSLATE_TRANSLATE_INFOBAR_DELEGATE_H_
7 #pragma once
8 
9 #include <string>
10 #include <vector>
11 
12 #include "chrome/browser/tab_contents/confirm_infobar_delegate.h"
13 #include "chrome/browser/translate/translate_prefs.h"
14 #include "chrome/common/translate_errors.h"
15 
16 class SkBitmap;
17 class TranslateInfoBarView;
18 
19 class TranslateInfoBarDelegate : public InfoBarDelegate {
20  public:
21   // The different types of infobars that can be shown for translation.
22   enum Type {
23     BEFORE_TRANSLATE,
24     TRANSLATING,
25     AFTER_TRANSLATE,
26     TRANSLATION_ERROR
27   };
28 
29   // The types of background color animations.
30   enum BackgroundAnimationType {
31     NONE,
32     NORMAL_TO_ERROR,
33     ERROR_TO_NORMAL
34   };
35 
36   static const size_t kNoIndex;
37 
38   // Factory method to create a non-error translate infobar.
39   // The original and target language specified are the ASCII language codes
40   // (ex: en, fr...).
41   // Returns NULL if it failed, typically if |original_language| or
42   // |target_language| is not a supported language.
43   static TranslateInfoBarDelegate* CreateDelegate(
44       Type infobar_type,
45       TabContents* tab_contents,
46       const std::string& original_language,
47       const std::string& target_language);
48 
49   // Factory method to create an error translate infobar.
50   static TranslateInfoBarDelegate* CreateErrorDelegate(
51       TranslateErrors::Type error_type,
52       TabContents* tab_contents,
53       const std::string& original_language,
54       const std::string& target_language);
55 
56   virtual ~TranslateInfoBarDelegate();
57 
58   // Returns the number of languages supported.
GetLanguageCount()59   size_t GetLanguageCount() const { return languages_.size(); }
60 
61   // Returns the ISO code for the language at |index|.
62   std::string GetLanguageCodeAt(size_t index) const;
63 
64   // Returns the displayable name for the language at |index|.
65   string16 GetLanguageDisplayableNameAt(size_t index) const;
66 
tab_contents()67   TabContents* tab_contents() const { return tab_contents_; }
68 
type()69   Type type() const { return type_; }
70 
error()71   TranslateErrors::Type error() const { return error_; }
72 
original_language_index()73   size_t original_language_index() const { return original_language_index_; }
target_language_index()74   size_t target_language_index() const { return target_language_index_; }
75 
76   // Convenience methods.
77   std::string GetOriginalLanguageCode() const;
78   std::string GetTargetLanguageCode() const;
79 
80   // Called by the InfoBar to notify that the original/target language has
81   // changed and is now the language at |language_index|.
82   virtual void SetOriginalLanguage(size_t language_index);
83   virtual void SetTargetLanguage(size_t language_index);
84 
85   // Returns true if the current infobar indicates an error (in which case it
86   // should get a yellow background instead of a blue one).
IsError()87   bool IsError() const { return type_ == TRANSLATION_ERROR; }
88 
89   // Returns what kind of background fading effect the infobar should use when
90   // its is shown.
background_animation_type()91   BackgroundAnimationType background_animation_type() const {
92     return background_animation_;
93   }
94 
95   virtual void Translate();
96   virtual void RevertTranslation();
97   virtual void ReportLanguageDetectionError();
98 
99   // Called when the user declines to translate a page, by either closing the
100   // infobar or pressing the "Don't translate" button.
101   void TranslationDeclined();
102 
103   // Methods called by the Options menu delegate.
104   virtual bool IsLanguageBlacklisted();
105   virtual void ToggleLanguageBlacklist();
106   virtual bool IsSiteBlacklisted();
107   virtual void ToggleSiteBlacklist();
108   virtual bool ShouldAlwaysTranslate();
109   virtual void ToggleAlwaysTranslate();
110 
111   // Methods called by the extra-buttons that can appear on the "before
112   // translate" infobar (when the user has accepted/declined the translation
113   // several times).
114   virtual void AlwaysTranslatePageLanguage();
115   virtual void NeverTranslatePageLanguage();
116 
117   // The following methods are called by the infobar that displays the status
118   // while translating and also the one displaying the error message.
119   string16 GetMessageInfoBarText();
120   string16 GetMessageInfoBarButtonText();
121   void MessageInfoBarButtonPressed();
122   bool ShouldShowMessageInfoBarButton();
123 
124   // Called by the before translate infobar to figure-out if it should show
125   // an extra button to let the user black-list/white-list that language (based
126   // on how many times the user accepted/declined translation).
127   bool ShouldShowNeverTranslateButton();
128   bool ShouldShowAlwaysTranslateButton();
129 
130   // Sets this infobar background animation based on the previous infobar shown.
131   // A fading background effect is used when transitioning from a normal state
132   // to an error state (and vice-versa).
133   void UpdateBackgroundAnimation(TranslateInfoBarDelegate* previous_infobar);
134 
135   // Convenience method that returns the displayable language name for
136   // |language_code| in the current application locale.
137   static string16 GetLanguageDisplayableName(const std::string& language_code);
138 
139   // Adds the strings that should be displayed in the after translate infobar to
140   // |strings|. The text in that infobar is:
141   // "The page has been translated from <lang1> to <lang2>."
142   // Because <lang1> and <lang2> are displayed in menu buttons, the text is
143   // split in 3 chunks.  |swap_languages| is set to true if <lang1> and <lang2>
144   // should be inverted (some languages express the sentense as "The page has
145   // been translate to <lang2> from <lang1>.").
146   static void GetAfterTranslateStrings(std::vector<string16>* strings,
147                                        bool* swap_languages);
148 
149  protected:
150   // For testing.
151   TranslateInfoBarDelegate(Type infobar_type,
152                            TranslateErrors::Type error,
153                            TabContents* tab_contents,
154                            const std::string& original_language,
155                            const std::string& target_language);
156   Type type_;
157 
158  private:
159   typedef std::pair<std::string, string16> LanguageNamePair;
160 
161   // InfoBarDelegate:
162   virtual InfoBar* CreateInfoBar();
163   virtual void InfoBarDismissed();
164   virtual void InfoBarClosed();
165   virtual SkBitmap* GetIcon() const;
166   virtual InfoBarDelegate::Type GetInfoBarType() const;
167   virtual TranslateInfoBarDelegate* AsTranslateInfoBarDelegate();
168 
169   // Gets the host of the page being translated, or an empty string if no URL is
170   // associated with the current page.
171   std::string GetPageHost();
172 
173   // The type of fading animation if any that should be used when showing this
174   // infobar.
175   BackgroundAnimationType background_animation_;
176 
177   TabContents* tab_contents_;
178 
179   // The list supported languages for translation.
180   // The pair first string is the language ISO code (ex: en, fr...), the second
181   // string is the displayable name on the current locale.
182   // The languages are sorted alphabetically based on the displayable name.
183   std::vector<LanguageNamePair> languages_;
184 
185   // The index for language the page is originally in.
186   size_t original_language_index_;
187 
188   // The index for language the page is originally in that was originally
189   // reported (original_language_index_ changes if the user selects a new
190   // original language, but this one does not).  This is necessary to report
191   // language detection errors with the right original language even if the user
192   // changed the original language.
193   size_t initial_original_language_index_;
194 
195   // The index for language the page should be translated to.
196   size_t target_language_index_;
197 
198   // The error that occurred when trying to translate (NONE if no error).
199   TranslateErrors::Type error_;
200 
201   // The current infobar view.
202   TranslateInfoBarView* infobar_view_;
203 
204   // The translation related preferences.
205   TranslatePrefs prefs_;
206 
207   DISALLOW_COPY_AND_ASSIGN(TranslateInfoBarDelegate);
208 };
209 
210 #endif  // CHROME_BROWSER_TRANSLATE_TRANSLATE_INFOBAR_DELEGATE_H_
211