2 * \file math_textinset.C
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * Full author contact details are available in file CREDITS.
13 #include "math_textinset.h"
14 #include "math_data.h"
16 #include "cursor_slice.h"
18 #include "metricsinfo.h"
24 MathTextInset::MathTextInset()
29 auto_ptr<InsetBase> MathTextInset::clone() const
31 return auto_ptr<InsetBase>(new MathTextInset(*this));
35 MathInset::idx_type MathTextInset::pos2row(pos_type pos) const
37 for (pos_type r = 0, n = cache_.nargs(); r < n; ++r)
38 if (pos >= cache_.cellinfo_[r].begin_ && pos <= cache_.cellinfo_[r].end_)
40 lyxerr << "illegal row for pos " << pos << endl;
45 void MathTextInset::getCursorPos(CursorSlice const & cur, int & x, int & y) const
48 c.idx() = pos2row(cur.pos());
49 c.pos() -= cache_.cellinfo_[c.idx()].begin_;
50 cache_.getCursorPos(c, x, y);
51 y = cache_.cell(c.idx()).yo();
56 bool MathTextInset::idxUpDown2(LCursor & pos, bool up) const
58 // try to move only one screen row up or down if possible
59 idx_type i = pos2row(pos);
60 //lyxerr << "\nMathTextInset::idxUpDown() i: " << i << endl;
61 MathGridInset::CellInfo const & cell1 = cache_.cellinfo_[i];
62 int const x = cache_.cell(i).pos2x(pos - cell1.begin_, cell1.glue_);
69 if (i == cache_.nargs())
72 MathGridInset::CellInfo const & cell2 = cache_.cellinfo_[i];
73 pos = cell2.begin_ + cache_.cell(i).x2pos(x, cell2.glue_);
79 void MathTextInset::metrics(MetricsInfo & mi, Dimension & dim) const
83 // we do our own metrics fiddling
84 // save old positional information
85 int const old_xo = cache_.cell(0).xo();
86 int const old_yo = cache_.cell(0).yo();
89 cache_ = MathGridInset(1, 0);
96 for (size_type i = 0, n = cell(0).size(); i < n; ++i) {
97 //lyxerr << "at pos: " << i << " of " << n << " safepos: " << safepos
98 // << " curr: " << curr << " safe: " << safe
99 // << " spaces: " << spaces << endl;
102 // <char> <char> <char> <space> <char> <char> <char>
103 // ................... <safe>
104 // ..........................<curr>
105 // ....................<safepos>
107 // Special handling of spaces. We reached a safe position for breaking.
108 char const c = cell(0)[i]->getChar();
110 //lyxerr << "reached safe pos" << endl;
111 // we don't count the space into the safe pos
113 // we reset to this safepos if the next chunk does not fit
116 // restart chunk with size of the space
117 curr = cell(0)[i]->width();
122 // This is a regular char. Go on if we either don't care for
123 // the width limit or have not reached that limit.
124 curr += cell(0)[i]->width();
125 if (curr + safe <= mi.base.textwidth)
129 // We passed the limit. Create a row entry.
130 //lyxerr << "passed limit" << endl;
132 MathArray & ar = cache_.cell(cache_.nargs() - 1);
133 MathGridInset::CellInfo & row = cache_.cellinfo_.back();
135 // we are here because we hit a hard newline
138 begin = i + 1; // next chunk starts after the newline
141 // but we had a space break before this position.
142 // so retreat to this position
143 //lyxerr << "... but had safe pos." << endl;
145 row.end_ = safepos; // this is position of the safe space
146 i = safepos; // i gets incremented at end of loop
147 begin = i + 1; // next chunk starts after the space
150 // This item is too large and it is the only one.
151 // We have no choice but to produce an overfull box.
152 lyxerr << "... without safe pos" << endl;
157 ar = MathArray(cell(0).begin() + row.begin_, cell(0).begin() + row.end_);
158 //lyxerr << "line: " << ar << endl;
159 // in any case, start the new row with empty boxes
163 // last row: put in everything else
165 MathArray & ar = cache_.cell(cache_.nargs() - 1);
166 MathGridInset::CellInfo & row = cache_.cellinfo_.back();
168 row.end_ = cell(0).size();
169 ar = MathArray(cell(0).begin() + row.begin_, cell(0).begin() + row.end_);
170 //lyxerr << "last line: " << ar.data() << endl;
173 cache_.metrics(mi, dim_);
174 //lyxerr << "outer dim: " << dim_ << endl;
176 // reset position cache
177 for (idx_type i = 0; i < cache_.nargs(); ++i)
178 cache_.cell(i).setXY(old_xo, old_yo);
184 void MathTextInset::draw(PainterInfo & pi, int x, int y) const
186 cache_.draw(pi, x + 1, y);
191 void MathTextInset::drawSelection(PainterInfo & pi,
192 idx_type idx1, pos_type pos1, idx_type idx2, pos_type pos2) const
194 cache_.drawSelection(pi, idx1, pos1, idx2, pos2);