text: // Copyright (c) 2009 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.
  
  #include "chrome/browser/ui/toolbar/encoding_menu_controller.h"
  
  #include "base/i18n/rtl.h"
  #include "base/utf_string_conversions.h"
  #include "chrome/app/chrome_command_ids.h"
  #include "chrome/browser/browser_process.h"
  #include "chrome/browser/character_encoding.h"
  #include "chrome/browser/prefs/pref_service.h"
  #include "chrome/browser/profiles/profile.h"
  #include "chrome/common/pref_names.h"
  #include "grit/generated_resources.h"
  #include "ui/base/l10n/l10n_util.h"
  
  const int EncodingMenuController::kValidEncodingIds[] = {
      IDC_ENCODING_UTF8,
      IDC_ENCODING_UTF16LE,
      IDC_ENCODING_ISO88591,
      IDC_ENCODING_WINDOWS1252,
      IDC_ENCODING_GBK,
      IDC_ENCODING_GB18030,
      IDC_ENCODING_BIG5,
      IDC_ENCODING_BIG5HKSCS,
      IDC_ENCODING_KOREAN,
      IDC_ENCODING_SHIFTJIS,
      IDC_ENCODING_ISO2022JP,
      IDC_ENCODING_EUCJP,
      IDC_ENCODING_THAI,
      IDC_ENCODING_ISO885915,
      IDC_ENCODING_MACINTOSH,
      IDC_ENCODING_ISO88592,
      IDC_ENCODING_WINDOWS1250,
      IDC_ENCODING_ISO88595,
      IDC_ENCODING_WINDOWS1251,
      IDC_ENCODING_KOI8R,
      IDC_ENCODING_KOI8U,
      IDC_ENCODING_ISO88597,
      IDC_ENCODING_WINDOWS1253,
      IDC_ENCODING_ISO88594,
      IDC_ENCODING_ISO885913,
      IDC_ENCODING_WINDOWS1257,
      IDC_ENCODING_ISO88593,
      IDC_ENCODING_ISO885910,
      IDC_ENCODING_ISO885914,
      IDC_ENCODING_ISO885916,
      IDC_ENCODING_WINDOWS1254,
      IDC_ENCODING_ISO88596,
      IDC_ENCODING_WINDOWS1256,
      IDC_ENCODING_ISO88598,
      IDC_ENCODING_WINDOWS1255,
      IDC_ENCODING_WINDOWS1258,
      IDC_ENCODING_ISO88598I,
  };
  
  bool EncodingMenuController::DoesCommandBelongToEncodingMenu(int id) {
    if (id == IDC_ENCODING_AUTO_DETECT) {
      return true;
    }
  
    for (size_t i = 0; i < arraysize(kValidEncodingIds); ++i) {
      if (id == kValidEncodingIds[i]) {
        return true;
      }
    }
  
    return false;
  }
  
  const int* EncodingMenuController::ValidGUIEncodingIDs() {
    return kValidEncodingIds;
  }
  
  int EncodingMenuController::NumValidGUIEncodingIDs() {
    return arraysize(kValidEncodingIds);
  }
  
  bool EncodingMenuController::IsItemChecked(
      Profile* browser_profile,
      const std::string& current_tab_encoding,
      int item_id) {
    if (!DoesCommandBelongToEncodingMenu(item_id))
      return false;
  
    std::string encoding = current_tab_encoding;
    if (encoding.empty())
      encoding = browser_profile->GetPrefs()->GetString(prefs::kDefaultCharset);
  
    if (item_id == IDC_ENCODING_AUTO_DETECT) {
      return browser_profile->GetPrefs()->GetBoolean(
          prefs::kWebKitUsesUniversalDetector);
    }
  
    if (!encoding.empty()) {
      return encoding ==
          CharacterEncoding::GetCanonicalEncodingNameByCommandId(item_id);
    }
  
    return false;
  }
  
  void EncodingMenuController::GetEncodingMenuItems(Profile* profile,
      EncodingMenuItemList* menu_items) {
  
    DCHECK(menu_items);
    EncodingMenuItem separator(0, string16());
  
    menu_items->clear();
    menu_items->push_back(
        EncodingMenuItem(IDC_ENCODING_AUTO_DETECT,
                         l10n_util::GetStringUTF16(IDS_ENCODING_AUTO_DETECT)));
    menu_items->push_back(separator);
  
    // Create current display encoding list.
    const std::vector<CharacterEncoding::EncodingInfo>* encodings;
  
    // Build the list of encoding ids : It is made of the
    // locale-dependent short list, the cache of recently selected
    // encodings and other encodings.
    encodings = CharacterEncoding::GetCurrentDisplayEncodings(
        g_browser_process->GetApplicationLocale(),
        profile->GetPrefs()->GetString(prefs::kStaticEncodings),
        profile->GetPrefs()->GetString(prefs::kRecentlySelectedEncoding));
    DCHECK(encodings);
    DCHECK(!encodings->empty());
  
    // Build up output list for menu.
    std::vector<CharacterEncoding::EncodingInfo>::const_iterator it;
    for (it = encodings->begin(); it != encodings->end(); ++it) {
      if (it->encoding_id) {
        string16 encoding = it->encoding_display_name;
        base::i18n::AdjustStringForLocaleDirection(&encoding);
        menu_items->push_back(EncodingMenuItem(it->encoding_id, encoding));
      } else {
        menu_items->push_back(separator);
      }
    }
  }
  