3 * Copyright 2001 the LyX Team
4 * Read the file COPYING
6 * \author John Levon <moz@compsoc.man.ac.uk>
11 #include "support/filetools.h"
15 #include "QMathDialog.h"
18 #include "ControlMath.h"
19 #include "iconpalette.h"
20 #include "QDelimiterDialog.h"
22 #include <qapplication.h>
23 #include <qwidgetstack.h>
24 #include <qcombobox.h>
25 #include <qpushbutton.h>
28 #include <qscrollview.h>
30 #include <qpopupmenu.h>
37 class QScrollViewSingle : public QScrollView {
39 QScrollViewSingle(QWidget * p)
40 : QScrollView(p), w_(0) {
41 setResizePolicy(Manual);
42 setHScrollBarMode(AlwaysOff);
43 setVScrollBarMode(AlwaysOn);
44 setBackgroundMode(PaletteBackground);
45 viewport()->setBackgroundMode(PaletteBackground);
48 void setChild(QWidget * w) {
50 setMinimumWidth(verticalScrollBar()->width() + w_->width() + 4);
55 virtual void resizeEvent(QResizeEvent * e) {
56 QScrollView::resizeEvent(e);
60 w_->resize(viewport()->width(), w_->height());
61 // force the resize to get accurate scrollbars
62 qApp->processEvents();
63 resizeContents(w_->width(), w_->height());
71 char const ** panels[] = {
72 latex_bop, latex_varsz, latex_brel, latex_greek, latex_arrow,
73 latex_dots, latex_deco, latex_misc, latex_ams_ops,
74 latex_ams_rel, latex_ams_nrel, latex_ams_arrows,
77 int const nr_panels = sizeof(panels)/sizeof(panels[0]);
79 bool panel_initialised[nr_panels];
83 QMathDialog::QMathDialog(QMath * form)
84 : QMathDialogBase(0, 0, false, 0),
87 connect(symbolsCO, SIGNAL(activated(int)), symbolsWS, SLOT(raiseWidget(int)));
89 for (int i = 0; *function_names[i]; ++i) {
90 functionsLB->insertItem(function_names[i]);
93 for (int i = 0; i < nr_panels; ++i) {
94 QScrollViewSingle * view = new QScrollViewSingle(symbolsWS);
95 symbolsWS->addWidget(view, i);
98 // aboutToShow() only fires when != 0 in Qt 2 !
99 symbolsWS->raiseWidget(0);
101 panel_initialised[0] = true;
103 connect(symbolsWS, SIGNAL(aboutToShow(int)), this, SLOT(showingPanel(int)));
105 QPopupMenu * m = new QPopupMenu(spacePB);
106 m->insertItem(_("Thin space \\,"), 1);
107 m->insertItem(_("Medium space \\:"), 2);
108 m->insertItem(_("Thick space \\;"), 3);
109 m->insertItem(_("Quadratin space \\quad"), 4);
110 m->insertItem(_("Double quadratin space \\qquad"), 5);
111 m->insertItem(_("Negative space \\!"), 6);
112 connect(m, SIGNAL(activated(int)), this, SLOT(insertSpace(int)));
113 spacePB->setPopup(m);
115 m = new QPopupMenu(sqrtPB);
116 m->insertItem(_("Square root \\sqrt"), 1);
117 m->insertItem(_("Cube root \\root"), 2);
118 m->insertItem(_("Other root \\root"), 3);
119 connect(m, SIGNAL(activated(int)), this, SLOT(insertRoot(int)));
122 m = new QPopupMenu(stylePB);
123 m->insertItem(_("Display style \\displaystyle"), 1);
124 m->insertItem(_("Normal text style \\textstyle"), 2);
125 m->insertItem(_("Script (small) style \\scriptstyle"), 3);
126 m->insertItem(_("Scriptscript (smaller) style \\scriptscriptstyle"), 4);
127 connect(m, SIGNAL(activated(int)), this, SLOT(insertStyle(int)));
128 stylePB->setPopup(m);
130 m = new QPopupMenu(fontPB);
131 m->insertItem(_("Roman \\mathrm"), 1);
132 m->insertItem(_("Bold \\mathbf"), 2);
133 m->insertItem(_("San serif \\mathsf"), 3);
134 m->insertItem(_("Italic \\mathit"), 4);
135 m->insertItem(_("Typewriter \\mathtt"), 5);
136 m->insertItem(_("Blackboard \\mathbb"), 6);
137 m->insertItem(_("Fraktur \\mathfrak"), 7);
138 m->insertItem(_("Calligraphic \\mathcal"), 8);
139 m->insertItem(_("Normal text mode \\textrm"), 9);
140 connect(m, SIGNAL(activated(int)), this, SLOT(insertFont(int)));
145 void QMathDialog::showingPanel(int num)
147 if (panel_initialised[num])
152 // Qt needs to catch up. Dunno why.
153 qApp->processEvents();
155 panel_initialised[num] = true;
159 IconPalette * QMathDialog::makePanel(QWidget * parent, char const ** entries)
161 IconPalette * p = new IconPalette(parent);
162 for (int i = 0; *entries[i]; ++i) {
163 string xpm_name = LibFileSearch("images/math/", entries[i], "xpm");
164 p->add(QPixmap(xpm_name.c_str()), entries[i], string("\\") + entries[i]);
166 connect(p, SIGNAL(button_clicked(string)), this, SLOT(symbol_clicked(string)));
172 void QMathDialog::addPanel(int num)
174 QScrollViewSingle * view = static_cast<QScrollViewSingle*>(symbolsWS->visibleWidget());
175 IconPalette * p = makePanel(view->viewport(), panels[num]);
180 void QMathDialog::symbol_clicked(string str)
186 void QMathDialog::fracClicked()
188 form_->insert("frac");
192 void QMathDialog::delimiterClicked()
195 QDelimiterDialog * d = new QDelimiterDialog(form_);
200 void QMathDialog::expandClicked()
202 int const id = symbolsWS->id(symbolsWS->visibleWidget());
203 IconPalette * p = makePanel(0, panels[id]);
205 s += symbolsCO->text(id).latin1();
206 p->setCaption(s.c_str());
207 p->resize(40 * 5, p->height());
209 p->setMaximumSize(p->width(), p->height());
213 void QMathDialog::functionSelected(const QString & str)
215 form_->insert(str.latin1());
219 void QMathDialog::matrixClicked()
221 form_->insertMatrix();
225 void QMathDialog::equationClicked()
227 form_->toggleDisplay();
231 void QMathDialog::subscriptClicked()
237 void QMathDialog::superscriptClicked()
239 form_->superscript();
243 void QMathDialog::insertSpace(int id)
247 case 1: str = ","; break;
248 case 2: str = ":"; break;
249 case 3: str = ";"; break;
250 case 4: str = "quad"; break;
251 case 5: str = "qquad"; break;
252 case 6: str = "!"; break;
258 void QMathDialog::insertRoot(int id)
262 form_->insert("sqrt");
265 form_->insertCubeRoot();
268 form_->insert("root");
274 void QMathDialog::insertStyle(int id)
278 case 1: str = "displaystyle"; break;
279 case 2: str = "textstyle"; break;
280 case 3: str = "scriptstyle"; break;
281 case 4: str = "scriptscriptstyle"; break;
287 void QMathDialog::insertFont(int id)
291 case 1: str = "mathrm"; break;
292 case 2: str = "mathbf"; break;
293 case 3: str = "mathsf"; break;
294 case 4: str = "mathit"; break;
295 case 5: str = "mathtt"; break;
296 case 6: str = "mathbb"; break;
297 case 7: str = "mathfrak"; break;
298 case 8: str = "mathcal"; break;
299 case 9: str = "textrm"; break;