X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxparagraph.h;h=aacc6f2c4e315748c94c751322a8869e3b669a57;hb=77639efa94ce5c071cf47bfd3ba0026f157a1e6a;hp=00a76906f69bca326043ffe1bd81f721726ea24a;hpb=ee72ce87743857b4317da00e6e09cb6842095664;p=lyx.git diff --git a/src/lyxparagraph.h b/src/lyxparagraph.h index 00a76906f6..aacc6f2c4e 100644 --- a/src/lyxparagraph.h +++ b/src/lyxparagraph.h @@ -16,17 +16,15 @@ #pragma interface #endif +#include "LString.h" + #include #include +#include #include "insets/lyxinset.h" -#include "table.h" -#include "vspace.h" -#include "layout.h" -#include "support/block.h" #include "language.h" - -#define NEW_WAY 1 +#include "ParagraphParameters.h" class BufferParams; class LyXBuffer; @@ -35,9 +33,15 @@ struct LaTeXFeatures; class InsetBibKey; class BufferView; +// I dare you to enable this and help me find all the bugs that then show +// up. (Lgb) +#define NEW_INSETS 1 +#define NO_PEXTRA 1 + /// A LyXParagraph holds all text, attributes and insets in a text paragraph class LyXParagraph { public: +#ifndef NO_PEXTRA_REALLY /// enum PEXTRA_TYPE { /// @@ -58,9 +62,10 @@ public: /// MINIPAGE_ALIGN_BOTTOM }; -#ifndef NEW_INSETS +#endif /// enum META_KIND { +#ifndef NEW_INSETS /// META_FOOTNOTE = 1, /// @@ -77,13 +82,18 @@ public: META_WIDE_TAB, /// META_HFILL, +#else /// - META_NEWLINE, + META_HFILL = 1, +#endif /// + META_NEWLINE, + // //META_PROTECTED_SEPARATOR, /// META_INSET }; +#ifndef NEW_INSETS /// The footnoteflag enum footnote_flag { @@ -118,14 +128,17 @@ public: /// typedef std::vector TextContainer; /// - typedef int size_type; + /* This should be TextContainer::size_type, but we need + signed values for now. + */ + typedef TextContainer::difference_type size_type; /// LyXParagraph(); - /// this konstruktor inserts the new paragraph in a list + /// this constructor inserts the new paragraph in a list explicit LyXParagraph(LyXParagraph * par); - /// the destruktors removes the new paragraph from the list + /// the destructor removes the new paragraph from the list ~LyXParagraph(); /// @@ -139,9 +152,9 @@ public: bool isMultiLingual(BufferParams const &); /// - string String(Buffer const *, bool label); + string const String(Buffer const *, bool label); /// - string String(Buffer const *, size_type beg, size_type end); + string const String(Buffer const *, size_type beg, size_type end); /// void writeFile(Buffer const *, std::ostream &, BufferParams const &, @@ -150,32 +163,34 @@ public: void validate(LaTeXFeatures &) const; /// - int id() const { - return id_; - } + int id() const; /// - void id(int id_arg) { - id_ = id_arg; - } - + void id(int id_arg); /// void read(); /// LyXParagraph * TeXOnePar(Buffer const *, BufferParams const &, std::ostream &, TexRow & texrow, - bool moving_arg, + bool moving_arg +#ifndef NEW_INSETS + , std::ostream & foot, TexRow & foot_texrow, - int & foot_count); + int & foot_count +#endif + ); /// bool SimpleTeXOnePar(Buffer const *, BufferParams const &, std::ostream &, TexRow & texrow, bool moving_arg); /// LyXParagraph * TeXEnvironment(Buffer const *, BufferParams const &, - std::ostream &, TexRow & texrow, - std::ostream & foot, TexRow & foot_texrow, - int & foot_count); + std::ostream &, TexRow & texrow +#ifndef NEW_INSETS + ,std::ostream & foot, TexRow & foot_texrow, + int & foot_count +#endif + ); /// LyXParagraph * Clone() const; @@ -186,22 +201,19 @@ public: void MakeSameLayout(LyXParagraph const * par); /// Is it the first par with same depth and layout? - bool IsFirstInSequence() const { - LyXParagraph const * dhook = DepthHook(GetDepth()); - return (dhook == this - || dhook->GetLayout() != GetLayout() - || dhook->GetDepth() != GetDepth()); - } + bool IsFirstInSequence() const; /** Check if the current paragraph is the last paragraph in a proof environment */ int GetEndLabel(BufferParams const &) const; /// - Inset * InInset() { return inset_owner; } + Inset * InInset(); /// void SetInsetOwner(Inset * i); /// void deleteInsetsLyXText(BufferView *); + /// + void resizeInsetsLyXText(BufferView *); private: /// TextContainer text; @@ -210,26 +222,15 @@ private: public: /// - size_type size() const { return text.size(); } - /// - void fitToSize() { - text.resize(text.size()); - } - void setContentsFromPar(LyXParagraph * par) { - text = par->text; - } - void clearContents() { - text.clear(); - } - - /// - VSpace added_space_top; - - /// - VSpace added_space_bottom; - + size_type size() const; + /// + void fitToSize(); /// - Spacing spacing; + void setContentsFromPar(LyXParagraph * par); + /// + void clearContents(); + + ParagraphParameters params; /// LyXTextClass::LayoutList::size_type layout; @@ -246,91 +247,50 @@ public: /// footnote, margin, fig, tab footnote_kind footnotekind; #endif - //@Man: the LyX- DTP-switches - //@{ - /// - bool line_top; - - /// - bool line_bottom; - - /// - bool pagebreak_top; - - /// - bool pagebreak_bottom; - - /// - LyXAlignment align; - - /// - char depth; - - /// - bool noindent; private: - block counter_; + /// + array counter_; public: /// - void setCounter(int i, int v) { counter_[i] = v; } - int getCounter(int i) const { return counter_[i]; } - void incCounter(int i) { counter_[i]++; } + void setCounter(int i, int v); /// - bool start_of_appendix; - + int getCounter(int i) const; /// - bool appendix; + void incCounter(int i); /// char enumdepth; /// char itemdepth; - - /* This is for the paragraph extra stuff */ - /// - int pextra_type; - /// - string pextra_width; - /// - string pextra_widthp; - /// - int pextra_alignment; - /// - bool pextra_hfill; - /// - bool pextra_start_minipage; - - /// - string labelstring; - - /// - string labelwidthstring; - //@} - - /// - LyXParagraph * next; +#ifdef NEW_INSETS +private: +#endif /// - LyXParagraph * previous; - - /* table stuff -- begin*/ + LyXParagraph * next_; /// - LyXTable * table; - /* table stuff -- end*/ - + LyXParagraph * previous_; +public: /// InsetBibKey * bibkey; // ale970302 + /// + void next(LyXParagraph *); /** these function are able to hide closed footnotes */ - LyXParagraph * Next(); - + LyXParagraph * next(); + /// + LyXParagraph const * next() const; + + /// + void previous(LyXParagraph *); /// - LyXParagraph * Previous(); + LyXParagraph * previous(); /// - LyXParagraph const * Previous() const; + LyXParagraph const * previous() const; +#ifndef NEW_INSETS /** these function are able to hide open and closed footnotes */ LyXParagraph * NextAfterFootnote(); @@ -348,11 +308,11 @@ public: LyXParagraph * FirstPhysicalPar(); /// LyXParagraph const * FirstPhysicalPar() const; - /// returns the physical paragraph LyXParagraph * ParFromPos(size_type pos); /// returns the position in the physical par int PositionInParFromPos(size_type pos) const; +#endif /// for the environments LyXParagraph * DepthHook(int depth); @@ -361,10 +321,10 @@ public: /// int BeginningOfMainBody() const; /// - string GetLabelstring() const; + string const & GetLabelstring() const; /// the next two functions are for the manual labels - string GetLabelWidthString() const; + string const GetLabelWidthString() const; /// void SetLabelWidthString(string const & s); /// @@ -381,8 +341,10 @@ public: LyXTextClass::LayoutList::size_type new_layout); /// int GetFirstCounter(int i) const; +#ifndef NEW_INSETS /// size_type Last() const; +#endif /// void Erase(size_type pos); /** the flag determines wether the layout should be copied @@ -394,58 +356,56 @@ public: between the characters font and the layoutfont. This is what is stored in the fonttable */ - LyXFont GetFontSettings(BufferParams const &, size_type pos) const; + LyXFont const + GetFontSettings(BufferParams const &, size_type pos) const; /// - LyXFont GetFirstFontSettings() const; + LyXFont const GetFirstFontSettings() const; /** Get fully instantiated font. If pos == -1, use the layout - font attached to this paragraph. - If pos == -2, use the label font of the layout attached here. - In all cases, the font is instantiated, i.e. does not have any - attributes with values LyXFont::INHERIT, LyXFont::IGNORE or - LyXFont::TOGGLE. - */ - LyXFont getFont(BufferParams const &, size_type pos) const; + font attached to this paragraph. + If pos == -2, use the label font of the layout attached here. + In all cases, the font is instantiated, i.e. does not have any + attributes with values LyXFont::INHERIT, LyXFont::IGNORE or + LyXFont::TOGGLE. + */ + LyXFont const getFont(BufferParams const &, size_type pos) const; /// - char GetChar(size_type pos); + value_type GetChar(size_type pos) const; /// - char GetChar(size_type pos) const; + value_type GetUChar(BufferParams const &, size_type pos) const; /// The position must already exist. - void SetChar(size_type pos, char c) { - text[pos] = c; - } - + void SetChar(size_type pos, value_type c); /// void SetFont(size_type pos, LyXFont const & font); /// - string GetWord(size_type &) const; + string const GetWord(size_type &) const; /// Returns the height of the highest font in range LyXFont::FONT_SIZE HighestFontInRange(size_type startpos, size_type endpos) const; /// - void InsertChar(size_type pos, char c); -#ifdef NEW_WAY + void InsertChar(size_type pos, value_type c); /// - void InsertChar(size_type pos, char c, LyXFont const &); -#endif + void InsertChar(size_type pos, value_type c, LyXFont const &); /// void InsertInset(size_type pos, Inset * inset); -#ifdef NEW_WAY /// void InsertInset(size_type pos, Inset * inset, LyXFont const &); -#endif /// bool InsertInsetAllowed(Inset * inset); /// Inset * GetInset(size_type pos); /// Inset const * GetInset(size_type pos) const; +#ifndef NEW_INSETS /// void OpenFootnote(size_type pos); /// void CloseFootnote(size_type pos); - /// important for cut and paste - void CopyIntoMinibuffer(BufferParams const &, size_type pos) const; +#endif + /** important for cut and paste + Temporary change from BufferParams to Buffer. Will revert when we + get rid of the argument to Inset::Clone(Buffer const &) */ + void CopyIntoMinibuffer(Buffer const &, size_type pos) const; /// void CutIntoMinibuffer(BufferParams const &, size_type pos); /// @@ -455,8 +415,10 @@ public: bool IsHfill(size_type pos) const; /// bool IsInset(size_type pos) const; +#ifndef NEW_INSETS /// bool IsFloat(size_type pos) const; +#endif /// bool IsNewline(size_type pos) const; /// @@ -485,45 +447,40 @@ public: /// returns -1 if inset not found int GetPositionOfInset(Inset * inset) const; - + +#ifndef NEW_INSETS /// ok and now some footnote functions void OpenFootnotes(); /// void CloseFootnotes(); - /// LyXParagraph * FirstSelfrowPar(); +#endif /// int StripLeadingSpaces(LyXTextClassList::size_type tclass); - + +#ifndef NEW_INSETS /** A paragraph following a footnote is a "dummy". A paragraph - with a footnote in it is stored as three paragraphs: - First a paragraph with the text up to the footnote, then - one (or more) paragraphs with the footnote, and finally - the a paragraph with the text after the footnote. Only the - first paragraph keeps information about layoutparameters, */ + with a footnote in it is stored as three paragraphs: + First a paragraph with the text up to the footnote, then + one (or more) paragraphs with the footnote, and finally + the a paragraph with the text after the footnote. Only the + first paragraph keeps information about layoutparameters, */ bool IsDummy() const; - +#endif +#ifndef NO_PEXTRA_REALLY /* If I set a PExtra Indent on one paragraph of a ENV_LIST-TYPE I have to set it on each of it's elements */ /// - void SetPExtraType(BufferParams const &, - int type, char const * width, char const * widthp); + void SetPExtraType(BufferParams const &, int type, + string const & width, string const & widthp); /// void UnsetPExtraType(BufferParams const &); +#endif /// bool linuxDocConvertChar(char c, string & sgml_string); - /// - void DocBookContTableRows(Buffer const *, - std::ostream &, string & extra, - int & desc_on, size_type i, - int current_cell_number, int & column); - /// - void SimpleDocBookOneTablePar(Buffer const *, - std::ostream &, string & extra, - int & desc_on, int depth); private: /// struct InsetTable { @@ -532,23 +489,17 @@ private: /// Inset * inset; /// - InsetTable(size_type p, Inset * i) { pos = p; inset = i;} + InsetTable(size_type p, Inset * i) : pos(p), inset(i) {} }; /// friend struct matchIT; /// struct matchIT { - /// used by lower_bound + /// used by lower_bound and upper_bound inline int operator()(LyXParagraph::InsetTable const & a, - LyXParagraph::size_type pos) const { - return a.pos < pos; - } - /// used by upper_bound - inline - int operator()(LyXParagraph::size_type pos, - LyXParagraph::InsetTable const & a) const { - return pos < a.pos; + LyXParagraph::InsetTable const & b) const { + return a.pos < b.pos; } }; /** A font entry covers a range of positions. Notice that the @@ -563,8 +514,23 @@ private: (font_1 covers the chars 0,...,pos_1) (Dekel) */ struct FontTable { + /// + FontTable(size_type p, LyXFont const & f) + : pos_(p) + { + font_ = container.get(f); + } + /// + size_type pos() const { return pos_; } + /// + void pos(size_type p) { pos_ = p; } + /// + LyXFont const & font() const { return *font_; } + /// + void font(LyXFont const & f) { font_ = container.get(f);} + private: /// End position of paragraph this font attribute covers - size_type pos; + size_type pos_; /** Font. Interpretation of the font values: If a value is LyXFont::INHERIT_*, it means that the font attribute is inherited from either the layout of this @@ -574,24 +540,19 @@ private: The values LyXFont::IGNORE_* and LyXFont::TOGGLE are NOT allowed in these font tables. */ - LyXFont font; + boost::shared_ptr font_; /// - FontTable(size_type p, LyXFont const & f) {pos = p; font = f;} + static ShareContainer container; }; + /// friend struct matchFT; /// struct matchFT { - /// used by lower_bound + /// used by lower_bound and upper_bound inline int operator()(LyXParagraph::FontTable const & a, - LyXParagraph::size_type pos) const { - return a.pos < pos; - } - /// used by upper_bound - inline - int operator()(LyXParagraph::size_type pos, - LyXParagraph::FontTable const & a) const { - return pos < a.pos; + LyXParagraph::FontTable const & b) const { + return a.pos() < b.pos(); } }; @@ -605,23 +566,20 @@ private: InsetList insetlist; /// LyXParagraph * TeXDeeper(Buffer const *, BufferParams const &, - std::ostream &, TexRow & texrow, - std::ostream & foot, TexRow & foot_texrow, - int & foot_count); + std::ostream &, TexRow & texrow +#ifndef NEW_INSETS + ,std::ostream & foot, TexRow & foot_texrow, + int & foot_count +#endif + ); +#ifndef NEW_INSETS /// LyXParagraph * TeXFootnote(Buffer const *, BufferParams const &, std::ostream &, TexRow & texrow, std::ostream & foot, TexRow & foot_texrow, int & foot_count, bool parent_is_rtl); - /// - bool SimpleTeXOneTablePar(Buffer const *, BufferParams const &, - std::ostream &, TexRow & texrow); - /// - bool TeXContTableRows(Buffer const *, BufferParams const &, - std::ostream &, size_type i, - int current_cell_number, - int & column, TexRow & texrow); +#endif /// void SimpleTeXBlanks(std::ostream &, TexRow & texrow, size_type const i, @@ -635,42 +593,132 @@ private: LyXFont & basefont, bool & open_font, LyXLayout const & style, size_type & i, - int & column, char const c); + int & column, value_type const c); /// unsigned int id_; /// static unsigned int paragraph_id; public: + /// class inset_iterator { public: + /// inset_iterator() {} + // inset_iterator(InsetList::iterator const & iter) : it(iter) {}; + /// inset_iterator & operator++() { ++it; return *this; } + /// Inset * operator*() { return (*it).inset; } - size_type getPos() {return (*it).pos; } + /// + size_type getPos() const {return (*it).pos; } + /// bool operator==(inset_iterator const & iter) const { return it == iter.it; } + /// bool operator!=(inset_iterator const & iter) const { return it != iter.it; } private: + /// InsetList::iterator it; }; /// - inset_iterator inset_iterator_begin() { - return inset_iterator(insetlist.begin()); - } + inset_iterator inset_iterator_begin(); /// - inset_iterator inset_iterator_end() { - return inset_iterator(insetlist.end()); - } + inset_iterator inset_iterator_end(); /// inset_iterator InsetIterator(size_type pos); - }; + +inline +int LyXParagraph::id() const +{ + return id_; +} + + +inline +void LyXParagraph::id(int id_arg) +{ + id_ = id_arg; +} + + +inline +bool LyXParagraph::IsFirstInSequence() const +{ + LyXParagraph const * dhook = DepthHook(GetDepth()); + return (dhook == this + || dhook->GetLayout() != GetLayout() + || dhook->GetDepth() != GetDepth()); +} + + +inline +Inset * LyXParagraph::InInset() +{ + return inset_owner; +} + + +inline +LyXParagraph::size_type LyXParagraph::size() const +{ + return text.size(); +} + + +inline +void LyXParagraph::clearContents() +{ + text.clear(); +} + + +inline +void LyXParagraph::setCounter(int i, int v) +{ + counter_[i] = v; +} + + +inline +int LyXParagraph::getCounter(int i) const +{ + return counter_[i]; +} + + +inline +void LyXParagraph::incCounter(int i) +{ + counter_[i]++; +} + + +inline +void LyXParagraph::SetChar(size_type pos, value_type c) +{ + text[pos] = c; +} + + +inline +LyXParagraph::inset_iterator LyXParagraph::inset_iterator_begin() +{ + return inset_iterator(insetlist.begin()); +} + + +inline +LyXParagraph::inset_iterator LyXParagraph::inset_iterator_end() +{ + return inset_iterator(insetlist.end()); +} #endif