]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/TocWidget.cpp
* fix spelling in comments to please John.
[lyx.git] / src / frontends / qt4 / TocWidget.cpp
index 3387722d52222360efda22394ea479c92d41f60e..538c04c177cb894dd2f4045301e7db29fb640087 100644 (file)
 #include "TocModel.h"
 
 #include "Buffer.h"
+#include "BufferView.h"
 #include "CutAndPaste.h"
 #include "FuncRequest.h"
+#include "FuncStatus.h"
 #include "LyXFunc.h"
 #include "Menus.h"
 #include "TocBackend.h"
@@ -95,7 +97,7 @@ void TocWidget::showContextMenu(const QPoint & pos)
 }
 
 
-void TocWidget::doDispatch(Cursor & cur, FuncRequest const & cmd)
+Inset * TocWidget::itemInset() const
 {
        QModelIndex const & index = tocTV->currentIndex();
        TocItem const & item =
@@ -105,21 +107,105 @@ void TocWidget::doDispatch(Cursor & cur, FuncRequest const & cmd)
        Inset * inset = 0;
        if (current_type_ == "label" 
                  || current_type_ == "graphics"
-                 || current_type_ == "citation")
+                 || current_type_ == "citation"
+                 || current_type_ == "child")
                inset = dit.nextInset();
 
-       else if (current_type_ == "branch")
+       else if (current_type_ == "branch"
+                        || current_type_ == "index"
+                        || current_type_ == "change")
                inset = &dit.inset();
 
-       else if (current_type_ == "table" || current_type_ == "figure") {
+       else if (current_type_ == "table" 
+                    || current_type_ == "listing"
+                    || current_type_ == "figure") {
                DocIterator tmp_dit(dit);
                tmp_dit.pop_back();
                inset = &tmp_dit.inset();
        }
+       return inset;
+}
+
 
+bool TocWidget::getStatus(Cursor & cur, FuncRequest const & cmd,
+       FuncStatus & status) const
+{
+       Inset * inset = itemInset();
        FuncRequest tmpcmd(cmd);
-       if (inset)
-               inset->dispatch(cur, tmpcmd);
+
+       QModelIndex const & index = tocTV->currentIndex();
+       TocItem const & item =
+               gui_view_.tocModels().currentItem(current_type_, index);
+
+       switch (cmd.action)
+       {
+       case LFUN_CHANGE_ACCEPT:
+       case LFUN_CHANGE_REJECT:
+       case LFUN_OUTLINE_UP:
+       case LFUN_OUTLINE_DOWN:
+       case LFUN_OUTLINE_IN:
+       case LFUN_OUTLINE_OUT:
+       case LFUN_SECTION_SELECT:
+               status.setEnabled(true);
+               return true;
+
+       case LFUN_LABEL_COPY_AS_REF: {
+               // For labels in math, we need to supply the label as a string
+               FuncRequest label_copy(LFUN_LABEL_COPY_AS_REF, item.asString());
+               if (inset)
+                       return inset->getStatus(cur, label_copy, status);
+       }
+
+       default:
+               if (inset)
+                       return inset->getStatus(cur, tmpcmd, status);
+       }
+
+       return false;
+}
+
+
+void TocWidget::doDispatch(Cursor & cur, FuncRequest const & cmd)
+{
+       Inset * inset = itemInset();
+       FuncRequest tmpcmd(cmd);
+
+       QModelIndex const & index = tocTV->currentIndex();
+       TocItem const & item =
+               gui_view_.tocModels().currentItem(current_type_, index);
+
+       // Start an undo group.
+       cur.beginUndoGroup();
+
+       switch (cmd.action)
+       {
+       case LFUN_CHANGE_ACCEPT:
+       case LFUN_CHANGE_REJECT:
+       case LFUN_SECTION_SELECT:
+               dispatch(item.action());
+               cur.dispatch(tmpcmd);
+               break;
+
+       case LFUN_LABEL_COPY_AS_REF: {
+               // For labels in math, we need to supply the label as a string
+               FuncRequest label_copy(LFUN_LABEL_COPY_AS_REF, item.asString());
+               if (inset)
+                       inset->dispatch(cur, label_copy);
+               break;
+       }
+       
+       case LFUN_OUTLINE_UP:
+       case LFUN_OUTLINE_DOWN:
+       case LFUN_OUTLINE_IN:
+       case LFUN_OUTLINE_OUT:
+               outline(cmd.action);
+               break;
+
+       default:
+               if (inset)
+                       inset->dispatch(cur, tmpcmd);
+       }
+       cur.endUndoGroup();
 }
 
 
@@ -163,6 +249,7 @@ void TocWidget::on_sortCB_stateChanged(int state)
        updateView();
 }
 
+
 void TocWidget::on_persistentCB_stateChanged(int state)
 {
        persistent_ = state == Qt::Checked;
@@ -281,7 +368,7 @@ void TocWidget::select(QModelIndex const & index)
 }
 
 
-/// Test if outlining operation is possible
+/// Test whether outlining operation is possible
 static bool canOutline(QString const & type)
 {
        return type == "tableofcontents";
@@ -299,33 +386,43 @@ void TocWidget::enableControls(bool enable)
        moveDownTB->setEnabled(enable);
        moveInTB->setEnabled(enable);
        moveOutTB->setEnabled(enable);
-       if (!enable) {
-               depthSL->setMaximum(0);
-               depthSL->setValue(0);
-       }
 }
 
 
-/// Test if synchronized navigation is possible
+/// Test whether synchronized navigation is possible
 static bool canNavigate(QString const & type)
 {
-       // It is not possible to have synchronous navigation in a correctl
-       // and efficient way with the label type because Toc::item() do a linear
-       // seatch. Even if fixed, it might even not be desirable to do so if we 
-       // want to support drag&drop of labels and references.
+       // It is not possible to have synchronous navigation in a correct
+       // and efficient way with the label and change type because Toc::item()
+       // does a linear search. Even when fixed, it might even not be desirable
+       // to do so if we want to support drag&drop of labels and references.
        return type != "label" && type != "change";
 }
 
 
+/// Test whether sorting is possible
+static bool isSortable(QString const & type)
+{
+       return type != "tableofcontents";
+}
+
+
 void TocWidget::updateView()
 {
-       if (!gui_view_.view()) {
+       if (!gui_view_.documentBufferView()) {
                enableControls(false);
                typeCO->setEnabled(false);
                tocTV->setModel(0);
                tocTV->setEnabled(false);
+               depthSL->setMaximum(0);
+               depthSL->setValue(0);
+               persistentCB->setEnabled(false);
+               sortCB->setEnabled(false);
+               depthSL->setEnabled(false);
                return;
        }
+       sortCB->setEnabled(isSortable(current_type_));
+       depthSL->setEnabled(true);
        typeCO->setEnabled(true);
        tocTV->setEnabled(false);
        tocTV->setUpdatesEnabled(false);
@@ -339,21 +436,26 @@ void TocWidget::updateView()
        }
 
        sortCB->blockSignals(true);
-       sortCB->setChecked(gui_view_.tocModels().isSorted(current_type_));
+       sortCB->setChecked(isSortable(current_type_)
+               && gui_view_.tocModels().isSorted(current_type_));
        sortCB->blockSignals(false);
 
-       persistentCB->setChecked(persistent_);
+       
+       bool const can_navigate_ = canNavigate(current_type_);
+       persistentCB->setEnabled(can_navigate_);
 
        bool controls_enabled = toc_model && toc_model->rowCount() > 0
-               && !gui_view_.buffer()->isReadonly();
+               && !gui_view_.documentBufferView()->buffer().isReadonly();
        enableControls(controls_enabled);
 
        depthSL->setMaximum(gui_view_.tocModels().depth(current_type_));
        depthSL->setValue(depth_);
-       if (!persistent_)
+       if (!persistent_ && can_navigate_)
                setTreeDepth(depth_);
-       if (canNavigate(current_type_))
+       if (can_navigate_) {
+               persistentCB->setChecked(persistent_);
                select(gui_view_.tocModels().currentIndex(current_type_));
+       }
        tocTV->setEnabled(true);
        tocTV->setUpdatesEnabled(true);
 }