]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiSymbols.cpp
do what the FIXME suggested
[lyx.git] / src / frontends / qt4 / GuiSymbols.cpp
index 443a968629f78c424dea89c1108724a08ef01722..3a47a5de1a60670a5d5781855ca2a97177e5b7c6 100644 (file)
 #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;
 
@@ -141,6 +144,16 @@ UnicodeBlocks unicode_blocks[] = {
 
 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
 
 
@@ -165,12 +178,19 @@ void GuiSymbols::updateView()
 {
        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();
 }
 
@@ -229,16 +249,18 @@ void GuiSymbols::on_symbolsLW_itemClicked(QListWidgetItem * item)
                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);
 }
@@ -246,7 +268,7 @@ void GuiSymbols::on_categoryCO_activated(QString const & text)
 
 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())
@@ -256,20 +278,21 @@ void GuiSymbols::on_categoryFilterCB_toggled(bool on)
 }
 
 
-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)
@@ -280,30 +303,46 @@ void GuiSymbols::updateSymbolList()
                        }
        }
 
-       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);