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