2 * \file GuiDelimiter.cpp
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * Full author contact details are available in file CREDITS.
13 #include "GuiDelimiter.h"
15 #include "GuiApplication.h"
18 #include "qt_helpers.h"
19 #include "support/gettext.h"
23 #include <QListWidgetItem>
27 static char const * latex_delimiters[] = {
28 "(", ")", "{", "}", "[", "]",
29 "lceil", "rceil", "lfloor", "rfloor", "langle", "rangle",
30 "uparrow", "updownarrow", "Uparrow", "Updownarrow", "downarrow", "Downarrow",
31 "|", "Vert", "/", "backslash", ""
35 static int const nr_latex_delimiters =
36 sizeof(latex_delimiters) / sizeof(char const *);
38 static QString const bigleft[] = {"", "bigl", "Bigl", "biggl", "Biggl"};
40 static QString const bigright[] = {"", "bigr", "Bigr", "biggr", "Biggr"};
42 static char const * const biggui[] = {
43 N_("big[[delimiter size]]"),
44 N_("Big[[delimiter size]]"),
45 N_("bigg[[delimiter size]]"),
46 N_("Bigg[[delimiter size]]"),
51 // FIXME: It might be better to fix the big delim LFUN to not require
52 // additional '\' prefix.
53 static QString fix_name(QString const & str, bool big)
57 if (!big || str == "(" || str == ")" || str == "[" || str == "]"
58 || str == "|" || str == "/")
69 GuiDelimiter::GuiDelimiter(GuiView & lv)
70 : GuiMath(lv, "mathdelimiter", qt_("Math Delimiter"))
74 connect(closePB, SIGNAL(clicked()), this, SLOT(accept()));
76 setFocusProxy(leftLW);
78 leftLW->setViewMode(QListView::IconMode);
79 rightLW->setViewMode(QListView::IconMode);
81 typedef map<char_type, QListWidgetItem *> ListItems;
83 // The last element is the empty one.
84 int const end = nr_latex_delimiters - 1;
85 for (int i = 0; i < end; ++i) {
86 string const delim = latex_delimiters[i];
87 MathSymbol const & ms = mathSymbol(delim);
88 QString symbol(ms.fontcode?
89 QChar(ms.fontcode) : toqstr(docstring(1, ms.unicode)));
90 QListWidgetItem * lwi = new QListWidgetItem(symbol);
91 lwi->setToolTip(toqstr(delim));
93 lyxfont.setFamily(ms.fontfamily);
94 QFont const & symbol_font = guiApp->guiFontLoader().get(lyxfont);
95 lwi->setFont(symbol_font);
96 list_items[ms.unicode] = lwi;
100 for (int i = 0; i != leftLW->count(); ++i) {
101 MathSymbol const & ms = mathSymbol(
102 fromqstr(leftLW->item(i)->toolTip()));
103 rightLW->addItem(list_items[doMatch(ms.unicode)]->clone());
106 // The last element is the empty one.
107 leftLW->addItem(qt_("(None)"));
108 rightLW->addItem(qt_("(None)"));
110 sizeCO->addItem(qt_("Variable"));
112 for (int i = 0; *biggui[i]; ++i)
113 sizeCO->addItem(qt_(biggui[i]));
115 on_leftLW_currentRowChanged(0);
116 bc().setPolicy(ButtonPolicy::IgnorantPolicy);
120 char_type GuiDelimiter::doMatch(char_type const symbol)
122 string const & str = texName(symbol);
124 if (str == "(") match = ")";
125 else if (str == ")") match = "(";
126 else if (str == "[") match = "]";
127 else if (str == "]") match = "[";
128 else if (str == "{") match = "}";
129 else if (str == "}") match = "{";
130 else if (str == "l") match = "r";
131 else if (str == "rceil") match = "lceil";
132 else if (str == "lceil") match = "rceil";
133 else if (str == "rfloor") match = "lfloor";
134 else if (str == "lfloor") match = "rfloor";
135 else if (str == "rangle") match = "langle";
136 else if (str == "langle") match = "rangle";
137 else if (str == "backslash") match = "/";
138 else if (str == "/") match = "backslash";
141 return mathSymbol(match).unicode;
145 void GuiDelimiter::updateTeXCode(int size)
147 bool const bigsize = size != 0;
149 QString left_str = fix_name(leftLW->currentItem()->toolTip(), bigsize);
150 QString right_str = fix_name(rightLW->currentItem()->toolTip(), bigsize);
153 tex_code_ = left_str + ' ' + right_str;
155 tex_code_ = bigleft[size] + ' '
157 + bigright[size] + ' '
161 // Generate TeX-code for GUI display.
162 // FIXME: Instead of reconstructing the TeX code it would be nice to
163 // FIXME: retrieve the LateX code directly from mathed.
164 // In all cases, we want the '\' prefix if needed, so we pass 'true'
166 left_str = fix_name(leftLW->currentItem()->toolTip(), true);
167 right_str = fix_name(rightLW->currentItem()->toolTip(), true);
170 code_str = "\\left" + left_str + " \\right" + right_str;
172 // There should be nothing in the TeX-code when the delimiter is "None".
174 code_str = "\\" + bigleft[size] + left_str + ' ';
175 if (right_str != ".")
176 code_str += "\\" + bigright[size] + right_str;
179 texCodeL->setText(qt_("TeX Code: ") + code_str);
183 void GuiDelimiter::on_insertPB_clicked()
185 if (sizeCO->currentIndex() == 0)
186 dispatchDelim(fromqstr(tex_code_));
188 QString command = '"' + tex_code_ + '"';
189 command.replace(' ', "\" \"");
190 dispatchBigDelim(fromqstr(command));
195 void GuiDelimiter::on_sizeCO_activated(int index)
197 updateTeXCode(index);
201 void GuiDelimiter::on_leftLW_itemActivated(QListWidgetItem *)
203 on_insertPB_clicked();
208 void GuiDelimiter::on_rightLW_itemActivated(QListWidgetItem *)
210 on_insertPB_clicked();
215 void GuiDelimiter::on_leftLW_currentRowChanged(int item)
217 if (matchCB->isChecked())
218 rightLW->setCurrentRow(item);
220 updateTeXCode(sizeCO->currentIndex());
224 void GuiDelimiter::on_rightLW_currentRowChanged(int item)
226 if (matchCB->isChecked())
227 leftLW->setCurrentRow(item);
229 updateTeXCode(sizeCO->currentIndex());
233 void GuiDelimiter::on_matchCB_stateChanged(int state)
235 if (state == Qt::Checked)
236 on_leftLW_currentRowChanged(leftLW->currentRow());
238 updateTeXCode(sizeCO->currentIndex());
242 Dialog * createGuiDelimiter(GuiView & lv) { return new GuiDelimiter(lv); }
245 } // namespace frontend
248 #include "GuiDelimiter_moc.cpp"