language_order_table_model.cc revision 731df977c0511bca2206b5f333555b1205ff1f43
1// Copyright (c) 2010 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.
4
5#include "chrome/browser/language_order_table_model.h"
6
7#include <set>
8
9#include "app/l10n_util.h"
10#include "app/table_model_observer.h"
11#include "base/string_split.h"
12#include "base/utf_string_conversions.h"
13#include "chrome/browser/browser_process.h"
14
15LanguageOrderTableModel::LanguageOrderTableModel()
16    : observer_(NULL) {
17}
18
19void LanguageOrderTableModel::SetAcceptLanguagesString(
20    const std::string& language_list) {
21  std::vector<std::string> languages_vector;
22  base::SplitString(language_list, ',', &languages_vector);
23  languages_.clear();
24  std::set<std::string> added;
25  for (int i = 0; i < static_cast<int>(languages_vector.size()); i++) {
26    const std::string& language(languages_vector.at(i));
27    if (!language.empty() && added.count(language) == 0) {
28      languages_.push_back(language);
29      added.insert(language);
30    }
31  }
32  if (observer_)
33    observer_->OnModelChanged();
34}
35
36void LanguageOrderTableModel::SetObserver(TableModelObserver* observer) {
37  observer_ = observer;
38}
39
40std::wstring LanguageOrderTableModel::GetText(int row, int column_id) {
41  DCHECK(row >= 0 && row < RowCount());
42  const std::string app_locale = g_browser_process->GetApplicationLocale();
43  return UTF16ToWide(l10n_util::GetDisplayNameForLocale(languages_.at(row),
44                                                        app_locale,
45                                                        true));
46}
47
48bool LanguageOrderTableModel::Add(const std::string& language) {
49  if (language.empty())
50    return false;
51  // Check for selecting duplicated language.
52  for (std::vector<std::string>::const_iterator cit = languages_.begin();
53       cit != languages_.end(); ++cit)
54    if (*cit == language)
55      return false;
56  languages_.push_back(language);
57  if (observer_)
58    observer_->OnItemsAdded(RowCount() - 1, 1);
59  return true;
60}
61
62void LanguageOrderTableModel::Remove(int index) {
63  DCHECK(index >= 0 && index < RowCount());
64  languages_.erase(languages_.begin() + index);
65  if (observer_)
66    observer_->OnItemsRemoved(index, 1);
67}
68
69int LanguageOrderTableModel::GetIndex(const std::string& language) {
70  if (language.empty())
71    return -1;
72
73  int index = 0;
74  for (std::vector<std::string>::const_iterator cit = languages_.begin();
75      cit != languages_.end(); ++cit) {
76    if (*cit == language)
77      return index;
78
79    index++;
80  }
81
82  return -1;
83}
84
85void LanguageOrderTableModel::MoveDown(int index) {
86  if (index < 0 || index >= RowCount() - 1)
87    return;
88  std::string item = languages_.at(index);
89  languages_.erase(languages_.begin() + index);
90  if (index == RowCount() - 1)
91    languages_.push_back(item);
92  else
93    languages_.insert(languages_.begin() + index + 1, item);
94  if (observer_)
95    observer_->OnItemsChanged(0, RowCount());
96}
97
98void LanguageOrderTableModel::MoveUp(int index) {
99  if (index <= 0 || index >= static_cast<int>(languages_.size()))
100    return;
101  std::string item = languages_.at(index);
102  languages_.erase(languages_.begin() + index);
103  languages_.insert(languages_.begin() + index - 1, item);
104  if (observer_)
105    observer_->OnItemsChanged(0, RowCount());
106}
107
108std::string LanguageOrderTableModel::GetLanguageList() {
109  return JoinString(languages_, ',');
110}
111
112int LanguageOrderTableModel::RowCount() {
113  return static_cast<int>(languages_.size());
114}
115