]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiRef.cpp
On Linux show in crash message box the backtrace
[lyx.git] / src / frontends / qt4 / GuiRef.cpp
index 5082daa2667023ff9fe9595372bd0403ce2cd776..141c67bc13733ac413da9d2c4c0e39eb0f0f94a6 100644 (file)
@@ -48,14 +48,6 @@ GuiRef::GuiRef(GuiView & lv)
 
        at_ref_ = false;
 
-       // Enabling is set in updateRefs. Disable for now in case no
-       // call to updateContents follows (e.g. read-only documents).
-       sortCB->setEnabled(false);
-       caseSensitiveCB->setEnabled(false);
-       caseSensitiveCB->setChecked(false);
-       refsTW->setEnabled(false);
-       gotoPB->setEnabled(false);
-
        refsTW->setColumnCount(1);
        refsTW->header()->setVisible(false);
 
@@ -98,19 +90,22 @@ GuiRef::GuiRef(GuiView & lv)
        bc().setOK(okPB);
        bc().setApply(applyPB);
        bc().setCancel(closePB);
-       bc().addReadOnly(refsTW);
-       bc().addReadOnly(sortCB);
-       bc().addReadOnly(caseSensitiveCB);
-       bc().addReadOnly(nameED);
-       bc().addReadOnly(referenceED);
        bc().addReadOnly(typeCO);
-       bc().addReadOnly(bufferCO);
 
        restored_buffer_ = -1;
        active_buffer_ = -1;
 }
 
 
+void GuiRef::enableView(bool enable)
+{
+       if (!enable)
+               // In the opposite case, updateContents() will be called anyway.
+               updateContents();
+       GuiDialog::enableView(enable);
+}
+
+
 void GuiRef::changed_adaptor()
 {
        changed();
@@ -139,9 +134,6 @@ void GuiRef::selectionChanged()
 
 void GuiRef::refHighlighted(QTreeWidgetItem * sel)
 {
-       if (isBufferReadonly())
-               return;
-
        if (sel->childCount() > 0) {
                sel->setExpanded(true);
                return;
@@ -158,7 +150,7 @@ void GuiRef::refHighlighted(QTreeWidgetItem * sel)
        if (at_ref_)
                gotoRef();
        gotoPB->setEnabled(true);
-       if (typeAllowed())
+       if (typeAllowed() && !isBufferReadonly())
                typeCO->setEnabled(true);
        nameED->setHidden(!nameAllowed());
        nameL->setHidden(!nameAllowed());
@@ -170,6 +162,11 @@ void GuiRef::refSelected(QTreeWidgetItem * sel)
        if (isBufferReadonly())
                return;
 
+       if (sel->childCount()) {
+               sel->setExpanded(false);
+               return;
+       }
+
 /*     int const cur_item = refsTW->currentRow();
        bool const cur_item_selected = cur_item >= 0 ?
                refsLB->isSelected(cur_item) : false;*/
@@ -235,11 +232,13 @@ void GuiRef::updateContents()
 {
        int orig_type = typeCO->currentIndex();
 
-       referenceED->setText(toqstr(params_["reference"]));
+       referenceED->clear();
+       nameED->clear();
 
+       referenceED->setText(toqstr(params_["reference"]));
        nameED->setText(toqstr(params_["name"]));
-       nameED->setHidden(!nameAllowed() && !isBufferReadonly());
-       nameL->setHidden(!nameAllowed() && !isBufferReadonly());
+       nameED->setHidden(!nameAllowed());
+       nameL->setHidden(!nameAllowed());
 
        // restore type settings for new insets
        if (params_["reference"].empty())
@@ -356,19 +355,29 @@ void GuiRef::redoRefs()
        QStringList refsStrings;
        QStringList refsCategories;
        vector<docstring>::const_iterator iter;
+       bool noprefix = false;
        for (iter = refs_.begin(); iter != refs_.end(); ++iter) {
                QString const lab = toqstr(*iter);
                refsStrings.append(lab);
-               if (groupCB->isChecked() && lab.contains(":")) {
-                       QString const pref = lab.split(':')[0];
-                       if (!pref.isEmpty() && !refsCategories.contains(pref))
-                                 refsCategories.append(pref);
+               if (groupCB->isChecked()) {
+                       if (lab.contains(":")) {
+                               QString const pref = lab.split(':')[0];
+                               if (!refsCategories.contains(pref)) {
+                                       if (!pref.isEmpty())
+                                               refsCategories.append(pref);
+                                       else
+                                               noprefix = true;
+                               }
+                       }
+                       else
+                               noprefix = true;
                }
        }
        // sort categories case-intensively
        qSort(refsCategories.begin(), refsCategories.end(),
              caseInsensitiveLessThan /*defined above*/);
-       refsCategories.insert(0, qt_("<No prefix>"));
+       if (noprefix)
+               refsCategories.insert(0, qt_("<No prefix>"));
 
        if (sortCB->isEnabled() && sortCB->isChecked()) {
                if(caseSensitiveCB->isEnabled() && caseSensitiveCB->isChecked())
@@ -388,11 +397,11 @@ void GuiRef::redoRefs()
                                QString const ref = refsStrings.at(i);
                                if ((ref.startsWith(cat + QString(":")))
                                    || (cat == qt_("<No prefix>")
-                                       && !ref.contains(":"))) {
-                                       QTreeWidgetItem * child =
-                                               new QTreeWidgetItem(item);
-                                       child->setText(0, ref);
-                                       item->addChild(child);
+                                      && (!ref.mid(1).contains(":") || ref.left(1).contains(":")))) {
+                                               QTreeWidgetItem * child =
+                                                       new QTreeWidgetItem(item);
+                                               child->setText(0, ref);
+                                               item->addChild(child);
                                }
                        }
                        refsCats.append(item);
@@ -449,10 +458,11 @@ void GuiRef::updateRefs()
                FileName const & name = theBufferList().fileNames()[the_buffer];
                Buffer const * buf = theBufferList().getBuffer(name);
                buf->getLabelList(refs_);
-       }       
+       }
        sortCB->setEnabled(!refs_.empty());
        caseSensitiveCB->setEnabled(sortCB->isEnabled() && sortCB->isChecked());
        refsTW->setEnabled(!refs_.empty());
+       groupCB->setEnabled(!refs_.empty());
        // refsTW should only be the focus proxy when it is enabled
        setFocusProxy(refs_.empty() ? 0 : refsTW);
        gotoPB->setEnabled(!refs_.empty());