]> git.lyx.org Git - lyx.git/blobdiff - src/text2.C
* Painter.h:
[lyx.git] / src / text2.C
index 09b9a2ce93747ded3f0604b420cb6074e439c1fd..96023861b0aec75c8615436777bb42faa2612075 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "buffer.h"
 #include "buffer_funcs.h"
+#include "bufferlist.h"
 #include "bufferparams.h"
 #include "BufferView.h"
 #include "Bullet.h"
 #include "gettext.h"
 #include "language.h"
 #include "LColor.h"
+#include "lyxfunc.h"
 #include "lyxrc.h"
 #include "lyxrow.h"
-#include "lyxrow_funcs.h"
 #include "paragraph.h"
 #include "paragraph_funcs.h"
 #include "ParagraphParameters.h"
 #include "pariterator.h"
+#include "lyxserver.h"
+#include "lyxsocket.h"
 #include "undo.h"
 #include "vspace.h"
 
-#include "frontends/font_metrics.h"
-#include "frontends/LyXView.h"
+#include "frontends/FontMetrics.h"
 
 #include "insets/insetenv.h"
 
@@ -59,9 +61,8 @@
 
 #include <sstream>
 
-using lyx::docstring;
-using lyx::pit_type;
-using lyx::pos_type;
+
+namespace lyx {
 
 using std::endl;
 using std::ostringstream;
@@ -125,21 +126,21 @@ InsetBase * LyXText::checkInsetHit(int x, int y) const
                        << BOOST_CURRENT_FUNCTION
                        << ": examining inset " << inset << endl;
 
-               if (theCoords.getInsets().has(inset))
+               if (bv()->coordCache().getInsets().has(inset))
                        lyxerr[Debug::DEBUG]
                                << BOOST_CURRENT_FUNCTION
-                               << ": xo: " << inset->xo() << "..."
-                               << inset->xo() + inset->width()
-                               << " yo: " << inset->yo() - inset->ascent()
+                               << ": xo: " << inset->xo(*bv()) << "..."
+                               << inset->xo(*bv()) + inset->width()
+                               << " yo: " << inset->yo(*bv()) - inset->ascent()
                                << "..."
-                               << inset->yo() + inset->descent()
+                               << inset->yo(*bv()) + inset->descent()
                                << endl;
                else
                        lyxerr[Debug::DEBUG]
                                << BOOST_CURRENT_FUNCTION
                                << ": inset has no cached position" << endl;
 #endif
-               if (inset->covers(x, y)) {
+               if (inset->covers(*bv(), x, y)) {
                        lyxerr[Debug::DEBUG]
                                << BOOST_CURRENT_FUNCTION
                                << ": Hit inset: " << inset << endl;
@@ -366,13 +367,13 @@ void LyXText::setLayout(LCursor & cur, string const & layout)
        if (lyxlayout->is_environment) {
                // move everything in a new environment inset
                lyxerr[Debug::DEBUG] << "setting layout " << layout << endl;
-               bv.owner()->dispatch(FuncRequest(LFUN_LINE_BEGIN));
-               bv.owner()->dispatch(FuncRequest(LFUN_LINE_END_SELECT));
-               bv.owner()->dispatch(FuncRequest(LFUN_CUT));
+               lyx::dispatch(FuncRequest(LFUN_LINE_BEGIN));
+               lyx::dispatch(FuncRequest(LFUN_LINE_END_SELECT));
+               lyx::dispatch(FuncRequest(LFUN_CUT));
                InsetBase * inset = new InsetEnvironment(params, layout);
                insertInset(cur, inset);
                //inset->edit(cur, true);
-               //bv.owner()->dispatch(FuncRequest(LFUN_PASTE));
+               //lyx::dispatch(FuncRequest(LFUN_PASTE));
                return;
        }
 
@@ -385,10 +386,7 @@ void LyXText::setLayout(LCursor & cur, string const & layout)
 }
 
 
-namespace {
-
-
-bool changeDepthAllowed(LyXText::DEPTH_CHANGE type,
+static bool changeDepthAllowed(LyXText::DEPTH_CHANGE type,
                        Paragraph const & par, int max_depth)
 {
        if (par.layout()->labeltype == LABEL_BIBLIO)
@@ -402,9 +400,6 @@ bool changeDepthAllowed(LyXText::DEPTH_CHANGE type,
 }
 
 
-}
-
-
 bool LyXText::changeDepthAllowed(LCursor & cur, DEPTH_CHANGE type) const
 {
        BOOST_ASSERT(this == cur.text());
@@ -417,7 +412,7 @@ bool LyXText::changeDepthAllowed(LCursor & cur, DEPTH_CHANGE type) const
        int max_depth = (beg != 0 ? pars_[beg - 1].getMaxDepthAfter() : 0);
 
        for (pit_type pit = beg; pit != end; ++pit) {
-               if (::changeDepthAllowed(type, pars_[pit], max_depth))
+               if (lyx::changeDepthAllowed(type, pars_[pit], max_depth))
                        return true;
                max_depth = pars_[pit].getMaxDepthAfter();
        }
@@ -435,7 +430,7 @@ void LyXText::changeDepth(LCursor & cur, DEPTH_CHANGE type)
 
        for (pit_type pit = beg; pit != end; ++pit) {
                Paragraph & par = pars_[pit];
-               if (::changeDepthAllowed(type, par, max_depth)) {
+               if (lyx::changeDepthAllowed(type, par, max_depth)) {
                        int const depth = par.params().depth();
                        if (type == INC_DEPTH)
                                par.params().depth(depth + 1);
@@ -507,7 +502,6 @@ bool LyXText::cursorHome(LCursor & cur)
 {
        BOOST_ASSERT(this == cur.text());
        Row const & row = cur.paragraph().getRow(cur.pos(),cur.boundary());
-
        return setCursor(cur, cur.pit(), row.pos());
 }
 
@@ -566,7 +560,7 @@ void LyXText::toggleFree(LCursor & cur, LyXFont const & font, bool toggleall)
        bool implicitSelection =
                font.language() == ignore_language
                && font.number() == LyXFont::IGNORE
-               && selectWordWhenUnderCursor(cur, lyx::WHOLE_WORD_STRICT);
+               && selectWordWhenUnderCursor(cur, WHOLE_WORD_STRICT);
 
        // Set font
        setFont(cur, font, toggleall);
@@ -593,7 +587,7 @@ string LyXText::getStringToIndex(LCursor const & cur)
                // in the language the implicit word selection is
                // disabled.
                LCursor tmpcur = cur;
-               selectWord(tmpcur, lyx::PREVIOUS_WORD);
+               selectWord(tmpcur, PREVIOUS_WORD);
 
                if (!tmpcur.selection())
                        cur.message(_("Nothing to index!"));
@@ -603,7 +597,7 @@ string LyXText::getStringToIndex(LCursor const & cur)
                        idxstring = tmpcur.selectionAsString(false);
        }
 
-       return lyx::to_utf8(idxstring);
+       return to_utf8(idxstring);
 }
 
 
@@ -633,7 +627,8 @@ void LyXText::setParagraph(LCursor & cur,
                        else
                                params.align(align);
                }
-               par.setLabelWidthString(labelwidthstring);
+               // FIXME UNICODE
+               par.setLabelWidthString(from_ascii(labelwidthstring));
                params.noindent(noindent);
        }
 }
@@ -644,7 +639,9 @@ void LyXText::insertInset(LCursor & cur, InsetBase * inset)
 {
        BOOST_ASSERT(this == cur.text());
        BOOST_ASSERT(inset);
-       cur.paragraph().insertInset(cur.pos(), inset);
+       cur.paragraph().insertInset(cur.pos(), inset, 
+                                   Change(cur.buffer().params().trackChanges ?
+                                          Change::INSERTED : Change::UNCHANGED));
 }
 
 
@@ -773,7 +770,7 @@ void LyXText::setCurrentFont(LCursor & cur)
 pos_type LyXText::getColumnNearX(pit_type const pit,
                                 Row const & row, int & x, bool & boundary) const
 {
-       int const xo = theCoords.get(this, pit).x_;
+       int const xo = bv()->coordCache().get(this, pit).x_;
        x -= xo;
        RowMetrics const r = computeRowMetrics(pit, row);
        Paragraph const & par = pars_[pit];
@@ -800,19 +797,21 @@ pos_type LyXText::getColumnNearX(pit_type const pit,
                return 0;
        }
 
+       frontend::FontMetrics const & fm 
+               = theFontMetrics(getLabelFont(par));
+
        while (vc < end && tmpx <= x) {
                c = bidi.vis2log(vc);
                last_tmpx = tmpx;
                if (body_pos > 0 && c == body_pos - 1) {
-                       string lsep = layout->labelsep;
-                       docstring dlsep(lsep.begin(), lsep.end());
-                       tmpx += r.label_hfill +
-                               font_metrics::width(dlsep, getLabelFont(par));
+                       // FIXME UNICODE
+                       docstring const lsep = from_utf8(layout->labelsep);
+                       tmpx += r.label_hfill + fm.width(lsep);
                        if (par.isLineSeparator(body_pos - 1))
                                tmpx -= singleWidth(par, body_pos - 1);
                }
 
-               if (hfillExpansion(par, row, c)) {
+               if (par.hfillExpansion(row, c)) {
                        tmpx += singleWidth(par, c);
                        if (c >= body_pos)
                                tmpx += r.hfill;
@@ -907,8 +906,8 @@ pos_type LyXText::getColumnNearX(pit_type const pit,
 pit_type LyXText::getPitNearY(int y) const
 {
        BOOST_ASSERT(!paragraphs().empty());
-       BOOST_ASSERT(theCoords.getParPos().find(this) != theCoords.getParPos().end());
-       CoordCache::InnerParPosCache const & cc = theCoords.getParPos().find(this)->second;
+       BOOST_ASSERT(bv()->coordCache().getParPos().find(this) != bv()->coordCache().getParPos().end());
+       CoordCache::InnerParPosCache const & cc = bv()->coordCache().getParPos().find(this)->second;
        lyxerr[Debug::DEBUG]
                << BOOST_CURRENT_FUNCTION
                << ": y: " << y << " cache size: " << cc.size()
@@ -944,7 +943,7 @@ pit_type LyXText::getPitNearY(int y) const
 Row const & LyXText::getRowNearY(int y, pit_type pit) const
 {
        Paragraph const & par = pars_[pit];
-       int yy = theCoords.get(this, pit).y_ - par.ascent();
+       int yy = bv()->coordCache().get(this, pit).y_ - par.ascent();
        BOOST_ASSERT(!par.rows().empty());
        RowList::const_iterator rit = par.rows().begin();
        RowList::const_iterator const rlast = boost::prior(par.rows().end());
@@ -959,6 +958,10 @@ Row const & LyXText::getRowNearY(int y, pit_type pit) const
 // sets cursor recursively descending into nested editable insets
 InsetBase * LyXText::editXY(LCursor & cur, int x, int y)
 {
+       if (lyxerr.debugging(Debug::WORKAREA)) {
+               lyxerr << "LyXText::editXY(cur, " << x << ", " << y << ")" << std::endl;
+               bv()->coordCache().dump();
+       }
        pit_type pit = getPitNearY(y);
        BOOST_ASSERT(pit != -1);
        Row const & row = getRowNearY(y, pit);
@@ -983,8 +986,11 @@ InsetBase * LyXText::editXY(LCursor & cur, int x, int y)
 
        // This should be just before or just behind the
        // cursor position set above.
-       BOOST_ASSERT((pos != 0 && inset == pars_[pit].getInset(pos - 1))
-                    || inset == pars_[pit].getInset(pos));
+        InsetBase * inset2 = pars_[pit].getInset(pos - 1);
+        InsetBase * inset3 = pars_[pit].getInset(pos);
+        
+       BOOST_ASSERT((pos != 0 && inset == inset2)
+                    || inset == inset3);
        // Make sure the cursor points to the position before
        // this inset.
        if (inset == pars_[pit].getInset(pos - 1))
@@ -1079,7 +1085,7 @@ bool LyXText::cursorUp(LCursor & cur)
                row = par.pos2row(cur.pos());
 
        if (!cur.selection()) {
-               int const y = bv_funcs::getPos(cur, cur.boundary()).y_;
+               int const y = bv_funcs::getPos(cur.bv(), cur, cur.boundary()).y_;
                LCursor old = cur;
                // Go to middle of previous row. 16 found to work OK;
                // 12 = top/bottom margin of display math
@@ -1128,7 +1134,7 @@ bool LyXText::cursorDown(LCursor & cur)
                row = par.pos2row(cur.pos());
 
        if (!cur.selection()) {
-               int const y = bv_funcs::getPos(cur, cur.boundary()).y_;
+               int const y = bv_funcs::getPos(cur.bv(), cur, cur.boundary()).y_;
                LCursor old = cur;
                // To middle of next row
                int const margin = 3 * InsetMathHull::displayMargin() / 2;
@@ -1255,11 +1261,8 @@ bool LyXText::deleteEmptyParagraphMechanism(LCursor & cur, LCursor & old)
                    && old.pos() < oldpar.size()
                    && oldpar.isLineSeparator(old.pos())
                    && oldpar.isLineSeparator(old.pos() - 1)
-                   && oldpar.lookupChange(old.pos() - 1) != Change::DELETED) {
-                       // We need to set the text to Change::INSERTED to
-                       // get it erased properly
-                       oldpar.setChange(old.pos() -1, Change::INSERTED);
-                       oldpar.erase(old.pos() - 1);
+                   && !oldpar.isDeleted(old.pos() - 1)) {
+                       oldpar.eraseChar(old.pos() - 1, false); // do not track changes in DEPM
 #ifdef WITH_WARNINGS
 #warning This will not work anymore when we have multiple views of the same buffer
 // In this case, we will have to correct also the cursors held by
@@ -1338,5 +1341,8 @@ void LyXText::recUndo(pit_type par) const
 
 int defaultRowHeight()
 {
-       return int(font_metrics::maxHeight(LyXFont(LyXFont::ALL_SANE)) *  1.2);
+       return int(theFontMetrics(LyXFont(LyXFont::ALL_SANE)).maxHeight() *  1.2);
 }
+
+
+} // namespace lyx