Re-introduction of a BraceInset to handle "extra braces"

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@2943 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2001-10-29 15:45:24 +00:00
parent 549d6b7441
commit fcc87d756b
9 changed files with 178 additions and 28 deletions

View File

@ -12,6 +12,8 @@ Items marked with
!! - mark "not a bug, a feature" replies, usually with a request for !! - mark "not a bug, a feature" replies, usually with a request for
further discussion further discussion
pp - partially fixed
Unmarked items are known unfixed but probably unverified bugs. Unmarked items are known unfixed but probably unverified bugs.
---------------------------------------------------------------------- ----------------------------------------------------------------------
@ -60,7 +62,7 @@ Misc:
// - When you press the mouse just to the left of the middle point of // - When you press the mouse just to the left of the middle point of
// some char, the cursor will be positioned to the right of the char. // some char, the cursor will be positioned to the right of the char.
- It is possible to put two or more consecutive spaces in math text mode pp - It is possible to put two or more consecutive spaces in math text mode
// - Text in superscript is not smaller than normal text. // - Text in superscript is not smaller than normal text.
@ -113,9 +115,9 @@ Eran Tromer:
// enter the cell its cell and press // enter the cell its cell and press
// M-m ( M-f 1 <right> <right> <right> (zoom=100, screenDPI=100) // M-m ( M-f 1 <right> <right> <right> (zoom=100, screenDPI=100)
- When selecting multiple cells in a array using the keyboard, <left> // - When selecting multiple cells in a array using the keyboard, <left>
etc. should can move whole cell at a time -- no need to navigate // etc. should can move whole cell at a time -- no need to navigate
within cells. // within cells.
- When selecting, maybe give a visual indication of the "original" - When selecting, maybe give a visual indication of the "original"
anchor, when it differs from the "actual" one. anchor, when it differs from the "actual" one.

View File

@ -24,6 +24,8 @@ libmathed_la_SOURCES = \
math_atom.h \ math_atom.h \
math_binominset.C \ math_binominset.C \
math_binominset.h \ math_binominset.h \
math_braceinset.C \
math_braceinset.h \
math_boxinset.C \ math_boxinset.C \
math_boxinset.h \ math_boxinset.h \
math_charinset.C \ math_charinset.C \

View File

@ -291,14 +291,6 @@ InsetFormula::localDispatch(BufferView * bv, kb_action action,
break; break;
} }
case LFUN_MATH_EXTERN:
bv->lockedInsetStoreUndo(Undo::EDIT);
handleExtern(arg);
// re-compute inset dimension
metrics(bv);
updateLocal(bv, true);
break;
case LFUN_MATH_MUTATE: case LFUN_MATH_MUTATE:
{ {
bv->lockedInsetStoreUndo(Undo::EDIT); bv->lockedInsetStoreUndo(Undo::EDIT);
@ -312,6 +304,16 @@ InsetFormula::localDispatch(BufferView * bv, kb_action action,
break; break;
} }
case LFUN_MATH_EXTERN:
{
bv->lockedInsetStoreUndo(Undo::EDIT);
handleExtern(arg);
// re-compute inset dimension
metrics(bv);
updateLocal(bv, true);
break;
}
case LFUN_MATH_DISPLAY: case LFUN_MATH_DISPLAY:
{ {
int x; int x;

View File

@ -0,0 +1,56 @@
#include <config.h>
#ifdef __GNUG__
#pragma implementation
#endif
#include "math_braceinset.h"
#include "math_parser.h"
#include "mathed/support.h"
#include "support/LOstream.h"
using std::max;
MathBraceInset::MathBraceInset()
: MathNestInset(1)
{}
MathInset * MathBraceInset::clone() const
{
return new MathBraceInset(*this);
}
void MathBraceInset::write(MathWriteInfo & os) const
{
os << '{' << cell(0) << '}';
}
void MathBraceInset::writeNormal(std::ostream & os) const
{
os << "[block ";
cell(0).writeNormal(os);
os << "]";
}
void MathBraceInset::metrics(MathMetricsInfo const & mi) const
{
xcell(0).metrics(mi);
int a, d;
mathed_char_dim(LM_TC_TEX, mi, '{', a, d, wid_);
ascent_ = std::max(xcell(0).ascent(), a);
descent_ = std::max(xcell(0).descent(), a);
width_ = xcell(0).width() + 2 * wid_;
}
void MathBraceInset::draw(Painter & pain, int x, int y) const
{
drawChar(pain, LM_TC_TEX, mi_, x, y, '{');
xcell(0).draw(pain, x + wid_, y);
drawChar(pain, LM_TC_TEX, mi_, x + width_ - wid_, y, '}');
}

View File

@ -0,0 +1,38 @@
// -*- C++ -*-
#ifndef MATH_BRACEINSET_H
#define MATH_BRACEINSET_H
#include "math_nestinset.h"
#include "math_metricsinfo.h"
#ifdef __GNUG__
#pragma interface
#endif
/** Extra nesting
\author André Pönitz
*/
class MathBraceInset : public MathNestInset {
public:
///
MathBraceInset();
///
MathInset * clone() const;
///
void draw(Painter &, int x, int y) const;
///
void write(MathWriteInfo & os) const;
/// write normalized content
void writeNormal(std::ostream &) const;
///
void metrics(MathMetricsInfo const & st) const;
private:
/// width of brace character
mutable int wid_;
///
MathMetricsInfo mi_;
};
#endif

View File

@ -33,6 +33,7 @@
#include "math_cursor.h" #include "math_cursor.h"
#include "math_factory.h" #include "math_factory.h"
#include "math_arrayinset.h" #include "math_arrayinset.h"
#include "math_braceinset.h"
#include "math_charinset.h" #include "math_charinset.h"
#include "math_deliminset.h" #include "math_deliminset.h"
#include "math_matrixinset.h" #include "math_matrixinset.h"
@ -786,7 +787,6 @@ void MathCursor::drawSelection(Painter & pain) const
MathCursorPos i1; MathCursorPos i1;
MathCursorPos i2; MathCursorPos i2;
getSelection(i1, i2); getSelection(i1, i2);
//lyxerr << "selection from: " << i1 << " to " << i2 << "\n"; //lyxerr << "selection from: " << i1 << " to " << i2 << "\n";
if (i1.idx_ == i2.idx_) { if (i1.idx_ == i2.idx_) {
@ -808,6 +808,18 @@ void MathCursor::drawSelection(Painter & pain) const
pain.fillRectangle(x1, y1, x2 - x1, y2 - y1, LColor::selection); pain.fillRectangle(x1, y1, x2 - x1, y2 - y1, LColor::selection);
} }
} }
#if 0
// draw anchor if different from selection boundary
MathCursorPos anc = Anchor_.back();
if (anc != i1 && anc != i2) {
MathXArray & c = anc.xcell();
int x = c.xo() + c.pos2x(anc.pos_);
int y1 = c.yo() - c.ascent();
int y2 = c.yo() + c.descent();
pain.line(x, y1, x, y2, LColor::mathline);
}
#endif
} }
@ -1385,10 +1397,21 @@ void MathCursor::interpret(char c)
return; return;
} }
/*
if (strchr("{}", c)) { if (strchr("{}", c)) {
insert(c, LM_TC_TEX); insert(c, LM_TC_TEX);
return; return;
} }
*/
if (c == '{') {
niceInsert(MathAtom(new MathBraceInset));
return;
}
if (c == '}') {
return;
}
if (strchr("#$%", c)) { if (strchr("#$%", c)) {
insert(MathAtom(new MathSpecialCharInset(c))); insert(MathAtom(new MathSpecialCharInset(c)));

View File

@ -11,6 +11,7 @@
using std::max; using std::max;
MathDelimInset::MathDelimInset(string const & l, string const & r) MathDelimInset::MathDelimInset(string const & l, string const & r)
: MathNestInset(1), left_(l), right_(r) : MathNestInset(1), left_(l), right_(r)
{} {}
@ -51,7 +52,9 @@ void MathDelimInset::write(MathWriteInfo & os) const
void MathDelimInset::writeNormal(std::ostream & os) const void MathDelimInset::writeNormal(std::ostream & os) const
{ {
os << "[delim " << latexName(left_) << " " << latexName(right_) << "]"; os << "[delim " << latexName(left_) << ' ' << latexName(right_) << ' ';
cell(0).writeNormal(os);
os << "]";
} }

View File

@ -15,6 +15,34 @@
* the GNU General Public Licence version 2 or later. * the GNU General Public Licence version 2 or later.
*/ */
/*
If someone desperately needs partial "structures" (such as a few cells of
an array inset or similar) (s)he could uses the following hack as starting
point to write some macros:
\newif\ifcomment
\commentfalse
\ifcomment
\def\makeamptab{\catcode`\&=4\relax}
\def\makeampletter{\catcode`\&=11\relax}
\def\b{\makeampletter\expandafter\makeamptab\bi}
\long\def\bi#1\e{}
\else
\def\b{}\def\e{}
\fi
...
\[\begin{array}{ccc}
1 & 2\b & 3^2\\
4 & 5\e & 6\\
7 & 8 & 9
\end{array}\]
*/
#include <config.h> #include <config.h>
#include <cctype> #include <cctype>
@ -28,6 +56,7 @@
#include "array.h" #include "array.h"
#include "math_inset.h" #include "math_inset.h"
#include "math_arrayinset.h" #include "math_arrayinset.h"
#include "math_braceinset.h"
#include "math_charinset.h" #include "math_charinset.h"
#include "math_deliminset.h" #include "math_deliminset.h"
#include "math_factory.h" #include "math_factory.h"
@ -642,9 +671,6 @@ bool Parser::parse_normal(MathAtom & matrix)
void Parser::parse_into(MathArray & array, unsigned flags, MathTextCodes code) void Parser::parse_into(MathArray & array, unsigned flags, MathTextCodes code)
{ {
stack<MathTextCodes> fontcodes;
fontcodes.push(LM_TC_MIN);
bool panic = false; bool panic = false;
int limits = 0; int limits = 0;
@ -695,11 +721,10 @@ void Parser::parse_into(MathArray & array, unsigned flags, MathTextCodes code)
break; break;
else if (t.cat() == catLetter) else if (t.cat() == catLetter)
add(array, t.character(), fontcodes.top()); add(array, t.character(), code);
else if (t.cat() == catSpace && else if (t.cat() == catSpace && code == LM_TC_TEXTRM)
(fontcodes.top() == LM_TC_TEXTRM || code == LM_TC_TEXTRM)) add(array, t.character(), code);
add(array, ' ', fontcodes.top());
else if (t.cat() == catParameter) { else if (t.cat() == catParameter) {
Token const & n = getToken(); Token const & n = getToken();
@ -707,15 +732,15 @@ void Parser::parse_into(MathArray & array, unsigned flags, MathTextCodes code)
} }
else if (t.cat() == catBegin) { else if (t.cat() == catBegin) {
add(array, '{', LM_TC_TEX); array.push_back(MathAtom(new MathBraceInset));
fontcodes.push(LM_TC_MIN); parse_into(array.back()->cell(0), FLAG_BRACE_LAST, LM_TC_MIN);
} }
else if (t.cat() == catEnd) { else if (t.cat() == catEnd) {
if (flags & FLAG_BRACE_LAST) if (flags & FLAG_BRACE_LAST)
return; return;
lyxerr << "found '}' unexpectedly, array: '" << array << "'\n";
add(array, '}', LM_TC_TEX); add(array, '}', LM_TC_TEX);
fontcodes.pop();
} }
else if (t.cat() == catAlign) { else if (t.cat() == catAlign) {
@ -742,7 +767,7 @@ void Parser::parse_into(MathArray & array, unsigned flags, MathTextCodes code)
return; return;
else if (t.cat() == catOther) else if (t.cat() == catOther)
add(array, t.character(), fontcodes.top()); add(array, t.character(), code);
// //
// codesequences // codesequences
@ -930,8 +955,7 @@ void Parser::parse_into(MathArray & array, unsigned flags, MathTextCodes code)
} }
else if (l->token == LM_TK_OLDFONT) { else if (l->token == LM_TK_OLDFONT) {
fontcodes.pop(); code = static_cast<MathTextCodes>(l->id);
fontcodes.push(static_cast<MathTextCodes>(l->id));
} }
else { else {

View File

@ -24,7 +24,7 @@ void MathSymbolInset::write(MathWriteInfo & os) const
void MathSymbolInset::writeNormal(ostream & os) const void MathSymbolInset::writeNormal(ostream & os) const
{ {
os << "[" << sym_->name << "] "; os << "[symbol " << sym_->name << "]";
} }