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