ultimatepp/uppsrc/DocTypes/DocTypes.h
cxl 597466fea8 uppsrc: NAMESPACE_UPP / END_UPP_NAMESPACE removed
git-svn-id: svn://ultimatepp.org/upp/trunk@10186 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2016-08-26 17:15:30 +00:00

716 lines
24 KiB
C++

#ifndef DOCTYPES_H
#define DOCTYPES_H
// THIS PACKAGE IS OBSOLETE
// DO NOT USE IN NEW CODE!!!
// USE RICHTEXT INSTEAD
#include <Draw/Draw.h>
#include <RichText/RichText.h>
#include <CtrlLib/CtrlLib.h>
namespace Upp {
enum { DOC_SCREEN_ZOOM = 140 };
class ParaTypo {
public:
struct Part {
Font font;
Color color;
int overhang;
int ascent;
int descent;
int external;
void *voidptr;
int width;
FontInfo Set(Font font, Color color);
};
protected:
int total;
Alignment align;
int pgcx;
const char *textbeg;
int minascent;
int mindescent;
int minexternal;
int len;
const char *text;
int *width;
Part **info;
int cx;
int ascent;
int descent;
int external;
int nspc;
bool last;
void Begin(const char *c, int *w, Part **ii) { text = c; width = w; info = ii; nspc = cx = 0; }
int Align();
virtual bool PutAligned(int lm);
virtual bool Put();
virtual bool PutRaw();
public:
void SetMin(int ma, int md, int me) { minascent = ma; mindescent = md, minexternal = me; }
bool Format(Alignment align, int len, char *text, int *width, Part **info, int cx);
ParaTypo() { minascent = mindescent = minexternal = 0; }
};
inline int DocZoom(int zoom, int val) { return (zoom * val) >> 10; }
inline int DocZoomLn(int zoom, int val) { return val ? max(DocZoom(zoom, val), 1) : 0; }
struct ValueRect : Moveable<ValueRect> {
Value value;
Rect rect;
};
class Table;
class Paragraph : Moveable<Paragraph>, DeepCopyOption<Paragraph> {
public:
struct Style {
Alignment align;
int before, lm, rm, indent, after;
int bulletindent;
Color bulletcolor;
Size bulletsize;
PaintRect bullet;
void Init();
};
struct Part : Moveable<Part> {
Font font;
int delta;
Color color;
String text;
Size sz;
PaintRect pr;
Value value;
Part() { delta = 0; }
};
struct PaintInfo {
int yl;
int ypos;
PaintInfo() { yl = 0; }
};
protected:
int length;
Vector<Part> part;
Font parafont;
Style style;
class ParaPaint;
class ParaAngle;
class ParaHeight;
class ParaRect;
public:
static PaintRect& StdBullet();
static PaintRect& WhiteBullet();
static PaintRect& BoxBullet();
static PaintRect& WhiteBoxBullet();
Paragraph& Cat(const String& s, Font font, Color color, const Value& val, int delta = 0);
Paragraph& Cat(const PaintRect& pr, int cx, int cy, const Value& val, Color color = Black);
Paragraph& Cat(const String& s, Font font, Color color = Black, int delta = 0);
Paragraph& Cat(const char *s, Font font, Color color = Black, int delta = 0);
Paragraph& Cat(const PaintRect& pr, int cx, int cy = 0, Color color = Black) { return Cat(pr, cx, cy, Null, color); }
Paragraph& Cat(const PaintRect& pr, Size sz, Color color = Black) { return Cat(pr, sz.cx, sz.cy, color); }
Paragraph& Cat(const PaintRect& pr, Color color = Black) { return Cat(pr, pr.GetStdSize(), color); }
Paragraph& Cat(const Paragraph& p);
Paragraph& Align(Alignment a) { style.align = a; return *this; }
Paragraph& Left() { style.align = ALIGN_LEFT; return *this; }
Paragraph& Right() { style.align = ALIGN_RIGHT; return *this; }
Paragraph& Center() { style.align = ALIGN_CENTER; return *this; }
Paragraph& Justify() { style.align = ALIGN_JUSTIFY; return *this; }
Paragraph& Lm(int x) { style.lm = x; return *this; }
Paragraph& Rm(int x) { style.rm = x; return *this; }
Paragraph& Indent(int x) { style.indent = x; return *this; }
Paragraph& Bullet(const PaintRect& r = Paragraph::StdBullet(), int indent = 150,
Size size = Size(0, 0), Color color = Black);
Alignment GetAlign() const { return style.align; }
int GetLm() const { return style.lm; }
int GetRm() const { return style.rm; }
int GetIndent() const { return style.indent; }
int GetBulletIndent() const { return style.bulletindent; }
PaintRect GetBullet() const { return style.bullet; }
Paragraph& Before(int x) { style.before = x; return *this; }
Paragraph& After(int x) { style.after = x; return *this; }
int GetBefore() const { return style.before; }
int GetAfter() const { return style.after; }
const Style& GetStyle() const { return style; }
void SetStyle(const Style& s) { style = s; }
void CopyStyle(const Paragraph& s) { SetStyle(s.GetStyle()); }
int GetLength() const { return length; }
int GetCount() const { return part.GetCount(); }
const Part *GetParts() const { return part.Begin(); }
bool Format(ParaTypo& pfmt, int cx, int coef = 1024) const;
int GetHeight(int zoom, int cx) const;
bool Paint(int zoom, Draw& w, int x, int y, int cx, int ymax, PaintInfo& pi,
Color paper = SWhite) const;
int Paint(int zoom, Draw& w, int x, int y, int cx, Color paper = SWhite) const;
void Paint(int zoom, int angle, Draw& w, int x, int y, int cx) const;
int GetHeight(int cx) const;
bool Paint(Draw& w, int x, int y, int cx, int ymax, PaintInfo& pi,
Color paper = White) const;
int Paint(Draw& w, int x, int y, int cx, Color paper = White) const;
void GetValueRects(int zoom, Draw& w, int x, int& y, int cx,
Vector<ValueRect>& vr) const;
int GetWidth(int zoom) const;
int GetWidth() const { return GetWidth(1024); }
void Clear();
void SetParaFont(Font f) { parafont = f; }
Font GetParaFont() const { return parafont; }
Paragraph(const Paragraph& p, int);
Paragraph();
};
class TableCell : Moveable<TableCell>, DeepCopyOption<TableCell> {
public:
struct Style {
int ratio;
int leftwidth, topwidth, rightwidth, bottomwidth;
int leftspace, topspace, rightspace, bottomspace;
Color paper;
Alignment align;
void Init();
};
struct PaintInfo {
int yl;
PaintInfo() { yl = 0; }
};
protected:
Array<Paragraph> par;
Style style;
bool keep;
int span;
PaintRect paintrect;
public:
Paragraph& Par() { return par.Top(); }
const Paragraph& Par() const { return par.Top(); }
operator Paragraph&() { return par.Top(); }
operator const Paragraph&() const { return par.Top(); }
int GetCount() const { return par.GetCount(); }
Paragraph& operator[](int i) { return par[i]; }
const Paragraph& operator[](int i) const { return par[i]; }
TableCell& NewPar();
TableCell& Cat(const String& s, Font f, Color c = Black) { Par().Cat(s, f, c); return *this; }
TableCell& Cat(const char *s, Font f, Color c = Black) { Par().Cat(s, f, c); return *this; }
TableCell& Cat(const PaintRect& pr, int cx, int cy = 0) { Par().Cat(pr, cx, cy); return *this; }
TableCell& Cat(const PaintRect& pr, Size sz) { Par().Cat(pr, sz); return *this; }
TableCell& Cat(const PaintRect& pr) { Par().Cat(pr); return *this; }
TableCell& Align(Alignment a) { Par().Align(a); return *this; }
TableCell& Left() { Par().Left(); return *this; }
TableCell& Right() { Par().Right(); return *this; }
TableCell& Center() { Par().Center(); return *this; }
TableCell& Justify() { Par().Justify(); return *this; }
TableCell& Before(int x) { Par().Before(x); return *this; }
TableCell& After(int x) { Par().After(x); return *this; }
TableCell& Lm(int x) { Par().Lm(x); return *this; }
TableCell& Rm(int x) { Par().Rm(x); return *this; }
TableCell& Indent(int x) { Par().Indent(x); return *this; }
TableCell& Paper(Color color) { style.paper = color; return *this; }
TableCell& VertAlign(Alignment a) { style.align = a; return *this; }
TableCell& Top() { style.align = ALIGN_TOP; return *this; }
TableCell& VertCenter() { style.align = ALIGN_CENTER; return *this; }
TableCell& Bottom() { style.align = ALIGN_BOTTOM; return *this; }
TableCell& Ratio(int w) { style.ratio = w; return *this; }
TableCell& Keep(bool b = true) { keep = b; return *this; }
TableCell& NoKeep() { return Keep(false); }
TableCell& Span(int n) { span = n; return *this; }
TableCell& LeftWidth(int x) { style.leftwidth = x; return *this; }
TableCell& TopWidth(int x) { style.topwidth = x; return *this; }
TableCell& RightWidth(int x) { style.rightwidth = x; return *this; }
TableCell& BottomWidth(int x) { style.bottomwidth = x; return *this; }
TableCell& FrameWidth(int x) { return LeftWidth(x).TopWidth(x).RightWidth(x).BottomWidth(x); }
TableCell& LeftSpace(int x) { style.leftspace = x; return *this; }
TableCell& TopSpace(int x) { style.topspace = x; return *this; }
TableCell& RightSpace(int x) { style.rightspace = x; return *this; }
TableCell& BottomSpace(int x) { style.bottomspace = x; return *this; }
TableCell& FrameSpace(int x) { return LeftSpace(x).TopSpace(x).RightSpace(x).BottomSpace(x); }
Alignment GetVertAlign() { return style.align; }
int GetRatio() const { return style.ratio; }
dword GetPaper() const { return style.paper; }
int GetLeftWidth(int x) const { return style.leftwidth; }
int GetTopWidth(int x) const { return style.topwidth; }
int GetRightWidth(int x) const { return style.rightwidth; }
int GetBottomWidth(int x) const { return style.bottomwidth; }
int GetLeftSpace(int x) const { return style.leftspace; }
int GetTopSpace(int x) const { return style.topspace; }
int GetRightSpace(int x) const { return style.rightspace; }
int GetBottomSpace(int x) const { return style.bottomspace; }
bool IsKeep() const { return keep; }
int GetSpan() const { return span; }
const Paragraph::Style& GetParStyle() const { return Par().GetStyle(); }
void SetStyle(const Paragraph::Style& s) { Par().SetStyle(s); }
void CopyStyle(const Paragraph& s) { Par().CopyStyle(s); }
const Style& GetStyle() const { return style; }
void SetStyle(const Style& s) { style = s; }
void CopyStyle(const TableCell& s) { SetStyle(s.GetStyle()); }
void ClearStyle() { style.Init(); }
int GetHeight(int zoom, int cx) const;
bool Paint(int zoom, Draw& w, int x, int y, int cx, int cy, int pcy, Color color,
PaintInfo& pi) const;
void GetValueRects(int zoom, Draw& w, int x, int y, int cx, int cy, int pcy,
Vector<ValueRect>& vr) const;
int GetWidth(int zoom) const;
void Qtf(const char *s);
void SetPaintRect(const PaintRect& c) { paintrect = c; }
TableCell& operator=(const char *s) { Qtf(s); return *this; }
TableCell& operator=(const PaintRect& c) { paintrect = c; return *this; }
void Clear() { par.Clear(); par.Add(); keep = false;
span = 1; style.Init(); }
TableCell(const TableCell& c, int);
TableCell();
};
int GetTotalRatio(const Array<TableCell>& row);
int GetColumnWidth(const Array<TableCell>& row, int j, int cx, int tratio);
class Table : Moveable<Table>, DeepCopyOption<Table> {
public:
struct Style {
int before;
int after;
int lm;
int rm;
int framewidth;
Color framecolor;
int headerrows;
int breakcy;
int breakpgcy;
void Init();
};
struct PaintInfo {
int line;
int oline;
int ypos;
Vector<int> yl;
PaintInfo() { line = 0; oline = -1; }
};
protected:
Vector< Array<TableCell> > cell;
Style style;
struct Cell : Moveable<Cell> {
Size size;
int span;
int spanh;
bool paint;
};
struct Line : Moveable<Line> {
int height;
bool keep;
int span;
Vector<Cell> cell;
};
Line GetLine(int zoom, int i, int tcx, const Vector<int> *yl) const;
int Span(Vector<Line>& line) const;
void FrameTab(int zoom, Draw& w, bool was, int x, int y, int yp, int cx) const;
void DrawLine(int zoom, Draw& w, int x, int y, int i, const Line& ln, int ymax,
Vector<int> *yl) const;
void PaintLines(int zoom, Draw& w, int x, int& y, int i, const Vector<Line>& line,
Vector<int> *yl) const;
bool KeepLine(int i) const;
void RectLine(int zoom, Draw& w, int x, int y, int i, const Line& ln,
Vector<ValueRect>& vr) const;
void RectLines(int zoom, Draw& w, int x, int y, int i, const Vector<Line>& line,
Vector<ValueRect>& vr) const;
public:
operator const Vector< Array<TableCell> >& () const { return cell; }
TableCell& operator()(int i, int j);
const Array<TableCell>& operator[](int i) const { return cell[i]; }
const Array<TableCell>& LastRow() const { return cell.Top(); }
Table& AddRow();
TableCell& AddCell(bool inheritstyle = true);
TableCell& LastCell() { return cell.Top().Top(); }
const TableCell& LastCell() const { return cell.Top().Top(); }
Table& Before(int x) { style.before = x; return *this; }
Table& After(int x) { style.after = x; return *this; }
Table& Lm(int x) { style.lm = x; return *this; }
Table& Rm(int x) { style.rm = x; return *this; }
Table& FrameWidth(int x) { style.framewidth = x; return *this; }
Table& FrameColor(Color color) { style.framecolor = color; return *this; }
Table& HeaderRows(int n) { style.headerrows = n; return *this; }
Table& NoHeaderRows() { return HeaderRows(0); }
Table& Breaks(int bcy, int bpcy) { style.breakcy = bcy; style.breakpgcy = bpcy;
return *this; }
int GetBefore() const { return style.before; }
int GetAfter() const { return style.after; }
int GetLm() const { return style.lm; }
int GetRm() const { return style.rm; }
int GetFrameWidth() const { return style.framewidth; }
Color GetFrameColor() const { return style.framecolor; }
int GetHeaderRows() const { return style.headerrows; }
int GetBreaksCy() const { return style.breakcy; }
int GetBreaksPgCy() const { return style.breakpgcy; }
const Style& GetStyle() const { return style; }
void SetStyle(const Style& s) { style = s; }
void CopyStyle(const Table& s) { SetStyle(s.GetStyle()); }
int GetRows() const { return cell.GetCount(); }
int GetHeight(int zoom, int cx) const;
bool Paint(int zoom, Draw& w, int x, int y, int cx,
int ymax, PaintInfo& pi) const;
int Paint(int zoom, Draw& w, int x, int y, int cx) const;
void GetValueRects(int zoom, Draw& w, int x, int& y, int cx,
Vector<ValueRect>& vr) const;
int GetHeight(int cx) const;
bool Paint(Draw& w, int x, int y, int cx,
int ymax, PaintInfo& pi) const;
int Paint(Draw& w, int x, int y, int cx) const;
int GetWidth(int zoom) const;
int GetWidth() const { return GetWidth(1024); }
void Clear() { cell.Clear(); style.Init(); }
Table(const Table& tab, int);
Table();
};
class Document : Moveable<Document>, DeepCopyOption<Document> {
public:
class Cache {
int zoom;
int cx;
Vector<int> cy;
friend class Document;
public:
void Clear() { cy.Clear(); cx = Null; }
void SetModify(int i) { if(i < cy.GetCount()) cy[i] = Null; }
Cache() { cx = Null; }
};
protected:
enum Type { PARAGRAPH, TABLE };
struct Item : Moveable<Item>, DeepCopyOption<Item> {
Type type;
Table data;
Item() {}
Item(const Item& s, int) : data(s.data, 1), type(s.type) {}
};
Vector<Item> item;
int GetHeight(int zoom, int i, int cx, Cache& cache) const;
void Qtf0(const char *s, bool append, byte charset);
public:
Table& AddTable();
Paragraph& AddParagraph();
void Cat(const Paragraph& p);
void Clear() { item.Clear(); }
int GetCount() const { return item.GetCount(); }
bool IsParagraph(int i) const { return item[i].type == PARAGRAPH; }
const Paragraph& GetParagraph(int i) const { return item[i].data.LastCell().Par(); }
bool IsTable(int i) const { return item[i].type == TABLE; }
const Table& GetTable(int i) const { return item[i].data; }
int GetHeight(int zoom, int cx) const;
int Paint(int zoom, Draw& w, int x, int y, int cx, Color paper = SWhite) const;
Vector<ValueRect> GetValueRects(int zoom, Draw& w, int x, int y, int cx) const;
int GetWidth(int zoom) const;
int GetHeight(int cx) const { return GetHeight(1024, cx); }
int Paint(Draw& w, int x, int y, int cx, Color paper = White) const {
return Paint(1024, w, x, y, cx, paper); }
int GetWidth() const { return GetWidth(1024); }
int GetHeight(int zoom, int cx, Cache& cache) const;
void Paint(int zoom, Draw& w, int x, int y, int cx, int cy, int y0,
Cache& cache, Color paper = SWhite) const;
void Qtf(const char *s, byte charset = 0) { Qtf0(s, false, charset); }
void AppendQtf(const char *s, byte charset = 0) { Qtf0(s, true, charset); }
Document& operator=(const char *s);
Document& operator|=(const char *s);
Document(const Document&, int);
Document();
Document(const char *qtf);
};
/* Qtf format
[commands affected-text] (one space ' ' exactly beetween command string and text)
commands
/ Italic
* Bold
_ Underline
- Overstrike
` Superscript
, Subscript
0123456789 font 0:6pt, 1:8pt, 2:10pt, 3:12pt, 4:16pt, 5:20pt, 6:24pt, 7:28pt, 8:36pt, 9:48pt
+nnn Font nnn dots
G Gui font
A Arial
R Roman
C Courier
S Symbol
W WingDings
.n Font face with index n
!fontface! Font face fontface
< Left
> Right
= Center
# Justify
lnnn Left Margin (nnn is a number of dots)
rnnn Right Margin
innn Indent
bnnn Before
annn After
o Bullet
Oi/nnn Bullet, i 0 Std, 1 White, 2 Box, 3 WhiteBox, nnn indent
^sss^ Value link sss
; Nop (number delimiter)
@0 - 9 Standard colors (0-Black, 1-LtGray, 2-White, 3-Red, 4-Green, 5-Blue, 6-LtRed,
7-WhiteGray, 8-LtCyan, 9-Yellow)
@(r.g.b) RGB colors
other
[Pn:n file] Insert WMF picture
[In:n name] Insert ItemImage, round scale and center
[Jn:n name] Insert ItemImage, full scale
`x or \x Just x, if x is not special (x is any char)
\n or & End Of Paragraph
_ Hard Space
\1text\1 DeQtf (raw text)
* Qtf Tables
State state
++ Table begin / end
\t or || End Of Cell
\v or -- End Of Table Row
\f or ^^ Page (->end of paragraph, end of table)
:: Table Command (use space as delimiter)
commands
nnn Cell ratio (verticaly inherited for the same table)
! Clear cell style
^ Align top
v Align bottom
= Align center
lnnn/nnn Left ruler width / space (both optional)
rnnn/nnn Right ruler width / space (both optional)
bnnn/nnn Bottom ruler width / space (both optional)
tnnn/nnn Top ruler width / space (both optional)
annn/nnn All rulers width / space (both optional)
@0 - 9, @(r.g.b) Paper color
snnn Table before
<nnn Table lm
>nnn Table rm
fnnn Table framewidth
hnnn Table header rows
_0 - 9, _(r.g.b) Table framecolor
~ No frames (eq to a0f0)
/ Keep with previous row
+nnn Vertical span
*/
class QtfParser {
public:
enum Code { END, PARAGRAPH, TABLE, PAGE };
enum Type { NORMAL, SUPERSCRIPT, SUBSCRIPT };
protected:
const char *term;
struct State : public Paragraph::Style, Moveable<State> {
Font font;
int type;
Color color;
String value;
State() { type = 0; }
};
State state;
Array<State> stack;
Paragraph paragraph;
Table table;
Code ender;
bool inraw;
byte charset;
void Init();
int GetNumber();
Color GetColor();
String GetString();
void Picture(int type);
void Flush(String& text);
void Celln(int& a, int& b);
bool IsTable() { return table.GetRows(); }
Paragraph& Par();
TableCell& Cell() { return table.LastCell(); }
bool Term(char c1, char c2) { return term[0] == c1 && term[1] == c2; }
bool Term2(char c) { return term[0] == c && term[1] == c; }
bool Key(char c) { if(*term == c) { term++; return true; } return false; }
bool Key(char c1, char c2) { if(Term(c1, c2)) { term += 2; return true; } return false; }
bool Key2(char c) { return Key(c, c); }
Code Error(const char *s);
public:
void SetStyle(const Paragraph::Style& s) { (Paragraph::Style&)state = s; }
void Set(const char *s, byte charset = 0) { term = s; inraw = false; ender = END; }
Code Parse();
const Paragraph& GetParagraph() { return paragraph; }
const Table& GetTable() { return table; }
Paragraph PickParagraph() { return paragraph; }
Table PickTable() { return table; }
void operator=(const char *s) { Set(s); }
QtfParser() { Init(); }
QtfParser(const char *text, byte charset = 0) { Init(); Set(text); }
};
String AsQtf(const Document& text);
class DocOut {
public:
virtual void Put(const Paragraph& paragraph) = 0;
virtual void Put(const Table& table) = 0;
virtual void Page() = 0;
void Put(const Document& doc);
void Qtf(const char *s);
DocOut& operator<<(const Paragraph& paragraph) { Put(paragraph); return *this; }
DocOut& operator<<(const Table& table) { Put(table); return *this; }
DocOut& operator<<(const Document& doc) { Put(doc); return *this; }
DocOut& operator<<(const char *qtf) { Qtf(qtf); return *this; }
};
class RtfDocOut : public DocOut {
public:
virtual void Put(const Paragraph& paragraph);
virtual void Put(const Table& table);
virtual void Page();
protected:
Index<dword> color;
String rtf;
int pgcx;
bool page;
double imagescale;
struct VSpan;
static inline int Dow(int q) { return q * 12 / 5; }
void PutColor(const char *cmd, dword color);
void PutPicture(const Drawing& iw, Size sz);
void Border(const char *cmd, int width, dword color);
void PutPara(const Paragraph& p, bool par = true, bool table = false,
int ls = 0, int rs = 0, int ts = 0, int bs = 0);
public:
String Get();
void SetPageWidth(int cx) { pgcx = cx; }
void ImageScale(double d) { imagescale = d; }
void Clear();
RtfDocOut();
#ifdef flagSO
virtual ~RtfDocOut();
#endif
};
}
#include "Report.h"
#include "QtfCtrl.h"
#endif