// -*- C++ -*-
+/**
+ * \file math_atom.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_ATOM_H
#define MATH_ATOM_H
-#include <config.h>
-#include <iosfwd>
-#ifdef __GNUG__
-#pragma interface
-#endif
+/**
+Wrapper for MathInset * with copy-semantics
-#include "math_defs.h"
+--
-/**
The 'atom' is the major blob in math typesetting. And 'atom' consists
of a nucleus, an optional superscript, and an optional subscript.
Exactly where the subscript and superscript are drawn depends on the
-size, and type, of the nucleus they are attached to.
+size, and type, of the nucleus they are attached to.
Jules
+
+--
+
+Ok: Implementing it thusly is not feasible since cursor movement gets
+hackish. We use MathAtom only as a wrapper around MathInset * with value
+semantics.
+
+The MathAtom owns the MathInset * and is responsible for proper cloning and
+destruction. Every MathInset * should be put into a MathAtom after its
+creation as soon as possible.
+
+Andre'
+
*/
-class LaTeXFeatures;
-class MathCharInset;
-class MathScriptInset;
+class InsetBase;
class MathInset;
-class MathMacro;
-class MathArray;
-class Painter;
class MathAtom {
-public:
- ///
+public:
+ /// default constructor, object is useless, but we need it to put it into
+ // std::containers
MathAtom();
- ///
+ /// the "real constructor"
+ explicit MathAtom(InsetBase * p);
+ /// copy constructor, invokes nucleus_->clone()
MathAtom(MathAtom const &);
- ///
- explicit MathAtom(MathInset * p);
- ///
- virtual ~MathAtom();
- ///
+ /// we really need to clean up
+ ~MathAtom();
+ /// assignment invokes nucleus_->clone()
void operator=(MathAtom const &);
- ///
- void swap(MathAtom &);
-
- /// draw the object, sets xo_ and yo_ cached values
- virtual void draw(Painter &, int x, int y) const;
- /// reproduce itself
- void metrics(MathStyles st) const;
- ///
- int ascent() const;
- ///
- int descent() const;
- ///
- int width() const;
- ///
- int height() const;
-
- ///
- int xo() const;
- ///
- int yo() const;
- ///
- void xo(int tx) const;
- ///
- void yo(int ty) const;
- ///
-
- ///
- void getXY(int & x, int & y) const;
- ///
- bool covers(int x, int y) const;
+ /// access to the inset (checked with gprof)
+ MathInset * nucleus() { return nucleus_; }
+ /// access to the inset
+ MathInset const * operator->() const { return nucleus_; }
- ///
- void dump() const;
- ///
- void validate(LaTeXFeatures & features) const;
- ///
- void handleFont(MathTextCodes) {}
-
- /// make sure superscript is available
- MathScriptInset * ensure(bool up);
- /// delete subscript array if empty
- void removeEmptyScripts();
- /// can we add a super- or subscript?
- virtual bool allows(bool up) const { return script_[up] == 0; }
- /// can we add a super- or subscript?
- virtual bool allowsLimits() const { return true; }
- /// set limits
- void limits(int lim) { limits_ = lim; }
- ///
- int limits() const { return limits_; }
- ///
- bool hasLimits() const;
- /// returns superscript
- MathScriptInset * up() const;
- /// returns subscript
- MathScriptInset * down() const;
- ///
- MathInset * nucleus() const { return nucleus_; }
- ///
- void substitute(const MathMacro &);
- ///
- void write(std::ostream &, bool) const;
- ///
- void writeNormal(std::ostream &) const;
+ /// width cache. Not nice...
+ mutable int width_;
-protected:
- /// possible subscript (index 0) and superscript (index 1)
- MathScriptInset * script_[2];
+private:
///
MathInset * nucleus_;
- ///
- int limits_;
-
-private:
- /// the following are used for positioning the cursor with the mouse
- /// cached cursor start position in pixels from the document left
- mutable int xo_;
- /// cached cursor start position in pixels from the document top
- mutable int yo_;
-
- /// raw copy
- void copy(MathAtom const & p);
- /// raw destruction
- void done();
-
- /// returns y offset for superscript
- int dy0() const;
- /// returns y offset for subscript
- int dy1() const;
- /// returns x offset for superscript
- int dx0() const;
- /// returns x offset for subscript
- int dx1() const;
- /// returns x offset for main part
- int dxx() const;
- /// returns width of nucleus if any
- int nwid() const;
- /// returns ascent of nucleus if any
- int nasc() const;
- /// returns descent of nucleus if any
- int ndes() const;
};
-std::ostream & operator<<(std::ostream &, MathAtom const &);
-
#endif