| Index: chrome/browser/chromeos/input_method/virtual_keyboard_selector.cc
|
| diff --git a/chrome/browser/chromeos/input_method/virtual_keyboard_selector.cc b/chrome/browser/chromeos/input_method/virtual_keyboard_selector.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..cecf854725ffda47735831063966fe1885ed6aa9
|
| --- /dev/null
|
| +++ b/chrome/browser/chromeos/input_method/virtual_keyboard_selector.cc
|
| @@ -0,0 +1,94 @@
|
| +// 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.
|
| +
|
| +#include "chrome/browser/chromeos/input_method/virtual_keyboard_selector.h"
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/stl_util-inl.h"
|
| +
|
| +namespace {
|
| +const char kDefaultURLPath[] = "index.html";
|
| +const size_t kDefaultURLPathLen = arraysize(kDefaultURLPath) - 1;
|
| +} // namespace
|
| +
|
| +namespace chromeos {
|
| +namespace input_method {
|
| +
|
| +GURL VirtualKeyboard::GetURLForLayout(const std::string& layout) const {
|
| + if (layout.empty()) {
|
| + return url_;
|
| + }
|
| + url_canon::Replacements<char> replacements;
|
| + replacements.SetPath(
|
| + kDefaultURLPath, url_parse::Component(0, kDefaultURLPathLen));
|
| + // TODO(yusukes): would be better to URL-encode the |layout|?
|
| + replacements.SetRef(layout.c_str(), url_parse::Component(0, layout.length()));
|
| + return url_.ReplaceComponents(replacements);
|
| +}
|
| +
|
| +VirtualKeyboardSelector::VirtualKeyboardSelector()
|
| + : current_(NULL) {
|
| +}
|
| +
|
| +VirtualKeyboardSelector::~VirtualKeyboardSelector() {
|
| + STLDeleteElements(&keyboards_);
|
| +}
|
| +
|
| +void VirtualKeyboardSelector::AddVirtualKeyboard(
|
| + const GURL& url,
|
| + const std::set<std::string>& supported_layouts,
|
| + bool is_system) {
|
| + const VirtualKeyboard* new_keyboard = new VirtualKeyboard(url,
|
| + supported_layouts,
|
| + is_system);
|
| + if (is_system) {
|
| + system_keyboards_.push_front(new_keyboard);
|
| + } else {
|
| + keyboards_.push_front(new_keyboard);
|
| + }
|
| + current_ =
|
| + keyboards_.empty() ? system_keyboards_.front() : keyboards_.front();
|
| +}
|
| +
|
| +const VirtualKeyboard* VirtualKeyboardSelector::SelectVirtualKeyboard(
|
| + const std::string& layout) {
|
| + if (layout.empty()) {
|
| + LOG(ERROR) << "No layout is specified";
|
| + return NULL;
|
| + }
|
| +
|
| + // First, check whether the current keyboard supports the layout.
|
| + if (current_ && current_->supported_layouts().count(layout) > 0) {
|
| + return current_;
|
| + }
|
| +
|
| + const VirtualKeyboard* keyboard = SelectVirtualKeyboardInternal(layout);
|
| + if (!keyboard) {
|
| + VLOG(1) << "No virtual keyboard for " << layout << " is found";
|
| + return NULL;
|
| + }
|
| +
|
| + current_ = keyboard;
|
| + return keyboard;
|
| +}
|
| +
|
| +const VirtualKeyboard* VirtualKeyboardSelector::SelectVirtualKeyboardInternal(
|
| + const std::string& layout) {
|
| + std::list<const VirtualKeyboard*>::const_iterator iter;
|
| + for (iter = keyboards_.begin(); iter != keyboards_.end(); ++iter) {
|
| + if ((*iter)->supported_layouts().count(layout) > 0) {
|
| + return *iter;
|
| + }
|
| + }
|
| + for (iter = system_keyboards_.begin();
|
| + iter != system_keyboards_.end(); ++iter) {
|
| + if ((*iter)->supported_layouts().count(layout) > 0) {
|
| + return *iter;
|
| + }
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| +} // namespace input_method
|
| +} // namespace chromeos
|
|
|