1 /***************************************************************************
2 File : SymbolDialog.cpp
3 Project : SciDAVis
4 --------------------------------------------------------------------
5 Copyright : (C) 2006 by Ion Vasilief, Tilman Benkert
6 Email (use @ for *) : ion_vasilief*yahoo.fr, thzs*gmx.net
7 Description : Tool window to select special text characters
8
9 ***************************************************************************/
10
11 /***************************************************************************
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, write to the Free Software *
25 * Foundation, Inc., 51 Franklin Street, Fifth Floor, *
26 * Boston, MA 02110-1301 USA *
27 * *
28 ***************************************************************************/
29 #include "SymbolDialog.h"
30 #include <QPushButton>
31 #include <QSizePolicy>
32 #include <QGroupBox>
33 #include <QShortcut>
34 #include <QHBoxLayout>
35 #include <QButtonGroup>
36
SymbolDialog(CharSet charSet,QWidget * parent,Qt::WindowFlags fl)37 SymbolDialog::SymbolDialog(CharSet charSet, QWidget *parent, Qt::WindowFlags fl)
38 : QDialog(parent, fl)
39 {
40 setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
41 setSizeGripEnabled(false);
42
43 buttons = new QButtonGroup(this);
44 mainLayout = new QVBoxLayout(this);
45 gridLayout = new QGridLayout();
46
47 if (charSet == SymbolDialog::lowerGreek)
48 initLowerGreekChars();
49 else if (charSet == SymbolDialog::upperGreek)
50 initUpperGreekChars();
51 else if (charSet == SymbolDialog::mathSymbols)
52 initMathSymbols();
53 else if (charSet == SymbolDialog::arrowSymbols)
54 initArrowSymbols();
55 else
56 initNumberSymbols();
57
58 closeButton = new QPushButton(tr("&Close"), this);
59
60 mainLayout->addLayout(gridLayout);
61 mainLayout->addWidget(closeButton);
62
63 languageChange();
64
65 connect(buttons, SIGNAL(buttonClicked(int)), this, SLOT(getChar(int)));
66 connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
67 QShortcut *shortcut = new QShortcut(Qt::Key_Return, this);
68 connect(shortcut, SIGNAL(activated()), this, SLOT(addCurrentChar()));
69 }
70
initLowerGreekChars()71 void SymbolDialog::initLowerGreekChars()
72 {
73 int i, counter = 0;
74 for (i = 0; i <= (0x3C9 - 0x3B1); i++, counter++) {
75 QPushButton *btn = new QPushButton(QString(QChar(i + 0x3B1)));
76 btn->setMaximumWidth(40);
77 btn->setFlat(true);
78 btn->setAutoDefault(false);
79 buttons->addButton(btn, counter + 1);
80 gridLayout->addWidget(btn, counter / 5, counter % 5);
81 }
82 for (i = 0; i <= (0x3D1 - 0x3D1); i++, counter++) {
83 QPushButton *btn = new QPushButton(QString(QChar(i + 0x3D1)));
84 btn->setMaximumWidth(40);
85 btn->setFlat(true);
86 btn->setAutoDefault(false);
87 buttons->addButton(btn, counter + 1);
88 gridLayout->addWidget(btn, counter / 5, counter % 5);
89 }
90 for (i = 0; i <= (0x3D5 - 0x3D5); i++, counter++) {
91 QPushButton *btn = new QPushButton(QString(QChar(i + 0x3D5)));
92 btn->setMaximumWidth(40);
93 btn->setFlat(true);
94 btn->setAutoDefault(false);
95 buttons->addButton(btn, counter + 1);
96 gridLayout->addWidget(btn, counter / 5, counter % 5);
97 }
98 for (i = 0; i <= (0x3F1 - 0x3F0); i++, counter++) {
99 QPushButton *btn = new QPushButton(QString(QChar(i + 0x3F0)));
100 btn->setMaximumWidth(40);
101 btn->setFlat(true);
102 btn->setAutoDefault(false);
103 buttons->addButton(btn, counter + 1);
104 gridLayout->addWidget(btn, counter / 5, counter % 5);
105 }
106 numButtons = counter;
107 }
108
initUpperGreekChars()109 void SymbolDialog::initUpperGreekChars()
110 {
111 int i, counter = 0;
112 for (i = 0; i <= (0x3A1 - 0x391); i++, counter++) {
113 QPushButton *btn = new QPushButton(QString(QChar(i + 0x391)));
114 btn->setMaximumWidth(40);
115 btn->setFlat(true);
116 btn->setAutoDefault(false);
117 buttons->addButton(btn, counter + 1);
118 gridLayout->addWidget(btn, counter / 5, counter % 5);
119 }
120 for (i = 0; i <= (0x3A9 - 0x3A3); i++, counter++) {
121 QPushButton *btn = new QPushButton(QString(QChar(i + 0x3A3)));
122 btn->setMaximumWidth(40);
123 btn->setFlat(true);
124 btn->setAutoDefault(false);
125 buttons->addButton(btn, counter + 1);
126 gridLayout->addWidget(btn, counter / 5, counter % 5);
127 }
128 numButtons = counter;
129 }
130
initNumberSymbols()131 void SymbolDialog::initNumberSymbols()
132 {
133 int i, counter = 0;
134 for (i = 0; i <= (0x216B - 0x2153); i++, counter++) {
135 QPushButton *btn = new QPushButton(QString(QChar(i + 0x2153)));
136 btn->setMaximumWidth(40);
137 btn->setFlat(true);
138 btn->setAutoDefault(false);
139 buttons->addButton(btn, counter + 1);
140 gridLayout->addWidget(btn, counter / 8, counter % 8);
141 }
142 for (i = 0; i <= (0x217B - 0x2170); i++, counter++) {
143 QPushButton *btn = new QPushButton(QString(QChar(i + 0x2170)));
144 btn->setMaximumWidth(40);
145 btn->setFlat(true);
146 btn->setAutoDefault(false);
147 buttons->addButton(btn, counter + 1);
148 gridLayout->addWidget(btn, counter / 8, counter % 8);
149 }
150 numButtons = counter;
151 }
152
initMathSymbols()153 void SymbolDialog::initMathSymbols()
154 {
155 int i, counter = 0;
156 for (i = 0; i <= (0x220D - 0x2200); i++, counter++) {
157 QPushButton *btn = new QPushButton(QString(QChar(i + 0x2200)));
158 btn->setMaximumWidth(40);
159 btn->setFlat(true);
160 btn->setAutoDefault(false);
161 buttons->addButton(btn, counter + 1);
162 gridLayout->addWidget(btn, counter / 8, counter % 8);
163 }
164 for (i = 0; i <= (0x2212 - 0x220F); i++, counter++) {
165 QPushButton *btn = new QPushButton(QString(QChar(i + 0x220F)));
166 btn->setMaximumWidth(40);
167 btn->setFlat(true);
168 btn->setAutoDefault(false);
169 buttons->addButton(btn, counter + 1);
170 gridLayout->addWidget(btn, counter / 8, counter % 8);
171 }
172 for (i = 0; i <= (0x00B1 - 0x00B1); i++, counter++) {
173 QPushButton *btn = new QPushButton(QString(QChar(i + 0x00B1)));
174 btn->setMaximumWidth(40);
175 btn->setFlat(true);
176 btn->setAutoDefault(false);
177 buttons->addButton(btn, counter + 1);
178 gridLayout->addWidget(btn, counter / 8, counter % 8);
179 }
180 for (i = 0; i <= (0x2213 - 0x2213); i++, counter++) {
181 QPushButton *btn = new QPushButton(QString(QChar(i + 0x2213)));
182 btn->setMaximumWidth(40);
183 btn->setFlat(true);
184 btn->setAutoDefault(false);
185 buttons->addButton(btn, counter + 1);
186 gridLayout->addWidget(btn, counter / 8, counter % 8);
187 }
188 for (i = 0; i <= (0x221E - 0x2217); i++, counter++) {
189 QPushButton *btn = new QPushButton(QString(QChar(i + 0x2217)));
190 btn->setMaximumWidth(40);
191 btn->setFlat(true);
192 btn->setAutoDefault(false);
193 buttons->addButton(btn, counter + 1);
194 gridLayout->addWidget(btn, counter / 8, counter % 8);
195 }
196 for (i = 0; i <= (0x2222 - 0x2222); i++, counter++) {
197 QPushButton *btn = new QPushButton(QString(QChar(i + 0x2222)));
198 btn->setMaximumWidth(40);
199 btn->setFlat(true);
200 btn->setAutoDefault(false);
201 buttons->addButton(btn, counter + 1);
202 gridLayout->addWidget(btn, counter / 8, counter % 8);
203 }
204 for (i = 0; i <= (0x2230 - 0x2227); i++, counter++) {
205 QPushButton *btn = new QPushButton(QString(QChar(i + 0x2227)));
206 btn->setMaximumWidth(40);
207 btn->setFlat(true);
208 btn->setAutoDefault(false);
209 buttons->addButton(btn, counter + 1);
210 gridLayout->addWidget(btn, counter / 8, counter % 8);
211 }
212 for (i = 0; i <= (0x223F - 0x223F); i++, counter++) {
213 QPushButton *btn = new QPushButton(QString(QChar(i + 0x223F)));
214 btn->setMaximumWidth(40);
215 btn->setFlat(true);
216 btn->setAutoDefault(false);
217 buttons->addButton(btn, counter + 1);
218 gridLayout->addWidget(btn, counter / 8, counter % 8);
219 }
220 for (i = 0; i <= (0x2245 - 0x2245); i++, counter++) {
221 QPushButton *btn = new QPushButton(QString(QChar(i + 0x2245)));
222 btn->setMaximumWidth(40);
223 btn->setFlat(true);
224 btn->setAutoDefault(false);
225 buttons->addButton(btn, counter + 1);
226 gridLayout->addWidget(btn, counter / 8, counter % 8);
227 }
228 for (i = 0; i <= (0x2248 - 0x2248); i++, counter++) {
229 QPushButton *btn = new QPushButton(QString(QChar(i + 0x2248)));
230 btn->setMaximumWidth(40);
231 btn->setFlat(true);
232 btn->setAutoDefault(false);
233 buttons->addButton(btn, counter + 1);
234 gridLayout->addWidget(btn, counter / 8, counter % 8);
235 }
236 for (i = 0; i <= (0x2255 - 0x2254); i++, counter++) {
237 QPushButton *btn = new QPushButton(QString(QChar(i + 0x2254)));
238 btn->setMaximumWidth(40);
239 btn->setFlat(true);
240 btn->setAutoDefault(false);
241 buttons->addButton(btn, counter + 1);
242 gridLayout->addWidget(btn, counter / 8, counter % 8);
243 }
244 for (i = 0; i <= (0x2259 - 0x2259); i++, counter++) {
245 QPushButton *btn = new QPushButton(QString(QChar(i + 0x2259)));
246 btn->setMaximumWidth(40);
247 btn->setFlat(true);
248 btn->setAutoDefault(false);
249 buttons->addButton(btn, counter + 1);
250 gridLayout->addWidget(btn, counter / 8, counter % 8);
251 }
252 for (i = 0; i <= (0x2267 - 0x225F); i++, counter++) {
253 QPushButton *btn = new QPushButton(QString(QChar(i + 0x225F)));
254 btn->setMaximumWidth(40);
255 btn->setFlat(true);
256 btn->setAutoDefault(false);
257 buttons->addButton(btn, counter + 1);
258 gridLayout->addWidget(btn, counter / 8, counter % 8);
259 }
260 for (i = 0; i <= (0x226B - 0x226A); i++, counter++) {
261 QPushButton *btn = new QPushButton(QString(QChar(i + 0x226A)));
262 btn->setMaximumWidth(40);
263 btn->setFlat(true);
264 btn->setAutoDefault(false);
265 buttons->addButton(btn, counter + 1);
266 gridLayout->addWidget(btn, counter / 8, counter % 8);
267 }
268 for (i = 0; i <= (0x2289 - 0x2282); i++, counter++) {
269 QPushButton *btn = new QPushButton(QString(QChar(i + 0x2282)));
270 btn->setMaximumWidth(40);
271 btn->setFlat(true);
272 btn->setAutoDefault(false);
273 buttons->addButton(btn, counter + 1);
274 gridLayout->addWidget(btn, counter / 8, counter % 8);
275 }
276 // h bar
277 for (i = 0; i <= (0x210F - 0x210F); i++, counter++) {
278 QPushButton *btn = new QPushButton(QString(QChar(i + 0x210F)));
279 btn->setMaximumWidth(40);
280 btn->setFlat(true);
281 btn->setAutoDefault(false);
282 buttons->addButton(btn, counter + 1);
283 gridLayout->addWidget(btn, counter / 8, counter % 8);
284 }
285 // angstrom
286 for (i = 0; i <= (0x212B - 0x212B); i++, counter++) {
287 QPushButton *btn = new QPushButton(QString(QChar(i + 0x212B)));
288 btn->setMaximumWidth(40);
289 btn->setFlat(true);
290 btn->setAutoDefault(false);
291 buttons->addButton(btn, counter + 1);
292 gridLayout->addWidget(btn, counter / 8, counter % 8);
293 }
294 // per mille and per ten thousand
295 for (i = 0; i <= (0x2031 - 0x2030); i++, counter++) {
296 QPushButton *btn = new QPushButton(QString(QChar(i + 0x2030)));
297 btn->setMaximumWidth(40);
298 btn->setFlat(true);
299 btn->setAutoDefault(false);
300 buttons->addButton(btn, counter + 1);
301 gridLayout->addWidget(btn, counter / 8, counter % 8);
302 }
303 numButtons = counter;
304 }
305
initArrowSymbols()306 void SymbolDialog::initArrowSymbols()
307 {
308 int i, counter = 0;
309 for (i = 0; i <= (0x219B - 0x2190); i++, counter++) {
310 QPushButton *btn = new QPushButton(QString(QChar(i + 0x2190)));
311 btn->setMaximumWidth(40);
312 btn->setFlat(true);
313 btn->setAutoDefault(false);
314 buttons->addButton(btn, counter + 1);
315 gridLayout->addWidget(btn, counter / 6, counter % 6);
316 }
317 for (i = 0; i <= (0x21A7 - 0x21A4); i++, counter++) {
318 QPushButton *btn = new QPushButton(QString(QChar(i + 0x21A4)));
319 btn->setMaximumWidth(40);
320 btn->setFlat(true);
321 btn->setAutoDefault(false);
322 buttons->addButton(btn, counter + 1);
323 gridLayout->addWidget(btn, counter / 6, counter % 6);
324 }
325 for (i = 0; i <= (0x21D5 - 0x21CD); i++, counter++) {
326 QPushButton *btn = new QPushButton(QString(QChar(i + 0x21CD)));
327 btn->setMaximumWidth(40);
328 btn->setFlat(true);
329 btn->setAutoDefault(false);
330 buttons->addButton(btn, counter + 1);
331 gridLayout->addWidget(btn, counter / 6, counter % 6);
332 }
333 for (i = 0; i <= (0x21E9 - 0x21E6); i++, counter++) {
334 QPushButton *btn = new QPushButton(QString(QChar(i + 0x21E6)));
335 btn->setMaximumWidth(40);
336 btn->setFlat(true);
337 btn->setAutoDefault(false);
338 buttons->addButton(btn, counter + 1);
339 gridLayout->addWidget(btn, counter / 6, counter % 6);
340 }
341 numButtons = counter;
342 }
343
addCurrentChar()344 void SymbolDialog::addCurrentChar()
345 {
346 for (int i = 1; i < numButtons; i++) {
347 QPushButton *btn = (QPushButton *)buttons->button(i);
348 if (btn && btn->hasFocus())
349 emit addLetter(btn->text());
350 }
351 }
352
getChar(int btnIndex)353 void SymbolDialog::getChar(int btnIndex)
354 {
355 QPushButton *btn = (QPushButton *)buttons->button(btnIndex);
356 if (btn)
357 emit addLetter(btn->text());
358 }
359
languageChange()360 void SymbolDialog::languageChange()
361 {
362 setWindowTitle(tr("Choose Symbol"));
363 }
364
~SymbolDialog()365 SymbolDialog::~SymbolDialog() { }
366
focusInEvent(QFocusEvent * event)367 void SymbolDialog::focusInEvent(QFocusEvent *event)
368 {
369 Q_UNUSED(event)
370 // select the first button as default (in case [return] is pressed)
371 ((QPushButton *)buttons->button(1))->setFocus(Qt::TabFocusReason);
372 }
373