]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView.cpp
* do not lookup the same macro all the time
[lyx.git] / src / BufferView.cpp
index 8e44d0ddb53fab2a5ef312ae582b81f9042d1a15..03efbffd2b577e60b08b4ae77df5cb9eb6a76958 100644 (file)
@@ -40,7 +40,7 @@
 #include "lyxfind.h"
 #include "LyXFunc.h"
 #include "Layout.h"
-#include "LyXText.h"
+#include "Text.h"
 #include "TextClass.h"
 #include "LyXRC.h"
 #include "Session.h"
@@ -417,7 +417,7 @@ void BufferView::updateScrollbar()
                return;
        }
 
-       LyXText & t = buffer_->text();
+       Text & t = buffer_->text();
        TextMetrics & tm = text_metrics_[&t];
 
        int const parsize = int(t.paragraphs().size() - 1);
@@ -485,7 +485,7 @@ void BufferView::scrollDocView(int value)
        if (!buffer_)
                return;
 
-       LyXText & t = buffer_->text();
+       Text & t = buffer_->text();
        TextMetrics & tm = text_metrics_[&t];
 
        float const bar = value / float(wh_ * t.paragraphs().size());
@@ -506,7 +506,7 @@ void BufferView::setCursorFromScrollbar()
        if (!buffer_)
                return;
 
-       LyXText & t = buffer_->text();
+       Text & t = buffer_->text();
 
        int const height = 2 * defaultRowHeight();
        int const first = height;
@@ -583,9 +583,12 @@ boost::tuple<pit_type, pos_type, int> BufferView::moveToPosition(pit_type bottom
                ParIterator par = buffer_->getParFromID(top_id);
                if (par != buffer_->par_iterator_end()) {
                        DocIterator dit = makeDocIterator(par, min(par->size(), top_pos));
-                       // Some slices of the iterator may not be reachable (e.g. closed collapsable inset)
-                       // so the dociterator may need to be shortened. Otherwise, setCursor may
-                       // crash lyx when the cursor can not be set to these insets.
+                       // Some slices of the iterator may not be
+                       // reachable (e.g. closed collapsable inset)
+                       // so the dociterator may need to be
+                       // shortened. Otherwise, setCursor may crash
+                       // lyx when the cursor can not be set to these
+                       // insets.
                        size_t const n = dit.depth();
                        for (size_t i = 0; i < n; ++i)
                                if (dit[i].inset().editable() != Inset::HIGHLY_EDITABLE) {
@@ -604,14 +607,12 @@ boost::tuple<pit_type, pos_type, int> BufferView::moveToPosition(pit_type bottom
        // it will be restored to the left of the outmost inset that contains
        // the bookmark.
        if (static_cast<size_t>(bottom_pit) < buffer_->paragraphs().size()) {
-               ParIterator it = buffer_->par_iterator_begin();
-               ParIterator const end = buffer_->par_iterator_end();
-               for (; it != end; ++it)
-                       if (it.pit() == bottom_pit) {
-                               // restored pos may be bigger than it->size
-                               setCursor(makeDocIterator(it, min(bottom_pos, it->size())));
-                               return boost::make_tuple(bottom_pit, bottom_pos, it->id());
-                       }
+               DocIterator it = doc_iterator_begin(buffer_->inset());
+               it.pit() = bottom_pit;
+               it.pos() = min(bottom_pos, it.paragraph().size());
+               setCursor(it);
+               return boost::make_tuple(it.pit(), it.pos(), 
+                                        it.paragraph().id());
        }
        // both methods fail
        return boost::make_tuple(pit_type(0), pos_type(0), 0);
@@ -668,7 +669,7 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd)
        case LFUN_FILE_INSERT_PLAINTEXT_PARA:
        case LFUN_FILE_INSERT_PLAINTEXT:
        case LFUN_BOOKMARK_SAVE:
-               // FIXME: Actually, these LFUNS should be moved to LyXText
+               // FIXME: Actually, these LFUNS should be moved to Text
                flag.enabled(cursor_.inTexted());
                break;
        case LFUN_FONT_STATE:
@@ -706,7 +707,7 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd)
                break;
 
        case LFUN_CHANGES_OUTPUT:
-               flag.enabled(buffer_ && LaTeXFeatures::isAvailable("dvipost"));
+               flag.enabled(buffer_);
                flag.setOnOff(buffer_->params().outputChanges);
                break;
 
@@ -889,6 +890,25 @@ Update::flags BufferView::dispatch(FuncRequest const & cmd)
 
        case LFUN_CHANGES_OUTPUT:
                buffer_->params().outputChanges = !buffer_->params().outputChanges;
+               if (buffer_->params().outputChanges) {
+                       bool dvipost    = LaTeXFeatures::isAvailable("dvipost");
+                       bool xcolorsoul = LaTeXFeatures::isAvailable("soul") &&
+                                         LaTeXFeatures::isAvailable("xcolor");
+               
+                       if (!dvipost && !xcolorsoul) {
+                               Alert::warning(_("Changes not shown in LaTeX output"),
+                                              _("Changes will not be highlighted in LaTeX output, "
+                                                "because neither dvipost nor xcolor/soul are installed.\n"
+                                                "Please install these packages or redefine "
+                                                "\\lyxadded and \\lyxdeleted in the LaTeX preamble."));
+                       } else if (!xcolorsoul) {
+                               Alert::warning(_("Changes not shown in LaTeX output"),
+                                              _("Changes will not be highlighted in LaTeX output "
+                                                "when using pdflatex, because xcolor and soul are not installed.\n"
+                                                "Please install both packages or redefine "
+                                                "\\lyxadded and \\lyxdeleted in the LaTeX preamble."));
+                       }
+               }
                break;
 
        case LFUN_CHANGE_NEXT:
@@ -906,7 +926,7 @@ Update::flags BufferView::dispatch(FuncRequest const & cmd)
                cursor_.selHandle(true);
                buffer_->text().cursorBottom(cursor_);
                // accept everything in a single step to support atomic undo
-               buffer_->text().acceptOrRejectChanges(cursor_, LyXText::ACCEPT);
+               buffer_->text().acceptOrRejectChanges(cursor_, Text::ACCEPT);
                break;
 
        case LFUN_ALL_CHANGES_REJECT:
@@ -916,7 +936,7 @@ Update::flags BufferView::dispatch(FuncRequest const & cmd)
                buffer_->text().cursorBottom(cursor_);
                // reject everything in a single step to support atomic undo
                // Note: reject does not work recursively; the user may have to repeat the operation
-               buffer_->text().acceptOrRejectChanges(cursor_, LyXText::REJECT);
+               buffer_->text().acceptOrRejectChanges(cursor_, Text::REJECT);
                break;
 
        case LFUN_WORD_FIND:
@@ -1102,7 +1122,7 @@ void BufferView::workAreaResize(int width, int height)
 }
 
 
-Inset const * BufferView::getCoveringInset(LyXText const & text, int x, int y)
+Inset const * BufferView::getCoveringInset(Text const & text, int x, int y)
 {
        pit_type pit = text.getPitNearY(*this, y);
        BOOST_ASSERT(pit != -1);
@@ -1127,7 +1147,7 @@ Inset const * BufferView::getCoveringInset(LyXText const & text, int x, int y)
                        size_t cell_number = inset->nargs();
                        // Check all the inner cell.
                        for (size_t i = 0; i != cell_number; ++i) {
-                               LyXText const * inner_text = inset->getText(i);
+                               Text const * inner_text = inset->getText(i);
                                if (inner_text) {
                                        // Try deeper.
                                        Inset const * inset_deeper = 
@@ -1167,7 +1187,7 @@ bool BufferView::workAreaDispatch(FuncRequest const & cmd0)
        cur.selection() = cursor_.selection();
 
        // Either the inset under the cursor or the
-       // surrounding LyXText will handle this event.
+       // surrounding Text will handle this event.
 
        // make sure we stay within the screen...
        cmd.y = min(max(cmd.y, -1), height_);
@@ -1209,7 +1229,7 @@ bool BufferView::workAreaDispatch(FuncRequest const & cmd0)
                        // between background updates and text updates. So we use the hammer
                        // solution for now. We could also avoid the updateMetrics() below
                        // by using the first and last pit of the CoordCache. Have a look
-                       // at LyXText::getPitNearY() to see what I mean.
+                       // at Text::getPitNearY() to see what I mean.
                        //
                        //metrics_info_.pit1 = first pit of CoordCache;
                        //metrics_info_.pit2 = last pit of CoordCache;
@@ -1257,7 +1277,7 @@ void BufferView::scroll(int /*lines*/)
 //     if (!buffer_)
 //             return;
 //
-//     LyXText const * t = &buffer_->text();
+//     Text const * t = &buffer_->text();
 //     int const line_height = defaultRowHeight();
 //
 //     // The new absolute coordinate
@@ -1300,24 +1320,24 @@ void BufferView::gotoLabel(docstring const & label)
 }
 
 
-TextMetrics const & BufferView::textMetrics(LyXText const * t) const
+TextMetrics const & BufferView::textMetrics(Text const * t) const
 {
        return const_cast<BufferView *>(this)->textMetrics(t);
 }
 
 
-TextMetrics & BufferView::textMetrics(LyXText const * t)
+TextMetrics & BufferView::textMetrics(Text const * t)
 {
        TextMetricsCache::iterator tmc_it  = text_metrics_.find(t);
        if (tmc_it == text_metrics_.end()) {
                tmc_it = text_metrics_.insert(
-                       make_pair(t, TextMetrics(this, const_cast<LyXText *>(t)))).first;
+                       make_pair(t, TextMetrics(this, const_cast<Text *>(t)))).first;
        }       
        return tmc_it->second;
 }
 
 
-ParagraphMetrics const & BufferView::parMetrics(LyXText const * t,
+ParagraphMetrics const & BufferView::parMetrics(Text const * t,
                pit_type pit) const
 {
        return textMetrics(t).parMetrics(pit);
@@ -1452,7 +1472,7 @@ ViewMetricsInfo const & BufferView::viewMetricsInfo()
 // FIXME: We should split-up updateMetrics() for the singlepar case.
 void BufferView::updateMetrics(bool singlepar)
 {
-       LyXText & buftext = buffer_->text();
+       Text & buftext = buffer_->text();
        TextMetrics & tm = textMetrics(&buftext);
        pit_type size = int(buftext.paragraphs().size());