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.
5 #include "chrome/browser/ui/toolbar/encoding_menu_controller.h"
7 #include "base/i18n/rtl.h"
8 #include "base/prefs/pref_service.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "chrome/app/chrome_command_ids.h"
11 #include "chrome/browser/browser_process.h"
12 #include "chrome/browser/character_encoding.h"
13 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/common/pref_names.h"
15 #include "chrome/grit/generated_resources.h"
16 #include "ui/base/l10n/l10n_util.h"
18 const int EncodingMenuController::kValidEncodingIds[] = {
21 IDC_ENCODING_WINDOWS1252,
25 IDC_ENCODING_BIG5HKSCS,
27 IDC_ENCODING_SHIFTJIS,
28 IDC_ENCODING_ISO2022JP,
31 IDC_ENCODING_ISO885915,
32 IDC_ENCODING_MACINTOSH,
33 IDC_ENCODING_ISO88592,
34 IDC_ENCODING_WINDOWS1250,
35 IDC_ENCODING_ISO88595,
36 IDC_ENCODING_WINDOWS1251,
39 IDC_ENCODING_ISO88597,
40 IDC_ENCODING_WINDOWS1253,
41 IDC_ENCODING_ISO88594,
42 IDC_ENCODING_ISO885913,
43 IDC_ENCODING_WINDOWS1257,
44 IDC_ENCODING_ISO88593,
45 IDC_ENCODING_ISO885910,
46 IDC_ENCODING_ISO885914,
47 IDC_ENCODING_ISO885916,
48 IDC_ENCODING_WINDOWS1254,
49 IDC_ENCODING_ISO88596,
50 IDC_ENCODING_WINDOWS1256,
51 IDC_ENCODING_ISO88598,
52 IDC_ENCODING_WINDOWS1255,
53 IDC_ENCODING_WINDOWS1258,
54 IDC_ENCODING_ISO88598I,
57 bool EncodingMenuController::DoesCommandBelongToEncodingMenu(int id) {
58 if (id == IDC_ENCODING_AUTO_DETECT) {
62 for (size_t i = 0; i < arraysize(kValidEncodingIds); ++i) {
63 if (id == kValidEncodingIds[i]) {
71 const int* EncodingMenuController::ValidGUIEncodingIDs() {
72 return kValidEncodingIds;
75 int EncodingMenuController::NumValidGUIEncodingIDs() {
76 return arraysize(kValidEncodingIds);
79 bool EncodingMenuController::IsItemChecked(
80 Profile* browser_profile,
81 const std::string& current_tab_encoding,
83 if (!DoesCommandBelongToEncodingMenu(item_id))
86 std::string encoding = current_tab_encoding;
88 encoding = browser_profile->GetPrefs()->GetString(prefs::kDefaultCharset);
90 if (item_id == IDC_ENCODING_AUTO_DETECT) {
91 return browser_profile->GetPrefs()->GetBoolean(
92 prefs::kWebKitUsesUniversalDetector);
95 if (!encoding.empty()) {
97 CharacterEncoding::GetCanonicalEncodingNameByCommandId(item_id);
103 void EncodingMenuController::GetEncodingMenuItems(Profile* profile,
104 EncodingMenuItemList* menu_items) {
107 EncodingMenuItem separator(0, base::string16());
110 menu_items->push_back(
111 EncodingMenuItem(IDC_ENCODING_AUTO_DETECT,
112 l10n_util::GetStringUTF16(IDS_ENCODING_AUTO_DETECT)));
113 menu_items->push_back(separator);
115 // Create current display encoding list.
116 const std::vector<CharacterEncoding::EncodingInfo>* encodings;
118 // Build the list of encoding ids : It is made of the
119 // locale-dependent short list, the cache of recently selected
120 // encodings and other encodings.
121 encodings = CharacterEncoding::GetCurrentDisplayEncodings(
122 g_browser_process->GetApplicationLocale(),
123 profile->GetPrefs()->GetString(prefs::kStaticEncodings),
124 profile->GetPrefs()->GetString(prefs::kRecentlySelectedEncoding));
126 DCHECK(!encodings->empty());
128 // Build up output list for menu.
129 std::vector<CharacterEncoding::EncodingInfo>::const_iterator it;
130 for (it = encodings->begin(); it != encodings->end(); ++it) {
131 if (it->encoding_id) {
132 base::string16 encoding = it->encoding_display_name;
133 base::i18n::AdjustStringForLocaleDirection(&encoding);
134 menu_items->push_back(EncodingMenuItem(it->encoding_id, encoding));
136 menu_items->push_back(separator);