commit 789745df7a8cda6cb5172ea811371d149a68e198
Author: Guillaume Munch <g...@lyx.org>
Date:   Sun Oct 11 14:50:32 2015 +0100

    TexRow info in source panel and gotoCursor() for debugging
    
    These features are active in DEVEL_VERSION when Debug is set to LATEX.
    
    1. The TexRow information is prepended to the source panel.
    
    2. Clicking on any line in the source triggers reverse search. (This would 
be an
    interesting feature to implement on the user side, but we need a proper 
LFUN.)

diff --git a/src/BufferView.cpp b/src/BufferView.cpp
index 24be162..1aac0b2 100644
--- a/src/BufferView.cpp
+++ b/src/BufferView.cpp
@@ -2366,12 +2366,18 @@ int BufferView::scrollUp(int offset)
 
 void BufferView::setCursorFromRow(int row)
 {
+       setCursorFromRow(row, buffer_.texrow());
+}
+
+
+void BufferView::setCursorFromRow(int row, TexRow const & texrow)
+{
        int tmpid;
        int tmppos;
        pit_type newpit = 0;
        pos_type newpos = 0;
 
-       buffer_.texrow().getIdFromRow(row, tmpid, tmppos);
+       texrow.getIdFromRow(row, tmpid, tmppos);
 
        bool posvalid = (tmpid != -1);
        if (posvalid) {
diff --git a/src/BufferView.h b/src/BufferView.h
index bfdb0ba..15d2c6b 100644
--- a/src/BufferView.h
+++ b/src/BufferView.h
@@ -44,6 +44,7 @@ class PainterInfo;
 class ParIterator;
 class ParagraphMetrics;
 class Point;
+class TexRow;
 class Text;
 class TextMetrics;
 
@@ -159,6 +160,8 @@ public:
 
        /// set the cursor based on the given TeX source row.
        void setCursorFromRow(int row);
+       ///
+       void setCursorFromRow(int row, TexRow const & texrow);
 
        /// set cursor to the given inset. Return true if found.
        bool setCursorFromInset(Inset const *);
diff --git a/src/frontends/qt4/GuiViewSource.cpp 
b/src/frontends/qt4/GuiViewSource.cpp
index 1695664..c908a2e 100644
--- a/src/frontends/qt4/GuiViewSource.cpp
+++ b/src/frontends/qt4/GuiViewSource.cpp
@@ -26,6 +26,7 @@
 #include "support/debug.h"
 #include "support/lassert.h"
 #include "support/docstream.h"
+#include "support/docstring_list.h"
 #include "support/gettext.h"
 
 #include <boost/crc.hpp>
@@ -64,6 +65,11 @@ ViewSourceWidget::ViewSourceWidget()
                this, SLOT(setViewFormat(int)));
        connect(outputFormatCO, SIGNAL(activated(int)),
                this, SLOT(contentsChanged()));
+#ifdef DEVEL_VERSION
+       if (lyx::lyxerr.debugging(Debug::LATEX))
+               connect(viewSourceTV, SIGNAL(cursorPositionChanged()),
+                               this, SLOT(gotoCursor()));
+#endif
 
        // setting the update timer
        update_timer_->setSingleShot(true);
@@ -89,7 +95,7 @@ ViewSourceWidget::ViewSourceWidget()
 }
 
 
-auto_ptr<TexRow> ViewSourceWidget::getContent(BufferView const * view,
+void ViewSourceWidget::getContent(BufferView const * view,
                        Buffer::OutputWhat output, docstring & str, string 
const & format,
                        bool master)
 {
@@ -108,11 +114,10 @@ auto_ptr<TexRow> ViewSourceWidget::getContent(BufferView 
const * view,
        if (par_begin > par_end)
                swap(par_begin, par_end);
        odocstringstream ostr;
-       auto_ptr<TexRow> texrow = view->buffer().getSourceCode(ostr, format,
-                                                                   par_begin, 
par_end + 1, output, master);
+       texrow_ = view->buffer().getSourceCode(ostr, format,
+                                                                               
par_begin, par_end + 1, output, master);
        //ensure that the last line can always be selected in its full width
        str = ostr.str() + "\n";
-       return texrow;
 }
 
 
@@ -164,6 +169,23 @@ void ViewSourceWidget::updateViewNow()
        update_timer_->start(0);
 }
 
+namespace {
+
+QString prependTexRow(TexRow const & texrow, QString const & content)
+{
+       QStringList list = content.split(QChar('\n'));
+       docstring_list dlist;
+       for (QStringList::const_iterator it = list.begin(); it != list.end(); 
++it)
+               dlist.push_back(from_utf8(fromqstr(*it)));
+       texrow.prepend(dlist);
+       QString qstr;
+       for (docstring_list::iterator it = dlist.begin(); it != dlist.end(); 
++it)
+               qstr += toqstr(*it) + '\n';
+       return qstr;
+}
+
+} // anon namespace
+
 void ViewSourceWidget::realUpdateView()
 {
        if (!bv_) {
@@ -191,13 +213,18 @@ void ViewSourceWidget::realUpdateView()
                output = Buffer::OnlyBody;
 
        docstring content;
-       auto_ptr<TexRow> texrow = getContent(bv_, output, content, format,
-                                                                          
masterPerspectiveCB->isChecked());
+       getContent(bv_, output, content, format, 
masterPerspectiveCB->isChecked());
        QString old = document_->toPlainText();
        QString qcontent = toqstr(content);
+#ifdef DEVEL_VERSION
+       if (texrow_.get() && lyx::lyxerr.debugging(Debug::LATEX))
+               qcontent = prependTexRow(*texrow_, qcontent);
+#endif
+       // prevent gotoCursor()
+       viewSourceTV->blockSignals(true);
        bool const changed = setText(qcontent);
 
-       if (changed && !texrow.get()) {
+       if (changed && !texrow_.get()) {
                // position-to-row is unavailable
                // we jump to the first modification
                const QChar * oc = old.constData();
@@ -227,18 +254,18 @@ void ViewSourceWidget::realUpdateView()
                //c.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor,1);
                viewSourceTV->setTextCursor(c);
 
-       } else if (texrow.get()) {
+       } else if (texrow_.get()) {
                // Use the available position-to-row conversion to highlight
                // the current selection in the source
                int beg_row, end_row;
                {
                        DocIterator beg = bv_->cursor().selectionBegin();
                        DocIterator end = bv_->cursor().selectionEnd();
-                       std::pair<int,int> beg_rows = 
texrow->rowFromDocIterator(beg);
+                       std::pair<int,int> beg_rows = 
texrow_->rowFromDocIterator(beg);
                        beg_row = beg_rows.first;
                        if (beg != end) {
                                end.backwardChar();
-                               std::pair<int,int> end_rows = 
texrow->rowFromDocIterator(end);
+                               std::pair<int,int> end_rows = 
texrow_->rowFromDocIterator(end);
                                end_row = end_rows.second;
                        } else {
                                end_row = beg_rows.second;
@@ -290,9 +317,22 @@ void ViewSourceWidget::realUpdateView()
                viewSourceTV->setTextCursor(c);
                viewSourceTV->horizontalScrollBar()->setValue(h_scroll);
        } // else if (texrow)
+       viewSourceTV->blockSignals(false);
 }
 
 
+// only used in DEVEL_MODE for debugging
+// need a proper LFUN if we want to implement it in release mode
+void ViewSourceWidget::gotoCursor()
+{
+       if (!bv_ || !texrow_.get())
+               return;
+       int row = viewSourceTV->textCursor().blockNumber() + 1;
+       const_cast<BufferView *>(bv_)->setCursorFromRow(row, *texrow_);
+}
+
+
+
 void ViewSourceWidget::updateDefaultFormat()
 {
        if (!bv_)
diff --git a/src/frontends/qt4/GuiViewSource.h 
b/src/frontends/qt4/GuiViewSource.h
index 7b451a6..e089305 100644
--- a/src/frontends/qt4/GuiViewSource.h
+++ b/src/frontends/qt4/GuiViewSource.h
@@ -62,6 +62,8 @@ public Q_SLOTS:
        void updateDefaultFormat();
        ///
        void contentsChanged();
+       ///
+       void gotoCursor();
 
 private Q_SLOTS:
        /// update content
@@ -69,10 +71,8 @@ private Q_SLOTS:
 
 private:
        /// Get the source code of selected paragraphs, or the whole document.
-       /// If TexRow is unavailable for the format then t is null.
-       std::auto_ptr<TexRow> getContent(BufferView const * view,
-                                                                        
Buffer::OutputWhat output, docstring & str,
-                                                                        
std::string const & format, bool master);
+       void getContent(BufferView const * view, Buffer::OutputWhat output,
+                          docstring & str, std::string const & format, bool 
master);
        ///
        BufferView const * bv_;
        ///
@@ -83,6 +83,9 @@ private:
        QString view_format_;
        ///
        QTimer * update_timer_;
+       /// TexRow information from the last source view. If TexRow is 
unavailable
+       /// for the last format then texrow_ is null.
+       std::auto_ptr<TexRow> texrow_;
 };
 
 
diff --git a/src/mathed/InsetMathHull.cpp b/src/mathed/InsetMathHull.cpp
index 08c0dec..6ff8833 100644
--- a/src/mathed/InsetMathHull.cpp
+++ b/src/mathed/InsetMathHull.cpp
@@ -927,7 +927,7 @@ void InsetMathHull::validate(LaTeXFeatures & features) const
 void InsetMathHull::header_write(WriteStream & os) const
 {
        bool n = numberedType();
-       
+
        switch(type_) {
        case hullNone:
                break;

Reply via email to