1 /*
2 This file is part of GammaRay, the Qt application inspection and
3 manipulation tool.
4
5 Copyright (C) 2011-2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com
6 Author: Stephen Kelly <stephen.kelly@kdab.com>
7
8 Licensees holding valid commercial KDAB GammaRay licenses may use this file in
9 accordance with GammaRay Commercial License Agreement provided with the Software.
10
11 Contact info@kdab.com if any conditions of this licensing are not clear to you.
12
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation, either version 2 of the License, or
16 (at your option) any later version.
17
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program. If not, see <http://www.gnu.org/licenses/>.
25 */
26
27 #include "localedataaccessor.h"
28
29 #include <QStringList>
30
31 using namespace GammaRay;
32
dayNamesToString(const QLocale & locale,QString (QLocale::* accessor)(int,QLocale::FormatType)const,QLocale::FormatType type)33 static QString dayNamesToString(const QLocale &locale, QString (QLocale::*accessor)(int,
34 QLocale::FormatType) const,
35 QLocale::FormatType type)
36 {
37 QStringList result;
38 result.reserve(7);
39 for (int i = 1; i <= 7; ++i)
40 result.push_back((locale.*accessor)(i, type));
41 return result.join(QStringLiteral(", "));
42 }
43
monthNamesToString(const QLocale & locale,QString (QLocale::* accessor)(int,QLocale::FormatType)const,QLocale::FormatType type)44 static QString monthNamesToString(const QLocale &locale, QString (QLocale::*accessor)(int,
45 QLocale::FormatType) const,
46 QLocale::FormatType type)
47 {
48 QStringList result;
49 result.reserve(12);
50 for (int i = 1; i <= 12; ++i)
51 result.push_back((locale.*accessor)(i, type));
52 return result.join(QStringLiteral(", "));
53 }
54
LocaleDataAccessorRegistry(QObject * parent)55 LocaleDataAccessorRegistry::LocaleDataAccessorRegistry(QObject *parent)
56 : QObject(parent)
57 {
58 init();
59 }
60
~LocaleDataAccessorRegistry()61 LocaleDataAccessorRegistry::~LocaleDataAccessorRegistry()
62 {
63 qDeleteAll(m_accessors);
64 }
65
accessors()66 QVector< LocaleDataAccessor * > LocaleDataAccessorRegistry::accessors()
67 {
68 return m_accessors;
69 }
70
enabledAccessors()71 QVector< LocaleDataAccessor * > LocaleDataAccessorRegistry::enabledAccessors()
72 {
73 return m_enabledAccessors;
74 }
75
registerAccessor(LocaleDataAccessor * accessor)76 void LocaleDataAccessorRegistry::registerAccessor(LocaleDataAccessor *accessor)
77 {
78 m_accessors.push_back(accessor);
79 }
80
setAccessorEnabled(LocaleDataAccessor * accessor,bool enabled)81 void LocaleDataAccessorRegistry::setAccessorEnabled(LocaleDataAccessor *accessor, bool enabled)
82 {
83 QVector< LocaleDataAccessor * > &accessors = m_enabledAccessors;
84 if (enabled && !accessors.contains(accessor)) {
85 accessors.push_back(accessor);
86 emit accessorAdded();
87 } else {
88 int idx = accessors.indexOf(accessor);
89 if (idx >= 0) {
90 accessors.remove(idx);
91 emit accessorRemoved(idx);
92 }
93 }
94 }
95
init()96 void LocaleDataAccessorRegistry::init()
97 {
98 LOCALE_SIMPLE_DEFAULT_ACCESSOR(Name,
99 return locale.name();
100 )
101
102 LOCALE_SIMPLE_DEFAULT_ACCESSOR(Language,
103 return QLocale::languageToString(locale.language());
104 )
105
106 LOCALE_SIMPLE_DEFAULT_ACCESSOR(Country,
107 return QLocale::countryToString(locale.country());
108 )
109
110 LOCALE_SIMPLE_ACCESSOR(Script,
111 return QLocale::scriptToString(locale.script());
112 )
113
114 LOCALE_SIMPLE_ACCESSOR(Currency,
115 return locale.currencySymbol(QLocale::CurrencySymbol)
116 +QLatin1String(" (")
117 +locale.currencySymbol(QLocale::CurrencyIsoCode)
118 +QLatin1String(") - ")
119 +locale.currencySymbol(QLocale::CurrencyDisplayName);
120 )
121
122 LOCALE_SIMPLE_ACCESSOR(TextDirection,
123 return locale.textDirection() == Qt::LeftToRight ? QStringLiteral(
124 "LTR") : QStringLiteral("RTL");
125 )
126
127 LOCALE_SIMPLE_DEFAULT_ACCESSOR(TimeFormatLong,
128 return locale.timeFormat(QLocale::LongFormat);
129 )
130
131 LOCALE_SIMPLE_ACCESSOR(TimeFormatShort,
132 return locale.timeFormat(QLocale::ShortFormat);
133 )
134
135 LOCALE_SIMPLE_ACCESSOR(TimeFormatNarrow,
136 return locale.timeFormat(QLocale::NarrowFormat);
137 )
138
139 LOCALE_SIMPLE_DEFAULT_ACCESSOR(DateFormatLong,
140 return locale.dateFormat(QLocale::LongFormat);
141 )
142
143 LOCALE_SIMPLE_ACCESSOR(DateFormatShort,
144 return locale.dateFormat(QLocale::ShortFormat);
145 )
146
147 LOCALE_SIMPLE_ACCESSOR(DateFormatNarrow,
148 return locale.dateFormat(QLocale::NarrowFormat);
149 )
150
151 LOCALE_SIMPLE_DEFAULT_ACCESSOR(DateTimeFormatLong,
152 return locale.dateTimeFormat(QLocale::LongFormat);
153 )
154
155 LOCALE_SIMPLE_ACCESSOR(DateTimeFormatShort,
156 return locale.dateTimeFormat(QLocale::ShortFormat);
157 )
158
159 LOCALE_SIMPLE_ACCESSOR(DateTimeFormatNarrow,
160 return locale.dateTimeFormat(QLocale::NarrowFormat);
161 )
162
163 LOCALE_SIMPLE_ACCESSOR(AmText,
164 return locale.amText();
165 )
166
167 LOCALE_SIMPLE_ACCESSOR(PmText,
168 return locale.pmText();
169 )
170
171 LOCALE_SIMPLE_ACCESSOR(DayNamesLong,
172 return dayNamesToString(locale, &QLocale::dayName, QLocale::LongFormat);
173 )
174
175 LOCALE_SIMPLE_ACCESSOR(DayNamesNarrow,
176 return dayNamesToString(locale, &QLocale::dayName,
177 QLocale::NarrowFormat);
178 )
179
180 LOCALE_SIMPLE_ACCESSOR(DayNamesShort,
181 return dayNamesToString(locale, &QLocale::dayName, QLocale::ShortFormat);
182 )
183
184 LOCALE_SIMPLE_ACCESSOR(StandaloneDayNamesLong,
185 return dayNamesToString(locale, &QLocale::standaloneDayName,
186 QLocale::LongFormat);
187 )
188
189 LOCALE_SIMPLE_ACCESSOR(StandaloneDayNamesNarrow,
190 return dayNamesToString(locale, &QLocale::standaloneDayName,
191 QLocale::NarrowFormat);
192 )
193
194 LOCALE_SIMPLE_ACCESSOR(StandaloneDayNamesShort,
195 return dayNamesToString(locale, &QLocale::standaloneDayName,
196 QLocale::ShortFormat);
197 )
198
199 LOCALE_SIMPLE_DEFAULT_ACCESSOR(FirstDayOfWeek,
200 return QLocale().dayName(locale.firstDayOfWeek());
201 )
202
203 LOCALE_SIMPLE_DEFAULT_ACCESSOR(WeekDays,
204 const auto wds = locale.weekdays();
205 QStringList resultList;
206 resultList.reserve(wds.size());
207 for (Qt::DayOfWeek dayNumber : wds) {
208 resultList << QLocale().dayName(dayNumber);
209 }
210 return QLocale().createSeparatedList(resultList);
211 )
212
213 LOCALE_SIMPLE_ACCESSOR(MonthNamesLong,
214 return monthNamesToString(locale, &QLocale::monthName,
215 QLocale::LongFormat);
216 )
217
218 LOCALE_SIMPLE_ACCESSOR(MonthNamesNarrow,
219 return monthNamesToString(locale, &QLocale::monthName,
220 QLocale::NarrowFormat);
221 )
222
223 LOCALE_SIMPLE_ACCESSOR(MonthNamesShort,
224 return monthNamesToString(locale, &QLocale::monthName,
225 QLocale::ShortFormat);
226 )
227
228 LOCALE_SIMPLE_ACCESSOR(StandaloneMonthNamesLong,
229 return monthNamesToString(locale, &QLocale::standaloneMonthName,
230 QLocale::LongFormat);
231 )
232
233 LOCALE_SIMPLE_ACCESSOR(StandaloneMonthNamesNarrow,
234 return monthNamesToString(locale, &QLocale::standaloneMonthName,
235 QLocale::NarrowFormat);
236 )
237
238 LOCALE_SIMPLE_ACCESSOR(StandaloneMonthNamesLongShort,
239 return monthNamesToString(locale, &QLocale::standaloneMonthName,
240 QLocale::ShortFormat);
241 )
242
243 LOCALE_SIMPLE_ACCESSOR(BCP47,
244 return locale.bcp47Name();
245 )
246
247 LOCALE_SIMPLE_ACCESSOR(NativeCountry,
248 return locale.nativeCountryName();
249 )
250
251 LOCALE_SIMPLE_ACCESSOR(NativeLanguage,
252 return locale.nativeLanguageName();
253 )
254
255 LOCALE_SIMPLE_ACCESSOR(UiLanguages,
256 return locale.uiLanguages().join(QStringLiteral(", "));
257 )
258
259 LOCALE_SIMPLE_DEFAULT_ACCESSOR(MeasurementSystem,
260 return locale.measurementSystem()
261 == QLocale::ImperialSystem ? QStringLiteral(
262 "Imperial") : QStringLiteral("Metric");
263 )
264
265 LOCALE_SIMPLE_DEFAULT_ACCESSOR(FloatFormat,
266 return locale.toString(10000.1);
267 )
268
269 LOCALE_SIMPLE_ACCESSOR(DecimalPoint,
270 return locale.decimalPoint();
271 )
272
273 LOCALE_SIMPLE_ACCESSOR(GroupSeparator,
274 return locale.groupSeparator();
275 )
276
277 LOCALE_SIMPLE_ACCESSOR(Exponential,
278 return locale.exponential();
279 )
280
281 LOCALE_SIMPLE_ACCESSOR(Percent,
282 return locale.percent();
283 )
284
285 LOCALE_SIMPLE_ACCESSOR(PositiveSign,
286 return locale.positiveSign();
287 )
288
289 LOCALE_SIMPLE_ACCESSOR(NegativeSign,
290 return locale.negativeSign();
291 )
292
293 LOCALE_SIMPLE_ACCESSOR(ZeroDigit,
294 return locale.zeroDigit();
295 )
296 }
297