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