lyx_mirror/src/mathed/InsetMathScript.h

147 lines
4.9 KiB
C
Raw Normal View History

// -*- C++ -*-
/**
* \file InsetMathScript.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author André Pönitz
*
* Full author contact details are available in file CREDITS.
*/
#ifndef MATH_SCRIPTINSET_H
#define MATH_SCRIPTINSET_H
#include "InsetMathNest.h"
namespace lyx {
the stuff from the sneak preview: For one, it still contains a few things that are already in CVS (the 'brown paperbag' changes). Secondly, this changes the ParagraphList to a std::vector but does not yet take full advantage of it except removing LyXText::parOffset() and similar. I had an extensive talk with my profiler and we are happy nevertheless. This also moves almost all Cut&Paste specific stuff from text.C to CutAndPaste.C. Much smaller interface now... Namespace CutAndPaste is now lyx::cap::. Was inconsistent with the rest.... Make ParagraphList a proper class. We'll need this later for a specialized erase/insert. Remove some unneeded prototypes and function declarations Use ParameterStruct directly instead of ShareContainer<ParameterStruct> Inline a few accesses to CursorSlice members as suggested by the profiler. Fix commandline conversion crash reported by Kayvan. Replace PosIterator by DocumentIterator. The latter can also iterate through math and nested text in math... Remove math specific hack from Documentiterator Derive InsetCollapsable from InsetText instead of using an InsetText member. This give us the opportunity to get rid of the InsetOld::owner_ backpointer. Cosmetics in CutAndPaste.C and cursor.C. Fix nasty crash (popping slices off an empty selection anchor). Add a few asserts. Remove all 'manual' update calls. We do now one per user interaction which is completely sufficient. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8527 a592a061-630c-0410-9148-cb99ea01b6c8
2004-03-25 09:16:36 +00:00
// An inset for super- and subscripts or both. The 'nucleus' is always
// cell 0. If there is just one script, it's cell 1 and cell_1_is_up_
// is set accordingly. If both are used, cell 1 is up and cell 2 is down.
class InsetMathScript : public InsetMathNest {
public:
/// create inset without scripts
explicit InsetMathScript(Buffer * buf);
/// create inset with single script
explicit InsetMathScript(Buffer * buf, bool up);
/// create inset with single script and given nucleus
InsetMathScript(Buffer * buf, MathAtom const & at, bool up);
///
mode_type currentMode() const override { return MATH_MODE; }
///
MathClass mathClass() const override;
///
void metrics(MetricsInfo & mi, Dimension & dim) const override;
///
void draw(PainterInfo & pi, int x, int y) const override;
///
void metricsT(TextMetricsInfo const & mi, Dimension & dim) const override;
///
void drawT(TextPainter & pi, int x, int y) const override;
/// move cursor backwards
bool idxBackward(Cursor & cur) const override;
/// move cursor forward
bool idxForward(Cursor & cur) const override;
/// move cursor up or down
bool idxUpDown(Cursor & cur, bool up) const override;
/// The index of the cell entered while moving backward
2020-10-03 12:42:14 +00:00
size_type lastIdx() const override { return 0; }
/// write LaTeX and Lyx code
void write(WriteStream & os) const override;
/// write normalized content
void normalize(NormalStream &) const override;
/// write content as something readable by Maple
void maple(MapleStream &) const override;
/// write content as something readable by Mathematica
void mathematica(MathematicaStream &) const override;
/// write content as MathML
void mathmlize(MathStream &) const override;
/// write content as HTML
void htmlize(HtmlStream &) const override;
/// write content as something readable by Octave
void octave(OctaveStream &) const override;
/// identifies scriptinsets
InsetMathScript const * asScriptInset() const override;
///
InsetMathScript * asScriptInset() override;
/// returns subscript. Always run 'hasDown' or 'has(false)' before!
MathData const & down() const;
/// returns subscript. Always run 'hasDown' or 'has(false)' before!
MathData & down();
/// returns superscript. Always run 'hasUp' or 'has(true)' before!
MathData const & up() const;
/// returns superscript. Always run 'hasUp' or 'has(true)' before!
MathData & up();
/// returns nucleus
MathData const & nuc() const;
/// returns nucleus
MathData & nuc();
/// do we have a superscript?
bool hasUp() const;
/// do we have a subscript?
bool hasDown() const;
/// do we have a script?
bool has(bool up) const;
the stuff from the sneak preview: For one, it still contains a few things that are already in CVS (the 'brown paperbag' changes). Secondly, this changes the ParagraphList to a std::vector but does not yet take full advantage of it except removing LyXText::parOffset() and similar. I had an extensive talk with my profiler and we are happy nevertheless. This also moves almost all Cut&Paste specific stuff from text.C to CutAndPaste.C. Much smaller interface now... Namespace CutAndPaste is now lyx::cap::. Was inconsistent with the rest.... Make ParagraphList a proper class. We'll need this later for a specialized erase/insert. Remove some unneeded prototypes and function declarations Use ParameterStruct directly instead of ShareContainer<ParameterStruct> Inline a few accesses to CursorSlice members as suggested by the profiler. Fix commandline conversion crash reported by Kayvan. Replace PosIterator by DocumentIterator. The latter can also iterate through math and nested text in math... Remove math specific hack from Documentiterator Derive InsetCollapsable from InsetText instead of using an InsetText member. This give us the opportunity to get rid of the InsetOld::owner_ backpointer. Cosmetics in CutAndPaste.C and cursor.C. Fix nasty crash (popping slices off an empty selection anchor). Add a few asserts. Remove all 'manual' update calls. We do now one per user interaction which is completely sufficient. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8527 a592a061-630c-0410-9148-cb99ea01b6c8
2004-03-25 09:16:36 +00:00
/// what idx has super/subscript?
idx_type idxOfScript(bool up) const;
/// remove script
void removeScript(bool up);
/// make sure a script is accessible
void ensure(bool up);
/// say that we have scripts
void infoize(odocstream & os) const override;
/// say whether we have displayed limits
void infoize2(odocstream & os) const override;
///
InsetCode lyxCode() const override { return MATH_SCRIPT_CODE; }
///
void validate(LaTeXFeatures &features) const override;
private:
Inset * clone() const override;
/// returns x offset for main part
int dxx(BufferView const & bv) const;
/// returns width of nucleus if any
int nwid(BufferView const &) const;
/// returns y offset for either superscript or subscript
int dy01(BufferView const &, int asc, int des, int what) const;
/// returns y offset for superscript
int dy0(BufferView const &) const;
/// returns y offset for subscript
int dy1(BufferView const &) const;
/// returns x offset for superscript
int dx0(BufferView const & bv) const;
/// returns x offset for subscript
int dx1(BufferView const & bv) const;
/// returns ascent of nucleus if any
int nasc(BufferView const &) const;
/// returns descent of nucleus if any
int ndes(BufferView const &) const;
/// Italic correction: amount of displacement between subscript and
/// superscript in math mode as per Appendix G, rule 18f. A positive value
/// shifts the superscript to the right, and a negative value shifts the
/// subscript to the left.
int nker(BufferView const * bv) const;
/// do we we have to draw the scripts above/below nucleus?
bool hasLimits(FontInfo const &) const;
/// clean up empty cells and return true if a cell has been deleted.
bool notifyCursorLeaves(Cursor const & old, Cursor & cur) override;
/// possible subscript (index 0) and superscript (index 1)
the stuff from the sneak preview: For one, it still contains a few things that are already in CVS (the 'brown paperbag' changes). Secondly, this changes the ParagraphList to a std::vector but does not yet take full advantage of it except removing LyXText::parOffset() and similar. I had an extensive talk with my profiler and we are happy nevertheless. This also moves almost all Cut&Paste specific stuff from text.C to CutAndPaste.C. Much smaller interface now... Namespace CutAndPaste is now lyx::cap::. Was inconsistent with the rest.... Make ParagraphList a proper class. We'll need this later for a specialized erase/insert. Remove some unneeded prototypes and function declarations Use ParameterStruct directly instead of ShareContainer<ParameterStruct> Inline a few accesses to CursorSlice members as suggested by the profiler. Fix commandline conversion crash reported by Kayvan. Replace PosIterator by DocumentIterator. The latter can also iterate through math and nested text in math... Remove math specific hack from Documentiterator Derive InsetCollapsable from InsetText instead of using an InsetText member. This give us the opportunity to get rid of the InsetOld::owner_ backpointer. Cosmetics in CutAndPaste.C and cursor.C. Fix nasty crash (popping slices off an empty selection anchor). Add a few asserts. Remove all 'manual' update calls. We do now one per user interaction which is completely sufficient. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8527 a592a061-630c-0410-9148-cb99ea01b6c8
2004-03-25 09:16:36 +00:00
bool cell_1_is_up_;
/// remember whether we are in display mode (used by mathml output)
mutable bool has_limits_ = false;
};
} // namespace lyx
#endif