2001-06-25 00:06:33 +00:00
|
|
|
// -*- C++ -*-
|
|
|
|
/* This file is part of
|
2002-03-21 17:27:08 +00:00
|
|
|
* ======================================================
|
|
|
|
*
|
2001-06-25 00:06:33 +00:00
|
|
|
* LyX, The Document Processor
|
2002-03-21 17:27:08 +00:00
|
|
|
*
|
2001-06-25 00:06:33 +00:00
|
|
|
* Copyright 1995 Matthias Ettrich
|
|
|
|
* Copyright 1995-2001 The LyX Team.
|
|
|
|
*
|
|
|
|
* ====================================================== */
|
|
|
|
|
|
|
|
#ifndef PARAGRAPH_PIMPL_H
|
|
|
|
#define PARAGRAPH_PIMPL_H
|
|
|
|
|
|
|
|
#ifdef __GNUG__
|
|
|
|
#pragma interface
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "paragraph.h"
|
|
|
|
#include "ParagraphParameters.h"
|
2001-12-28 13:26:54 +00:00
|
|
|
|
2001-06-25 00:06:33 +00:00
|
|
|
#include <boost/array.hpp>
|
|
|
|
|
2001-12-28 13:26:54 +00:00
|
|
|
class LyXLayout;
|
|
|
|
|
2001-06-25 00:06:33 +00:00
|
|
|
struct Paragraph::Pimpl {
|
2001-11-26 16:42:04 +00:00
|
|
|
///
|
|
|
|
typedef std::vector<value_type> TextContainer;
|
|
|
|
|
2001-06-25 00:06:33 +00:00
|
|
|
///
|
|
|
|
Pimpl(Paragraph * owner);
|
|
|
|
/// Copy constructor
|
2001-07-06 15:57:54 +00:00
|
|
|
Pimpl(Pimpl const &, Paragraph * owner, bool same_ids = false);
|
2001-06-25 00:06:33 +00:00
|
|
|
///
|
2001-11-27 10:34:16 +00:00
|
|
|
lyx::pos_type size() const {
|
2001-06-25 00:06:33 +00:00
|
|
|
return text.size();
|
|
|
|
}
|
|
|
|
///
|
|
|
|
void clear();
|
|
|
|
///
|
|
|
|
void setContentsFromPar(Paragraph const * par);
|
|
|
|
///
|
2001-11-27 10:34:16 +00:00
|
|
|
value_type getChar(lyx::pos_type pos) const;
|
2001-06-25 00:06:33 +00:00
|
|
|
///
|
2001-11-27 10:34:16 +00:00
|
|
|
void setChar(lyx::pos_type pos, value_type c);
|
2001-06-25 00:06:33 +00:00
|
|
|
///
|
2001-11-27 10:34:16 +00:00
|
|
|
void insertChar(lyx::pos_type pos, value_type c, LyXFont const & font);
|
2001-06-25 00:06:33 +00:00
|
|
|
///
|
2001-11-27 10:34:16 +00:00
|
|
|
void insertInset(lyx::pos_type pos, Inset * inset, LyXFont const & font);
|
2001-06-25 00:06:33 +00:00
|
|
|
///
|
2001-11-27 10:34:16 +00:00
|
|
|
void erase(lyx::pos_type pos);
|
2001-06-25 00:06:33 +00:00
|
|
|
///
|
2001-08-03 18:28:11 +00:00
|
|
|
LyXFont const realizeFont(LyXFont const & font,
|
|
|
|
BufferParams const & bparams) const;
|
|
|
|
///
|
2001-06-25 00:06:33 +00:00
|
|
|
Inset * inset_owner;
|
|
|
|
///
|
|
|
|
boost::array<int, 10> counter_;
|
|
|
|
|
|
|
|
///
|
|
|
|
friend struct matchIT;
|
|
|
|
///
|
|
|
|
struct matchIT {
|
|
|
|
/// used by lower_bound and upper_bound
|
|
|
|
inline
|
2001-11-26 16:42:04 +00:00
|
|
|
int operator()(InsetTable const & a, InsetTable const & b) const {
|
2001-06-25 00:06:33 +00:00
|
|
|
return a.pos < b.pos;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
/** A font entry covers a range of positions. Notice that the
|
|
|
|
entries in the list are inserted in random order.
|
|
|
|
I don't think it's worth the effort to implement a more effective
|
|
|
|
datastructure, because the number of different fonts in a paragraph
|
|
|
|
is limited. (Asger)
|
|
|
|
Nevertheless, I decided to store fontlist using a sorted vector:
|
|
|
|
fontlist = { {pos_1,font_1} , {pos_2,font_2} , ... } where
|
|
|
|
pos_1 < pos_2 < ..., font_{i-1} != font_i for all i,
|
|
|
|
and font_i covers the chars in positions pos_{i-1}+1,...,pos_i
|
|
|
|
(font_1 covers the chars 0,...,pos_1) (Dekel)
|
|
|
|
*/
|
|
|
|
struct FontTable {
|
|
|
|
///
|
2001-11-27 10:34:16 +00:00
|
|
|
FontTable(lyx::pos_type p, LyXFont const & f)
|
2001-06-25 00:06:33 +00:00
|
|
|
: pos_(p)
|
|
|
|
{
|
|
|
|
font_ = container.get(f);
|
|
|
|
}
|
|
|
|
///
|
2001-11-27 10:34:16 +00:00
|
|
|
lyx::pos_type pos() const { return pos_; }
|
2001-06-25 00:06:33 +00:00
|
|
|
///
|
2001-11-27 10:34:16 +00:00
|
|
|
void pos(lyx::pos_type p) { pos_ = p; }
|
2001-06-25 00:06:33 +00:00
|
|
|
///
|
|
|
|
LyXFont const & font() const { return *font_; }
|
|
|
|
///
|
|
|
|
void font(LyXFont const & f) { font_ = container.get(f);}
|
|
|
|
private:
|
|
|
|
/// End position of paragraph this font attribute covers
|
2001-11-27 10:34:16 +00:00
|
|
|
lyx::pos_type pos_;
|
2001-06-25 00:06:33 +00:00
|
|
|
/** Font. Interpretation of the font values:
|
2002-03-21 17:27:08 +00:00
|
|
|
If a value is LyXFont::INHERIT_*, it means that the font
|
2001-06-25 00:06:33 +00:00
|
|
|
attribute is inherited from either the layout of this
|
2002-03-21 17:27:08 +00:00
|
|
|
paragraph or, in the case of nested paragraphs, from the
|
|
|
|
layout in the environment one level up until completely
|
2001-06-25 00:06:33 +00:00
|
|
|
resolved.
|
2002-03-21 17:27:08 +00:00
|
|
|
The values LyXFont::IGNORE_* and LyXFont::TOGGLE are NOT
|
2001-06-25 00:06:33 +00:00
|
|
|
allowed in these font tables.
|
|
|
|
*/
|
|
|
|
boost::shared_ptr<LyXFont> font_;
|
|
|
|
///
|
|
|
|
static ShareContainer<LyXFont> container;
|
|
|
|
};
|
|
|
|
///
|
|
|
|
friend struct matchFT;
|
|
|
|
///
|
|
|
|
struct matchFT {
|
|
|
|
/// used by lower_bound and upper_bound
|
|
|
|
inline
|
2001-11-26 16:42:04 +00:00
|
|
|
int operator()(FontTable const & a, FontTable const & b) const {
|
2001-06-25 00:06:33 +00:00
|
|
|
return a.pos() < b.pos();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
///
|
|
|
|
typedef std::vector<FontTable> FontList;
|
|
|
|
///
|
|
|
|
FontList fontlist;
|
|
|
|
///
|
|
|
|
Paragraph * TeXDeeper(Buffer const *, BufferParams const &,
|
|
|
|
std::ostream &, TexRow & texrow);
|
|
|
|
///
|
|
|
|
void simpleTeXBlanks(std::ostream &, TexRow & texrow,
|
2001-11-27 10:34:16 +00:00
|
|
|
lyx::pos_type const i,
|
2001-06-25 00:06:33 +00:00
|
|
|
int & column, LyXFont const & font,
|
|
|
|
LyXLayout const & style);
|
|
|
|
///
|
|
|
|
void simpleTeXSpecialChars(Buffer const *, BufferParams const &,
|
|
|
|
std::ostream &, TexRow & texrow,
|
|
|
|
bool moving_arg,
|
|
|
|
LyXFont & font, LyXFont & running_font,
|
|
|
|
LyXFont & basefont, bool & open_font,
|
|
|
|
LyXLayout const & style,
|
2001-11-27 10:34:16 +00:00
|
|
|
lyx::pos_type & i,
|
2001-06-25 00:06:33 +00:00
|
|
|
int & column, value_type const c);
|
2002-07-20 16:42:15 +00:00
|
|
|
|
|
|
|
///
|
|
|
|
void validate(LaTeXFeatures & features,
|
|
|
|
LyXLayout const & layout) const;
|
|
|
|
|
2001-06-25 00:06:33 +00:00
|
|
|
///
|
2001-07-06 15:57:54 +00:00
|
|
|
Paragraph * getParFromID(int id) const;
|
|
|
|
///
|
2001-06-25 00:06:33 +00:00
|
|
|
unsigned int id_;
|
|
|
|
///
|
|
|
|
static unsigned int paragraph_id;
|
|
|
|
///
|
|
|
|
ParagraphParameters params;
|
|
|
|
private:
|
2001-11-23 09:59:01 +00:00
|
|
|
/// match a string against a particular point in the paragraph
|
2002-07-20 16:42:15 +00:00
|
|
|
bool isTextAt(string const & str, lyx::pos_type pos) const;
|
2002-03-21 17:27:08 +00:00
|
|
|
|
2001-06-25 00:06:33 +00:00
|
|
|
/// Who owns us?
|
|
|
|
Paragraph * owner_;
|
|
|
|
///
|
|
|
|
TextContainer text;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|