#ifndef PARAGRAPH_H
#define PARAGRAPH_H
+#include "FontEnums.h"
#include "LayoutPtr.h"
#include "insets/InsetCode.h"
-#include "support/docstring.h"
-// FIXME: would be nice to forward declare odocstream instead of
-// including this:
-#include "support/docstream.h"
-
-#include <vector>
+#include "support/strfwd.h"
+#include "support/types.h"
namespace lyx {
pos_type first, last;
};
-
-/// A Paragraph holds all text, attributes and insets in a text paragraph
-/// \todo FIXME: any reference to ParagraphMetrics (including inheritance)
-/// should go in order to complete the Model/View separation of this class.
-class Paragraph {
-public:
+///
+enum TextCase {
+ ///
+ text_lowercase = 0,
///
- enum {
- /// Note that this is 1 right now to avoid
- /// crashes where getChar() is called wrongly
- /// (returning 0) - if this was 0, then we'd
- /// try getInset() and crash. We should fix
- /// all these places.
- //META_INSET = 1 // as in trunk
- META_INSET = 0x200001 // above 0x10ffff, for ucs-4
- };
+ text_capitalization = 1,
///
- typedef char_type value_type;
+ text_uppercase = 2
+};
+
+/// A Paragraph holds all text, attributes and insets in a text paragraph
+class Paragraph
+{
+public:
///
Paragraph();
///
odocstream & os,
OutputParams const & runparams) const;
- /// Checks if the paragraph contains only text and no inset or font change.
- bool onlyText(Buffer const & buf, Font const & outerfont,
- pos_type initial) const;
-
/// Writes to stream the docbook representation
void simpleDocBookOnePar(Buffer const & buf,
odocstream &,
///
InsetCode ownerCode() const;
///
- bool forceDefaultParagraphs() const;
-
+ bool forceEmptyLayout() const;
+ ///
+ bool allowParagraphCustomization() const;
///
- pos_type size() const { return text_.size(); }
+ bool useEmptyLayout() const;
///
- bool empty() const { return text_.empty(); }
+ pos_type size() const;
+ ///
+ bool empty() const;
///
LayoutPtr const & layout() const;
/// This is the item depth, only used by enumerate and itemize
signed char itemdepth;
- ///
- InsetBibitem * bibitem() const; // ale970302
-
/// look up change at given pos
Change const & lookupChange(pos_type pos) const;
/// (logically) erase the given range; return the number of chars actually erased
int eraseChars(pos_type start, pos_type end, bool trackChanges);
+ ///
+ void resetFonts(Font const & font);
+
/** Get uninstantiated font setting. Returns the difference
between the characters font and the layoutfont.
This is what is stored in the fonttable
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 Font::INHERIT, Font::IGNORE or
- Font::TOGGLE.
+ attributes with values FONT_INHERIT, FONT_IGNORE or
+ FONT_TOGGLE.
*/
Font const getFont(BufferParams const &, pos_type pos,
Font const & outerfont) const;
*/
FontSpan fontSpan(pos_type pos) const;
///
- /// this is a bottleneck.
- value_type getChar(pos_type pos) const { return text_[pos]; }
+ char_type getChar(pos_type pos) const;
/// Get the char, but mirror all bracket characters if it is right-to-left
- value_type getUChar(BufferParams const &, pos_type pos) const;
+ char_type getUChar(BufferParams const &, pos_type pos) const;
/// pos <= size() (there is a dummy font change at the end of each par)
void setFont(pos_type pos, Font const & font);
/// Returns the height of the highest font in range
- Font_size highestFontInRange(pos_type startpos,
- pos_type endpos, Font_size def_size) const;
+ FontSize highestFontInRange(pos_type startpos,
+ pos_type endpos, FontSize def_size) const;
///
void insert(pos_type pos, docstring const & str,
Font const & font, Change const & change);
void appendString(docstring const & s, Font const & font,
Change const & change);
///
- void appendChar(value_type c, Font const & font, Change const & change);
+ void appendChar(char_type c, Font const & font, Change const & change);
///
- void insertChar(pos_type pos, value_type c, bool trackChanges);
+ void insertChar(pos_type pos, char_type c, bool trackChanges);
///
- void insertChar(pos_type pos, value_type c,
+ void insertChar(pos_type pos, char_type c,
Font const &, bool trackChanges);
///
- void insertChar(pos_type pos, value_type c,
+ void insertChar(pos_type pos, char_type c,
Font const &, Change const & change);
///
void insertInset(pos_type pos, Inset * inset,
bool isHfill(pos_type pos) const;
/// hinted by profiler
- bool isInset(pos_type pos) const {
- return getChar(pos) == static_cast<value_type>(META_INSET);
- }
+ bool isInset(pos_type pos) const;
///
bool isNewline(pos_type pos) const;
/// return true if the char is a word separator
- bool isSeparator(pos_type pos) const { return getChar(pos) == ' '; }
+ bool isSeparator(pos_type pos) const;
///
bool isLineSeparator(pos_type pos) const;
/// True if the character/inset at this point can be part of a word.
/// by this author in the paragraph.
void checkAuthors(AuthorList const & authorList);
- /// return the number of InsetOptArg in a paragraph
- int numberOfOptArgs() const;
-
-private:
- /**
- * Keeping this here instead of in the pimpl makes LyX >10% faster
- * for average tasks as buffer loading/switching etc.
- */
- typedef std::vector<value_type> TextContainer;
///
- TextContainer text_;
+ void changeCase(BufferParams const & bparams, pos_type pos,
+ pos_type & right, TextCase action);
+ /// find \param str string inside Paragraph.
+ /// \return true if the specified string is at the specified position
+ /// \param del specifies whether deleted strings in ct mode will be considered
+ bool find(
+ docstring const & str, ///< string to search
+ bool cs, ///<
+ bool mw, ///<
+ pos_type pos, ///< start from here.
+ bool del = true) const;
+
+private:
/// Pimpl away stuff
class Private;
///