]> git.lyx.org Git - features.git/blobdiff - src/frontends/qt4/GuiDocument.cpp
Finally make the label color of multiple index entries work.
[features.git] / src / frontends / qt4 / GuiDocument.cpp
index b74e6536f058b3165254a5f30e2fcb87d51d2db6..0a96469935b7f29f82ae6c92a6cb962ae837c754 100644 (file)
@@ -15,6 +15,7 @@
 
 #include "GuiApplication.h"
 #include "GuiBranches.h"
+#include "GuiIndices.h"
 #include "GuiSelectionManager.h"
 #include "LaTeXHighlighter.h"
 #include "LengthCombo.h"
@@ -33,6 +34,7 @@
 #include "FloatPlacement.h"
 #include "Format.h"
 #include "FuncRequest.h"
+#include "IndicesList.h"
 #include "Language.h"
 #include "LaTeXFeatures.h"
 #include "Layout.h"
@@ -857,10 +859,28 @@ GuiDocument::GuiDocument(GuiView & lv)
                this, SLOT(change_adaptor()));
        connect(biblioModule->bibtopicCB, SIGNAL(clicked()),
                this, SLOT(change_adaptor()));
+       connect(biblioModule->bibtexCO, SIGNAL(activated(int)),
+               this, SLOT(bibtexChanged(int)));
+       connect(biblioModule->bibtexOptionsED, SIGNAL(textChanged(QString)),
+               this, SLOT(change_adaptor()));
        // biblio
        biblioModule->citeStyleCO->addItem(qt_("Author-year"));
        biblioModule->citeStyleCO->addItem(qt_("Numerical"));
        biblioModule->citeStyleCO->setCurrentIndex(0);
+       
+       biblioModule->bibtexCO->clear();
+
+       biblioModule->bibtexCO->addItem(qt_("Default"), QString("default"));
+       for (set<string>::const_iterator it = lyxrc.bibtex_alternatives.begin();
+                            it != lyxrc.bibtex_alternatives.end(); ++it) {
+               QString const command = toqstr(*it).left(toqstr(*it).indexOf(" "));
+               biblioModule->bibtexCO->addItem(command, command);
+       }
+
+       // indices
+       indicesModule = new GuiIndices;
+       connect(indicesModule, SIGNAL(changed()),
+               this, SLOT(change_adaptor()));
 
 
        mathsModule = new UiWidget<Ui::MathsUi>;
@@ -926,6 +946,9 @@ GuiDocument::GuiDocument(GuiView & lv)
        branchesModule = new GuiBranches;
        connect(branchesModule, SIGNAL(changed()),
                this, SLOT(change_adaptor()));
+       connect(branchesModule, SIGNAL(renameBranches(docstring const &, docstring const &)),
+               this, SLOT(branchesRename(docstring const &, docstring const &)));
+       updateUnknownBranches();
 
        // preamble
        preambleModule = new PreambleModule;
@@ -1006,6 +1029,7 @@ GuiDocument::GuiDocument(GuiView & lv)
        docPS->addPanel(langModule, qt_("Language"));
        docPS->addPanel(numberingModule, qt_("Numbering & TOC"));
        docPS->addPanel(biblioModule, qt_("Bibliography"));
+       docPS->addPanel(indicesModule, qt_("Indexes"));
        docPS->addPanel(pdfSupportModule, qt_("PDF Properties"));
        docPS->addPanel(mathsModule, qt_("Math Options"));
        docPS->addPanel(floatModule, qt_("Float Placement"));
@@ -1490,6 +1514,13 @@ void GuiDocument::classChanged()
 }
 
 
+void GuiDocument::bibtexChanged(int n)
+{
+       biblioModule->bibtexOptionsED->setEnabled(n != 0);
+       changed();
+}
+
+
 namespace {
        // This is an insanely complicated attempt to make this sort of thing
        // work with RTL languages.
@@ -1713,6 +1744,19 @@ void GuiDocument::applyView()
        bp_.use_bibtopic =
                biblioModule->bibtopicCB->isChecked();
 
+       string const bibtex_command =
+               fromqstr(biblioModule->bibtexCO->itemData(
+                       biblioModule->bibtexCO->currentIndex()).toString());
+       string const bibtex_options =
+               fromqstr(biblioModule->bibtexOptionsED->text());
+       if (bibtex_command == "default" || bibtex_options.empty())
+               bp_.bibtex_command = bibtex_command;
+       else
+               bp_.bibtex_command = bibtex_command + " " + bibtex_options;
+
+       // Indices
+       indicesModule->apply(bp_);
+
        // language & quotes
        if (langModule->defaultencodingRB->isChecked()) {
                bp_.inputenc = "auto";
@@ -1833,7 +1877,7 @@ void GuiDocument::applyView()
                break;
        case 3:
                bp_.spacing().set(Spacing::Other,
-                       fromqstr(textLayoutModule->lspacingLE->text()));
+                       widgetToDoubleStr(textLayoutModule->lspacingLE));
                break;
        }
 
@@ -1992,6 +2036,7 @@ void GuiDocument::applyView()
        bp_.footskip = widgetsToLength(m->footskipLE, m->footskipUnit);
        bp_.columnsep = widgetsToLength(m->columnsepLE, m->columnsepUnit);
 
+       // branches
        branchesModule->apply(bp_);
 
        // PDF support
@@ -2047,6 +2092,24 @@ void GuiDocument::paramsToDialog()
        biblioModule->bibtopicCB->setChecked(
                bp_.use_bibtopic);
 
+       string command;
+       string options =
+               split(bp_.bibtex_command, command, ' ');
+
+       int const bpos = biblioModule->bibtexCO->findData(toqstr(command));
+       if (bpos != -1) {
+               biblioModule->bibtexCO->setCurrentIndex(bpos);
+               biblioModule->bibtexOptionsED->setText(toqstr(options).trimmed());
+       } else {
+               biblioModule->bibtexCO->setCurrentIndex(0);
+               biblioModule->bibtexOptionsED->clear();
+       }
+       biblioModule->bibtexOptionsED->setEnabled(
+               biblioModule->bibtexCO->currentIndex() != 0);
+
+       // indices
+       indicesModule->update(bp_);
+
        // language & quotes
        int const pos = langModule->languageCO->findData(toqstr(
                bp_.language->lang()));
@@ -2138,8 +2201,8 @@ void GuiDocument::paramsToDialog()
 
        textLayoutModule->lspacingCO->setCurrentIndex(nitem);
        if (bp_.spacing().getSpace() == Spacing::Other) {
-               textLayoutModule->lspacingLE->setText(
-                       toqstr(bp_.spacing().getValueAsString()));
+               doubleToWidget(textLayoutModule->lspacingLE,
+                       bp_.spacing().getValueAsString());
        }
        setLSpacing(nitem);
 
@@ -2354,6 +2417,8 @@ void GuiDocument::paramsToDialog()
        lengthToWidgets(m->columnsepLE, m->columnsepUnit,
                bp_.columnsep, defaultUnit);
 
+       // branches
+       updateUnknownBranches();
        branchesModule->update(bp_);
 
        // PDF support
@@ -2388,6 +2453,9 @@ void GuiDocument::paramsToDialog()
        // Make sure that the bc is in the INITIAL state
        if (bc().policy().buttonStatus(ButtonPolicy::RESTORE))
                bc().restore();
+
+       // clear changed branches cache
+       changedBranches_.clear();
 }
 
 
@@ -2618,6 +2686,25 @@ void GuiDocument::dispatchParams()
                dispatch(FuncRequest(LFUN_ALL_INSETS_TOGGLE,
                        "assign branch"));
        }
+       // rename branches in the document
+       executeBranchRenaming();
+       // and clear changed branches cache
+       changedBranches_.clear();
+       
+       // Generate the colours requested by indices.
+       IndicesList & indiceslist = params().indiceslist();
+       if (!indiceslist.empty()) {
+               IndicesList::const_iterator it = indiceslist.begin();
+               IndicesList::const_iterator const end = indiceslist.end();
+               for (; it != end; ++it) {
+                       docstring const & current_index = it->shortcut();
+                       Index const * index = indiceslist.findShortcut(current_index);
+                       string const x11hexname = X11hexname(index->color());
+                       // display the new color
+                       docstring const str = current_index + ' ' + from_ascii(x11hexname);
+                       dispatch(FuncRequest(LFUN_SET_COLOR, str));
+               }
+       }
        // FIXME: If we used an LFUN, we would not need those two lines:
        BufferView * bv = const_cast<BufferView *>(bufferview());
        bv->processUpdateFlags(Update::Force | Update::FitCursor);
@@ -2722,6 +2809,45 @@ void GuiDocument::loadModuleInfo()
 }
 
 
+void GuiDocument::updateUnknownBranches()
+{
+       list<docstring> used_branches;
+       buffer().getUsedBranches(used_branches);
+       list<docstring>::const_iterator it = used_branches.begin();
+       QStringList unknown_branches;
+       for (; it != used_branches.end() ; ++it) {
+               if (!buffer().params().branchlist().find(*it))
+                       unknown_branches.append(toqstr(*it));
+       }
+       branchesModule->setUnknownBranches(unknown_branches);
+}
+
+
+void GuiDocument::branchesRename(docstring const & oldname, docstring const & newname)
+{
+       map<docstring, docstring>::iterator it = changedBranches_.begin();
+       for (; it != changedBranches_.end() ; ++it) {
+               if (it->second == oldname) {
+                       // branch has already been renamed
+                       it->second = newname;
+                       return;
+               }
+       }
+       // store new name
+       changedBranches_[oldname] = newname;
+}
+
+
+void GuiDocument::executeBranchRenaming() const
+{
+       map<docstring, docstring>::const_iterator it = changedBranches_.begin();
+       for (; it != changedBranches_.end() ; ++it) {
+               docstring const arg = '"' + it->first + '"' + " " + '"' + it->second + '"';
+               dispatch(FuncRequest(LFUN_BRANCHES_RENAME, arg));
+       }
+}
+
+
 Dialog * createGuiDocument(GuiView & lv) { return new GuiDocument(lv); }