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