| Index: chrome/browser/chromeos/language_menu_button.cc
|
| ===================================================================
|
| --- chrome/browser/chromeos/language_menu_button.cc (revision 0)
|
| +++ chrome/browser/chromeos/language_menu_button.cc (revision 0)
|
| @@ -0,0 +1,241 @@
|
| +// 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/chromeos/language_menu_button.h"
|
| +
|
| +#include <string>
|
| +
|
| +#include "app/l10n_util.h"
|
| +#include "app/resource_bundle.h"
|
| +#include "base/time.h"
|
| +#include "chrome/browser/browser.h"
|
| +#include "grit/generated_resources.h"
|
| +#include "grit/theme_resources.h"
|
| +
|
| +namespace {
|
| +
|
| +const int kRadioGroupNone = 0;
|
| +const int kRadioGroupLanguage = 1;
|
| +const size_t kMaxLanguageNameLen = 7;
|
| +const wchar_t kSpacer[] = L"MMMMMMM";
|
| +
|
| +// Returns true if the |index| points to the "Configure IME" menu item.
|
| +bool IsIndexShowControlPanel(
|
| + int index, chromeos::InputLanguageList* language_list) {
|
| + DCHECK_GE(index, 0);
|
| + if (language_list->empty()) {
|
| + // If language_list is empty, then there's no separator. So "Configure IME"
|
| + // should be at index 0.
|
| + DCHECK_EQ(index, 0);
|
| + return index == 0;
|
| + }
|
| + return static_cast<size_t>(index) == (language_list->size() + 1);
|
| +}
|
| +
|
| +// Converts chromeos::InputLanguage object into human readable string. Returns
|
| +// a string for the drop-down menu if |for_menu| is true. Otherwise, returns a
|
| +// string for the status area.
|
| +std::string FormatInputLanguage(
|
| + const chromeos::InputLanguage& language, bool for_menu) {
|
| + std::string formatted = language.display_name;
|
| + if (formatted.empty()) {
|
| + formatted = language.id;
|
| + }
|
| + if (for_menu) {
|
| + switch (language.category) {
|
| + case chromeos::LANGUAGE_CATEGORY_XKB:
|
| + // TODO(yusukes): Use message catalog.
|
| + formatted += " (Layout)";
|
| + break;
|
| + case chromeos::LANGUAGE_CATEGORY_IME:
|
| + // TODO(yusukes): Use message catalog.
|
| + formatted += " (IME)";
|
| + break;
|
| + }
|
| + } else {
|
| + // For status area. Trim the string.
|
| + formatted = formatted.substr(0, kMaxLanguageNameLen);
|
| + // TODO(yusukes): Simple substr() does not work for non-ASCII string.
|
| + // TODO(yusukes): How can we ensure that the trimmed string does not
|
| + // overflow the area?
|
| + }
|
| + return formatted;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +namespace chromeos {
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// LanguageMenuButton
|
| +
|
| +LanguageMenuButton::LanguageMenuButton(Browser* browser)
|
| + : MenuButton(NULL, std::wstring(), this, false),
|
| + language_list_(LanguageLibrary::Get()->GetLanguages()),
|
| + // Since the constructor of |language_menu_| calls this->GetItemCount(),
|
| + // we have to initialize |language_list_| before hand.
|
| + ALLOW_THIS_IN_INITIALIZER_LIST(language_menu_(this)),
|
| + browser_(browser) {
|
| + DCHECK(language_list_.get() && !language_list_->empty());
|
| + // Grab the real estate.
|
| + UpdateIcon(kSpacer);
|
| + // Display the default XKB name (usually "US").
|
| + const std::string name = FormatInputLanguage(language_list_->at(0), false);
|
| + UpdateIcon(UTF8ToWide(name));
|
| + LanguageLibrary::Get()->AddObserver(this);
|
| +}
|
| +
|
| +LanguageMenuButton::~LanguageMenuButton() {
|
| + LanguageLibrary::Get()->RemoveObserver(this);
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// LanguageMenuButton, menus::MenuModel implementation:
|
| +
|
| +int LanguageMenuButton::GetCommandIdAt(int index) const {
|
| + return index; // dummy
|
| +}
|
| +
|
| +bool LanguageMenuButton::IsLabelDynamicAt(int index) const {
|
| + // Menu content for the language button could change time by time.
|
| + return true;
|
| +}
|
| +
|
| +bool LanguageMenuButton::GetAcceleratorAt(
|
| + int index, menus::Accelerator* accelerator) const {
|
| + // Views for Chromium OS does not support accelerators yet.
|
| + return false;
|
| +}
|
| +
|
| +bool LanguageMenuButton::IsItemCheckedAt(int index) const {
|
| + DCHECK_GE(index, 0);
|
| + DCHECK(language_list_.get());
|
| + if (static_cast<size_t>(index) < language_list_->size()) {
|
| + const InputLanguage& language = language_list_->at(index);
|
| + return language == LanguageLibrary::Get()->current_language();
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +int LanguageMenuButton::GetGroupIdAt(int index) const {
|
| + DCHECK_GE(index, 0);
|
| + DCHECK(language_list_.get());
|
| + if (static_cast<size_t>(index) < language_list_->size()) {
|
| + return kRadioGroupLanguage;
|
| + }
|
| + return kRadioGroupNone;
|
| +}
|
| +
|
| +bool LanguageMenuButton::HasIcons() const {
|
| + // TODO(yusukes): Display IME icons.
|
| + return false;
|
| +}
|
| +
|
| +bool LanguageMenuButton::GetIconAt(int index, SkBitmap* icon) const {
|
| + return false;
|
| +}
|
| +
|
| +bool LanguageMenuButton::IsEnabledAt(int index) const {
|
| + // Just return true so all IMEs and XLB layouts listed could be clicked.
|
| + return true;
|
| +}
|
| +
|
| +menus::MenuModel* LanguageMenuButton::GetSubmenuModelAt(int index) const {
|
| + return NULL;
|
| +}
|
| +
|
| +void LanguageMenuButton::HighlightChangedTo(int index) {
|
| + // Views for Chromium OS does not support this interface yet.
|
| +}
|
| +
|
| +void LanguageMenuButton::MenuWillShow() {
|
| + // Views for Chromium OS does not support this interface yet.
|
| +}
|
| +
|
| +int LanguageMenuButton::GetItemCount() const {
|
| + DCHECK(language_list_.get());
|
| + if (language_list_->empty()) {
|
| + return 1; // no separator; "Configure IME" only
|
| + }
|
| + return language_list_->size() + 2; // separator + "Configure IME"
|
| +}
|
| +
|
| +menus::MenuModel::ItemType LanguageMenuButton::GetTypeAt(int index) const {
|
| + DCHECK_GE(index, 0);
|
| + DCHECK(language_list_.get());
|
| + if (IsIndexShowControlPanel(index, language_list_.get())) {
|
| + return menus::MenuModel::TYPE_COMMAND; // "Configure IME"
|
| + }
|
| + if (static_cast<size_t>(index) < language_list_->size()) {
|
| + return menus::MenuModel::TYPE_RADIO;
|
| + }
|
| +
|
| + DCHECK_EQ(static_cast<size_t>(index), language_list_->size());
|
| + return menus::MenuModel::TYPE_SEPARATOR;
|
| +}
|
| +
|
| +string16 LanguageMenuButton::GetLabelAt(int index) const {
|
| + DCHECK_GE(index, 0);
|
| + DCHECK(language_list_.get());
|
| + if (IsIndexShowControlPanel(index, language_list_.get())) {
|
| + // TODO(yusukes): Use message catalog.
|
| + return WideToUTF16(L"Configure IME...");
|
| + }
|
| + if (static_cast<size_t>(index) < language_list_->size()) {
|
| + std::string name = FormatInputLanguage(language_list_->at(index), true);
|
| + return UTF8ToUTF16(name);
|
| + }
|
| + NOTREACHED();
|
| + return WideToUTF16(L"");
|
| +}
|
| +
|
| +void LanguageMenuButton::ActivatedAt(int index) {
|
| + DCHECK_GE(index, 0);
|
| + DCHECK(language_list_.get());
|
| + if (IsIndexShowControlPanel(index, language_list_.get())) {
|
| + browser_->ShowControlPanel();
|
| + return;
|
| + }
|
| + if (static_cast<size_t>(index) < language_list_->size()) {
|
| + const InputLanguage& language = language_list_->at(index);
|
| + LanguageLibrary::Get()->ChangeLanguage(language.category, language.id);
|
| + return;
|
| + }
|
| + NOTREACHED();
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// LanguageMenuButton, views::ViewMenuDelegate implementation:
|
| +
|
| +void LanguageMenuButton::RunMenu(views::View* source, const gfx::Point& pt) {
|
| + language_list_.reset(LanguageLibrary::Get()->GetLanguages());
|
| + language_menu_.Rebuild();
|
| + language_menu_.UpdateStates();
|
| + language_menu_.RunMenuAt(pt, views::Menu2::ALIGN_TOPRIGHT);
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// LanguageMenuButton, PowerLibrary::Observer implementation:
|
| +
|
| +void LanguageMenuButton::LanguageChanged(LanguageLibrary* obj) {
|
| + const std::string name = FormatInputLanguage(obj->current_language(), false);
|
| + UpdateIcon(UTF8ToWide(name));
|
| +}
|
| +
|
| +void LanguageMenuButton::UpdateIcon(const std::wstring& name) {
|
| + set_border(NULL);
|
| + SetFont(ResourceBundle::GetSharedInstance().GetFont(
|
| + ResourceBundle::BaseFont).DeriveFont(0, gfx::Font::BOLD));
|
| + SetEnabledColor(SK_ColorWHITE);
|
| + SetShowHighlighted(false);
|
| + SetText(name);
|
| + // TODO(yusukes): Show icon on the status area?
|
| + set_alignment(TextButton::ALIGN_RIGHT);
|
| + SchedulePaint();
|
| +}
|
| +
|
| +// TODO(yusukes): Register and handle hotkeys for IME and XKB switching?
|
| +
|
| +} // namespace chromeos
|
| +
|
|
|
| Property changes on: chrome/browser/chromeos/language_menu_button.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|