1 /* vi: set sw=4 ts=4:
2 *
3 * Copyright (C) 2001 - 2015 Christian Hohnstaedt.
4 *
5 * All rights reserved.
6 */
7
8 #include "XcaApplication.h"
9 #include "MainWindow.h"
10 #include "XcaWarning.h"
11
12 #include "lib/entropy.h"
13
14 #include <QClipboard>
15 #include <QTextCodec>
16 #include <QDir>
17 #include <QFile>
18 #include <QAction>
19
20 QLocale XcaApplication::lang = QLocale::system();
21 QFont XcaApplication::tableFont;
22 QList<QLocale> XcaApplication::langAvail;
23
setMainwin(MainWindow * m)24 void XcaApplication::setMainwin(MainWindow *m)
25 {
26 mainw = m;
27 }
28
languageAvailable(QLocale l)29 bool XcaApplication::languageAvailable(QLocale l)
30 {
31 return langAvail.contains(l);
32 }
33
defaultlang()34 static QString defaultlang()
35 {
36 return getUserSettingsDir() + "/defaultlang";
37 }
38
XcaApplication(int & argc,char * argv[])39 XcaApplication::XcaApplication(int &argc, char *argv[])
40 :QApplication(argc, argv)
41 {
42 qtTr = NULL;
43 xcaTr = NULL;
44 mainw = NULL;
45
46 QFile file(defaultlang());
47
48 if (file.open(QIODevice::ReadOnly)) {
49 lang = QLocale(QString(file.read(128)));
50 }
51
52 langAvail << QLocale::system();
53 langAvail << QString("en");
54 QDirIterator qmIt(getI18nDir(), QStringList() << "*.qm", QDir::Files);
55 while (qmIt.hasNext()) {
56 XcaTranslator t;
57 qmIt.next();
58 QString language = qmIt.fileInfo().baseName().mid(4, -1);
59 if (t.load(language, "xca", getI18nDir()))
60 langAvail << QLocale(language);
61 }
62 setupLanguage(lang);
63 #ifdef Q_OS_MAC
64 QStringList libp = libraryPaths();
65 libp.prepend(applicationDirPath() + "/../Plugins");
66 setLibraryPaths(libp);
67 #endif
68
69 tableFont = QFont("Courier", QApplication::font().pointSize()
70 #if defined (Q_OS_WIN32)
71 +1
72 #else
73 +2
74 #endif
75 );
76 installEventFilter(this);
77 setWindowIcon(QIcon(QPixmap(":appIcon")));
78 }
79
setupLanguage(QLocale l)80 void XcaApplication::setupLanguage(QLocale l)
81 {
82 QStringList dirs;
83
84 lang = l;
85 if (qtTr) {
86 removeTranslator(qtTr);
87 delete qtTr;
88 }
89 qtTr = new XcaTranslator();
90 if (xcaTr) {
91 removeTranslator(xcaTr);
92 delete xcaTr;
93 }
94 xcaTr = new XcaTranslator();
95 dirs
96 #ifdef XCA_DEFAULT_QT_TRANSLATE
97 << XCA_DEFAULT_QT_TRANSLATE
98 #endif
99 << getI18nDir()
100 #ifndef WIN32
101 #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
102 << "/usr/local/share/qt5/translations/"
103 << "/usr/share/qt5/translations/"
104 #else
105 << "/usr/local/share/qt4/translations/"
106 << "/usr/share/qt4/translations/"
107 #endif
108 << "/usr/share/qt/translations/"
109 #endif
110 ;
111
112 qDebug() << "Setup language: " << lang;
113 foreach(QString dir, dirs) {
114 if (qtTr->load(lang, "qt", dir)) {
115 break;
116 }
117 }
118 xcaTr->load(lang, "xca", getI18nDir());
119 QLocale::setDefault(l);
120 installTranslator(qtTr);
121 installTranslator(xcaTr);
122 if (mainw)
123 mainw->initResolver();
124 }
125
quit()126 void XcaApplication::quit()
127 {
128 if (mainw)
129 mainw->close();
130 }
131
switchLanguage(QAction * a)132 void XcaApplication::switchLanguage(QAction* a)
133 {
134 QLocale lang = a->data().toLocale();
135 setupLanguage(lang);
136
137 QFile file(defaultlang());
138
139 if (lang == QLocale::system()) {
140 file.remove();
141 return;
142 }
143
144 if (file.open(QIODevice::WriteOnly)) {
145 file.write(lang.name().toUtf8());
146 }
147 }
148
eventFilter(QObject * watched,QEvent * ev)149 bool XcaApplication::eventFilter(QObject *watched, QEvent *ev)
150 {
151 static int mctr;
152 QMouseEvent *me;
153 QStringList l;
154 XcaTreeView *treeview;
155 int key;
156
157 switch (ev->type()) {
158 case QEvent::FileOpen:
159 l << static_cast<QFileOpenEvent *>(ev)->file();
160 mainw->openURLs(l);
161 return true;
162 case QEvent::MouseMove:
163 case QEvent::NonClientAreaMouseMove:
164 if (mctr++ > 8) {
165 me = static_cast<QMouseEvent *>(ev);
166 Entropy::add(me->globalX());
167 Entropy::add(me->globalY());
168 mctr = 0;
169 }
170 break;
171 case QEvent::KeyPress:
172 key = static_cast<QKeyEvent *>(ev)->key();
173 if (key < 0x100) {
174 Entropy::add(key);
175 }
176 break;
177 case QEvent::MouseButtonPress:
178 me = static_cast<QMouseEvent *>(ev);
179 treeview = watched ?
180 dynamic_cast<XcaTreeView*>(watched->parent()) : NULL;
181
182 if ((watched == mainw || treeview) &&
183 me->button() == Qt::MidButton &&
184 QApplication::clipboard()->supportsSelection())
185 {
186 mainw->pastePem();
187 return true;
188 }
189 break;
190 default:
191 break;
192 }
193 return false;
194 }
195
notify(QObject * receiver,QEvent * event)196 bool XcaApplication::notify(QObject* receiver, QEvent* event)
197 {
198 try {
199 return QApplication::notify(receiver, event);
200 } catch (errorEx &err) {
201 XCA_ERROR(err);
202 } catch (...) {
203 qWarning() << QString("Event exception: ")
204 << receiver << event;
205 }
206 return false;
207 }
208
~XcaApplication()209 XcaApplication::~XcaApplication()
210 {
211 }
212
213