#include "qt_helpers.h"
#include "Buffer.h"
+#include "BufferParams.h"
#include "BufferView.h"
#include "Encoding.h"
#include "support/gettext.h"
+#include <QChar>
#include <QPixmap>
#include <QListWidgetItem>
+#include <QString>
using namespace std;
const int no_blocks = sizeof(unicode_blocks) / sizeof(UnicodeBlocks);
+
+QString getCodePoint(char_type c)
+{
+ QString cp = QString::number(c, 16);
+ while (cp.size() < 4)
+ cp.prepend('0');
+ cp.prepend("0x");
+ return cp;
+}
+
} // namespace anon
{
chosenLE->clear();
- string const & new_encoding = bufferview()->cursor().getEncoding()->name();
+ string new_encoding = bufferview()->cursor().getEncoding()->name();
+ if (buffer().params().inputenc != "auto" &&
+ buffer().params().inputenc != "default")
+ new_encoding = buffer().params().encoding().name();
if (new_encoding == encoding_)
// everything up to date
return;
if (!new_encoding.empty())
encoding_ = new_encoding;
+ bool const utf8 = toqstr(encoding_).startsWith("utf8");
+ if (utf8)
+ categoryFilterCB->setChecked(false);
+ categoryFilterCB->setEnabled(!utf8);
updateSymbolList();
}
return;
if (chosenLE->isEnabled())
chosenLE->insert(text);
- QString const category = getBlock(text.data()->unicode());
- categoryCO->setCurrentIndex(categoryCO->findText(category));
+ if (categoryFilterCB->isChecked()) {
+ QString const category = getBlock(text.data()->unicode());
+ categoryCO->setCurrentIndex(categoryCO->findText(category));
+ }
}
void GuiSymbols::on_categoryCO_activated(QString const & text)
{
if (!categoryFilterCB->isChecked())
- updateSymbolList();
- if (used_blocks.find(text) != used_blocks.end())
+ updateSymbolList(false);
+ else if (used_blocks.find(text) != used_blocks.end())
symbolsLW->scrollToItem(used_blocks[text],
QAbstractItemView::PositionAtTop);
}
void GuiSymbols::on_categoryFilterCB_toggled(bool on)
{
- updateSymbolList();
+ updateSymbolList(on);
if (on) {
QString const category = categoryCO->currentText();
if (used_blocks.find(category) != used_blocks.end())
}
-void GuiSymbols::updateSymbolList()
+void GuiSymbols::updateSymbolList(bool update_combo)
{
QString category = categoryCO->currentText();
bool const nocategory = category.isEmpty();
char_type range_start = 0x0000;
char_type range_end = 0x110000;
symbolsLW->clear();
- used_blocks.clear();
- categoryCO->clear();
+ if (update_combo) {
+ used_blocks.clear();
+ categoryCO->clear();
+ }
bool const show_all = categoryFilterCB->isChecked();
- typedef set<char_type> SymbolsList;
- Encoding enc = *(encodings.getFromLyXName(encoding_));
- SymbolsList symbols = enc.getSymbolsList();
+ if (symbols_.empty() || update_combo)
+ symbols_ = encodings.getFromLyXName(encoding_)->getSymbolsList();
if (!show_all) {
for (int i = 0 ; i < no_blocks; ++i)
}
}
- SymbolsList::const_iterator const end = symbols.end();
- for (SymbolsList::const_iterator it = symbols.begin(); it != end; ++it) {
+ SymbolsList::const_iterator const end = symbols_.end();
+ for (SymbolsList::const_iterator it = symbols_.begin(); it != end; ++it) {
char_type c = *it;
- QChar::Category cat = QChar::category((uint) c);
+ if (!update_combo && !show_all && (c <= range_start || c >= range_end))
+ continue;
+#if QT_VERSION >= 0x040300
+ QChar::Category const cat = QChar::category(uint(c));
+#else
+ QChar const qc = uint(c);
+ QChar::Category const cat = qc.category();
+#endif
// we do not want control or space characters
if (cat == QChar::Other_Control || cat == QChar::Separator_Space)
continue;
- QListWidgetItem * lwi = new QListWidgetItem(
- QString::fromUcs4((uint const *) &c, 1));
+ QListWidgetItem * lwi = new QListWidgetItem(toqstr(c));
if (show_all || c >= range_start && c <= range_end) {
lwi->setTextAlignment(Qt::AlignCenter);
+ lwi->setToolTip(
+ qt_("Character: ") + toqstr(c) + "\n" +
+ qt_("Code Point: ") + getCodePoint(c)
+ );
symbolsLW->addItem(lwi);
}
- QString block = getBlock(c);
- if (category.isEmpty())
- category = block;
- if (used_blocks.find(block) == used_blocks.end())
- used_blocks[block] = lwi;
+ if (update_combo) {
+ QString block = getBlock(c);
+ if (category.isEmpty())
+ category = block;
+ if (used_blocks.find(block) == used_blocks.end())
+ used_blocks[block] = lwi;
+ }
}
- // update category combo
- for (UsedBlocks::iterator it = used_blocks.begin(); it != used_blocks.end(); ++it) {
- categoryCO->addItem(it->first);
+ if (update_combo) {
+ // update category combo
+ for (UsedBlocks::iterator it = used_blocks.begin();
+ it != used_blocks.end(); ++it) {
+ categoryCO->addItem(it->first);
+ }
}
+
int old = categoryCO->findText(category);
if (old != -1)
categoryCO->setCurrentIndex(old);