blob: bb711dfb9e3a02640835cefe72e111aabe58ed64 [file] [log] [blame]
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_TRANSLATE_TRANSLATE_INFOBAR_DELEGATE_H_
#define CHROME_BROWSER_TRANSLATE_TRANSLATE_INFOBAR_DELEGATE_H_
#include <string>
#include <utility>
#include <vector>
#include "base/compiler_specific.h"
#include "base/logging.h"
#include "chrome/browser/infobars/infobar_delegate.h"
#include "chrome/browser/translate/translate_prefs.h"
#include "chrome/browser/translate/translate_ui_delegate.h"
#include "chrome/common/translate/translate_errors.h"
#include "components/translate/common/translate_constants.h"
class PrefService;
// The defaults after which extra shortcuts for options
// can be shown.
struct ShortcutConfiguration {
int always_translate_min_count;
int never_translate_min_count;
};
class TranslateInfoBarDelegate : public InfoBarDelegate {
public:
// The different types of infobars that can be shown for translation.
enum Type {
BEFORE_TRANSLATE,
TRANSLATING,
AFTER_TRANSLATE,
TRANSLATION_ERROR
};
// The types of background color animations.
enum BackgroundAnimationType {
NONE,
NORMAL_TO_ERROR,
ERROR_TO_NORMAL
};
static const size_t kNoIndex;
virtual ~TranslateInfoBarDelegate();
// Factory method to create a translate infobar. |error_type| must be
// specified iff |infobar_type| == TRANSLATION_ERROR. For other infobar
// types, |original_language| and |target_language| must be ASCII language
// codes (e.g. "en", "fr", etc.) for languages the TranslateManager supports
// translating. The lone exception is when the user initiates translation
// from the context menu, in which case it's legal to call this with
// |infobar_type| == TRANSLATING and
// |original_language| == kUnknownLanguageCode.
//
// If |replace_existing_infobar| is true, the infobar is created and added to
// |infobar_service|, replacing any other translate infobar already present
// there. Otherwise, the infobar will only be added if there is no other
// translate infobar already present.
static void Create(bool replace_existing_infobar,
InfoBarService* infobar_service,
Type infobar_type,
const std::string& original_language,
const std::string& target_language,
TranslateErrors::Type error_type,
PrefService* prefs,
const ShortcutConfiguration& shortcut_config);
// Returns the number of languages supported.
size_t num_languages() const { return ui_delegate_.GetNumberOfLanguages(); }
// Returns the ISO code for the language at |index|.
std::string language_code_at(size_t index) const {
return ui_delegate_.GetLanguageCodeAt(index);
}
// Returns the displayable name for the language at |index|.
string16 language_name_at(size_t index) const {
return ui_delegate_.GetLanguageNameAt(index);
}
Type infobar_type() const { return infobar_type_; }
TranslateErrors::Type error_type() const { return error_type_; }
size_t original_language_index() const {
return ui_delegate_.GetOriginalLanguageIndex();
}
void set_original_language_index(size_t language_index) {
ui_delegate_.SetOriginalLanguageIndex(language_index);
}
size_t target_language_index() const {
return ui_delegate_.GetTargetLanguageIndex();
}
void set_target_language_index(size_t language_index) {
ui_delegate_.SetTargetLanguageIndex(language_index);
}
// Convenience methods.
std::string original_language_code() const {
return ui_delegate_.GetOriginalLanguageCode();
}
std::string target_language_code() const {
return ui_delegate_.GetTargetLanguageCode();
}
// Returns true if the current infobar indicates an error (in which case it
// should get a yellow background instead of a blue one).
bool is_error() const { return infobar_type_ == TRANSLATION_ERROR; }
// Returns what kind of background fading effect the infobar should use when
// its is shown.
BackgroundAnimationType background_animation_type() const {
return background_animation_;
}
virtual void Translate();
virtual void RevertTranslation();
void ReportLanguageDetectionError();
// Called when the user declines to translate a page, by either closing the
// infobar or pressing the "Don't translate" button.
virtual void TranslationDeclined();
// Methods called by the Options menu delegate.
virtual bool IsTranslatableLanguageByPrefs();
virtual void ToggleTranslatableLanguageByPrefs();
virtual bool IsSiteBlacklisted();
virtual void ToggleSiteBlacklist();
virtual bool ShouldAlwaysTranslate();
virtual void ToggleAlwaysTranslate();
// Methods called by the extra-buttons that can appear on the "before
// translate" infobar (when the user has accepted/declined the translation
// several times).
void AlwaysTranslatePageLanguage();
void NeverTranslatePageLanguage();
// The following methods are called by the infobar that displays the status
// while translating and also the one displaying the error message.
string16 GetMessageInfoBarText();
string16 GetMessageInfoBarButtonText();
void MessageInfoBarButtonPressed();
bool ShouldShowMessageInfoBarButton();
// Called by the before translate infobar to figure-out if it should show
// an extra shortcut to let the user black-list/white-list that language
// (based on how many times the user accepted/declined translation).
// The shortcut itself is platform specific, it can be a button or a new bar
// for example.
bool ShouldShowNeverTranslateShortcut();
bool ShouldShowAlwaysTranslateShortcut();
// Convenience method that returns the displayable language name for
// |language_code| in the current application locale.
static string16 GetLanguageDisplayableName(const std::string& language_code);
// Adds the strings that should be displayed in the after translate infobar to
// |strings|. If |autodetermined_source_language| is false, the text in that
// infobar is:
// "The page has been translated from <lang1> to <lang2>."
// Otherwise:
// "The page has been translated to <lang1>."
// Because <lang1>, or <lang1> and <lang2> are displayed in menu buttons, the
// text is split in 2 or 3 chunks. |swap_languages| is set to true if
// |autodetermined_source_language| is false, and <lang1> and <lang2>
// should be inverted (some languages express the sentense as "The page has
// been translate to <lang2> from <lang1>."). It is ignored if
// |autodetermined_source_language| is true.
static void GetAfterTranslateStrings(std::vector<string16>* strings,
bool* swap_languages,
bool autodetermined_source_language);
protected:
TranslateInfoBarDelegate(InfoBarService* infobar_service,
Type infobar_type,
TranslateInfoBarDelegate* old_delegate,
const std::string& original_language,
const std::string& target_language,
TranslateErrors::Type error_type,
PrefService* prefs,
ShortcutConfiguration shortcut_config);
private:
typedef std::pair<std::string, string16> LanguageNamePair;
// InfoBarDelegate:
virtual InfoBar* CreateInfoBar(InfoBarService* infobar_service) OVERRIDE;
virtual void InfoBarDismissed() OVERRIDE;
virtual int GetIconID() const OVERRIDE;
virtual InfoBarDelegate::Type GetInfoBarType() const OVERRIDE;
virtual bool ShouldExpire(
const content::LoadCommittedDetails& details) const OVERRIDE;
virtual TranslateInfoBarDelegate* AsTranslateInfoBarDelegate() OVERRIDE;
Type infobar_type_;
// The type of fading animation if any that should be used when showing this
// infobar.
BackgroundAnimationType background_animation_;
TranslateUIDelegate ui_delegate_;
// The error that occurred when trying to translate (NONE if no error).
TranslateErrors::Type error_type_;
// The translation related preferences.
TranslatePrefs prefs_;
// Translation shortcut configuration
ShortcutConfiguration shortcut_config_;
DISALLOW_COPY_AND_ASSIGN(TranslateInfoBarDelegate);
};
#endif // CHROME_BROWSER_TRANSLATE_TRANSLATE_INFOBAR_DELEGATE_H_