1/****************************************************************************
2**
3** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
4** Contact: http://www.qt-project.org/legal
5**
6** This file is part of the QtGui module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and Digia. For licensing terms and
14** conditions see http://qt.digia.com/licensing. For further information
15** use the contact form at http://qt.digia.com/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 2.1 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 2.1 requirements
23** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24**
25** In addition, as a special exception, Digia gives you certain additional
26** rights. These rights are described in the Digia Qt LGPL Exception
27** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28**
29** GNU General Public License Usage
30** Alternatively, this file may be used under the terms of the GNU
31** General Public License version 3.0 as published by the Free Software
32** Foundation and appearing in the file LICENSE.GPL included in the
33** packaging of this file. Please review the following information to
34** ensure the GNU General Public License version 3.0 requirements will be
35** met: http://www.gnu.org/copyleft/gpl.html.
36**
37**
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42/****************************************************************************
43**
44** Implementation of QInputContextFactory class
45**
46** Copyright (C) 2003-2004 immodule for Qt Project. All rights reserved.
47**
48** This file is written to contribute to Nokia Corporation and/or its subsidiary(-ies) under their own
49** license. You may use this file under your Qt license. Following
50** description is copied from their original file headers. Contact
51** immodule-qt@freedesktop.org if any conditions of this licensing are
52** not clear to you.
53**
54****************************************************************************/
55
56#include "qinputcontextfactory.h"
57
58#ifndef QT_NO_IM
59
60#include "qcoreapplication.h"
61#include "qinputcontext.h"
62#include "qinputcontextplugin.h"
63
64#ifdef Q_WS_X11
65#include "private/qt_x11_p.h"
66#include "qximinputcontext_p.h"
67#endif
68#ifdef Q_WS_WIN
69#include "qwininputcontext_p.h"
70#endif
71#ifdef Q_WS_MAC
72#include "qmacinputcontext_p.h"
73#endif
74#ifdef Q_WS_S60
75#include "qcoefepinputcontext_p.h"
76#include "AknInputLanguageInfo.h"
77#endif
78
79#include "private/qfactoryloader_p.h"
80#include "qmutex.h"
81
82QT_BEGIN_NAMESPACE
83
84#ifndef QT_NO_LIBRARY
85Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader,
86 (QInputContextFactoryInterface_iid, QLatin1String("/inputmethods")))
87#endif
88
89/*!
90 \class QInputContextFactory
91 \brief The QInputContextFactory class creates QInputContext objects.
92
93
94 The input context factory creates a QInputContext object for a
95 given key with QInputContextFactory::create().
96
97 The input contexts are either built-in or dynamically loaded from
98 an input context plugin (see QInputContextPlugin).
99
100 keys() returns a list of valid keys. The
101 keys are the names used, for example, to identify and specify
102 input methods for the input method switching mechanism. The names
103 have to be consistent with QInputContext::identifierName(), and
104 may only contain ASCII characters.
105
106 A key can be used to retrieve the associated input context's
107 supported languages using languages(). You
108 can retrieve the input context's description using
109 description() and finally you can get a user
110 friendly internationalized name of the QInputContext object
111 specified by the key using displayName().
112
113 \legalese
114 Copyright (C) 2003-2004 immodule for Qt Project. All rights reserved.
115
116 This file is written to contribute to Nokia Corporation and/or its subsidiary(-ies) under their own
117 license. You may use this file under your Qt license. Following
118 description is copied from their original file headers. Contact
119 immodule-qt@freedesktop.org if any conditions of this licensing are
120 not clear to you.
121 \endlegalese
122
123 \sa QInputContext, QInputContextPlugin
124*/
125
126/*!
127 Creates and returns a QInputContext object for the input context
128 specified by \a key with the given \a parent. Keys are case
129 sensitive.
130
131 \sa keys()
132*/
133QInputContext *QInputContextFactory::create( const QString& key, QObject *parent )
134{
135 QInputContext *result = 0;
136#if defined(Q_WS_X11) && !defined(QT_NO_XIM)
137 if (key == QLatin1String("xim")) {
138 result = new QXIMInputContext;
139 }
140#endif
141#if defined(Q_WS_WIN)
142 if (key == QLatin1String("win")) {
143 result = new QWinInputContext;
144 }
145#endif
146#if defined(Q_WS_MAC)
147 if (key == QLatin1String("mac")) {
148 result = new QMacInputContext;
149 }
150#endif
151#if defined(Q_WS_S60)
152 if (key == QLatin1String("coefep")) {
153 result = new QCoeFepInputContext;
154 }
155#endif
156#ifdef QT_NO_LIBRARY
157 Q_UNUSED(key);
158#else
159 if (QInputContextFactoryInterface *factory =
160 qobject_cast<QInputContextFactoryInterface*>(loader()->instance(key))) {
161 result = factory->create(key);
162 }
163#endif
164 if (result)
165 result->setParent(parent);
166 return result;
167}
168
169
170/*!
171 Returns the list of keys this factory can create input contexts
172 for.
173
174 The keys are the names used, for example, to identify and specify
175 input methods for the input method switching mechanism. The names
176 have to be consistent with QInputContext::identifierName(), and
177 may only contain ASCII characters.
178
179 \sa create(), displayName(), QInputContext::identifierName()
180*/
181QStringList QInputContextFactory::keys()
182{
183 QStringList result;
184#if defined(Q_WS_X11) && !defined(QT_NO_XIM)
185 result << QLatin1String("xim");
186#endif
187#if defined(Q_WS_WIN) && !defined(QT_NO_XIM)
188 result << QLatin1String("win");
189#endif
190#if defined(Q_WS_MAC)
191 result << QLatin1String("mac");
192#endif
193#if defined(Q_WS_S60)
194 result << QLatin1String("coefep");
195#endif
196#ifndef QT_NO_LIBRARY
197 result += loader()->keys();
198#endif // QT_NO_LIBRARY
199 return result;
200}
201
202#if defined(Q_WS_S60)
203/*!
204 \internal
205
206 This function contains pure Symbian exception handling code for
207 getting S60 language list.
208 Returned object ownership is transferred to caller.
209*/
210static CAknInputLanguageList* s60LangListL()
211{
212 CAknInputLanguageInfo *langInfo = AknInputLanguageInfoFactory::CreateInputLanguageInfoL();
213 CleanupStack::PushL(langInfo);
214 // In rare phone there is more than 7 languages installed -> use 7 as an array granularity
215 CAknInputLanguageList *langList = new (ELeave) CAknInputLanguageList(7);
216 CleanupStack::PushL(langList);
217 langInfo->AppendAvailableLanguagesL(langList);
218 CleanupStack::Pop(langList);
219 CleanupStack::PopAndDestroy(langInfo);
220 return langList;
221}
222
223/*!
224 \internal
225
226 This function utility function return S60 language list.
227 Returned object ownership is transferred to caller.
228*/
229static CAknInputLanguageList* s60LangList()
230{
231 CAknInputLanguageList *langList = NULL;
232 TRAP_IGNORE(langList = s60LangListL());
233 q_check_ptr(langList);
234 return langList;
235}
236#endif
237
238/*!
239 Returns the languages supported by the QInputContext object
240 specified by \a key.
241
242 The languages are expressed as language code (e.g. "zh_CN",
243 "zh_TW", "zh_HK", "ja", "ko", ...). An input context that supports
244 multiple languages can return all supported languages as a
245 QStringList. The name has to be consistent with
246 QInputContext::language().
247
248 This information may be used to optimize a user interface.
249
250 \sa keys(), QInputContext::language(), QLocale
251*/
252QStringList QInputContextFactory::languages( const QString &key )
253{
254 QStringList result;
255#if defined(Q_WS_X11) && !defined(QT_NO_XIM)
256 if (key == QLatin1String("xim"))
257 return QStringList(QString());
258#endif
259#if defined(Q_WS_WIN)
260 if (key == QLatin1String("win"))
261 return QStringList(QString());
262#endif
263#if defined(Q_WS_MAC)
264 if (key == QLatin1String("mac"))
265 return QStringList(QString());
266#endif
267#if defined(Q_WS_S60)
268 if (key == QLatin1String("coefep"))
269 {
270 CAknInputLanguageList *langList = s60LangList();
271 int count = langList->Count();
272 for (int i = 0; i < count; ++i)
273 {
274 result.append(QString(qt_symbianLocaleName(langList->At(i)->LanguageCode())));
275 }
276 delete langList;
277 }
278#endif
279#if defined(QT_NO_LIBRARY) || defined(QT_NO_SETTINGS)
280 Q_UNUSED(key);
281#else
282 if (QInputContextFactoryInterface *factory =
283 qobject_cast<QInputContextFactoryInterface*>(loader()->instance(key)))
284 result = factory->languages(key);
285#endif // QT_NO_LIBRARY
286 return result;
287}
288
289/*!
290 Returns a user friendly internationalized name of the
291 QInputContext object specified by \a key. You can, for example,
292 use this name in a menu.
293
294 \sa keys(), QInputContext::identifierName()
295*/
296QString QInputContextFactory::displayName( const QString &key )
297{
298 QString result;
299#if defined(Q_WS_X11) && !defined(QT_NO_XIM)
300 if (key == QLatin1String("xim"))
301 return QInputContext::tr( "XIM" );
302#endif
303#ifdef Q_WS_S60
304 if (key == QLatin1String("coefep"))
305 return QInputContext::tr( "FEP" );
306#endif
307#if defined(QT_NO_LIBRARY) || defined(QT_NO_SETTINGS)
308 Q_UNUSED(key);
309#else
310 if (QInputContextFactoryInterface *factory =
311 qobject_cast<QInputContextFactoryInterface*>(loader()->instance(key)))
312 return factory->displayName(key);
313#endif // QT_NO_LIBRARY
314 return QString();
315}
316
317/*!
318 Returns an internationalized brief description of the QInputContext
319 object specified by \a key. You can, for example, use this
320 description in a user interface.
321
322 \sa keys(), displayName()
323*/
324QString QInputContextFactory::description( const QString &key )
325{
326#if defined(Q_WS_X11) && !defined(QT_NO_XIM)
327 if (key == QLatin1String("xim"))
328 return QInputContext::tr( "XIM input method" );
329#endif
330#if defined(Q_WS_WIN) && !defined(QT_NO_XIM)
331 if (key == QLatin1String("win"))
332 return QInputContext::tr( "Windows input method" );
333#endif
334#if defined(Q_WS_MAC)
335 if (key == QLatin1String("mac"))
336 return QInputContext::tr( "Mac OS X input method" );
337#endif
338#if defined(Q_WS_S60)
339 if (key == QLatin1String("coefep"))
340 return QInputContext::tr( "S60 FEP input method" );
341#endif
342#if defined(QT_NO_LIBRARY) || defined(QT_NO_SETTINGS)
343 Q_UNUSED(key);
344#else
345 if (QInputContextFactoryInterface *factory =
346 qobject_cast<QInputContextFactoryInterface*>(loader()->instance(key)))
347 return factory->description(key);
348#endif // QT_NO_LIBRARY
349 return QString();
350}
351
352QT_END_NAMESPACE
353
354#endif // QT_NO_IM
355